デフォルトのSoundCloudオーディオウィジェットを使用してプレイリストを再生していて、曲をランダムな順序で再生したいと思っています。SoundCloud JavaScript SDK oEmbedオブジェクト(iframeバージョン)を使用しています。
<script src="//connect.soundcloud.com/sdk.js"></script>
SC.oEmbed("//soundcloud.com/buzzinfly", {
auto_play: true,
start_track: random_start_track,
iframe: true,
maxwidth: 480,
enable_api: true,
randomize: true
},
document.getElementById("soundcloud_player"));
ドキュメントにはランダム化またはシャッフル属性については記載されていませんが、start_trackなどの他のドキュメント化されていない属性はoembedでサポートされています。
//developers.soundcloud.com/docs/oembed#parameters
//developers.soundcloud.com/docs/widget
デフォルトのオーディオウィジェットに曲の順序をシャッフルする属性があるかどうか誰かが知っていますか?
そうでない場合は、デフォルトのSoundCloudウィジェットからイベントをキャプチャする方法があるので、曲の終了イベントの後にランダムな曲を再生できますか?カスタムプレーヤーでできるように。
//developers.soundcloud.com/docs/custom-player#events
$(document).bind('onPlayerTrackSwitch.scPlayer', function(event, track){
// goto random track
});
ありがとう
アップデート
これがgryzzlyの助けを得た後に私が使っているコードです。
次のボタンはうまく機能します。ランダムな曲をスキップできます。残念ながら、トラックの再生が終了すると、プレイリスト内の次の曲と、FINISHイベントでスキップされるランダムトラックの2つの曲のオーディオが聞こえます。
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;
};