示例#1
0
        public void Merge(InternalSeries from)
        {
            if (from != null)
            {
                Guid = System.Guid.NewGuid().ToString();
                if (ExternalIds == null)
                {
                    ExternalIds = new Dictionary <string, string>();
                }

                ExternalIds = ExternalIds.Union(from.ExternalIds).ToDictionary(x => x.Key, y => y.Value);

                TvMazeId               = string.IsNullOrEmpty(from.TvMazeId) ? TvMazeId : from.TvMazeId;
                TmdbId                 = string.IsNullOrEmpty(from.TmdbId) ? TmdbId : from.TmdbId;
                EpisodeRunTime         = from.EpisodeRunTime ?? EpisodeRunTime;
                FirstAirDate           = string.IsNullOrEmpty(from.FirstAirDate) ? FirstAirDate : from.FirstAirDate;
                LastEpisodeSimpleToAir = from.LastEpisodeSimpleToAir ?? LastEpisodeSimpleToAir;
                CreatedBy              = from.CreatedBy ?? CreatedBy;
                Networks               = from.Networks ?? Networks;
                OriginalLanguage       = string.IsNullOrEmpty(from.OriginalLanguage) ? OriginalLanguage : from.OriginalLanguage;
                Popularity             = string.IsNullOrEmpty(from.Popularity) ? Popularity : from.Popularity;
                ProductionCompanies    = from.ProductionCompanies ?? ProductionCompanies;
                Rating                 = from.Rating ?? Rating;
                VoteCount              = from.VoteCount <= 0 ? VoteCount : from.VoteCount;
                Status                 = string.IsNullOrEmpty(from.Status) ? Status : from.Status;
                Year             = string.IsNullOrEmpty(from.Year) ? Year : from.Year;
                Type             = string.IsNullOrEmpty(from.Type) ? Type : from.Type;
                OriginalLanguage = string.IsNullOrEmpty(from.OriginalLanguage) ? OriginalLanguage : from.OriginalLanguage;
                TotalSeasons     = from.TotalSeasons <= 0 && from.TotalSeasons != TotalSeasons ? TotalSeasons : from.TotalSeasons;

                MergeGenreCategory();
                MergeSeasons(from);
            }
        }
        public async Task<Movie> SearchForMovieAsync(string title, int year, ExternalIds knownIds)
        {
            var response = await _restConnection.MakeRequestAsync<SearchResults, object>(Method.Get, ResponseType.Json,
                PlexResources.TmdbBaseUrl, string.Format(PlexResources.TmdbSearchMovie, title, year, _apiKey),
                timeout: 30000);

            if (response == null || response.ResponseObject == null || !response.ResponseObject.Results.Any())
                return null;

            var results = response.ResponseObject.Results.Where(r => r.Title == title).ToList();
            if (results.Count() == 1)
                return await GetMovieAsync(results.Single().Id);

            if (knownIds.ImdbId.IsNullOrEmpty()) return null;

            // try matching ids
            foreach (var result in results)
            {
                var movie = await LoadMovieAsync(result.Id, 10000);
                if (movie.ImdbId == knownIds.ImdbId)
                {
                    if (!await LoadCreditsForMovieAsync(movie)) return null;
                    return movie;
                }
            }

            return null;
        }
        private async Task ValidateRequestedItemNotInPlex(int theMovieDbId, ExternalIds externalIds, ValidationContext resultContext)
        {
            var plexMediaItem = await GetExistingPlexMediaItem(theMovieDbId, externalIds);

            if (plexMediaItem != null)
            {
                _logger.LogDebug($"Request not created as existing Plex item: {plexMediaItem.PlexMediaItemId}");
                resultContext.AddError("Request not created", "The Movie is already available in Plex.");
            }
        }
        public async Task<TvShow> SearchForTvShowAsync(string title, ExternalIds knownSeriesIds, 
            int seasonNumber, int episodeNumber)
        {
            // handle cases like Castle (called Castle(2009) on TVDB)
            // use regex as the year could be episode year and not match the title
            var strippedTitle = title;

            if (strippedTitle.Length > 7)
            {
                var regex = new Regex(@" \(\d\d\d\d\)");
                if (regex.IsMatch(strippedTitle.Substring(strippedTitle.Length - 8)))
                    strippedTitle = strippedTitle.Substring(0, strippedTitle.Length - 7);
            }

            var response = await _restConnection.MakeRequestAsync<SearchResults, object>(Method.Get, ResponseType.Json,
                PlexResources.TmdbBaseUrl, string.Format(PlexResources.TmdbSearchTvShow, strippedTitle, _apiKey),
                timeout: 30000);

            if (response == null || response.ResponseObject == null || !response.ResponseObject.Results.Any())
                return null;
            
            var results = response.ResponseObject.Results.Where(r => r.Name == title).ToList();
            if (results.Count() == 1)
                return await GetTvShowAsync(results.Single().Id, seasonNumber, episodeNumber);

            if (!results.Any())
            {
                results = response.ResponseObject.Results.Where(r => r.Name == strippedTitle).ToList();
                if (results.Count() == 1)
                    return await GetTvShowAsync(results.Single().Id, seasonNumber, episodeNumber);

                if (!results.Any())
                    return null;
            }
            
            if (knownSeriesIds.ImdbId.IsNullOrEmpty() && knownSeriesIds.TvdbId.IsNullOrEmpty()) return null;

            // try matching ids
            foreach (var result in results)
            {
                var tvShow = await LoadTvShowAsync(result.Id, 10000);

                if (tvShow == null) return null;

                if (await LoadExternalIdsForTvShowAsync(tvShow, seasonNumber, episodeNumber))
                {
                    if (tvShow.ExternalExternalIds.ImdbId == knownSeriesIds.ImdbId ||
                        tvShow.ExternalExternalIds.TvdbId == knownSeriesIds.TvdbId)
                        return (!await LoadCreditsForTvShowAsync(tvShow, seasonNumber, episodeNumber)) ? null : tvShow;
                }
            }

            return null;
        }
