Soundcloud API / stream endpoint dający błąd 401

13

Próbuję napisać natywną aplikację, która przesyła strumieniowo niektóre utwory z Soundcloud. Jako test bawiłem się interfejsem API przy użyciu Pythona i jestem w stanie wysyłać żądania rozwiązania adresu URL, pobierania list odtwarzania / utworów i wszystkiego, czego potrzebuję.

Powiedziawszy to, kiedy przesyłam żądanie do stream_url dowolnej ścieżki, otrzymuję błąd 401.

Aktualny adres URL to: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Próbowałem bez? Client_id ..., próbowałem zastąpić? z &, próbowałem uzyskać inny identyfikator_klienta, wypróbowałem go z parametrami allow_redirects jako prawdą i fałszem, ale nic nie działa. Każda pomoc byłaby bardzo mile widziana.

Właściwość do przesyłania strumieniowego każdej ścieżki ma wartość True, więc nie powinna to być kwestia uprawnień.

Edytować:

Po przeprowadzeniu drobnych badań znalazłem częściowo udane obejście. Punkt końcowy / stream interfejsu API nadal nie działa, ale jeśli zmienisz docelowy punkt końcowy na http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss, otrzymasz kanał RSS, który (głównie) to samo, co można uzyskać za pomocą punktu końcowego interfejsu API ścieżek lub list odtwarzania.

Link w nim zawarty może być przesyłany strumieniowo.

Domyślna
źródło
1
Używam API od jakiegoś czasu, ostatnio pojawia się również błąd 401, to nie tylko ty.
r3verse
W moim przypadku z JavaScript API nie działa od kilku dni.
Daniel
wszystkie aplikacje, z których korzystam, te interfejsy API SoundCloud zostały wyłączone od tygodni. Wygląda na to, że SoundCloud całkiem zrezygnował z tworzenia stron trzecich, co naprawdę jest do bani
oriyentel

Odpowiedzi:

7

Okej, myślę, że znalazłem uogólnione rozwiązanie, które będzie działać dla większości ludzi. Chciałbym, żeby było łatwiej, ale to najprostsza rzecz, jaką do tej pory znalazłem.

  1. Użyj interfejsu API, aby pobrać ścieżki od użytkownika. Możesz użyć link_partitioning i właściwości next_href, aby zebrać wszystko, ponieważ istnieje maksymalny limit 200 ścieżek na połączenie.

  2. Korzystając z danych pobranych w JSON, możesz użyć klucza permalink_url, aby uzyskać to samo, co wpiszesz w przeglądarce.

  3. Złóż wniosek na permalink_url i uzyskaj dostęp do HTML. Musisz parsować, ale adres URL, którego potrzebujesz, będzie miał wpływ na:

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

    Prawdopodobnie możesz użyć wyrażenia regularnego, aby to parsować po prostu.

  4. Poproś o dodanie tego adresu URL? Client_id = ... a otrzymasz JESZCZE INNY adres URL w zwrocie json.

  5. Korzystając z adresu URL zwróconego z poprzedniego kroku, możesz połączyć się bezpośrednio z tym w przeglądarce, a to zabierze Cię do zawartości ścieżki. Sprawdziłem VLC, wprowadzając link, który przesyła poprawnie.

Mam nadzieję, że pomoże to niektórym z was w rozwoju.

Domyślna
źródło
1
czy kiedykolwiek zastanawiałeś się nad użyciem interfejsu API v2? wydaje się, że mają api-v2.soundcloud.com/tracks?id=<song_id>&client_id= link, który oni używają
user208685
To dobra decyzja. Ale kiedy otrzymasz bezpośredni adres URL strumienia i spróbujesz go odtworzyć, licznik odtworzeń SoundCloud zlicza tę liczbę.
Alex
6

Ponieważ mam ten sam problem, odpowiedź z @Default zmotywowała mnie do poszukiwania rozwiązania. Ale nie zrozumiałem obejścia opisanego permalink_url w krokach 2 i 3. Łatwiejszym rozwiązaniem może być:

  1. Pobierz na przykład ścieżkę użytkownika, która lubi polubienie za pomocą api-v2punktu końcowego:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. W odpowiedzi możemy znaleźć potrzebny adres URL, jak wspomniano w @Default w jego odpowiedzi:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Złóż zapytanie na ten adres URL client_idjako parametr zapytania, a otrzymasz inny adres URL, za pomocą którego możesz przesyłać strumieniowo / pobierać ścieżkę

Pamiętaj, że api-v2nadal nie jest to publiczne, a żądanie Twojego klienta prawdopodobnie zostanie zablokowane przez CORS.

Serg
źródło
3
Utwory od użytkownika to: / users / <identyfikator_użytkownika> / tracks Lubi od użytkownika: / users / <identyfikator_użytkownika> / track_likes Tylko jeden utwór to: / tracks / <track_id>
r3verse
@ r3verse po prawej, zredagowałem moją odpowiedź, ale reprezentacja ścieżki powinna być taka sama dla różnych punktów końcowych
Serg
Tak, prawie @Serg, dla pojedynczej ścieżki nie masz zagnieżdżonego obiektu kolekcji, ale reprezentacja ścieżki jest taka sama. Bardzo miło z obu stron.
r3verse
5

Jak wspomniano w @ user208685, rozwiązanie może być nieco prostsze przy użyciu SoundCloud API v2:

  1. Uzyskaj identyfikator ścieżki (np. Używając publicznego interfejsu API na https://developers.soundcloud.com/docs )
  2. Uzyskaj JSON z https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. Z JSON parsuj MP3 progresywny URL strumienia
  4. Z adresu URL strumienia pobierz adres URL pliku MP3
  5. Odtwarzaj multimedia z adresu URL pliku MP3

Uwaga : ten link jest ważny tylko przez ograniczony czas i można go zregenerować, powtarzając kroki od 3 do 5.

Przykład w node(z 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);
})();

Aby znaleźć podobne rozwiązanie w Pythonie, sprawdź ten problem GitHub: https://github.com/soundcloud/soundcloud-python/issues/87

Otto Sichert
źródło