Giter VIP home page Giter VIP logo

yandex-music-downloader's Introduction

yandex-music-downloader

Содержание

  1. О программе
  2. Установка
  3. Получение данных для авторизации
  4. Примеры использования
  5. Использование
  6. Что делать при ошибке 400?
  7. Спасибо
  8. Дисклеймер

О программе

Загрузчик, созданный вследствие наличия фатального недостатка в проекте yandex-music-download.

Возможности

  • Возможность загрузки:
    • Всех треков исполнителя
    • Всех треков из альбома
    • Всех треков из плейлиста
    • Отдельного трека
  • Загрузка всех метаданных трека/альбома:
    • Номер трека
    • Номер диска
    • Название трека
    • Исполнитель
    • Дополнительные исполнители
    • Год выпуска альбома
    • Обложка альбома
    • Название альбома
    • Текст песни (при использовании флага --add-lyrics)
  • Поддержка паттерна для пути сохранения музыки

Установка

Для запуска скрипта требуется Python 3.9+

pip install git+https://github.com/llistochek/yandex-music-downloader
yandex-music-downloader --help

Получение данных для авторизации

  1. Войдите в свой Яндекс аккаунт.
  2. Передайте название вашего браузера в качестве аргумента --browser

Если программа выдает ошибку при загрузке cookies - укажите путь к файлу с cookies в качестве аргумента --cookies-path. Информацию о расположении данного файла для вашего браузера вы можете найти в интернете. Если что-то не получается - откройте issue.

Примеры использования

Во всех примерах замените <браузер> на название своего браузера (для получения допустимых значений запустите программу с флагом --help)

Скачать все треки Twenty One Pilots в высоком качестве

yandex-music-downloader --browser "<браузер>" --hq --url "https://music.yandex.ru/artist/792433"

Скачать альбом Nevermind в высоком качестве, загружая тексты песен

yandex-music-downloader --browser "<браузер>" --hq --add-lyrics --url "https://music.yandex.ru/album/294912"

Скачать трек Seven Nation Army

yandex-music-downloader --browser "<браузер>" --url "https://music.yandex.ru/album/11644078/track/6705392"

Использование

usage: yandex-music-downloader [-h] [--hq] [--skip-existing] [--add-lyrics]
                               [--embed-cover]
                               [--cover-resolution <Разрешение обложки>]
                               [--delay <Задержка>] [--stick-to-artist]
                               [--only-music]
                               (--artist-id <ID исполнителя> | --album-id <ID альбома> | --track-id <ID трека> | --playlist-id <владелец плейлиста>/<тип плейлиста> | -u URL)
                               [--unsafe-path] [--dir <Папка>]
                               [--path-pattern <Паттерн>] --browser BROWSER
                               [--cookies-path COOKIES_PATH]
                               [--user-agent <User-Agent>]

Загрузчик музыки с сервиса Яндекс.Музыка

options:
  -h, --help            show this help message and exit

Общие параметры:
  --hq                  Загружать треки в высоком качестве
  --skip-existing       Пропускать уже загруженные треки
  --add-lyrics          Загружать тексты песен
  --embed-cover         Встраивать обложку в .mp3 файл
  --cover-resolution <Разрешение обложки>
                        по умолчанию: 400
  --delay <Задержка>    Задержка между запросами, в секундах (по умолчанию: 3)
  --stick-to-artist     Загружать альбомы, созданные только данным
                        исполнителем
  --only-music          Загружать только музыкальные альбомы (пропускать
                        подкасты и аудиокниги)

ID:
  --artist-id <ID исполнителя>
  --album-id <ID альбома>
  --track-id <ID трека>
  --playlist-id <владелец плейлиста>/<тип плейлиста>
  -u URL, --url URL     URL исполнителя/альбома/трека/плейлиста

Указание пути:
  --unsafe-path         Не очищать путь от недопустимых символов
  --dir <Папка>         Папка для загрузки музыки (по умолчанию: .)
  --path-pattern <Паттерн>
                        Поддерживает следующие заполнители: #number, #artist,
                        #album-artist, #title, #album, #year, #artist-id,
                        #album-id, #track-id, #track-number (по умолчанию:
                        #album-artist/#album/#number - #title)

