-
-
Save janily/5656760 to your computer and use it in GitHub Desktop.
jquery play
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function($){ | |
// Settings | |
var repeat = localStorage.repeat || 0, | |
shuffle = localStorage.shuffle || 'false', | |
continous = true, | |
autoplay = false, | |
playlist = [ | |
{ | |
title: '光辉岁月', | |
artist: '光辉岁月', | |
album: '光辉岁月', | |
cover: 'cyx.jpg', | |
mp3: 'ghsy.mp3', | |
ogg: 'ghsy.ogg' | |
}, | |
{ | |
title: '烟花易冷', | |
artist: '烟花易冷', | |
album: '烟花易冷', | |
cover: 'gs.jpg', | |
mp3: 'yhyl.mp3', | |
ogg: 'yhyl.ogg' | |
}, | |
{ | |
title: '情话', | |
artist: '情话', | |
album: '情话', | |
cover: 'gs.jpg', | |
mp3: 'qh.mp3', | |
ogg: 'qh.ogg' | |
}, | |
{ | |
title: '我的歌声里', | |
artist: '我的歌声里', | |
album: '我的歌声里', | |
cover: 'gsl.jpg', | |
mp3: 'wdgsl.mp3', | |
ogg: 'wdgsl.ogg' | |
}, | |
{ | |
title: '至青春', | |
artist: '至青春', | |
album: '至青春', | |
cover: 'zqc.jpg', | |
mp3: 'zqc.mp3', | |
ogg: 'zqc.ogg' | |
} | |
]; | |
// Load playlist | |
for (var i=0; i<playlist.length; i++){ | |
var item = playlist[i]; | |
$('#playlist').append('<li>'+item.artist+' - '+item.title+'</li>'); | |
} | |
var time = new Date(), | |
currentTrack = shuffle === 'true' ? time.getTime() % playlist.length : 0, | |
trigger = false, | |
audio, timeout, isPlaying, playCounts; | |
var play = function(){ | |
audio.play(); | |
$('.playback').addClass('playing'); | |
timeout = setInterval(updateProgress, 500); | |
isPlaying = true; | |
} | |
var pause = function(){ | |
audio.pause(); | |
$('.playback').removeClass('playing'); | |
clearInterval(updateProgress); | |
isPlaying = false; | |
} | |
// Update progress | |
var setProgress = function(value){ | |
var currentSec = parseInt(value%60) < 10 ? '0' + parseInt(value%60) : parseInt(value%60), | |
ratio = value / audio.duration * 100; | |
$('.timer').html(parseInt(value/60)+':'+currentSec); | |
$('.progress .pace').css('width', ratio + '%'); | |
$('.progress .slider a').css('left', ratio + '%'); | |
} | |
var updateProgress = function(){ | |
setProgress(audio.currentTime); | |
} | |
// Progress slider | |
$('.progress .slider').slider({step: 0.1, slide: function(event, ui){ | |
$(this).addClass('enable'); | |
setProgress(audio.duration * ui.value / 100); | |
clearInterval(timeout); | |
}, stop: function(event, ui){ | |
audio.currentTime = audio.duration * ui.value / 100; | |
$(this).removeClass('enable'); | |
timeout = setInterval(updateProgress, 500); | |
}}); | |
// Volume slider | |
var setVolume = function(value){ | |
audio.volume = localStorage.volume = value; | |
$('.volume .pace').css('width', value * 100 + '%'); | |
$('.volume .slider a').css('left', value * 100 + '%'); | |
} | |
var volume = localStorage.volume || 0.5; | |
$('.volume .slider').slider({max: 1, min: 0, step: 0.01, value: volume, slide: function(event, ui){ | |
setVolume(ui.value); | |
$(this).addClass('enable'); | |
$('.mute').removeClass('enable'); | |
}, stop: function(){ | |
$(this).removeClass('enable'); | |
}}).children('.pace').css('width', volume * 100 + '%'); | |
$('.mute').click(function(){ | |
if ($(this).hasClass('enable')){ | |
setVolume($(this).data('volume')); | |
$(this).removeClass('enable'); | |
} else { | |
$(this).data('volume', audio.volume).addClass('enable'); | |
setVolume(0); | |
} | |
}); | |
// Switch track | |
var switchTrack = function(i){ | |
if (i < 0){ | |
track = currentTrack = playlist.length - 1; | |
} else if (i >= playlist.length){ | |
track = currentTrack = 0; | |
} else { | |
track = i; | |
} | |
$('audio').remove(); | |
loadMusic(track); | |
if (isPlaying == true) play(); | |
} | |
// Shuffle | |
var shufflePlay = function(){ | |
var time = new Date(), | |
lastTrack = currentTrack; | |
currentTrack = time.getTime() % playlist.length; | |
if (lastTrack == currentTrack) ++currentTrack; | |
switchTrack(currentTrack); | |
} | |
// Fire when track ended | |
var ended = function(){ | |
pause(); | |
audio.currentTime = 0; | |
playCounts++; | |
if (continous == true) isPlaying = true; | |
if (repeat == 1){ | |
play(); | |
} else { | |
if (shuffle === 'true'){ | |
shufflePlay(); | |
} else { | |
if (repeat == 2){ | |
switchTrack(++currentTrack); | |
} else { | |
if (currentTrack < playlist.length) switchTrack(++currentTrack); | |
} | |
} | |
} | |
} | |
var beforeLoad = function(){ | |
var endVal = this.seekable && this.seekable.length ? this.seekable.end(0) : 0; | |
$('.progress .loaded').css('width', (100 / (this.duration || 1) * endVal) +'%'); | |
} | |
// Fire when track loaded completely | |
var afterLoad = function(){ | |
if (autoplay == true) play(); | |
} | |
// Load track | |
var loadMusic = function(i){ | |
var item = playlist[i], | |
newaudio = $('<audio>').html('<source src="'+item.mp3+'"><source src="'+item.ogg+'">').appendTo('#player'); | |
$('.cover').html('<img src="'+item.cover+'" alt="'+item.album+'">'); | |
$('.tag').html('<strong>'+item.title+'</strong><span class="artist">'+item.artist+'</span><span class="album">'+item.album+'</span>'); | |
$('#playlist li').removeClass('playing').eq(i).addClass('playing'); | |
audio = newaudio[0]; | |
audio.volume = $('.mute').hasClass('enable') ? 0 : volume; | |
audio.addEventListener('progress', beforeLoad, false); | |
audio.addEventListener('durationchange', beforeLoad, false); | |
audio.addEventListener('canplay', afterLoad, false); | |
audio.addEventListener('ended', ended, false); | |
} | |
loadMusic(currentTrack); | |
$('.playback').on('click', function(){ | |
if ($(this).hasClass('playing')){ | |
pause(); | |
} else { | |
play(); | |
} | |
}); | |
$('.rewind').on('click', function(){ | |
if (shuffle === 'true'){ | |
shufflePlay(); | |
} else { | |
switchTrack(--currentTrack); | |
} | |
}); | |
$('.fastforward').on('click', function(){ | |
if (shuffle === 'true'){ | |
shufflePlay(); | |
} else { | |
switchTrack(++currentTrack); | |
} | |
}); | |
$('#playlist li').each(function(i){ | |
var _i = i; | |
$(this).on('click', function(){ | |
switchTrack(_i); | |
}); | |
}); | |
if (shuffle === 'true') $('.shuffle').addClass('enable'); | |
if (repeat == 1){ | |
$('.repeat').addClass('once'); | |
} else if (repeat == 2){ | |
$('.repeat').addClass('all'); | |
} | |
$('.repeat').on('click', function(){ | |
if ($(this).hasClass('once')){ | |
repeat = localStorage.repeat = 2; | |
$(this).removeClass('once').addClass('all'); | |
} else if ($(this).hasClass('all')){ | |
repeat = localStorage.repeat = 0; | |
$(this).removeClass('all'); | |
} else { | |
repeat = localStorage.repeat = 1; | |
$(this).addClass('once'); | |
} | |
}); | |
$('.shuffle').on('click', function(){ | |
if ($(this).hasClass('enable')){ | |
shuffle = localStorage.shuffle = 'false'; | |
$(this).removeClass('enable'); | |
} else { | |
shuffle = localStorage.shuffle = 'true'; | |
$(this).addClass('enable'); | |
} | |
}); | |
})(jQuery); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment