from json import JSONDecodeError
from typing import TYPE_CHECKING, Any
+import eyed3
+
from music_assistant.common.helpers.util import try_parse_int
from music_assistant.common.models.enums import AlbumType
from music_assistant.common.models.errors import InvalidDataError
return tag
if tag := self.tags.get("musicbrainzrecordingid"):
return tag
- if tag := self.tags.get("musicbrainzreleasetrackid"):
- return tag
return self.tags.get("musicbrainztrackid")
@property
tags.duration = int((file_size * 8) / tags.bit_rate)
if not tags.duration and tags.raw.get("format", {}).get("duration"):
tags.duration = float(tags.raw["format"]["duration"])
+
+ if file_path.endswith(".mp3") and "musicbrainzrecordingid" not in tags.tags:
+ # eyed3 is able to extract the musicbrainzrecordingid from the unique file id
+ # this is actually a bug in ffmpeg/ffprobe which does not expose this tag
+ # so we use this as alternative approach for mp3 files
+ audiofile = await asyncio.to_thread(eyed3.load, file_path)
+ for uf_id in audiofile.tag.unique_file_ids:
+ if uf_id.owner_id == b"http://musicbrainz.org" and uf_id.uniq_id:
+ tags.tags["musicbrainzrecordingid"] = uf_id.uniq_id.decode()
+ break
+
return tags
except (KeyError, ValueError, JSONDecodeError, InvalidDataError) as err:
msg = f"Unable to retrieve info for {file_path}: {err!s}"