Soundcloud API / Stream-Endpunkt mit 401-Fehler

13

Ich versuche eine native React-App zu schreiben, die einige Tracks von Soundcloud streamen wird. Als Test habe ich mit der API unter Verwendung von Python gespielt und kann Anfragen stellen, um die URL aufzulösen, die Wiedergabelisten / Titel abzurufen und alles andere, was ich brauche.

Wenn ich eine Anfrage an die stream_url eines bestimmten Tracks stelle, erhalte ich einen 401-Fehler.

Die aktuelle URL lautet: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Ich habe es ohne die? Client_id versucht ... Ich habe versucht, die? Mit & habe ich versucht, eine andere client_id zu erhalten. Ich habe es mit allow_redirects als wahr und falsch versucht, aber nichts scheint zu funktionieren. Jede Hilfe wäre sehr dankbar.

Die streambare Eigenschaft jedes Tracks ist True, daher sollte es sich nicht um ein Berechtigungsproblem handeln.

Bearbeiten:

Nachdem ich ein bisschen recherchiert habe, habe ich eine halb erfolgreiche Problemumgehung gefunden. Der / stream-Endpunkt der API funktioniert immer noch nicht. Wenn Sie jedoch Ihren Zielendpunkt in http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss ändern, erhalten Sie einen entsprechenden RSS-Feed (meistens) das Gleiche wie bei Verwendung des API-Endpunkts für Titel oder Wiedergabelisten.

Der darin enthaltene Link kann gestreamt werden.

Standard
quelle
1
Ich benutze die API seit einer Weile, ich habe kürzlich auch den 401-Fehler erhalten, nicht nur Sie.
r3verse
In meinem Fall mit JavaScript funktioniert die API seit einigen Tagen nicht mehr.
Daniel
Alle Apps, die ich verwende und die Soundcloud-APIs verwenden, sind seit Wochen nicht mehr verfügbar. Es scheint, als hätte SoundCloud die Entwicklung von Drittanbietern so gut wie aufgegeben, was wirklich
scheiße ist

Antworten:

7

Okay, ich glaube, ich habe eine allgemeine Lösung gefunden, die für die meisten Menschen funktioniert. Ich wünschte, es wäre einfacher, aber es ist das Einfachste, was ich bisher gefunden habe.

  1. Verwenden Sie die API, um Titel vom Benutzer abzurufen. Sie können linked_partitioning und die next_href-Eigenschaft verwenden, um alles zu erfassen, da maximal 200 Titel pro Aufruf vorhanden sind.

  2. Mithilfe der im JSON abgerufenen Daten können Sie den Schlüssel permalink_url verwenden, um dasselbe zu erhalten, das Sie in den Browser eingeben würden.

  3. Stellen Sie eine Anfrage an die permalink_url und greifen Sie auf den HTML-Code zu. Sie müssen einige Analysen durchführen, aber die gewünschte URL hat folgende Auswirkungen:

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

    Sie könnten wahrscheinlich einen regulären Ausdruck verwenden, um dies einfach zu analysieren.

  4. Stellen Sie eine Anfrage an diese URL, indem Sie? Client_id = ... hinzufügen, und Sie erhalten NOCH EINE ANDERE URL in der Rückgabe json.

  5. Wenn Sie die im vorherigen Schritt zurückgegebene URL verwenden, können Sie im Browser direkt darauf verweisen und gelangen zu Ihrem Titelinhalt. Ich habe VLC durch Eingabe des Links überprüft und es wird korrekt gestreamt.

Hoffentlich hilft dies einigen von Ihnen bei Ihrer Entwicklung.

Standard
quelle
1
Haben Sie jemals darüber nachgedacht, nur die v2-API zu verwenden? es scheint, dass sie api-v2.soundcloud.com/tracks?id=<song_id>&client_id= Link haben, den sie verwenden
user208685
Das ist eine gute Entscheidung. Wenn Sie jedoch eine direkte Stream-URL erhalten und versuchen, diese abzuspielen, zählt der SoundCloud-Spielzähler dieses Spiel.
Alex
6

Da ich das gleiche Problem habe, hat mich die Antwort von @Default motiviert, nach einer Lösung zu suchen. Aber ich habe die Problemumgehung mit den permalink_url Schritten 2 und 3 nicht verstanden . Die einfachere Lösung könnte sein:

  1. Holen Sie sich zum Beispiel User Track Likes mit api-v2Endpunkt wie folgt:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. In der Antwort finden wir die benötigte URL, wie von @Default in seiner Antwort erwähnt:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. client_idWenn Sie eine Anfrage an diese URL mit als Abfrageparameter stellen, erhalten Sie eine andere URL, mit der Sie den Track streamen / herunterladen können

Beachten Sie, dass das api-v2noch nicht öffentlich ist und die Anfrage von Ihrem Client wahrscheinlich von CORS blockiert wird.

Serg
quelle
3
Tracks von einem Benutzer sind: / users / <Benutzer-ID> / Tracks Likes von einem Benutzer sind: / users / <Benutzer-ID> / track_likes Nur ein einzelner Track ist: / Tracks / <Track_ID>
r3verse
@ r3verse rechts, meine Antwort bearbeitet, aber die Spurdarstellung sollte für verschiedene Endpunkte gleich sein
Serg
Ja fast, @Serg, für eine einzelne Spur haben Sie kein verschachteltes Sammlungsobjekt, aber die Spurdarstellung ist dieselbe. So oder so sehr schön.
r3verse
5

Wie von @ user208685 erwähnt, kann die Lösung mithilfe der SoundCloud-API v2 etwas einfacher sein:

  1. Erhalten Sie die Track-ID (z. B. mithilfe der öffentlichen API unter https://developers.soundcloud.com/docs ).
  2. Holen Sie sich JSON von https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. Von JSON aus analysieren Sie die progressive MP3-Stream-URL
  4. Von der Stream-URL erhalten Sie die MP3-Datei-URL
  5. Spielen Sie Medien von der MP3-Datei-URL ab

Hinweis : Dieser Link ist nur für eine begrenzte Zeit gültig und kann durch Wiederholen der Schritte 3 bis 5 wiederhergestellt werden.

Beispiel in node(mit 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);
})();

Eine ähnliche Lösung in Python finden Sie in diesem GitHub-Problem: https://github.com/soundcloud/soundcloud-python/issues/87

Otto Sichert
quelle