API do Soundcloud / ponto de extremidade de fluxo que fornece erro 401

13

Estou tentando escrever um aplicativo nativo de reação, que transmitirá algumas faixas do Soundcloud. Como teste, eu tenho jogado com a API usando python, e sou capaz de fazer solicitações para resolver o URL, puxar as listas de reprodução / faixas e tudo mais que eu preciso.

Com isso dito, ao fazer uma solicitação para o stream_url de qualquer faixa, eu recebo um erro 401.

O URL atual em questão é: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

Eu tentei sem o? Client_id ..., tentei substituir o? com &, tentei obter outro client_id, tentei com allow_redirects como verdadeiro e falso, mas nada parece funcionar. Qualquer ajuda seria muito apreciada.

A propriedade streamable de cada faixa é True, portanto, não deve ser um problema de permissão.

Editar:

Depois de pesquisar um pouco, encontrei uma solução alternativa sem sucesso. O terminal / stream da API ainda não está funcionando, mas se você alterar o terminal de destino para http://feeds.soundcloud.com/users/soundcloud:users : /sounds.rss, ele fornecerá um feed RSS que é (principalmente) o mesmo que você obteria usando o ponto de extremidade da API de faixas ou listas de reprodução.

O link contido nele pode ser transmitido.

Padrão
fonte
11
Estou usando a API há algum tempo, também recebo o erro 401 recentemente, não é só você.
R3verse #
No meu caso com JavaScript, a API não funciona há alguns dias.
Daniel
todos os aplicativos que eu uso que atingem as APIs do soundcloud estão em queda há semanas. Parece que SoundCloud tem praticamente abandonou o desenvolvimento de terceiros que realmente é uma porcaria
oriyentel

Respostas:

7

Ok, acho que encontrei uma solução generalizada que funcionará para a maioria das pessoas. Eu gostaria que fosse mais fácil, mas é a coisa mais simples que eu já encontrei.

  1. Use a API para obter faixas do usuário. Você pode usar o linked_partitioning e a propriedade next_href para reunir tudo, porque há um limite máximo de 200 trilhas por chamada.

  2. Usando os dados puxados no JSON, você pode usar a chave permalink_url para obter a mesma coisa que digitaria no navegador.

  3. Faça uma solicitação para o permalink_url e acesse o HTML. Você precisará fazer uma análise, mas o URL que desejar será algo com o efeito de:

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

    Você provavelmente poderia usar um regex para analisar isso simplesmente.

  4. Faça uma solicitação para esse URL adicionando? Client_id = ... e ele fornecerá mais um URL em seu retorno json.

  5. Usando o URL retornado da etapa anterior, você pode vincular diretamente ao URL do navegador e o direcionará para o conteúdo da sua faixa. Eu verifiquei no VLC inserindo o link e ele transmite corretamente.

Espero que isso ajude alguns de vocês no seu desenvolvimento.

Padrão
fonte
11
você já pensou em usar a API v2? parece que eles têm o link api-v2.soundcloud.com/tracks?id=<song_id>&client_id= que eles usam
user208685
Esta é uma boa decisão. Mas quando você obtém o URL do stream direto e tenta reproduzi-lo, o SoundCloud reproduz o contador que conta essa reprodução.
Alex
6

Como tenho o mesmo problema, a resposta da @Default me ​​motivou a procurar uma solução. Mas não entendi a solução alternativa permalink_url nas etapas 2 e 3. A solução mais fácil poderia ser:

  1. Busque, por exemplo, trilhas de usuário que usem api-v2pontos de extremidade como este:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. Na resposta, podemos encontrar o URL necessário, como mencionado em @Default, em sua resposta:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Faça uma solicitação para este URL client_idcomo um parâmetro de consulta e você obterá outro URL com o qual poderá transmitir / baixar a faixa

Observe que api-v2ainda não é público e a solicitação do seu cliente provavelmente será bloqueada pelo CORS.

Serg
fonte
3
Faixas de um usuário é: / Users / <user_id> / faixas Curtiu de um usuário é: / usuários / <user_id> / track_likes apenas uma única faixa é: / faixas / <track_id>
r3verse
@ direito r3verse, editado minha resposta, mas a representação pista deve ser a mesma para diferentes endpoints
Serg
Sim, quase @Serg, para uma única faixa, você não tem um objeto de coleção aninhada, mas a representação da faixa é a mesma. Muito bom de qualquer maneira.
R3verse
5

Conforme mencionado por @ user208685, a solução pode ser um pouco mais simples usando a API do SoundCloud v2:

  1. Obtenha o ID da faixa (por exemplo, usando a API pública em https://developers.soundcloud.com/docs )
  2. Obtenha o JSON em https://api-v2.soundcloud.com/tracks/TRACK_ID?client_id=CLIENT_ID
  3. No JSON, analise o URL do fluxo progressivo do MP3
  4. No URL do stream, obtenha o URL do arquivo MP3
  5. Reproduzir mídia a partir do URL do arquivo MP3

Nota : Este link é válido apenas por um período limitado e pode ser regenerado repetindo as etapas 3. a 5.

Exemplo em node(com 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 uma solução semelhante em Python, verifique este problema do GitHub: https://github.com/soundcloud/soundcloud-python/issues/87

Otto Sichert
fonte