[react-native] 401 오류를 발생시키는 Soundcloud API / 스트림 엔드 포인트

Soundcloud에서 일부 트랙을 스트리밍하는 반응 기본 앱을 작성하려고합니다. 테스트로, 나는 파이썬을 사용하여 API를 가지고 놀고 있었고, URL을 해결하고, 재생 목록 / 트랙 및 필요한 모든 것을 가져 오기 위해 요청을 할 수 있습니다.

그렇게 말하면 주어진 트랙의 stream_url에 요청하면 401 오류가 발생합니다.

문제의 현재 URL은 다음과 같습니다.
https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

? client_id …없이 시도했지만,? &를 사용하여 다른 client_id를 얻으려고 시도했지만 allow_redirects를 true 및 false로 시도했지만 아무것도 작동하지 않는 것 같습니다. 도움을 주시면 감사하겠습니다.

모든 트랙의 스트리밍 가능 속성은 True이므로 권한 문제가 아니어야합니다.

편집하다:

약간의 연구를 한 후, 반 성공한 해결 방법을 찾았습니다. API의 / stream 엔드 포인트가 여전히 작동하지 않지만 대상 엔드 포인트를 http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss 로 변경 하면 RSS 피드가 제공됩니다. (대부분) 트랙 또는 재생 목록 API 엔드 포인트를 사용하여 얻는 것과 동일합니다.

그 안에 포함 된 링크는 스트리밍 될 수 있습니다.



답변

좋아, 나는 대부분의 사람들에게 효과가있는 일반적인 솔루션을 찾았다 고 생각한다. 나는 그것이 더 쉬웠 으면 좋겠지 만, 내가 찾은 가장 간단한 것입니다.

  1. API를 사용하여 사용자로부터 트랙을 가져옵니다. 통화 당 최대 200 개의 트랙이 있기 때문에 linked_partitioning 및 next_href 속성을 사용하여 모든 것을 수집 할 수 있습니다.

  2. JSON에서 풀다운 된 데이터를 사용하여 permalink_url 키를 사용하여 브라우저에 입력 한 것과 동일한 것을 얻을 수 있습니다.

  3. permalink_url을 요청하고 HTML에 액세스하십시오. 파싱을 수행해야하지만 원하는 URL은 다음과 같은 효과가 있습니다.

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

    아마 정규 표현식을 사용하여 이것을 간단하게 파싱 할 수 있습니다.

  4. ? client_id = …를 추가하여이 URL에 요청하면 리턴 json에 다른 URL이 표시됩니다.

  5. 이전 단계에서 반환 된 URL을 사용하여 브라우저에서 해당 URL에 직접 링크하면 트랙 컨텐츠로 이동합니다. 링크를 입력하여 VLC를 확인하면 올바르게 스트리밍됩니다.

잘하면 이것은 당신의 일부를 개발하는 데 도움이되기를 바랍니다.


답변

나는 같은 문제가 있기 때문에 @Default의 대답은 해결책을 찾도록 동기를 부여했습니다. 그러나 permalink_url 2 단계와 3 단계 의 해결 방법을 이해하지 못했습니다 . 더 쉬운 해결책은 다음과 같습니다.

  1. 예를 들어 api-v2다음과 같은 엔드 포인트를 사용하여 좋아하는 사용자 트랙을 가져옵니다 .
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. 응답에서 @Default에서 언급 한 것처럼 필요한 URL을 찾을 수 있습니다.
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. client_id검색어 매개 변수 로이 URL을 요청 하면 트랙을 스트리밍 / 다운로드 할 수있는 다른 URL이 제공됩니다.

(가) 있습니다 api-v2아직 공개하지 않고 클라이언트에서 요청이 아마 CORS에 의해 차단됩니다.


답변

@ user208685 에서 언급했듯이 SoundCloud API v2를 사용하면 솔루션이 약간 간단해질 수 있습니다.

  1. 트랙 ID를 얻습니다 (예 : https://developers.soundcloud.com/docs 의 공개 API 사용 )
  2. https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID 에서 JSON을 가져옵니다.
  3. JSON 구문 분석 MP3 프로그레시브 스트림 URL에서
  4. 스트림 URL에서 MP3 파일 URL 가져 오기
  5. MP3 파일 URL에서 미디어 재생

참고 :이 링크는 제한된 시간 동안 만 유효하며 3 단계에서 5 단계를 반복하여 재생성 할 수 있습니다.

node(함께 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);
})();

파이썬에서 비슷한 솔루션을 보려면 다음 GitHub 문제를 확인하십시오. https://github.com/soundcloud/soundcloud-python/issues/87


답변