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