diff options
Diffstat (limited to 'lib/javascript/html5_player.js')
-rw-r--r-- | lib/javascript/html5_player.js | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/lib/javascript/html5_player.js b/lib/javascript/html5_player.js new file mode 100644 index 00000000..4bed561c --- /dev/null +++ b/lib/javascript/html5_player.js @@ -0,0 +1,204 @@ +/* vim:set tabstop=4 softtabstop=4 shiftwidth=4 expandtab: */ +/** + * + * LICENSE: GNU General Public License, version 2 (GPLv2) + * Copyright 2013 Ampache.org + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License v2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ +var current_playlist_item = null; + +function play_item(event) +{ + stop(); + current_playlist_item = event.findElement().getStorage().get('playlist_item'); + play(); +} +function adjust_buttons() +{ + if(!current_playlist_item.player.paused) + { + $('play').addClassName('inactive'); + $('pause').removeClassName('inactive'); + $('stop').removeClassName('inactive'); + } + else + { + $('play').removeClassName('inactive'); + $('pause').addClassName('inactive'); + $('stop').addClassName('inactive'); + } +} +function stop(event) +{ + if(current_playlist_item) + { + current_playlist_item.player.pause(); + current_playlist_item.player.currentTime = 0; + if(current_playlist_item.player.currentTime) + { + var src=current_playlist_item.player.src; + current_playlist_item.player.src=null; + current_playlist_item.player.src=src; + } + current_playlist_item.element.removeClassName('playing'); + adjust_buttons(); + } +} +function pause(event) +{ + if(current_playlist_item) + { + current_playlist_item.player.pause(); + adjust_buttons(); + } +} +function play(event) +{ + if(current_playlist_item) + { + $('title').update(current_playlist_item.info_url); + $('title').select('a')[0].writeAttribute('target', '_new'); + $('album').update(current_playlist_item.f_album_link); + //$('album').select('a')[0].writeAttribute('target', '_new'); + $('artist').update(current_playlist_item.author); + //$('artist').select('a')[0].writeAttribute('target', '_new'); +$('albumart').update(new Element('img', {src: current_playlist_item.albumart_url})); + current_playlist_item.player.writeAttribute('preload', 'auto'); + current_playlist_item.player.play(); + if(current_playlist_item.element.offsetTop - $('playlist').offsetTop - $('playlist').scrollTop > $('playlist').measure('height') || current_playlist_item.element.offsetTop - $('playlist').offsetTop - $('playlist').scrollTop < 0) + { + $('playlist').scrollTop = current_playlist_item.element.offsetTop - $('playlist').offsetTop; + } + current_playlist_item.element.addClassName('playing'); + adjust_buttons(); + } +} +function next(event) +{ + if(current_playlist_item && current_playlist_item.next) + { + stop(); + current_playlist_item = current_playlist_item.next; + play(); + } +} +function previous(event) +{ + if(current_playlist_item && current_playlist_item.previous) + { + stop(); + current_playlist_item = current_playlist_item.previous; + play(); + } +} +function seconds_to_string(seconds) +{ + return Math.floor(seconds / 60) + ":" + (Math.floor(seconds % 60) < 10 ? '0' : '') + Math.floor(seconds % 60); +} +function timeupdate(event) +{ + if(current_playlist_item) + { + $('progress_text').update(seconds_to_string(current_playlist_item.player.currentTime) + "/" + seconds_to_string(current_playlist_item.time)); + if(current_playlist_item.player.currentTime > current_playlist_item.time / 2) + { + if(current_playlist_item.next) + { + current_playlist_item.next.player.writeAttribute('preload', 'auto'); + } + } + //fix for chrome where ended is not thrown properly + if(current_playlist_item.player.currentTime >= current_playlist_item.time) + { + ended(event); + } + } +} +function ended(event) +{ + if(current_playlist_item && current_playlist_item.next) + { + stop(); + current_playlist_item = current_playlist_item.next; + play(); + } +} +function search(event) +{ + var search = new RegExp(".*" + event.findElement().value + ".*", "i"); + for(var item = $('playlist').firstDescendant(); item; item = item.next()) + { + if(!search.test(item.textContent != undefined ? item.textContent : item.innerText)) + { + item.hide(); + } + else + { + item.show(); + } + } +} +function clear_search(event) +{ + event.findElement().value = ""; + search(event); +} +document.observe("dom:loaded", function() +{ + var last_item = null, first_item = null; + for(id in playlist_items) + { + var li = new Element('li'); + $('playlist').insert(li); + playlist_items[id].play_url += '&transcode_to=' + (Prototype.Browser.IE || Prototype.Browser.WebKit || Prototype.Browser.MobileSafari ? 'mp3' : 'ogg'); + li.update(playlist_items[id].title); +playlist_items[id].player = new Element("audio", {preload: Prototype.Browser.IE ? 'auto' : 'none', src : playlist_items[id].play_url}); + li.insert(playlist_items[id].player); + li.getStorage().set('playlist_item', playlist_items[id]); + li.observe('click', play_item); + playlist_items[id].player.observe('ended', ended); + playlist_items[id].player.observe('timeupdate', timeupdate); + playlist_items[id].element = li; + if(last_item) + { + last_item.next = playlist_items[id]; + } + if(first_item == null) + { + first_item = playlist_items[id]; + } + playlist_items[id].previous = last_item; + last_item = playlist_items[id]; + } + if(first_item) + { + first_item.previous = last_item; + last_item.next = first_item; + current_playlist_item = first_item; + play(); + } + $('stop').observe('click', stop); + $('play').observe('click', play); + $('pause').observe('click', pause); + $('next').observe('click', next); + $('previous').observe('click', previous); + $('input_search').observe('keyup', search); + $('input_search').observe('html5_player:clear_search', clear_search); + $('input_search').observe('focus', clear_search); + $('clear_search').observe('click', function() { + $('input_search').fire('html5_player:clear_search') + }); +}); |