fix: validation error when missing some fields of metadata

pull/1/head
WorldObservationLog 5 months ago
parent f3e930a262
commit 7c12af960b
  1. 36
      src/metadata.py
  2. 152
      src/models/album_meta.py
  3. 138
      src/models/playlist_meta.py
  4. 148
      src/models/song_data.py
  5. 16
      src/models/song_lyrics.py
  6. 66
      src/models/tracks_meta.py

@ -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

Loading…
Cancel
Save