Авторизация:
  --browser BROWSER     Браузер из которого будут извлечены данные для
                        авторизации. Укажите браузер через который вы входили
                        в Яндекс Музыку. Допустимые значения: chrome, opera,
                        opera_gx, firefox, edge, safari, chromium, vivaldi,
                        librewolf
  --cookies-path COOKIES_PATH
                        Путь к файлу с cookies. Используйте если возникает
                        ошибка получения cookies
  --user-agent <User-Agent>
                        по умолчанию: Mozilla/5.0 (X11; Linux x86_64)
                        AppleWebKit/537.36 (KHTML, like Gecko)
                        Chrome/106.0.0.0 Safari/537.36

Ошибка 400

Ниже приведена инструкция по устранению ошибки 400.

  1. Перейдите на сайт Яндекс.Музыки
  2. Прорешайте капчу
  3. Готово, теперь вы можете скачивать треки без ошибок

Если проблема сохраняется - откройте issue.

Спасибо

Разработчикам проекта yandex-music-download. Оттуда был взят код хэширования.

Дисклеймер

Данный проект является независимой разработкой и никак не связан с компанией Яндекс.

yandex-music-downloader's People

Contributors

llistochek avatar magm1go avatar mrpixelcat avatar pasharet avatar zazaqoo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

yandex-music-downloader's Issues

Бинарники

Было бы круто, организовать бинарники в Release :-)

linux: pyinstaller --onefile /folder/to/yandex-music-downloader/main.py
windows: pyinstaller --onefile --icon="folder\to\icon\yadownload.ico" folder\to\yandex-music-downloader-main\main.py

собрано: 03470a7
yadownload_win_x64.zip
yadownload_linux_x64.gz
yadownload_linux_x64_musl.gz
yadownload_linux_armv7l.gz

Issue без смысловой нагрузки, можно и закрыть.

Ошибка при загрузке треков

Добрый день. После обновления (где нужно вместо id сессии указывать имя браузера) не могу настроить программу на скачивание треков.

Я использую яндекс браузер. Как я понимаю для него нужно указывать --browser chromium. Загрузка не заработала.
Пробовал указать куки (использовал этот аддон для их получения https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc?pli=1 )

Итоговая команда получилась такая
yandex-music-downloader --hq --skip-existing --embed-cover --cover-resolution 1000 --dir /srv/mergerfs/Music/music --browser chromium --cookies-path /srv/config/cookies.txt --url "https://music.yandex.ru/users/Druidblack/playlists/3"

Что нужно еще настроить, что бы работало как и раньше.
Безымянный

list index out of range

При попытке скачать плейлист "Мне нравится" получаю ошибку:

Traceback (most recent call last):
  File "C:\Users\misha\Desktop\yandex-music-downloader-main\main.py", line 395, in <module>
    result_tracks = get_playlist(session, args.playlist_id)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\misha\Desktop\yandex-music-downloader-main\main.py", line 237, in get_playlist
    tracks = [t for t in tracks if t is not None]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\misha\Desktop\yandex-music-downloader-main\main.py", line 237, in <listcomp>
    tracks = [t for t in tracks if t is not None]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\misha\Desktop\yandex-music-downloader-main\main.py", line 112, in from_json
    album_data = data['albums'][0]
                 ~~~~~~~~~~~~~~^^^
IndexError: list index out of range

У меня Python 3.11 если что.

Проблемы с загрузкой исполнителей с большим количеством альбомов

У некоторых исполнителей очень много альбомов, например у этого: https://music.yandex.ru/artist/84210
Загрузить треки такого исполнителя очень сложно, потому что скрипт вначале пытается считать информацию по всем альбомам, и только потом начинает загружать треки. Но если при считывании информации по альбомам произошла ошибка, то и скрипт прекращает работу; когда альбомов так много, то вероятность такого сбоя велика.

