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; }
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); }
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); }
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); }
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); }
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); }
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); }
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)); }