8000 Detect reidentified content in Emby and Jellyfin by sephrat · Pull Request #4626 · Ombi-app/Ombi · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Detect reidentified content in Emby and Jellyfin #4626

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 27, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 40 additions & 15 deletions src/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -157,9 +157,20 @@ private async Task ProcessTv(EmbyServers server, bool recentlyAdded, string pare
}

var existingTv = await _repo.GetByEmbyId(tvShow.Id);

if (existingTv != null &&
( existingTv.ImdbId != tvShow.ProviderIds?.Imdb
|| existingTv.TheMovieDbId != tvShow.ProviderIds?.Tmdb
|| existingTv.TvDbId != tvShow.ProviderIds?.Tvdb))
{
_logger.LogDebug($"Series '{tvShow.Name}' has different IDs, probably a reidentification.");
await _repo.DeleteTv(existingTv);
existingTv = null;
}

if (existingTv == null)
{
_logger.LogDebug("Adding new TV Show {0}", tvShow.Name);
_logger.LogDebug("Adding TV Show {0}", tvShow.Name);
mediaToAdd.Add(new EmbyContent
{
TvDbId = tvShow.ProviderIds?.Tvdb,
Expand Down Expand Up @@ -265,23 +276,21 @@ private async Task ProcessMovies(EmbyMovie movieInfo, ICollection<EmbyContent> c
return;
}
_logger.LogDebug($"Adding new movie {movieInfo.Name}");

content.Add(new EmbyContent
{
ImdbId = movieInfo.ProviderIds.Imdb,
TheMovieDbId = movieInfo.ProviderIds?.Tmdb,
Title = movieInfo.Name,
Type = MediaType.Movie,
EmbyId = movieInfo.Id,
Url = EmbyHelper.GetEmbyMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname),
AddedAt = DateTime.UtcNow,
Quality = has4K ? null : quality,
Has4K = has4K
});
var newMovie = new EmbyContent();
newMovie.AddedAt = DateTime.UtcNow;
MapEmbyContent(newMovie, movieInfo, server, has4K, quality);
content.Add(newMovie);
}
else
{
if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase))
var movieHasChanged = false;
if (existingMovie.ImdbId != movieInfo.ProviderIds.Imdb || existingMovie.TheMovieDbId != movieInfo.ProviderIds.Tmdb)
{
_logger.LogDebug($"Updating existing movie '{movieInfo.Name}'");
MapEmbyContent(existingMovie, movieInfo, server, has4K, quality);
movieHasChanged = true;
}
else if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase))
{
_logger.LogDebug($"We have found another quality for Movie '{movieInfo.Name}', Quality: '{quality}'");
existingMovie.Quality = has4K ? null : quality;
Expand All @@ -290,6 +299,11 @@ private async Task ProcessMovies(EmbyMovie movieInfo, ICollection<EmbyContent> c
// Probably could refactor here
// If a 4k movie comes in (we don't store the quality on 4k)
// it will always get updated even know it's not changed
movieHasChanged = true;
}

if (movieHasChanged)
{
toUpdate.Add(existingMovie);
}
else
Expand All @@ -300,6 +314,17 @@ private async Task ProcessMovies(EmbyMovie movieInfo, ICollection<EmbyContent> c
}
}

private void MapEmbyContent(EmbyContent content, EmbyMovie movieInfo, EmbyServers server, bool has4K, string quality){
content.ImdbId = movieInfo.ProviderIds.Imdb;
content.TheMovieDbId = movieInfo.ProviderIds?.Tmdb;
content.Title = movieInfo.Name;
content.Type = MediaType.Movie;
content.EmbyId = movieInfo.Id;
content.Url = EmbyHelper.GetEmbyMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname);
content.Quality = has4K ? null : quality;
content.Has4K = has4K;
}

private bool ValidateSettings(EmbyServers server)
{
if (server?.Ip == null || string.IsNullOrEmpty(server?.ApiKey))
Expand Down
56 changes: 42 additions & 14 deletions src/Ombi.Schedule/Jobs/Jellyfin/JellyfinContentSync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,20 @@ private async Task ProcessTv(JellyfinServers server, string parentId = default)
}

var existingTv = await _repo.GetByJellyfinId(tvShow.Id);

if (existingTv != null &&
( existingTv.ImdbId != tvShow.ProviderIds?.Imdb
|| existingTv.TheMovieDbId != tvShow.ProviderIds?.Tmdb
|| existingTv.TvDbId != tvShow.ProviderIds?.Tvdb))
{
_logger.LogDebug($"Series '{tvShow.Name}' has different IDs, probably a reidentification.");
await _repo.DeleteTv(existingTv);
existingTv = null;
}