Может быть немного поменять логику работы скрипта?
Пусть он загрузит данные по одному альбому, потом загрузит треки альбома, потом будет обрабатывать следующий альбом?

Не работает пример запуска из Readme

Windows 10, при запуске команды в cmd:

C:\Users\1>"E:\Scripts\yandex_music_downloader\Scripts\python.exe" "E:\Scripts\yandex_music_downloader\main.py" --session-id "ХХХХХХ" --url "https://music.yandex.ru/album/11644078/track/6705392" --log-level DEBUG

Выдаёт такую ошибку:

22:52:57 |DEBUG| Starting new HTTPS connection (1): music.yandex.ru:443
22:52:58 |DEBUG| https://music.yandex.ru:443 "GET /handlers/track.jsx?track=6705392&lang=ru HTTP/1.1" 400 5678
Traceback (most recent call last):
  File "E:\Scripts\yandex_music_downloader\Lib\site-packages\requests\models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\Users\1\AppData\Local\Programs\Python\Python311\Lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\Users\1\AppData\Local\Programs\Python\Python311\Lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\Users\1\AppData\Local\Programs\Python\Python311\Lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:\Scripts\yandex_music_downloader\main.py", line 447, in <module>
    result_tracks = [get_full_track_info(session, args.track_id)]
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\Scripts\yandex_music_downloader\main.py", line 227, in get_full_track_info
    return FullTrackInfo.from_json(resp.json())
                                   ^^^^^^^^^^^
  File "E:\Scripts\yandex_music_downloader\Lib\site-packages\requests\models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Куки spravka отсутствует на сайте

Проверял в нескольких браузерах, куки spravka не предоставляется. Если убрать её из скрипта, то скрипт в целом работает, пока не упирается в капчу.

Проблема с записью тэгов

Пробовал на двух альбомах

сначала на этом: https://music.yandex.com/album/7489514 . думал что проблема с кавычкой в названии артиста, но потом попробовал на этом: https://music.yandex.com/album/13072859 проблема всё такая же.

python3 main.py --add-lyrics --embed-cover --session-id '...' --url "https://music.yandex.com/album/7489514" --log-level DEBUG

22:29:21 |DEBUG| https://storage.mds.yandex.net:443 "GET /file-download-info/1543886_1ba59cd2.78433757.5.52888864/preview?sign=5a50b66658a6870cc4e09e4db2ac845501882800d863d6e59b92993b9cee1140&ts=647f96da HTTP/1.1" 401 574
Traceback (most recent call last):
  File "/home/grbit/ssd/git/yandex-music-downloader/main.py", line 465, in <module>
    url = get_track_download_url(session, track, args.hq)
  File "/home/grbit/ssd/git/yandex-music-downloader/main.py", line 201, in get_track_download_url
    url_info = ET.fromstring(resp.text)
  File "/usr/lib/python3.9/xml/etree/ElementTree.py", line 1347, in XML
    parser.feed(text)
xml.etree.ElementTree.ParseError: mismatched tag: line 6, column 2

Есть идеи в чём может быть проблема?

[V2] Будущее проекта

На Яндексе размещены далеко не все нужные мне треки. В связи с этим я планирую сделать из данного проекта универсальный загрузчик музыки.

Задачи

  • Реструктуризация проекта
  • Встроенное распознавание капчи (ручное/с помощью сервисов автоматического распознавания)

После реализации поставленных задач данный проект будет переименован в universal-music-downloader и получит версию 2.0.0. Затем будет реализована загрузка музыки с сервисов, перечисленных ниже.

Новые сервисы

  • ВКонтакте
  • YouTube
  • Telegram

МнеНравится

Дефолтный плейлист "Мне нравится" не возвращает набор треков в ответе. Необходимо сделать проверку наличия треков.

Не запускается

