Browse Source

tweak subtitle display in media info (#1589)

pull/1590/head
Jason Dove 1 year ago committed by GitHub
parent
commit
82bfa8019e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 7
      ErsatzTV.Application/MediaItems/MediaItemInfoStream.cs
  2. 37
      ErsatzTV.Application/MediaItems/Queries/GetMediaItemInfoHandler.cs
  3. 16
      ErsatzTV.Application/Subtitles/Commands/ExtractEmbeddedSubtitlesHandler.cs

7
ErsatzTV.Application/MediaItems/MediaItemInfoStream.cs

@ -19,5 +19,8 @@ public record MediaItemInfoStream(
string ColorTransfer, string ColorTransfer,
string ColorPrimaries, string ColorPrimaries,
int? BitsPerRawSample, int? BitsPerRawSample,
string FileName, string MimeType)
string MimeType); {
public string FileName { get; set; }
public bool? IsExtracted { get; set; }
}

37
ErsatzTV.Application/MediaItems/Queries/GetMediaItemInfoHandler.cs

@ -65,19 +65,33 @@ public class GetMediaItemInfoHandler : IRequestHandler<GetMediaItemInfo, Either<
var allStreams = version.Streams.OrderBy(s => s.Index).Map(Project).ToList(); var allStreams = version.Streams.OrderBy(s => s.Index).Map(Project).ToList();
List<Subtitle> subtitles = mediaItem switch
{
Movie m => m.MovieMetadata.Map(mm => mm.Subtitles).Flatten().ToList(),
Episode e => e.EpisodeMetadata.Map(mm => mm.Subtitles).Flatten().ToList(),
_ => []
};
// include external subtitles from local libraries // include external subtitles from local libraries
if (mediaItem.LibraryPath.Library is LocalLibrary) if (mediaItem.LibraryPath.Library is LocalLibrary)
{ {
List<Subtitle> subtitles = mediaItem switch
{
Movie m => m.MovieMetadata.Map(mm => mm.Subtitles).Flatten().ToList(),
Episode e => e.EpisodeMetadata.Map(mm => mm.Subtitles).Flatten().ToList(),
_ => new List<Subtitle>()
};
allStreams.AddRange(subtitles.Filter(s => s.SubtitleKind is SubtitleKind.Sidecar).Map(ProjectToStream)); allStreams.AddRange(subtitles.Filter(s => s.SubtitleKind is SubtitleKind.Sidecar).Map(ProjectToStream));
} }
// set extracted status and file name on each subtitle stream
foreach (MediaItemInfoStream subtitleStream in allStreams.Filter(s => s.Kind is MediaStreamKind.Subtitle))
{
foreach (Subtitle subtitle in subtitles.Filter(s => s.StreamIndex == subtitleStream.Index).HeadOrNone())
{
if (!subtitle.IsImage)
{
subtitleStream.IsExtracted = subtitle.IsExtracted;
}
subtitleStream.FileName = string.IsNullOrWhiteSpace(subtitle.Path) ? null : subtitle.Path;
}
}
var allChapters = (version.Chapters ?? []).OrderBy(c => c.StartTime).Map(Project).ToList(); var allChapters = (version.Chapters ?? []).OrderBy(c => c.StartTime).Map(Project).ToList();
return new MediaItemInfo( return new MediaItemInfo(
@ -116,8 +130,7 @@ public class GetMediaItemInfoHandler : IRequestHandler<GetMediaItemInfo, Either<
mediaStream.ColorTransfer, mediaStream.ColorTransfer,
mediaStream.ColorPrimaries, mediaStream.ColorPrimaries,
mediaStream.BitsPerRawSample > 0 ? mediaStream.BitsPerRawSample : null, mediaStream.BitsPerRawSample > 0 ? mediaStream.BitsPerRawSample : null,
mediaStream.FileName, mediaStream.MimeType) { FileName = mediaStream.FileName };
mediaStream.MimeType);
private static MediaItemInfoStream ProjectToStream(Subtitle subtitle) => private static MediaItemInfoStream ProjectToStream(Subtitle subtitle) =>
new( new(
@ -137,8 +150,10 @@ public class GetMediaItemInfoHandler : IRequestHandler<GetMediaItemInfo, Either<
null, null,
null, null,
null, null,
string.IsNullOrWhiteSpace(subtitle.Path) ? null : Path.GetFileName(subtitle.Path), null)
null); {
FileName = string.IsNullOrWhiteSpace(subtitle.Path) ? null : Path.GetFileName(subtitle.Path)
};
private static MediaItemInfoChapter Project(MediaChapter chapter) => private static MediaItemInfoChapter Project(MediaChapter chapter) =>
new(chapter.Title, chapter.StartTime, chapter.EndTime); new(chapter.Title, chapter.StartTime, chapter.EndTime);

16
ErsatzTV.Application/Subtitles/Commands/ExtractEmbeddedSubtitlesHandler.cs

@ -263,7 +263,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler<ExtractEmbeddedSu
.Filter( .Filter(
s => s.Codec != "hdmv_pgs_subtitle" && s.Codec != "dvd_subtitle" && s.Codec != "dvdsub" && s => s.Codec != "hdmv_pgs_subtitle" && s.Codec != "dvd_subtitle" && s.Codec != "dvdsub" &&
s.Codec != "vobsub" && s.Codec != "pgssub" && s.Codec != "pgs") s.Codec != "vobsub" && s.Codec != "pgssub" && s.Codec != "pgs")
.Filter(s => s.IsExtracted == false || string.IsNullOrWhiteSpace(s.Path)); .Filter(s => s.IsExtracted == false || string.IsNullOrWhiteSpace(s.Path) || FileDoesntExist(mediaItem.Id, s));
// find cache paths for each subtitle // find cache paths for each subtitle
foreach (Subtitle subtitle in subtitles) foreach (Subtitle subtitle in subtitles)
@ -314,8 +314,8 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler<ExtractEmbeddedSu
subtitle.Subtitle.Path = subtitle.OutputPath; subtitle.Subtitle.Path = subtitle.OutputPath;
} }
int count = await dbContext.SaveChangesAsync(cancellationToken); await dbContext.SaveChangesAsync(cancellationToken);
_logger.LogDebug("Successfully extracted {Count} subtitles", count); _logger.LogDebug("Successfully extracted {Count} subtitles", subtitlesToExtract.Count);
} }
else else
{ {
@ -325,6 +325,16 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler<ExtractEmbeddedSu
} }
} }
private bool FileDoesntExist(int mediaItemId, Subtitle subtitle)
{
foreach (string path in GetRelativeOutputPath(mediaItemId, subtitle))
{
return _localFileSystem.FileExists(path) == false;
}
return false;
}
private static async Task<Option<MediaItem>> GetMediaItem(TvContext dbContext, int mediaItemId) => private static async Task<Option<MediaItem>> GetMediaItem(TvContext dbContext, int mediaItemId) =>
await dbContext.MediaItems await dbContext.MediaItems
.Include(mi => (mi as Episode).MediaVersions) .Include(mi => (mi as Episode).MediaVersions)

Loading…
Cancel
Save