refactor 2

This commit is contained in:
Шурупов Илья Викторович 2026-01-04 23:40:41 +03:00
parent 72af96eada
commit 39c88564ba
7 changed files with 426 additions and 503 deletions

View file

@ -1,159 +1,51 @@
from __future__ import annotations
import json
from datetime import datetime
from pathlib import Path
from typing import List, Optional, Any
class Artist:
def __init__(self):
self.id : str = None
self.title : str = None
self.tracks : List[Track] = []
# =========================
# Core models
# =========================
class Track:
def __init__(
self,
*,
id: str,
title: str,
artists: List[str],
album: Optional[str] = None,
duration_ms: Optional[int] = None,
added_at: Optional[datetime] = None,
spotify: Optional["SpotifyData"] = None,
local: Optional["LocalData"] = None,
):
self.id = id
self.title = title
self.artists = artists
self.album = album
self.duration_ms = duration_ms
self.added_at = added_at
self.spotify = spotify
self.local = local
class Playlist:
def __init__(
self,
*,
name: str,
tracks: Optional[List[Track]] = None,
created_at: Optional[datetime] = None,
description: Optional[str] = None,
spotify: Optional["SpotifyData"] = None,
):
self.name = name
self.tracks = tracks or []
self.created_at = created_at
self.description = description
self.spotify = spotify
def __init__(self):
self.id : str = None
self.title : str = None
self.artists : List[Artist] = []
self.album : Album = None
self.duration_ms : int = None
self.added_at : datetime = None
self.local_path : Path = None
class Album:
def __init__(
self,
*,
title: str,
release_date: Optional[str] = None,
tracks: Optional[List[Track]] = None,
spotify: Optional["SpotifyData"] = None,
):
self.title = title
self.release_date = release_date
self.tracks = tracks or []
self.spotify = spotify
def __init__(self):
self.id : str = None
self.title : str = None
self.release_date : datetime = None
self.tracks : List[Track] = []
self.artists : List[Artist] = []
class TrackList:
def __init__(self, *, tracks: Optional[List[Track]] = None):
self.tracks = tracks or []
class Playlist:
def __init__(self):
self.title : str = None
self.tracks : List[Track] = []
self.created_at : datetime = None
self.description : str = None
def total_duration_ms(self) -> int:
return sum(t.duration_ms or 0 for t in self.tracks)
# =========================
# Spotify models
# =========================
class SpotifyArtist:
def __init__(self, *, id: str, name: str, uri: str, url: str):
self.id = id
self.name = name
self.uri = uri
self.url = url
class SpotifyAlbum:
def __init__(
self,
*,
id: str,
name: str,
release_date: str,
total_tracks: int,
uri: str,
url: str,
):
self.id = id
self.name = name
self.release_date = release_date
self.total_tracks = total_tracks
self.uri = uri
self.url = url
class SpotifyData:
def __init__(
self,
*,
id: str,
uri: str,
url: str,
href: str,
file_path: Optional[Path] = None,
popularity: Optional[int] = None,
is_playable: Optional[bool] = None,
is_local: Optional[bool] = None,
artists: Optional[List[SpotifyArtist]] = None,
album: Optional[SpotifyAlbum] = None,
external_ids: Optional[dict[str, str]] = None,
):
self.id = id
self.uri = uri
self.url = url
self.href = href
self.file_path = file_path
self.popularity = popularity
self.is_playable = is_playable
self.is_local = is_local
self.artists = artists or []
self.album = album
self.external_ids = external_ids or {}
class LocalData:
def __init__(
self,
*,
path: str,
):
self.path = path
# =========================
# Library container
# =========================
class Library:
def __init__(
self,
*,
playlists: Optional[List[Playlist]] = None,
tracks: Optional[List[Track]] = None,
tracklists: Optional[List[TrackList]] = None,
albums: Optional[List[Album]] = None,
):
self.playlists = playlists or []
self.tracks = tracks or []
self.tracklists = tracklists or []
self.albums = albums or []
def __init__(self):
self.artists : List[Artist] = []
self.playlists : List[Playlist] = []
self.tracks : List[Track] = []
self.albums : List[Album] = []
self.liked_tracks : List[Track] = []
self.top_tracks : List[Track]= []
self.top_artists : List[Artist] = []