====== MP3 Player JS. Flash аудиоплеер ====== Заставлять пользователей слушать музыку на вашем сайте это плохая идея (подгружать фоновую мелодию). А вот если им дать возможность формировать свои плейлисты и возможность управлять прослушиванием (регулировать громкость, переключать и "перематывать" мелодии, и т.д.), то это может стать фишкой вашего сайта. Если вы уже копались в сети, то наверняка уже находили множество аудиоплееров. Некоторые из них простые, некоторые навороченные, но что объединяет большинство из них, это уже готовый дизайн - один стандартный шаблон или несколько из которых можно выбрать. В одном из своих проектов я столкнулся с необходимостью разместить музыкальный проигрыватель дизайн, которого был разработан специально для этого проекта. Тут я уже не мог взять какое-то стандартное решение, которое максимально подходило бы под общий дизайн. Поэтому я начал искать плеер у которого изначально нет отображения, или это отображение можно легко менять (т. е. не зашито во flash). И такие тоже встречаются. Свой выбор я остановил на MP3 Player JS. В чем прелесть этого проигрывателя - разработчик предоставляет flash файл, который не имеет внешнего отображения на странице и небольшую документацию по API этого проигрывателя. Все. На основе документации предлагается разработать свой управляющий js-объект. Ну а так как мы имеем дело с JavaScript, то мы легко сможем настроить и необходимый нам внешний вид проигрывателя. ---- ===== О MP3 Player JS ===== Сайт разработчиков: [[http://flash-mp3-player.net|flash-mp3-player.net]]\\ Полная документация по типу JS: [[http://flash-mp3-player.net/players/js/documentation/|MP3 Player JS documentation]] На сайте разработчика представлено несколько типов плееров. Некоторые типы с уже имеющемся визуальным отображением, для которых вы можете прямо на сайте разработчика настроить цветовое решение и параметры объекта. Но нас интересует тип JS - данный вариант изначально не имеет графического отображения. Для работы с плеером нам потребуются следующие файлы: * ''player_mp3_js.swf'' - собственно сам проигрыватель. * ''audioplayer.js'' - управляющие скрипты (полностью разрабатываются нами). * ''audioplayer.css'' - стили нашего плеера (в этой статье не рассматриваются). ---- ===== API плеера ===== Прежде чем мы начнем создавать свой управляющий объект, давайте рассмотрим что же нам дает проигрыватель. Если вы ожидает тонну документации по работе с плеером, то я вас хочу огорчить, а может и порадовать - вся [[http://flash-mp3-player.net/players/js/documentation/|документация по проигрывателю типа JS]] помещается на одном листе А4. На мой взгляд это очень здорово, т.к. работа плеера теперь зависит только от нашего воображения. ==== Параметры flash ==== Параметров всего пять: * listener - имя js-объекта, который будет получать сообщения от flash. * interval - промежуток времени, через которое flash будет посылать сообщения js-объекту, миллисекунды. * useexternalinterface - флаг, передавать ли вообще данные от flash, по-умолчанию 1 (true). * enabled - активирует передачу сообщений, по умолчанию 1 (true). * byteslimit - если у вас идет потоковая передача музыки (интернет радио к примеру), то поток будет обновляться при достижении размера byteslimit, для предотвращения перегрузки памяти. Эти параметры передаются при создании html-объекта. Однако их можно изменять в процессе работы - особенно это актуально для параметра enabled. К примеру, если вы остановите мелодию, то данные от flash все равно будут приходить, хотя ни чего и не играется. Поэтому есть резон передать значение false параметру endbled, а при запуске следующей мелодии снова вернуть ему значение true. ==== Методы управления flash ==== Эти методы предназначены для управления flash: * method:setUrl - устанавливает URL файла, который необходимо проиграть. * method:play - запускает плеер. * method:pause - ставит плеер на паузу. * method:stop - останавливает плеер. * method:setPosition - "перематывает" мелодию (миллисекунды). * method:setVolume - устанавливает громкость музыки (100 по умолчанию). ==== Свойства js-объекта ==== Это основные свойства, которые присущи js-объекту, и которые обновляет flash. * url - URL проигрываемого файла. * bytesTotal - общий размер файла. * bytesLoaded - сколько байт уже загружено. * bytesPercent - процент загрузки файла. * position - место где проигрывается мелодия (миллисекунды). * duration - общая продолжительность мелодии (миллисекунды). * isPlaying - флаг, сообщает проигрывается мелодия или нет. * volume - показывает текущий уровень громкости. ==== События js-объекта ==== У нашего объекта будет всего лишь два события, которые вызывает flash: * onInit - событие возникает в момент когда flash проигрыватель готов к работе. * onUpdate - событие возникает через равные промежутки времени (interval) и обновляет приведенные выше свойства js-объекта. ---- ===== Создание управляющего скрипта ===== Здесь я расскажу как реализовать основные возможности проигрывателя. Мы рассмотрим: * Создание графического отображения плеера. * Создание обработчиков событий. * Разработку управляющего функционала. * Создание обработчиков нажатий на управляющие элементы плеера. Я буду рассматривать создание плагина для jQuery, но вы вольны разработать объект на чистом JavaScript. Со следующих строчек начнется полет моей фантазии, поэтому не стоит воспринимать это решение как что-то должное. Это скорее одна реализация из бесконечного числа возможных. ==== Создание jQuery плагина ==== Итак что же будет делать наш плагин. Внутри указанного html-элемента (предполагается что это div), плагин передаст инициализирующие параметры нашему объекту и построит html представление плеера. В качестве параметров предлагаю передавать следующее: * плейлист * путь к flash * интервал обновления данных Итак у нас получится примерно следующее: JavaScript: //объект получающий события от flash var _audioplayer_listener = new Object(); //плагин (function($) { $.fn.audioplayer = function(options) { //передаем данные по-умолчанию (плейлист, путь до flash, интервал обновления данных) options = $.extend({ playlist: [{name: "Test", artist: "Tester", src:"test.mp3", duration:"00:00"}], flash_url: "playermp3_js.swf", interval: 400 }, options || {}); //элемент родитель плеера var player = $(this); if(!player.data("audioplayer")) { var plugin = function() { //тут будет весь наш управляющий скрипт //параметры и функции, которые будут доступны из-вне return { flash_url:options.flash_url, interval:options.interval, listener:_audioplayer_listener, playlist:options.playlist, track:player_track, trackSet:function(track) { apTrackSetNum(track); }, prev:function() { apPrev(); }, play:function() { apPlay(); }, pause:function() { apPause(); }, stop:function() { apStop(); }, next:function() { apNext(); }, playlistSet:function(playlist) { apPlaylistSet(playlist); } } } player.data("audioplayer", plugin()); } else { return player.data("audioplayer"); } } })(jQuery); Обратите внимание на параметр playlist - он представляет собой массив объектов (мелодий), содержащих четыре поля: * name - название песни. * artist - исполнитель. * src - путь к мелодии. * duration - длительность. Надо сразу оговориться, что длительность и ID3-теги (хотя это и не описано в документации) можно получить при загрузке мелодии во flesh, но есть одна маленькая деталь, что точное время определяется только после полной загрузки файла. А при получении русских названий из ID3-тегов они ломаются (используется какая-то хитрая кодировка) - тут можете конечно поколдовать и написать определитель кодировки, который вы будете вызывать через AJAX (на сколько мне известно в JavaScript не предусмотрено работа с кодировкой и все строки он хранит в utf-8). Представьте, запускаете вы файл, а его продолжительность изменяется по мере его загрузки во flesh и вместо русских букв каракули - не очень хорошо, на мой взгляд. Именно для избежания этого мы и передаем данные из вне, а не получаем от flesh. ==== Инициализация плагина ==== Оформление наших скриптов в форме плагина, позволяет организовать очень простую инициализацию и управление нашим плеером: JavaScript: //создаем плеер внутри элемента с классом myaudioplayer $('.myaudioplayer').audiopleyer({ interval: 500, playlist: [{name:"song1", artist:"artist", src:"/mp3/song1.mp3", duration:"01:20"}, {name:"song2", artist:"artist", src:"/mp3/song2.mp3", duration:"01:38"}] }); //переопределяем плейлист $('.myaudioplayer').audiopleyer().playlistSet([ {name:"song10", artist:"artist", src:"/mp3/song10.mp3", duration:"02:20"}, {name:"song20", artist:"artist", src:"/mp3/song20.mp3", duration:"02:38"}, {name:"song30", artist:"artist", src:"/mp3/song30.mp3", duration:"02:19"} ]); ==== HTML отображение плеера ==== Мы создадим три основных html-блока: * Графическое отображение плеера. * Объект содержащий сам flesh плеер. * Плейлист. Для создания html представления мы воспользуемся jQuery, не зря же мы пишем плагин для jQuery - давате использовать и его возможности. === Графическое отображение === JavaScript: //обертка для нашего плеера, которая будет помещена в родительский элемент (смотри выше - var player = $(this)) var player_wrapper = $('
'); //часть для управления var player_control = $('
'); //стандартные кнопки var player_control_prev = $('