예제 #1
0
        public async Task SyncsMovieWithGuidFromInitalMetadata()
        {
            var content = new Mediacontainer
            {
                Metadata = new[]
                {
                    new Metadata
                    {
                        title = "test1",
                        year  = 2021,
                        type  = "movie",
                        Guid  = new List <PlexGuids>
                        {
                            new PlexGuids
                            {
                                Id = "imdb://tt0322259"
                            }
                        },
                        ratingKey = "1"
                    },
                }
            };
            var contentToAdd     = new HashSet <PlexServerContent>();
            var contentProcessed = new Dictionary <int, string>();

            await _subject.MovieLoop(new PlexServers(), content, contentToAdd, contentProcessed);

            var first = contentToAdd.First();

            Assert.That(first.ImdbId, Is.EqualTo("tt0322259"));
            _mocker.Verify <IPlexApi>(x => x.GetMetadata(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()), Times.Never);
        }
예제 #2
0
        public async Task DoesNotSyncExistingMovie()
        {
            var content = new Mediacontainer
            {
                Metadata = new[]
                {
                    new Metadata
                    {
                        title = "test1",
                        year  = 2021,
                        type  = "movie"
                    },
                }
            };
            var contentToAdd     = new HashSet <PlexServerContent>();
            var contentProcessed = new Dictionary <int, string>();

            _mocker.Setup <IPlexContentRepository>(x =>
                                                   x.GetFirstContentByCustom(It.IsAny <Expression <Func <PlexServerContent, bool> > >()))
            .Returns(Task.FromResult(new PlexServerContent()));

            await _subject.MovieLoop(new PlexServers(), content, contentToAdd, contentProcessed);

            Assert.That(contentToAdd, Is.Empty);
        }
예제 #3
0
        public async Task SyncsMovieWithGuidFromCallToApi()
        {
            var content = new Mediacontainer
            {
                Metadata = new[]
                {
                    new Metadata
                    {
                        ratingKey = "11",
                        title     = "test1",
                        year      = 2021,
                        type      = "movie",
                    },
                }
            };
            var contentToAdd     = new HashSet <PlexServerContent>();
            var contentProcessed = new Dictionary <int, string>();

            _mocker.Setup <IPlexApi>(x => x.GetMetadata(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()))
            .Returns(Task.FromResult(new PlexMetadata
            {
                MediaContainer = new Mediacontainer
                {
                    Metadata = new[]
                    {
                        new Metadata
                        {
                            ratingKey = "11",
                            title     = "test1",
                            year      = 2021,
                            type      = "movie",
                            Guid      = new List <PlexGuids>
                            {
                                new PlexGuids
                                {
                                    Id = "imdb://tt0322259"
                                }
                            },
                        }
                    }
                }
            }));

            await _subject.MovieLoop(new PlexServers { Ip = "http://test.com/", Port = 80 }, content, contentToAdd, contentProcessed);

            var first = contentToAdd.First();

            Assert.That(first.ImdbId, Is.EqualTo("tt0322259"));

            _mocker.Verify <IPlexApi>(x => x.GetMetadata(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()), Times.Once);
        }
예제 #4
0
        public async Task DoesNotUpdatesExistingMovieWhen_WeFindSameQuality()
        {
            var content = new Mediacontainer
            {
                Metadata = new[]
                {
                    new Metadata
                    {
                        ratingKey = "11",
                        title     = "test1",
                        year      = 2021,
                        type      = "movie",
                        Media     = new Medium[1]
                        {
                            new Medium
                            {
                                videoResolution = "1080"
                            }
                        }
                    },
                }
            };
            var contentToAdd     = new HashSet <PlexServerContent>();
            var contentProcessed = new Dictionary <int, string>();

            _mocker.Setup <IPlexContentRepository>(x =>
                                                   x.GetFirstContentByCustom(It.IsAny <Expression <Func <PlexServerContent, bool> > >()))
            .Returns(Task.FromResult(new PlexServerContent
            {
                Quality = "1080"
            }));

            await _subject.MovieLoop(new PlexServers(), content, contentToAdd, contentProcessed);

            Assert.That(contentToAdd, Is.Empty);
            _mocker.Verify <IPlexContentRepository>(x => x.Update(It.IsAny <PlexServerContent>()), Times.Never);
        }
