【问题标题】:Soundcloud custom player add and play song dynamicallySoundcloud 自定义播放器动态添加和播放歌曲
【发布时间】:2013-09-01 18:16:35
【问题描述】:

我正在使用soundcloud custom player创建一个可以播放所有歌曲的播放器 我的网站。当我只放置任何曲目或帖子的静态 url 时,这非常有效。但我想要的是动态地将歌曲添加到列表中。

我做了很多研究,但无法让它发挥作用。我想要的是整个网站会有多个玩家。有点(http://soundcloud.com),顶部会有一个主播放器(如 soundcloud),它将在现场播放大约 100 首最新歌曲,并且会有一个较小的播放器点击它只会将该歌曲添加到列表中并开始播放那首歌。

我不确定这是否是正确的过程。如果任何人都可以给我任何提示,我可以如何继续前进,那就太好了。

【问题讨论】:

    标签: javascript jquery audio-streaming soundcloud


    【解决方案1】:

    我会尽力为您提供尽可能多的信息,但由于无处可去,我不确定它是否会有所帮助。从wiki 开始很重要。这是我可以从那里提取的:

    动态轨道加载

    可以动态创建播放器,因此可以添加任何 url。为此,可以使用以下方法:

    直接附加到元素:

        $('div.your-container-class').scPlayer({
            links: [{url: "http://soundcloud.com/matas/hobnotropic", title: "http://soundcloud.com/matas/hobnotropic"}]
        });
    

    创建对象并附加到您想要的位置:

        var $myPlayer  = $.scPlayer({
            links: [{url: "http://soundcloud.com/matas/hobnotropic", title: "http://soundcloud.com/matas/hobnotropic"}]
        });
        $myPlayer.appendTo($('#somewhere-deep-in-the-dom'));
    

    我刚刚找到的一个小例子:

        $(function() {
            $('a.sc-remote-play1').on('click', function(event) {
                $('.sc-player').scPlayer({
                    links: [{url: "http://soundcloud.com/matas/hobnotropie", title:   "Hobnotropic"}],
                });
            });
        }); 
    

    我相信应该解决动态轨道加载。

    初始化 scPlayer

    重要的是要考虑到 scPlayer 必须自己加载,因此如果您直接使用 jQuery 更改 url,它将无法工作。为了在 DOM 加载后初始化 scPlayer,您可以使用

    $('a.your-link-class').scPlayer();
    

    $('div.your-container-class').scPlayer();
    

    正如我所说,默认加载发生在使用以下方法加载 DOM 时

    $('a.sc-player, div.sc-player').scPlayer();
    

    可以按如下方式更改此默认行为:

    $.scPlayer.defaults.onDomReady = function(){
      // Default behaviour wanted. Per default we have:
      $('a.your-link-class').scPlayer();
    };
    

    这就是我现在所做的。尝试让 scPlayer 正常工作(动态加载歌曲),然后我们可以跟进数据加载和所有这些内容。

    【讨论】:

      【解决方案2】:

      在 Wiki 中进行了大量研究,研究了 sc-player.js 中的代码,并进行了一些测试后,我想我已经找到了解决您问题的方法。请尝试以下操作:

      首先,将此代码添加到 sc-player.js 文件中,就在注释 // the default Auto-Initialization 之前(这一行就像文件末尾之前的 8 行)

      $.scPlayer.loadTrackInfoAndPlay=function($elem,track){
              var playerObj=players[$elem.data('sc-player').id];
              playerObj.tracks.push(track);
              var index =playerObj.tracks.length-1;
              var $list=$(playerObj.node).find('.sc-trackslist');
              var $artworks=$(playerObj.node).find(".sc-artwork-list");
              // add to playlist
              var $li=$('<li><a href="' + track.permalink_url +'">' + track.title + '</a><span class="sc-track-duration">' + timecode(track.duration) + '</span></li>')
                  .data('sc-track', {id:index})
                  .appendTo($list);
              // add to artwork list
              $('<li></li>')
                  .append(artworkImage(track, true))
                  .appendTo($artworks)
                  .data('sc-track', track);
              $li.click();
          }
      

      上述函数负责将新曲目添加到播放列表并开始播放该曲目。

      现在,假设你有这个播放器的 html 代码

      <h2>Top Player</h2>
      <div id="topPlayer">
          <div class="sc-player">
              <a href="http://soundcloud.com/matas/matas-petrikas-live-at-gravity-club-30-05-2008">My live track</a>
              <a href="http://soundcloud.com/matas/on-the-bridge">On the bridge</a>
          </div>
      </div>
      <h2>Small Player</h2>
      <div id="smallPlayer">
          <a href="http://soundcloud.com/forss/sets/soulhack" class="sc-player">Soulhack</a>
      </div>
      

      确保将您的sc-players 包装在div 中,最好使用id,以便稍后在Javascript 中引用玩家:

      最后,您可以使用此 Javscript 代码来检测何时在smallPlayer 中单击曲目并在topPlayer 中添加和播放该曲目

      $(function(){
          var $topPlayer=$("#topPlayer .sc-player");//Top player
          var $smallPlayer=$("#smallPlayer .sc-player");//Small Player
          $smallPlayer.on("onPlayerInit.scPlayer",function(evt){//When player is ready
              $smallPlayer.on("onPlayerTrackSwitch.scPlayer",function(evt,track){//Listen to track switch in smallPlayer
                  setTimeout(function(){//Wait a bit, to avoid playing problems between both players
                      $.scPlayer.loadTrackInfoAndPlay($topPlayer, track);
                  },250);
              });
          });
      });
      

      就是这样!

      编辑

      如果您只有要添加的歌曲的网址,您可以执行以下操作:

      首先,将另一个函数添加到sc-player.js 文件中,就在前面的loadTrackInfoAndPlay 函数之后:

      $.scPlayer.loadTrackUrlAndPlay=function($elem,url){
          var apiUrl = scApiUrl(url, apiKey);
          $.getJSON(apiUrl, function(data) {
              if(data.duration){
                data.permalink_url = url;
                $.scPlayer.loadTrackInfoAndPlay($elem,data);//Call the previous function
              }
          });
      }
      

      现在,假设您有以下歌曲网址的代码:

      <p>
          The links <br />
          <a class="songUrl" href="https://soundcloud.com/feintdnb/coldplay-fix-you-feint-bootleg">Coldplay-Fix you</a><br />
          <a class="songUrl" href="https://soundcloud.com/nct-1/nct-you-preview-out-soon-for">NCT - You</a><br />
          <a class="songUrl" href="https://soundcloud.com/tufftouch/devil-eyes-konflix-feat-leanne">Konflix - Devil Eyes</a>
      </p>
      

      然后,您可以使用此代码将歌曲添加到播放列表并开始播放(如果已经存在,则直接播放)

      $(".songUrl").click(function(event){
          event.preventDefault();
          var url=$(this).attr("href");//Url of the song
          //If the song is in the tracks list, this line finds it
          var $theSong=$topPlayer.find(".sc-trackslist a[href='"+url+"']");
          if($theSong.length==0){//
              $.scPlayer.loadTrackUrlAndPlay($topPlayer,url );
          }else{
              $theSong.parent().click();//Fire click = play the song
          }
      });
      

      这就是我们所需要的。

      【讨论】:

      • 这就像一种魅力,但怎么会有一个问题。小播放器不是soundcloud播放器,它就像&lt;a href="http://soundcloud.com/matas/on-the-bridge"&gt;On the bridge&lt;/a&gt;之类的特定曲目的url 当我点击它时,我希望它被添加到顶级播放器并开始播放,如果曲目已经在播放器上它只会开始播放,而不是添加和播放。我已经成功了,但这并不是我真正需要的。
      • @NirmalRam 我已经更新了我的答案以反映你提到的变化
      • @NirmalRam 很高兴为您提供帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多