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.