Converted the Sublime Music Adapter API classes to ABCs
This commit is contained in:
110
sublime/adapters/subsonic/api_objects.py
Normal file
110
sublime/adapters/subsonic/api_objects.py
Normal file
@@ -0,0 +1,110 @@
|
||||
"""
|
||||
These are the API objects that are returned by Subsonic.
|
||||
"""
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime, timedelta
|
||||
from enum import Enum
|
||||
from typing import List, Optional, Sequence
|
||||
|
||||
from dataclasses_json import config, dataclass_json, DataClassJsonMixin, LetterCase
|
||||
from dateutil import parser
|
||||
from marshmallow import fields
|
||||
|
||||
from .. import api_objects as SublimeAPI
|
||||
|
||||
datetime_metadata = config(
|
||||
encoder=datetime.isoformat,
|
||||
decoder=lambda d: parser.parse(d) if d else None,
|
||||
mm_field=fields.DateTime(format='iso'),
|
||||
)
|
||||
|
||||
timedelta_metadata = config(
|
||||
encoder=datetime.isoformat,
|
||||
decoder=lambda s: timedelta(seconds=s) if s else None,
|
||||
mm_field=fields.TimeDelta(),
|
||||
)
|
||||
|
||||
|
||||
@dataclass_json(letter_case=LetterCase.CAMEL)
|
||||
@dataclass(frozen=True)
|
||||
class Child(SublimeAPI.Song, DataClassJsonMixin):
|
||||
title: str
|
||||
value: Optional[str] = None
|
||||
parent: Optional[str] = None
|
||||
album: Optional[str] = None
|
||||
artist: Optional[str] = None
|
||||
track: Optional[int] = None
|
||||
year: Optional[int] = None
|
||||
genre: Optional[str] = None
|
||||
coverArt: Optional[str] = None
|
||||
size: Optional[int] = None
|
||||
content_type: Optional[str] = None
|
||||
suffix: Optional[str] = None
|
||||
transcoded_content_type: Optional[str] = None
|
||||
transcoded_suffix: Optional[str] = None
|
||||
duration: Optional[int] = None
|
||||
bit_rate: Optional[int] = None
|
||||
path: Optional[str] = None
|
||||
isVideo: Optional[bool] = None
|
||||
# userRating: Optional[UserRating] = None
|
||||
# averageRating: Optional[AverageRating] = None
|
||||
play_count: Optional[int] = None
|
||||
disc_number: Optional[int] = None
|
||||
created: Optional[datetime] = None
|
||||
starred: Optional[datetime] = None
|
||||
albumId: Optional[str] = None
|
||||
artistId: Optional[str] = None
|
||||
# type_: Optional[MediaType] = None
|
||||
bookmark_position: Optional[int] = None
|
||||
original_width: Optional[int] = None
|
||||
original_height: Optional[int] = None
|
||||
|
||||
|
||||
@dataclass_json(letter_case=LetterCase.CAMEL)
|
||||
@dataclass
|
||||
class Playlist(SublimeAPI.Playlist):
|
||||
id: str
|
||||
name: str
|
||||
song_count: Optional[int] = None
|
||||
duration: Optional[timedelta] = field(
|
||||
default=None, metadata=timedelta_metadata)
|
||||
created: Optional[datetime] = field(
|
||||
default=None, metadata=datetime_metadata)
|
||||
changed: Optional[datetime] = field(
|
||||
default=None, metadata=datetime_metadata)
|
||||
comment: Optional[str] = None
|
||||
owner: Optional[str] = None
|
||||
public: Optional[bool] = None
|
||||
cover_art: Optional[str] = None
|
||||
|
||||
|
||||
@dataclass_json(letter_case=LetterCase.CAMEL)
|
||||
@dataclass
|
||||
class PlaylistWithSongs(SublimeAPI.PlaylistDetails):
|
||||
duration: timedelta = field(
|
||||
default_factory=timedelta, metadata=timedelta_metadata)
|
||||
songs: List[SublimeAPI.Song] = field(
|
||||
default_factory=list,
|
||||
metadata=config(field_name='entry'),
|
||||
)
|
||||
created: Optional[datetime] = field(
|
||||
default=None, metadata=datetime_metadata)
|
||||
changed: Optional[datetime] = field(
|
||||
default=None, metadata=datetime_metadata)
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class Playlists(DataClassJsonMixin):
|
||||
playlist: List[Playlist] = field(default_factory=list)
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class Response(DataClassJsonMixin):
|
||||
"""
|
||||
The base Subsonic response object.
|
||||
"""
|
||||
song: Optional[Child] = None
|
||||
playlists: Optional[Playlists] = None
|
||||
playlist: Optional[PlaylistWithSongs] = None
|
||||
value: Optional[str] = None
|
Reference in New Issue
Block a user