Обработка отсутствия данных о треке

This commit is contained in:
Lev Plyusnin 2024-06-30 09:18:10 +07:00
parent 184d1d1aeb
commit 08ea384869
No known key found for this signature in database
GPG key ID: 21C6C2C9C0A4460D
5 changed files with 15 additions and 7 deletions

View file

@ -109,8 +109,8 @@ ID:
--path-pattern <Паттерн> --path-pattern <Паттерн>
Поддерживает следующие заполнители: #number, #artist, Поддерживает следующие заполнители: #number, #artist,
#album-artist, #title, #album, #year, #artist-id, #album-artist, #title, #album, #year, #artist-id,
#album-id, #track-id (по умолчанию: #album- #album-id, #track-id, #track-number (по умолчанию:
artist/#album/#number - #title) #album-artist/#album/#number - #title)
Авторизация: Авторизация:
--browser BROWSER Браузер из которого будут извлечены данные для --browser BROWSER Браузер из которого будут извлечены данные для

View file

@ -230,7 +230,12 @@ def main():
print(album.title) print(album.title)
result_tracks = album.tracks result_tracks = album.tracks
elif args.track_id is not None: elif args.track_id is not None:
result_tracks = [api.get_full_track_info(session, args.track_id)] track = api.get_full_track_info(session, args.track_id)
if track is not None:
result_tracks = [track]
else:
logger.info("Трек не доступен для скачивания")
return 1
elif args.playlist_id is not None: elif args.playlist_id is not None:
result_tracks = api.get_playlist(session, args.playlist_id) result_tracks = api.get_playlist(session, args.playlist_id)

View file

@ -109,7 +109,8 @@ def download_track(
lyrics = track.lyrics lyrics = track.lyrics
else: else:
full_track = api.get_full_track_info(session, track.id) full_track = api.get_full_track_info(session, track.id)
lyrics = full_track.lyrics if full_track is not None:
lyrics = full_track.lyrics
cover = None cover = None
cover_url = track.cover_info.cover_url(cover_resolution) cover_url = track.cover_info.cover_url(cover_resolution)

View file

@ -27,7 +27,7 @@ def get_track_download_url(session: Session, track: BasicTrackInfo, hq: bool) ->
return f"https://{host}/get-mp3/{path_hash}/{ts}/{path}?track-id={track.id}" return f"https://{host}/get-mp3/{path_hash}/{ts}/{path}?track-id={track.id}"
def get_full_track_info(session: Session, track_id: str) -> FullTrackInfo: def get_full_track_info(session: Session, track_id: str) -> Optional[FullTrackInfo]:
params = {"track": track_id, "lang": "ru"} params = {"track": track_id, "lang": "ru"}
resp = session.get("https://music.yandex.ru/handlers/track.jsx", params=params) resp = session.get("https://music.yandex.ru/handlers/track.jsx", params=params)
return FullTrackInfo.from_json(resp.json()) return FullTrackInfo.from_json(resp.json())

View file

@ -92,7 +92,7 @@ class BasicTrackInfo:
@classmethod @classmethod
def from_json(cls, data: dict) -> Optional["BasicTrackInfo"]: def from_json(cls, data: dict) -> Optional["BasicTrackInfo"]:
if not data["available"]: if not data.get("available", False):
return None return None
track_id = str(data["id"]) track_id = str(data["id"])
title = parse_title(data) title = parse_title(data)
@ -138,8 +138,10 @@ class FullTrackInfo(BasicTrackInfo):
lyrics: str lyrics: str
@classmethod @classmethod
def from_json(cls, data: dict) -> "FullTrackInfo": def from_json(cls, data: dict) -> Optional["FullTrackInfo"]:
base = BasicTrackInfo.from_json(data["track"]) base = BasicTrackInfo.from_json(data["track"])
if base is None:
return None
lyrics = data["lyric"][0]["fullLyrics"] lyrics = data["lyric"][0]["fullLyrics"]
return cls(**base.__dict__, lyrics=lyrics) return cls(**base.__dict__, lyrics=lyrics)