MediaWiki:OggPlayer.js
Jump to navigation
Jump to search
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
(function($, mw) {
'use strict';
//Load Protection
if (window.OggPlayerLoaded) return;
window.OggPlayerLoaded = true;
//Load Localization and styles
importArticles({
type: 'style',
article: 'MediaWiki:OggPlayer.css'
});
//Default Setting
if (typeof window.oggPlayerButtonOnly == 'undefined') window.oggPlayerButtonOnly = false;
function init(i18n) {
var OggPlayer = {
constRef:{
wrapper:"audio-button",
noSupport:"no-support",
noAudio:"no-audio",
nowPlaying:"now-playing",
OggAudio:"OggPlayer-Audio",
play:"play",
focusable:"focusable"
},
init: function() {
//Test Audio Support
var support = document.createElement('audio').canPlayType('audio/ogg');
if (support === "") return OggPlayer.noSupport();
mw.hook('wikipage.content').add(OggPlayer.monitor);
},
noSupport: function() {
$('.audio-button:not(.ready)').attr('title',i18n.msg(OggPlayer.constRef.noSupport).plain()).addClass(OggPlayer.constRef.noAudio);
},
monitor: function($elem) {
$elem.find('.audio-button').each(OggPlayer.eachInstance);
},
eachInstance: function() {
var instance = $(this);
//Normalize embed data to instance
if (instance.children().length) {
var focus = instance.find("a[href][class=internal],audio[src],video[src],source[src]");
instance.data("src",focus.attr("href")||focus.attr("src"));
}
//Create Button from instance src
OggPlayer.createButton(instance);
},
createButton: function(target) {
if (!OggPlayer.isValid(target.data('src')))
return OggPlayer.errorPlayer(target);
var audioObj = $('<audio>',{
src:target.data('src'),
preload:'none',
class:OggPlayer.constRef.OggAudio,
on:{
playing:function(){
$(this).parent().addClass(OggPlayer.constRef.nowPlaying);
},
pause:OggPlayer.stopThis,
ended:OggPlayer.stopThis,
error: function(){
OggPlayer.errorPlayer($(this).parent());
}
}
});
target.click(OggPlayer.clickButton).append(audioObj).attr('title',i18n.msg(OggPlayer.constRef.play).plain());
if (target.hasClass(OggPlayer.constRef.focusable)) {
target.attr("tabindex", 0);
target.on("keypress", function(e) {
// enter key pressed
if (e.which === 13) {
target.trigger("click");
}
// space bar pressed
else if (e.which === 32) {
e.preventDefault();
target.trigger("click");
}
});
}
},
clickButton: function(){
var focusDom = $(this).find("audio."+OggPlayer.constRef.OggAudio).get(0);
var toPlay = false;
if (!focusDom.currentTime) toPlay = true;
OggPlayer.pauseAll();
if (toPlay) {
focusDom.preload="auto";
focusDom.play();
}
},
pauseAll: function(){
$("."+OggPlayer.constRef.nowPlaying+" audio."+OggPlayer.constRef.OggAudio).trigger("pause");
},
errorPlayer: function(player){
player.addClass(OggPlayer.constRef.noAudio).attr('title', i18n.msg(OggPlayer.constRef.noAudio).plain());
},
stopThis: function(){
$(this).parent().removeClass(OggPlayer.constRef.nowPlaying);
this.currentTime = 0;
},
isValid: function(url) {
if(url === undefined) return false;
url = url.replace(/\?.*$/, '');
if(
// url.search(/(?:https?:)?(?:\/\/)(?:images|img|static|vignette)\d*\.wikia\.(?:nocookie\.)?(?:net|com)/) < 0 && // wikia/fandom
url.search(/(?:https?:)?(?:\/\/)upload\.wikimedia\.org/) < 0 && // wikimedia
url.search(/(?:\.wiki\.gg\/images\/)/) < 0 // wiki.gg
) return false; // invalid url if not one of the above
url = url.replace(/(vignette.*?)(\/revision.*$)/, '$1');
if(url.search(/\.(ogg|oga|ogv|mp3|wav)/) < 0) return false; //Removed the ending tag ($) from previous author's vesion since regex strip didn't work too well
return true;
}
};
OggPlayer.init();
}
mw.hook('dev.i18n').add(function(i18n) {
i18n.loadMessages('OggPlayer').then(init);
});
})(window.jQuery, window.mediaWiki);