Converted the Sublime Music Adapter API classes to ABCs

This commit is contained in:
Sumner Evans
2020-04-19 23:46:45 -06:00
parent dc19098aeb
commit b740729ca0
28 changed files with 341 additions and 7627 deletions

View 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