Compare commits
5 Commits
dev
...
fa89e49f29
| Author | SHA1 | Date | |
|---|---|---|---|
| fa89e49f29 | |||
| 3d1cf6bb4d | |||
| de37fcb5fa | |||
| 0640ab9242 | |||
| b921cf9138 |
@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "oxidespotify"
|
name = "oxidespotify"
|
||||||
version = "1.0.2"
|
version = "1.0.0"
|
||||||
description = "Client for Spotify API"
|
description = "Client for Spotify API"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
authors = [{ name = "Miwory", email = "miwory.uwu@gmail.com" }]
|
authors = [{ name = "Miwory", email = "miwory.uwu@gmail.com" }]
|
||||||
|
|||||||
@ -1,13 +1,7 @@
|
|||||||
from datetime import date, datetime
|
from datetime import datetime
|
||||||
from typing import Annotated, Literal
|
from typing import Literal
|
||||||
|
|
||||||
from pydantic import (
|
from pydantic import BaseModel, HttpUrl, RootModel, field_validator
|
||||||
BaseModel,
|
|
||||||
BeforeValidator,
|
|
||||||
HttpUrl,
|
|
||||||
RootModel,
|
|
||||||
field_validator,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class Error(Exception):
|
class Error(Exception):
|
||||||
@ -28,21 +22,6 @@ class InternalError(Error):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def normalize_spotify_date(v: str) -> str:
|
|
||||||
parts = v.split('-')
|
|
||||||
if len(parts) == 1:
|
|
||||||
return f'{v}-01-01'
|
|
||||||
if len(parts) == 2:
|
|
||||||
return f'{v}-01'
|
|
||||||
|
|
||||||
return v
|
|
||||||
|
|
||||||
|
|
||||||
PrecisionedReleaseDate = Annotated[
|
|
||||||
date, BeforeValidator(normalize_spotify_date)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class Token(BaseModel):
|
class Token(BaseModel):
|
||||||
token_type: Literal['Bearer']
|
token_type: Literal['Bearer']
|
||||||
access_token: str
|
access_token: str
|
||||||
@ -93,8 +72,8 @@ class Paginated(BaseModel):
|
|||||||
limit: int
|
limit: int
|
||||||
next: HttpUrl | None
|
next: HttpUrl | None
|
||||||
offset: int = 0
|
offset: int = 0
|
||||||
previous: HttpUrl | None = None
|
previous: HttpUrl | None
|
||||||
total: int = 0
|
total: int
|
||||||
|
|
||||||
|
|
||||||
class ExternalUrls(BaseModel):
|
class ExternalUrls(BaseModel):
|
||||||
@ -155,7 +134,7 @@ class BaseAlbum(BaseModel):
|
|||||||
id: str
|
id: str
|
||||||
images: list[Image]
|
images: list[Image]
|
||||||
name: str
|
name: str
|
||||||
release_date: PrecisionedReleaseDate
|
release_date: datetime
|
||||||
release_date_precision: Literal['year', 'month', 'day']
|
release_date_precision: Literal['year', 'month', 'day']
|
||||||
restrictions: Restriction | None = None
|
restrictions: Restriction | None = None
|
||||||
type: Literal['album']
|
type: Literal['album']
|
||||||
@ -227,7 +206,7 @@ class AudioBookChapter(BaseModel):
|
|||||||
is_playable: bool
|
is_playable: bool
|
||||||
languages: list[str]
|
languages: list[str]
|
||||||
name: str
|
name: str
|
||||||
release_date: PrecisionedReleaseDate
|
release_date: datetime
|
||||||
release_date_precision: Literal['year', 'month', 'day']
|
release_date_precision: Literal['year', 'month', 'day']
|
||||||
resume_point: ResumePoint
|
resume_point: ResumePoint
|
||||||
type: Literal['episode']
|
type: Literal['episode']
|
||||||
@ -308,7 +287,7 @@ class Devices(BaseModel):
|
|||||||
class RecentlyPlayedTrack(BaseModel):
|
class RecentlyPlayedTrack(BaseModel):
|
||||||
track: Track
|
track: Track
|
||||||
played_at: datetime
|
played_at: datetime
|
||||||
context: Context | None = None
|
context: Context
|
||||||
|
|
||||||
|
|
||||||
class RecentlyPlayedTracks(Paginated):
|
class RecentlyPlayedTracks(Paginated):
|
||||||
@ -344,7 +323,7 @@ class PlaylistTracks(Paginated):
|
|||||||
|
|
||||||
class SimplifiedPlaylistTracks(Paginated):
|
class SimplifiedPlaylistTracks(Paginated):
|
||||||
href: HttpUrl
|
href: HttpUrl
|
||||||
total: int = 0
|
total: int
|
||||||
|
|
||||||
|
|
||||||
class Playlist(BaseModel):
|
class Playlist(BaseModel):
|
||||||
|
|||||||
Reference in New Issue
Block a user