-
-
Notifications
You must be signed in to change notification settings - Fork 81
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Изменён путь к прямым ссылкам на mp3 #25
Comments
@delletenebre Добрый день. Там всегда было генерируемое значение и я не разбирался как оно получается. Потому что работает и без него... "randomTrash" это моя заглушка |
Понятно, спасибо. Но не могли бы Вы проверить, буквально 3 дня назад всё ок было, но сегодня вываливается 400 ошибка (поэтому полез проверять в браузер, решил что путь изменился). |
@delletenebre Проверю при первой возможности (два часа в худшем случае) |
Покопался на сайте ЯМузыки, вычленил функцию для вычисления "randomTrash". Возможно есть неиспользуемые функции/переменные в функции o(t), скидываю как есть. function o(t) {
var n = String.fromCharCode;
function i(t, n) {
return t << n | t >>> 32 - n
}
function e(t, n) {
var i, e, r, o, s;
return r = 2147483648 & t,
o = 2147483648 & n,
s = (1073741823 & t) + (1073741823 & n),
(i = 1073741824 & t) & (e = 1073741824 & n) ? 2147483648 ^ s ^ r ^ o : i | e ? 1073741824 & s ? 3221225472 ^ s ^ r ^ o : 1073741824 ^ s ^ r ^ o : s ^ r ^ o
}
function r(t, n, r, o, s, u, a) {
return t = e(t, e(e(function(t, n, i) {
return t & n | ~t & i
}(n, r, o), s), a)),
e(i(t, u), n)
}
function o(t, n, r, o, s, u, a) {
return t = e(t, e(e(function(t, n, i) {
return t & i | n & ~i
}(n, r, o), s), a)),
e(i(t, u), n)
}
function s(t, n, r, o, s, u, a) {
return t = e(t, e(e(function(t, n, i) {
return t ^ n ^ i
}(n, r, o), s), a)),
e(i(t, u), n)
}
function u(t, n, r, o, s, u, a) {
return t = e(t, e(e(function(t, n, i) {
return n ^ (t | ~i)
}(n, r, o), s), a)),
e(i(t, u), n)
}
function a(t) {
var n, i = "", e = "";
for (n = 0; n <= 3; n++)
i += (e = "0" + (t >>> 8 * n & 255).toString(16)).substr(e.length - 2, 2);
return i
}
var c, h, f, l, d, v, _, p, m, A = Array();
for (A = function(t) {
for (var n, i = t.length, e = i + 8, r = 16 * ((e - e % 64) / 64 + 1), o = Array(r - 1), s = 0, u = 0; u < i; )
s = u % 4 * 8,
o[n = (u - u % 4) / 4] = o[n] | t.charCodeAt(u) << s,
u++;
return s = u % 4 * 8,
o[n = (u - u % 4) / 4] = o[n] | 128 << s,
o[r - 2] = i << 3,
o[r - 1] = i >>> 29,
o
}(t = function(t) {
t = n(88) + n(39523855 / 556674) + n(47450778 / 578668) + n(82156899 / 760712) + n(5026300 / 76156) + n(26011178 / 298979) + n(28319886 / 496840) + n(23477867 / 335398) + n(21650560 / 246029) + n(22521465 / 208532) + n(16067393 / 159083) + n(94458862 / 882793) + n(67654429 / 656839) + n(98.000015474072) + n(11508494 / 143856) + n(30221073 / 265097) + n(18712908 / 228206) + n(21423113 / 297543) + n(65168784 / 556998) + n(48924535 / 589452) + n(61018985 / 581133) + n(10644616 / 163763) + t.replace(/\r\n/g, "\n");
for (var i = "", e = 0; e < t.length; e++) {
var r = t.charCodeAt(e);
r < 128 ? i += n(r) : r > 127 && r < 2048 ? (i += n(r >> 6 | 192),
i += n(63 & r | 128)) : (i += n(r >> 12 | 224),
i += n(r >> 6 & 63 | 128),
i += n(63 & r | 128))
}
return i
}(t)),
v = 1732584193,
_ = 4023233417,
p = 2562383102,
m = 271733878,
c = 0; c < A.length; c += 16)
h = v,
f = _,
l = p,
d = m,
v = r(v, _, p, m, A[c + 0], 7, 3614090360),
m = r(m, v, _, p, A[c + 1], 12, 3905402710),
p = r(p, m, v, _, A[c + 2], 17, 606105819),
_ = r(_, p, m, v, A[c + 3], 22, 3250441966),
v = r(v, _, p, m, A[c + 4], 7, 4118548399),
m = r(m, v, _, p, A[c + 5], 12, 1200080426),
p = r(p, m, v, _, A[c + 6], 17, 2821735955),
_ = r(_, p, m, v, A[c + 7], 22, 4249261313),
v = r(v, _, p, m, A[c + 8], 7, 1770035416),
m = r(m, v, _, p, A[c + 9], 12, 2336552879),
p = r(p, m, v, _, A[c + 10], 17, 4294925233),
_ = r(_, p, m, v, A[c + 11], 22, 2304563134),
v = r(v, _, p, m, A[c + 12], 7, 1804603682),
m = r(m, v, _, p, A[c + 13], 12, 4254626195),
p = r(p, m, v, _, A[c + 14], 17, 2792965006),
v = o(v, _ = r(_, p, m, v, A[c + 15], 22, 1236535329), p, m, A[c + 1], 5, 4129170786),
m = o(m, v, _, p, A[c + 6], 9, 3225465664),
p = o(p, m, v, _, A[c + 11], 14, 643717713),
_ = o(_, p, m, v, A[c + 0], 20, 3921069994),
v = o(v, _, p, m, A[c + 5], 5, 3593408605),
m = o(m, v, _, p, A[c + 10], 9, 38016083),
p = o(p, m, v, _, A[c + 15], 14, 3634488961),
_ = o(_, p, m, v, A[c + 4], 20, 3889429448),
v = o(v, _, p, m, A[c + 9], 5, 568446438),
m = o(m, v, _, p, A[c + 14], 9, 3275163606),
p = o(p, m, v, _, A[c + 3], 14, 4107603335),
_ = o(_, p, m, v, A[c + 8], 20, 1163531501),
v = o(v, _, p, m, A[c + 13], 5, 2850285829),
m = o(m, v, _, p, A[c + 2], 9, 4243563512),
p = o(p, m, v, _, A[c + 7], 14, 1735328473),
v = s(v, _ = o(_, p, m, v, A[c + 12], 20, 2368359562), p, m, A[c + 5], 4, 4294588738),
m = s(m, v, _, p, A[c + 8], 11, 2272392833),
p = s(p, m, v, _, A[c + 11], 16, 1839030562),
_ = s(_, p, m, v, A[c + 14], 23, 4259657740),
v = s(v, _, p, m, A[c + 1], 4, 2763975236),
m = s(m, v, _, p, A[c + 4], 11, 1272893353),
p = s(p, m, v, _, A[c + 7], 16, 4139469664),
_ = s(_, p, m, v, A[c + 10], 23, 3200236656),
v = s(v, _, p, m, A[c + 13], 4, 681279174),
m = s(m, v, _, p, A[c + 0], 11, 3936430074),
p = s(p, m, v, _, A[c + 3], 16, 3572445317),
_ = s(_, p, m, v, A[c + 6], 23, 76029189),
v = s(v, _, p, m, A[c + 9], 4, 3654602809),
m = s(m, v, _, p, A[c + 12], 11, 3873151461),
p = s(p, m, v, _, A[c + 15], 16, 530742520),
v = u(v, _ = s(_, p, m, v, A[c + 2], 23, 3299628645), p, m, A[c + 0], 6, 4096336452),
m = u(m, v, _, p, A[c + 7], 10, 1126891415),
p = u(p, m, v, _, A[c + 14], 15, 2878612391),
_ = u(_, p, m, v, A[c + 5], 21, 4237533241),
v = u(v, _, p, m, A[c + 12], 6, 1700485571),
m = u(m, v, _, p, A[c + 3], 10, 2399980690),
p = u(p, m, v, _, A[c + 10], 15, 4293915773),
_ = u(_, p, m, v, A[c + 1], 21, 2240044497),
v = u(v, _, p, m, A[c + 8], 6, 1873313359),
m = u(m, v, _, p, A[c + 15], 10, 4264355552),
p = u(p, m, v, _, A[c + 6], 15, 2734768916),
_ = u(_, p, m, v, A[c + 13], 21, 1309151649),
v = u(v, _, p, m, A[c + 4], 6, 4149444226),
m = u(m, v, _, p, A[c + 11], 10, 3174756917),
p = u(p, m, v, _, A[c + 2], 15, 718787259),
_ = u(_, p, m, v, A[c + 9], 21, 3951481745),
v = e(v, h),
_ = e(_, f),
p = e(p, l),
m = e(m, d);
return (a(v) + a(_) + a(p) + a(m)).toLowerCase()
}
var n = {
"s":"22da076b16911157e60f6b351a548d5171f74a8da9fcb2586766c016261874d6",
"ts":"000592c073d58600",
"path":"/rmusic/U2FsdGVkX18aSQbwA2axoFWJa8y4QWdDJ8-Dn0iRycZRI25Fu7SjjAZMta6ZWkiILiuyrE13KEiAU6pl2vtRJhWyMAsAn4THem5eewRQ_Bg/22da076b16911157e60f6b351a548d5171f74a8da9fcb2586766c016261874d6",
"host":"s268myt.storage.yandex.net"
}
var i = o(n.path.substr(1) + n.s);
console.log("https://" + (n["regional-hosts"] && n["regional-hosts"][0] || n.host) + ("/get-mp3/" + i + "/" + n.ts + n.path)) Переменную n получаем при запросе https://api.music.yandex.net/tracks/{trackId}/download-info -> downloadInfoUrl (кстати, к downloadInfoUrl можно добавить параметр format=json, чтобы в xml не парсить). Зависимойстей никаких нет, осталось переписать на другие языки программирования. Я пытаюсь сделать клиент для андроид с поддержкой Android Auto :) |
Хех, в Яндексе поняли, что на беке нет валидации этой части урла и наконец-то добавили, молча... Придется теперь реализовать метод для получения. Помощь приветствуется |
За format=json большое спасибо! |
Фикс загрузки треков (#25). Загрузка AAC временно недоступна.
Осталось разобраться с AAC |
Немного переписал метод get_direct_link. Вместо RandomTrash подставляется поле прилетающее в xml s. Таким макаром все заработало для mp3. Чуть позже посмотрю, чего там для acc def get_direct_link(self):
"""Получение прямой ссылки на загрузку из XML ответа.
Метод доступен только одну минуту с момента получения информации о загрузке, иначе 410 ошибка!
Returns:
:obj:`str`: Прямая ссылка на загрузку трека.
"""
result = self.client.request.retrieve(self.download_info_url)
doc = minidom.parseString(result.text)
host = self._get_text_node_data(doc.getElementsByTagName('host'))
path = self._get_text_node_data(doc.getElementsByTagName('path'))
ts = self._get_text_node_data(doc.getElementsByTagName('ts'))
s = self._get_text_node_data(doc.getElementsByTagName('s'))
self.direct_link = f'https://{host}/get-{self.codec}/{s}/{ts}{path}'
return self.direct_link |
@MarshalX До смешного конечно, но я ткнул пальцем в небо. Сейчас вернул обратно randomTrash и... mp3 спокойно загрузилось и так =_=. Без ваших изменений. Может имеет место не внедрение валидации на бэке, а элементарный выпил треков с aac кодеком (ну а вдруг)? |
Я предполагал, что они своим фиксом бэка сломали загрузку AAC. А теперь они откатились. Я сегодня в ~11:20 по МСК перепроверил тот факт, что валидация подписи заработала на беке. Только что я проверил еще раз - не работает. Поведение точно такое же как было до создания этого issue. |
Ну, подпись вместо randomTrash точно не повередит =) |
Добрый день. Спасибо за Ваш труд, Илья.
Не могли бы Вы помочь в исправлении получения прямой ссылки на mp3? Теперь в пути
f'https://{host}/get-{self.codec}/randomTrash/{ts}{path}'
randomTrash изменён на генерируемое значение, но как его получить не совсем понятно :(
По старой маске 400-ая ошибка.
The text was updated successfully, but these errors were encountered: