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. 64
      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/). @@ -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

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

@ -70,6 +70,30 @@ public class FallbackMetadataProviderTests @@ -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<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]
[TestCase("Awesome Show - s01e02-s01e03.mkv", 1, 2, 3)]

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

@ -2,7 +2,7 @@ @@ -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; }

64
ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs

@ -127,7 +127,7 @@ public class FallbackMetadataProvider : IFallbackMetadataProvider @@ -127,7 +127,7 @@ public class FallbackMetadataProvider : IFallbackMetadataProvider
private List<EpisodeMetadata> GetEpisodeMetadata(string fileName, EpisodeMetadata baseMetadata)
{
var result = new List<EpisodeMetadata>();
var result = new List<EpisodeMetadata> { baseMetadata };
try
{
@ -141,38 +141,46 @@ public class FallbackMetadataProvider : IFallbackMetadataProvider @@ -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<int>.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<Actor>(),
Artwork = new List<Artwork>(),
Directors = new List<Director>(),
Genres = new List<Genre>(),
Guids = new List<MetadataGuid>(),
Studios = new List<Studio>(),
Tags = new List<Tag>(),
Writers = new List<Writer>()
};
result.Add(metadata);
}
var metadata = new EpisodeMetadata
{
MetadataKind = MetadataKind.Fallback,
EpisodeNumber = episodeNumber,
DateAdded = baseMetadata.DateAdded,
DateUpdated = baseMetadata.DateAdded,
Title = baseMetadata.Title,
Actors = new List<Actor>(),
Artwork = new List<Artwork>(),
Directors = new List<Director>(),
Genres = new List<Genre>(),
Guids = new List<MetadataGuid>(),
Studios = new List<Studio>(),
Tags = new List<Tag>(),
Writers = new List<Writer>()
};
result.Add(metadata);
}
break;
}
return result;
}
}
catch (Exception ex)

2
ErsatzTV.Infrastructure/Search/SearchIndex.cs

@ -1206,7 +1206,7 @@ public sealed class SearchIndex : ISearchIndex @@ -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)
{

Loading…
Cancel
Save