Soundcloud API / stream endpoint memberikan 401 kesalahan

13

Saya mencoba untuk menulis aplikasi asli reaksi yang akan mengalirkan beberapa lagu dari Soundcloud. Sebagai tes, saya telah bermain dengan API menggunakan python, dan saya dapat membuat permintaan untuk menyelesaikan url, menarik daftar putar / trek, dan semua yang saya butuhkan.

Dengan itu, ketika membuat permintaan ke stream_url dari setiap lagu yang diberikan, saya mendapatkan kesalahan 401.

Url saat ini dalam pertanyaan adalah: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Saya sudah mencobanya tanpa? Client_id ..., saya sudah mencoba mengganti? dengan &, saya sudah mencoba mendapatkan client_id lain, saya sudah mencobanya dengan allow_redirects sebagai benar dan salah, tetapi sepertinya tidak ada yang berhasil. Bantuan apa pun akan sangat dihargai.

Properti yang dapat dialirkan dari setiap trek adalah Benar, sehingga seharusnya tidak menjadi masalah izin.

Edit:

Setelah melakukan sedikit riset, saya menemukan solusi semi-sukses. Titik akhir / stream API masih tidak berfungsi, tetapi jika Anda mengubah titik akhir tujuan Anda menjadi http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss, itu akan memberi Anda umpan RSS yang (sebagian besar) sama dengan apa yang Anda dapatkan dengan menggunakan trek atau playlist endpoint API.

Tautan yang terkandung di dalamnya dapat dialirkan.

Default
sumber
1
Saya telah menggunakan API untuk sementara waktu, saya juga mendapatkan kesalahan 401 baru-baru ini, bukan hanya Anda.
r3verse
Dalam kasus saya dengan JavaScript, API tidak berfungsi selama beberapa hari sekarang.
Daniel
semua aplikasi yang saya gunakan yang hit API soundcloud semuanya telah turun selama berminggu-minggu sekarang. Sepertinya SoundCloud telah meninggalkan pengembangan pihak ketiga yang benar-benar menyebalkan
oriyentel

Jawaban:

7

Oke, saya pikir saya telah menemukan solusi umum yang akan bekerja untuk kebanyakan orang. Saya berharap itu lebih mudah, tetapi ini adalah hal paling sederhana yang saya temukan.

  1. Gunakan API untuk menarik trek dari pengguna. Anda dapat menggunakan linked_partitioning dan properti next_href untuk mengumpulkan semuanya karena ada batas maksimum 200 trek per panggilan.

  2. Dengan menggunakan data yang ditarik di JSON, Anda dapat menggunakan kunci permalink_url untuk mendapatkan hal yang sama dengan yang Anda ketik di browser.

  3. Buat permintaan ke permalink_url dan akses HTML. Anda perlu melakukan parsing, tetapi url yang Anda inginkan akan menjadi sesuatu yang efeknya:

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

    Anda mungkin bisa menggunakan regex untuk menguraikan ini dengan mudah.

  4. Buat permintaan untuk menambahkan url ini? Client_id = ... dan itu akan memberi Anda BELUM url lain di json kembalinya.

  5. Dengan menggunakan url yang dikembalikan dari langkah sebelumnya, Anda dapat menautkan langsung ke yang ada di browser, dan itu akan membawa Anda ke konten trek Anda. Saya memeriksa VLC dengan memasukkan tautan dan itu mengalir dengan benar.

Semoga ini membantu beberapa dari Anda keluar dengan perkembangan Anda.

Default
sumber
1
apakah Anda pernah mempertimbangkan hanya menggunakan api v2? tampaknya mereka memiliki api-v2.soundcloud.com/tracks?id=<song_id>&client_id= tautan yang mereka gunakan
user208685
Ini keputusan yang bagus. Tetapi ketika Anda mendapatkan URL streaming langsung dan mencoba memainkannya, penghitung pemutaran SoundCloud akan menghitung jumlah pemutaran ini.
Alex
6

Karena saya memiliki masalah yang sama, jawaban dari @Default memotivasi saya untuk mencari solusi. Tapi saya tidak mengerti solusinya dengan permalink_url langkah 2 dan 3. Solusi yang lebih mudah adalah:

  1. Ambil misalnya suka trek pengguna menggunakan api-v2titik akhir seperti ini:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. Dalam respons kita dapat menemukan URL yang diperlukan seperti yang disebutkan dari @Default dalam jawabannya:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Buat permintaan ke URL ini dengan client_idsebagai parameter kueri dan Anda mendapatkan URL lain dengan itu Anda dapat melakukan streaming / unduh trek

Perhatikan bahwa api-v2itu masih belum umum dan permintaan dari klien Anda mungkin akan diblokir oleh CORS.

Serg
sumber
3
Trek dari seorang pengguna adalah: / users / <user_id> / trek Likes dari seorang pengguna adalah: / users / <user_id> / track_likes Hanya satu trek adalah: / trek / <track_id>
r3verse
@ r3verse kanan, edit jawaban saya, tetapi representasi trek harus sama untuk titik akhir yang berbeda
Serg
Ya hampir, @Serg, untuk satu trek Anda tidak memiliki objek koleksi bersarang, tetapi representasi trek adalah sama. Sangat bagus.
r3verse
5

Seperti yang disebutkan oleh @ user208685 solusinya bisa sedikit lebih sederhana dengan menggunakan SoundCloud API v2:

  1. Dapatkan ID trek (mis. Menggunakan API publik di https://developers.soundcloud.com/docs )
  2. Dapatkan JSON dari https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. Dari JSON, parsing URL aliran progresif MP3
  4. Dari stream URL, dapatkan URL file MP3
  5. Putar media dari URL file MP3

Catatan : Tautan ini hanya berlaku untuk waktu terbatas dan dapat dibuat ulang dengan mengulangi langkah 3. hingga 5.

Contoh dalam node(dengan node-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);
})();

Untuk solusi serupa di Python, periksa masalah GitHub ini: https://github.com/soundcloud/soundcloud-python/issues/87

Otto Sichert
sumber