Javascript & Soundcloud Widget:如何将新曲目加载到 SC Widget iFrame(通过 URL)
Javascript & Soundcloud Widget: How to load new track into SC Widget iFrame (via URL)
我见过不同的网络应用程序,如 Playmoss、Whyd 和 Songdrop 等。我认为,它们必须利用 Soundcloud Embedded Widget 才能产生连续播放多个曲目的功能,而不是分开播放一组/(播放列表)。目前我在使用以下库重现此功能时遇到问题,因此我决定尝试编写自己的库:
https://github.com/eric-robinson/SCLPlayer
我对编写 javascript 很陌生,但我的下面代码将加载第一首曲目,并在点击“就绪”绑定后播放。一旦点击“完成”绑定,它将跳转到 loadNextTrack() 函数并将下一个曲目 URL 加载到小部件的 iFrame 的 src 中。在那之后,它永远不会达到最初的“就绪”绑定,然后开始播放。
为了澄清问题,第二首曲目没有开始播放。
<script type = "text/javascript">
var SCLPlayer = {
isPlayerLoaded : false,
isPlayerFullLoaded : false,
needsFirstTrackSkip : true,
isPaused: true,
scPlayer : function() {
widgetContainer = document.getElementById('sc');
widget = SC.Widget(widgetContainer);
return widget;
},
loadNextTrack : function() {
var ifr = document.getElementById('sc');
ifr.src = 'http://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/231758952';
console.log ('Loading Next Track');
SCLPlayer.scPlayer().bind(SC.Widget.Events.READY, function() {
console.log ('Player is Ready, next Track');
SCLPlayer.scPlayer().play();
});
}
};
$( '#sc' ).ready(function() {
SCLPlayer.scPlayer().bind(SC.Widget.Events.READY, function() {
SCLPlayer.isPlayerLoaded = true;
//window.location = 'sclplayer://didLoad';
console.log ('Player is Ready');
SCLPlayer.scPlayer().play();
});
SCLPlayer.scPlayer().bind(SC.Widget.Events.PLAY, function() {
SCLPlayer.isPaused = false;
//window.location = 'sclplayer://didPlay';
console.log ('Player did Play');
});
SCLPlayer.scPlayer().bind(SC.Widget.Events.PAUSE, function() {
SCLPlayer.isPaused = true;
//window.location = 'sclplayer://didPause';
console.log ('Player did Pause');
});
SCLPlayer.scPlayer().bind(SC.Widget.Events.FINISH, function() {
SCLPlayer.isPaused = true;
//window.location = 'sclplayer://didFinish';
console.log ('Player did Finish');
SCLPlayer.loadNextTrack();
});
});
</script>
</head>
<body>
<iframe id = "sc" width="100%" height="100%" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/226183306"></iframe>
</body>
我写这个 Javascript 的目的是为了在我的 iOS 应用程序中使用 Swift 到 Javascript 的桥接来控制加载曲目进入嵌入式播放器。由于某种原因,由于连接速度较慢,下一首曲目并不总是加载到播放器中,使用 "bridge"。我希望在 currentTrack 完成之前将 nextTrackURL 提供给事物的 javascript 端,这样桥就不会传送任何东西并且 Javascript 可以单独处理新的轨道加载。
我想你想使用加载功能为新曲目指定url
来自 soundcloud Widget API 文档:
load(url, options) — 使用 url 指定的新小部件重新加载 iframe 元素。所有之前添加的事件侦听器将继续工作。 options 是一个对象,它允许您定义所有可能的小部件参数以及一个回调函数,该函数将在新小部件准备就绪时立即执行。请参阅下面的小部件参数详细列表。
var url = "https://api.soundcloud.com/";
var options = [];
// if a track
url += "tracks/";
// if a playlist
url += "playlists/"
// append the id of the track / playlist to the url
url += id;
// set any options you want for the player
options.show_artwork = false;
options.liking = false;
options.auto_play = true;
widget.load(url, options, OPTIONAL_CALLBACK_FUNCTION);
已编辑以显示绑定...
绑定代码在最初加载小部件后调用一次。
ready 事件只调用一次,当小部件最初加载时,不会在每次使用 load() 的后续调用中调用它。
try {
widget.bind(SC.Widget.Events.FINISH,
function finishedPlaying() {
// your code / function call
}
);
widget.bind(SC.Widget.Events.PAUSE,
function paused() {
// your code / function call
}
);
widget.bind(SC.Widget.Events.PLAY,
function playing() {
// your code / function call
widget.getCurrentSound(function scCurrentSound(sound) {
// this also binds getCurrent sound which is called
// each time a new sound is loaded
});
}
);
widget.bind(SC.Widget.Events.PLAY_PROGRESS,
function position(pos) {
// your code / function call
}
);
widget.bind(SC.Widget.Events.SEEK,
function seek(pos) {
// your code / function call
}
);
widget.bind(SC.Widget.Events.READY,
function ready() {
// your code / function call
}
);
} catch(e) {
// exception handler code
}
我见过不同的网络应用程序,如 Playmoss、Whyd 和 Songdrop 等。我认为,它们必须利用 Soundcloud Embedded Widget 才能产生连续播放多个曲目的功能,而不是分开播放一组/(播放列表)。目前我在使用以下库重现此功能时遇到问题,因此我决定尝试编写自己的库:
https://github.com/eric-robinson/SCLPlayer
我对编写 javascript 很陌生,但我的下面代码将加载第一首曲目,并在点击“就绪”绑定后播放。一旦点击“完成”绑定,它将跳转到 loadNextTrack() 函数并将下一个曲目 URL 加载到小部件的 iFrame 的 src 中。在那之后,它永远不会达到最初的“就绪”绑定,然后开始播放。
为了澄清问题,第二首曲目没有开始播放。
<script type = "text/javascript">
var SCLPlayer = {
isPlayerLoaded : false,
isPlayerFullLoaded : false,
needsFirstTrackSkip : true,
isPaused: true,
scPlayer : function() {
widgetContainer = document.getElementById('sc');
widget = SC.Widget(widgetContainer);
return widget;
},
loadNextTrack : function() {
var ifr = document.getElementById('sc');
ifr.src = 'http://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/231758952';
console.log ('Loading Next Track');
SCLPlayer.scPlayer().bind(SC.Widget.Events.READY, function() {
console.log ('Player is Ready, next Track');
SCLPlayer.scPlayer().play();
});
}
};
$( '#sc' ).ready(function() {
SCLPlayer.scPlayer().bind(SC.Widget.Events.READY, function() {
SCLPlayer.isPlayerLoaded = true;
//window.location = 'sclplayer://didLoad';
console.log ('Player is Ready');
SCLPlayer.scPlayer().play();
});
SCLPlayer.scPlayer().bind(SC.Widget.Events.PLAY, function() {
SCLPlayer.isPaused = false;
//window.location = 'sclplayer://didPlay';
console.log ('Player did Play');
});
SCLPlayer.scPlayer().bind(SC.Widget.Events.PAUSE, function() {
SCLPlayer.isPaused = true;
//window.location = 'sclplayer://didPause';
console.log ('Player did Pause');
});
SCLPlayer.scPlayer().bind(SC.Widget.Events.FINISH, function() {
SCLPlayer.isPaused = true;
//window.location = 'sclplayer://didFinish';
console.log ('Player did Finish');
SCLPlayer.loadNextTrack();
});
});
</script>
</head>
<body>
<iframe id = "sc" width="100%" height="100%" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/226183306"></iframe>
</body>
我写这个 Javascript 的目的是为了在我的 iOS 应用程序中使用 Swift 到 Javascript 的桥接来控制加载曲目进入嵌入式播放器。由于某种原因,由于连接速度较慢,下一首曲目并不总是加载到播放器中,使用 "bridge"。我希望在 currentTrack 完成之前将 nextTrackURL 提供给事物的 javascript 端,这样桥就不会传送任何东西并且 Javascript 可以单独处理新的轨道加载。
我想你想使用加载功能为新曲目指定url
来自 soundcloud Widget API 文档:
load(url, options) — 使用 url 指定的新小部件重新加载 iframe 元素。所有之前添加的事件侦听器将继续工作。 options 是一个对象,它允许您定义所有可能的小部件参数以及一个回调函数,该函数将在新小部件准备就绪时立即执行。请参阅下面的小部件参数详细列表。
var url = "https://api.soundcloud.com/";
var options = [];
// if a track
url += "tracks/";
// if a playlist
url += "playlists/"
// append the id of the track / playlist to the url
url += id;
// set any options you want for the player
options.show_artwork = false;
options.liking = false;
options.auto_play = true;
widget.load(url, options, OPTIONAL_CALLBACK_FUNCTION);
已编辑以显示绑定...
绑定代码在最初加载小部件后调用一次。
ready 事件只调用一次,当小部件最初加载时,不会在每次使用 load() 的后续调用中调用它。
try {
widget.bind(SC.Widget.Events.FINISH,
function finishedPlaying() {
// your code / function call
}
);
widget.bind(SC.Widget.Events.PAUSE,
function paused() {
// your code / function call
}
);
widget.bind(SC.Widget.Events.PLAY,
function playing() {
// your code / function call
widget.getCurrentSound(function scCurrentSound(sound) {
// this also binds getCurrent sound which is called
// each time a new sound is loaded
});
}
);
widget.bind(SC.Widget.Events.PLAY_PROGRESS,
function position(pos) {
// your code / function call
}
);
widget.bind(SC.Widget.Events.SEEK,
function seek(pos) {
// your code / function call
}
);
widget.bind(SC.Widget.Events.READY,
function ready() {
// your code / function call
}
);
} catch(e) {
// exception handler code
}