From fb3ec5f67eca05f18aaee2f82b7c2a5fcf55f024 Mon Sep 17 00:00:00 2001 From: Rohit Date: Sat, 30 Dec 2023 15:52:28 +0530 Subject: [PATCH] Fix embedding of lyrics in audio files --- yt_dlp/postprocessor/embedthumbnail.py | 4 ++- yt_dlp/postprocessor/ffmpeg.py | 37 +++++++++++++------------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/yt_dlp/postprocessor/embedthumbnail.py b/yt_dlp/postprocessor/embedthumbnail.py index 5fd92fd34..a1a21c368 100644 --- a/yt_dlp/postprocessor/embedthumbnail.py +++ b/yt_dlp/postprocessor/embedthumbnail.py @@ -107,8 +107,10 @@ def run(self, info): except Exception as err: self.report_warning(f'unable to embed using mutagen; {err}') success = False - # Method 2: Use ffmpeg else: + success = False + # Method 2: Use ffmpeg + if not success: options = [ '-c', 'copy', '-map', '0:0', '-map', '1:0', '-write_id3v1', '1', '-id3v2_version', '3', '-metadata:s:v', 'title="Album cover"', '-metadata:s:v', 'comment=Cover (front)'] diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index e69ec670e..1219369e9 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -587,8 +587,8 @@ def _options(target_ext): class FFmpegEmbedSubtitlePP(FFmpegPostProcessor): - AUDIO_EXTS = ('mp3', 'm4a', 'flac', 'opus') - SUPPORTED_EXTS = ('mp4', 'mov', 'm4a', 'webm', 'mkv', 'mka') + SUPPORTS_LYRICS = ('mp3', 'm4a', 'flac', 'opus') + SUPPORTED_EXTS = ('mp4', 'mov', 'm4a', 'webm', 'mkv', 'mka', *SUPPORTS_LYRICS) def __init__(self, downloader=None, already_have_subtitle=False): super().__init__(downloader) @@ -596,8 +596,8 @@ def __init__(self, downloader=None, already_have_subtitle=False): @PostProcessor._restrict_to(images=False) def run(self, info): - if info['ext'] not in self.SUPPORTED_EXTS + self.AUDIO_EXTS: - self.to_screen(f'Subtitles can only be embedded in {", ".join(self.SUPPORTED_EXTS+self.AUDIO_EXTS)} files') + if info['ext'] not in self.SUPPORTED_EXTS: + self.to_screen(f'Subtitles can only be embedded in {", ".join(self.SUPPORTED_EXTS)} files') return [], info subtitles = info.get('requested_subtitles') if not subtitles: @@ -661,8 +661,8 @@ def run(self, info): temp_filename = prepend_extension(filename, 'temp') self.to_screen('Embedding subtitles in "%s"' % filename) - if info['ext'] in self.AUDIO_EXTS: - self.embed_lyrics(input_files) + if info['ext'] in self.SUPPORTS_LYRICS: + self.embed_lyrics(info['filepath'],sub_dict=info['requested_subtitles']) else: self.run_ffmpeg_multiple_files(input_files, temp_filename, opts) os.replace(temp_filename, filename) @@ -670,23 +670,24 @@ def run(self, info): files_to_delete = [] if self._already_have_subtitle else sub_filenames return files_to_delete, info - def embed_lyrics(self, input_files): - audio_file = input_files[0] - subs = input_files[1] - if len(input_files) > 2: - self.report_warning('More than one subtitle file found. Only one will be embedded') - if not subs.endswith('.lrc'): + def embed_lyrics(self, audio_file,sub_dict): + if len(sub_dict) > 1: + self.report_warning('More than one subtitle file found. Your media player will likely be unable to display all of them.') + + if sub_dict[list(sub_dict.keys())[0]]['ext'] != 'lrc': raise PostProcessingError('LRC subtitles required. Use "--convert-subs lrc" to convert') - with open(subs, 'r', encoding='utf-8') as f: - lyrics = f.read().strip() + lyrics_list = [] + for lyrics in sub_dict.keys(): + lyrics_list.append(sub_dict[lyrics]['data']) if audio_file.endswith('.mp3'): - audio = mutagen.id3.ID3(audio_file) - audio.add(mutagen.id3.USLT(encoding=mutagen.id3.Encoding.UTF8, lang='und', desc='', text=lyrics)) - audio.save() + for lyrics in lyrics_list: + audio = mutagen.id3.ID3(audio_file) + audio.add(mutagen.id3.USLT(encoding=3, lang='und', desc='', text=lyrics)) + audio.save() else: metadata = mutagen.File(audio_file) - metadata['©lyr' if audio_file.endswith('.m4a') else 'lyrics'] = [lyrics] + metadata['©lyr' if audio_file.endswith('.m4a') else 'lyrics'] = lyrics_list metadata.save()