mirror of
https://github.com/wahyd4/you-music.git
synced 2026-08-09 05:06:44 +10:00
213 lines
4.9 KiB
Python
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
|