예제 #5
0
        public async Task MovieLoop(PlexServers servers, Mediacontainer content, HashSet <PlexServerContent> contentToAdd,
                                    Dictionary <int, int> contentProcessed)
        {
            Logger.LogDebug("Processing Movies");
            foreach (var movie in content?.Metadata ?? new Metadata[] { })
            {
                // Let's check if we have this movie

                try
                {
                    var existing = await Repo.GetFirstContentByCustom(x => x.Title == movie.title &&
                                                                      x.ReleaseYear == movie.year.ToString() &&
                                                                      x.Type == PlexMediaTypeEntity.Movie);

                    // The rating key keeps changing
                    //var existing = await Repo.GetByKey(movie.ratingKey);
                    if (existing != null)
                    {
                        Logger.LogDebug("We already have movie {0}", movie.title);
                        continue;
                    }

                    var hasSameKey = await Repo.GetByKey(movie.ratingKey);

                    if (hasSameKey != null)
                    {
                        await Repo.Delete(hasSameKey);
                    }

                    Logger.LogDebug("Adding movie {0}", movie.title);
                    var guids = new List <string>();
                    if (!movie.Guid.Any())
                    {
                        var metaData = await PlexApi.GetMetadata(servers.PlexAuthToken, servers.FullUri,
                                                                 movie.ratingKey);

                        var meta = metaData.MediaContainer.Metadata.FirstOrDefault();
                        guids.Add(meta.guid);
                        if (meta.Guid != null)
                        {
                            foreach (var g in meta.Guid)
                            {
                                guids.Add(g.Id);
                            }
                        }
                    }
                    else
                    {
                        // Currently a Plex Pass feature only
                        foreach (var g in movie.Guid)
                        {
                            guids.Add(g.Id);
                        }
                    }

                    var providerIds = PlexHelper.GetProviderIdsFromMetadata(guids.ToArray());

                    var item = new PlexServerContent
                    {
                        AddedAt     = DateTime.Now,
                        Key         = movie.ratingKey,
                        ReleaseYear = movie.year.ToString(),
                        Type        = PlexMediaTypeEntity.Movie,
                        Title       = movie.title,
                        Url         = PlexHelper.GetPlexMediaUrl(servers.MachineIdentifier, movie.ratingKey),
                        Seasons     = new List <PlexSeasonsContent>(),
                        Quality     = movie.Media?.FirstOrDefault()?.videoResolution ?? string.Empty
                    };
                    if (providerIds.ImdbId.HasValue())
                    {
                        item.ImdbId = providerIds.ImdbId;
                    }

                    if (providerIds.TheMovieDb.HasValue())
                    {
                        item.TheMovieDbId = providerIds.TheMovieDb;
                    }

                    if (providerIds.TheTvDb.HasValue())
                    {
                        item.TvDbId = providerIds.TheTvDb;
                    }

                    contentToAdd.Add(item);
                }
                catch (Exception e)
                {
                    Logger.LogError(LoggingEvents.PlexContentCacher, e, "Exception when adding new Movie {0}",
                                    movie.title);
                }

                if (contentToAdd.Count > 500)
                {
                    await Repo.AddRange(contentToAdd);

                    foreach (var c in contentToAdd)
                    {
                        contentProcessed.Add(c.Id, c.Key);
                    }

                    contentToAdd.Clear();
                }
            }
        }
