/* Copyright (C) 2013, 2014 Tilman Kranz * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH * THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE */ var MyPlayer = function(_args) { var failed = false; var detached = false; var player = null; var defaultArgs = { detachable: true, element: 'body', id3: false, mode: 'mp3url', waveform: false, autoplay: false, loop: true, shuffle: false, list: [] }; var mimeTypeFromSrc = function(src) { var extension = src.split('.').pop().toLowerCase(); return { "aac": "audio/aac", "abw": "application/x-abiword", "arc": "application/x-freearc", "avi": "video/x-msvideo", "azw": "application/vnd.amazon.ebook", "bin": "application/octet-stream", "bmp": "image/bmp", "bz": "application/x-bzip", "bz2": "application/x-bzip2", "cda": "application/x-cdf", "csh": "application/x-csh", "css": "text/css", "csv": "text/csv", "doc": "application/msword", "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "eot": "application/vnd.ms-fontobject", "epub": "application/epub+zip", "gz": "application/gzip", "gif": "image/gif", "htm": "text/html", "html": "text/html", "ico": "image/vnd.microsoft.icon", "ics": "text/calendar", "jar": "application/java-archive", "jpeg": "image/jpeg", "jpg": "image/jpeg", "js": "text/javascript", "json": "application/json", "jsonld": "application/ld+json", "mid": "audio/midi audio/x-midi", "midi": "audio/midi audio/x-midi", "mjs": "text/javascript", "mp3": "audio/mpeg", "mp4": "video/mp4", "mpeg": "video/mpeg", "mpkg": "application/vnd.apple.installer+xml", "odp": "application/vnd.oasis.opendocument.presentation", "ods": "application/vnd.oasis.opendocument.spreadsheet", "odt": "application/vnd.oasis.opendocument.text", "oga": "audio/ogg", "ogv": "video/ogg", "ogx": "application/ogg", "opus": "audio/opus", "otf": "font/otf", "png": "image/png", "pdf": "application/pdf", "php": "application/x-httpd-php", "ppt": "application/vnd.ms-powerpoint", "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "rar": "application/vnd.rar", "rtf": "application/rtf", "sh": "application/x-sh", "svg": "image/svg+xml", "swf": "application/x-shockwave-flash", "tar": "application/x-tar", "tif": "image/tiff", "tiff": "image/tiff", "ts": "video/mp2t", "ttf": "font/ttf", "txt": "text/plain", "vsd": "application/vnd.visio", "wav": "audio/wav", "weba": "audio/webm", "webm": "video/webm", "webp": "image/webp", "woff": "font/woff", "woff2": "font/woff2", "xhtml": "application/xhtml+xml", "xls": "application/vnd.ms-excel", "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "xml": "application/xml", "xul": "application/vnd.mozilla.xul+xml", "zip": "application/zip", "3gp": "video/3gpp", "3g2": "video/3gpp2", "7z": "application/x-7z-compressed" }[extension] || "application/octet-stream"; } var args = (typeof(_args)==='undefined') ? defaultArgs : $.extend({}, defaultArgs, _args); var createAudio = function() { var autoplay = args.autoplay ? 'autoplay="true"' : ''; $(args.element).append( '' ); args.audio = args.element + ' audio'; $(args.audio).css({ 'height': '500px', }); } var readId3 = function() { $(args.element).find('ul.mejs li').each(function(i, track){ var url = $(track).attr('data-url'); $(track).prepend('  '); ID3.loadTags(url, function() { var tags = ID3.getAllTags(url); if(typeof(tags.title)!='undefined') { var track_title = tags.title; if(typeof(tags.artist)!='undefined') track_title = tags.artist + ' - ' + track_title; $(args.element).find('ul.mejs li').each(function(j, _track){ if(i==j) $(_track).html(track_title); }); } }); }); } var playerCreated = function() { restoreParams(); if(args.id3) readId3(); } var createPlayer = function() { player = new MediaElementPlayer( "myplayer", { success: playerCreated, features: ['playpause', 'current', 'progress', 'duration', 'volume', 'playlist', 'prevtrack', 'nexttrack', 'shuffle', 'loop'] }); $(args.element).append( '' ); } var param = function(name) { var query = window.location.search.substring(1); var vars = query.split("&"); for(var i=0; i'+ ''+ '' ); $('.popupButton button').click(function(){ var currentTime = player.getCurrentTime(); var volume = player.getVolume(); var paused = player.media.paused; var trackNo = 0; $(args.element).find('ul.mejs li').each(function(i){ if($(this).hasClass('current')) trackNo = i; }); popup( $(location).attr('href')+'?'+ 'popup&'+ 'paused='+paused+'&'+ 'currentTime='+currentTime+'&'+ 'volume='+volume+'&'+ 'trackNo='+trackNo ) }); } else { var windowHeight = $(window).height(); window.onbeforeunload = function(){ $("iframe", opener.top.document).height(windowHeight); $('.mejs-audio', opener.document).show(); $('.playerDetached', opener.document).hide(); } } } var restoreParams = function() { if(!detached) return; var paused = (param('paused') && param('paused')=='true'); var currentTime = param('currentTime') ? parseFloat(param('currentTime')) : 0.0; var volume = param('volume') ? parseFloat(param('volume')) : 1.0; var trackNo = param('trackNo') ? parseInt(param('trackNo')) : 0; player.setVolume(volume); $(args.element).find('ul.mejs li').each(function(i){ if(i==trackNo) { player.playTrack($(this)); player.setCurrentTime(currentTime); } }); if(paused) player.pause(); } if(param('popup')!==false) { detached = true; $('body').html( '
' ); args.element = '#myplayer'; } if(args.mode=='mp3url') { var mp3url = (typeof args.mp3url === "undefined") ? $(location).attr('href').replace(/\?.*/, '').replace(/\/[^\/]+\/?$/, '') : args.mp3url; $.ajax({ url: mp3url, type: 'GET', success: function(res) { createAudio(); var doc = document.createElement('html'); doc.innerHTML = res; var head = $(doc).find('a').each(function(idx,item) { var src = $(item).attr('href'); if(src.match(/\.mp3$/)) { var url = mp3url+'/'+src; var title = item.innerHTML; var type = "audio/mpeg"; $(args.audio).append(''); } }); createPlayer(); setupDetach(); } }); } else if(args.mode=='m3u') { var m3u = (typeof args.m3u === "undefined") ? $(location).attr('href').replace(/\?.*/, '').replace(/\/[^\/]+\/?$/, '/play.m3u') : args.m3u; createAudio(); $.get(m3u, function(txt){ var lines = txt.split("\n"); for(var i = 0, len = lines.length; i < len; i++) if(!lines[i].match(/^[ \t]*#/) && lines[i].match(/\.mp3$/)) { var mp3 = lines[i]; var title = unescape(mp3.split('/').pop()); var type = "audio/mpeg"; $(args.audio).append(''); } console.log("DEBUG: mode==m3u audio=",$(args.audio)); createPlayer(); setupDetach(); }); } else if(args.mode=='list') { createAudio(); for(var i = 0, len = args.list.length; i < len; i++) { var item = args.list[i]; var type = typeof item; var src = ''; var title = ''; if(item !== null && type === 'object') { if(item.url) src = item.url; else { alert( 'MyPlayer: item[' + i + ']: '+ 'property "url" is missing.' ); continue; } if(item.title) title = item.title; else title = url.replace(/(.*\/)?([^\/]+)/, '$2'); } else if(type === 'string') { src = item; title = src; } else { alert( 'MyPlayer: item [' + i + ']: '+ 'unsupported type "' + type + '"' ); continue; } var type = mimeTypeFromSrc(src); $(args.audio).append(''); } createPlayer(); setupDetach(); } else { $(args.element).append('

Unsupported mode "'+args.mode+'"

'); failed = true; } }