GithubHelp home page GithubHelp logo

Comments (12)

MarshalX avatar MarshalX commented on May 26, 2024

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

from yandex-music-api.

delletenebre avatar delletenebre commented on May 26, 2024

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

from yandex-music-api.

MarshalX avatar MarshalX commented on May 26, 2024

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

from yandex-music-api.

delletenebre avatar delletenebre commented on May 26, 2024

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

from yandex-music-api.

MarshalX avatar MarshalX commented on May 26, 2024

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

from yandex-music-api.

MarshalX avatar MarshalX commented on May 26, 2024

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

from yandex-music-api.

MarshalX avatar MarshalX commented on May 26, 2024

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

from yandex-music-api.

fghf333 avatar fghf333 commented on May 26, 2024

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

from yandex-music-api.

MarshalX avatar MarshalX commented on May 26, 2024

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

from yandex-music-api.

fghf333 avatar fghf333 commented on May 26, 2024

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

from yandex-music-api.

MarshalX avatar MarshalX commented on May 26, 2024

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

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

from yandex-music-api.

fghf333 avatar fghf333 commented on May 26, 2024

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

from yandex-music-api.

Related Issues (20)

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.