diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index 3d606bcba..c14661995 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -675,6 +675,11 @@ def get_postprocessors(opts): 'add_metadata': opts.addmetadata, 'add_infojson': opts.embed_infojson, } + # MutagenMetadata must run after FFmpegMetadata + if opts.addmetadata: + yield { + 'key': 'MutagenMetadata', + } # Deprecated # This should be above EmbedThumbnail since sponskrub removes the thumbnail attachment # but must be below EmbedSubtitle and FFmpegMetadata diff --git a/yt_dlp/postprocessor/__init__.py b/yt_dlp/postprocessor/__init__.py index bfe9df733..e96a015e6 100644 --- a/yt_dlp/postprocessor/__init__.py +++ b/yt_dlp/postprocessor/__init__.py @@ -30,6 +30,7 @@ from .metadataparser import ( ) from .modify_chapters import ModifyChaptersPP from .movefilesafterdownload import MoveFilesAfterDownloadPP +from .mutagenmetadata import MutagenMetadataPP from .sponskrub import SponSkrubPP from .sponsorblock import SponsorBlockPP from .xattrpp import XAttrMetadataPP diff --git a/yt_dlp/postprocessor/mutagenmetadata.py b/yt_dlp/postprocessor/mutagenmetadata.py new file mode 100644 index 000000000..875616337 --- /dev/null +++ b/yt_dlp/postprocessor/mutagenmetadata.py @@ -0,0 +1,41 @@ +from .common import PostProcessor +from ..dependencies import mutagen + +if mutagen: + from mutagen.easymp4 import EasyMP4 + from mutagen.flac import FLAC + from mutagen.mp3 import EasyMP3 + from mutagen.oggopus import OggOpus + from mutagen.oggvorbis import OggVorbis + + +class MutagenMetadataPP(PostProcessor): + def __init__(self, downloader): + PostProcessor.__init__(self, downloader) + + @PostProcessor._restrict_to(images=False) + def run(self, information): + extension = information['ext'] + ret = [], information + if not mutagen: + if extension in ['mp3', 'm4a', 'ogg', 'opus', 'flac']: + self.report_warning('module mutagen was not found. Tags with multiple values (e.g. artist, album artist and genre) may be set incorrectly. Please install using `python -m pip install mutagen`') + return ret + tag_mapping = { + 'artist': 'artists', + 'albumartist': 'album_artists', + 'genre': 'genres', + 'composer': 'composers' + } + supported_formats = [EasyMP3, EasyMP4, OggVorbis, OggOpus, FLAC] + file = mutagen.File(information['filepath'], supported_formats) + if not file: + return ret + if isinstance(file, EasyMP4): + file.RegisterTextKey('composer', '\251wrt') + for tag_key, info_key in tag_mapping.items(): + value = information.get(info_key) + if value: + file[tag_key] = value + file.save() + return ret