llistochek / yandex-music-downloader

Загрузчик музыки с сервиса Яндекс.Музыка
MIT License
163 stars 20 forks source link

Добавить флаг --skip-broken для пропуска недоступных частей или частей с ошибками. #50

Closed voronind-com closed 2 months ago

voronind-com commented 2 months ago

Добавляет флаг --skip-broken, который игнорирует либо часть (текст или обложка) или песню в альбоме/плейлисте целиком. При этом ошибка выводится пользователю.

Протестировал на своём плейлисте с 3к песен, где было несколько "сломанных" песен. Сломанная - с ошибками Json на бекенде.

voronind-com commented 2 months ago

Сейчас в логе это выглядит так:

Jun 27 22:49:54 home systemd[162177]: Starting Yandex Music Download....
Jun 27 22:50:00 home bash[1948591]: 22:50:00 |ERROR| yandex-music-downloader: Traceback (most recent call last):
Jun 27 22:50:00 home bash[1948591]:   File "/nix/store/336zlhcac5wq26g7ds3ziczxb6lzb4l8-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/ym_api/models.py", line 99, in from_json
Jun 27 22:50:00 home bash[1948591]:     if not data["available"]:
Jun 27 22:50:00 home bash[1948591]:            ~~~~^^^^^^^^^^^^^
Jun 27 22:50:00 home bash[1948591]: KeyError: 'available'
Jun 27 22:51:16 home bash[1948591]: 22:51:16 |ERROR| yandex-music-downloader: Traceback (most recent call last):
Jun 27 22:51:16 home bash[1948591]:   File "/nix/store/336zlhcac5wq26g7ds3ziczxb6lzb4l8-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/ym_api/models.py", line 152, in from_json
Jun 27 22:51:16 home bash[1948591]:     return cls(**base.__dict__, lyrics=lyrics)
Jun 27 22:51:16 home bash[1948591]:                  ^^^^^^^^^^^^^
Jun 27 22:51:16 home bash[1948591]: AttributeError: 'NoneType' object has no attribute '__dict__'
Jun 27 22:51:16 home bash[1948591]: 22:51:16 |ERROR| yandex-music-downloader: Не удалось загрузить текст песни: Traceback (most recent call last):
Jun 27 22:51:16 home bash[1948591]:   File "/nix/store/336zlhcac5wq26g7ds3ziczxb6lzb4l8-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/core.py", line 118, in download_track
Jun 27 22:51:16 home bash[1948591]:     lyrics = full_track.lyrics
Jun 27 22:51:16 home bash[1948591]:              ^^^^^^^^^^^^^^^^^
Jun 27 22:51:16 home bash[1948591]: AttributeError: 'NoneType' object has no attribute 'lyrics'

Планирую добавить также вывод того, что за песня отвалилась. Сегодня чуть позже добавлю.

voronind-com commented 2 months ago

Добавил комит 8266917793d17fd9dd020154bb5aabc44f88b129, в котором вывожу инфу по сломанному треку. Не уверен, что оно вообще нужно, и в нужном ли оно формате. Поэтому предлагаю обсудить, если что поправлю. Если всё ок, то к мержу готово.

Пример вывода:

Jun 28 00:09:29 home systemd[162177]: Starting Yandex Music Download....
Jun 28 00:09:34 home bash[2014051]: 00:09:34 |ERROR| yandex-music-downloader: Ошибка парсинга BasicTrackInfo: dict_items([('id', '52140954'), ('error', 'not-found')]). Traceback (most recent call last):
Jun 28 00:09:34 home bash[2014051]:   File "/nix/store/lfzr6mp0rqj0fahzynkm7g19aj46zqk0-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/ym_api/models.py", line 100, in from_json
Jun 28 00:09:34 home bash[2014051]:     if not data["available"]:
Jun 28 00:09:34 home bash[2014051]:            ~~~~^^^^^^^^^^^^^
Jun 28 00:09:34 home bash[2014051]: KeyError: 'available'

