【问题标题】:how to get soundcloud audio download url by using audio file id如何使用音频文件 id 获取 soundcloud 音频下载 url
【发布时间】:2025-12-21 20:50:11
【问题描述】:

我正在使用声音云搜索 API。当我点击搜索网址时,它会给我搜索结果。每个音频都有流 url 但没有下载 url,因为它取决于上传者的设置。每个不可下载的文件也有超过 1 的下载次数。例如,当你点击这个 url 时

http://api.soundcloud.com/tracks.json?client_id=4346c8125f4f5c40ad666bacd8e96498&q=tere%20bin&limit=1

它会给出这样的搜索结果

[{"kind":"track","id":63225776,"created_at":"2012/10/13 01:52:38 +0000","user_id":26029726,"duration":206177,"commentable":true,"state":"finished","original_content_size":3298521,"last_modified":"2014/10/01 18:56:25 +0000","sharing":"public","tag_list":"","permalink":"tere-bin-uzair-jaswal-official","streamable":true,"embeddable_by":"all","downloadable":false,"purchase_url":null,"label_id":null,"purchase_title":null,"genre":"Musical","title":"Tere Bin - Uzair Jaswal [Official Music Audio]","description":"","label_name":"","release":"","track_type":"original","key_signature":"","isrc":"","video_url":null,"bpm":null,"release_year":null,"release_month":null,"release_day":null,"original_format":"mp3","license":"all-rights-reserved","uri":"https://api.soundcloud.com/tracks/63225776","user":{"id":26029726,"kind":"user","permalink":"uzair-jaswal-1","username":"Uzair Jaswal Music","last_modified":"2014/10/19 13:06:28 +0000","uri":"https://api.soundcloud.com/users/26029726","permalink_url":"http://soundcloud.com/uzair-jaswal-1","avatar_url":"https://i1.sndcdn.com/avatars-000110064166-2ts508-large.jpg"},"permalink_url":"http://soundcloud.com/uzair-jaswal-1/tere-bin-uzair-jaswal-official","artwork_url":"https://i1.sndcdn.com/artworks-000032079002-kup6vc-large.jpg","waveform_url":"https://w1.sndcdn.com/9bwAsZfGrxwN_m.png","stream_url":"https://api.soundcloud.com/tracks/63225776/stream","playback_count":359588,"download_count":100,"favoritings_count":7557,"comment_count":491,"attachments_uri":"https://api.soundcloud.com/tracks/63225776/attachments","policy":"ALLOW"}]

这仅适用于一个音频,该音频不可下载,但下载次数为 100。这怎么可能? 谁能告诉我如何下载不可下载的音频? 任何帮助将非常感激。谢谢:)

【问题讨论】:

  • 也许它最初是作为可下载发布的,后来上传者更改了设置?
  • 有没有办法下载不可下载的音频文件?
  • 我当然希望不是 :) 如果在使用 API 时仍然有人可以下载文件,那么用户将文件设置为不可下载的意义何在?
  • 谢谢老哥,直播网址也是安卓的下载网址。我正在使用它并且它正在工作:)
  • 如果您可以访问流 url,请将其作为下载提供。我想普通帐户有这些下载限制,我也是>>检查链接soundcloud.com/bnzlovesyou/she-is-like-the-wind

标签: android json audio soundcloud


【解决方案1】:

我自己修复它,我使用的是 android 并且流 url 也是一个下载 url。流 url 也是用于下载的下载 url,但不会影响下载次数。你可以这样试试

String file_url = "https://api.soundcloud.com/tracks/93216523/stream?client_id=4346c8125f4f5c40ad666bacd8e96498"; 

将此网址传递给asyntack并管理您在那里下载,您可以这样传递它

new DownloadFileFromURL().execute(file_url);

这里是使用 asyntask 的 DownloadFileFromUR 类

class DownloadFileFromURL extends AsyncTask<String, Integer, String> {


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... f_url) {
            URL u = null;
            InputStream is = null;  

                 try {
                          u = new URL(f_url[0]);
                          is = u.openStream(); 
                          HttpURLConnection huc = (HttpURLConnection)u.openConnection();//to know the size of video
                          int size = huc.getContentLength();                 

                      if(huc != null){
                          String fileName = "FILE2.mp3";
                          String storagePath = Environment.getExternalStorageDirectory().toString();
                          File f = new File(storagePath,fileName);

                          FileOutputStream fos = new FileOutputStream(f);
                          byte[] buffer = new byte[1024];
                          long total = 0;
                          int len1 = 0;
                          if(is != null){
                             while ((len1 = is.read(buffer)) > 0) {
                                 total+=len1;
                                 publishProgress((int)((total*100)/size));
                                   fos.write(buffer,0, len1);   
                             }
                          }
                          if(fos != null){
                             fos.close();
                          }
                      }                     
                 }catch (MalformedURLException mue) {
                        mue.printStackTrace();
                 } catch (IOException ioe) {
                        ioe.printStackTrace();
                } finally {
                           try {                
                             if(is != null){
                               is.close();
                             }
                           }catch (IOException ioe) {
                                 // just going to ignore this one
                           }
                }
                 return "";
        }


        @Override
        protected void onPostExecute(String file_url) {


        }

    }

【讨论】:

    【解决方案2】:
    String file_url = "https://api.soundcloud.com/tracks/93216523/stream?client_id=4346c8125f4f5c40ad666bacd8e96498"; 
    

    下载类:

      private class DownloadFile extends AsyncTask<String, Integer, String> {
        @Override
        protected String doInBackground(String... params) {
            int count;
            try {
    
                URL url = new URL(file_url);
                URLConnection conexion = url.openConnection();
                conexion.connect();
                // this will be useful so that you can show a tipical 0-100% progress bar
                int lenghtOfFile = conexion.getContentLength();
    
                // download the file
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream(getOutputMediaFile());
                byte data[] = new byte[1024];
                long total = 0;
                while ((count = input.read(data)) != -1) {
                    total += count;           
                    // publishing the progress....
                    publishProgress((int) (total * 100 / lenghtOfFile));
    
                    output.write(data, 0, count);
                }
                output.flush();
                output.close();
                input.close();
            } catch (Exception e) {
            }
            return null;
        }
    
        @Override
        protected void onProgressUpdate(Integer... values) {
    
            super.onProgressUpdate(values);
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }
    }
    

    【讨论】: