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