From 393c67213d30f0eabe71e2dfc22a80ee52851ff7 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sat, 8 Oct 2022 19:45:24 -0500 Subject: [PATCH] add stream_seek to music video credits template (#985) --- CHANGELOG.md | 1 + ...etPlayoutItemProcessByChannelNumberHandler.cs | 16 ++++++++++------ .../FFmpeg/FFmpegLibraryProcessService.cs | 15 ++++++++------- .../Interfaces/FFmpeg/IFFmpegProcessService.cs | 2 +- .../FFmpeg/IMusicVideoCreditsGenerator.cs | 2 ++ .../FFmpeg/MusicVideoCreditsGenerator.cs | 4 +++- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c1635b08..be1787ba2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - `artist`: the music videos artist (the parent folder) - `all_artists`: a list of additional artists from the music video's sidecar NFO metadata file - `duration`: the timespan duration of the music video, which can be used to calculate timing of additional subtitles + - `stream_seek`: the timespan that ffmpeg will seek into the media item before beginning playback ## [0.6.8-beta] - 2022-10-05 ### Fixed diff --git a/ErsatzTV.Application/Streaming/Queries/GetPlayoutItemProcessByChannelNumberHandler.cs b/ErsatzTV.Application/Streaming/Queries/GetPlayoutItemProcessByChannelNumberHandler.cs index fa81ea2be..87372bada 100644 --- a/ErsatzTV.Application/Streaming/Queries/GetPlayoutItemProcessByChannelNumberHandler.cs +++ b/ErsatzTV.Application/Streaming/Queries/GetPlayoutItemProcessByChannelNumberHandler.cs @@ -4,6 +4,7 @@ using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain.Filler; using ErsatzTV.Core.Errors; using ErsatzTV.Core.Extensions; +using ErsatzTV.Core.FFmpeg; using ErsatzTV.Core.Interfaces.Emby; using ErsatzTV.Core.Interfaces.FFmpeg; using ErsatzTV.Core.Interfaces.Jellyfin; @@ -164,8 +165,6 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler< .GetValue(ConfigElementKey.FFmpegSaveReports) .Map(result => result.IfNone(false)); - List subtitles = await GetSubtitles(playoutItemWithPath, channel); - Command process = await _ffmpegProcessService.ForPlayoutItem( ffmpegPath, ffprobePath, @@ -175,7 +174,7 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler< audioVersion, videoPath, audioPath, - subtitles, + settings => GetSubtitles(playoutItemWithPath, channel, settings), playoutItemWithPath.PlayoutItem.PreferredAudioLanguageCode ?? channel.PreferredAudioLanguageCode, playoutItemWithPath.PlayoutItem.PreferredAudioTitle ?? channel.PreferredAudioTitle, playoutItemWithPath.PlayoutItem.PreferredSubtitleLanguageCode ?? channel.PreferredSubtitleLanguageCode, @@ -272,7 +271,8 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler< private async Task> GetSubtitles( PlayoutItemWithPath playoutItemWithPath, - Channel channel) + Channel channel, + FFmpegPlaybackSettings settings) { List allSubtitles = playoutItemWithPath.PlayoutItem.MediaItem switch { @@ -282,7 +282,7 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler< Movie movie => await Optional(movie.MovieMetadata).Flatten().HeadOrNone() .Map(mm => mm.Subtitles ?? new List()) .IfNoneAsync(new List()), - MusicVideo musicVideo => await GetMusicVideoSubtitles(musicVideo, channel), + MusicVideo musicVideo => await GetMusicVideoSubtitles(musicVideo, channel, settings), OtherVideo otherVideo => await Optional(otherVideo.OtherVideoMetadata).Flatten().HeadOrNone() .Map(mm => mm.Subtitles ?? new List()) .IfNoneAsync(new List()), @@ -323,7 +323,10 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler< return allSubtitles; } - private async Task> GetMusicVideoSubtitles(MusicVideo musicVideo, Channel channel) + private async Task> GetMusicVideoSubtitles( + MusicVideo musicVideo, + Channel channel, + FFmpegPlaybackSettings settings) { var subtitles = new List(); @@ -337,6 +340,7 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler< await _musicVideoCreditsGenerator.GenerateCreditsSubtitleFromTemplate( musicVideo, channel.FFmpegProfile, + settings, Path.Combine(FileSystemLayout.MusicVideoCreditsTemplatesFolder, fileWithExtension))); } else diff --git a/ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs b/ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs index 63ee27b0e..1ad0c967a 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs @@ -51,7 +51,7 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService MediaVersion audioVersion, string videoPath, string audioPath, - List subtitles, + Func>> getSubtitles, string preferredAudioLanguage, string preferredAudioTitle, string preferredSubtitleLanguage, @@ -80,12 +80,6 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService channel.Number, preferredAudioLanguage, preferredAudioTitle); - Option maybeSubtitle = - await _ffmpegStreamSelector.SelectSubtitleStream( - subtitles, - channel, - preferredSubtitleLanguage, - subtitleMode); FFmpegPlaybackSettings playbackSettings = _playbackSettingsCalculator.CalculateSettings( channel.StreamingMode, @@ -100,6 +94,13 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService hlsRealtime, targetFramerate); + Option maybeSubtitle = + await _ffmpegStreamSelector.SelectSubtitleStream( + await getSubtitles(playbackSettings), + channel, + preferredSubtitleLanguage, + subtitleMode); + Option watermarkOptions = disableWatermarks ? None : await _ffmpegProcessService.GetWatermarkOptions( diff --git a/ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegProcessService.cs b/ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegProcessService.cs index 3b81c9934..5b5837bde 100644 --- a/ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegProcessService.cs +++ b/ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegProcessService.cs @@ -17,7 +17,7 @@ public interface IFFmpegProcessService MediaVersion audioVersion, string videoPath, string audioPath, - List subtitles, + Func>> getSubtitles, string preferredAudioLanguage, string preferredAudioTitle, string preferredSubtitleLanguage, diff --git a/ErsatzTV.Core/Interfaces/FFmpeg/IMusicVideoCreditsGenerator.cs b/ErsatzTV.Core/Interfaces/FFmpeg/IMusicVideoCreditsGenerator.cs index e0a4645d2..ca08ceaa9 100644 --- a/ErsatzTV.Core/Interfaces/FFmpeg/IMusicVideoCreditsGenerator.cs +++ b/ErsatzTV.Core/Interfaces/FFmpeg/IMusicVideoCreditsGenerator.cs @@ -1,4 +1,5 @@ using ErsatzTV.Core.Domain; +using ErsatzTV.Core.FFmpeg; namespace ErsatzTV.Core.Interfaces.FFmpeg; @@ -9,5 +10,6 @@ public interface IMusicVideoCreditsGenerator Task> GenerateCreditsSubtitleFromTemplate( MusicVideo musicVideo, FFmpegProfile ffmpegProfile, + FFmpegPlaybackSettings settings, string templateFileName); } diff --git a/ErsatzTV.Infrastructure/FFmpeg/MusicVideoCreditsGenerator.cs b/ErsatzTV.Infrastructure/FFmpeg/MusicVideoCreditsGenerator.cs index de812613c..2313f351a 100644 --- a/ErsatzTV.Infrastructure/FFmpeg/MusicVideoCreditsGenerator.cs +++ b/ErsatzTV.Infrastructure/FFmpeg/MusicVideoCreditsGenerator.cs @@ -94,6 +94,7 @@ public class MusicVideoCreditsGenerator : IMusicVideoCreditsGenerator public async Task> GenerateCreditsSubtitleFromTemplate( MusicVideo musicVideo, FFmpegProfile ffmpegProfile, + FFmpegPlaybackSettings settings, string templateFileName) { try @@ -119,7 +120,8 @@ public class MusicVideoCreditsGenerator : IMusicVideoCreditsGenerator metadata.ReleaseDate, AllArtists = (metadata.Artists ?? new List()).Map(a => a.Name), Artist = artist, - musicVideo.GetHeadVersion().Duration + musicVideo.GetHeadVersion().Duration, + settings.StreamSeek }); string fileName = _tempFilePool.GetNextTempFile(TempFileCategory.Subtitle);