Mopidy is an extensible music server written in Python
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Mopidy's immutable data models represent music metadata and provide the foundation for all music-related operations. These models are designed to be immutable, validated, and serializable, ensuring data consistency throughout the system.
Foundation classes for all Mopidy models providing immutability, validation, and serialization capabilities.
class ImmutableObject:
"""Base class for immutable objects with keyword-only construction."""
def __init__(self, **kwargs): ...
def replace(self, **kwargs): ...
class ValidatedImmutableObject(ImmutableObject):
"""Base class with field validation and type checking."""
def __init__(self, **kwargs): ...Lightweight URI references with human-friendly names and type information, used for browsing and navigation without full metadata.
class Ref(ValidatedImmutableObject):
"""
Model to represent URI references with a human friendly name and type.
Parameters:
- uri (str): Object URI
- name (str): Human-readable name
- type (str): Object type ('artist', 'album', 'track', 'playlist', 'directory')
"""
uri: str
name: str
type: str
# Type constants
ALBUM = "album"
ARTIST = "artist"
DIRECTORY = "directory"
PLAYLIST = "playlist"
TRACK = "track"
@classmethod
def album(cls, **kwargs): ...
@classmethod
def artist(cls, **kwargs): ...
@classmethod
def directory(cls, **kwargs): ...
@classmethod
def playlist(cls, **kwargs): ...
@classmethod
def track(cls, **kwargs): ...Usage example:
# Create references using factory methods
artist_ref = Ref.artist(uri="spotify:artist:123", name="The Beatles")
album_ref = Ref.album(uri="spotify:album:456", name="Abbey Road")
track_ref = Ref.track(uri="spotify:track:789", name="Come Together")Artist information including identifiers, names, and metadata for music organization and display.
class Artist(ValidatedImmutableObject):
"""
Artist metadata model.
Parameters:
- uri (str): Artist URI
- name (str): Artist name
- sortname (str, optional): Artist name for sorting (e.g., without articles)
- musicbrainz_id (str, optional): MusicBrainz identifier
"""
uri: str
name: str
sortname: str
musicbrainz_id: strUsage example:
artist = Artist(
uri="local:artist:the-beatles",
name="The Beatles",
sortname="Beatles, The",
musicbrainz_id="b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d"
)Album information including tracks, release details, and associated artists.
class Album(ValidatedImmutableObject):
"""
Album metadata model.
Parameters:
- uri (str): Album URI
- name (str): Album name
- artists (frozenset[Artist]): Album artists
- num_tracks (int, optional): Number of tracks in album
- num_discs (int, optional): Number of discs in album
- date (str, optional): Release date (YYYY or YYYY-MM-DD)
- musicbrainz_id (str, optional): MusicBrainz identifier
"""
uri: str
name: str
artists: frozenset[Artist]
num_tracks: int
num_discs: int
date: str
musicbrainz_id: strUsage example:
album = Album(
uri="local:album:abbey-road",
name="Abbey Road",
artists=frozenset([artist]),
num_tracks=17,
date="1969-09-26",
musicbrainz_id="7fb57fde-258e-4430-b23c-14dac0f8bb0b"
)Complete track information including audio metadata, relationships, and technical details.
class Track(ValidatedImmutableObject):
"""
Track metadata model.
Parameters:
- uri (str): Track URI
- name (str): Track name
- artists (frozenset[Artist], optional): Track artists
- album (Album, optional): Track album
- composers (frozenset[Artist], optional): Track composers
- performers (frozenset[Artist], optional): Track performers
- genre (str, optional): Track genre
- track_no (int, optional): Track number in album
- disc_no (int, optional): Disc number in album
- date (str, optional): Track release date (YYYY or YYYY-MM-DD)
- length (int, optional): Track length in milliseconds
- bitrate (int, optional): Bitrate in kbit/s
- comment (str, optional): Track comment
- musicbrainz_id (str, optional): MusicBrainz identifier
- last_modified (int, optional): Last modification time (Unix epoch ms)
"""
uri: str
name: str
artists: frozenset[Artist]
album: Album
composers: frozenset[Artist]
performers: frozenset[Artist]
genre: str
track_no: int
disc_no: int
date: str
length: int
bitrate: int
comment: str
musicbrainz_id: str
last_modified: intUsage example:
track = Track(
uri="local:track:come-together.mp3",
name="Come Together",
artists=frozenset([artist]),
album=album,
track_no=1,
length=259000, # 4:19 in milliseconds
bitrate=320
)Tracklist-specific track wrappers that allow the same track to appear multiple times with unique identifiers.
class TlTrack(ValidatedImmutableObject):
"""
A tracklist track wrapping a regular track with a tracklist ID.
Parameters:
- tlid (int): Tracklist ID
- track (Track): The track object
"""
tlid: int
track: Track
def __init__(self, *args, **kwargs):
"""Supports positional arguments: TlTrack(tlid, track)"""
...
def __iter__(self):
"""Supports iteration: tlid, track = tl_track"""
...Usage example:
tl_track = TlTrack(tlid=1, track=track)
# Or using positional arguments
tl_track = TlTrack(1, track)
# Or using iteration
tlid, track_obj = tl_trackPlaylist information including tracks, modification times, and metadata.
class Playlist(ValidatedImmutableObject):
"""
Playlist metadata model.
Parameters:
- uri (str): Playlist URI
- name (str): Playlist name
- tracks (tuple[Track]): Playlist tracks
- last_modified (int, optional): Modification time (Unix epoch ms)
"""
uri: str
name: str
tracks: tuple[Track]
last_modified: int
@property
def length(self) -> int:
"""The number of tracks in the playlist."""
...Usage example:
playlist = Playlist(
uri="m3u:playlist:favorites.m3u",
name="My Favorites",
tracks=(track1, track2, track3),
last_modified=1640995200000
)
print(f"Playlist has {playlist.length} tracks")Container for search results across different media types with organized results by category.
class SearchResult(ValidatedImmutableObject):
"""
Search result container organizing matches by type.
Parameters:
- uri (str, optional): Search result URI
- tracks (tuple[Track], optional): Matching tracks
- artists (tuple[Artist], optional): Matching artists
- albums (tuple[Album], optional): Matching albums
"""
uri: str
tracks: tuple[Track]
artists: tuple[Artist]
albums: tuple[Album]Usage example:
search_result = SearchResult(
uri="spotify:search:beatles",
tracks=(track1, track2),
artists=(artist,),
albums=(album1, album2)
)Image information for album art, artist photos, and other visual content.
class Image(ValidatedImmutableObject):
"""
Image metadata model.
Parameters:
- uri (str): Image URI
- width (int, optional): Image width in pixels
- height (int, optional): Image height in pixels
"""
uri: str
width: int
height: intUsage example:
image = Image(
uri="https://example.com/album-art.jpg",
width=600,
height=600
)Utilities for converting models to and from JSON representations for storage and transmission.
class ModelJSONEncoder(json.JSONEncoder):
"""JSON encoder for Mopidy model objects."""
def default(self, obj): ...
def model_json_decoder(dct):
"""
JSON decoder for reconstructing Mopidy model objects.
Parameters:
- dct (dict): Dictionary from JSON parsing
Returns:
- Model object or original dict
"""
...Usage example:
import json
# Serialize models to JSON
encoder = ModelJSONEncoder()
json_data = encoder.encode(track)
# Deserialize models from JSON
track_obj = json.loads(json_data, object_hook=model_json_decoder)# Type definitions used throughout models
Uri = str
UriScheme = str
QueryValue = Union[str, int]
Query = Dict[str, List[QueryValue]]