Benutzer:Nw520/AudioPlayer.js
Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
- Opera: Strg+F5
/* eslint-disable max-len */
// <nowiki>
/******************************************************************************
* AudioPlayer
* Spielt Audiodateien direkt auf der Seite ab.
*
* Maintainer: nw520
******************************************************************************/
mw.hook( 'wikipage.content' ).add( function ( $container ) {
var CLASS_LOADING = 'ext-audioplayer-loading';
var CLASS_PLAYING = 'ext-audioplayer-playing';
/** @type {HTMLAudioElement} */
var audio = null;
var cssInjected = false;
/** @type {HTMLElement} */
var previousPlayer = null;
var strings = {
'ext-audioplayer-loadingfailed': {
de: 'Beim Laden der Audiodatei ist ein Fehler aufgetreten.',
en: 'An error occurred while loading the audio file.'
}
};
function main() {
setupStrings();
$container[ 0 ].querySelectorAll( '.voy-audio a[href]' ).forEach( function ( item ) {
item.addEventListener( 'click', function ( e ) {
e.preventDefault();
if ( !cssInjected ) {
mw.loader.using( 'mediawiki.util' ).then( function () {
mw.util.addCSS( '.ext-audioplayer-loading{animation:ext-audioplayer-loading .7s infinite alternate}.ext-audioplayer-loading,.ext-audioplayer-loading *{cursor:progress}.ext-audioplayer-playing img{filter:invert(51%) sepia(68%) saturate(395%) hue-rotate(98deg) brightness(86%) contrast(88%)}@keyframes ext-audioplayer-loading{0%{opacity:1}to{opacity:.25}}' );
cssInjected = true;
} );
}
var currentPlayer = item.closest( '.voy-audio' );
var audioPlaying = audio !== null && audio.duration > 0 && !audio.paused;
var loading = currentPlayer.classList.contains( CLASS_LOADING );
// Cleanup
if ( audio !== null ) {
audio.pause();
}
resetPlayer( previousPlayer );
// Play
if ( !audioPlaying && !loading || previousPlayer !== currentPlayer ) {
// Only play, if clicked on other link, audio was already paused and not loading
previousPlayer = currentPlayer;
// Create audio
audio = new Audio( item.href );
if ( e.shiftKey ) {
// Slower playback when shift-key is pressed
audio.playbackRate = 0.5;
}
audio.addEventListener( 'loadstart', function () {
currentPlayer.classList.add( CLASS_LOADING );
} );
[ 'abort', 'canplaythrough' ].forEach( function ( event ) {
audio.addEventListener( event, function () {
currentPlayer.classList.remove( CLASS_LOADING );
} );
} );
[ 'ended', 'pause', 'waiting' ].forEach( function ( event ) {
audio.addEventListener( event, function () {
currentPlayer.classList.remove( CLASS_PLAYING );
} );
} );
[ 'play', 'playing' ].forEach( function ( event ) {
audio.addEventListener( event, function () {
currentPlayer.classList.add( CLASS_PLAYING );
} );
} );
audio.addEventListener( 'error', function () {
mw.notify( mw.msg( 'ext-audioplayer-loadingfailed' ), {
title: 'AudioPlayer',
type: 'error'
} );
currentPlayer.classList.remove( CLASS_LOADING );
} );
audio.play();
}
} );
} );
}
function setupStrings() {
var lang = mw.config.get( 'wgUserLanguage' );
mw.messages.set( Object.fromEntries( Object.keys( strings ).map( function ( stringKey ) {
return [ stringKey, strings[ stringKey ][ lang ] !== undefined ? strings[ stringKey ][ lang ] : strings[ stringKey ].en ];
} ) ) );
}
/**
* @param {HTMLElement} player
*/
function resetPlayer( player ) {
if ( player !== null ) {
player.classList.remove( CLASS_LOADING );
player.classList.remove( CLASS_PLAYING );
}
}
main();
} );