✨ ReplayGain information added to metadata.
This commit is contained in:
@@ -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
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user