Soundcloud API / конечная точка потока, выдающая ошибку 401

13

Я пытаюсь написать собственное приложение, которое будет транслировать некоторые треки из Soundcloud. В качестве теста я играл с API, используя python, и я могу делать запросы для разрешения URL, получения списков воспроизведения / дорожек и всего остального, что мне нужно.

При этом при выполнении запроса к stream_url любой данной дорожки я получаю ошибку 401.

Текущий рассматриваемый URL-адрес: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Я пробовал без? Client_id ..., я пытался заменить? с & я попытался получить другой client_id, я попробовал его с помощью allow_redirects как true и false, но, похоже, ничего не работает. Любая помощь будет принята с благодарностью.

Свойство streamable каждого трека имеет значение True, поэтому не должно быть проблемы с разрешениями.

Редактировать:

После небольшого исследования я нашел полу-успешный обходной путь. Конечная точка / stream API по-прежнему не работает, но если вы измените конечную точку назначения на http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss, она даст вам RSS-канал, который (в основном) то же, что вы получите, используя конечную точку API треков или списков воспроизведения.

Ссылка, содержащаяся в нем, может быть транслирована.

По умолчанию
источник
1
Я давно пользуюсь API, недавно я также получил ошибку 401, это не только вы.
r3verse
В моем случае с JavaScript API не работает уже несколько дней.
Даниил
все приложения, которые я использую, которые использовали Soundcloud API, были недоступны уже несколько недель. кажется, что SoundCloud в значительной степени отказался от сторонних разработок, которые действительно отстой
oriyentel

Ответы:

7

Хорошо, я думаю, что нашел обобщенное решение, которое будет работать для большинства людей. Хотелось бы, чтобы было проще, но это самая простая вещь, которую я нашел.

  1. Используйте API, чтобы получить треки от пользователя. Вы можете использовать свойство connected_partitioning и свойство next_href, чтобы собрать все, поскольку максимальное ограничение составляет 200 дорожек на вызов.

  2. Используя данные в JSON, вы можете использовать ключ permalink_url, чтобы получить то же самое, что вы вводите в браузер.

  3. Сделайте запрос к permalink_url и получите доступ к HTML. Вам нужно будет выполнить некоторый анализ, но URL, который вам нужен, будет иметь следующий эффект:

    " https://api-v2.soundcloud.com/media/soundcloud:tracks:488625309/c0d9b93d-4a34-4ccf-8e16-7a87cfaa9f79/stream/progressive "

    Вы могли бы, вероятно, использовать регулярное выражение, чтобы разобрать это просто.

  4. Сделайте запрос на добавление этого URL-адреса? Client_id = ..., и он вернет вам ДРУГОЙ URL в ответном json.

  5. Используя URL, возвращенный с предыдущего шага, вы можете напрямую связать его с этим в браузере, и он перенесет вас на ваш трек. Я проверил VLC, введя ссылку, и она течет правильно.

Надеюсь, это поможет некоторым из вас в разработке.

По умолчанию
источник
1
Вы когда-нибудь рассматривали только использование API v2? кажется, что у них есть api-v2.soundcloud.com/tracks?id=<song_id>&client_id= ссылка, которую они используют
user208685
Это хорошее решение. Но когда вы получаете прямой URL-адрес потока и пытаетесь воспроизвести его, SoundCloud проигрывает счетчик, который будет подсчитывать эту игру.
Алекс
6

Поскольку у меня та же проблема, ответ @Default побудил меня искать решение. Но я не понял обходной путь с permalink_url шагами 2 и 3. Более простое решение может быть:

  1. Получите, например, лайки треков пользователей, используя api-v2конечную точку следующим образом:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. В ответе мы можем найти нужный URL, как упомянуто из @Default в его ответе:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Сделайте запрос на этот URL client_idв качестве параметра запроса, и вы получите другой URL, с которым вы можете транслировать / скачивать трек

Обратите внимание, что api-v2все еще не является общедоступным, и запрос от вашего клиента, вероятно, будет заблокирован CORS.

Serg
источник
3
Треки от пользователя: / users / <user_id> / track Лайки от пользователя: / users / <user_id> / track_likes Всего один трек: / track / <track_id>
r3verse
@ r3verse справа, отредактировал мой ответ, но представление трека должно быть одинаковым для разных конечных точек
Serg
Да, @Serg, для отдельного трека у вас нет вложенного объекта коллекции, но представление трека такое же. Очень хорошо в любом случае.
r3verse
5

Как уже упоминалось @ user208685, решение может быть немного проще с использованием SoundCloud API v2:

  1. Получить идентификатор дорожки (например, с помощью общедоступного API по адресу https://developers.soundcloud.com/docs )
  2. Получить JSON с https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. От JSON parse MP3 прогрессивный поток URL
  4. Из потока URL получить URL файла MP3
  5. Воспроизведение мультимедиа из файла MP3

Примечание . Эта ссылка действительна только в течение ограниченного периода времени, и ее можно восстановить, повторив шаги с 3 по 5.

Пример в nodenode-fetch):

const clientId = 'YOUR_CLIENT_ID';

(async () => {
  let response = await fetch(`https://api.soundcloud.com/resolve?url=https://soundcloud.com/d-o-lestrade/gabriel-ananda-maceo-plex-solitary-daze-original-mix&client_id=${clientId}`);
  const track = await response.json();
  const trackId = track.id;

  response = await fetch(`https://api-v2.soundcloud.com/tracks/${trackId}?client_id=${clientId}`);
  const trackV2 = await response.json();
  const streamUrl = trackV2.media.transcodings.filter(
    transcoding => transcoding.format.protocol === 'progressive'
  )[0].url;

  response = await fetch(`${streamUrl}?client_id=${clientId}`);
  const stream = await response.json();
  const mp3Url = stream.url;

  console.log(mp3Url);
})();

Для аналогичного решения в Python, проверьте эту проблему GitHub: https://github.com/soundcloud/soundcloud-python/issues/87

Отто Сихерт
источник