Привет, не удается запустить, ругается на синтаксис:
E:\temp\Download_ym\yandex-music-downloader>python main.py --session-id "3:1669460013.5.0.1665941275674:1E5Isg:2f.1.2:1|10853484.0.2|3:10261727.163411.LJ_CY9XugF56LM63lMRuQdZCqnc" --hq --dir "/music/BFG" --path-pattern "#artist - #title" --user-agent "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.88 Safari/537.36" --url "https://music.yandex.ru/users/spownc/playlists/1055" --playlist-id "https://music.yandex.ru/users/spownc/playlists/1055" File "main.py", line 36 owner: str ^ SyntaxError: invalid syntax

Что я делаю не правильно?

Не загружает треки из созданных мною плейлистов

Проблема идентична -> #2
Программа прекрасно отрабатывает на альбомах, отдельных треках, плейлистах генерированных самой Яндекс.Музыкой, но не с моими плейлистами

Я пробую:
python3 main.py --session-id "3:1<...>Lc" --hq --skip-existing --embed-cover --strict-path --url "https://music.yandex.ru/users/nphne-jcskcdkb/playlists/104"

Я получаю:

Traceback (most recent call last):
  File "/home/gifi/yandex-music-downloader/main.py", line 341, in <module>
    result_tracks = get_playlist(session, args.playlist_id)
  File "/home/gifi/yandex-music-downloader/main.py", line 189, in get_playlist
    return [BasicTrackInfo.from_json(t) for t in raw_tracks]
  File "/home/gifi/yandex-music-downloader/main.py", line 189, in <listcomp>
    return [BasicTrackInfo.from_json(t) for t in raw_tracks]
  File "/home/gifi/yandex-music-downloader/main.py", line 73, in from_json
    album_json = json['albums'][0]
IndexError: list index out of range

Я ожидаю: нормальную работу программы

Проблема с загрузкой

Приветствую! ловлю ошибку при скачивании треков, есть подозрение что т.к недавно стало возможным загружать собственные треки на площадку - они также присутствуют в целевом плейлисте, натыкаясь на них скрипт ловит ошибку.

Traceback (most recent call last):
  File "/home/sergey/yandex_music_downloader/yandex-music-downloader/main.py", line 498, in <module>
    result_tracks = get_playlist(cached_session, args.playlist_id)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/sergey/yandex_music_downloader/yandex-music-downloader/main.py", line 265, in get_playlist
    tracks = [t for t in tracks if t is not None]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/sergey/yandex_music_downloader/yandex-music-downloader/main.py", line 265, in <listcomp>
    tracks = [t for t in tracks if t is not None]
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/sergey/yandex_music_downloader/yandex-music-downloader/main.py", line 149, in from_json
    has_lyrics = data['lyricsInfo']['hasAvailableTextLyrics']
                 ~~~~^^^^^^^^^^^^^^
KeyError: 'lyricsInfo'

Частая ошибка 400 (Session_id недостаточно?)

Здравствуйте. Заметил что очень быстро и часто появляется ошибка 400. Читал рекомендации, но ни капчи ни куки spravka нет.
Для себя ситуацию решил расширением cookies.txt и редактированием.
В core.py добавил:

import http
from requests.utils import cookiejar_from_dict, dict_from_cookiejar

В setup_session() добавил:

cookies = http.cookiejar.MozillaCookieJar()
cookies.load(filename='cookies.txt', ignore_expires=True)
session.cookies = cookiejar_from_dict(dict_from_cookiejar(cookies))

Теперь код 400 встречается не так часто а капча и spravka появляются.
Думаю с browser-cookie3 обновлять куки будет еще проще.

Очевидные вопросы

Загрузчик, созданный вследствие наличия фатального недостатка в проекте yandex-music-download.

  1. Какого именно недостатка?
  2. Почему нельзя было внести изменения в апстрим через PR?
  3. Почему проект не был переименован? Хотя бы в ymd.
  4. Почему нет на PyPI?
  5. Почему не использовал yandex-music-api?

Прошу ответить в закрывающем коммите с README.md или в FAQ.md
на важные по вашему мнению вопросы и на неважные здесь.

ошибка

