Skip to content
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

Closed
delletenebre opened this issue Sep 17, 2019 · 12 comments
Closed
Labels
bug Что-то не работает help wanted Требуется дополнительное внимание

Comments

@delletenebre
Copy link

delletenebre commented Sep 17, 2019

Добрый день. Спасибо за Ваш труд, Илья.

Не могли бы Вы помочь в исправлении получения прямой ссылки на mp3? Теперь в пути

f'https://{host}/get-{self.codec}/randomTrash/{ts}{path}'

randomTrash изменён на генерируемое значение, но как его получить не совсем понятно :(

По старой маске 400-ая ошибка.

@MarshalX
Copy link
Owner

@delletenebre Добрый день. Там всегда было генерируемое значение и я не разбирался как оно получается. Потому что работает и без него... "randomTrash" это моя заглушка

@delletenebre
Copy link
Author

Понятно, спасибо. Но не могли бы Вы проверить, буквально 3 дня назад всё ок было, но сегодня вываливается 400 ошибка (поэтому полез проверять в браузер, решил что путь изменился).

@MarshalX
Copy link
Owner

@delletenebre Проверю при первой возможности (два часа в худшем случае)

@delletenebre
Copy link
Author

delletenebre commented Sep 17, 2019

Покопался на сайте ЯМузыки, вычленил функцию для вычисления "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 :)

@MarshalX
Copy link
Owner

Хех, в Яндексе поняли, что на беке нет валидации этой части урла и наконец-то добавили, молча... Придется теперь реализовать метод для получения. Помощь приветствуется

@MarshalX
Copy link
Owner

За format=json большое спасибо!

MarshalX added a commit that referenced this issue Sep 17, 2019
Фикс загрузки треков (#25).
Загрузка AAC временно недоступна.
@MarshalX
Copy link
Owner

Осталось разобраться с AAC

@MarshalX MarshalX added bug Что-то не работает help wanted Требуется дополнительное внимание labels Sep 17, 2019
@fghf333
Copy link

fghf333 commented Sep 18, 2019

Немного переписал метод 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
Copy link
Owner

@fghf333, спасибо. Я вчера сделал фикс, но простой подстановкой s не обошлось. Я не знаю как у вас работает... Вот мой фикс: тык

@fghf333
Copy link

fghf333 commented Sep 18, 2019

@MarshalX До смешного конечно, но я ткнул пальцем в небо. Сейчас вернул обратно randomTrash и... mp3 спокойно загрузилось и так =_=. Без ваших изменений. Может имеет место не внедрение валидации на бэке, а элементарный выпил треков с aac кодеком (ну а вдруг)?

@MarshalX
Copy link
Owner

@MarshalX До смешного конечно, но я ткнул пальцем в небо. Сейчас вернул обратно randomTrash и... mp3 спокойно загрузилось и так =_=. Без ваших изменений. Может имеет место не внедрение валидации на бэке, а элементарный выпил треков с aac кодеком (ну а вдруг)?

Я предполагал, что они своим фиксом бэка сломали загрузку AAC. А теперь они откатились. Я сегодня в ~11:20 по МСК перепроверил тот факт, что валидация подписи заработала на беке. Только что я проверил еще раз - не работает. Поведение точно такое же как было до создания этого issue.

@fghf333
Copy link

fghf333 commented Sep 18, 2019

Ну, подпись вместо randomTrash точно не повередит =)

MarshalX added a commit that referenced this issue Mar 13, 2020
Исправлено получение прямой ссылки на файл с кодеком AAC #237 #25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Что-то не работает help wanted Требуется дополнительное внимание
Projects
None yet
Development

No branches or pull requests

3 participants