Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 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);
 }
Esempio n. 6
0
        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;
        }
Esempio n. 8
0
        private int PrioritizeDownloadProtocol(Series series, DownloadProtocol downloadProtocol)
        {
            var delayProfile = _delayProfileService.BestForTags(series.Tags);

            if (downloadProtocol == delayProfile.PreferredProtocol)
            {
                return(0);
            }

            return(1);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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);
        }
Esempio n. 15
0
 public int GetProtocolDelay(DownloadProtocol protocol)
 {
     return protocol == DownloadProtocol.Torrent ? TorrentDelay : UsenetDelay;
 }
Esempio n. 16
0
        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);
        }
Esempio n. 18
0
        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);
        }
Esempio n. 19
0
 public IDownloadClient GetDownloadClient(DownloadProtocol downloadProtocol)
 {
     return _downloadClientFactory.GetAvailableProviders().FirstOrDefault(v => v.Protocol == downloadProtocol);
 }
Esempio n. 20
0
 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);
        }
Esempio n. 24
0
 public int GetProtocolDelay(DownloadProtocol protocol)
 {
     return(protocol == DownloadProtocol.Torrent ? TorrentDelay : UsenetDelay);
 }
Esempio n. 25
0
        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);
        }
Esempio n. 26
0
 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);
        }