mirror of
https://github.com/zhaarey/AppleMusicDecrypt.git
synced 2025-10-23 15:11:06 +00:00
fix: validation error when missing some fields of metadata
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
from typing import Optional
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from src.api import get_cover
|
from src.api import get_cover
|
||||||
@@ -6,27 +8,29 @@ from src.utils import ttml_convent_to_lrc
|
|||||||
|
|
||||||
|
|
||||||
class SongMetadata(BaseModel):
|
class SongMetadata(BaseModel):
|
||||||
title: str
|
title: Optional[str] = None
|
||||||
artist: str
|
artist: Optional[str] = None
|
||||||
album_artist: str
|
album_artist: Optional[str] = None
|
||||||
album: str
|
album: Optional[str] = None
|
||||||
composer: str
|
composer: Optional[str] = None
|
||||||
genre: str
|
genre: Optional[str] = None
|
||||||
created: str
|
created: Optional[str] = None
|
||||||
track: str
|
track: Optional[str] = None
|
||||||
tracknum: int
|
tracknum: Optional[int] = None
|
||||||
disk: int
|
disk: Optional[int] = None
|
||||||
lyrics: str
|
lyrics: Optional[str] = None
|
||||||
cover: bytes = None
|
cover: bytes = None
|
||||||
cover_url: str
|
cover_url: Optional[str] = None
|
||||||
copyright: str
|
copyright: Optional[str] = None
|
||||||
record_company: str
|
record_company: Optional[str] = None
|
||||||
upc: str
|
upc: Optional[str] = None
|
||||||
isrc: str
|
isrc: Optional[str] = None
|
||||||
|
|
||||||
def to_itags_params(self, embed_metadata: list[str], cover_format: str):
|
def to_itags_params(self, embed_metadata: list[str], cover_format: str):
|
||||||
tags = []
|
tags = []
|
||||||
for key, value in self.model_dump().items():
|
for key, value in self.model_dump().items():
|
||||||
|
if not value:
|
||||||
|
continue
|
||||||
if key in embed_metadata and value:
|
if key in embed_metadata and value:
|
||||||
if key == "cover":
|
if key == "cover":
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -1,106 +1,106 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import List
|
from typing import List, Optional
|
||||||
|
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
|
||||||
class Artwork(BaseModel):
|
class Artwork(BaseModel):
|
||||||
width: int
|
width: Optional[int] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
height: int
|
height: Optional[int] = None
|
||||||
textColor3: str
|
textColor3: Optional[str] = None
|
||||||
textColor2: str
|
textColor2: Optional[str] = None
|
||||||
textColor4: str
|
textColor4: Optional[str] = None
|
||||||
textColor1: str
|
textColor1: Optional[str] = None
|
||||||
bgColor: str
|
bgColor: Optional[str] = None
|
||||||
hasP3: bool
|
hasP3: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class PlayParams(BaseModel):
|
class PlayParams(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
kind: str
|
kind: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes(BaseModel):
|
class Attributes(BaseModel):
|
||||||
copyright: str
|
copyright: Optional[str] = None
|
||||||
genreNames: List[str]
|
genreNames: List[Optional[str]] = None
|
||||||
releaseDate: str
|
releaseDate: Optional[str] = None
|
||||||
upc: str
|
upc: Optional[str] = None
|
||||||
isMasteredForItunes: bool
|
isMasteredForItunes: Optional[bool] = None
|
||||||
artwork: Artwork
|
artwork: Artwork
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
playParams: PlayParams
|
playParams: PlayParams
|
||||||
recordLabel: str
|
recordLabel: Optional[str] = None
|
||||||
isCompilation: bool
|
isCompilation: Optional[bool] = None
|
||||||
trackCount: int
|
trackCount: Optional[int] = None
|
||||||
isPrerelease: bool
|
isPrerelease: Optional[bool] = None
|
||||||
audioTraits: List[str]
|
audioTraits: List[Optional[str]] = None
|
||||||
isSingle: bool
|
isSingle: Optional[bool] = None
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
artistName: str
|
artistName: Optional[str] = None
|
||||||
isComplete: bool
|
isComplete: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class Artwork1(BaseModel):
|
class Artwork1(BaseModel):
|
||||||
width: int
|
width: Optional[int] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
height: int
|
height: Optional[int] = None
|
||||||
textColor3: str
|
textColor3: Optional[str] = None
|
||||||
textColor2: str
|
textColor2: Optional[str] = None
|
||||||
textColor4: str
|
textColor4: Optional[str] = None
|
||||||
textColor1: str
|
textColor1: Optional[str] = None
|
||||||
bgColor: str
|
bgColor: Optional[str] = None
|
||||||
hasP3: bool
|
hasP3: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class PlayParams1(BaseModel):
|
class PlayParams1(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
kind: str
|
kind: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Preview(BaseModel):
|
class Preview(BaseModel):
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes1(BaseModel):
|
class Attributes1(BaseModel):
|
||||||
hasTimeSyncedLyrics: bool
|
hasTimeSyncedLyrics: Optional[bool] = None
|
||||||
albumName: str
|
albumName: Optional[str] = None
|
||||||
genreNames: List[str]
|
genreNames: List[Optional[str]] = None
|
||||||
trackNumber: int
|
trackNumber: Optional[int] = None
|
||||||
durationInMillis: int
|
durationInMillis: Optional[int] = None
|
||||||
releaseDate: str
|
releaseDate: Optional[str] = None
|
||||||
isVocalAttenuationAllowed: bool
|
isVocalAttenuationAllowed: Optional[bool] = None
|
||||||
isMasteredForItunes: bool
|
isMasteredForItunes: Optional[bool] = None
|
||||||
isrc: str
|
isrc: Optional[str] = None
|
||||||
artwork: Artwork1
|
artwork: Artwork1
|
||||||
composerName: str
|
composerName: Optional[str] = None
|
||||||
audioLocale: str
|
audioLocale: Optional[str] = None
|
||||||
playParams: PlayParams1
|
playParams: PlayParams1
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
discNumber: int
|
discNumber: Optional[int] = None
|
||||||
hasCredits: bool
|
hasCredits: Optional[bool] = None
|
||||||
isAppleDigitalMaster: bool
|
isAppleDigitalMaster: Optional[bool] = None
|
||||||
hasLyrics: bool
|
hasLyrics: Optional[bool] = None
|
||||||
audioTraits: List[str]
|
audioTraits: List[Optional[str]] = None
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
previews: List[Preview]
|
previews: List[Preview]
|
||||||
artistName: str
|
artistName: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes2(BaseModel):
|
class Attributes2(BaseModel):
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Datum2(BaseModel):
|
class Datum2(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes2
|
attributes: Attributes2
|
||||||
|
|
||||||
|
|
||||||
class Artists(BaseModel):
|
class Artists(BaseModel):
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
data: List[Datum2]
|
data: List[Datum2]
|
||||||
|
|
||||||
|
|
||||||
@@ -109,36 +109,36 @@ class Relationships1(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Datum1(BaseModel):
|
class Datum1(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes1
|
attributes: Attributes1
|
||||||
relationships: Relationships1
|
relationships: Relationships1
|
||||||
|
|
||||||
|
|
||||||
class Tracks(BaseModel):
|
class Tracks(BaseModel):
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
data: List[Datum1]
|
data: List[Datum1]
|
||||||
|
|
||||||
|
|
||||||
class Attributes3(BaseModel):
|
class Attributes3(BaseModel):
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Datum3(BaseModel):
|
class Datum3(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes3
|
attributes: Attributes3
|
||||||
|
|
||||||
|
|
||||||
class Artists1(BaseModel):
|
class Artists1(BaseModel):
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
data: List[Datum3]
|
data: List[Datum3]
|
||||||
|
|
||||||
|
|
||||||
class RecordLabels(BaseModel):
|
class RecordLabels(BaseModel):
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
data: List
|
data: List
|
||||||
|
|
||||||
|
|
||||||
@@ -149,9 +149,9 @@ class Relationships(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Datum(BaseModel):
|
class Datum(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes
|
attributes: Attributes
|
||||||
relationships: Relationships
|
relationships: Relationships
|
||||||
|
|
||||||
|
|||||||
@@ -6,110 +6,110 @@ from pydantic import BaseModel
|
|||||||
|
|
||||||
|
|
||||||
class Description(BaseModel):
|
class Description(BaseModel):
|
||||||
standard: str
|
standard: Optional[str] = None
|
||||||
short: str
|
short: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Artwork(BaseModel):
|
class Artwork(BaseModel):
|
||||||
width: int
|
width: Optional[int] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
height: int
|
height: Optional[int] = None
|
||||||
textColor3: str
|
textColor3: Optional[str] = None
|
||||||
textColor2: str
|
textColor2: Optional[str] = None
|
||||||
textColor4: str
|
textColor4: Optional[str] = None
|
||||||
textColor1: str
|
textColor1: Optional[str] = None
|
||||||
bgColor: str
|
bgColor: Optional[str] = None
|
||||||
hasP3: bool
|
hasP3: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class PlayParams(BaseModel):
|
class PlayParams(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
kind: str
|
kind: Optional[str] = None
|
||||||
versionHash: str
|
versionHash: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class EditorialNotes(BaseModel):
|
class EditorialNotes(BaseModel):
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
standard: str
|
standard: Optional[str] = None
|
||||||
short: str
|
short: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes(BaseModel):
|
class Attributes(BaseModel):
|
||||||
lastModifiedDate: str
|
lastModifiedDate: Optional[str] = None
|
||||||
supportsSing: bool
|
supportsSing: Optional[bool] = None
|
||||||
description: Description
|
description: Description
|
||||||
artwork: Artwork
|
artwork: Artwork
|
||||||
playParams: PlayParams
|
playParams: PlayParams
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
hasCollaboration: bool
|
hasCollaboration: Optional[bool] = None
|
||||||
curatorName: str
|
curatorName: Optional[str] = None
|
||||||
audioTraits: List
|
audioTraits: List
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
isChart: bool
|
isChart: Optional[bool] = None
|
||||||
playlistType: str
|
playlistType: Optional[str] = None
|
||||||
editorialNotes: EditorialNotes
|
editorialNotes: EditorialNotes
|
||||||
artistName: Optional[str] = None
|
artistName: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Artwork1(BaseModel):
|
class Artwork1(BaseModel):
|
||||||
width: int
|
width: Optional[int] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
height: int
|
height: Optional[int] = None
|
||||||
textColor3: str
|
textColor3: Optional[str] = None
|
||||||
textColor2: str
|
textColor2: Optional[str] = None
|
||||||
textColor4: str
|
textColor4: Optional[str] = None
|
||||||
textColor1: str
|
textColor1: Optional[str] = None
|
||||||
bgColor: str
|
bgColor: Optional[str] = None
|
||||||
hasP3: bool
|
hasP3: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class PlayParams1(BaseModel):
|
class PlayParams1(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
kind: str
|
kind: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Preview(BaseModel):
|
class Preview(BaseModel):
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes1(BaseModel):
|
class Attributes1(BaseModel):
|
||||||
albumName: str
|
albumName: Optional[str] = None
|
||||||
hasTimeSyncedLyrics: bool
|
hasTimeSyncedLyrics: Optional[bool] = None
|
||||||
genreNames: List[str]
|
genreNames: List[Optional[str]] = None
|
||||||
trackNumber: int
|
trackNumber: Optional[int] = None
|
||||||
releaseDate: str
|
releaseDate: Optional[str] = None
|
||||||
durationInMillis: int
|
durationInMillis: Optional[int] = None
|
||||||
isVocalAttenuationAllowed: bool
|
isVocalAttenuationAllowed: Optional[bool] = None
|
||||||
isMasteredForItunes: bool
|
isMasteredForItunes: Optional[bool] = None
|
||||||
isrc: str
|
isrc: Optional[str] = None
|
||||||
artwork: Artwork1
|
artwork: Artwork1
|
||||||
composerName: str
|
composerName: Optional[str] = None
|
||||||
audioLocale: str
|
audioLocale: Optional[str] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
playParams: PlayParams1
|
playParams: PlayParams1
|
||||||
discNumber: int
|
discNumber: Optional[int] = None
|
||||||
hasCredits: bool
|
hasCredits: Optional[bool] = None
|
||||||
hasLyrics: bool
|
hasLyrics: Optional[bool] = None
|
||||||
isAppleDigitalMaster: bool
|
isAppleDigitalMaster: Optional[bool] = None
|
||||||
audioTraits: List[str]
|
audioTraits: List[Optional[str]] = None
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
previews: List[Preview]
|
previews: List[Preview]
|
||||||
artistName: str
|
artistName: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes2(BaseModel):
|
class Attributes2(BaseModel):
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Datum2(BaseModel):
|
class Datum2(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes2
|
attributes: Attributes2
|
||||||
|
|
||||||
|
|
||||||
class Artists(BaseModel):
|
class Artists(BaseModel):
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
data: List[Datum2]
|
data: List[Datum2]
|
||||||
|
|
||||||
|
|
||||||
@@ -118,16 +118,16 @@ class Relationships1(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Datum1(BaseModel):
|
class Datum1(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes1
|
attributes: Attributes1
|
||||||
relationships: Relationships1
|
relationships: Relationships1
|
||||||
|
|
||||||
|
|
||||||
class Tracks(BaseModel):
|
class Tracks(BaseModel):
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
next: Optional[str] = None
|
next: Optional[Optional[str]] = None
|
||||||
data: List[Datum1]
|
data: List[Datum1]
|
||||||
|
|
||||||
|
|
||||||
@@ -136,9 +136,9 @@ class Relationships(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Datum(BaseModel):
|
class Datum(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes
|
attributes: Attributes
|
||||||
relationships: Relationships
|
relationships: Relationships
|
||||||
|
|
||||||
|
|||||||
@@ -1,122 +1,122 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import List
|
from typing import List, Optional
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
class Artwork(BaseModel):
|
class Artwork(BaseModel):
|
||||||
width: int
|
width: Optional[int] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
height: int
|
height: Optional[int] = None
|
||||||
textColor3: str
|
textColor3: Optional[str] = None
|
||||||
textColor2: str
|
textColor2: Optional[str] = None
|
||||||
textColor4: str
|
textColor4: Optional[str] = None
|
||||||
textColor1: str
|
textColor1: Optional[str] = None
|
||||||
bgColor: str
|
bgColor: Optional[str] = None
|
||||||
hasP3: bool
|
hasP3: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class PlayParams(BaseModel):
|
class PlayParams(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
kind: str
|
kind: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Preview(BaseModel):
|
class Preview(BaseModel):
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class ExtendedAssetUrls(BaseModel):
|
class ExtendedAssetUrls(BaseModel):
|
||||||
plus: str
|
plus: Optional[str] = None
|
||||||
lightweight: str
|
lightweight: Optional[str] = None
|
||||||
superLightweight: str
|
superLightweight: Optional[str] = None
|
||||||
lightweightPlus: str
|
lightweightPlus: Optional[str] = None
|
||||||
enhancedHls: str
|
enhancedHls: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes(BaseModel):
|
class Attributes(BaseModel):
|
||||||
hasTimeSyncedLyrics: bool
|
hasTimeSyncedLyrics: Optional[bool] = None
|
||||||
albumName: str
|
albumName: Optional[str] = None
|
||||||
genreNames: List[str]
|
genreNames: List[Optional[str]] = None
|
||||||
trackNumber: int
|
trackNumber: Optional[int] = None
|
||||||
durationInMillis: int
|
durationInMillis: Optional[int] = None
|
||||||
releaseDate: str
|
releaseDate: Optional[str] = None
|
||||||
isVocalAttenuationAllowed: bool
|
isVocalAttenuationAllowed: Optional[bool] = None
|
||||||
isMasteredForItunes: bool
|
isMasteredForItunes: Optional[bool] = None
|
||||||
isrc: str
|
isrc: Optional[str] = None
|
||||||
artwork: Artwork
|
artwork: Artwork
|
||||||
composerName: str
|
composerName: Optional[str] = None
|
||||||
audioLocale: str
|
audioLocale: Optional[str] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
playParams: PlayParams
|
playParams: PlayParams
|
||||||
discNumber: int
|
discNumber: Optional[int] = None
|
||||||
hasCredits: bool
|
hasCredits: Optional[bool] = None
|
||||||
isAppleDigitalMaster: bool
|
isAppleDigitalMaster: Optional[bool] = None
|
||||||
hasLyrics: bool
|
hasLyrics: Optional[bool] = None
|
||||||
audioTraits: List[str]
|
audioTraits: List[Optional[str]] = None
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
previews: List[Preview]
|
previews: List[Preview]
|
||||||
artistName: str
|
artistName: Optional[str] = None
|
||||||
extendedAssetUrls: ExtendedAssetUrls
|
extendedAssetUrls: ExtendedAssetUrls
|
||||||
|
|
||||||
|
|
||||||
class Artwork1(BaseModel):
|
class Artwork1(BaseModel):
|
||||||
width: int
|
width: Optional[int] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
height: int
|
height: Optional[int] = None
|
||||||
textColor3: str
|
textColor3: Optional[str] = None
|
||||||
textColor2: str
|
textColor2: Optional[str] = None
|
||||||
textColor4: str
|
textColor4: Optional[str] = None
|
||||||
textColor1: str
|
textColor1: Optional[str] = None
|
||||||
bgColor: str
|
bgColor: Optional[str] = None
|
||||||
hasP3: bool
|
hasP3: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class PlayParams1(BaseModel):
|
class PlayParams1(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
kind: str
|
kind: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes1(BaseModel):
|
class Attributes1(BaseModel):
|
||||||
copyright: str
|
copyright: Optional[str] = None
|
||||||
genreNames: List[str]
|
genreNames: List[Optional[str]] = None
|
||||||
releaseDate: str
|
releaseDate: Optional[str] = None
|
||||||
isMasteredForItunes: bool
|
isMasteredForItunes: Optional[bool] = None
|
||||||
upc: str
|
upc: Optional[str] = None
|
||||||
artwork: Artwork1
|
artwork: Artwork1
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
playParams: PlayParams1
|
playParams: PlayParams1
|
||||||
recordLabel: str
|
recordLabel: Optional[str] = None
|
||||||
isCompilation: bool
|
isCompilation: Optional[bool] = None
|
||||||
trackCount: int
|
trackCount: Optional[int] = None
|
||||||
isPrerelease: bool
|
isPrerelease: Optional[bool] = None
|
||||||
audioTraits: List[str]
|
audioTraits: List[Optional[str]] = None
|
||||||
isSingle: bool
|
isSingle: Optional[bool] = None
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
artistName: str
|
artistName: Optional[str] = None
|
||||||
isComplete: bool
|
isComplete: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class Datum1(BaseModel):
|
class Datum1(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes1
|
attributes: Attributes1
|
||||||
|
|
||||||
|
|
||||||
class Albums(BaseModel):
|
class Albums(BaseModel):
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
data: List[Datum1]
|
data: List[Datum1]
|
||||||
|
|
||||||
|
|
||||||
class Datum2(BaseModel):
|
class Datum2(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Artists(BaseModel):
|
class Artists(BaseModel):
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
data: List[Datum2]
|
data: List[Datum2]
|
||||||
|
|
||||||
|
|
||||||
@@ -126,9 +126,9 @@ class Relationships(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Datum(BaseModel):
|
class Datum(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes
|
attributes: Attributes
|
||||||
relationships: Relationships
|
relationships: Relationships
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
from typing import List
|
from typing import List, Optional
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
class PlayParams(BaseModel):
|
class PlayParams(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
kind: str
|
kind: Optional[str] = None
|
||||||
catalogId: str
|
catalogId: Optional[str] = None
|
||||||
displayType: int
|
displayType: Optional[int] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes(BaseModel):
|
class Attributes(BaseModel):
|
||||||
ttml: str
|
ttml: Optional[str] = None
|
||||||
playParams: PlayParams
|
playParams: PlayParams
|
||||||
|
|
||||||
|
|
||||||
class Datum(BaseModel):
|
class Datum(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
attributes: Attributes
|
attributes: Attributes
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,55 +6,55 @@ from pydantic import BaseModel
|
|||||||
|
|
||||||
|
|
||||||
class Artwork(BaseModel):
|
class Artwork(BaseModel):
|
||||||
width: int
|
width: Optional[int] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
height: int
|
height: Optional[int] = None
|
||||||
textColor3: str
|
textColor3: Optional[str] = None
|
||||||
textColor2: str
|
textColor2: Optional[str] = None
|
||||||
textColor4: str
|
textColor4: Optional[str] = None
|
||||||
textColor1: str
|
textColor1: Optional[str] = None
|
||||||
bgColor: str
|
bgColor: Optional[str] = None
|
||||||
hasP3: bool
|
hasP3: Optional[bool] = None
|
||||||
|
|
||||||
|
|
||||||
class PlayParams(BaseModel):
|
class PlayParams(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
kind: str
|
kind: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Preview(BaseModel):
|
class Preview(BaseModel):
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Attributes(BaseModel):
|
class Attributes(BaseModel):
|
||||||
hasTimeSyncedLyrics: bool
|
hasTimeSyncedLyrics: Optional[bool] = None
|
||||||
albumName: str
|
albumName: Optional[str] = None
|
||||||
genreNames: List[str]
|
genreNames: List[Optional[str]] = None
|
||||||
trackNumber: int
|
trackNumber: Optional[int] = None
|
||||||
releaseDate: str
|
releaseDate: Optional[str] = None
|
||||||
durationInMillis: int
|
durationInMillis: Optional[int] = None
|
||||||
isVocalAttenuationAllowed: bool
|
isVocalAttenuationAllowed: Optional[bool] = None
|
||||||
isMasteredForItunes: bool
|
isMasteredForItunes: Optional[bool] = None
|
||||||
isrc: str
|
isrc: Optional[str] = None
|
||||||
artwork: Artwork
|
artwork: Artwork
|
||||||
composerName: Optional[str] = None
|
composerName: Optional[str] = None
|
||||||
audioLocale: str
|
audioLocale: Optional[str] = None
|
||||||
url: str
|
url: Optional[str] = None
|
||||||
playParams: PlayParams
|
playParams: PlayParams
|
||||||
discNumber: int
|
discNumber: Optional[int] = None
|
||||||
hasCredits: bool
|
hasCredits: Optional[bool] = None
|
||||||
isAppleDigitalMaster: bool
|
isAppleDigitalMaster: Optional[bool] = None
|
||||||
hasLyrics: bool
|
hasLyrics: Optional[bool] = None
|
||||||
audioTraits: List[str]
|
audioTraits: Optional[str] = None
|
||||||
name: str
|
name: Optional[str] = None
|
||||||
previews: List[Preview]
|
previews: List[Preview]
|
||||||
artistName: str
|
artistName: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class Datum(BaseModel):
|
class Datum(BaseModel):
|
||||||
id: str
|
id: Optional[str] = None
|
||||||
type: str
|
type: Optional[str] = None
|
||||||
href: str
|
href: Optional[str] = None
|
||||||
attributes: Attributes
|
attributes: Attributes
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user