从Soundcloud API获取artwork_url并在自定义SC / SM2播放器中显示专辑封面

时间:2013-03-25 20:31:19

标签: soundcloud audio-streaming soundmanager2

我一直在尝试理清artwork_url如何使用artwork_url以便将每个封面输出到soundclouds API,并使每个

我知道我需要使用// # SoundCloud Custom Player // Make sure to require [SoundManager2](http://www.schillmania.com/projects/soundmanager2/) before this file on your page. // And set the defaults for it first: soundManager.url = 'http://localhost:8888/wp-content/themes/earpeacerecords/swf'; soundManager.flashVersion = 9; soundManager.useFlashBlock = false; soundManager.useHighPerformance = true; soundManager.wmode = 'transparent'; soundManager.useFastPolling = true; // Wait for jQuery to load properly $(function(){ // Wait for SoundManager2 to load properly soundManager.onready(function() { // ## SoundCloud // Pass a consumer key, which can be created [here](http://soundcloud.com/you/apps), and your playlist url. // If your playlist is private, make sure your url includes the secret token you were given. var consumer_key = "915908f3466530d0f70ca198eac4288f", url = "http://soundcloud.com/poe-epr/sets/eprtistmix1"; // Resolve the given url and get the full JSON-worth of data from SoundCloud regarding the playlist and the tracks within. $.getJSON('http://api.soundcloud.com/resolve?url=' + url + '&format=json&consumer_key=' + consumer_key + '&callback=?', function(playlist){ // I like to fill out the player by passing some of the data from the first track. // In this case, you'll just want to pass the first track's title. $('.title').text(playlist.tracks[0].title); // Loop through each of the tracks $.each(playlist.tracks, function(index, track) { // Create a list item for each track and associate the track *data* with it. $('<li>' + track.title + '</li>').data('track', track).appendTo('.tracks'); // * Get appropriate stream url depending on whether the playlist is private or public. // * If the track includes a *secret_token* add a '&' to the url, else add a '?'. // * Finally, append the consumer key and you'll have a working stream url. url = track.stream_url; (url.indexOf("secret_token") == -1) ? url = url + '?' : url = url + '&'; url = url + 'consumer_key=' + consumer_key; // ## SoundManager2 // **Create the sound using SoundManager2** soundManager.createSound({ // Give the sound an id and the SoundCloud stream url we created above. id: 'track_' + track.id, url: url, // On play & resume add a *playing* class to the main player div. // This will be used in the stylesheet to hide/show the play/pause buttons depending on state. onplay: function() { $('.player').addClass('playing'); $('.title').text(track.title); }, onresume: function() { $('.player').addClass('playing'); }, // On pause, remove the *playing* class from the main player div. onpause: function() { $('.player').removeClass('playing'); }, // When a track finished, call the Next Track function. (Declared at the bottom of this file). onfinish: function() { nextTrack(); } }); }); }); // ## GUI Actions // Bind a click event to each list item we created above. $('.tracks li').live('click', function(){ // Create a track variable, grab the data from it, and find out if it's already playing *(set to active)* var $track = $(this), data = $track.data('track'), playing = $track.is('.active'); if (playing) { // If it is playing: pause it. soundManager.pause('track_' + data.id); } else { // If it's not playing: stop all other sounds that might be playing and play the clicked sound. if ($track.siblings('li').hasClass('active')) { soundManager.stopAll(); } soundManager.play('track_' + data.id); } // Finally, toggle the *active* state of the clicked li and remove *active* from and other tracks. $track.toggleClass('active').siblings('li').removeClass('active'); }); // Bind a click event to the play / pause button. $('.play, .pause').live('click', function(){ if ( $('li').hasClass('active') == true ) { // If a track is active, play or pause it depending on current state. soundManager.togglePause( 'track_' + $('li.active').data('track').id ); } else { // If no tracks are active, just play the first one. $('li:first').click(); } }); // Bind a click event to the next button, calling the Next Track function. $('.next').live('click', function(){ nextTrack(); }); // Bind a click event to the previous button, calling the Previous Track function. $('.prev').live('click', function(){ prevTrack(); }); // ## Player Functions // **Next Track** var nextTrack = function(){ // Stop all sounds soundManager.stopAll(); // Click the next list item after the current active one. // If it does not exist *(there is no next track)*, click the first list item. if ( $('li.active').next().click().length == 0 ) { $('.tracks li:first').click(); } } // **Previous Track** var prevTrack = function(){ // Stop all sounds soundManager.stopAll(); // Click the previous list item after the current active one. // If it does not exist *(there is no previous track)*, click the last list item. if ( $('li.active').prev().click().length == 0 ) { $('.tracks li:last').click(); } } }); }); 属性,但我不明白这是如何实现的,也不知道如何将其集成到this custom player中。
特别是任何代码示例和/或帮助都非常感谢!
注意:也可以通过其他方式控制艺术作品的“大小”,然后只是CSS。

最佳


编辑#1

我切换了this particular custom player plugin,因为在我能够启动并运行之后我发现它的加载时间比上面提到的原始播放器快得多(尽管那个仍然非常棒) )...

