musicdlp/backend/id3pp.py

75 lines
2.6 KiB
Python
Raw Normal View History

from mutagen import mp3, id3
from yt_dlp.postprocessor import PostProcessor
2024-04-28 12:44:53 +03:00
import genius
ENC_UTF8 = 3
class InfoYouTubePP(PostProcessor):
'''Generates YT Music fields in info if necessary.
Must be run before downloading and post-processing with
FFmpegExtractAudioPP and ID3YouTubePP, so use only with
when<="before_dl" ("pre_process" also suits, see yt_dlp.utils.POSTPROCESS_WHEN)
for correct file path and ID3 tags'''
def run(self, information):
if not 'track' in information:
information['track'] = information['title']
if not 'artist' in information:
information['artist'] = information['channel'].removesuffix(' - Topic')
2024-05-03 17:38:11 +03:00
if not 'artists' in information:
information['artists'] = [information['artist']]
if not 'album' in information:
try:
information['album'] = information['playlist'].removeprefix('Album \u2013 ')
except KeyError:
pass
if not 'track_number' in information:
try:
information['track_number'] = information['playlist_index']
except KeyError:
pass
# here was some code for disc_number,
# but it is even not in mutagen ID3 fields list
return [], information
class ID3TagsPP(PostProcessor):
'''Inserts ID3 tags after all PPs (for YT: InfoYouTubePP and FFmpegExtractAudioPP),
triggers searching and parsing lyrics from Genius'''
def run(self, information):
file = mp3.MP3(information['filepath'])
2024-04-28 12:44:53 +03:00
title = information['track']
2024-05-03 17:38:11 +03:00
artists: list[str] = information['artists']
2024-04-28 12:44:53 +03:00
file['TIT2'] = id3.TIT2(encoding=ENC_UTF8, text=title)
2024-05-03 17:38:11 +03:00
file['TPE1'] = id3.TPE1(encoding=ENC_UTF8, text=artists) # multiple values are null-separated
if 'album' in information:
file['TALB'] = id3.TALB(encoding=ENC_UTF8, text=information['album'])
if 'release_year' in information:
file['TDRC'] = id3.TDRC(encoding=ENC_UTF8, text=str(information['release_year']))
if 'track_number' in information:
file['TRCK'] = id3.TRCK(encoding=ENC_UTF8, text=str(information['track_number']))
2024-04-28 13:02:07 +03:00
if 'genre' in information:
file['TCON'] = id3.TCON(encoding=ENC_UTF8, text=information['genre'])
try:
lyr_title, lyr_url = genius.search(title, artists[0])
genius.raise_on_irrelevant_result(lyr_title, title, artists[0])
file['USLT'] = id3.USLT(encoding=ENC_UTF8, text=genius.parse(lyr_url))
except:
pass
file.save()
return [], information