From dc8f85d33d2d5e89ae21480607fbed406d0c5f87 Mon Sep 17 00:00:00 2001 From: kaso17 Date: Fri, 6 Jan 2017 19:04:46 +0100 Subject: [PATCH] Add Superbits tracker --- README.md | 1 + src/Jackett/Indexers/Superbits.cs | 194 ++++++++++++++++++++++++++++++ src/Jackett/Jackett.csproj | 1 + 3 files changed, 196 insertions(+) create mode 100644 src/Jackett/Indexers/Superbits.cs diff --git a/README.md b/README.md index f82dfb1b9..401cab022 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * Shareisland * Shazbat * SpeedCD + * Superbits * The Horror Charnel * The New Retro * The Shinning diff --git a/src/Jackett/Indexers/Superbits.cs b/src/Jackett/Indexers/Superbits.cs new file mode 100644 index 000000000..c65abd741 --- /dev/null +++ b/src/Jackett/Indexers/Superbits.cs @@ -0,0 +1,194 @@ +using Jackett.Models; +using Jackett.Services; +using Jackett.Utils; +using Jackett.Utils.Clients; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Jackett.Models.IndexerConfig; +using System.Collections.Specialized; +using Newtonsoft.Json; +using System.Globalization; + +namespace Jackett.Indexers +{ + public class Superbits : BaseIndexer, IIndexer + { + private string SearchUrl { get { return SiteLink + "api/v1/torrents"; } } + private string LoginUrl { get { return SiteLink + "api/v1/auth"; } } + + new ConfigurationDataBasicLogin configData + { + get { return (ConfigurationDataBasicLogin)base.configData; } + set { base.configData = value; } + } + + public Superbits(IIndexerManagerService i, Logger l, IWebClient w, IProtectionService ps) + : base(name: "Superbits", + description: null, + link: "https://superbits.org/", + caps: new TorznabCapabilities(), + manager: i, + client: w, + logger: l, + p: ps, + configData: new ConfigurationDataBasicLogin()) + { + Encoding = Encoding.GetEncoding("UTF-8"); + Language = "sv-sw"; + + AddCategoryMapping(1, TorznabCatType.MoviesDVD, "DVD-R Swesub"); + AddCategoryMapping(2, TorznabCatType.TV, "DVD-R TV"); + AddCategoryMapping(3, TorznabCatType.BooksEbook, "eBok"); + AddCategoryMapping(4, TorznabCatType.MoviesHD, "Film 1080"); + AddCategoryMapping(5, TorznabCatType.Movies3D, "Film 3D"); + AddCategoryMapping(6, TorznabCatType.MoviesHD, "Film 720"); + AddCategoryMapping(7, TorznabCatType.MoviesBluRay, "Film Bluray"); + AddCategoryMapping(8, TorznabCatType.TV, "Svensk TV"); + AddCategoryMapping(9, TorznabCatType.AudioAudiobook, "Ljudböcker"); + AddCategoryMapping(10, TorznabCatType.AudioVideo, "Musikvideos"); + AddCategoryMapping(11, TorznabCatType.BooksMagazines, "E-tidningar"); + AddCategoryMapping(12, TorznabCatType.Audio, "Musik"); + AddCategoryMapping(13, TorznabCatType.Other, "Omslag"); + AddCategoryMapping(14, TorznabCatType.Other, "Övrigt"); + AddCategoryMapping(15, TorznabCatType.PCGames, "PC-Spel"); + AddCategoryMapping(16, TorznabCatType.PC0day, "Program"); + AddCategoryMapping(17, TorznabCatType.ConsolePS3, "PS3"); + AddCategoryMapping(18, TorznabCatType.TV, "TV"); + AddCategoryMapping(19, TorznabCatType.ConsoleWii, "Wii"); + AddCategoryMapping(20, TorznabCatType.ConsoleXbox, "Xbox"); + AddCategoryMapping(21, TorznabCatType.MoviesOther, "Xvid"); + AddCategoryMapping(22, TorznabCatType.XXX, "XXX"); + } + + public async Task ApplyConfiguration(JToken configJson) + { + LoadValuesFromJson(configJson); + var queryCollection = new NameValueCollection(); + + queryCollection.Add("username", configData.Username.Value); + queryCollection.Add("password", configData.Password.Value); + + var loginUrl = LoginUrl + "?" + queryCollection.GetQueryString(); + var loginResult = await RequestStringWithCookies(loginUrl, null, SiteLink); + + await ConfigureIfOK(loginResult.Cookies, loginResult.Content.Contains("\"user\""), () => + { + throw new ExceptionWithConfigData(loginResult.Content, configData); + }); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + List releases = new List(); + var queryCollection = new NameValueCollection(); + var searchString = query.GetQueryString(); + var searchUrl = SearchUrl; + + queryCollection.Add("extendedSearch", "false"); + queryCollection.Add("freeleech", "false"); + queryCollection.Add("index", "0"); + queryCollection.Add("limit", "100"); + queryCollection.Add("order", "desc"); + queryCollection.Add("page", "search"); + queryCollection.Add("searchText", searchString); + queryCollection.Add("section", "all"); + queryCollection.Add("sort", "d"); + queryCollection.Add("section", "all"); + queryCollection.Add("stereoscopic", "false"); + queryCollection.Add("sweaudio", "false"); + queryCollection.Add("swesub", "false"); + queryCollection.Add("watchview", "false"); + + foreach (var cat in MapTorznabCapsToTrackers(query)) + queryCollection.Add("categories[]", cat); + + searchUrl += "?" + queryCollection.GetQueryString(); + var results = await RequestStringWithCookies(searchUrl, null, SiteLink); + + try + { + //var json = JArray.Parse(results.Content); + dynamic json = JsonConvert.DeserializeObject(results.Content); + foreach (var row in json) + { + var release = new ReleaseInfo(); + var descriptions = new List(); + var tags = new List(); + + release.MinimumRatio = 1.1; + release.MinimumSeedTime = 48 * 60 * 60; + release.Title = row.name; + release.Category = MapTrackerCatToNewznab(row.category.ToString()); + release.Size = row.size; + release.Seeders = row.seeders; + release.Peers = row.leechers + release.Seeders; + release.PublishDate = DateTime.ParseExact(row.added.ToString() + " +01:00", "yyyy-MM-dd HH:mm:ss zzz", CultureInfo.InvariantCulture); + release.Files = row.numfiles; + release.Grabs = row.times_completed; + + release.Comments = new Uri(SiteLink + "torrent/" + row.id.ToString() + "/"); + release.Link = new Uri(SiteLink + "api/v1/torrents/download/" + row.id.ToString()); + + if (row.frileech == 1) + release.DownloadVolumeFactor = 0; + else + release.DownloadVolumeFactor = 1; + release.UploadVolumeFactor = 1; + + if (!string.IsNullOrWhiteSpace(row.customcover.ToString())) + release.BannerUrl = new Uri(SiteLink + row.customcover); + + if (row.imdbid2 != null && row.imdbid2.ToString().StartsWith("tt")) + { + https://superbits.org/img/imdb/tt5288312.jpg + release.Imdb = ParseUtil.CoerceLong(row.imdbid2.ToString().Substring(2)); + descriptions.Add("Title: " + row.title); + descriptions.Add("Year: " + row.year); + descriptions.Add("Genres: " + row.genres); + descriptions.Add("Tagline: " + row.tagline); + descriptions.Add("Cast: " + row.cast); + descriptions.Add("Rating: " + row.rating); + descriptions.Add("Plot: " + row.plot); + + release.BannerUrl = new Uri(SiteLink + "img/imdb/" + row.imdbid2 + ".jpg"); + } + + if ((int)row.p2p == 1) + tags.Add("P2P"); + if ((int)row.pack == 1) + tags.Add("Pack"); + if ((int)row.reqid != 0) + tags.Add("Request"); + if ((int)row.sweaudio != 0) + tags.Add("Swedish audio"); + if ((int)row.swesub != 0) + tags.Add("Swedish subtitles"); + + if (tags.Count > 0) + descriptions.Add("Tags: " + string.Join(", ", tags)); + + var preDate = row.preDate.ToString(); + if (!string.IsNullOrWhiteSpace(preDate) && preDate != "1970-01-01 01:00:00") + descriptions.Add("PRE: " + preDate); + + descriptions.Add("Section: " + row.section); + + release.Description = string.Join("
\n", descriptions); + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results.Content, ex); + } + + return releases; + } + } +} \ No newline at end of file diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 1a46a32c7..dfd4bd3ce 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -165,6 +165,7 @@ +