API de Soundcloud / punto final de transmisión con error 401

13

Estoy tratando de escribir una aplicación nativa de reacción que transmitirá algunas pistas de Soundcloud. Como prueba, he estado jugando con la API usando Python, y puedo hacer solicitudes para resolver la URL, extraer las listas de reproducción / pistas y todo lo que necesito.

Dicho esto, cuando hago una solicitud al stream_url de cualquier pista, recibo un error 401.

La url actual en cuestión es: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Lo he intentado sin el? Client_id ..., he intentado reemplazar el? con &, he intentado obtener otro client_id, lo he intentado con allow_redirects como verdadero y falso, pero nada parece funcionar. Cualquier ayuda sería muy apreciada.

La propiedad de transmisión de cada pista es True, por lo que no debería ser un problema de permisos.

Editar:

Después de investigar un poco, he encontrado una solución poco exitosa. El punto final / stream de la API todavía no funciona, pero si cambia su punto final de destino a http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss, le dará un feed RSS que (principalmente) lo mismo que obtendría al usar las pistas o las listas de reproducción del punto final de la API.

El enlace que contiene puede transmitirse.

Defecto
fuente
1
He estado usando la API por un tiempo, también recibí el error 401 recientemente, no eres solo tú.
r3verse
En mi caso con JavaScript, la API no funciona desde hace unos días.
Daniel
Todas las aplicaciones que uso que golpean las API de SoundCloud han estado inactivas durante semanas. parece como SoundCloud ha abandonado prácticamente el desarrollo de terceros, que es una mierda
oriyentel

Respuestas:

7

Bien, creo que he encontrado una solución generalizada que funcionará para la mayoría de las personas. Desearía que fuera más fácil, pero es lo más simple que he encontrado hasta ahora.

  1. Use API para extraer pistas del usuario. Puede usar Linked_partitions y la propiedad next_href para recopilar todo porque hay un límite máximo de 200 pistas por llamada.

  2. Usando los datos desplegados en el JSON, puede usar la clave permalink_url para obtener lo mismo que escribiría en el navegador.

  3. Haga una solicitud a permalink_url y acceda al HTML. Tendrá que analizar un poco, pero la url que deseará será algo como:

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

    Probablemente podría usar una expresión regular para analizar esto simplemente.

  4. Haga una solicitud a esta url agregando? Client_id = ... y le dará TODA OTRA url en su respuesta json.

  5. Usando la URL devuelta del paso anterior, puede vincular directamente a eso en el navegador, y lo llevará a su contenido de seguimiento. Verifiqué en VLC ingresando el enlace y se transmite correctamente.

Esperemos que esto ayude a algunos de ustedes con su desarrollo.

Defecto
fuente
1
¿Alguna vez has considerado usar la API v2? parece que tienen un enlace api-v2.soundcloud.com/tracks?id=<song_id>&client_id= que usan
user208685
Esta es una buena decisión. Pero cuando obtienes la URL de transmisión directa e intentas reproducirla, SoundCloud reproduce el contador que contará esta reproducción.
Alex
6

Como tengo el mismo problema, la respuesta de @Default me ​​motivó a buscar una solución. Pero no entendí la solución con permalink_url los pasos 2 y 3. La solución más fácil podría ser:

  1. Obtenga, por ejemplo, los me gusta de la pista del usuario utilizando un api-v2punto final como este:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. En la respuesta podemos encontrar la URL necesaria como se menciona en @Default en su respuesta:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Solicite esta URL con client_idun parámetro de consulta y obtendrá otra URL con la que puede transmitir / descargar la pista

Tenga en cuenta que api-v2todavía no es público y CORS bloqueará la solicitud de su cliente.

Serg
fuente
3
Las pistas de un usuario son: / users / <user_id> / tracks Me gusta de un usuario es: / users / <user_id> / track_likes Solo una pista es: / tracks / <track_id>
r3verse
@ r3verse a la derecha, editó mi respuesta, pero la representación de la pista debería ser la misma para diferentes puntos finales
Serg
Sí, casi, @Serg, para una sola pista no tienes un objeto de colección anidado, pero la representación de la pista es la misma. Muy agradable de cualquier manera.
r3verse
5

Como mencionó @ user208685, la solución puede ser un poco más simple al usar SoundCloud API v2:

  1. Obtenga la identificación de la pista (por ejemplo, utilizando la API pública en https://developers.soundcloud.com/docs )
  2. Obtenga JSON de https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. Desde JSON analizar URL de flujo progresivo MP3
  4. Desde la URL de transmisión, obtenga la URL del archivo MP3
  5. Reproduzca medios desde la URL del archivo MP3

Nota : Este enlace solo es válido por un período de tiempo limitado y puede regenerarse repitiendo los pasos 3 a 5.

Ejemplo en 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);
})();

Para una solución similar en Python, consulte este problema de GitHub: https://github.com/soundcloud/soundcloud-python/issues/87

Otto Sichert
fuente