示例#5
0
        public void TestTvSeasonSeparateExtrasExternalIds()
        {
            ExternalIds externalIds = _config.Client.GetTvSeasonExternalIds(BreakingBad, 1);

            Assert.IsNotNull(externalIds);
            Assert.AreEqual(3572, externalIds.Id);
            Assert.AreEqual("/en/breaking_bad_season_1", externalIds.FreebaseId);
            Assert.AreEqual("/m/05yy27m", externalIds.FreebaseMid);
            Assert.IsNull(externalIds.ImdbId);
            Assert.IsNull(externalIds.TvrageId);
            Assert.AreEqual(30272, externalIds.TvdbId);
        }
示例#6
0
        public void TestTvEpisodeSeparateExtrasExternalIds()
        {
            ExternalIds externalIds = _config.Client.GetTvEpisodeExternalIdsAsync(IdHelper.BreakingBad, 1, 1).Result;

            Assert.IsNotNull(externalIds);
            Assert.IsTrue(string.IsNullOrEmpty(externalIds.FreebaseId));
            Assert.AreEqual(62085, externalIds.Id);
            Assert.AreEqual("/m/03mb620", externalIds.FreebaseMid);
            Assert.AreEqual("tt0959621", externalIds.ImdbId);
            Assert.AreEqual(637041, externalIds.TvrageId);
            Assert.AreEqual(349232, externalIds.TvdbId);
        }
