From 9e81bdbb81c336fc6003f867907b8b3a81d7d5ea Mon Sep 17 00:00:00 2001 From: Lev Plyusnin Date: Wed, 12 Apr 2023 21:10:23 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BE=D0=B1=20=D0=B0=D0=BB=D1=8C=D0=B1=D0=BE?= =?UTF-8?q?=D0=BC=D0=B5=20(#11)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/main.py b/main.py index e524dba..1c80733 100644 --- a/main.py +++ b/main.py @@ -32,19 +32,20 @@ FILENAME_CLEAR_RE = re.compile(r'[^\w\-\'() ]+') TITLE_FMT = '%(title)s (%(version)s)' - +@dataclass class CoverInfo: cover_url_template: Optional[str] - def __init__(self, json_data: dict): - og_image = json_data.get('ogImage') - if og_image is not None: - self.cover_url_template = 'https://' + og_image - def cover_url(self, resolution: int) -> Optional[str]: if self.cover_url_template is not None: return self.cover_url_template.replace('%%', f'{resolution}x{resolution}') + @staticmethod + def from_json(data: dict): + if og_image := data.get('ogImage'): + return CoverInfo('https://' + og_image) + return CoverInfo(None) + @dataclass class PlaylistId: @@ -85,8 +86,7 @@ class BasicAlbumInfo: return None artists = parse_artists(data['artists']) title = parse_title(data) - release_date = data.get('releaseDate') - if release_date is not None: + if release_date := data.get('releaseDate'): release_date = dt.datetime.fromisoformat(release_date) return BasicAlbumInfo(id=data['id'], title=title, year=data.get('year'), artists=artists, release_date=release_date) @@ -108,19 +108,23 @@ class BasicTrackInfo: def from_json(data: dict): if not data['available']: return None + track_id = str(data['id']) title = parse_title(data) - album_data = data['albums'][0] + albums_data = data['albums'] artists = parse_artists(data['artists']) - track_position = album_data.get('trackPosition') - if track_position is None: - logging.warning('%s - %s не содержит информацию о позиции трека', artists[0], title) - track_position = {'index': 1, 'volume': 1} - album = BasicAlbumInfo.from_json(album_data) + track_position = {'index': 1, 'volume': 1} + if len(albums_data) != 0: + album_data = data['albums'][0] + album = BasicAlbumInfo.from_json(album_data) + track_position = album_data.get('trackPosition', track_position) + else: + album = BasicAlbumInfo(id=track_id, title=title, release_date=None, + year=None, artists=artists) if album is None: raise ValueError - cover_info = CoverInfo(data) + cover_info = CoverInfo.from_json(data) has_lyrics = data['lyricsInfo']['hasAvailableTextLyrics'] - return BasicTrackInfo(title=title, id=str(data['id']), real_id=data['realId'], + return BasicTrackInfo(title=title, id=track_id, real_id=data['realId'], number=track_position['index'], disc_number=track_position['volume'], artists=artists, album=album, has_lyrics=has_lyrics, cover_info=cover_info) @@ -162,7 +166,7 @@ class ArtistInfo: artist = data['artist'] albums = map(BasicAlbumInfo.from_json, data.get('albums', [])) albums = [a for a in albums if a is not None] - cover_info = CoverInfo(data) + cover_info = CoverInfo.from_json(data) return ArtistInfo(id=str(artist['id']), name=artist['name'], cover_info=cover_info, albums=albums)