diff --git a/README.md b/README.md index 7cb5670..71f48d2 100644 --- a/README.md +++ b/README.md @@ -109,8 +109,8 @@ ID: --path-pattern <Паттерн> Поддерживает следующие заполнители: #number, #artist, #album-artist, #title, #album, #year, #artist-id, - #album-id, #track-id (по умолчанию: #album- - artist/#album/#number - #title) + #album-id, #track-id, #track-number (по умолчанию: + #album-artist/#album/#number - #title) Авторизация: --browser BROWSER Браузер из которого будут извлечены данные для diff --git a/ymd/cli.py b/ymd/cli.py index d64ed88..af662c2 100644 --- a/ymd/cli.py +++ b/ymd/cli.py @@ -230,7 +230,12 @@ def main(): print(album.title) result_tracks = album.tracks 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: result_tracks = api.get_playlist(session, args.playlist_id) diff --git a/ymd/core.py b/ymd/core.py index fe538f6..71bcf39 100644 --- a/ymd/core.py +++ b/ymd/core.py @@ -109,7 +109,8 @@ def download_track( lyrics = track.lyrics else: 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_url = track.cover_info.cover_url(cover_resolution) diff --git a/ymd/ym_api/api.py b/ymd/ym_api/api.py index 4c51ce0..88f9d11 100644 --- a/ymd/ym_api/api.py +++ b/ymd/ym_api/api.py @@ -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}" -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"} resp = session.get("https://music.yandex.ru/handlers/track.jsx", params=params) return FullTrackInfo.from_json(resp.json()) diff --git a/ymd/ym_api/models.py b/ymd/ym_api/models.py index b8a0ddd..6ed56c6 100644 --- a/ymd/ym_api/models.py +++ b/ymd/ym_api/models.py @@ -92,7 +92,7 @@ class BasicTrackInfo: @classmethod def from_json(cls, data: dict) -> Optional["BasicTrackInfo"]: - if not data["available"]: + if not data.get("available", False): return None track_id = str(data["id"]) title = parse_title(data) @@ -138,8 +138,10 @@ class FullTrackInfo(BasicTrackInfo): lyrics: str @classmethod - def from_json(cls, data: dict) -> "FullTrackInfo": + def from_json(cls, data: dict) -> Optional["FullTrackInfo"]: base = BasicTrackInfo.from_json(data["track"]) + if base is None: + return None lyrics = data["lyric"][0]["fullLyrics"] return cls(**base.__dict__, lyrics=lyrics)