示例#7
0
        public void TestTvEpisodeSeparateExtrasExternalIds()
        {
            ExternalIds externalIds = _config.Client.GetTvEpisodeExternalIds(BreakingBad, 1, 1);

            Assert.IsNotNull(externalIds);
            Assert.IsNull(externalIds.FreebaseId);
            Assert.AreEqual(62085, externalIds.Id);
            Assert.AreEqual("/m/03mb620", externalIds.FreebaseMid);
            Assert.AreEqual("tt0959621", externalIds.ImdbId);
            Assert.AreEqual(637041, externalIds.TvrageId);
            Assert.AreEqual(349232, externalIds.TvdbId);
        }
示例#8
0
        public void TestTvShowSeparateExtrasExternalIds()
        {
            ExternalIds externalIds = _config.Client.GetTvShowExternalIds(BreakingBad).Result;

            Assert.IsNotNull(externalIds);
            Assert.AreEqual(1396, externalIds.Id);
            Assert.AreEqual("/en/breaking_bad", externalIds.FreebaseId);
            Assert.AreEqual("/m/03d34x8", externalIds.FreebaseMid);
            Assert.AreEqual("tt0903747", externalIds.ImdbId);
            Assert.AreEqual(18164, externalIds.TvrageId);
            Assert.AreEqual(81189, externalIds.TvdbId);
        }
        public void TestPersonsGetPersonExternalIds()
        {
            ExternalIds item = _config.Client.GetPersonExternalIdsAsync(IdHelper.BruceWillis).Result;

            Assert.IsNotNull(item);

            Assert.AreEqual(IdHelper.BruceWillis, item.Id);
            Assert.AreEqual("nm0000246", item.ImdbId);
            Assert.AreEqual("/m/0h7pj", item.FreebaseMid);
            Assert.AreEqual("/en/bruce_willis", item.FreebaseId);
            Assert.IsNull(item.TvdbId);
            Assert.AreEqual("10183", item.TvrageId);
        }
示例#10
0
        public void TestPersonsGetPersonExternalIds()
        {
            ExternalIds item = _config.Client.GetPersonExternalIds(BruceWillis);

            Assert.IsNotNull(item);

            Assert.AreEqual(BruceWillis, item.Id);
            Assert.AreEqual("nm0000246", item.ImdbId);
            Assert.AreEqual("/m/0h7pj", item.FreebaseMid);
            Assert.AreEqual("/en/bruce_willis", item.FreebaseId);
            Assert.IsFalse(item.TvdbId.HasValue);
            Assert.AreEqual(10183, item.TvrageId);
        }
