diff --git a/tidal_dl_ng/download.py b/tidal_dl_ng/download.py index 3b74474..a5f528b 100644 --- a/tidal_dl_ng/download.py +++ b/tidal_dl_ng/download.py @@ -16,7 +16,7 @@ from requests.exceptions import HTTPError from rich.progress import Progress, TaskID from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video 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.constants import ( @@ -326,7 +326,7 @@ class Download: ) try: - media_stream = media.get_stream() + media_stream: Stream = media.get_stream() stream_manifest: StreamManifest = media_stream.get_stream_manifest() except TooManyRequests: self.fn_logger.exception( @@ -383,7 +383,7 @@ class Download: # Write metadata to file. if not isinstance(media, Video): 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 @@ -509,7 +509,7 @@ class Download: return result 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): result: bool = False 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, discnumber=track.volume_num if track.volume_num else 1, 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() diff --git a/tidal_dl_ng/metadata.py b/tidal_dl_ng/metadata.py index e1fb44b..62d96cd 100644 --- a/tidal_dl_ng/metadata.py +++ b/tidal_dl_ng/metadata.py @@ -1,6 +1,6 @@ import mutagen 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: @@ -20,6 +20,10 @@ class Metadata: lyrics: str path_cover: str 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 def __init__( @@ -39,6 +43,10 @@ class Metadata: date: str = "", lyrics: str = "", 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.title = title @@ -55,6 +63,10 @@ class Metadata: self.isrc = isrc self.lyrics = lyrics 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) def _cover(self) -> bool: @@ -109,6 +121,10 @@ class Metadata: self.m.tags["COMPOSER"] = ", ".join(self.composer) if self.composer else "" self.m.tags["ISRC"] = self.isrc 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): # 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(TSRC(encoding=3, text=self.isrc)) 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): 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["\xa9lyr"] = self.lyrics 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")