Jun 28 00:35:56 home bash[2036837]: 00:35:56 |ERROR| yandex-music-downloader: Не удалось загрузить текст песни: dict_items([('id', '83517740'), ('realId', '83517740'), ('title', 'Paparazzi'), ('contentWarning', 'explicit'), ('major', {'id': 595, 'name': 'UGC'}), ('available', True), ('availableForPremiumUsers', True), ('availableFullWithoutPermission', False), ('availableForOptions', ['bookmate']), ('disclaimers', ['explicit']), ('storageDir', ''), ('durationMs', 192350), ('fileSize', 0), ('r128', {'i': -8.18, 'tp': 1.23}), ('fade', {'inStart': 0, 'inStop': 5, 'outStart': 186, 'outStop': 191}), ('previewDurationMs', 30000), ('artists', [{'id': 10778919, 'name': 'Kim Dracula', 'various': False, 'composer': False, 'available': True, 'cover': {'type': 'from-album-cover', 'uri': 'avatars.yandex.net/get-music-content/5531900/91cbc2aa.a.21106180-1/%%', 'prefix': '91cbc2aa.a.21106180-1'}, 'genres': [], 'disclaimers': []}]), ('albums', [{'id': 15737409, 'title': 'Paparazzi', 'type': 'single', 'metaType': 'music', 'contentWarning': 'explicit', 'year': 2020, 'releaseDate': '2020-12-11T00:00:00+03:00', 'coverUri': 'avatars.yandex.net/get-music-content/4387391/d174394b.a.15737409-1/%%', 'ogImage': 'avatars.yandex.net/get-music-content/4387391/d174394b.a.15737409-1/%%', 'genre': 'alternative', 'trackCount': 1, 'likesCount': 964, 'recent': False, 'veryImportant': False, 'artists': [{'id': 10778919, 'name': 'Kim Dracula', 'various': False, 'composer': False, 'available': True, 'cover': {'type': 'from-album-cover', 'uri': 'avatars.yandex.net/get-music-content/5531900/91cbc2aa.a.21106180-1/%%', 'prefix': '91cbc2aa.a.21106180-1'}, 'genres': [], 'disclaimers': []}], 'labels': [{'id': 3439802, 'name': 'Order of the Snake'}], 'available': True, 'availableForPremiumUsers': True, 'availableForOptions': ['bookmate'], 'availableForMobile': True, 'availablePartially': False, 'bests': [], 'disclaimers': ['explicit'], 'trackPosition': {'volume': 1, 'index': 1}}]), ('coverUri', 'avatars.yandex.net/get-music-content/4387391/d174394b.a.15737409-1/%%'), ('derivedColors', {'average': '#412f4e', 'waveText': '#e4c1ff', 'miniPlayer': '#b9a6c8', 'accent': '#9c80b1'}), ('ogImage', 'avatars.yandex.net/get-music-content/4387391/d174394b.a.15737409-1/%%'), ('lyricsAvailable', True), ('type', 'music'), ('rememberPosition', False), ('trackSharingFlag', 'COVER_ONLY'), ('lyricsInfo', {'hasAvailableSyncLyrics': True, 'hasAvailableTextLyrics': True}), ('trackSource', 'OWN_REPLACED_TO_UGC'), ('specialAudioResources', ['smart_preview']), ('prefix', '')]). Traceback (most recent call last):
Jun 28 00:35:56 home bash[2036837]:   File "/nix/store/zwxfdcimd679h37j4j54kajhmnpjy9cx-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/core.py", line 118, in download_track
Jun 28 00:35:56 home bash[2036837]:     lyrics = full_track.lyrics
Jun 28 00:35:56 home bash[2036837]:              ^^^^^^^^^^^^^^^^^
Jun 28 00:35:56 home bash[2036837]: AttributeError: 'NoneType' object has no attribute 'lyrics'

Его надо бы фиксапнуть не забыть, чтобы не было ревизии с багом. Там забыл args для skip_broken в первом комите и добавил только во втором.

voronind-com commented 2 months ago

Возможно, стоит добавить некоторые http ошибки помимо парсинга? У меня возникала 403, например.

voronind-com commented 2 months ago

Хотя некоторые track.values() получаются огромные. Может спрятать их за --debug?

llistochek commented 2 months ago

Спасибо за pull request. К сожалению, я не буду его мержить. Мое решение (08ea384869cbc31efb1e78b831e2356882219951) мне кажется более лаконичным.