使用SoundCloud默认音频小部件,您可以将其设置为从JavaScript洗牌吗?

使用SoundCloud默认音频小部件,您可以将其设置为从JavaScript洗牌吗?,soundcloud,oembed,Soundcloud,Oembed,我正在使用默认的SoundCloud音频小部件播放播放列表,希望歌曲以随机顺序播放。我使用的是SoundCloud JavaScript SDK oEmbed对象(iframe版本) 有人知道在默认的音频小部件中是否有一个属性可以洗牌歌曲顺序吗 如果没有,是否有办法从默认的SoundCloud小部件捕获事件,以便在歌曲完成事件后播放随机歌曲?就像你可以使用自定义播放器一样 //developers.soundcloud.com/docs/custom player#events 谢谢 更新 这

我正在使用默认的SoundCloud音频小部件播放播放列表,希望歌曲以随机顺序播放。我使用的是SoundCloud JavaScript SDK oEmbed对象(iframe版本)

有人知道在默认的音频小部件中是否有一个属性可以洗牌歌曲顺序吗

如果没有,是否有办法从默认的SoundCloud小部件捕获事件,以便在歌曲完成事件后播放随机歌曲?就像你可以使用自定义播放器一样

//developers.soundcloud.com/docs/custom player#events

谢谢


更新

这是我在得到格里兹利的帮助后使用的代码

“下一步”按钮非常有效。我可以跳过任意的歌曲。不幸的是,当一首曲目播放结束时,我会听到两首歌曲的音频:播放列表中的下一首歌曲和“完成”事件中跳过的随机曲目

var widget = null;
var song_indexes = new Array();
var current_index = 0;

$(function() {
    var iframe = document.querySelector('#soundcloud_player iframe');
    widget = SC.Widget(iframe);        
    widget.bind(SC.Widget.Events.READY, function() {
        widget.unbind(SC.Widget.Events.FINISH);
        widget.bind(SC.Widget.Events.FINISH, function() {        
            play_next_shuffled_song();
        });

        widget.getSounds(function(sounds) {
            create_shuffled_indexes(sounds.length);
            play_next_shuffled_song();
        });               
    });
    $("#button_sc_next").on("click", play_next_shuffled_song);
});

function play_next_shuffled_song() {
    current_index++;
    if (current_index >= song_indexes.length) {
        current_index = 0;
    }  
    var track_number = song_indexes[current_index];
    widget.skip(track_number);
}

function create_shuffled_indexes (num_songs) {
    for (var i=0;i<num_songs;i++) {
        song_indexes.push(i);
    }
    song_indexes = shuffle(song_indexes);
}

//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/array/shuffle [v1.0]
function shuffle(o){ //v1.0
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
};
var小部件=null;
var song_index=新数组();
var当前_指数=0;
$(函数(){
var iframe=document.querySelector(“#soundcloud_player iframe”);
widget=SC.widget(iframe);
bind(SC.widget.Events.READY,function()){
解除绑定(SC.widget.Events.FINISH);
widget.bind(SC.widget.Events.FINISH,function(){
播放下一首洗牌歌曲();
});
getSounds(函数(声音){
创建乱序索引(sounds.length);
播放下一首洗牌歌曲();
});               
});
$(“#按钮"下一步”)。在(“单击”,播放"下一步"洗牌歌曲);
});
函数播放\u下一首\u洗牌\u歌曲(){
当前_索引++;
如果(当前索引>=歌曲索引.length){
当前_指数=0;
}  
var跟踪编号=宋指数[当前指数];
widget.skip(轨道号);
}
函数create_shuffled_索引(num_歌曲){

对于(var i=0;i,您可以找到小部件API的文档

这方面的伪代码类似于:

load widget
get widget sounds LENGTH /* say 5 */
create an ARRAY of that LENGTH and shuffle it /* to have something like [3, 1, 0, 2, 4] */
create function SKIP that will check if ARRAY still has any items in it (length is not 0) and skip player to array.pop() index /* pop will return the last item in the array and return its value */
attach event handler to FINISH events that will run SKIP function
run SKIP function first time yourself
如果用户跳过小部件UI中的“下一步”控件,小部件将 只需播放列表中的下一首歌,你可能会发现这一点 不知何故,跳到另一个随机轨道


我希望这能有所帮助!

感谢您提供的信息。使用Widget API,我可以让一个按钮跳到一首随机歌曲。不幸的是,如果我让FINISH事件调用相同的skip函数,则会在后台播放第二首歌曲。它会播放播放列表中的下一首歌曲和跳到的随机歌曲。嘿,我尝试了您的代码,它似乎是w很好!这里有一个工作示例:如果您将iframe src设置为在歌曲结束之前单击,则会出现问题。让它播放到结尾。当新的随机歌曲开始时,播放列表中的下一首歌曲也会播放。如果您按pause,它只会暂停随机曲目。播放列表中的下一首歌曲仍在播放。可能会出现这种情况我试着把URL改成“喜欢”(他们现在称之为“收藏夹”),但没用。
$(document).bind('onPlayerTrackSwitch.scPlayer', function(event, track){  
  // goto random track   
});  
var widget = null;
var song_indexes = new Array();
var current_index = 0;

$(function() {
    var iframe = document.querySelector('#soundcloud_player iframe');
    widget = SC.Widget(iframe);        
    widget.bind(SC.Widget.Events.READY, function() {
        widget.unbind(SC.Widget.Events.FINISH);
        widget.bind(SC.Widget.Events.FINISH, function() {        
            play_next_shuffled_song();
        });

        widget.getSounds(function(sounds) {
            create_shuffled_indexes(sounds.length);
            play_next_shuffled_song();
        });               
    });
    $("#button_sc_next").on("click", play_next_shuffled_song);
});

function play_next_shuffled_song() {
    current_index++;
    if (current_index >= song_indexes.length) {
        current_index = 0;
    }  
    var track_number = song_indexes[current_index];
    widget.skip(track_number);
}

function create_shuffled_indexes (num_songs) {
    for (var i=0;i<num_songs;i++) {
        song_indexes.push(i);
    }
    song_indexes = shuffle(song_indexes);
}

//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/array/shuffle [v1.0]
function shuffle(o){ //v1.0
    for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
};
load widget
get widget sounds LENGTH /* say 5 */
create an ARRAY of that LENGTH and shuffle it /* to have something like [3, 1, 0, 2, 4] */
create function SKIP that will check if ARRAY still has any items in it (length is not 0) and skip player to array.pop() index /* pop will return the last item in the array and return its value */
attach event handler to FINISH events that will run SKIP function
run SKIP function first time yourself