from dataclasses import dataclass @dataclass class ListenBrainzScrobble: artist_name: str release_name: str track_name: str # Optional artist_mbids: list[str] | None = None release_group_mbid: str | None = None release_mbid: str | None = None recording_mbid: str | None = None track_mbid: str | None = None work_mbids: list[str] | None = None tracknumber: str | None = None isrc: str | None = None spotify_id: str | None = None tags: list[str] | None = None media_player: str | None = None media_player_version: str | None = None submission_client: str | None = None submission_client_version: str | None = None music_service: str | None = None music_service_name: str | None = None origin_url: str | None = None duration: int | None = None duration_ms: int | None = None @staticmethod def from_json(data: dict): additional_info_keys = [ 'artist_mbids', 'release_group_mbid', 'release_mbid', 'recording_mbid', 'track_mbid', 'work_mbids', 'tracknumber', 'isrc', 'spotify_id', 'tags', 'media_player', 'media_player_version', 'submission_client', 'submission_client_version', 'music_service', 'music_service_name', 'origin_url', 'duration', 'duration_ms' ] add_info = data['additional_info'] return ListenBrainzScrobble( artist_name=data['artist_name'], release_name=data['release_name'], track_name=data['track_name'], **{key:(add_info[key] if key in add_info else None) for key in additional_info_keys} )