示例#11
0
        public async Task <Movie> SearchForMovieAsync(string title, int year, ExternalIds knownIds)
        {
            var response = await _restConnection.MakeRequestAsync <SearchResults, object>(Method.Get, ResponseType.Json,
                                                                                          PlexResources.TmdbBaseUrl, string.Format(PlexResources.TmdbSearchMovie, title, year, _apiKey),
                                                                                          timeout : 30000);

            if (response == null || response.ResponseObject == null || !response.ResponseObject.Results.Any())
            {
                return(null);
            }

            var results = response.ResponseObject.Results.Where(r => r.Title == title).ToList();

            if (results.Count() == 1)
            {
                return(await GetMovieAsync(results.Single().Id));
            }

            if (knownIds.ImdbId.IsNullOrEmpty())
            {
                return(null);
            }

            // try matching ids
            foreach (var result in results)
            {
                var movie = await LoadMovieAsync(result.Id, 10000);

                if (movie.ImdbId == knownIds.ImdbId)
                {
                    if (!await LoadCreditsForMovieAsync(movie))
                    {
                        return(null);
                    }
                    return(movie);
                }
            }

            return(null);
        }
        public override Track Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType is not JsonTokenType.StartObject)
            {
                throw new JsonException();
            }

            var countryCodeArrayConverter      = options.GetConverter <CountryCodeArray>();
            var externalIdsConverter           = options.GetConverter <ExternalIds>();
            var externalUrlsConverter          = options.GetConverter <ExternalUrls>();
            var simplifiedAlbumConverter       = options.GetConverter <SimplifiedAlbum>();
            var simplifiedArtistArrayConverter = options.GetConverter <SimplifiedArtistArray>();
            var uriConverter = options.GetConverter <Uri>();

            string                id               = string.Empty;
            Uri                   uri              = null !;
            Uri                   href             = null !;
            string                name             = string.Empty;
            SimplifiedAlbum       album            = null !;
            SimplifiedArtistArray artists          = Array.Empty <SimplifiedArtist>();
            int                   duration         = default;
            int                   trackNumber      = default;
            int                   discNumber       = default;
            bool                  isExplicit       = default;
            bool                  isLocal          = default;
            CountryCodeArray      availableMarkets = Array.Empty <CountryCode>();
            int                   popularity       = default;
            string                previewUrl       = string.Empty;
            ExternalIds           externalIds      = null !;
            ExternalUrls          externalUrls     = null !;

            while (reader.Read())
            {
                if (reader.TokenType is JsonTokenType.EndObject)
                {
                    break;
                }

                if (reader.TokenType is not JsonTokenType.PropertyName)
                {
                    throw new JsonException();
                }

                var propertyName = reader.GetString();

                reader.Read(); // Read to next token.

                switch (propertyName)
                {
                case "id":
                    id = reader.GetString() !;
                    break;

                case "uri":
                    uri = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "href":
                    href = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "name":
                    name = reader.GetString() !;
                    break;

                case "album":
                    album = simplifiedAlbumConverter.Read(ref reader, typeof(SimplifiedAlbum), options) !;
                    break;

                case "artists":
                    artists = simplifiedArtistArrayConverter.Read(ref reader, typeof(SimplifiedArtistArray), options) !;
                    break;

                case "duration_ms":
                    duration = reader.GetInt32();
                    break;

                case "track_number":
                    trackNumber = reader.GetInt32();
                    break;

                case "disc_number":
                    discNumber = reader.GetInt32();
                    break;

                case "explicit":
                    isExplicit = reader.GetBoolean();
                    break;

                case "is_local":
                    isLocal = reader.GetBoolean();
                    break;

                case "available_markets":
                    availableMarkets = countryCodeArrayConverter.Read(ref reader, typeof(CountryCodeArray), options) !;
                    break;

                case "popularity":
                    popularity = reader.GetInt32();
                    break;

                case "preview_url":
                    previewUrl = reader.GetString() !;
                    break;

                case "external_ids":
                    externalIds = externalIdsConverter.Read(ref reader, typeof(ExternalIds), options) !;
                    break;

                case "external_urls":
                    externalUrls = externalUrlsConverter.Read(ref reader, typeof(ExternalUrls), options) !;
                    break;

                default:
                    reader.Skip();
                    break;
                }
            }

            return(new(
                       id,
                       uri,
                       href,
                       name,
                       album,
                       artists,
                       duration,
                       discNumber,
                       trackNumber,
                       isExplicit,
                       isLocal,
                       availableMarkets,
                       popularity,
                       previewUrl,
                       externalIds,
                       externalUrls));
        }
        private async Task <PlexMediaItemRow> GetExistingPlexMediaItem(int theMovieDbId, ExternalIds externalIds)
        {
            var plexMediaItem = await _plexService.GetExistingMediaItemByAgent(PlexMediaTypes.Movie, AgentTypes.TheMovieDb, theMovieDbId.ToString());

            if (plexMediaItem == null && !string.IsNullOrEmpty(externalIds?.Imdb_Id))
            {
                plexMediaItem =
                    await _plexService.GetExistingMediaItemByAgent(PlexMediaTypes.Movie, AgentTypes.Imdb,
                                                                   externalIds.Imdb_Id);
            }

            return(plexMediaItem);
        }
        private async Task CreateRequest(CreateMovieRequestCommand request, MovieDetails movieDetail, ExternalIds externalIds)
        {
            var newRequest = new MovieRequestRow
            {
                UserId       = _claimsPrincipalAccessor.UserId,
                Title        = movieDetail.Title,
                AirDateUtc   = DateTime.Parse(movieDetail.Release_Date),
                ImagePath    = movieDetail.Poster_Path,
                TheMovieDbId = request.TheMovieDbId
            };

            newRequest.MovieRequestAgents.Add(new MovieRequestAgentRow(AgentTypes.TheMovieDb, request.TheMovieDbId.ToString()));

            if (!string.IsNullOrEmpty(externalIds.Imdb_Id))
            {
                newRequest.MovieRequestAgents.Add(new MovieRequestAgentRow(AgentTypes.Imdb, externalIds.Imdb_Id));
            }

            await _requestService.Add(newRequest);
        }
 private void GivenExternalIdsFromTheMovieDb()
 {
     _externalIds = new ExternalIdsBuilder().Build();
     _theMovieDbService.GetMovieExternalIds(Arg.Any <int>()).Returns(_externalIds);
 }
