Files
you-music/backend/app/schemas/schemas.py
T
2025-10-30 22:35:02 +11:00

143 lines
3.3 KiB
Python

from pydantic import BaseModel, HttpUrl
from typing import Optional
from datetime import datetime
class MusicBase(BaseModel):
title: str
artist: Optional[str] = None
album: Optional[str] = None
duration: Optional[float] = None
source_url: Optional[str] = None
source_type: Optional[str] = None
thumbnail: Optional[str] = None
lyrics: Optional[str] = None
class MusicCreate(MusicBase):
file_path: str
class MusicUpdate(BaseModel):
title: Optional[str] = None
artist: Optional[str] = None
album: Optional[str] = None
lyrics: Optional[str] = None
class Music(MusicBase):
id: int
file_path: str
file_size: Optional[int] = None
file_format: Optional[str] = None
file_location: Optional[str] = None
file_exists: bool = True
last_scanned_at: Optional[datetime] = None
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class PlaylistBase(BaseModel):
name: str
description: Optional[str] = None
thumbnail: Optional[str] = None
class PlaylistCreate(PlaylistBase):
pass
class PlaylistUpdate(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
thumbnail: Optional[str] = None
class Playlist(PlaylistBase):
id: int
created_at: datetime
updated_at: datetime
music_items: list[Music] = []
class Config:
from_attributes = True
class SearchResult(BaseModel):
title: str
artist: Optional[str] = None
duration: Optional[int] = None
thumbnail: Optional[str] = None
url: str
source: str # youtube, bilibili
class DownloadRequest(BaseModel):
url: str
title: Optional[str] = None
add_to_playlist: Optional[str] = None
thumbnail: Optional[str] = None
artist: Optional[str] = None
class ShareLink(BaseModel):
music_id: int
token: str
url: str
class SettingsResponse(BaseModel):
local_music_dir: Optional[str] = None
scan_interval: int = 3600
delete_missing_files: bool = False
auto_scan_enabled: bool = True
last_scan_at: Optional[datetime] = None
class Config:
from_attributes = True
class SettingsUpdate(BaseModel):
local_music_dir: Optional[str] = None
scan_interval: Optional[int] = None
delete_missing_files: Optional[bool] = None
auto_scan_enabled: Optional[bool] = None
class ScanStatus(BaseModel):
is_scanning: bool
progress: Optional[int] = None
total: Optional[int] = None
current_file: Optional[str] = None
started_at: Optional[datetime] = None
completed_at: Optional[datetime] = None
files_added: int = 0
files_updated: int = 0
files_missing: int = 0
errors: list[str] = []
class MusicDetailInfo(BaseModel):
id: int
title: str
artist: Optional[str] = None
album: Optional[str] = None
duration: Optional[float] = None
file_path: str
file_location: Optional[str] = None
file_size: Optional[int] = None
file_format: Optional[str] = None
file_exists: bool
source_url: Optional[str] = None
source_type: Optional[str] = None
thumbnail: Optional[str] = None
created_at: datetime
updated_at: datetime
last_scanned_at: Optional[datetime] = None
class Config:
from_attributes = True