我现在仍然像以前一样使用相同的任务 - 如何将相册艺术添加到脚本并相应地输出?

下面粘贴的是Soundcloud Custom Player on Heroku玩家:

$.getJSON('http://api.soundcloud.com/resolve?url=' + url + '&format=json&consumer_key=' + consumer_key + '&callback=?', function(playlist){

            // I like to fill out the player by passing some of the data from the first track.
            // In this case, you'll just want to pass the first track's title.

            $('.title').text(playlist.tracks[0].title);
            $('.album_art').attr('src', playlist.artwork_url);

            // Loop through each of the tracks

            $.each(playlist.tracks, function(index, track) {

                // Create a list item for each track and associate the track *data* with it.

                $('<li>' + '<img src="' + playlist.artwork_url + '">' + track.title + '</li>').data('track', track).appendTo('.tracks');

                // * Get appropriate stream url depending on whether the playlist is private or public.
                // * If the track includes a *secret_token* add a '&' to the url, else add a '?'.
                // * Finally, append the consumer key and you'll have a working stream url.

                url = track.stream_url;

                (url.indexOf("secret_token") == -1) ? url = url + '?' : url = url + '&';

                url = url + 'consumer_key=' + consumer_key;

                // ## SoundManager2
                // **Create the sound using SoundManager2**

                soundManager.createSound({

                    // Give the sound an id and the SoundCloud stream url we created above.

                    id: 'track_' + track.id,
                    url: url,

                    // On play & resume add a *playing* class to the main player div.
                    // This will be used in the stylesheet to hide/show the play/pause buttons depending on state.

                    onplay: function() {

                        $('.player').addClass('playing');

                        $('.title').text(track.title);

                    },
                    onresume: function() {

                        $('.player').addClass('playing');

                    },

                    // On pause, remove the *playing* class from the main player div.

                    onpause: function() {
                        $('.player').removeClass('playing');
                    },

                    // When a track finished, call the Next Track function. (Declared at the bottom of this file).

                    onfinish: function() {
                        nextTrack();
                    }

                });

            });

编辑#2

所以我奇怪地能够解决一些问题...但是我不知道它的语义是否正确......

            <div class='title'></div>
            <a class='prev'>Previous</a>
            <a class='play'>Play</a>
            <a class='pause'>Pause</a>
            <a class='next'>Next</a>
        </div>

编辑#3

以下是与播放器配合使用的HTML和CSS标记,以便更好地说明......

HTML                      

/* 
-------------------------------------------------------------------------
Soundcloud Player
-------------------------------------------------------------------------
*/

#sticky_header #sticky_content .player {
    height: 570px;
    overflow: hidden;
}

#sticky_header #sticky_content .tracks {

}

#sticky_header #sticky_content .tracks li {
    cursor: pointer;    
    height: 40px;
    text-align: left;
}

#sticky_header #sticky_content .tracks li img.album_art {
    width: 40px;
    height: 40px;
    border-radius: 5px;
    margin-right: 15px; 
}

#sticky_header #sticky_content .title {

}

#sticky_header #sticky_content .prev {

}

#sticky_header #sticky_content .play {
    display: block; 
}

#sticky_header #sticky_content .playing .play {
    display: none; 
}

#sticky_header #sticky_content .pause {
    display: none; 
}

#sticky_header #sticky_content .playing .pause {
    display: block; 
}

#sticky_header #sticky_content .next {}

CSS

{{1}}

2 个答案:

答案 0 :(得分:2)

要获取图像,您可以使用此代码:

//get element by id from your iframe
var widget = SC.Widget(document.getElementById('soundcloud_widget'));
widget.getCurrentSound(function(music){
    artwork_url = music.artwork_url.replace('-large', '-t200x200');
    $('#song1').css('background', 'url(\"'+artwork_url+'\") ');
});

正常情况下,您最后会得到一个带“-large”的链接,大小为100x100。如果你想要其他尺寸,你必须像我一样用“.replace”改变结尾。您可以在此处找到可用尺寸的列表:

https://developers.soundcloud.com/docs/api/reference#tracks (我的尺寸200x200没有列出但是有效。也许有更多尺寸,比如每百px。)

此刻代码仅适用于实际播放的歌曲。对我而言,这不是一个解决方案,因为我需要播放列表中的所有图像。

答案 1 :(得分:1)

这里是迭代从API中检索到的轨道的地方:

// Loop through each of the tracks
$.each(playlist.tracks, function(index, track) {
  // Create a list item for each track and associate the track *data* with it.
  $('<li>' + track.title + '</li>').data('track', track).appendTo('.tracks');

在迭代器函数内部,您现在可以访问track.artwork_url并可能将其设置为背景图像或某些元素的背景,可能类似于:

$('<li><img src=" + track.artwork_url + "></img>' + track.title + '</li>').data('track', track).appendTo('.tracks');

我希望这会有所帮助。

<强> UPD 即可。在更新的代码中,您应该参考track.artwork_url而不是playlist - 然后您将获得每个曲目的单独艺术作品。