Endpoint API / stream di Soundcloud con errore 401


13

Sto cercando di scrivere un'app nativa reattiva che trasmetterà in streaming alcune tracce da Soundcloud. Come test, ho giocato con l'API usando Python e sono in grado di effettuare richieste per risolvere l'URL, estrarre playlist / tracce e tutto ciò di cui ho bisogno.

Detto questo, quando faccio una richiesta allo stream_url di una determinata traccia, ottengo un errore 401.

L'URL attuale in questione è: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

L'ho provato senza? Client_id ..., ho provato a sostituire il? con &, ho provato a ottenere un altro client_id, l'ho provato con allow_redirects sia come vero che falso, ma nulla sembra funzionare. Qualsiasi aiuto sarebbe molto apprezzato.

La proprietà di streaming di ogni traccia è True, quindi non dovrebbe essere un problema di autorizzazioni.

Modificare:

Dopo aver fatto un po 'di ricerca, ho trovato una soluzione semi-riuscita. L'endpoint / stream dell'API non funziona ancora, ma se si modifica l'endpoint di destinazione in http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss, verrà fornito un feed RSS che è (principalmente) lo stesso di quello che otterresti utilizzando l'endpoint API tracce o playlist.

Il collegamento in esso contenuto può essere trasmesso in streaming.


1
Sto usando l'API da un po ', ho anche ricevuto l'errore 401 di recente, non sei solo tu.
r3verse,

Nel mio caso con JavaScript, l'API non funziona da alcuni giorni.
Daniel,

tutte le app che utilizzo che colpiscono le API di soundcloud sono inattive da settimane. sembra che SoundCloud abbia praticamente abbandonato lo sviluppo di terze parti che fa davvero schifo
oriyentel

Risposte:


7

Ok, penso di aver trovato una soluzione generalizzata che funzionerà per la maggior parte delle persone. Vorrei che fosse più facile, ma è la cosa più semplice che abbia ancora trovato.

  1. Usa l'API per estrarre tracce dall'utente. Puoi usare linked_partitioning e la proprietà next_href per raccogliere tutto perché c'è un limite massimo di 200 tracce per chiamata.

  2. Utilizzando i dati estratti in JSON, è possibile utilizzare il tasto permalink_url per ottenere la stessa cosa che si digiterebbe nel browser.

  3. Invia una richiesta a permalink_url e accedi all'HTML. Dovrai eseguire un po 'di analisi, ma l'URL che desideri sarà qualcosa all'effetto di:

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

    Probabilmente potresti usare un regex per analizzarlo semplicemente.

  4. Invia una richiesta a questo URL aggiungendo? Client_id = ... e ti darà ANCORA UN ALTRO url nel suo json di ritorno.

  5. Usando l'URL restituito dal passaggio precedente, puoi collegarti direttamente a quello nel browser e ti porterà al contenuto della tua traccia. Ho controllato VLC inserendo il collegamento e questo scorre correttamente.

Spero che questo aiuti alcuni di voi a svilupparsi.


1
hai mai pensato di usare l'API v2? sembra che abbiano api-v2.soundcloud.com/tracks?id=<song_id>&client_id= link che usano
user208685

Questa è una buona decisione. Ma quando ottieni l'URL del flusso diretto e provi a riprodurlo, il contatore di riproduzioni SoundCloud conta tonnellate questa riproduzione.
Alex

6

Dato che ho lo stesso problema, la risposta di @Default mi ha motivato a cercare una soluzione. Ma non ho capito la soluzione con permalink_url i passaggi 2 e 3. La soluzione più semplice potrebbe essere:

  1. Recupera, ad esempio, i "mi piace" della traccia utente usando api-v2endpoint come questo:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. Nella risposta possiamo trovare l'URL necessario come menzionato da @Default nella sua risposta:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Invia richiesta a questo URL con client_idcome parametro di query e ottieni un altro URL con il quale puoi eseguire lo streaming / scaricare la traccia

Nota che api-v2non è ancora pubblico e la richiesta del tuo client sarà probabilmente bloccata da CORS.


3
Le tracce di un utente sono: / users / <utente_id> / tracce I Mi piace di un utente sono: / utenti / <utente_id> / track_likes Solo una singola traccia è: / tracce / <traccia_id>
r3verse

@ r3verse right, ho modificato la mia risposta, ma la rappresentazione della traccia dovrebbe essere la stessa per endpoint diversi
Serg

Sì quasi, @Serg, per una singola traccia non hai un oggetto raccolta nidificato, ma la rappresentazione della traccia è la stessa. Molto bello in entrambi i modi.
rovescio

5

Come menzionato da @ user208685, la soluzione può essere un po 'più semplice utilizzando l'API SoundCloud v2:

  1. Ottieni l'ID traccia (ad es. Utilizzando l'API pubblica su https://developers.soundcloud.com/docs )
  2. Ottieni JSON da https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. Da JSON analizzare l'URL del flusso progressivo MP3
  4. Dall'URL del flusso ottieni l'URL del file MP3
  5. Riproduci file multimediali dall'URL del file MP3

Nota : questo collegamento è valido solo per un periodo di tempo limitato e può essere rigenerato ripetendo i passaggi da 3 a 5.

Esempio in node(con 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);
})();

Per una soluzione simile in Python, controlla questo problema di GitHub: https://github.com/soundcloud/soundcloud-python/issues/87

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.