Я понимаю, что это старый вопрос, но недавно я столкнулся с той же проблемой и нашел решение.
Кажется, проблема связана с предварительной загрузкой треков в Tidal. Поскольку вы не используете pulseaudio, Google Chrome создает новый аудиоконтроллер каждый раз, когда начинается воспроизведение трека из вашего плейлиста. Плеер Tidal ожидает, что тот же аудиоконтроллер будет на месте, когда начнется воспроизведение следующей песни, что приведет к зависанию.
Я решил эту проблему путем отладки кода проигрывателя javascript в Tidal, внедрив мои изменения через прокси-сервер «man in the middle» (ищите mitmproxy, отличное программное обеспечение). Тем самым я мог изменить поведение игрока. Изменяя следующую функцию:
function m(t) {
t || w.pause(), g(), e.trigger("track:switched", A), I = void 0, S && x === A ? (o.player !== o.preloadPlayer && (o.player.stop(), o.setMediaPlayer(o.preloadPlayer)), u(T, S, t), x = void 0, T = void 0, S = void 0) : f(A, p, k)
}
в
function m(t) {
t || w.pause(), g(), e.trigger("track:switched", A), I = void 0, S && x === A, f(A, p, k)
}
Я избавился от проблемы. Последняя функция всегда будет вызывать функцию `f ', создавая тем самым нового игрока, избегая проблемы с предварительной загрузкой.
Шаги, которые вы должны пройти, это:
- Установите mitmproxy и его сертификаты
- Настройте браузер на использование mitmproxy (вы можете найти настройки в Меню-> Настройки-> Дополнительно-> Изменить настройки прокси
- Запустите mitmproxy следующим образом: mitmproxy -p 8888 --script tidal.py
Содержание Tidal.py ниже. Обратите внимание, что вам нужно скачать файл .js, внести изменения и поместить его в место, где его можно загрузить, например, в тот же каталог, что и файл tidal.py. Удачи!
import cStringIO
from libmproxy.protocol.http import decoded
def response(context, flow):
if flow.match("~u http://listen.tidal.com/v1.6.4-p-5/app.js") and flow.response.headers.("content-type", "").startswith("application/x-javascript"):
with decoded(flow.response):
try:
injected_script = cStringIO.StringIO(open('./app.js', 'rb').read())
flow.response.content = injected_script.getvalue()
except Exception as e:
print e
pass