Browse Source

fix trash display for certain episodes (#1184)

* fix trash display for certain episodes

* fix multi-episode fallback metadata
pull/1185/head
Jason Dove 3 years ago committed by GitHub
parent
commit
581aa51792
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      CHANGELOG.md
  2. 24
      ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs
  3. 2
      ErsatzTV.Core/Domain/MediaItem/Episode.cs
  4. 30
      ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs
  5. 2
      ErsatzTV.Infrastructure/Search/SearchIndex.cs

1
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) - 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 - Fix some transcoding pipelines that use software decoders
- Improve VAAPI encoder capability detection on newer hardware - Improve VAAPI encoder capability detection on newer hardware
- Fix trash page to properly display episodes with missing metadata or titles
### Changed ### Changed
- Plex, Jellyfin and Emby libraries now retrieve all metadata and statistics from the media server - Plex, Jellyfin and Emby libraries now retrieve all metadata and statistics from the media server

24
ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs

@ -71,6 +71,30 @@ public class FallbackMetadataProviderTests
metadata.Head().EpisodeNumber.Should().Be(episode); 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<EpisodeMetadata> metadata = _fallbackMetadataProvider.GetFallbackMetadata(
new Episode
{
LibraryPath = new LibraryPath(),
MediaVersions = new List<MediaVersion>
{
new()
{
MediaFiles = new List<MediaFile>
{
new() { Path = path }
}
}
}
});
metadata.Count.Should().Be(1);
metadata.Head().EpisodeNumber.Should().Be(episode);
}
[Test] [Test]
[TestCase("Awesome Show - s01e02-s01e03.mkv", 1, 2, 3)] [TestCase("Awesome Show - s01e02-s01e03.mkv", 1, 2, 3)]
[TestCase("Awesome Show - s01e02-whatever-s01e03-whatever2.mkv", 1, 2, 3)] [TestCase("Awesome Show - s01e02-whatever-s01e03-whatever2.mkv", 1, 2, 3)]

2
ErsatzTV.Core/Domain/MediaItem/Episode.cs

@ -2,7 +2,7 @@
namespace ErsatzTV.Core.Domain; 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 class Episode : MediaItem
{ {
public int SeasonId { get; set; } public int SeasonId { get; set; }

30
ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs

@ -127,7 +127,7 @@ public class FallbackMetadataProvider : IFallbackMetadataProvider
private List<EpisodeMetadata> GetEpisodeMetadata(string fileName, EpisodeMetadata baseMetadata) private List<EpisodeMetadata> GetEpisodeMetadata(string fileName, EpisodeMetadata baseMetadata)
{ {
var result = new List<EpisodeMetadata>(); var result = new List<EpisodeMetadata> { baseMetadata };
try try
{ {
@ -141,16 +141,24 @@ public class FallbackMetadataProvider : IFallbackMetadataProvider
if (matches.Count > 0) if (matches.Count > 0)
{ {
foreach (Match match in matches) var episodeNumbers = matches.Bind(
{ m => m.Groups[1].Value
string[] split = match.Groups[1].Value.Replace('e', '-').Split('-'); .Replace('e', '-')
foreach (string ep in split) .Split('-')
.Bind(ep => int.TryParse(ep, out int num) ? Some(num) : Option<int>.None))
.ToList();
switch (episodeNumbers.Count)
{ {
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 var metadata = new EpisodeMetadata
{ {
MetadataKind = MetadataKind.Fallback, MetadataKind = MetadataKind.Fallback,
@ -170,9 +178,9 @@ public class FallbackMetadataProvider : IFallbackMetadataProvider
result.Add(metadata); result.Add(metadata);
} }
}
return result; break;
}
} }
} }
catch (Exception ex) catch (Exception ex)

2
ErsatzTV.Infrastructure/Search/SearchIndex.cs

@ -1206,7 +1206,7 @@ public sealed class SearchIndex : ISearchIndex
}; };
private static string Title(Metadata metadata) => private static string Title(Metadata metadata) =>
metadata.Title.Replace(' ', '_'); (metadata.Title ?? string.Empty).Replace(' ', '_');
private static string GetJumpLetter(Metadata metadata) private static string GetJumpLetter(Metadata metadata)
{ {

Loading…
Cancel
Save