示例#16
0
        public async Task <TvShow> SearchForTvShowAsync(string title, ExternalIds knownSeriesIds,
                                                        int seasonNumber, int episodeNumber)
        {
            // handle cases like Castle (called Castle(2009) on TVDB)
            // use regex as the year could be episode year and not match the title
            var strippedTitle = title;

            if (strippedTitle.Length > 7)
            {
                var regex = new Regex(@" \(\d\d\d\d\)");
                if (regex.IsMatch(strippedTitle.Substring(strippedTitle.Length - 8)))
                {
                    strippedTitle = strippedTitle.Substring(0, strippedTitle.Length - 7);
                }
            }

            var response = await _restConnection.MakeRequestAsync <SearchResults, object>(Method.Get, ResponseType.Json,
                                                                                          PlexResources.TmdbBaseUrl, string.Format(PlexResources.TmdbSearchTvShow, strippedTitle, _apiKey),
                                                                                          timeout : 30000);

            if (response == null || response.ResponseObject == null || !response.ResponseObject.Results.Any())
            {
                return(null);
            }

            var results = response.ResponseObject.Results.Where(r => r.Name == title).ToList();

            if (results.Count() == 1)
            {
                return(await GetTvShowAsync(results.Single().Id, seasonNumber, episodeNumber));
            }

            if (!results.Any())
            {
                results = response.ResponseObject.Results.Where(r => r.Name == strippedTitle).ToList();
                if (results.Count() == 1)
                {
                    return(await GetTvShowAsync(results.Single().Id, seasonNumber, episodeNumber));
                }

                if (!results.Any())
                {
                    return(null);
                }
            }

            if (knownSeriesIds.ImdbId.IsNullOrEmpty() && knownSeriesIds.TvdbId.IsNullOrEmpty())
            {
                return(null);
            }

            // try matching ids
            foreach (var result in results)
            {
                var tvShow = await LoadTvShowAsync(result.Id, 10000);

                if (tvShow == null)
                {
                    return(null);
                }

                if (await LoadExternalIdsForTvShowAsync(tvShow, seasonNumber, episodeNumber))
                {
                    if (tvShow.ExternalExternalIds.ImdbId == knownSeriesIds.ImdbId ||
                        tvShow.ExternalExternalIds.TvdbId == knownSeriesIds.TvdbId)
                    {
                        return((!await LoadCreditsForTvShowAsync(tvShow, seasonNumber, episodeNumber)) ? null : tvShow);
                    }
                }
            }

            return(null);
        }
        public override Album Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType is not JsonTokenType.StartObject)
            {
                throw new JsonException();
            }

            var copyrightArrayConverter        = options.GetConverter <CopyrightArray>();
            var countryCodeArrayConverter      = options.GetConverter <CountryCodeArray>();
            var externalIdsConverter           = options.GetConverter <ExternalIds>();
            var externalUrlsConverter          = options.GetConverter <ExternalUrls>();
            var imageArrayConverter            = options.GetConverter <ImageArray>();
            var simplifiedArtistArrayConverter = options.GetConverter <SimplifiedArtistArray>();
            var simplifiedTrackPagingConverter = options.GetConverter <Paging <SimplifiedTrack> >();
            var stringArrayConverter           = options.GetConverter <StringArray>();
            var uriConverter = options.GetConverter <Uri>();

            string                   id                   = string.Empty;
            Uri                      uri                  = null !;
            Uri                      href                 = null !;
            string                   name                 = string.Empty;
            AlbumType                type                 = default;
            ImageArray               images               = Array.Empty <Image>();
            SimplifiedArtistArray    artists              = Array.Empty <SimplifiedArtist>();
            DateTime                 releaseDate          = default;
            ReleaseDatePrecision     releaseDatePrecision = default;
            CountryCodeArray         availableMarkets     = Array.Empty <CountryCode>();
            CopyrightArray           copyrights           = Array.Empty <Copyright>();
            ExternalIds              externalIds          = null !;
            ExternalUrls             externalUrls         = null !;
            StringArray              genres               = Array.Empty <string>();
            string                   label                = string.Empty;
            int                      popularity           = default;
            Paging <SimplifiedTrack> tracks               = null !;

            while (reader.Read())
            {
                if (reader.TokenType is JsonTokenType.EndObject)
                {
                    break;
                }

                if (reader.TokenType is not JsonTokenType.PropertyName)
                {
                    throw new JsonException();
                }

                var propertyName = reader.GetString();

                reader.Read(); // Read to next token.

                switch (propertyName)
                {
                case "id":
                    id = reader.GetString() !;
                    break;

                case "uri":
                    uri = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "href":
                    href = uriConverter.Read(ref reader, typeof(Uri), options) !;
                    break;

                case "name":
                    name = reader.GetString() !;
                    break;

                case "album_type":
                    type = AlbumTypeConverter.FromSpotifyString(reader.GetString() !);
                    break;

                case "images":
                    images = imageArrayConverter.Read(ref reader, typeof(ImageArray), options) !;
                    break;

                case "artists":
                    artists = simplifiedArtistArrayConverter.Read(ref reader, typeof(SimplifiedArtistArray), options) !;
                    break;

                case "release_date":
                    releaseDate = reader.GetReleaseDate();
                    break;

                case "release_date_precision":
                    releaseDatePrecision = ReleaseDatePrecisionConverter.FromSpotifyString(reader.GetString() !);
                    break;

                case "tracks":
                    tracks = simplifiedTrackPagingConverter.Read(ref reader, typeof(Paging <SimplifiedTrack>), options) !;
                    break;

                case "genres":
                    genres = stringArrayConverter.Read(ref reader, typeof(StringArray), options) !;
                    break;

                case "popularity":
                    popularity = reader.GetInt32();
                    break;

                case "available_markets":
                    availableMarkets = countryCodeArrayConverter.Read(ref reader, typeof(CountryCodeArray), options) !;
                    break;

                case "label":
                    label = reader.GetString() !;
                    break;

                case "copyrights":
                    copyrights = copyrightArrayConverter.Read(ref reader, typeof(CopyrightArray), options) !;
                    break;

                case "external_ids":
                    externalIds = externalIdsConverter.Read(ref reader, typeof(ExternalIds), options) !;
                    break;

                case "external_urls":
                    externalUrls = externalUrlsConverter.Read(ref reader, typeof(ExternalUrls), options) !;
                    break;

                default:
                    reader.Skip();
                    break;
                }
            }

            return(new(
                       id,
                       uri,
                       href,
                       name,
                       type,
                       images,
                       artists,
                       releaseDate,
                       releaseDatePrecision,
                       tracks,
                       genres,
                       popularity,
                       availableMarkets,
                       label,
                       copyrights,
                       externalIds,
                       externalUrls));
        }