Compare commits

...

2 Commits

Author SHA1 Message Date
Rohit
83d4013ccb linting 2023-12-30 16:00:08 +05:30
Rohit
fb3ec5f67e Fix embedding of lyrics in audio files 2023-12-30 15:52:28 +05:30
2 changed files with 22 additions and 19 deletions

View File

@ -107,8 +107,10 @@ class EmbedThumbnailPP(FFmpegPostProcessor):
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)']

View File

@ -587,8 +587,8 @@ class FFmpegVideoRemuxerPP(FFmpegVideoConvertorPP):
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 @@ class FFmpegEmbedSubtitlePP(FFmpegPostProcessor):
@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 @@ class FFmpegEmbedSubtitlePP(FFmpegPostProcessor):
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 @@ class FFmpegEmbedSubtitlePP(FFmpegPostProcessor):
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()