using System; using System.Collections.Generic; using System.Linq; using NzbDrone.Common.Serializer; namespace NzbDrone.Core.Indexers.Newznab { public class Newznab : IndexerWithSetting { public override IParseFeed Parser { get { return new NewznabParser(); } } public override IEnumerable DefaultDefinitions { get { var list = new List(); list.Add(new IndexerDefinition { Enable = false, Name = "Nzbs.org", Implementation = GetType().Name, Settings = GetSettings("http://nzbs.org", new List { 5000 }) }); list.Add(new IndexerDefinition { Enable = false, Name = "Nzb.su", Implementation = GetType().Name, Settings = GetSettings("https://nzb.su", new List()) }); list.Add(new IndexerDefinition { Enable = false, Name = "Dognzb.cr", Implementation = GetType().Name, Settings = GetSettings("https://dognzb.cr", new List()) }); return list; } } private string GetSettings(string url, List categories) { var settings = new NewznabSettings { Url = url }; if (categories.Any()) { settings.Categories = categories; } return settings.ToJson(); } public override IEnumerable RecentFeed { get { //Todo: We should be able to update settings on start if (Name.Equals("nzbs.org", StringComparison.InvariantCultureIgnoreCase)) { Settings.Categories = new List { 5000 }; } var url = String.Format("{0}/api?t=tvsearch&cat={1}", Settings.Url.TrimEnd('/'), String.Join(",", Settings.Categories)); if (!String.IsNullOrWhiteSpace(Settings.ApiKey)) { url += "&apikey=" + Settings.ApiKey; } yield return url; } } public override IEnumerable GetEpisodeSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int episodeNumber) { if (tvRageId > 0) { return RecentFeed.Select(url => String.Format("{0}&limit=100&rid={1}&season={2}&ep={3}", url, tvRageId, seasonNumber, episodeNumber)); } return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2}&ep={3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeNumber)); } public override IEnumerable GetDailyEpisodeSearchUrls(string seriesTitle, int tvRageId, DateTime date) { if (tvRageId > 0) { return RecentFeed.Select(url => String.Format("{0}&limit=100&rid={1}&season={2:yyyy}&ep={2:MM/dd}", url, tvRageId, date)).ToList(); } return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2:yyyy}&ep={2:MM/dd}", url, NewsnabifyTitle(seriesTitle), date)).ToList(); } public override IEnumerable GetSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber) { if (tvRageId > 0) { return RecentFeed.Select(url => String.Format("{0}&limit=100&rid={1}&season={2}", url, tvRageId, seasonNumber)); } return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}&season={2}", url, NewsnabifyTitle(seriesTitle), seasonNumber)); } public override IEnumerable GetPartialSeasonSearchUrls(string seriesTitle, int tvRageId, int seasonNumber, int episodeWildcard) { if (tvRageId > 0) { return RecentFeed.Select(url => String.Format("{0}&limit=100&rid={1}&season={2}&q=E{3}", url, tvRageId, seasonNumber, episodeWildcard)); } return RecentFeed.Select(url => String.Format("{0}&limit=100&q={1}+S{2:00}E{3}", url, NewsnabifyTitle(seriesTitle), seasonNumber, episodeWildcard)); } public override string Name { get { return InstanceDefinition.Name; } } private static string NewsnabifyTitle(string title) { return title.Replace("+", "%20"); } } }