private RemoteMovie GetRemoteMovie(QualityModel quality, Movie movie = null, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet) { if (movie == null) { movie = GetMovie(1); } movie.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities() }; var remoteMovie = new RemoteMovie() { ParsedMovieInfo = new ParsedMovieInfo() { Quality = quality, Year = 1998, MovieTitle = "A Movie", }, Movie = movie, Release = new ReleaseInfo() { PublishDate = DateTime.UtcNow, Title = "A.Movie.1998", Size = 200, DownloadProtocol = downloadProtocol } }; return(remoteMovie); }
public string ToXml(DownloadProtocol protocol) { // IMPORTANT: We can't use Uri.ToString(), because it generates URLs without URL encode (links with unicode // characters are broken). We must use Uri.AbsoluteUri instead that handles encoding correctly var xdoc = new XDocument( new XDeclaration("1.0", "UTF-8", null), new XElement("rss", new XAttribute("version", "1.0"), new XAttribute(XNamespace.Xmlns + "atom", _AtomNs.NamespaceName), protocol == DownloadProtocol.Torrent ? new XAttribute(XNamespace.Xmlns + "torznab", _TorznabNs.NamespaceName) : new XAttribute(XNamespace.Xmlns + "newznab", _NewznabNs.NamespaceName), new XElement("channel", new XElement(_AtomNs + "link", new XAttribute("rel", "self"), new XAttribute("type", "application/rss+xml")), new XElement("title", "Prowlarr"), from r in Releases let t = (r as TorrentInfo) ?? new TorrentInfo() select new XElement("item", new XElement("title", RemoveInvalidXMLChars(r.Title)), new XElement("guid", r.Guid), // GUID and (Link or Magnet) are mandatory new XElement("prowlarrindexer", new XAttribute("id", r.IndexerId), r.Indexer), r.InfoUrl == null ? null : new XElement("comments", r.InfoUrl), r.PublishDate == DateTime.MinValue ? new XElement("pubDate", XmlDateFormat(DateTime.Now)) : new XElement("pubDate", XmlDateFormat(r.PublishDate)), new XElement("size", r.Size), new XElement("link", r.DownloadUrl ?? t.MagnetUrl ?? string.Empty), r.Categories == null ? null : from c in r.Categories select new XElement("category", c.Id), new XElement( "enclosure", new XAttribute("url", r.DownloadUrl ?? t.MagnetUrl ?? string.Empty), r.Size == null ? null : new XAttribute("length", r.Size), new XAttribute("type", protocol == DownloadProtocol.Torrent ? "application/x-bittorrent" : "application/x-nzb")), r.Categories == null ? null : from c in r.Categories select GetNabElement("category", c.Id, protocol), r.IndexerFlags == null ? null : from f in r.IndexerFlags select GetNabElement("tag", f.Name, protocol), r.Languages == null ? null : from c in r.Languages select GetNabElement("language", c.Id, protocol), r.Subs == null ? null : from c in r.Subs select GetNabElement("subs", c.Id, protocol), r.Genres == null ? null : GetNabElement("genre", string.Join(", ", r.Genres), protocol), GetNabElement("rageid", r.TvRageId, protocol), GetNabElement("tvdbid", r.TvdbId, protocol), GetNabElement("imdb", r.ImdbId.ToString("D7"), protocol), GetNabElement("tmdbid", r.TmdbId, protocol), GetNabElement("traktid", r.TraktId, protocol), GetNabElement("seeders", t.Seeders, protocol), GetNabElement("files", r.Files, protocol), GetNabElement("grabs", r.Grabs, protocol), GetNabElement("peers", t.Peers, protocol), GetNabElement("author", RemoveInvalidXMLChars(r.Author), protocol), GetNabElement("booktitle", RemoveInvalidXMLChars(r.BookTitle), protocol), GetNabElement("artist", RemoveInvalidXMLChars(r.Artist), protocol), GetNabElement("album", RemoveInvalidXMLChars(r.Album), protocol), GetNabElement("infohash", RemoveInvalidXMLChars(t.InfoHash), protocol), GetNabElement("minimumratio", t.MinimumRatio, protocol), GetNabElement("minimumseedtime", t.MinimumSeedTime, protocol), GetNabElement("downloadvolumefactor", t.DownloadVolumeFactor, protocol), GetNabElement("uploadvolumefactor", t.UploadVolumeFactor, protocol), GetNabElement("coverurl", r.PosterUrl, protocol))))); return(xdoc.Declaration + Environment.NewLine + xdoc); }
private SonarrIndexer BuildSonarrIndexer(IndexerDefinition indexer, DownloadProtocol protocol, int id = 0) { var cacheKey = $"{Settings.BaseUrl}"; var schemas = _schemaCache.Get(cacheKey, () => _sonarrV3Proxy.GetIndexerSchema(Settings), TimeSpan.FromDays(7)); var newznab = schemas.Where(i => i.Implementation == "Newznab").First(); var torznab = schemas.Where(i => i.Implementation == "Torznab").First(); var schema = protocol == DownloadProtocol.Usenet ? newznab : torznab; var sonarrIndexer = new SonarrIndexer { Id = id, Name = $"{indexer.Name} (Prowlarr)", EnableRss = indexer.Enable && indexer.AppProfile.Value.EnableRss, EnableAutomaticSearch = indexer.Enable && indexer.AppProfile.Value.EnableAutomaticSearch, EnableInteractiveSearch = indexer.Enable && indexer.AppProfile.Value.EnableInteractiveSearch, Priority = indexer.Priority, Implementation = indexer.Protocol == DownloadProtocol.Usenet ? "Newznab" : "Torznab", ConfigContract = schema.ConfigContract, Fields = schema.Fields, }; sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "baseUrl").Value = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/"; sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiPath").Value = "/api"; sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "apiKey").Value = _configFileProvider.ApiKey; sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "categories").Value = JArray.FromObject(indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())); sonarrIndexer.Fields.FirstOrDefault(x => x.Name == "animeCategories").Value = JArray.FromObject(indexer.Capabilities.Categories.SupportedCategories(Settings.AnimeSyncCategories.ToArray())); return(sonarrIndexer); }
private void GivenPreferredDownloadProtocol(DownloadProtocol downloadProtocol) { Mocker.GetMock <IDelayProfileService>() .Setup(s => s.BestForTags(It.IsAny <HashSet <int> >())) .Returns(new DelayProfile { PreferredProtocol = downloadProtocol }); }
public void Prepare(string name) { DeleteHelper.DeleteProtocol(name + ".assay-protocol"); DeleteHelper.DeleteResults(name + " (1).assay-results"); DownloadProtocol.Search_Protocol(name); DownloadProtocol.WaitFor(); DownloadProtocol.Download_Protocol(name); Delay.Seconds(10); }
private static XElement GetNabElement(string name, object value, DownloadProtocol protocol) { if (value == null) { return(null); } var feedNamespace = protocol == DownloadProtocol.Torrent ? _TorznabNs : _NewznabNs; return(new XElement(feedNamespace + "attr", new XAttribute("name", name), new XAttribute("value", value))); }
private int PrioritizeDownloadProtocol(Series series, DownloadProtocol downloadProtocol) { var delayProfile = _delayProfileService.BestForTags(series.Tags); if (downloadProtocol == delayProfile.PreferredProtocol) { return 0; } return 1; }
private int PrioritizeDownloadProtocol(Series series, DownloadProtocol downloadProtocol) { var delayProfile = _delayProfileService.BestForTags(series.Tags); if (downloadProtocol == delayProfile.PreferredProtocol) { return(0); } return(1); }
public IDownloadClient GetDownloadClient(DownloadProtocol downloadProtocol, int indexerId = 0) { var availableProviders = _downloadClientFactory.GetAvailableProviders().Where(v => v.Protocol == downloadProtocol).ToList(); if (!availableProviders.Any()) { return(null); } if (indexerId > 0) { var indexer = _indexerFactory.Find(indexerId); if (indexer != null && indexer.DownloadClientId > 0) { var client = availableProviders.SingleOrDefault(d => d.Definition.Id == indexer.DownloadClientId); return(client ?? throw new DownloadClientUnavailableException($"Indexer specified download client is not available")); } } var blockedProviders = new HashSet <int>(_downloadClientStatusService.GetBlockedProviders().Select(v => v.ProviderId)); if (blockedProviders.Any()) { var nonBlockedProviders = availableProviders.Where(v => !blockedProviders.Contains(v.Definition.Id)).ToList(); if (nonBlockedProviders.Any()) { availableProviders = nonBlockedProviders; } else { _logger.Trace("No non-blocked Download Client available, retrying blocked one."); } } // Use the first priority clients first availableProviders = availableProviders.GroupBy(v => (v.Definition as DownloadClientDefinition).Priority) .OrderBy(v => v.Key) .First().OrderBy(v => v.Definition.Id).ToList(); var lastId = _lastUsedDownloadClient.Find(downloadProtocol.ToString()); var provider = availableProviders.FirstOrDefault(v => v.Definition.Id > lastId) ?? availableProviders.First(); _lastUsedDownloadClient.Set(downloadProtocol.ToString(), provider.Definition.Id); return(provider); }
private MylarIndexer BuildMylarIndexer(IndexerDefinition indexer, DownloadProtocol protocol, string originalName = null) { var schema = protocol == DownloadProtocol.Usenet ? MylarProviderType.Newznab : MylarProviderType.Torznab; var mylarIndexer = new MylarIndexer { Name = originalName ?? $"{indexer.Name} (Prowlarr)", Altername = $"{indexer.Name} (Prowlarr)", Host = $"{Settings.ProwlarrUrl.TrimEnd('/')}/{indexer.Id}/api", Apikey = _configFileProvider.ApiKey, Categories = string.Join(",", indexer.Capabilities.Categories.SupportedCategories(Settings.SyncCategories.ToArray())), Enabled = indexer.Enable, Type = schema, }; return(mylarIndexer); }
private RemoteBook GetRemoteAlbum(List <Book> albums, QualityModel quality, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet) { var remoteBook = new RemoteBook(); remoteBook.ParsedBookInfo = new ParsedBookInfo(); remoteBook.ParsedBookInfo.Quality = quality; remoteBook.Books = new List <Book>(); remoteBook.Books.AddRange(albums); remoteBook.Release = new ReleaseInfo(); remoteBook.Release.DownloadProtocol = downloadProtocol; remoteBook.Release.PublishDate = DateTime.UtcNow; remoteBook.Author = Builder <Author> .CreateNew() .With(e => e.QualityProfile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities() }) .Build(); return(remoteBook); }
public IDownloadClient GetDownloadClient(DownloadProtocol downloadProtocol) { var availableProviders = _downloadClientFactory.GetAvailableProviders().Where(v => v.Protocol == downloadProtocol).ToList(); if (!availableProviders.Any()) { return(null); } var blockedProviders = new HashSet <int>(_downloadClientStatusService.GetBlockedProviders().Select(v => v.ProviderId)); if (blockedProviders.Any()) { var nonBlockedProviders = availableProviders.Where(v => !blockedProviders.Contains(v.Definition.Id)).ToList(); if (nonBlockedProviders.Any()) { availableProviders = nonBlockedProviders; } else { _logger.Trace("No non-blocked Download Client available, retrying blocked one."); } } // Use the first priority clients first availableProviders = availableProviders.GroupBy(v => (v.Definition as DownloadClientDefinition).Priority) .OrderBy(v => v.Key) .First().OrderBy(v => v.Definition.Id).ToList(); var lastId = _lastUsedDownloadClient.Find(downloadProtocol.ToString()); var provider = availableProviders.FirstOrDefault(v => v.Definition.Id > lastId) ?? availableProviders.First(); _lastUsedDownloadClient.Set(downloadProtocol.ToString(), provider.Definition.Id); return(provider); }
private void GivenProtocol(DownloadProtocol downloadProtocol) { _remoteAlbum.Release.DownloadProtocol = downloadProtocol; }
private RemoteEpisode GivenRemoteEpisode(List <Episode> episodes, QualityModel quality, Language language, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet, int indexerPriority = 25) { var remoteEpisode = new RemoteEpisode(); remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo(); remoteEpisode.ParsedEpisodeInfo.Quality = quality; remoteEpisode.ParsedEpisodeInfo.Language = language; remoteEpisode.Episodes = new List <Episode>(); remoteEpisode.Episodes.AddRange(episodes); remoteEpisode.Release = new ReleaseInfo(); remoteEpisode.Release.PublishDate = DateTime.Now.AddDays(-age); remoteEpisode.Release.Size = size; remoteEpisode.Release.DownloadProtocol = downloadProtocol; remoteEpisode.Release.IndexerPriority = indexerPriority; remoteEpisode.Series = Builder <Series> .CreateNew() .With(e => e.QualityProfile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities() }) .With(l => l.LanguageProfile = new LanguageProfile { Languages = LanguageFixture.GetDefaultLanguages(), Cutoff = Language.Spanish }) .Build(); return(remoteEpisode); }
public int GetProtocolDelay(DownloadProtocol protocol) { return protocol == DownloadProtocol.Torrent ? TorrentDelay : UsenetDelay; }
private RemoteEpisode GivenRemoteEpisode(List <Episode> episodes, QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet) { var remoteEpisode = new RemoteEpisode(); remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo(); remoteEpisode.ParsedEpisodeInfo.Quality = quality; remoteEpisode.Episodes = new List <Episode>(); remoteEpisode.Episodes.AddRange(episodes); remoteEpisode.Release = new ReleaseInfo(); remoteEpisode.Release.PublishDate = DateTime.Now.AddDays(-age); remoteEpisode.Release.Size = size; remoteEpisode.Release.DownloadProtocol = downloadProtocol; remoteEpisode.Series = Builder <Series> .CreateNew() .With(e => e.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities() }) .Build(); return(remoteEpisode); }
private RemoteMovie GivenRemoteMovie(QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet, int runtime = 150, int indexerPriority = 25) { var remoteMovie = new RemoteMovie(); remoteMovie.ParsedMovieInfo = new ParsedMovieInfo(); remoteMovie.ParsedMovieInfo.MovieTitles = new List <string> { "A Movie" }; remoteMovie.ParsedMovieInfo.Year = 1998; remoteMovie.ParsedMovieInfo.Quality = quality; remoteMovie.Movie = Builder <Movie> .CreateNew().With(m => m.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities(), FormatItems = CustomFormatsFixture.GetSampleFormatItems(_customFormat1.Name, _customFormat2.Name), MinFormatScore = 0 }) .With(m => m.Title = "A Movie") .With(m => m.Runtime = runtime).Build(); remoteMovie.Release = new ReleaseInfo(); remoteMovie.Release.PublishDate = DateTime.Now.AddDays(-age); remoteMovie.Release.Size = size; remoteMovie.Release.DownloadProtocol = downloadProtocol; remoteMovie.Release.Title = "A Movie 1998"; remoteMovie.Release.IndexerPriority = indexerPriority; remoteMovie.CustomFormats = new List <CustomFormat>(); remoteMovie.CustomFormatScore = 0; return(remoteMovie); }
private RemoteBook GivenRemoteAlbum(List <Book> albums, QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet, int indexerPriority = 25) { var remoteBook = new RemoteBook(); remoteBook.ParsedBookInfo = new ParsedBookInfo(); remoteBook.ParsedBookInfo.Quality = quality; remoteBook.Books = new List <Book>(); remoteBook.Books.AddRange(albums); remoteBook.Release = new ReleaseInfo(); remoteBook.Release.PublishDate = DateTime.Now.AddDays(-age); remoteBook.Release.Size = size; remoteBook.Release.DownloadProtocol = downloadProtocol; remoteBook.Release.IndexerPriority = indexerPriority; remoteBook.Author = Builder <Author> .CreateNew() .With(e => e.QualityProfile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities() }).Build(); remoteBook.DownloadAllowed = true; return(remoteBook); }
public IDownloadClient GetDownloadClient(DownloadProtocol downloadProtocol) { return _downloadClientFactory.GetAvailableProviders().FirstOrDefault(v => v.Protocol == downloadProtocol); }
public IDownloadClient GetDownloadClient(DownloadProtocol downloadProtocol) { return(_downloadClientFactory.GetAvailableProviders().FirstOrDefault(v => v.Protocol == downloadProtocol)); }
private RemoteAlbum GetRemoteAlbum(List <Album> albums, QualityModel quality, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet) { var remoteAlbum = new RemoteAlbum(); remoteAlbum.ParsedAlbumInfo = new ParsedAlbumInfo(); remoteAlbum.ParsedAlbumInfo.Quality = quality; remoteAlbum.Albums = new List <Album>(); remoteAlbum.Albums.AddRange(albums); remoteAlbum.Release = new ReleaseInfo(); remoteAlbum.Release.DownloadProtocol = downloadProtocol; remoteAlbum.Release.PublishDate = DateTime.UtcNow; remoteAlbum.Artist = Builder <Artist> .CreateNew() .With(e => e.QualityProfile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities() }) .Build(); return(remoteAlbum); }
public DownloadClient GetDownloadClient(DownloadProtocol protocol) { throw new NotImplementedException(); }
private RemoteAlbum GivenRemoteAlbum(List <Album> albums, QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet) { var remoteAlbum = new RemoteAlbum(); remoteAlbum.ParsedAlbumInfo = new ParsedAlbumInfo(); remoteAlbum.ParsedAlbumInfo.Quality = quality; remoteAlbum.Albums = new List <Album>(); remoteAlbum.Albums.AddRange(albums); remoteAlbum.Release = new ReleaseInfo(); remoteAlbum.Release.PublishDate = DateTime.Now.AddDays(-age); remoteAlbum.Release.Size = size; remoteAlbum.Release.DownloadProtocol = downloadProtocol; remoteAlbum.Artist = Builder <Artist> .CreateNew() .With(e => e.QualityProfile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities() }).Build(); remoteAlbum.DownloadAllowed = true; return(remoteAlbum); }
public int GetProtocolDelay(DownloadProtocol protocol) { return(protocol == DownloadProtocol.Torrent ? TorrentDelay : UsenetDelay); }
public static DelayProfilePost NewPost(bool enableTor, bool enableUse, int order, DownloadProtocol protocol, int torrentDelay, int usenetDelay, HashSet <int> tags) { if (order <= 0) { throw new ArgumentException("The order of the Delay Profile cannot be lower than 1."); } var dp = new DelayProfilePost { EnableTorrent = enableTor, EnableUsenet = enableUse, PreferredProtocol = protocol, Tags = tags, TorrentDelay = torrentDelay, UsenetDelay = usenetDelay }; dp.SetOrder(order); return(dp); }
private void GivenProtocol(DownloadProtocol downloadProtocol) { _remoteEpisode.Release.DownloadProtocol = downloadProtocol; }
private RemoteMovie GivenRemoteMovie(QualityModel quality, int age = 0, long size = 0, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet) { var remoteMovie = new RemoteMovie(); remoteMovie.ParsedMovieInfo = new ParsedMovieInfo(); remoteMovie.ParsedMovieInfo.MovieTitle = "A Movie"; remoteMovie.ParsedMovieInfo.Year = 1998; remoteMovie.ParsedMovieInfo.MovieTitleInfo = new SeriesTitleInfo { Year = 1998 }; remoteMovie.ParsedMovieInfo.MovieTitleInfo.Year = 1998; remoteMovie.ParsedMovieInfo.Quality = quality; remoteMovie.Movie = Builder <Movie> .CreateNew().With(m => m.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities(), PreferredTags = new List <string> { "DTS-HD", "SPARKS" } }) .With(m => m.Title = "A Movie").Build(); remoteMovie.Release = new ReleaseInfo(); remoteMovie.Release.PublishDate = DateTime.Now.AddDays(-age); remoteMovie.Release.Size = size; remoteMovie.Release.DownloadProtocol = downloadProtocol; remoteMovie.Release.Title = "A Movie 1998"; return(remoteMovie); }