Добавление новых заполнителей (#19)

Добавлены: artist-id, album-id, track-id
This commit is contained in:
Lev Plyusnin 2023-08-01 17:03:37 +05:00
parent 2b700ebb16
commit 21678a8608
No known key found for this signature in database
GPG key ID: 21C6C2C9C0A4460D
2 changed files with 53 additions and 44 deletions

View file

@ -92,7 +92,7 @@ usage: main.py [-h] [--hq] [--skip-existing] [--add-lyrics] [--embed-cover]
Загрузчик музыки с сервиса Яндекс.Музыка Загрузчик музыки с сервиса Яндекс.Музыка
optional arguments: options:
-h, --help show this help message and exit -h, --help show this help message and exit
Общие параметры: Общие параметры:
@ -118,8 +118,9 @@ ID:
--dir <Папка> Папка для загрузки музыки (по умолчанию: .) --dir <Папка> Папка для загрузки музыки (по умолчанию: .)
--path-pattern <Паттерн> --path-pattern <Паттерн>
Поддерживает следующие заполнители: #number, #artist, Поддерживает следующие заполнители: #number, #artist,
#album-artist, #title, #album, #year (по умолчанию: #album-artist, #title, #album, #year, #artist-id,
#album-artist/#album/#number - #title) #album-id, #track-id (по умолчанию: #album-
artist/#album/#number - #title)
Авторизация: Авторизация:
--session-id <ID сессии> --session-id <ID сессии>

82
main.py
View file

@ -57,15 +57,39 @@ class PlaylistId:
kind: int kind: int
def parse_artists(artists: list) -> list[str]: @dataclass
artists_names = [] class BasicArtistInfo:
for artist in artists: id: str
artists_names.append(artist['name']) name: str
@classmethod
def from_json(cls, data: dict) -> 'BasicArtistInfo':
return cls(id=data['id'], name=data['name'])
@dataclass
class FullArtistInfo(BasicArtistInfo):
albums: list['BasicAlbumInfo']
cover_info: CoverInfo
@classmethod
def from_json(cls, data: dict) -> 'FullArtistInfo':
base = BasicArtistInfo.from_json(data['artist'])
albums = map(BasicAlbumInfo.from_json, data.get('albums', []))
albums = [a for a in albums if a is not None]
cover_info = CoverInfo.from_json(data)
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'): if decomposed := artist.get('decomposed'):
for d_artist in decomposed: for d_artist in decomposed:
if isinstance(d_artist, dict): if isinstance(d_artist, dict):
artists_names.append(d_artist['name']) artists.append(d_artist)
return artists_names return [BasicArtistInfo.from_json(a) for a in artists]
def parse_title(data: dict) -> str: def parse_title(data: dict) -> str:
@ -81,7 +105,7 @@ class BasicAlbumInfo:
title: str title: str
release_date: Optional[dt.datetime] release_date: Optional[dt.datetime]
year: Optional[int] year: Optional[int]
artists: list[str] artists: list[BasicArtistInfo]
@classmethod @classmethod
def from_json(cls, data: dict) -> Optional['BasicAlbumInfo']: def from_json(cls, data: dict) -> Optional['BasicAlbumInfo']:
@ -108,7 +132,7 @@ class BasicTrackInfo:
album: BasicAlbumInfo album: BasicAlbumInfo
number: int number: int
disc_number: int disc_number: int
artists: list[str] artists: list[BasicArtistInfo]
has_lyrics: bool has_lyrics: bool
cover_info: CoverInfo cover_info: CoverInfo
@ -171,25 +195,6 @@ class FullAlbumInfo(BasicAlbumInfo):
return cls(**base.__dict__, tracks=tracks) return cls(**base.__dict__, tracks=tracks)
@dataclass
class ArtistInfo:
id: str
name: str
albums: list[BasicAlbumInfo]
cover_info: CoverInfo
@classmethod
def from_json(cls, data: dict) -> '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.from_json(data)
return cls(id=str(artist['id']),
name=artist['name'],
cover_info=cover_info,
albums=albums)
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'
@ -235,11 +240,11 @@ def get_full_album_info(session: Session, album_id: str) -> FullAlbumInfo:
return FullAlbumInfo.from_json(resp.json()) return FullAlbumInfo.from_json(resp.json())
def get_artist_info(session: Session, artist_id: str) -> ArtistInfo: def get_artist_info(session: Session, artist_id: str) -> FullArtistInfo:
params = {'artist': artist_id, 'what': 'albums', 'lang': 'ru'} params = {'artist': artist_id, 'what': 'albums', 'lang': 'ru'}
resp = session.get('https://music.yandex.ru/handlers/artist.jsx', resp = session.get('https://music.yandex.ru/handlers/artist.jsx',
params=params) params=params)
return ArtistInfo.from_json(resp.json()) return FullArtistInfo.from_json(resp.json())
def get_playlist(session: Session, def get_playlist(session: Session,
@ -257,9 +262,12 @@ def prepare_track_path(path: Path, prepare_path: bool,
track: BasicTrackInfo) -> Path: track: BasicTrackInfo) -> Path:
path_str = str(path) path_str = str(path)
repl_dict = { repl_dict = {
'#album-artist': track.album.artists[0].name,
'#artist-id': track.artists[0].id,
'#album-id': track.album.id,
'#track-id': track.id,
'#number': track.number, '#number': track.number,
'#artist': track.artists[0], '#artist': track.artists[0].name,
'#album-artist': track.album.artists[0],
'#title': track.title, '#title': track.title,
'#album': track.album.title, '#album': track.album.title,
'#year': track.album.year '#year': track.album.year
@ -285,8 +293,8 @@ def set_id3_tags(path: Path, track: BasicTrackInfo, lyrics: Optional[str],
tag = audiofile.initTag() tag = audiofile.initTag()
tag.artist = chr(0).join(track.artists) tag.artist = chr(0).join(a.name for a in track.artists)
tag.album_artist = track.album.artists[0] tag.album_artist = track.album.artists[0].name
tag.album = track.album.title tag.album = track.album.title
tag.title = track.title tag.title = track.title
tag.track_num = track.number tag.track_num = track.number
@ -372,14 +380,14 @@ if __name__ == '__main__':
metavar='<Папка>', metavar='<Папка>',
help=help_str('Папка для загрузки музыки'), help=help_str('Папка для загрузки музыки'),
type=Path) type=Path)
path_group.add_argument('--path-pattern', path_group.add_argument(
'--path-pattern',
default=DEFAULT_PATH_PATTERN, default=DEFAULT_PATH_PATTERN,
metavar='<Паттерн>', metavar='<Паттерн>',
type=Path, type=Path,
help=help_str( help=help_str('Поддерживает следующие заполнители:'
'Поддерживает следующие заполнители:'
' #number, #artist, #album-artist, #title,' ' #number, #artist, #album-artist, #title,'
' #album, #year')) ' #album, #year, #artist-id, #album-id, #track-id'))
auth_group = parser.add_argument_group('Авторизация') auth_group = parser.add_argument_group('Авторизация')
auth_group.add_argument('--session-id', auth_group.add_argument('--session-id',