starting to standarize this stuff
This commit is contained in:
11
deezspot/models/callback/__init__.py
Normal file
11
deezspot/models/callback/__init__.py
Normal file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
"""
|
||||
Callback data models for the music metadata schema.
|
||||
"""
|
||||
|
||||
from .common import IDs, ReleaseDate
|
||||
from .artist import artistObject, artistTrackObject
|
||||
from .album import albumObject, albumTrackObject, albumArtistObject, trackAlbumObject
|
||||
from .track import trackObject
|
||||
from .playlist import playlistObject, trackPlaylistObject, albumTrackPlaylistObject, artistTrackPlaylistObject
|
||||
44
deezspot/models/callback/album.py
Normal file
44
deezspot/models/callback/album.py
Normal file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List, Optional, Dict, Any
|
||||
|
||||
from .common import IDs, ReleaseDate
|
||||
|
||||
|
||||
@dataclass
|
||||
class trackAlbumObject:
|
||||
"""Track when nested inside an album context."""
|
||||
type: str = "trackAlbum"
|
||||
title: str = ""
|
||||
disc_number: int = 1
|
||||
track_number: int = 1
|
||||
duration_ms: int = 0
|
||||
genres: List[str] = field(default_factory=list)
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
|
||||
|
||||
@dataclass
|
||||
class albumTrackObject:
|
||||
"""Album when nested inside a track context."""
|
||||
type: str = "albumTrack"
|
||||
album_type: str = "" # "album" | "single" | "compilation"
|
||||
title: str = ""
|
||||
release_date: Dict[str, Any] = field(default_factory=dict) # ReleaseDate as dict
|
||||
total_tracks: int = 0
|
||||
genres: List[str] = field(default_factory=list)
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
|
||||
|
||||
@dataclass
|
||||
class albumObject:
|
||||
"""A standalone album/single/compilation, with nested trackAlbumObject[] for its tracks."""
|
||||
type: str = "album"
|
||||
album_type: str = "" # "album" | "single" | "compilation"
|
||||
title: str = ""
|
||||
release_date: Dict[str, Any] = field(default_factory=dict) # ReleaseDate as dict
|
||||
total_tracks: int = 0
|
||||
genres: List[str] = field(default_factory=list)
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
# Nested: album's tracks without redundant album info
|
||||
tracks: List[trackAlbumObject] = field(default_factory=list)
|
||||
39
deezspot/models/callback/artist.py
Normal file
39
deezspot/models/callback/artist.py
Normal file
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List, Optional
|
||||
|
||||
from .common import IDs
|
||||
|
||||
|
||||
@dataclass
|
||||
class artistTrackObject:
|
||||
"""
|
||||
An artist when nested inside a track context.
|
||||
No genres, no albums—just identifying info.
|
||||
"""
|
||||
type: str = "artistTrack"
|
||||
name: str = ""
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
|
||||
|
||||
@dataclass
|
||||
class albumArtistObject:
|
||||
"""Album when nested inside an artist context."""
|
||||
type: str = "albumArtist"
|
||||
album_type: str = "" # "album" | "single" | "compilation"
|
||||
title: str = ""
|
||||
release_date: dict = field(default_factory=dict) # ReleaseDate as dict
|
||||
total_tracks: int = 0
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
|
||||
|
||||
@dataclass
|
||||
class artistObject:
|
||||
"""A full artist record, with nested albumArtistObject[] for a discography."""
|
||||
type: str = "artist"
|
||||
name: str = ""
|
||||
genres: List[str] = field(default_factory=list)
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
# Nested: artist's albums without redundant artist info
|
||||
albums: List[albumArtistObject] = field(default_factory=list)
|
||||
20
deezspot/models/callback/common.py
Normal file
20
deezspot/models/callback/common.py
Normal file
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional
|
||||
|
||||
|
||||
@dataclass
|
||||
class IDs:
|
||||
"""IDs used across objects; isrc only required on items supporting it."""
|
||||
spotify: Optional[str] = None
|
||||
deezer: Optional[str] = None
|
||||
isrc: Optional[str] = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class ReleaseDate:
|
||||
"""Mandatory release date structure."""
|
||||
year: int
|
||||
month: Optional[int] = None # null if unknown
|
||||
day: Optional[int] = None # null if unknown
|
||||
51
deezspot/models/callback/playlist.py
Normal file
51
deezspot/models/callback/playlist.py
Normal file
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List, Optional, Dict, Any
|
||||
|
||||
from .common import IDs
|
||||
from .artist import artistObject
|
||||
|
||||
|
||||
@dataclass
|
||||
class albumTrackPlaylistObject:
|
||||
"""Album when nested inside a track in a playlist context."""
|
||||
type: str = "albumTrackPlaylist"
|
||||
album_type: str = "" # "album" | "single" | "compilation"
|
||||
title: str = ""
|
||||
release_date: Dict[str, Any] = field(default_factory=dict) # ReleaseDate as dict
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
|
||||
|
||||
@dataclass
|
||||
class artistTrackPlaylistObject:
|
||||
"""Artist when nested inside a track in a playlist context."""
|
||||
type: str = "artistTrackPlaylist"
|
||||
name: str = ""
|
||||
genres: List[str] = field(default_factory=list)
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
|
||||
|
||||
@dataclass
|
||||
class trackPlaylistObject:
|
||||
"""Track when nested inside a playlist context."""
|
||||
type: str = "trackPlaylist"
|
||||
title: str = ""
|
||||
position: int = 0 # Position in the playlist
|
||||
duration_ms: int = 0 # mandatory
|
||||
# Nested objects instead of string references
|
||||
artist: artistTrackPlaylistObject = field(default_factory=artistTrackPlaylistObject)
|
||||
album: albumTrackPlaylistObject = field(default_factory=albumTrackPlaylistObject)
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
|
||||
|
||||
@dataclass
|
||||
class playlistObject:
|
||||
"""A user‑curated playlist, nesting trackPlaylistObject[]."""
|
||||
type: str = "playlist"
|
||||
title: str = ""
|
||||
description: Optional[str] = None
|
||||
collaborative: bool = False
|
||||
owner: artistObject = field(default_factory=artistObject)
|
||||
tracks: List[trackPlaylistObject] = field(default_factory=list)
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
27
deezspot/models/callback/track.py
Normal file
27
deezspot/models/callback/track.py
Normal file
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List, Optional
|
||||
|
||||
from .common import IDs
|
||||
from .album import albumTrackObject
|
||||
from .artist import artistTrackObject
|
||||
|
||||
|
||||
@dataclass
|
||||
class trackObject:
|
||||
"""A full track record, nesting albumTrackObject and artistTrackObject."""
|
||||
type: str = "track"
|
||||
title: str = ""
|
||||
disc_number: int = 1
|
||||
track_number: int = 1
|
||||
duration_ms: int = 0 # mandatory
|
||||
genres: List[str] = field(default_factory=list)
|
||||
|
||||
# Nested album summary
|
||||
album: albumTrackObject = field(default_factory=albumTrackObject)
|
||||
|
||||
# Nested lean artist summary (no genres/albums)
|
||||
artist: artistTrackObject = field(default_factory=artistTrackObject)
|
||||
|
||||
ids: IDs = field(default_factory=IDs)
|
||||
Reference in New Issue
Block a user