diff --git a/yt_dlp/postprocessor/mutagen.py b/yt_dlp/postprocessor/mutagen.py index 9901063a1..3b4b0ae8f 100644 --- a/yt_dlp/postprocessor/mutagen.py +++ b/yt_dlp/postprocessor/mutagen.py @@ -58,88 +58,89 @@ class MutagenPP(PostProcessor): episode_id: str | None episode_sort: str | None - @singledispatchmethod - @staticmethod - def _assemble_metadata(file: FileType, meta: MetadataInfo) -> None: - raise MutagenPPError(f'Filetype {file.__class__.__name__} is not currently supported') - - @staticmethod - def _set_metadata(file: FileType, meta: MetadataInfo, file_name: str, meta_name: str): - if meta[meta_name]: - file[file_name] = meta[meta_name] - - @_assemble_metadata.register(oggvorbis.OggVorbis) - @_assemble_metadata.register(oggtheora.OggTheora) - @_assemble_metadata.register(oggspeex.OggSpeex) - @_assemble_metadata.register(oggopus.OggOpus) - @_assemble_metadata.register(flac.FLAC) - @staticmethod - def _(file: oggopus.OggOpus, meta: MetadataInfo) -> None: - MutagenPP._set_metadata(file, meta, 'artist', 'artist') - MutagenPP._set_metadata(file, meta, 'title', 'title') - MutagenPP._set_metadata(file, meta, 'genre', 'genre') - MutagenPP._set_metadata(file, meta, 'date', 'date') - MutagenPP._set_metadata(file, meta, 'album', 'album') - MutagenPP._set_metadata(file, meta, 'albumartist', 'album_artist') - MutagenPP._set_metadata(file, meta, 'description', 'description') - MutagenPP._set_metadata(file, meta, 'comment', 'comment') - MutagenPP._set_metadata(file, meta, 'composer', 'composer') - MutagenPP._set_metadata(file, meta, 'tracknumber', 'track') - - # https://getmusicbee.com/forum/index.php?topic=39759.0 - MutagenPP._set_metadata(file, meta, 'WWWAUDIOFILE', 'purl') - - @_assemble_metadata.register(trueaudio.TrueAudio) - @_assemble_metadata.register(dsf.DSF) - @_assemble_metadata.register(dsdiff.DSDIFF) - @_assemble_metadata.register(aiff.AIFF) - @_assemble_metadata.register(mp3.MP3) - @_assemble_metadata.register(wave.WAVE) - @staticmethod - def _(file: wave.WAVE, meta: MetadataInfo) -> None: - - def _set_metadata(file_name: str, meta_name: str): + if mutagen: + @singledispatchmethod + @staticmethod + def _assemble_metadata(file: FileType, meta: MetadataInfo) -> None: + raise MutagenPPError(f'Filetype {file.__class__.__name__} is not currently supported') + + @staticmethod + def _set_metadata(file: FileType, meta: MetadataInfo, file_name: str, meta_name: str): if meta[meta_name]: - id3_class = getattr(id3, file_name) - file[file_name] = id3_class(encoding=id3.Encoding.UTF8, text=meta[meta_name]) - - _set_metadata('TIT2', 'title') - _set_metadata('TPE1', 'artist') - _set_metadata('COMM', 'description') - _set_metadata('TCON', 'genre') - _set_metadata('WFED', 'purl') - _set_metadata('WOAF', 'purl') - _set_metadata('TDAT', 'date') - _set_metadata('TALB', 'album') - _set_metadata('TPE2', 'album_artist') - _set_metadata('TRCK', 'track') - _set_metadata('TCOM', 'composer') - _set_metadata('TPOS', 'disc') - - @_assemble_metadata.register(mp4.MP4) - @staticmethod - def _(file: mp4.MP4, meta: MetadataInfo) -> None: - MutagenPP._set_metadata(file, meta, '\251ART', 'artist') - MutagenPP._set_metadata(file, meta, '\251nam', 'title') - MutagenPP._set_metadata(file, meta, '\251gen', 'genre') - MutagenPP._set_metadata(file, meta, '\251day', 'date') - MutagenPP._set_metadata(file, meta, '\251alb', 'album') - MutagenPP._set_metadata(file, meta, 'aART', 'album_artist') - MutagenPP._set_metadata(file, meta, '\251cmt', 'description') - MutagenPP._set_metadata(file, meta, '\251wrt', 'composer') - MutagenPP._set_metadata(file, meta, 'disk', 'disc') - MutagenPP._set_metadata(file, meta, 'tvsh', 'show') - MutagenPP._set_metadata(file, meta, 'tvsn', 'season_number') - MutagenPP._set_metadata(file, meta, 'egid', 'episode_id') - MutagenPP._set_metadata(file, meta, 'tven', 'episode_sort') - - if meta['purl']: - # https://getmusicbee.com/forum/index.php?topic=39759.0 - file['----:com.apple.iTunes:WWWAUDIOFILE'] = meta['purl'].encode() - file['purl'] = meta['purl'].encode() + file[file_name] = meta[meta_name] + + @_assemble_metadata.register(oggvorbis.OggVorbis) + @_assemble_metadata.register(oggtheora.OggTheora) + @_assemble_metadata.register(oggspeex.OggSpeex) + @_assemble_metadata.register(oggopus.OggOpus) + @_assemble_metadata.register(flac.FLAC) + @staticmethod + def _(file: oggopus.OggOpus, meta: MetadataInfo) -> None: + MutagenPP._set_metadata(file, meta, 'artist', 'artist') + MutagenPP._set_metadata(file, meta, 'title', 'title') + MutagenPP._set_metadata(file, meta, 'genre', 'genre') + MutagenPP._set_metadata(file, meta, 'date', 'date') + MutagenPP._set_metadata(file, meta, 'album', 'album') + MutagenPP._set_metadata(file, meta, 'albumartist', 'album_artist') + MutagenPP._set_metadata(file, meta, 'description', 'description') + MutagenPP._set_metadata(file, meta, 'comment', 'comment') + MutagenPP._set_metadata(file, meta, 'composer', 'composer') + MutagenPP._set_metadata(file, meta, 'tracknumber', 'track') - if meta['track']: - file['trkn'] = [(meta['track'], 0)] + # https://getmusicbee.com/forum/index.php?topic=39759.0 + MutagenPP._set_metadata(file, meta, 'WWWAUDIOFILE', 'purl') + + @_assemble_metadata.register(trueaudio.TrueAudio) + @_assemble_metadata.register(dsf.DSF) + @_assemble_metadata.register(dsdiff.DSDIFF) + @_assemble_metadata.register(aiff.AIFF) + @_assemble_metadata.register(mp3.MP3) + @_assemble_metadata.register(wave.WAVE) + @staticmethod + def _(file: wave.WAVE, meta: MetadataInfo) -> None: + + def _set_metadata(file_name: str, meta_name: str): + if meta[meta_name]: + id3_class = getattr(id3, file_name) + file[file_name] = id3_class(encoding=id3.Encoding.UTF8, text=meta[meta_name]) + + _set_metadata('TIT2', 'title') + _set_metadata('TPE1', 'artist') + _set_metadata('COMM', 'description') + _set_metadata('TCON', 'genre') + _set_metadata('WFED', 'purl') + _set_metadata('WOAF', 'purl') + _set_metadata('TDAT', 'date') + _set_metadata('TALB', 'album') + _set_metadata('TPE2', 'album_artist') + _set_metadata('TRCK', 'track') + _set_metadata('TCOM', 'composer') + _set_metadata('TPOS', 'disc') + + @_assemble_metadata.register(mp4.MP4) + @staticmethod + def _(file: mp4.MP4, meta: MetadataInfo) -> None: + MutagenPP._set_metadata(file, meta, '\251ART', 'artist') + MutagenPP._set_metadata(file, meta, '\251nam', 'title') + MutagenPP._set_metadata(file, meta, '\251gen', 'genre') + MutagenPP._set_metadata(file, meta, '\251day', 'date') + MutagenPP._set_metadata(file, meta, '\251alb', 'album') + MutagenPP._set_metadata(file, meta, 'aART', 'album_artist') + MutagenPP._set_metadata(file, meta, '\251cmt', 'description') + MutagenPP._set_metadata(file, meta, '\251wrt', 'composer') + MutagenPP._set_metadata(file, meta, 'disk', 'disc') + MutagenPP._set_metadata(file, meta, 'tvsh', 'show') + MutagenPP._set_metadata(file, meta, 'tvsn', 'season_number') + MutagenPP._set_metadata(file, meta, 'egid', 'episode_id') + MutagenPP._set_metadata(file, meta, 'tven', 'episode_sort') + + if meta['purl']: + # https://getmusicbee.com/forum/index.php?topic=39759.0 + file['----:com.apple.iTunes:WWWAUDIOFILE'] = meta['purl'].encode() + file['purl'] = meta['purl'].encode() + + if meta['track']: + file['trkn'] = [(meta['track'], 0)] def _get_cover_art_file(self, info) -> str | None: idx = next((-i for i, t in enumerate(info['thumbnails'][::-1], 1) if t.get('filepath')), None)