'use strict';
//MyPlayer 播放页面
(function(root, doc, $, undefined){
var defaultOptions = {media:[],front:'white',background:'orange',actived:'red'},
$jplayer, $player, $list, $state, $title, $progress, $lyric, options = {}, current = -1, length, first = true
$(function(){
getOptions()
length = options.media.length
init()
setTheme(options)
if(options.media && length > 0 ){
if(length>1){
$('body').append($list)
}
next()
}
})
function next(){
if(current == length -1 ){
current = -1
}
load(options.media[++current])
}
function setTheme(){
if(options.front){
$player.css('color',options.front)
$state.css({
'border-left-color':options.front,
'border-right-color':options.front
})
}
if(options.background){
$player.css('background-color',options.background)
}
if(options.actived){
$progress.css('background-color',options.actived)
}
}
function loading(text){
$title.text(text)
$player.attr('title',text)
doc.title = text
}
function load(media){
if($jplayer){
$jplayer.jPlayer('destroy')
$jplayer.unbind().empty().remove()
$jplayer = null
}
if(media.url){
setNewMedia(media)
}else if(media.xiami){
loading('正在尝试载入虾米音乐……')
$.ajax({
url: '../api.php',
data:{service: 'xiami',id: media.xiami},
type: 'GET',
dataType: 'jsonp',
async: false,
success: function(data) {
if(data[0]){
data = data[0]
media.url = data.url
media.title = data.title
media.artist = data.artist
media.lyric = data.lyric_url
setNewMedia(media)
}
},
error:function(){
options.media.splice(current,1)
length--
current--
next()
}
})
}
}
function getType(url){
var index = url.indexOf('?')
if(index>0){
url = url.substring(0,index)
}
index = url.lastIndexOf('.')
return url.substring(index+1)
}
function parseLyric(text){
text = text.split('\r\n')
var lyric = []
$.each(text, function(index, value){
value = $.trim(value)
var d = value.match(/^\[\d{2}:\d{2}((\.|\:)\d{2})\]/g)
if(!d) return
var dt = String(d).split(':')
var t = value.split(d)
var _t = Math.round(parseInt(dt[0].split('[')[1])*60+parseFloat(dt[1].split(']')[0])*100)/100
lyric.push([_t, t[1]])
})
return lyric
}
function setNewMedia(media){
media.type = media.type || getType( media.url ) || 'mp3'
$jplayer = $('
').appendTo($player).attr('id','jplayer')
.bind($.jPlayer.event.timeupdate, function(e) {
$progress.width(Math.round(e.jPlayer.status.currentPercentAbsolute / 100 * $player.width()))
})
.jPlayer({
ready:function(){
$title.text(media.title + (media.artist? ' by ' + media.artist : ''))
$player.attr('title',media.title)
doc.title = media.title
var obj ={}
obj[media.type] = media.url
$jplayer.jPlayer('setMedia', obj)
if(!first || options.autoplay){
play()
first = false
}
},
ended:function(){
$progress.width('0')
if(length == 1){
play()
}else{
next()
}
},
consoleAlerts:true,
preload: 'none',
swfPath: '../assets/swf/'
,supplied: media.type
})
if(media.lyric){
$.ajax({
url: '../api.php',
data:{service: 'lyric', url: media.lyric},
type: 'GET',
async: false,
success: function(data) {
if(data && data.source){
data = parseLyric(data.source)
$jplayer.jPlayer.hasLyric = true
var m = 0
$jplayer.bind($.jPlayer.event.timeupdate, function(e) {
if(e.jPlayer.status.currentTime < 0.5){
m = 0
}
if ( m < data.length && e.jPlayer.status.currentTime > data[m][0]){
$lyric.text(data[m][1])
$player.attr('title',$lyric.text())
m++
}
})
}
}
})
}
}
function getOptions(){
options = $.extend(options, defaultOptions)
try{
$.extend(options, JSON.parse(document.location.hash.replace(/^#/,'')))
}catch(e){
}
options.theme=options.theme.split('|')
if(options.theme[0]){
options.front = options.theme[0]
}
if(options.theme[1]){
options.background = options.theme[1]
}
if(options.theme[2]){
options.actived = options.theme[2]
}
}
function init(){
$player = $('
').addClass('player')
$progress = $('
').addClass('progress')
$state = $('').addClass('state').on('click',toggle)
$title = $('').addClass('title')
$lyric = $('').addClass('lyric').hide()
$list = $('').addClass('list')
$player.append($progress, $state, $title, $lyric)
$('body').append($player)
}
function play(){
if($jplayer){
$jplayer.jPlayer('play')
$state.addClass('playing')
if($jplayer.jPlayer.hasLyric){
$title.hide()
$lyric.show()
}
}
}
function pause(){
if($jplayer){
$jplayer.jPlayer('pause')
$state.removeClass('playing')
if($jplayer.jPlayer.hasLyric){
$title.show()
$lyric.hide()
$player.attr('title',$title.text())
}
}
}
function toggle(){
$state.hasClass('playing') ? pause() : play()
}
})(window, document, jQuery)