API Soundcloud / point de terminaison de flux donnant une erreur 401

13

J'essaie d'écrire une application native réagissant qui diffusera certaines pistes de Soundcloud. À titre de test, j'ai joué avec l'API en utilisant python, et je suis capable de faire des demandes pour résoudre l'URL, extraire les listes de lecture / pistes et tout ce dont j'ai besoin.

Cela dit, lorsque je fais une demande à stream_url d'une piste donnée, j'obtiens une erreur 401.

L'URL actuelle en question est: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Je l'ai essayé sans le? Client_id ..., j'ai essayé de remplacer le? avec &, j'ai essayé d'obtenir un autre client_id, je l'ai essayé avec allow_redirects à la fois vrai et faux, mais rien ne semble fonctionner. Toute aide serait grandement appréciée.

La propriété streamable de chaque piste est True, donc cela ne devrait pas être un problème d'autorisations.

Éditer:

Après avoir fait un peu de recherche, j'ai trouvé une solution de contournement semi-réussie. Le point de terminaison / stream de l'API ne fonctionne toujours pas, mais si vous changez votre point de terminaison de destination en http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss, il vous donnera un flux RSS qui est (principalement) identique à ce que vous obtiendriez en utilisant le point de terminaison de l'API des pistes ou des listes de lecture

Le lien qu'il contient peut être diffusé.

Défaut
la source
1
J'utilise l'API depuis un certain temps, j'ai également eu l'erreur 401 récemment, ce n'est pas seulement vous.
r3verse
Dans mon cas avec JavaScript, l'API ne fonctionne plus depuis quelques jours.
Daniel
toutes les applications que j'utilise qui ont atteint les API soundcloud sont toutes en panne depuis des semaines maintenant. semble que SoundCloud a quasiment abandonné le développement tiers qui craint vraiment
oriyentel

Réponses:

7

D'accord, je pense avoir trouvé une solution généralisée qui fonctionnera pour la plupart des gens. Je souhaite que ce soit plus facile, mais c'est la chose la plus simple que j'ai trouvée à ce jour.

  1. Utilisez l'API pour extraire les pistes de l'utilisateur. Vous pouvez utiliser Linked_partitioning et la propriété next_href pour tout rassembler car il y a une limite maximale de 200 pistes par appel.

  2. En utilisant les données déroulées dans le JSON, vous pouvez utiliser la clé permalink_url pour obtenir la même chose que vous saisiriez dans le navigateur.

  3. Faites une demande à permalink_url et accédez au HTML. Vous devrez effectuer une analyse, mais l'URL dont vous aurez besoin sera quelque chose à l'effet de:

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

    Vous pourriez probablement utiliser une expression rationnelle pour analyser cela simplement.

  4. Faites une demande à cette URL en ajoutant? Client_id = ... et cela vous donnera ENCORE une autre URL dans son retour json.

  5. En utilisant l'URL renvoyée à l'étape précédente, vous pouvez créer un lien direct vers celle-ci dans le navigateur, et cela vous mènera au contenu de votre piste. J'ai vérifié sur VLC en saisissant le lien et il diffuse correctement.

J'espère que cela aidera certains d'entre vous à se développer.

Défaut
la source
1
avez-vous déjà envisagé d'utiliser l'API v2? il semble qu'ils aient un lien api-v2.soundcloud.com/tracks?id=<song_id>&client_id= qu'ils utilisent
user208685
C'est une bonne décision. Mais lorsque vous obtenez une URL de flux direct et que vous essayez de la lire, le compteur de lecture SoundCloud compte cette lecture.
Alex
6

Comme j'ai le même problème, la réponse de @Default m'a motivé à chercher une solution. Mais je n'ai pas compris la solution de contournement avec le permalink_url dans les étapes 2 et 3. La solution la plus simple pourrait être:

  1. Récupérez par exemple la piste utilisateur aime utiliser un api-v2point de terminaison comme ceci:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. Dans la réponse, nous pouvons trouver l'URL nécessaire, comme mentionné dans @Default dans sa réponse:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Faites une demande à cette URL avec client_idcomme paramètre de requête et vous obtenez une autre URL avec laquelle vous pouvez diffuser / télécharger la piste

Notez que le api-v2n'est toujours pas public et la demande de votre client sera probablement bloquée par CORS.

Serg
la source
3
Les pistes d'un utilisateur sont: / users / <id_utilisateur> / tracks Les likes d'un utilisateur sont: / utilisateurs / <id_utilisateur> / track_likes Une seule piste est: / pistes / <track_id>
r3verse
@ r3verse droite, édité ma réponse, mais la représentation de la piste devrait être la même pour différents points de terminaison
Serg
Oui presque, @Serg, pour une seule piste, vous n'avez pas d'objet de collection imbriqué, mais la représentation de la piste est la même. Très agréable de toute façon.
r3verse
5

Comme mentionné par @ user208685, la solution peut être un peu plus simple en utilisant l'API SoundCloud v2:

  1. Obtenez l'ID de la piste (par exemple en utilisant l'API publique sur https://developers.soundcloud.com/docs )
  2. Obtenez JSON à partir de https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. Depuis JSON, analyser l'URL du flux progressif MP3
  4. De l'URL du flux, obtenez l'URL du fichier MP3
  5. Lire des médias à partir de l'URL d'un fichier MP3

Remarque : ce lien n'est valide que pour une durée limitée et peut être régénéré en répétant les étapes 3 à 5.

Exemple en node(avec 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);
})();

Pour une solution similaire en Python, consultez ce problème GitHub: https://github.com/soundcloud/soundcloud-python/issues/87

Otto Sichert
la source