From b00a25bbee9377611051d88f64dea803415159c0 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Sun, 10 Sep 2023 19:46:51 -0500 Subject: [PATCH] fix parsing show title from nfo (#1426) --- CHANGELOG.md | 1 + .../Fakes/FakeTelevisionRepository.cs | 2 +- .../Repositories/ITelevisionRepository.cs | 2 +- .../Data/Repositories/TelevisionRepository.cs | 21 ++++++++++++++++++- .../Core/Metadata/Nfo/ShowNfoReaderTests.cs | 19 +++++++++++++++++ .../Core/Metadata/Nfo/ShowNfoReader.cs | 8 ++++++- .../Core/Metadata/TelevisionFolderScanner.cs | 2 +- 7 files changed, 50 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 298c65934..3cd0d60df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Clean channel guide cache on startup (delete channels that no longer exist) - Fix Emby movie libraries so local file access is not required - Fix adding alternate schedule +- Fix parsing show title from NFO file that also contains season information ### Changed - Optimize transcoding session to only work ahead (at max speed) for 3 minutes before throttling to realtime diff --git a/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs b/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs index 6837beffd..8ed2023ac 100644 --- a/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs +++ b/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs @@ -38,7 +38,7 @@ public class FakeTelevisionRepository : ITelevisionRepository public Task> GetPagedEpisodes(int seasonId, int pageNumber, int pageSize) => throw new NotSupportedException(); - public Task> GetShowByMetadata(int libraryPathId, ShowMetadata metadata) => + public Task> GetShowByMetadata(int libraryPathId, ShowMetadata metadata, string showName) => throw new NotSupportedException(); public Task>> AddShow(int libraryPathId, ShowMetadata metadata) => diff --git a/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs index 4e67db801..3df27f7b9 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs @@ -21,7 +21,7 @@ public interface ITelevisionRepository Task> GetSeasonItems(int seasonId); Task GetEpisodeCount(int seasonId); Task> GetPagedEpisodes(int seasonId, int pageNumber, int pageSize); - Task> GetShowByMetadata(int libraryPathId, ShowMetadata metadata); + Task> GetShowByMetadata(int libraryPathId, ShowMetadata metadata, string showFolder); Task>> AddShow(int libraryPathId, ShowMetadata metadata); Task> GetOrAddSeason(Show show, int libraryPathId, int seasonNumber); Task> GetOrAddEpisode(Season season, LibraryPath libraryPath, string path); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs index fb6ae386f..f861019f7 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs @@ -228,7 +228,7 @@ public class TelevisionRepository : ITelevisionRepository .ToListAsync(); } - public async Task> GetShowByMetadata(int libraryPathId, ShowMetadata metadata) + public async Task> GetShowByMetadata(int libraryPathId, ShowMetadata metadata, string showFolder) { await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(); Option maybeId = await dbContext.ShowMetadata @@ -238,6 +238,25 @@ public class TelevisionRepository : ITelevisionRepository .Map(Optional) .MapT(sm => sm.ShowId); + if (maybeId.IsNone) + { + List maybeShowIds = await dbContext.Episodes + .Where( + e => e.MediaVersions.Any( + mv => mv.MediaFiles.Any( + mf => EF.Functions.Like( + EF.Functions.Collate(mf.Path, TvContext.CaseInsensitiveCollation), + $"{showFolder}%")))) + .Map(e => e.Season.ShowId) + .Distinct() + .ToListAsync(); + + if (maybeShowIds.Count == 1) + { + maybeId = maybeShowIds.HeadOrNone(); + } + } + return await maybeId.Match( id => { diff --git a/ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/ShowNfoReaderTests.cs b/ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/ShowNfoReaderTests.cs index 80cf26db1..32ec119fe 100644 --- a/ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/ShowNfoReaderTests.cs +++ b/ErsatzTV.Scanner.Tests/Core/Metadata/Nfo/ShowNfoReaderTests.cs @@ -58,6 +58,7 @@ https://www.themoviedb.org/movie/11-star-wars")); [Test] public async Task FullSample_Should_Return_Nfo() { + // nested "title" in "seasondetails" may cause the last encountered title to be used for the show await using var stream = new MemoryStream( Encoding.UTF8.GetBytes( @" @@ -132,6 +133,24 @@ https://www.themoviedb.org/movie/11-star-wars")); 0.000000 2021-03-12 06:15:51 + + + -1 + * All Seasons + false + + + 1 + 1824025 + false + + + 2 + Season 02 + 1993428 + false + + ")); Either result = await _showNfoReader.Read(stream); diff --git a/ErsatzTV.Scanner/Core/Metadata/Nfo/ShowNfoReader.cs b/ErsatzTV.Scanner/Core/Metadata/Nfo/ShowNfoReader.cs index dddca3e2d..9b4372182 100644 --- a/ErsatzTV.Scanner/Core/Metadata/Nfo/ShowNfoReader.cs +++ b/ErsatzTV.Scanner/Core/Metadata/Nfo/ShowNfoReader.cs @@ -41,6 +41,7 @@ public class ShowNfoReader : NfoReader, IShowNfoReader var settings = new XmlReaderSettings { Async = true, ConformanceLevel = ConformanceLevel.Fragment }; using var reader = XmlReader.Create(input, settings); var done = false; + int showDepth = 0; while (!done && await reader.ReadAsync()) { @@ -51,9 +52,14 @@ public class ShowNfoReader : NfoReader, IShowNfoReader { case "tvshow": nfo = new ShowNfo(); + showDepth = reader.Depth; break; case "title": - await ReadStringContent(reader, nfo, (show, title) => show.Title = title); + if (reader.Depth == showDepth + 1) + { + await ReadStringContent(reader, nfo, (show, title) => show.Title = title); + } + break; case "year": await ReadIntContent(reader, nfo, (show, year) => show.Year = year); diff --git a/ErsatzTV.Scanner/Core/Metadata/TelevisionFolderScanner.cs b/ErsatzTV.Scanner/Core/Metadata/TelevisionFolderScanner.cs index 818c787b1..c48067da1 100644 --- a/ErsatzTV.Scanner/Core/Metadata/TelevisionFolderScanner.cs +++ b/ErsatzTV.Scanner/Core/Metadata/TelevisionFolderScanner.cs @@ -194,7 +194,7 @@ public class TelevisionFolderScanner : LocalFolderScanner, ITelevisionFolderScan string showFolder) { ShowMetadata metadata = await _localMetadataProvider.GetMetadataForShow(showFolder); - Option maybeShow = await _televisionRepository.GetShowByMetadata(libraryPathId, metadata); + Option maybeShow = await _televisionRepository.GetShowByMetadata(libraryPathId, metadata, showFolder); foreach (Show show in maybeShow) {