C:\Users\User\Desktop>python -d ymd --hq --skip-existing --add-lyrics --embed-cover --url "https://music.yandex.kz/users/Dmitriyqazaq/playlists/3" --dir "C:/Users/User/Desktop/ymd/music" --browser chrome
Traceback (most recent call last):
File "", line 198, in _run_module_as_main
File "", line 88, in run_code
File "C:\Users\User\Desktop\ymd_main
.py", line 3, in
from .cli import main
ImportError: attempted relative import with no known parent package

KeyError: 'available' при попытке загрузить "Мне нравится".

Всё грузит ок если укажу, например, альбом. Но при попытке грузить мои понравившиеся, получаю воть:

Jun 27 03:21:34 home systemd[162177]: Starting Yandex Music Download....
Jun 27 03:21:39 home bash[424139]: Traceback (most recent call last):
Jun 27 03:21:39 home bash[424139]:   File "/nix/store/32mbbfvmnixycz3lr2s7abq3m8nx43sv-python3.11-yandex-music-downloader-1.0.0/bin/.yandex-music-downloader-wrapped", line 9, in <module>
Jun 27 03:21:39 home bash[424139]:     sys.exit(main())
Jun 27 03:21:39 home bash[424139]:              ^^^^^^
Jun 27 03:21:39 home bash[424139]:   File "/nix/store/32mbbfvmnixycz3lr2s7abq3m8nx43sv-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/cli.py", line 235, in main
Jun 27 03:21:39 home bash[424139]:     result_tracks = api.get_playlist(session, args.playlist_id)
Jun 27 03:21:39 home bash[424139]:                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Jun 27 03:21:39 home bash[424139]:   File "/nix/store/32mbbfvmnixycz3lr2s7abq3m8nx43sv-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/ym_api/api.py", line 53, in get_playlist
Jun 27 03:21:39 home bash[424139]:     tracks = [t for t in tracks if t is not None]
Jun 27 03:21:39 home bash[424139]:              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Jun 27 03:21:39 home bash[424139]:   File "/nix/store/32mbbfvmnixycz3lr2s7abq3m8nx43sv-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/ym_api/api.py", line 53, in <listcomp>
Jun 27 03:21:39 home bash[424139]:     tracks = [t for t in tracks if t is not None]
Jun 27 03:21:39 home bash[424139]:              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Jun 27 03:21:39 home bash[424139]:   File "/nix/store/32mbbfvmnixycz3lr2s7abq3m8nx43sv-python3.11-yandex-music-downloader-1.0.0/lib/python3.11/site-packages/ymd/ym_api/models.py", line 95, in from_json
Jun 27 03:21:39 home bash[424139]:     if not data["available"]:
Jun 27 03:21:39 home bash[424139]:            ~~~~^^^^^^^^^^^^^
Jun 27 03:21:39 home bash[424139]: KeyError: 'available'
Jun 27 03:21:39 home systemd[162177]: Finished Yandex Music Download..

Версия с мастера последняя.

${package}/bin/yandex-music-downloader --browser "firefox" --hq --add-lyrics --embed-cover --skip-existing --stick-to-artist --only-music --path-pattern "${pattern}" --url https://music.yandex.ru/users/cakee.ru/playlists/3

Длительность трека 30 секунд

macOS 12.7.5
Safari 17.5 (17618.2.12.111.5, 17618)

скачивались все треки из указанного плейлиста, но каждый длительностью 30 секунд.
ошибок не было, оказалось, что нет доступа к файлу с куками.

в указанной версии macOS "/Library/Cookies/Cookies.binarycookies" пустой, теперь куки хранятся в "/Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies" либо "~/Library/Containers/com.apple.Safari/Data/Library/WebKit/WebsiteDataStore/%ID%/Cookies/Cookies.binarycookies".

Добавив эти пути в список safari_cookies ~1025 строка файла ~/.venv/lib/python3.12/site-packages/browser_cookie3/init.py треки стали загружаться целиком.

Фильтрация символов в имени файла

