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
  • Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/* 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(); } );