Рефакторинг

This commit is contained in:
Lev Plyusnin 2023-08-06 12:26:22 +05:00
parent 7ba28fd5c3
commit 4c8c489742
No known key found for this signature in database
GPG key ID: 21C6C2C9C0A4460D

58
main.py
View file

@ -37,7 +37,6 @@ PLAYLIST_RE = re.compile(r'([\w\-._]+)/playlists/(\d+)$')
FILENAME_CLEAR_RE = re.compile(r'[^\w\-\'() ]+') FILENAME_CLEAR_RE = re.compile(r'[^\w\-\'() ]+')
TITLE_TEMPLATE = '{title} ({version})' TITLE_TEMPLATE = '{title} ({version})'
TRACK_URL_TEMPLATE = 'https://music.yandex.ru/album/{album_id}/track/{track_id}'
logger = logging.getLogger('yandex-music-downloader') logger = logging.getLogger('yandex-music-downloader')
@ -89,24 +88,6 @@ class FullArtistInfo(BasicArtistInfo):
return cls(**base.__dict__, cover_info=cover_info, albums=albums) return cls(**base.__dict__, cover_info=cover_info, albums=albums)
def parse_artists(data: list) -> list[BasicArtistInfo]:
artists = []
for artist in data:
artists.append(artist)
if decomposed := artist.get('decomposed'):
for d_artist in decomposed:
if isinstance(d_artist, dict):
artists.append(d_artist)
return [BasicArtistInfo.from_json(a) for a in artists]
def parse_title(data: dict) -> str:
title = data['title']
if version := data.get('version'):
title = TITLE_TEMPLATE.format(title=title, version=version)
return title
@dataclass @dataclass
class BasicAlbumInfo: class BasicAlbumInfo:
id: str id: str
@ -176,6 +157,10 @@ class BasicTrackInfo:
has_lyrics=has_lyrics, has_lyrics=has_lyrics,
cover_info=cover_info) cover_info=cover_info)
@property
def url(self) -> str:
return f'https://music.yandex.ru/album/{self.album.id}/track/{self.id}'
@dataclass @dataclass
class FullTrackInfo(BasicTrackInfo): class FullTrackInfo(BasicTrackInfo):
@ -202,6 +187,24 @@ class FullAlbumInfo(BasicAlbumInfo):
return cls(**base.__dict__, tracks=tracks) return cls(**base.__dict__, tracks=tracks)
def parse_artists(data: list) -> list[BasicArtistInfo]:
artists = []
for artist in data:
artists.append(artist)
if decomposed := artist.get('decomposed'):
for d_artist in decomposed:
if isinstance(d_artist, dict):
artists.append(d_artist)
return [BasicArtistInfo.from_json(a) for a in artists]
def parse_title(data: dict) -> str:
title = data['title']
if version := data.get('version'):
title = TITLE_TEMPLATE.format(title=title, version=version)
return title
def get_track_download_url(session: Session, track: BasicTrackInfo, def get_track_download_url(session: Session, track: BasicTrackInfo,
hq: bool) -> str: hq: bool) -> str:
resp = session.get('https://music.yandex.ru/api/v2.1/handlers/track' resp = session.get('https://music.yandex.ru/api/v2.1/handlers/track'
@ -266,16 +269,18 @@ def get_playlist(session: Session,
def prepare_track_path(path: Path, prepare_path: bool, def prepare_track_path(path: Path, prepare_path: bool,
track: BasicTrackInfo) -> Path: track: BasicTrackInfo) -> Path:
path_str = str(path) path_str = str(path)
album = track.album
artist = album.artists[0]
repl_dict = { repl_dict = {
'#album-artist': track.album.artists[0].name, '#album-artist': album.artists[0].name,
'#artist-id': track.artists[0].id, '#artist-id': artist.name,
'#album-id': track.album.id, '#album-id': album.id,
'#track-id': track.id, '#track-id': track.id,
'#number': track.number, '#number': track.number,
'#artist': track.artists[0].name, '#artist': artist.name,
'#title': track.title, '#title': track.title,
'#album': track.album.title, '#album': album.title,
'#year': track.album.year '#year': album.year
} }
for placeholder, replacement in repl_dict.items(): for placeholder, replacement in repl_dict.items():
replacement = str(replacement) replacement = str(replacement)
@ -306,8 +311,7 @@ def set_id3_tags(path: Path, track: BasicTrackInfo, lyrics: Optional[str],
tag.disc_num = track.disc_number tag.disc_num = track.disc_number
tag.release_date = tag.original_release_date = release_date tag.release_date = tag.original_release_date = release_date
tag.encoded_by = ENCODED_BY tag.encoded_by = ENCODED_BY
tag.audio_file_url = TRACK_URL_TEMPLATE.format(album_id=track.album.id, tag.audio_file_url = track.url
track_id=track.id)
if lyrics is not None: if lyrics is not None:
tag.lyrics.set(lyrics) tag.lyrics.set(lyrics)