From 581aa517921717eb8c100f496df20e1b8b33a021 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Tue, 28 Feb 2023 09:37:30 -0600 Subject: [PATCH] fix trash display for certain episodes (#1184) * fix trash display for certain episodes * fix multi-episode fallback metadata --- CHANGELOG.md | 1 + .../Metadata/FallbackMetadataProviderTests.cs | 24 +++++++ ErsatzTV.Core/Domain/MediaItem/Episode.cs | 2 +- .../Metadata/FallbackMetadataProvider.cs | 64 +++++++++++-------- ErsatzTV.Infrastructure/Search/SearchIndex.cs | 2 +- 5 files changed, 63 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b98ddc678..8f6e63e13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Align default docker image (no acceleration) with new images from [ErsatzTV-ffmpeg](https://github.com/jasongdove/ErsatzTV-ffmpeg) - Fix some transcoding pipelines that use software decoders - Improve VAAPI encoder capability detection on newer hardware +- Fix trash page to properly display episodes with missing metadata or titles ### Changed - Plex, Jellyfin and Emby libraries now retrieve all metadata and statistics from the media server diff --git a/ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs b/ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs index 59535bac0..a9f685769 100644 --- a/ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs +++ b/ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs @@ -70,6 +70,30 @@ public class FallbackMetadataProviderTests // metadata.Season.Should().Be(season); metadata.Head().EpisodeNumber.Should().Be(episode); } + + [TestCase("Awesome Show - S01_BLAH.mkv", 0)] + [TestCase("Awesome Show - NO_EPISODE_NUMBER_HERE.mkv", 0)] + public void GetFallbackMetadata_ShouldHandleNonEpisodes(string path, int episode) + { + List metadata = _fallbackMetadataProvider.GetFallbackMetadata( + new Episode + { + LibraryPath = new LibraryPath(), + MediaVersions = new List + { + new() + { + MediaFiles = new List + { + new() { Path = path } + } + } + } + }); + + metadata.Count.Should().Be(1); + metadata.Head().EpisodeNumber.Should().Be(episode); + } [Test] [TestCase("Awesome Show - s01e02-s01e03.mkv", 1, 2, 3)] diff --git a/ErsatzTV.Core/Domain/MediaItem/Episode.cs b/ErsatzTV.Core/Domain/MediaItem/Episode.cs index 32e240e4f..5337f83f3 100644 --- a/ErsatzTV.Core/Domain/MediaItem/Episode.cs +++ b/ErsatzTV.Core/Domain/MediaItem/Episode.cs @@ -2,7 +2,7 @@ namespace ErsatzTV.Core.Domain; -[DebuggerDisplay("{EpisodeMetadata[0].Title ?? \"[unknown episode]\"}")] +[DebuggerDisplay("{EpisodeMetadata != null && EpisodeMetadata.Count > 0 ? EpisodeMetadata[0].Title : \"[unknown episode]\"}")] public class Episode : MediaItem { public int SeasonId { get; set; } diff --git a/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs b/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs index 55120cbc1..27db0c1eb 100644 --- a/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs +++ b/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs @@ -127,7 +127,7 @@ public class FallbackMetadataProvider : IFallbackMetadataProvider private List GetEpisodeMetadata(string fileName, EpisodeMetadata baseMetadata) { - var result = new List(); + var result = new List { baseMetadata }; try { @@ -141,38 +141,46 @@ public class FallbackMetadataProvider : IFallbackMetadataProvider if (matches.Count > 0) { - foreach (Match match in matches) + var episodeNumbers = matches.Bind( + m => m.Groups[1].Value + .Replace('e', '-') + .Split('-') + .Bind(ep => int.TryParse(ep, out int num) ? Some(num) : Option.None)) + .ToList(); + + switch (episodeNumbers.Count) { - string[] split = match.Groups[1].Value.Replace('e', '-').Split('-'); - foreach (string ep in split) - { - if (!int.TryParse(ep, out int episodeNumber)) + case 0: + break; + case 1: + baseMetadata.EpisodeNumber = episodeNumbers.Head(); + break; + default: + result.Clear(); + foreach (int episodeNumber in episodeNumbers) { - continue; + var metadata = new EpisodeMetadata + { + MetadataKind = MetadataKind.Fallback, + EpisodeNumber = episodeNumber, + DateAdded = baseMetadata.DateAdded, + DateUpdated = baseMetadata.DateAdded, + Title = baseMetadata.Title, + Actors = new List(), + Artwork = new List(), + Directors = new List(), + Genres = new List(), + Guids = new List(), + Studios = new List(), + Tags = new List(), + Writers = new List() + }; + + result.Add(metadata); } - var metadata = new EpisodeMetadata - { - MetadataKind = MetadataKind.Fallback, - EpisodeNumber = episodeNumber, - DateAdded = baseMetadata.DateAdded, - DateUpdated = baseMetadata.DateAdded, - Title = baseMetadata.Title, - Actors = new List(), - Artwork = new List(), - Directors = new List(), - Genres = new List(), - Guids = new List(), - Studios = new List(), - Tags = new List(), - Writers = new List() - }; - - result.Add(metadata); - } + break; } - - return result; } } catch (Exception ex) diff --git a/ErsatzTV.Infrastructure/Search/SearchIndex.cs b/ErsatzTV.Infrastructure/Search/SearchIndex.cs index a15d32832..b7f63caac 100644 --- a/ErsatzTV.Infrastructure/Search/SearchIndex.cs +++ b/ErsatzTV.Infrastructure/Search/SearchIndex.cs @@ -1206,7 +1206,7 @@ public sealed class SearchIndex : ISearchIndex }; private static string Title(Metadata metadata) => - metadata.Title.Replace(' ', '_'); + (metadata.Title ?? string.Empty).Replace(' ', '_'); private static string GetJumpLetter(Metadata metadata) {