Expand MusicBrainz support to be much more comprehensive

This commit is contained in:
Danielle McLean 2024-07-11 12:12:56 +10:00
parent 60116fd616
commit 09fe3b3e6c
Signed by: 00dani
GPG key ID: 6854781A0488421C
8 changed files with 188 additions and 72 deletions

View file

@ -7,25 +7,27 @@ from ...song import Song
# The maximum size for a BLAKE2b "person" value is sixteen bytes, so we need to be concise.
HASH_PERSON_PREFIX: Final = b"mnp.mac."
TRACKID_HASH_PERSON: Final = HASH_PERSON_PREFIX + b"mb_tid"
RELEASETRACKID_HASH_PERSON: Final = HASH_PERSON_PREFIX + b"mb_rtid"
RECORDING_ID_HASH_PERSON: Final = HASH_PERSON_PREFIX + b"mb_rid"
TRACK_ID_HASH_PERSON: Final = HASH_PERSON_PREFIX + b"mb_tid"
FILE_HASH_PERSON: Final = HASH_PERSON_PREFIX + b"f"
PERSISTENT_ID_BITS: Final = 64
PERSISTENT_ID_BYTES: Final = PERSISTENT_ID_BITS // 8
def digest_trackid(trackid: UUID) -> bytes:
def digest_recording_id(recording_id: UUID) -> bytes:
return blake2b(
trackid.bytes, digest_size=PERSISTENT_ID_BYTES, person=TRACKID_HASH_PERSON
recording_id.bytes,
digest_size=PERSISTENT_ID_BYTES,
person=RECORDING_ID_HASH_PERSON,
).digest()
def digest_releasetrackid(trackid: UUID) -> bytes:
def digest_track_id(track_id: UUID) -> bytes:
return blake2b(
trackid.bytes,
track_id.bytes,
digest_size=PERSISTENT_ID_BYTES,
person=RELEASETRACKID_HASH_PERSON,
person=TRACK_ID_HASH_PERSON,
).digest()
@ -41,10 +43,10 @@ def digest_file_uri(file: Path) -> bytes:
# that from the file URI. BLAKE2 can be customised to different digest sizes,
# making it perfect for this problem.
def song_to_persistent_id(song: Song) -> int:
if song.musicbrainz_trackid:
hashed_id = digest_trackid(song.musicbrainz_trackid)
elif song.musicbrainz_releasetrackid:
hashed_id = digest_releasetrackid(song.musicbrainz_releasetrackid)
if song.musicbrainz.recording:
hashed_id = digest_recording_id(song.musicbrainz.recording)
elif song.musicbrainz.track:
hashed_id = digest_track_id(song.musicbrainz.track)
else:
hashed_id = digest_file_uri(song.file)
return int.from_bytes(hashed_id)