예제 #6
0
        public async Task MovieLoop(PlexServers servers, Mediacontainer content, HashSet <PlexServerContent> contentToAdd,
                                    Dictionary <int, string> contentProcessed)
        {
            Logger.LogDebug("Processing Movies");
            foreach (var movie in content?.Metadata ?? Array.Empty <Metadata>())
            {
                // Let's check if we have this movie

                try
                {
                    var existing = await Repo.GetFirstContentByCustom(x => x.Title == movie.title &&
                                                                      x.ReleaseYear == movie.year.ToString() &&
                                                                      x.Type == MediaType.Movie);

                    if (existing != null)
                    {
                        // We need to see if this is a different quality,
                        // We want to know if this is a 4k content for example
                        var foundQualities = movie.Media?.Select(x => x.videoResolution);
                        var qualitySaved   = false;
                        foreach (var quality in foundQualities)
                        {
                            if (qualitySaved)
                            {
                                break;
                            }
                            if (quality.Equals(existing.Quality))
                            {
                                // We got it
                                continue;
                            }

                            // We don't have this quality
                            if (quality.Equals("4k", StringComparison.InvariantCultureIgnoreCase))
                            {
                                Logger.LogDebug($"We already have movie {movie.title}, But found a 4K version!");
                                existing.Has4K = true;
                                await Repo.Update(existing);
                            }
                            else
                            {
                                qualitySaved     = true;
                                existing.Quality = quality;
                                await Repo.Update(existing);
                            }
                        }


                        Logger.LogDebug($"We already have movie {movie.title}");
                        continue;
                    }

                    //var hasSameKey = await Repo.GetByKey(movie.ratingKey);
                    //if (hasSameKey != null)
                    //{
                    //    await Repo.Delete(hasSameKey);
                    //}

                    Logger.LogDebug("Adding movie {0}", movie.title);
                    var guids = new List <string>();
                    if (!movie.Guid.Any())
                    {
                        var metaData = await PlexApi.GetMetadata(servers.PlexAuthToken, servers.FullUri,
                                                                 movie.ratingKey);

                        var meta = metaData.MediaContainer.Metadata.FirstOrDefault();
                        guids.Add(meta.guid);
                        if (meta.Guid != null)
                        {
                            foreach (var g in meta.Guid)
                            {
                                guids.Add(g.Id);
                            }
                        }
                    }
                    else
                    {
                        // Currently a Plex Pass feature only
                        foreach (var g in movie.Guid)
                        {
                            guids.Add(g.Id);
                        }
                    }

                    if (!guids.Any())
                    {
                        Logger.LogWarning($"Movie {movie.title} has no relevant metadata. Skipping.");
                        continue;
                    }
                    var providerIds = PlexHelper.GetProviderIdsFromMetadata(guids.ToArray());

                    if (!providerIds.Any())
                    {
                        Logger.LogWarning($"Movie {movie.title} has no External Ids in Plex (ImdbId, TheMovieDbId). Skipping.");
                        continue;
                    }

                    var qualities       = movie?.Media?.Select(x => x?.videoResolution ?? string.Empty) ?? Enumerable.Empty <string>();
                    var is4k            = qualities != null && qualities.Any(x => x.Equals("4k", StringComparison.InvariantCultureIgnoreCase));
                    var selectedQuality = is4k ? null : qualities?.OrderBy(x => x)?.FirstOrDefault() ?? string.Empty;

                    var item = new PlexServerContent
                    {
                        AddedAt     = DateTime.Now,
                        Key         = movie.ratingKey,
                        ReleaseYear = movie.year.ToString(),
                        Type        = MediaType.Movie,
                        Title       = movie.title,
                        Url         = PlexHelper.GetPlexMediaUrl(servers.MachineIdentifier, movie.ratingKey, servers.ServerHostname),
                        Seasons     = new List <PlexSeasonsContent>(),
                        Quality     = selectedQuality,
                        Has4K       = is4k,
                    };
                    if (providerIds.ImdbId.HasValue())
                    {
                        item.ImdbId = providerIds.ImdbId;
                    }

                    if (providerIds.TheMovieDb.HasValue())
                    {
                        item.TheMovieDbId = providerIds.TheMovieDb;
                    }

                    if (providerIds.TheTvDb.HasValue())
                    {
                        item.TvDbId = providerIds.TheTvDb;
                    }

                    contentToAdd.Add(item);
                }
                catch (Exception e)
                {
                    Logger.LogError(LoggingEvents.PlexContentCacher, e, "Exception when adding new Movie {0}",
                                    movie.title);
                }

                if (contentToAdd.Count > 500)
                {
                    await Repo.AddRange(contentToAdd);

                    foreach (var c in contentToAdd)
                    {
                        contentProcessed.Add(c.Id, c.Key);
                    }

                    contentToAdd.Clear();
                }
            }
        }