From 80a97758a6013f16c8ca9050a8845387f263f0f2 Mon Sep 17 00:00:00 2001 From: Miwory Date: Tue, 14 Apr 2026 16:43:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D0=B0=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B4=D0=B0=D1=82=D1=8B=20=D0=B2?= =?UTF-8?q?=D1=8B=D1=85=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- src/oxidespotify/schema.py | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9b37df3..984063a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oxidespotify" -version = "1.0.0" +version = "1.0.1" description = "Client for Spotify API" readme = "README.md" authors = [{ name = "Miwory", email = "miwory.uwu@gmail.com" }] diff --git a/src/oxidespotify/schema.py b/src/oxidespotify/schema.py index ca45ce8..b62b387 100644 --- a/src/oxidespotify/schema.py +++ b/src/oxidespotify/schema.py @@ -1,7 +1,13 @@ -from datetime import datetime -from typing import Literal +from datetime import date, datetime +from typing import Annotated, Literal -from pydantic import BaseModel, HttpUrl, RootModel, field_validator +from pydantic import ( + BaseModel, + BeforeValidator, + HttpUrl, + RootModel, + field_validator, +) class Error(Exception): @@ -22,6 +28,21 @@ class InternalError(Error): 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): token_type: Literal['Bearer'] access_token: str @@ -134,7 +155,7 @@ class BaseAlbum(BaseModel): id: str images: list[Image] name: str - release_date: datetime + release_date: PrecisionedReleaseDate release_date_precision: Literal['year', 'month', 'day'] restrictions: Restriction | None = None type: Literal['album'] @@ -206,7 +227,7 @@ class AudioBookChapter(BaseModel): is_playable: bool languages: list[str] name: str - release_date: datetime + release_date: PrecisionedReleaseDate release_date_precision: Literal['year', 'month', 'day'] resume_point: ResumePoint type: Literal['episode']