Получите artwork_url из Soundcloud API и покажите обложки альбомов в специальном плеере SC/SM2

Я пытался разобраться, как artwork_url Можно ли использовать API-интерфейс soundclouds для вывода каждой обложки в этот пользовательский проигрыватель и иметь каждый соответствующий большой палец рядом со своей дорожкой в ​​списке воспроизведения?

Я понимаю, что мне нужно использовать artwork_url свойство, однако я не понимаю, как это достигается, и как интегрировать его в этот конкретный пользовательский плагин плеера.
Любые примеры кода, в частности и / или помощь, высоко ценится!
Примечание. Также было бы неплохо иметь возможность контролировать "размер" художественного произведения и другими способами, а не только с помощью CSS.

Лучший


РЕДАКТИРОВАТЬ #1

Я переключил Soundcloud Custom Player на 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 {}

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(мой размер 200x200 не указан, но работает. Может быть, есть и другие размеры, например, каждые сто пикселей.)

на данный момент код работает только для самой воспроизводимой песни. Для меня это не решение, потому что мне нужны все изображения из моего плейлиста.

Вот где происходит перебор треков, полученных из 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 - тогда вы получите индивидуальное оформление каждого трека.

Другие вопросы по тегам