diff --git a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj
index 003c240f1..5ee3c0fed 100644
--- a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj
+++ b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj
@@ -7,12 +7,13 @@
-
+
+
-
+
diff --git a/src/Ombi.Schedule.Tests/PlexContentSyncTests.cs b/src/Ombi.Schedule.Tests/PlexContentSyncTests.cs
new file mode 100644
index 000000000..3b9fa33b0
--- /dev/null
+++ b/src/Ombi.Schedule.Tests/PlexContentSyncTests.cs
@@ -0,0 +1,144 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+using Moq;
+using Moq.AutoMock;
+using NUnit.Framework;
+using Ombi.Api.Plex;
+using Ombi.Api.Plex.Models;
+using Ombi.Core.Settings.Models.External;
+using Ombi.Schedule.Jobs.Plex;
+using Ombi.Store.Entities;
+using Ombi.Store.Repository;
+
+namespace Ombi.Schedule.Tests
+{
+ [TestFixture]
+ public class PlexContentSyncTests
+ {
+
+ private AutoMocker _mocker;
+ private PlexContentSync _subject;
+
+ [SetUp]
+ public void Setup()
+ {
+ _mocker = new AutoMocker();
+ _subject = _mocker.CreateInstance();
+ }
+
+ [Test]
+ public async Task DoesNotSyncExistingMovie()
+ {
+ var content = new Mediacontainer
+ {
+ Metadata = new[]
+ {
+ new Metadata
+ {
+ title = "test1",
+ year = 2021,
+ type = "movie"
+ },
+ }
+ };
+ var contentToAdd = new HashSet();
+ var contentProcessed = new Dictionary();
+ _mocker.Setup(x =>
+ x.GetFirstContentByCustom(It.IsAny>>()))
+ .Returns(Task.FromResult(new PlexServerContent()));
+
+ await _subject.MovieLoop(new PlexServers(), content, contentToAdd, contentProcessed);
+
+ Assert.That(contentToAdd, Is.Empty);
+ }
+
+ [Test]
+ public async Task SyncsMovieWithGuidFromInitalMetadata()
+ {
+ var content = new Mediacontainer
+ {
+ Metadata = new[]
+ {
+ new Metadata
+ {
+ title = "test1",
+ year = 2021,
+ type = "movie",
+ Guid = new List
+ {
+ new PlexGuids
+ {
+ Id = "imdb://tt0322259"
+ }
+ },
+ ratingKey = 1
+ },
+ }
+ };
+ var contentToAdd = new HashSet();
+ var contentProcessed = new Dictionary();
+
+ await _subject.MovieLoop(new PlexServers(), content, contentToAdd, contentProcessed);
+
+ var first = contentToAdd.First();
+ Assert.That(first.ImdbId, Is.EqualTo("tt0322259"));
+ _mocker.Verify(x => x.GetMetadata(It.IsAny(), It.IsAny(),It.IsAny()), Times.Never);
+ }
+
+ [Test]
+ public async Task SyncsMovieWithGuidFromCallToApi()
+ {
+ var content = new Mediacontainer
+ {
+ Metadata = new[]
+ {
+ new Metadata
+ {
+ ratingKey = 11,
+ title = "test1",
+ year = 2021,
+ type = "movie",
+ },
+ }
+ };
+ var contentToAdd = new HashSet();
+ var contentProcessed = new Dictionary();
+ _mocker.Setup(x => x.GetMetadata(It.IsAny(), It.IsAny(), It.IsAny()))
+ .Returns(Task.FromResult(new PlexMetadata
+ {
+ MediaContainer = new Mediacontainer
+ {
+ Metadata = new[]
+ {
+ new Metadata
+ {
+ ratingKey = 11,
+ title = "test1",
+ year = 2021,
+ type = "movie",
+ Guid = new List
+ {
+ 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(x => x.GetMetadata(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once);
+ }
+ }
+}
diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs b/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs
index 0c210668c..3289c5a24 100644
--- a/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs
+++ b/src/Ombi.Schedule/Jobs/Plex/PlexContentSync.cs
@@ -262,100 +262,122 @@ namespace Ombi.Schedule.Jobs.Plex
}
if (content.viewGroup.Equals(PlexMediaType.Movie.ToString(), StringComparison.InvariantCultureIgnoreCase))
{
- Logger.LogDebug("Processing Movies");
- foreach (var movie in content?.Metadata ?? new Metadata[] { })
+ await MovieLoop(servers, content, contentToAdd, contentProcessed);
+ }
+ if (contentToAdd.Count > 500)
+ {
+ await Repo.AddRange(contentToAdd);
+ foreach (var c in contentToAdd)
{
- // Let's check if we have this movie
+ contentProcessed.Add(c.Id, c.Key);
+ }
+ contentToAdd.Clear();
+ }
+ }
- 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;
- }
+ if (contentToAdd.Any())
+ {
+ await Repo.AddRange(contentToAdd);
+ foreach (var c in contentToAdd)
+ {
+ contentProcessed.Add(c.Id, c.Key);
+ }
+ }
- var hasSameKey = await Repo.GetByKey(movie.ratingKey);
- if (hasSameKey != null)
- {
- await Repo.Delete(hasSameKey);
- }
+ retVal.Content = contentProcessed.Values;
+ retVal.Episodes = episodesProcessed;
+ return retVal;
+ }
- Logger.LogDebug("Adding movie {0}", movie.title);
- var guids = new List();
- if (!movie.Guid.Any())
- {
- var metaData = await PlexApi.GetMetadata(servers.PlexAuthToken, servers.FullUri,
- movie.ratingKey);
+ public async Task MovieLoop(PlexServers servers, Mediacontainer content, HashSet contentToAdd,
+ Dictionary contentProcessed)
+ {
+ Logger.LogDebug("Processing Movies");
+ foreach (var movie in content?.Metadata ?? new Metadata[] { })
+ {
+ // Let's check if we have this movie
- 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);
- }
- }
+ 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 providerIds = PlexHelper.GetProviderIdsFromMetadata(guids.ToArray());
+ var hasSameKey = await Repo.GetByKey(movie.ratingKey);
+ if (hasSameKey != null)
+ {
+ await Repo.Delete(hasSameKey);
+ }
- 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(),
- 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())
+ Logger.LogDebug("Adding movie {0}", movie.title);
+ var guids = new List();
+ 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)
{
- item.TvDbId = providerIds.TheTvDb;
+ guids.Add(g.Id);
}
- contentToAdd.Add(item);
}
- catch (Exception e)
+ }
+ else
+ {
+ // Currently a Plex Pass feature only
+ foreach (var g in movie.Guid)
{
- Logger.LogError(LoggingEvents.PlexContentCacher, e, "Exception when adding new Movie {0}",
- movie.title);
+ guids.Add(g.Id);
}
+ }
- if (contentToAdd.Count > 500)
- {
- await Repo.AddRange(contentToAdd);
- foreach (var c in contentToAdd)
- {
- contentProcessed.Add(c.Id, c.Key);
- }
- contentToAdd.Clear();
- }
+ 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(),
+ 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);
@@ -363,22 +385,10 @@ namespace Ombi.Schedule.Jobs.Plex
{
contentProcessed.Add(c.Id, c.Key);
}
- contentToAdd.Clear();
- }
- }
- if (contentToAdd.Any())
- {
- await Repo.AddRange(contentToAdd);
- foreach (var c in contentToAdd)
- {
- contentProcessed.Add(c.Id, c.Key);
+ contentToAdd.Clear();
}
}
-
- retVal.Content = contentProcessed.Values;
- retVal.Episodes = episodesProcessed;
- return retVal;
}
private async Task ProcessTvShow(PlexServers servers, Metadata show, HashSet contentToAdd, Dictionary contentProcessed)