При скачивании треков, у которых в названии есть символы запрещенные windows для использования в имени файлов выдает ошибку

21:21:55 |INFO| Загружается Within Temptation\Hydra (Deluxe Edition)\4 - Paradise (What About Us?) (feat. Tarja).mp3
Traceback (most recent call last):
File "C:\Users\Admin\Documents\yandex-music-downloader\main.py", line 416, in
download_file(session, url, save_path)
File "C:\Users\Admin\Documents\yandex-music-downloader\main.py", line 194, in download_file
with open(path, 'wb') as f:
^^^^^^^^^^^^^^^^
OSError: [Errno 22] Invalid argument: 'Within Temptation\Hydra (Deluxe Edition)\4 - Paradise (What About Us?) (feat. Tarja).mp3'

Как я понимаю, функция prepare_track_path на 245 строке должна, в том числе, избавляться от этих символов, но не отрабатывает корректно.(257 и 258 строки по вопросом)

Ошибка при сохранении трека со спец. символами

При сохранение файла по маске "#artist - #title #track-id" выдает ошибку:

File "D:\yandex-music-downloader\ymd\http_utils.py", line 8, in download_file
    with open(path, 'wb') as f:

OSError: [Errno 22] Invalid argument: 'C:\\Music\\James Brown - The Boss (From "Black Caesar" Soundtrack) 53847.mp3'

Дело в кавычках в названии трека.

Можно добавить стрипинг спец. символов из путей к файлу, которые создает непосредственно библиотека.
Вот здесь список таких символов для Windows.
Тут более полный список для всего остального.

Для себя решил заменить название трека на его id.

OS: Windows 10
Python 3.10.11

Параметер url указан в неверном формате

Брал URL из примера
Постоянно получаю ошибку "Параметер url указан в неверном формате"
Как починить?
И ещё вопрос: не уверен, что я правильно копирую куку, у меня длина значения Session_id - 161 символ.
Если я полностью вбиваю это значение в --session-id
то получаю ошибку "Синтаксическая ошибка в имени файла, имени папки или метке тома."
Взял последние 28 знаков, но подозреваю, что это нправильно (основывался на знаении sessionid2, где первые 134 символа совпадают, а дальше идёт отличие).
Команда, например, такая (на Windows 10):
python main.py --session-id 'QDpoUP5X4bL9Lrxyk8neDxxxxxx' --hq --add-lyrics --url 'https://music.yandex.ru/artist/792433'

Не скачиваются плейлисты

Трек из примера использования скачивается, плейлисты нет.
OS: Android 12 с Termux (без рута)

~ $ python --version
Python 3.11.1
~ $ python yandex-music-downloader/main.py --session-id "Yvxxxxxxxxxxxxxxxxxxxx" --url "https://music.yandex.ru/users/xxxxxxxxxxxx/playlists/1003"
Traceback (most recent call last):
  File "/data/data/com.termux/files/home/yandex-music-downloader/main.py", line 386, in <module>
    result_tracks = get_playlist(session, args.playlist_id)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/data/data/com.termux/files/home/yandex-music-downloader/main.py", line 226, in get_playlist
    raw_tracks = resp.json()['playlist'].get('tracks', [])
                 ~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 'playlist'
~ $

Добавление прогресса

Добавление номера загружаемого трека и индикатора прогресса было бы полезным улучшением.

Обновить readme.md

По доке из текущего ридми появляются ошибки:

yandex-music-downloader --session-id="123" -u="https://music.yandex.ru/users/whalemare/playlists/1038" 
usage: yandex-music-downloader [-h] [--hq] [--skip-existing] [--add-lyrics] [--embed-cover]
                               [--cover-resolution <Разрешение обложки>] [--delay <Задержка>] [--stick-to-artist] [--only-music]
                               [--enable-caching]
                               (--artist-id <ID исполнителя> | --album-id <ID альбома> | --track-id <ID трека> | --playlist-id <владелец плейлиста>/<тип плейлиста> | -u URL)
                               [--unsafe-path] [--dir <Папка>] [--path-pattern <Паттерн>] --session-id <ID сессии>
                               [--user-agent <User-Agent>]
