diff --git a/README.md b/README.md index 3f90363f99be02181b7937cfd2255599ac8eb393..154ad22d40b52e6b839b69528c10082336bf9b58 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * PrivateHD * RevolutionTT * SceneAccess + * SceneFZ * SceneTime * Shazbat * SpeedCD diff --git a/src/Jackett/Content/logos/scenefz.png b/src/Jackett/Content/logos/scenefz.png new file mode 100644 index 0000000000000000000000000000000000000000..369bb4afb4f978f106addae512fe56df185fb780 Binary files /dev/null and b/src/Jackett/Content/logos/scenefz.png differ diff --git a/src/Jackett/Indexers/SceneFZ.cs b/src/Jackett/Indexers/SceneFZ.cs new file mode 100644 index 0000000000000000000000000000000000000000..0a8e0ea21945782b5215171d608d77bb04aed00f --- /dev/null +++ b/src/Jackett/Indexers/SceneFZ.cs @@ -0,0 +1,125 @@ +using Jackett.Utils.Clients; +using NLog; +using Jackett.Services; +using Jackett.Utils; +using Jackett.Models; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using CsQuery; +using System.Web; +using System; +using System.Globalization; +using Jackett.Models.IndexerConfig; + +namespace Jackett.Indexers +{ + public class SceneFZ : BaseIndexer, IIndexer + { + string LoginUrl { get { return SiteLink + "takelogin.php"; } } + + string BrowseUrl { get { return SiteLink + "ajax_browse.php"; } } + + new ConfigurationDataBasicLogin configData + { + get { return (ConfigurationDataBasicLogin)base.configData; } + set { base.configData = value; } + } + + public SceneFZ(IIndexerManagerService i, IWebClient wc, Logger l, IProtectionService ps) + : base(name: "SceneFZ", + description: "Torrent tracker. Tracking over 50.000 torrent files.", + link: "http://scenefz.net/", + caps: TorznabUtil.CreateDefaultTorznabTVCaps(), + manager: i, + client: wc, + logger: l, + p: ps, + configData: new ConfigurationDataBasicLogin()) + { + AddCategoryMapping(32, TorznabCatType.Movies); + AddCategoryMapping(33, TorznabCatType.TV); + } + + public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + var pairs = new Dictionary<string, string> + { + { "username", configData.Username.Value }, + { "password", configData.Password.Value } + }; + + var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl); + await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("Please wait..."), () => + { + CQ dom = result.Content; + var errorMessage = dom[".tableinborder:eq(1) td"].Text().Trim(); + throw new ExceptionWithConfigData(errorMessage, configData); + }); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query) + { + var releases = new List<ReleaseInfo>(); + var searchUrl = BrowseUrl; + var searchString = query.GetQueryString(); + + var cats = MapTorznabCapsToTrackers(query); + string cat = "0"; + + if (cats.Count == 1) + { + cat = cats[0]; + } + + if (!string.IsNullOrWhiteSpace(searchString) || cat != "0") + searchUrl += string.Format("?search={0}¶m_val=0&complex_search=0&incldead=mc{1}&orderby=added&sort=desc", HttpUtility.UrlEncode(searchString), cat); + + var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl); + var results = response.Content; + try + { + CQ dom = results; + var rows = dom["td#browse-middle-td"]; + + foreach (var row in rows) + { + var release = new ReleaseInfo(); + var qRow = row.Cq(); + var qTitleLink = qRow.Find("table tbody tr:eq(0) td a").First(); + release.Title = qRow.Find("table tbody tr:eq(0) td a b").Text().Trim(); + release.Description = release.Title; + release.Guid = new Uri(SiteLink + qTitleLink.Attr("href")); + release.Comments = release.Guid; + + //24.04.2016 16:44:57 + var dateStr = qRow.Find("table tbody tr:eq(1) td:eq(4)").Html().Replace(" ", " ").Trim(); + release.PublishDate = DateTime.ParseExact(dateStr, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture).AddHours(-2); + + var qLink = qRow.First().Next().Find("a"); + release.Link = new Uri(SiteLink + qLink.Attr("href")); + + var sizeStr = qRow.Find("table tbody tr:eq(1) td b").Text().Trim(); + release.Size = ReleaseInfo.GetBytes(sizeStr.Replace(",", ".")); + + release.Seeders = ParseUtil.CoerceInt(qRow.Find("table tbody tr:eq(1) td:eq(1) b:eq(0) font").Text().Trim()); + release.Peers = ParseUtil.CoerceInt(qRow.Find("table tbody tr:eq(1) td:eq(1) b:eq(1) font").Text().Trim()) + release.Seeders; + + var catId = qRow.First().Prev().Find("a").Attr("onclick").Substring(21, 2); + release.Category = MapTrackerCatToNewznab(catId); + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results, ex); + } + + return releases; + } + } +} + diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 3eac9d6c5f7e2740c7aa095601c00bd56817c8ad..0f48acebf4d62e8e24ba99a4a180f1a5ce3975ad 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -242,6 +242,7 @@ <Compile Include="Indexers\Pretome.cs" /> <Compile Include="Indexers\PrivateHD.cs" /> <Compile Include="Indexers\SceneAccess.cs" /> + <Compile Include="Indexers\SceneFZ.cs" /> <Compile Include="Indexers\SceneTime.cs" /> <Compile Include="Indexers\SpeedCD.cs" /> <Compile Include="Indexers\TorrentDay.cs" /> @@ -524,6 +525,9 @@ <Content Include="Content\logos\sceneaccess.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="Content\logos\scenefz.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="Content\logos\scenetime.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>