Expand MusicBrainz support to be much more comprehensive
This commit is contained in:
parent
60116fd616
commit
09fe3b3e6c
8 changed files with 188 additions and 72 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue