mirror of https://github.com/nathom/streamrip.git
commit
d1b5bd2958
|
@ -8,6 +8,7 @@ from mutagen.flac import FLAC, Picture
|
|||
from mutagen.id3 import (
|
||||
APIC, # type: ignore
|
||||
ID3,
|
||||
ID3NoHeaderError,
|
||||
)
|
||||
from mutagen.mp4 import MP4, MP4Cover
|
||||
|
||||
|
@ -38,6 +39,7 @@ MP4_KEYS = (
|
|||
None,
|
||||
None,
|
||||
None,
|
||||
"----:com.apple.iTunes:ISRC",
|
||||
)
|
||||
|
||||
MP3_KEYS = (
|
||||
|
@ -61,6 +63,7 @@ MP3_KEYS = (
|
|||
None,
|
||||
None,
|
||||
None,
|
||||
id3.TSRC,
|
||||
)
|
||||
|
||||
METADATA_TYPES = (
|
||||
|
@ -84,6 +87,7 @@ METADATA_TYPES = (
|
|||
"tracktotal",
|
||||
"disctotal",
|
||||
"date",
|
||||
"isrc",
|
||||
)
|
||||
|
||||
|
||||
|
@ -103,7 +107,10 @@ class Container(Enum):
|
|||
elif self == Container.AAC:
|
||||
return MP4(path)
|
||||
elif self == Container.MP3:
|
||||
return ID3(path)
|
||||
try:
|
||||
return ID3(path)
|
||||
except ID3NoHeaderError:
|
||||
return ID3()
|
||||
# unreachable
|
||||
return {}
|
||||
|
||||
|
@ -113,7 +120,7 @@ class Container(Enum):
|
|||
elif self == Container.MP3:
|
||||
return self._tag_mp3(meta)
|
||||
elif self == Container.AAC:
|
||||
return self._tag_aac(meta)
|
||||
return self._tag_mp4(meta)
|
||||
# unreachable
|
||||
return []
|
||||
|
||||
|
@ -147,13 +154,18 @@ class Container(Enum):
|
|||
out.append((v.__name__, v(encoding=3, text=text)))
|
||||
return out
|
||||
|
||||
def _tag_aac(self, meta: TrackMetadata):
|
||||
def _tag_mp4(self, meta: TrackMetadata):
|
||||
out = []
|
||||
for k, v in MP4_KEY.items():
|
||||
if k == "tracknumber":
|
||||
text = [(meta.tracknumber, meta.album.tracktotal)]
|
||||
elif k == "discnumber":
|
||||
text = [(meta.discnumber, meta.album.disctotal)]
|
||||
elif k == "isrc" and meta.isrc is not None:
|
||||
# because ISRC is an mp4 freeform value (not supported natively)
|
||||
# we have to pass in the actual bytes to mutagen
|
||||
# See mutagen.MP4Tags.__render_freeform
|
||||
text = meta.isrc.encode("utf-8")
|
||||
else:
|
||||
text = self._attr_from_meta(meta, k)
|
||||
|
||||
|
@ -170,6 +182,7 @@ class Container(Enum):
|
|||
"tracknumber",
|
||||
"discnumber",
|
||||
"composer",
|
||||
"isrc",
|
||||
}
|
||||
if attr in in_trackmetadata:
|
||||
if attr == "album":
|
||||
|
|
|
@ -36,6 +36,7 @@ class TrackMetadata:
|
|||
@classmethod
|
||||
def from_qobuz(cls, album: AlbumMetadata, resp: dict) -> TrackMetadata | None:
|
||||
title = typed(resp["title"].strip(), str)
|
||||
isrc = typed(resp["isrc"], str)
|
||||
streamable = typed(resp.get("streamable", False), bool)
|
||||
|
||||
if not streamable:
|
||||
|
@ -81,11 +82,13 @@ class TrackMetadata:
|
|||
tracknumber=tracknumber,
|
||||
discnumber=discnumber,
|
||||
composer=composer,
|
||||
isrc=isrc,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_deezer(cls, album: AlbumMetadata, resp) -> TrackMetadata | None:
|
||||
track_id = str(resp["id"])
|
||||
isrc = typed(resp["isrc"], str)
|
||||
bit_depth = 16
|
||||
sampling_rate = 44.1
|
||||
explicit = typed(resp["explicit_lyrics"], bool)
|
||||
|
@ -111,12 +114,14 @@ class TrackMetadata:
|
|||
tracknumber=tracknumber,
|
||||
discnumber=discnumber,
|
||||
composer=composer,
|
||||
isrc=isrc,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_soundcloud(cls, album: AlbumMetadata, resp: dict) -> TrackMetadata:
|
||||
track = resp
|
||||
track_id = track["id"]
|
||||
isrc = typed(safe_get(track, "publisher_metadata", "isrc"), str | None)
|
||||
bit_depth, sampling_rate = None, None
|
||||
explicit = typed(
|
||||
safe_get(track, "publisher_metadata", "explicit", default=False),
|
||||
|
@ -143,15 +148,16 @@ class TrackMetadata:
|
|||
tracknumber=tracknumber,
|
||||
discnumber=0,
|
||||
composer=None,
|
||||
isrc=isrc,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_tidal(cls, album: AlbumMetadata, track) -> TrackMetadata:
|
||||
title = typed(track["title"], str).strip()
|
||||
item_id = str(track["id"])
|
||||
isrc = typed(track["isrc"], str)
|
||||
version = track.get("version")
|
||||
explicit = track.get("explicit", False)
|
||||
isrc = track.get("isrc")
|
||||
if version:
|
||||
title = f"{title} ({version})"
|
||||
|
||||
|
|
Loading…
Reference in New Issue