yandex-music-downloader: error: one of the arguments --artist-id --album-id --track-id --playlist-id -u/--url is required

Надо вызвать с такой последовательностью аргументов:

yandex-music-downloader -u="https://music.yandex.ru/users/whalemare/playlists/1038" --session-id="123"

Загружаются не все треки

Аргументы запуска:

yandex-music-downloader \
    --session-id "session_id_string" \
    --only-music \
    --hq \
    --skip-existing \
    --embed-cover \
    --url "$1" \
    --dir "/Users/Username/Downloads/yandex-music-backup/Playlist" \
    --path-pattern "#title - #artist"

Дальше запускаю с ссылкой на плейлист:

dl.sh https://music.yandex.ru/users/username/playlists/9898

В стдаут пишет:

Треков: 78
  • Я зашел в плейлист, посчитал, их действительно 78 если исключить те, которые недоступны (но отображаются в интерфейсе)
  • По завершению загрузки, я посчитал количество выводов Загружается .......mp3 в консоли и их тоже 78, то есть загрузка инициировалась честных 78 раз, как и показал счетчик вначале

Но по факту в итоговой директори:

image

Есть идеи почему не загрузились 22 трека? Никаких ошибок в процессе работы скрипта не было.

MacOS + Yandex Browser. Ошибка "Не удалось получить cookies для браузера"

Добрый вечер!
На MacOS пытаюсь запустить скрипт. Ни один из подходящих вариантов значения ключа --browser не помогают.
Указал прямой путь к файлу /Users/user/Library/Application Support/Yandex/YandexBrowser/Default/Cookies, попробовал подходящие варианты ключа --browser: chrome, chromium, opera. Всегда одна и та же ошибка.
Можно ли вернуть обратно возможность авторизоваться через --session-id? Или какую-то подсказку, какая комбинация ключей нужна имеен для Yandex Browser? Или явно указать, что этот браузер пока не поддерживается.

Спасибо!

Автор, спасибо за замечательный инструмент! Хоть какой-то заменитель Яндекс. Музыки, когда едешь туда, где нет интернета.

Код ошибки: 400

Довольно много пользователей сообщает об ошибке 400: #23, #16, #14.

Данная ошибка возникает при большом количестве автоматизированных запросов. Вместе с кодом ошибки возвращается капча, при решении которой пользователь получает куки spravka - "справку" о том, что он не робот. Стоит добавить в скрипт возможность прорешивания этой капчи.

KeyError: 'year'

При попытке скачать свой основной плейлист получаю вот это:

