From 95bb1c2b32cb21aebe72167519f23ebb4ac37666 Mon Sep 17 00:00:00 2001 From: Lev Date: Thu, 5 Jan 2023 12:41:22 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=BB=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Исполнители разделяются нулевым байтом, согласно спецификации ID3v2.4 (4.2 Text information frames) - Улучшено распознавание нескольких исполнителей в треке (main.py:42) - Информация о исполнителе/альбоме выводится через logging --- main.py | 50 +++++++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/main.py b/main.py index b4d55a1..42f229a 100644 --- a/main.py +++ b/main.py @@ -39,6 +39,24 @@ class PlaylistId: kind: int +def parse_artists(artists: list) -> list[str]: + artists_names = [] + for artist in artists: + artists_names.append(artist['name']) + if decomposed := artist.get('decomposed'): + for d_artist in decomposed: + if isinstance(d_artist, dict): + artists_names.append(d_artist['name']) + return artists_names + + +def parse_title(json: dict) -> str: + title = json['title'] + if version := json.get('version'): + title = TITLE_FMT % {'title': title, 'version': version} + return title + + @dataclass class BasicAlbumInfo: id: str @@ -52,14 +70,11 @@ class BasicAlbumInfo: if json['metaType'] != 'music': logging.info('"%s" пропущен т.к. не является музыкальным альбомом', json['title']) return None - artists = [a['name'] for a in json['artists']] - title = json['title'] - version = json.get('version', None) - release_date = json.get('releaseDate', None) + artists = parse_artists(json['artists']) + title = parse_title(json) + release_date = json.get('releaseDate') if release_date is not None: release_date = dt.datetime.fromisoformat(release_date) - if version is not None: - title = TITLE_FMT % {'title': title, 'version': version} return BasicAlbumInfo(id=json['id'], title=title, year=json['year'], artists=artists, release_date=release_date) @@ -81,21 +96,17 @@ class BasicTrackInfo: if not json['available']: return None album_json = json['albums'][0] - artists_names = [a['name'] for a in json['artists']] + artists = parse_artists(json['artists']) track_position = album_json['trackPosition'] album = BasicAlbumInfo.from_json(album_json) if album is None: - raise RuntimeError + raise ValueError url_template = 'https://' + json['ogImage'] has_lyrics = json['lyricsInfo']['hasAvailableTextLyrics'] - - title = json['title'] - version = json.get('version', None) - if version is not None: - title = TITLE_FMT % {'title': title, 'version': version} + title = parse_title(json) return BasicTrackInfo(title=title, id=str(json['id']), real_id=json['realId'], number=track_position['index'], disc_number=track_position['volume'], - artists=artists_names, album=album, url_template=url_template, + artists=artists, album=album, url_template=url_template, has_lyrics=has_lyrics) def pic_url(self, resolution: int) -> str: @@ -245,7 +256,7 @@ def set_id3_tags(path: Path, track: BasicTrackInfo, lyrics: Optional[str], release_date = track.album.year audiofile = eyed3.load(path) audiofile.tag = tag = eyed3.id3.tag.Tag() - tag.artist = '; '.join(track.artists) + tag.artist = chr(0).join(track.artists) tag.album_artist = track.album.artists[0] tag.album = track.album.title tag.title = track.title @@ -362,17 +373,18 @@ if __name__ == '__main__': full_album = get_full_album_info(session, album.id) result_tracks.extend(full_album.tracks) albums_count += 1 - print(f'{artist_info.name}') - print(f'Альбомов: {albums_count}') + logging.info(artist_info.name) + logging.info('Альбомов: %d', albums_count) elif args.album_id is not None: album = get_full_album_info(session, args.album_id) + logging.info(album.title) result_tracks = album.tracks elif args.track_id is not None: result_tracks = [get_full_track_info(session, args.track_id)] elif args.playlist_id is not None: result_tracks = get_playlist(session, args.playlist_id) - print(f'Треков: {len(result_tracks)}') + logging.info('Треков: %d', len(result_tracks)) covers: dict[str, bytes] = {} for track in result_tracks: @@ -399,7 +411,7 @@ if __name__ == '__main__': cover = None if args.embed_cover: - if cached_cover := covers.get(album.id, None): + if cached_cover := covers.get(album.id): cover = cached_cover else: cover = covers[album.id] = download_bytes(session,