diff --git a/README.md b/README.md index cec400326..ce190984d 100644 --- a/README.md +++ b/README.md @@ -468,7 +468,6 @@ A third-party Golang SDK for Jackett is available from [webtor-io/go-jackett](ht * P2PBG * Panda * Party-Tracker - * PassThePopcorn (PTP) * Peeratiko * Peers.FM * PigNetwork diff --git a/src/Jackett.Common/Indexers/PassThePopcorn.cs b/src/Jackett.Common/Indexers/PassThePopcorn.cs deleted file mode 100644 index ec00fee2a..000000000 --- a/src/Jackett.Common/Indexers/PassThePopcorn.cs +++ /dev/null @@ -1,277 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Diagnostics.CodeAnalysis; -using System.Globalization; -using System.Linq; -using System.Net; -using System.Threading.Tasks; -using Jackett.Common.Models; -using Jackett.Common.Models.IndexerConfig; -using Jackett.Common.Services.Interfaces; -using Jackett.Common.Utils; -using Newtonsoft.Json.Linq; -using NLog; - -namespace Jackett.Common.Indexers -{ - [ExcludeFromCodeCoverage] - public class PassThePopcorn : IndexerBase - { - public override string Id => "passthepopcorn"; - public override string Name => "PassThePopcorn"; - public override string Description => "PassThePopcorn is a Private site for MOVIES / TV"; - public override string SiteLink { get; protected set; } = "https://passthepopcorn.me/"; - public override string Language => "en-US"; - public override string Type => "private"; - - public override TorznabCapabilities TorznabCaps => SetCapabilities(); - - private static string SearchUrl => "https://passthepopcorn.me/torrents.php"; - private string AuthKey { get; set; } - private string PassKey { get; set; } - - // TODO: merge ConfigurationDataAPILoginWithUserAndPasskeyAndFilter class with with ConfigurationDataUserPasskey - private new ConfigurationDataAPILoginWithUserAndPasskeyAndFilter configData - { - get => (ConfigurationDataAPILoginWithUserAndPasskeyAndFilter)base.configData; - set => base.configData = value; - } - - public PassThePopcorn(IIndexerConfigurationService configService, Utils.Clients.WebClient c, Logger l, - IProtectionService ps, ICacheService cs) - : base(configService: configService, - client: c, - logger: l, - p: ps, - cacheService: cs, - configData: new ConfigurationDataAPILoginWithUserAndPasskeyAndFilter(@"Enter filter options below to restrict search results. - Separate options with a space if using more than one option.
Filter options available: -
GoldenPopcorn
Scene
Checked
Free")) - { - webclient.requestDelay = 2; // 0.5 requests per second - } - - private TorznabCapabilities SetCapabilities() - { - var caps = new TorznabCapabilities - { - TvSearchParams = new List - { - TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep - }, - MovieSearchParams = new List - { - MovieSearchParam.Q, MovieSearchParam.ImdbId - } - }; - - caps.Categories.AddCategoryMapping(1, TorznabCatType.Movies, "Feature Film"); - caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesForeign); - caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesOther); - caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesSD); - caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesHD); - caps.Categories.AddCategoryMapping(1, TorznabCatType.Movies3D); - caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesBluRay); - caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesDVD); - caps.Categories.AddCategoryMapping(1, TorznabCatType.MoviesWEBDL); - caps.Categories.AddCategoryMapping(2, TorznabCatType.Movies, "Short Film"); - caps.Categories.AddCategoryMapping(3, TorznabCatType.TV, "Miniseries"); - caps.Categories.AddCategoryMapping(4, TorznabCatType.TV, "Stand-up Comedy"); - caps.Categories.AddCategoryMapping(5, TorznabCatType.TV, "Live Performance"); - - return caps; - } - - public override async Task ApplyConfiguration(JToken configJson) - { - LoadValuesFromJson(configJson); - - IsConfigured = false; - try - { - var results = await PerformQuery(new TorznabQuery()); - if (!results.Any()) - throw new Exception("Testing returned no results!"); - IsConfigured = true; - SaveConfig(); - } - catch (Exception e) - { - throw new ExceptionWithConfigData(e.Message, configData); - } - - return IndexerConfigurationStatus.Completed; - } - - protected override async Task> PerformQuery(TorznabQuery query) - { - var releases = new List(); - var configGoldenPopcornOnly = configData.FilterString.Value.ToLowerInvariant().Contains("goldenpopcorn"); - var configSceneOnly = configData.FilterString.Value.ToLowerInvariant().Contains("scene"); - var configCheckedOnly = configData.FilterString.Value.ToLowerInvariant().Contains("checked"); - var configFreeOnly = configData.FilterString.Value.ToLowerInvariant().Contains("free"); - - - var movieListSearchUrl = SearchUrl; - var queryCollection = new NameValueCollection { { "json", "noredirect" } }; - - if (!string.IsNullOrEmpty(query.ImdbID)) - queryCollection.Add("searchstr", query.ImdbID); - else if (!string.IsNullOrEmpty(query.GetQueryString())) - queryCollection.Add("searchstr", query.GetQueryString()); - if (configFreeOnly) - queryCollection.Add("freetorrent", "1"); - - movieListSearchUrl += "?" + queryCollection.GetQueryString(); - - var authHeaders = new Dictionary - { - { "ApiUser", configData.User.Value }, - { "ApiKey", configData.Key.Value } - }; - - var results = await RequestWithCookiesAndRetryAsync(movieListSearchUrl, headers: authHeaders); - if (results.IsRedirect) // untested - results = await RequestWithCookiesAndRetryAsync(movieListSearchUrl, headers: authHeaders); - try - { - //Iterate over the releases for each movie - var jsResults = JObject.Parse(results.ContentString); - - AuthKey = (string)jsResults["AuthKey"]; - PassKey = (string)jsResults["PassKey"]; - - foreach (var movie in jsResults["Movies"]) - { - var movieTitle = (string)movie["Title"]; - var year = (string)movie["Year"]; - var movieImdbIdStr = (string)movie["ImdbId"]; - var posterStr = (string)movie["Cover"]; - var poster = !string.IsNullOrEmpty(posterStr) ? new Uri(posterStr) : null; - var movieImdbId = !string.IsNullOrEmpty(movieImdbIdStr) ? (long?)long.Parse(movieImdbIdStr) : null; - var movieGroupId = (string)movie["GroupId"]; - foreach (var torrent in movie["Torrents"]) - { - var releaseName = (string)torrent["ReleaseName"]; - var torrentId = (string)torrent["Id"]; - - var releaseLinkQuery = new NameValueCollection - { - {"action", "download"}, - {"id", torrentId}, - {"authkey", AuthKey}, - {"torrent_pass", PassKey} - }; - var free = !(torrent["FreeleechType"] is null); - - bool.TryParse((string)torrent["GoldenPopcorn"], out var golden); - bool.TryParse((string)torrent["Scene"], out var scene); - bool.TryParse((string)torrent["Checked"], out var check); - - if (configGoldenPopcornOnly && !golden) - continue; //Skip release if user only wants GoldenPopcorn - if (configSceneOnly && !scene) - continue; //Skip release if user only wants Scene - if (configCheckedOnly && !check) - continue; //Skip release if user only wants Checked - if (configFreeOnly && !free) - continue; - var link = new Uri($"{SearchUrl}?{releaseLinkQuery.GetQueryString()}"); - var seeders = int.Parse((string)torrent["Seeders"]); - var details = new Uri($"{SearchUrl}?id={WebUtility.UrlEncode(movieGroupId)}&torrentid={WebUtility.UrlEncode(torrentId)}"); - var size = long.Parse((string)torrent["Size"]); - var grabs = long.Parse((string)torrent["Snatched"]); - var publishDate = DateTime.ParseExact((string)torrent["UploadTime"], - "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal) - .ToLocalTime(); - var leechers = int.Parse((string)torrent["Leechers"]); - var release = new ReleaseInfo - { - Title = releaseName, - Description = $"Title: {movieTitle}", - Poster = poster, - Imdb = movieImdbId, - Details = details, - Size = size, - Grabs = grabs, - Seeders = seeders, - Peers = seeders + leechers, - PublishDate = publishDate, - Link = link, - Guid = link, - MinimumRatio = 1, - MinimumSeedTime = 345600, - DownloadVolumeFactor = free ? 0 : 1, - UploadVolumeFactor = 1, - Category = new List { TorznabCatType.Movies.ID } - }; - - - var titleTags = new List(); - var quality = (string)torrent["Quality"]; - var container = (string)torrent["Container"]; - var codec = (string)torrent["Codec"]; - var resolution = (string)torrent["Resolution"]; - var source = (string)torrent["Source"]; - var otherTags = (string)torrent["RemasterTitle"]; - - if (year != null) - release.Description += $"
\nYear: {year}"; - if (quality != null) - release.Description += $"
\nQuality: {quality}"; - if (resolution != null) - { - titleTags.Add(resolution); - release.Description += $"
\nResolution: {resolution}"; - } - if (source != null) - { - titleTags.Add(source); - release.Description += $"
\nSource: {source}"; - } - if (codec != null) - { - titleTags.Add(codec); - release.Description += $"
\nCodec: {codec}"; - } - if (container != null) - { - titleTags.Add(container); - release.Description += $"
\nContainer: {container}"; - } - if (scene) - { - titleTags.Add("Scene"); - release.Description += "
\nScene"; - } - if (check) - { - titleTags.Add("Checked"); - release.Description += "
\nChecked"; - } - if (golden) - { - titleTags.Add("Golden Popcorn"); - release.Description += "
\nGolden Popcorn"; - } - - if (otherTags != null) - titleTags.Add(otherTags); - - if (titleTags.Any()) - release.Title += " [" + string.Join(" / ", titleTags) + "]"; - - releases.Add(release); - } - } - } - catch (Exception ex) - { - OnParseError(results.ContentString, ex); - } - - return releases; - } - } -}