File "/home/***/yamusic/yandex-music-downloader/main.py", line 78, in from_json
return BasicAlbumInfo(id=json['id'], title=title, year=json['year'],
KeyError: 'year'

Некоторые остальные плейлисты тоже не скачивает, самый крохотный удалось скачать.

yandex-music-downloader: command not found

После применения команды установки вроде все проходит успешно:
pip install git+https://github.com/llistochek/yandex-music-downloader
Defaulting to user installation because normal site-packages is not writeable
Collecting git+https://github.com/llistochek/yandex-music-downloader
Cloning https://github.com/llistochek/yandex-music-downloader to /tmp/pip-req-build-60zgmhl9
Running command git clone --filter=blob:none --quiet https://github.com/llistochek/yandex-music-downloader /tmp/pip-req-build-60zgmhl9
Resolved https://github.com/llistochek/yandex-music-downloader to commit 45855a7
Installing build dependencies ... done
Getting requirements to build wheel ... done
Installing backend dependencies ... done
Preparing metadata (pyproject.toml) ... done

но при попытке запуска получаю:
yandex-music-downloader: command not found

Проверил на двух машинах. На обоих Python 3.10.12. Пользовался утилитой год назад, тогда работало.

IndexError: list index out of range

Сижу с мака и пытаюсь скачать музыку, но получил такую ошибку. В плейлисте есть песни загруженные через веб версию (те их нет в самом яндексе) и также песни которые были заблокированы

Traceback (most recent call last):
  File "/Users/artembay/Desktop/YandexMusic_downloader/main.py", line 68, in <module>
    f'{"".join([x if x.isalnum() or x in chars else "" for x in track.get("artists")[0]["name"]])} - ' \

Также прилагаю скриншот с полной ошибкой
image

Не работает --skip-existing

yandex-music-downloader --hq --embed-cover --delay "8" --only-music --playlist-id "myname/3" --dir "F:\music\yandex-music" --path-pattern "#artist - #title" --session-id "myid"

через некоторое время ловлю ошибку 400, жду N кол-во времени и перезапускаю скрипт, музыка качается заново и падает на одном и том же месте видимо из-за большого кол-ва запросов.

проблема: при попытке использовать параметр --skip-existing я получаю кол-во треков и на этом всё.

Предложение - добавить ссылку на трек в тег URL

На мой взгляд, если скрипт будет сохранять в теге URL ссылку на трек в Яндекс.Музыке, это будет удобно.

Также есть просьба добавить заполнители (placeholder) #track_id, #album_id, #artist_id, чтобы их можно было использовать для указания подкаталога/файла.

No module named 'ymd'

C:\Users*\Desktop\yandex-music-downloader-main\ymd>main.py
Traceback (most recent call last):
File "C:\Users*
\Desktop\yandex-music-downloader-main\ymd_main_.py", line 3, in
from cli import main
File "C:\Users****\Desktop\yandex-music-downloader-main\ymd\cli.py", line 16, in
from ymd import core
ModuleNotFoundError: No module named 'ymd'

Скрипт игнорирует год альбома

Скрипт не указывает год альбома в заполнителе #year и не сохраняет год альбома в id3 трека.
При этом Яндекс.Музыка эти данные отдает.
Вот пример на альбоме Чижа:

12:02:23 |DEBUG| Starting new HTTPS connection (1): music.yandex.ru:443
12:02:23 |DEBUG| https://music.yandex.ru:443 "GET /handlers/album.jsx?album=22517842&lang=ru HTTP/1.1" 200 None
12:02:23 |DEBUG| {"id":22517842,"title":"Live","metaType":"music","version":"Live","contentWarning":"explicit","year":1994,"releaseDate":"1994-01-01T00:00:00+03:00",...cut...
12:02:28 |INFO| Live (Live)
12:02:28 |INFO| Треков: 9
12:02:28 |DEBUG| https://music.yandex.ru:443 "GET /api/v2.1/handlers/track/17887573:22517842/web-album_track-track-track-main/download/m?hq=1 HTTP/1.1" 200 None
12:02:28 |DEBUG| {"codec":"mp3","bitrate":320,"src":"//storage.mds.yandex.net/file-download-info/.../320?sign=...&ts=...&offset=67171","gain":false,"preview":false}
12:02:33 |DEBUG| Starting new HTTPS connection (1): storage.mds.yandex.net:443
12:02:33 |DEBUG| https://storage.mds.yandex.net:443 "GET /file-download-info/...320?sign=...&ts=...&offset=67171 HTTP/1.1" 200 None
12:02:33 |DEBUG| <?xml version="1.0" encoding="utf-8"?><download-info><host>s88iva.storage.yandex.net</host><path>/rmusic/.../67171</path>...cut...
12:02:38 |INFO| Загружается /MUSIC/album-22517842/Чиж _ Co/Live (Live)/1 - Дорогуша (Live).mp3
12:02:38 |DEBUG| Starting new HTTPS connection (1): s88iva.storage.yandex.net:443
12:02:39 |DEBUG| https://s88iva.storage.yandex.net:443 "GET /get-mp3/.../rmusic/.../67171?track-id=17887573 HTTP/1.1" 200 17329632

В запросе album.jsx информация есть: "year":1994
Однако в каталоге альбома "Live (Live)" и загруженном файле год не указан.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.