Merge pull request #506 from nathom/429

Add ISRC to metadata
This commit is contained in:
Nathan Thomas 2023-12-27 14:21:35 -08:00 committed by GitHub
commit d1b5bd2958
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 4 deletions

View File

@ -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":

View File

@ -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})"