Files
you-music/backend/app/schemas/schemas.py
T
2025-11-07 14:44:31 +11:00

213 lines
4.9 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
share_token: Optional[str] = None
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
share_link_expiration_days: int = 14
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
share_link_expiration_days: Optional[int] = 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
class DownloadJobCreate(BaseModel):
song_name: str
artist: Optional[str] = None # Artist name to improve search accuracy
direct_url: Optional[str] = None # Direct URL to download (skips search)
class DownloadJobResponse(BaseModel):
id: int
song_name: str
status: str
search_results: Optional[str] = None
selected_result: Optional[str] = None
selected_result_index: Optional[int] = None
priority: bool
error_message: Optional[str] = None
music_id: Optional[int] = None
confirmed: bool
is_duplicate: bool
duplicate_music_id: Optional[int] = None
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class APIKeyCreate(BaseModel):
name: str
description: Optional[str] = None
expires_in_days: Optional[int] = None
class APIKeyResponse(BaseModel):
id: int
key: str
name: str
description: Optional[str] = None
is_active: bool
created_at: datetime
expires_at: Optional[datetime] = None
last_used_at: Optional[datetime] = None
class Config:
from_attributes = True
class ScanHistoryResponse(BaseModel):
id: int
started_at: datetime
completed_at: Optional[datetime] = None
files_scanned: int
files_added: int
files_updated: int
files_missing: int
errors_count: int
status: str
class Config:
from_attributes = True
class ArtistInfo(BaseModel):
name: str
song_count: int
total_duration: Optional[float] = None