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

标签 soundcloud audio-streaming soundmanager2

我一直在尝试弄清楚如何使用 soundclouds API 中的 artwork_url为了将每个封面输出到 this custom player ,并且每个相应的拇指都位于播放列表中自己的轨道旁边?

我知道我需要使用 artwork_url 属性,但我不明白这是如何实现的,也不明白如何将其集成到 this particular custom player plugin 中。
任何特别的代码示例和/或帮助都将受到高度赞赏!
注意:如果能够通过 CSS 以外的其他方式控制图稿的“大小”,那就太好了。

最佳


编辑#1

我切换了Soundcloud Custom Player on Heroku因为在我能够启动并运行它之后,我发现与我上面引用的原始播放器相比,它的加载时间要快得多(尽管那个播放器仍然非常棒)...

我现在仍然面临着同样的任务,但是和以前一样 - 如何将专辑封面添加到脚本中并相应地输出?

下面粘贴的是Heroku玩家:

// # 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();
            }

        }

    });

});

编辑#2

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

$.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();
                    }

                });

            });

编辑#3

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

HTML

            <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>

CSS

/* 
-------------------------------------------------------------------------
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 {}

最佳答案

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

//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 未列出,但可以使用。也许还有更多尺寸,例如每百像素。)

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

关于soundcloud - 从 Soundcloud API 获取 arts_url 并在自定义 SC/SM2 播放器中显示专辑封面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15624181/

相关文章:

html - 带预处理的流式 MP3

javascript - SoundManager2的延迟不规则

jquery - Cors Html5 Jquery/SoundManager 奇怪

javascript - 如何将 Soundcloud API(身份验证)与 Angular.js 一起使用

css - soundcloud html5 小部件 iframe 是否可通过 css 设置样式?

ios - 在 AVplayer 准备好播放音乐时添加事件指示器

jquery - 带有 iOS 的 SoundManager2 - 不播放声音 onClick 事件

ios - 如何将网址重定向到Soundcloud或youtube应用(如果已下载)

Soundcloud API 只返回两个结果?

linux - 将音频从浏览器流式传输到 nodejs