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( @@ -19,5 +19,8 @@ public record MediaItemInfoStream(
string ColorTransfer,
string ColorPrimaries,
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< @@ -65,19 +65,33 @@ public class GetMediaItemInfoHandler : IRequestHandler<GetMediaItemInfo, Either<
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
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));
}
// 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();
return new MediaItemInfo(
@ -116,8 +130,7 @@ public class GetMediaItemInfoHandler : IRequestHandler<GetMediaItemInfo, Either< @@ -116,8 +130,7 @@ public class GetMediaItemInfoHandler : IRequestHandler<GetMediaItemInfo, Either<
mediaStream.ColorTransfer,
mediaStream.ColorPrimaries,
mediaStream.BitsPerRawSample > 0 ? mediaStream.BitsPerRawSample : null,
mediaStream.FileName,
mediaStream.MimeType);
mediaStream.MimeType) { FileName = mediaStream.FileName };
private static MediaItemInfoStream ProjectToStream(Subtitle subtitle) =>
new(
@ -137,8 +150,10 @@ public class GetMediaItemInfoHandler : IRequestHandler<GetMediaItemInfo, Either< @@ -137,8 +150,10 @@ public class GetMediaItemInfoHandler : IRequestHandler<GetMediaItemInfo, Either<
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) =>
new(chapter.Title, chapter.StartTime, chapter.EndTime);

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

@ -263,7 +263,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler<ExtractEmbeddedSu @@ -263,7 +263,7 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler<ExtractEmbeddedSu
.Filter(
s => s.Codec != "hdmv_pgs_subtitle" && s.Codec != "dvd_subtitle" && s.Codec != "dvdsub" &&
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
foreach (Subtitle subtitle in subtitles)
@ -314,8 +314,8 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler<ExtractEmbeddedSu @@ -314,8 +314,8 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler<ExtractEmbeddedSu
subtitle.Subtitle.Path = subtitle.OutputPath;
}
int count = await dbContext.SaveChangesAsync(cancellationToken);
_logger.LogDebug("Successfully extracted {Count} subtitles", count);
await dbContext.SaveChangesAsync(cancellationToken);
_logger.LogDebug("Successfully extracted {Count} subtitles", subtitlesToExtract.Count);
}
else
{
@ -325,6 +325,16 @@ public class ExtractEmbeddedSubtitlesHandler : IRequestHandler<ExtractEmbeddedSu @@ -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) =>
await dbContext.MediaItems
.Include(mi => (mi as Episode).MediaVersions)

Loading…
Cancel
Save