|
|
@ -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(); |
|
|
|
|
|
|
|
|
|
|
|
// include external subtitles from local libraries
|
|
|
|
|
|
|
|
if (mediaItem.LibraryPath.Library is LocalLibrary) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
List<Subtitle> subtitles = mediaItem switch |
|
|
|
List<Subtitle> subtitles = mediaItem switch |
|
|
|
{ |
|
|
|
{ |
|
|
|
Movie m => m.MovieMetadata.Map(mm => mm.Subtitles).Flatten().ToList(), |
|
|
|
Movie m => m.MovieMetadata.Map(mm => mm.Subtitles).Flatten().ToList(), |
|
|
|
Episode e => e.EpisodeMetadata.Map(mm => mm.Subtitles).Flatten().ToList(), |
|
|
|
Episode e => e.EpisodeMetadata.Map(mm => mm.Subtitles).Flatten().ToList(), |
|
|
|
_ => new List<Subtitle>() |
|
|
|
_ => [] |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// include external subtitles from local libraries
|
|
|
|
|
|
|
|
if (mediaItem.LibraryPath.Library is LocalLibrary) |
|
|
|
|
|
|
|
{ |
|
|
|
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); |
|
|
|