Поддержка других ОС
Привет! Не думал добавить поддержку линукса? Под линукс есть неофициальный клиент, работает он по такому же принципу, что и на винде, но использует electron(движок рендера браузерный). Об этом гласит строка запуска этого клиента:
Вы в теории можете установить тот клиент, а затем найти где в нем храниться app.asar и поменять его на app.asar из вложений релиза моей модификации.
А. Ну и клиент на винде тоже использует электрон. Так что... Разницы особой нет
Я пытался уже заменить app.asar, но после этого приложение попросту не запускалось
Я пытался уже заменить app.asar, но после этого приложение попросту не запускалось
Это странно. попробуйте получить логи с мейн процесса. Честно не знаю где они лежат на линуксе, но на винде они лежат в %appdata%/YandexMusic/logs
Вот логи: main.log
Если я правильно понял, у него не получается залогиниться
В диспетчере задач нашёл, что он всё-так запускается, но просто не отображается почему-то
Вообще, этот "неофициальный клиент" делается с помощью скрипта, который во вход принимает .exe и перелопачивает его под linux. Возможно будет достаточно просто изменить их скрипт под твой мод, не знаю.
Судя по логу проблема началась после того как запустился модуль discordRPC. Я его писал без учёта возможности запуска на линуксе. Возможно проблема в этом.
К вопросу поддержки других ос добавлю свои пять копеек про macOS 15.3
Вот что попробовал сделать
Взял актуальный офф клиент Я.Музыки
https://music-desktop-application.s3.yandex.net/stable/Yandex_Music_universal_5.40.4.dmg
Нужный файл лежит по пути
/Applications/Яндекс Музыка.app/Contents/Resources/app.asar
Если пробовать его просто заменить, то приложение крашится при запуске. Вот кусок крашдампа:
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000119f28cfc
Termination Reason: Namespace SIGNAL, Code 5 Trace/BPT trap: 5
Terminating Process: exc handler [53876]
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 Electron Framework 0x119f28cfc ares_dns_rr_get_name + 4512188
1 Electron Framework 0x119f28c30 ares_dns_rr_get_name + 4511984
2 Electron Framework 0x119f28744 ares_dns_rr_get_name + 4510724
3 Electron Framework 0x119f28db8 ares_dns_rr_get_name + 4512376
4 Electron Framework 0x119f28dd0 ares_dns_rr_get_name + 4512400
5 Electron Framework 0x116c1ed4c v8::CodeEvent::GetScriptName() + 138776
6 Electron Framework 0x116c1cd58 v8::CodeEvent::GetScriptName() + 130596
7 Electron Framework 0x116c1e4d4 v8::CodeEvent::GetScriptName() + 136608
8 Electron Framework 0x116bff8bc v8::CodeEvent::GetScriptName() + 10632
9 Electron Framework 0x117d91a6c v8::SourceLocation::ToString() const + 154952
10 Electron Framework 0x117d911c8 v8::SourceLocation::ToString() const + 152740
11 ??? 0x157ea9494 ???
12 ??? 0x157e0e48c ???
13 ??? 0x157f943b8 ???
14 ??? 0x157e0d620 ???
И там еще много всякого, но ничего толкового я глазами не нашел и простигосподи эйай тоже ничего дельного об этом всем не сказал. Странновато что там речь идет про ares_dns_rr_get_name - судя по гуглу это то ли модуль то ли либа резолва DNS. Правда в контексте электрона про это вообще считай нет результатов в интернете. Наверное потому что эта ошибка по сути и не связана с проблемой)
Попробовал запустить бинарник приложения напрямую из терминала и вот тут стало интереснее. Получил такую ошибку:
[55517:0303/165641.689207:FATAL:asar_util.cc(148)] Integrity check failed for asar archive (e4e49ade7b52f13936feb835f3f6d5302d584225d4af9d54280e16223c815a42 vs 885249bd6a5ae29b44fa18832876842e61b99065e587c6d9cd13f2c42ed07936)
Видно что в приложении есть какая-то проверка целостности и как раз из-за подмены файла на модифицированный она не проходит. Погуглил интернеты и оказалось действительно, это фича Электрона для защиты ресурсов: https://www.electronjs.org/docs/latest/tutorial/asar-integrity
В данном случае, получается, e4e4... это оригинальный хэш который ждет программа, а 8852... это модифицированный. Правда, судя по информации по ссылке выше, это не просто sha256 хэш файла, а некое вычисленное при его сборке и хранящееся в нем самом значение. Однако в модифицированном app.asar я такого хэша grep'ом не нашел. Нашел много других, но не этот. А в оригинальном файле аналогично грепом не нашел оригинальный же хэш. Так я и не понял откуда они берутся.
Решил просто воспользоваться тем хэшом что выдала мне эта ошибка. Нашел все фалы Info.plist в которых встречается оригинальный хэш, всего их 9:
/Applications/Яндекс Музыка.app/Contents/Info.plist
/Applications/Яндекс Музыка.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/Info.plist
/Applications/Яндекс Музыка.app/Contents/Frameworks/Mantle.framework/Versions/A/Resources/Info.plist
/Applications/Яндекс Музыка.app/Contents/Frameworks/ReactiveObjC.framework/Versions/A/Resources/Info.plist
/Applications/Яндекс Музыка.app/Contents/Frameworks/Squirrel.framework/Versions/A/Resources/Info.plist
/Applications/Яндекс Музыка.app/Contents/Frameworks/Яндекс Музыка Helper (GPU).app/Contents/Info.plist
/Applications/Яндекс Музыка.app/Contents/Frameworks/Яндекс Музыка Helper (Plugin).app/Contents/Info.plist
/Applications/Яндекс Музыка.app/Contents/Frameworks/Яндекс Музыка Helper (Renderer).app/Contents/Info.plist
/Applications/Яндекс Музыка.app/Contents/Frameworks/Яндекс Музыка Helper.app/Contents/Info.plist
И во всех заменил оригинальный e4e4... хэш на модифицированный 8852...
И вот тут программа кажется завелась.
Больше она не крашится. Правда и не работает все равно 🤪
Теперь она выдает модальное окно с ошибкой JavaScript в которой, насколько я могу понять, идет речь уже про код самого модифицированного asar файла:
A JavaScript error occurred in the main process
Uncaught Exception:
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received undefined
at Object.join (node:path:1203:7)
at Object.<anonymous> (/Applications/Яндекс Музыка.app/Contents/Resources/app.asar/main/lib/modUpdater.js:20:28)
at Module._compile (node:internal/modules/cjs/loader:1484:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1564:10)
at Module.load (node:internal/modules/cjs/loader:1295:32)
at Module._load (node:internal/modules/cjs/loader:1111:12)
at c._load (node:electron/js2c/node_init:2:17025)
at Module.require (node:internal/modules/cjs/loader:1318:19)
at require (node:internal/modules/helpers:179:18)
at Object.<anonymous> (/Applications/Яндекс Музыка.app/Contents/Resources/app.asar/main/lib/tray.js:7:25)
Но на этом, как говорится, мои полномочия всё - js я не знаю и код мода, увы, поправить не смогу. После нажатия "ок" в этом модальном окне программа остается запущенной, но активного окна у нее нет. Вероятно "где-то там" она ждет авторизации, но ее не пройти без окна) Все что можно сделать это вызвать "about" из системного меню и она покажет версию себя. Судя по tray.js там и по чейнджлогу мода и по добавленным фичам и в целом по тому что изначально мод под Windows, я полагаю, что есть некая несовместимость с макосью. Может если просто убрать часть специфичной для венды функциональности и оставить чисто "разблокировку премиума" то сработает?
Вообще лично я именно в Яндекс Музыке не прям очень заинтересован т.к. там нет многого из того что я слушаю. Сам использую Spotify. Но если потребуется потестировать-попробовать всякое именно на макоси, то я могу помочь. Плюс, несмотря на то что год линукса на десктопе уже наступил, аудитория маков все же еще пока поболее и, думаю, их пользователи были бы заинтересованы и благодарны если модификация станет доступна и для них.
В любом случае, спасибо за мод! 🙂
Но на этом, как говорится, мои полномочия всё - js я не знаю и код мода, увы, поправить не смогу. После нажатия "ок" в этом модальном окне программа остается запущенной, но активного окна у нее нет. Вероятно "где-то там" она ждет авторизации, но ее не пройти без окна) Все что можно сделать это вызвать "about" из системного меню и она покажет версию себя. Судя по tray.js там и по чейнджлогу мода и по добавленным фичам и в целом по тому что изначально мод под Windows, я полагаю, что есть некая несовместимость с макосью. Может если просто убрать часть специфичной для венды функциональности и оставить чисто "разблокировку премиума" то сработает?
Вообще лично я именно в Яндекс Музыке не прям очень заинтересован т.к. там нет многого из того что я слушаю. Сам использую Spotify. Но если потребуется потестировать-попробовать всякое именно на макоси, то я могу помочь. Плюс, несмотря на то что год линукса на десктопе уже наступил, аудитория маков все же еще пока поболее и, думаю, их пользователи были бы заинтересованы и благодарны если модификация станет доступна и для них.
В любом случае, спасибо за мод! 🙂
Вы смогли победить ASAR Integrity. Это похвально. Я не стал делать поддержку MacOs как раз из за него. Ибо аппле не оценит если я буду хеш приложения менять из этого самого приложения. Нужен патчер, отдельная программа установщик. Он в планах но не в ближайшем будущем.
Проблема же с которой вы столкнулись после связана с тем что я писал мод не оглядываясь на совместимость с MacOs. Из за этого например пути до некоторых файлов и папок я указывал через /LOCAL_APPDATA/... Которых очевидно нет в macOs
Я провёл некоторые изменения чтобы мод мог запуститься на Mac OS. Если вам интересно, то можете попробовать установить его снова. @user334
Проделал на macOS 15.3.1 все описанные выше действия - приложение запустилось и вроде как все функции работают.
На линуксе тоже работает. app.asar переименовал в yandex-music.asar и положил в /lib/yandex-music/
На линуксе тоже работает. app.asar переименовал в yandex-music.asar и положил в /lib/yandex-music/
Вы мод ставили поверх https://github.com/cucumber-sp/yandex-music-linux ? Если да то работает ли воспроизведение? Ибо у них там были проблемы с ним. А их фиксы не произведены в моей модификации.
Проделал на macOS 15.3.1 все описанные выше действия - приложение запустилось и вроде как все функции работают.
Пришло обновление яндекс музыки Итог - слёт модификации :(
На линуксе тоже работает. app.asar переименовал в yandex-music.asar и положил в /lib/yandex-music/
Вы мод ставили поверх https://github.com/cucumber-sp/yandex-music-linux ? Если да то работает ли воспроизведение? Ибо у них там были проблемы с ним. А их фиксы не произведены в моей модификации.
Да, бывает с 1 раза кнопка play работает, а бывает с 5.
В консоле если передается: [14.03.2025, 12:06:38,841] [info] (Events) Event received PLAYER_STATE true true true то играет
Если [14.03.2025, 12:09:25,937] [info] (Events) Event received PLAYER_STATE false true true то не играет
Иконка на панели задач отвалилась и трей, но это мелочи.
Проделал на macOS 15.3.1 все описанные выше действия - приложение запустилось и вроде как все функции работают.
Пришло обновление яндекс музыки Итог - слёт модификации :(
Это пока что ожидаемое поведение, можете отключить в настройках мода авто обновления программы.
Да, бывает с 1 раза кнопка play работает, а бывает с 5. В консоле если передается:
[14.03.2025, 12:06:38,841] [info] (Events) Event received PLAYER_STATE true true trueто играет Если[14.03.2025, 12:09:25,937] [info] (Events) Event received PLAYER_STATE false true trueто не играет Иконка на панели задач отвалилась и трей, но это мелочи.
Это хорошая новость. Тогда я разморожу работу над патчером. Он будет представлен в версии модификации 2.0.0 Он позволит устанавливать модификацию на другие OS. А также избавит от проблемы со слётом модификации при обновлении приложения.
А когда примерная дата выхода 2.0? Я бы тоже хотел использовать на macos эту модификацию
Я не думаю, что стоит ожидать 2.0 в ближайшее время. Я не могу работать фултайм над проектом. К тому же у меня на носу дипломная работа и экзамены. Так что разработка ещё сильнее замедлится.
Важное дополнение. Яндекс обновил приложение и теперь нужно заменить хэш только по следующему пути:
/Applications/Яндекс Музыка.app/Contents/Info.plist
Это легче всего делается в Xcode.
Обновил toolset.js теперь он поддерживает macOS и выполнит при сборке асара из соурсов обход asar integrity автоматически
Потестировал - сработало. Правда даже с sudo скрипт не мог заменить файлы в "/Applications/Яндекс Музыка.app/Contents/". я сделал все локально и скопировал asar и plist вручную.
Правда даже с sudo скрипт не мог заменить файлы в "/Applications/Яндекс Музыка.app/Contents/".
Странно, у меня вот эта команда выполнилась без проблем:
node toolset.js build -d -m
Минификация завершена: 15.337s
Архивация в /Applications/Яндекс Музыка.app/Contents/Resources/app.asar
Архивация завершена: 722.359ms
Минифицированный код отчищен
Asar integrity включено. Обход
Хеш модифицированного asar: b89f1a7c2e0d020a49ddeced361d1e9db30096f0025bc6e1b3d4a9b7b8e99663
Подменяю хеш в Info.plist
Подменяю подпись
Executable=/Applications/Яндекс Музыка.app/Contents/MacOS/Яндекс Музыка
warning: Specifying ':' in the path is deprecated and will not work in a future release
Упакованы entitlements из /Applications/Яндекс Музыка.app в /Users/[cut]/YandexMusicModClient/temp/extracted_entitlements.xml
/Applications/Яндекс Музыка.app: replacing existing signature
Кеш очищен
Обход asar integrity завершён
Потестировал - сработало. Правда даже с sudo скрипт не мог заменить файлы в "/Applications/Яндекс Музыка.app/Contents/". я сделал все локально и скопировал asar и plist вручную.
А с какой именно ошибкой вы столкнулись? (желательно скриншот из консоли) Это важно ибо я буду использовать эту же реализацию в https://github.com/TheKing-OfTime/YandexMusicModPatcher
Похоже это не работает из-за System Integrity Protection (SIP). Я даже не могу вот такую команду выполнить:
sudo cp "/Applications/Яндекс Музыка.app/Contents/Resources/app.asar" "/Applications/Яндекс Музыка.app/Contents/Resources/app.asar-1"
cp: /Applications/Яндекс Музыка.app/Contents/Resources/app.asar-1: Operation not permitted
При запуске node toolset.js build -d -m у меня последний лог это
Архивация в /Applications/Яндекс Музыка.app/Contents/Resources/app.asar
и дальше скрипт завершается без ошибок в консоли
А, вот оно что. Да, у меня SIP отключен.
Добавил проверку на SIP в toolset.js На сколько я понимаю не нужно его полностью отключать. Достаточно выключить его для File System
Релизнул альфа билд Патчера https://github.com/TheKing-OfTime/YandexMusicModPatcher/releases/tag/v0.1.0 Поддерживается установка мода на мак и винду. Но при этом патчер поставить можно уже и на linux Много багов и недочётов. Используйте на свой страх и риск