if (existingTv == null)
{
_logger.LogDebug("Adding new TV Show {0}", tvShow.Name);
_logger.LogDebug("Adding TV Show {0}", tvShow.Name);
mediaToAdd.Add(new JellyfinContent
{
TvDbId = tvShow.ProviderIds?.Tvdb,
Expand Down Expand Up @@ -230,22 +241,21 @@ private async Task ProcessMovies(JellyfinMovie movieInfo, ICollection<JellyfinCo
return;
}
_logger.LogDebug($"Adding new movie {movieInfo.Name}");
content.Add(new JellyfinContent
{
ImdbId = movieInfo.ProviderIds.Imdb,
TheMovieDbId = movieInfo.ProviderIds?.Tmdb,
Title = movieInfo.Name,
Type = MediaType.Movie,
JellyfinId = movieInfo.Id,
Url = JellyfinHelper.GetJellyfinMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname),
AddedAt = DateTime.UtcNow,
Quality = has4K ? null : quality,
Has4K = has4K
});
var newMovie = new JellyfinContent();
newMovie.AddedAt = DateTime.UtcNow;
MapJellyfinMovie(newMovie, movieInfo, server, has4K, quality);
content.Add(newMovie);;
}
else
{
if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase))
var movieHasChanged = false;
if (existingMovie.ImdbId != movieInfo.ProviderIds.Imdb || existingMovie.TheMovieDbId != movieInfo.ProviderIds.Tmdb)
{
_logger.LogDebug($"Updating existing movie '{movieInfo.Name}'");
MapJellyfinMovie(existingMovie, movieInfo, server, has4K, quality);
movieHasChanged = true;
}
else if (!quality.Equals(existingMovie?.Quality, StringComparison.InvariantCultureIgnoreCase))
{
_logger.LogDebug($"We have found another quality for Movie '{movieInfo.Name}', Quality: '{quality}'");
existingMovie.Quality = has4K ? null : quality;
Expand All @@ -255,6 +265,12 @@ private async Task ProcessMovies(JellyfinMovie movieInfo, ICollection<JellyfinCo
// If a 4k movie comes in (we don't store the quality on 4k)
// it will always get updated even know it's not changed
toUpdate.Add(existingMovie);
movieHasChanged = true;
}

if (movieHasChanged)
{
toUpdate.Add(existingMovie);
}
else
{
Expand All @@ -264,6 +280,18 @@ private async Task ProcessMovies(JellyfinMovie movieInfo, ICollection<JellyfinCo
}
}

private void MapJellyfinMovie(JellyfinContent content, JellyfinMovie movieInfo, JellyfinServers server, bool has4K, string quality)
{
content.ImdbId = movieInfo.ProviderIds.Imdb;
content.TheMovieDbId = movieInfo.ProviderIds?.Tmdb;
content.Title = movieInfo.Name;
content.Type = MediaType.Movie;
content.JellyfinId = movieInfo.Id;
content.Url = JellyfinHelper.GetJellyfinMediaUrl(movieInfo.Id, server?.ServerId, server.ServerHostname);
content.Quality = has4K ? null : quality;
content.Has4K = has4K;
}

private bool ValidateSettings(JellyfinServers server)
{
if (server?.Ip == null || string.IsNullOrEmpty(server?.ApiKey))
Expand Down
7 changes: 7 additions & 0 deletions src/Ombi.Store/Repository/EmbyContentRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,13 @@ public override Task UpdateRange(IEnumerable<IMediaServerContent> existingConten
return InternalSaveChanges();
}

public override async Task DeleteTv(EmbyContent tv)
{
var episodesToDelete = GetAllEpisodes().Cast<EmbyEpisode>().Where(x => x.ParentId == tv.EmbyId).ToList();
Db.EmbyEpisode.RemoveRange(episodesToDelete);
await Delete(tv);
}

public override RecentlyAddedType RecentlyAddedType => RecentlyAddedType.Emby;
}
}
1 change: 1 addition & 0 deletions src/Ombi.Store/Repository/IMediaServerContentRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public interface IMediaServerContentRepository<Content> : IExternalRepository<Co
IQueryable<IMediaServerEpisode> GetAllEpisodes();
Task<IMediaServerEpisode> Add(IMediaServerEpisode content);
Task AddRange(IEnumerable<IMediaServerEpisode> content);
Task DeleteTv(Content tv);
void UpdateWithoutSave(IMediaServerContent existingContent);
}
}
7 changes: 7 additions & 0 deletions src/Ombi.Store/Repository/JellyfinContentRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ public override Task UpdateRange(IEnumerable<IMediaServerContent> existingConten
return InternalSaveChanges();
}

public override async Task DeleteTv(JellyfinContent tv)
{
var episodesToDelete = GetAllEpisodes().Cast<JellyfinEpisode>().Where(x => x.ParentId == tv.JellyfinId).ToList();
Db.JellyfinEpisode.RemoveRange(episodesToDelete);
await Delete(tv);
}

public override RecentlyAddedType RecentlyAddedType => RecentlyAddedType.Jellyfin;
}
}
1 change: 1 addition & 0 deletions src/Ombi.Store/Repository/MediaServerRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ public MediaServerContentRepository(ExternalContext db) : base(db)
public abstract Task AddRange(IEnumerable<IMediaServerEpisode> content);
public abstract void UpdateWithoutSave(IMediaServerContent existingContent);
public abstract Task UpdateRange(IEnumerable<IMediaServerContent> existingContent);
public abstract Task DeleteTv(T tv);
}
}
7 changes: 7 additions & 0 deletions src/Ombi.Store/Repository/PlexContentRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,5 +169,12 @@ public override Task UpdateRange(IEnumerable<IMediaServerContent> existingConten
Db.PlexServerContent.UpdateRange((IEnumerable<PlexServerContent>)existingContent);
return InternalSaveChanges();
}

public override Task DeleteTv(PlexServerContent tv)
{
// not used for now
// TODO: delete episodes, then delete series
throw new NotImplementedException();
}
}
}
0