✨ ReplayGain information added to metadata.

This commit is contained in:
Robert Honz
2024-11-29 21:56:42 +01:00
parent ad63d686f2
commit 5556063e35
2 changed files with 33 additions and 5 deletions
+8 -4
View File
@@ -16,7 +16,7 @@ from requests.exceptions import HTTPError
from rich.progress import Progress, TaskID from rich.progress import Progress, TaskID
from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video
from tidalapi.exceptions import TooManyRequests from tidalapi.exceptions import TooManyRequests
from tidalapi.media import AudioExtensions, Codec, Quality, StreamManifest, VideoExtensions from tidalapi.media import AudioExtensions, Codec, Quality, Stream, StreamManifest, VideoExtensions
from tidal_dl_ng.config import Settings from tidal_dl_ng.config import Settings
from tidal_dl_ng.constants import ( from tidal_dl_ng.constants import (
@@ -326,7 +326,7 @@ class Download:
) )
try: try:
media_stream = media.get_stream() media_stream: Stream = media.get_stream()
stream_manifest: StreamManifest = media_stream.get_stream_manifest() stream_manifest: StreamManifest = media_stream.get_stream_manifest()
except TooManyRequests: except TooManyRequests:
self.fn_logger.exception( self.fn_logger.exception(
@@ -383,7 +383,7 @@ class Download:
# Write metadata to file. # Write metadata to file.
if not isinstance(media, Video): if not isinstance(media, Video):
result_metadata, tmp_path_lyrics, tmp_path_cover = self.metadata_write( result_metadata, tmp_path_lyrics, tmp_path_cover = self.metadata_write(
media, tmp_path_file, is_parent_album media, tmp_path_file, is_parent_album, media_stream
) )
# Move lyrics file # Move lyrics file
@@ -509,7 +509,7 @@ class Download:
return result return result
def metadata_write( def metadata_write(
self, track: Track, path_media: pathlib.Path, is_parent_album: bool self, track: Track, path_media: pathlib.Path, is_parent_album: bool, media_stream: Stream
) -> (bool, pathlib.Path | None, pathlib.Path | None): ) -> (bool, pathlib.Path | None, pathlib.Path | None):
result: bool = False result: bool = False
path_lyrics: pathlib.Path | None = None path_lyrics: pathlib.Path | None = None
@@ -564,6 +564,10 @@ class Download:
totaldisc=track.album.num_volumes if track.album and track.album.num_volumes else 1, totaldisc=track.album.num_volumes if track.album and track.album.num_volumes else 1,
discnumber=track.volume_num if track.volume_num else 1, discnumber=track.volume_num if track.volume_num else 1,
cover_data=cover_data if self.settings.data.metadata_cover_embed else None, cover_data=cover_data if self.settings.data.metadata_cover_embed else None,
album_replay_gain=media_stream.album_replay_gain,
album_peak_amplitude=media_stream.album_peak_amplitude,
track_replay_gain=media_stream.track_replay_gain,
track_peak_amplitude=media_stream.track_peak_amplitude,
) )
m.save() m.save()
+25 -1
View File
@@ -1,6 +1,6 @@
import mutagen import mutagen
from mutagen import flac, id3, mp4 from mutagen import flac, id3, mp4
from mutagen.id3 import APIC, TALB, TCOM, TCOP, TDRC, TIT2, TOPE, TPE1, TRCK, TSRC, USLT from mutagen.id3 import APIC, TALB, TCOM, TCOP, TDRC, TIT2, TOPE, TPE1, TRCK, TSRC, TXXX, USLT
class Metadata: class Metadata:
@@ -20,6 +20,10 @@ class Metadata:
lyrics: str lyrics: str
path_cover: str path_cover: str
cover_data: bytes cover_data: bytes
album_replay_gain: float
album_peak_amplitude: float
track_replay_gain: float
track_peak_amplitude: float
m: mutagen.mp4.MP4 | mutagen.mp4.MP4 | mutagen.flac.FLAC m: mutagen.mp4.MP4 | mutagen.mp4.MP4 | mutagen.flac.FLAC
def __init__( def __init__(
@@ -39,6 +43,10 @@ class Metadata:
date: str = "", date: str = "",
lyrics: str = "", lyrics: str = "",
cover_data: bytes = None, cover_data: bytes = None,
album_replay_gain: float = 1.0,
album_peak_amplitude: float = 1.0,
track_replay_gain: float = 1.0,
track_peak_amplitude: float = 1.0,
): ):
self.path_file = path_file self.path_file = path_file
self.title = title self.title = title
@@ -55,6 +63,10 @@ class Metadata:
self.isrc = isrc self.isrc = isrc
self.lyrics = lyrics self.lyrics = lyrics
self.cover_data = cover_data self.cover_data = cover_data
self.album_replay_gain = album_replay_gain
self.album_peak_amplitude = album_peak_amplitude
self.track_replay_gain = track_replay_gain
self.track_peak_amplitude = track_peak_amplitude
self.m: mutagen.mp4.MP4 | mutagen.flac.FLAC | mutagen.mp3.MP3 = mutagen.File(self.path_file) self.m: mutagen.mp4.MP4 | mutagen.flac.FLAC | mutagen.mp3.MP3 = mutagen.File(self.path_file)
def _cover(self) -> bool: def _cover(self) -> bool:
@@ -109,6 +121,10 @@ class Metadata:
self.m.tags["COMPOSER"] = ", ".join(self.composer) if self.composer else "" self.m.tags["COMPOSER"] = ", ".join(self.composer) if self.composer else ""
self.m.tags["ISRC"] = self.isrc self.m.tags["ISRC"] = self.isrc
self.m.tags["LYRICS"] = self.lyrics self.m.tags["LYRICS"] = self.lyrics
self.m.tags["REPLAYGAIN_ALBUM_GAIN"] = str(self.album_replay_gain)
self.m.tags["REPLAYGAIN_ALBUM_PEAK"] = str(self.album_peak_amplitude)
self.m.tags["REPLAYGAIN_TRACK_GAIN"] = str(self.track_replay_gain)
self.m.tags["REPLAYGAIN_TRACK_PEAK"] = str(self.track_peak_amplitude)
def set_mp3(self): def set_mp3(self):
# ID3 Frame (tags) overview: https://exiftool.org/TagNames/ID3.html / https://id3.org/id3v2.3.0 # ID3 Frame (tags) overview: https://exiftool.org/TagNames/ID3.html / https://id3.org/id3v2.3.0
@@ -124,6 +140,10 @@ class Metadata:
self.m.tags.add(TCOM(encoding=3, text=", ".join(self.composer) if self.composer else "")) self.m.tags.add(TCOM(encoding=3, text=", ".join(self.composer) if self.composer else ""))
self.m.tags.add(TSRC(encoding=3, text=self.isrc)) self.m.tags.add(TSRC(encoding=3, text=self.isrc))
self.m.tags.add(USLT(encoding=3, lang="eng", desc="desc", text=self.lyrics)) self.m.tags.add(USLT(encoding=3, lang="eng", desc="desc", text=self.lyrics))
self.m.tags.add(TXXX(encoding=3, desc="REPLAYGAIN_ALBUM_GAIN", text=str(self.album_replay_gain)))
self.m.tags.add(TXXX(encoding=3, desc="REPLAYGAIN_ALBUM_PEAK", text=str(self.album_peak_amplitude)))
self.m.tags.add(TXXX(encoding=3, desc="REPLAYGAIN_TRACK_GAIN", text=str(self.track_replay_gain)))
self.m.tags.add(TXXX(encoding=3, desc="REPLAYGAIN_TRACK_PEAK", text=str(self.track_peak_amplitude)))
def set_mp4(self): def set_mp4(self):
self.m.tags["\xa9nam"] = self.title self.m.tags["\xa9nam"] = self.title
@@ -138,3 +158,7 @@ class Metadata:
self.m.tags["\xa9wrt"] = ", ".join(self.composer) if self.composer else "" self.m.tags["\xa9wrt"] = ", ".join(self.composer) if self.composer else ""
self.m.tags["\xa9lyr"] = self.lyrics self.m.tags["\xa9lyr"] = self.lyrics
self.m.tags["isrc"] = self.isrc self.m.tags["isrc"] = self.isrc
self.m.tags["----:com.apple.iTunes:REPLAYGAIN_ALBUM_GAIN"] = str(self.album_replay_gain).encode("utf-8")
self.m.tags["----:com.apple.iTunes:REPLAYGAIN_ALBUM_PEAK"] = str(self.album_peak_amplitude).encode("utf-8")
self.m.tags["----:com.apple.iTunes:REPLAYGAIN_TRACK_GAIN"] = str(self.track_replay_gain).encode("utf-8")
self.m.tags["----:com.apple.iTunes:REPLAYGAIN_TRACK_PEAK"] = str(self.track_peak_amplitude).encode("utf-8")