MediaWiki:Common.js: Difference between revisions

From Tuyin Archives
No edit summary
No edit summary
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */
// Audio Player System
// Audio Player System
// Audio Player System
/* Any JavaScript here will be loaded for all users on every page load. */
// Audio Player System
// Audio Player System
mw.hook('wikipage.content').add(function($content) {
mw.hook('wikipage.content').add(function($content) {
Line 9: Line 11:
          
          
         if (!filename) return;
         if (!filename) return;
       
 
         // Generate unique ID
         // Generate unique ID
         var playerId = 'audio_' + Math.random().toString(36).substr(2, 9);
         var playerId = 'audio_' + Math.random().toString(36).substr(2, 9);
       
 
         // Create player HTML
         // Create player HTML
         var $player = $('<div>').css({
         var $player = $('<div>').css({
Line 19: Line 21:
             'gap': '12px'
             'gap': '12px'
         });
         });
       
 
         var $playerBox = $('<div>').css({
         var $playerBox = $('<div>').css({
             'border': '1px solid #8B7355',
             'border': '1px solid #8B7355',
Line 27: Line 29:
             'width': '200px'
             'width': '200px'
         });
         });
       
 
         var $button = $('<button>').attr('id', playerId + '_btn').text('▶️').css({
         var $button = $('<button>').attr('id', playerId + '_btn').text('▶️').css({
             'padding': '4px 8px',
             'padding': '4px 8px',
Line 36: Line 38:
             'color': '#5D4E37'
             'color': '#5D4E37'
         });
         });
       
 
         var $progressContainer = $('<div>').css({
         var $progressContainer = $('<div>').css({
             'display': 'inline-block',
             'display': 'inline-block',
Line 45: Line 47:
             'vertical-align': 'middle'
             'vertical-align': 'middle'
         });
         });
       
 
         var $progress = $('<div>').attr('id', playerId + '_progress').css({
         var $progress = $('<div>').attr('id', playerId + '_progress').css({
             'height': '100%',
             'height': '100%',
Line 53: Line 55:
             'transition': 'width 0.1s'
             'transition': 'width 0.1s'
         });
         });
       
 
         var $caption = $('<span>').text(caption).css({
         var $caption = $('<span>').text(caption).css({
             'color': '#8B7355',
             'color': '#8B7355',
             'font-style': 'italic'
             'font-style': 'italic'
         });
         });
       
 
         // Build structure
         // Build structure
         $progressContainer.append($progress);
         $progressContainer.append($progress);
         $playerBox.append($button).append($progressContainer);
         $playerBox.append($button).append($progressContainer);
         $player.append($playerBox).append($caption);
         $player.append($playerBox).append($caption);
       
 
         // Replace container content
         // Replace container content
         $container.empty().append($player);
         $container.empty().append($player);
       
        // Set up audio functionality
var audioSrc = 'https://tuyin.online/images/' + filename;
var isMobile = /Mobi|Android|iPhone|iPad/i.test(navigator.userAgent);


// For mobile, inject a real <audio> tag (helps Safari and Chrome mobile)
        // Set up audio functionality using DOM <audio> tag
if (isMobile) {
        var audioSrc = 'https://tuyin.online/images/' + filename;
    var $realAudio = $('<audio preload="metadata" playsinline style="display:none;">')
        var $realAudio = $('<audio preload="metadata" playsinline style="display:none;">')
        .append($('<source>').attr('src', audioSrc).attr('type', 'audio/ogg'));
            .append($('<source>').attr('src', audioSrc).attr('type', 'audio/ogg'));
    $container.append($realAudio);
        $container.append($realAudio);
    audio = $realAudio[0];
        var audio = $realAudio[0];
} else {
    audio = new Audio(audioSrc);
}
         var isPlaying = false;
         var isPlaying = false;
       
 
         $button.click(function() {
         $button.click(function() {
            audio.load(); // Force load to fix mobile playback
             if (isPlaying) {
             if (isPlaying) {
                 audio.pause();
                 audio.pause();
Line 96: Line 92:
             }
             }
         });
         });
       
 
         audio.addEventListener('timeupdate', function() {
         audio.addEventListener('timeupdate', function() {
             if (audio.duration) {
             if (audio.duration) {
Line 103: Line 99:
             }
             }
         });
         });
       
 
         audio.addEventListener('ended', function() {
         audio.addEventListener('ended', function() {
             $button.text('▶️');
             $button.text('▶️');

Revision as of 21:26, 23 July 2025

/* Any JavaScript here will be loaded for all users on every page load. */
// Audio Player System
// Audio Player System
/* Any JavaScript here will be loaded for all users on every page load. */
// Audio Player System
mw.hook('wikipage.content').add(function($content) {
    $content.find('.audioplayer').each(function() {
        var $container = $(this);
        var filename = $container.attr('data-filename');
        var caption = $container.attr('data-caption') || 'Audio File';
        
        if (!filename) return;

        // Generate unique ID
        var playerId = 'audio_' + Math.random().toString(36).substr(2, 9);

        // Create player HTML
        var $player = $('<div>').css({
            'display': 'inline-flex',
            'align-items': 'center',
            'gap': '12px'
        });

        var $playerBox = $('<div>').css({
            'border': '1px solid #8B7355',
            'padding': '8px',
            'border-radius': '4px',
            'background-color': '#F5F0E8',
            'width': '200px'
        });

        var $button = $('<button>').attr('id', playerId + '_btn').text('▶️').css({
            'padding': '4px 8px',
            'margin-right': '8px',
            'font-size': '12px',
            'border': '1px solid #8B7355',
            'background': '#D4C4A8',
            'color': '#5D4E37'
        });

        var $progressContainer = $('<div>').css({
            'display': 'inline-block',
            'width': '120px',
            'height': '6px',
            'background-color': '#D4C4A8',
            'border-radius': '3px',
            'vertical-align': 'middle'
        });

        var $progress = $('<div>').attr('id', playerId + '_progress').css({
            'height': '100%',
            'background-color': '#8B7355',
            'border-radius': '3px',
            'width': '0%',
            'transition': 'width 0.1s'
        });

        var $caption = $('<span>').text(caption).css({
            'color': '#8B7355',
            'font-style': 'italic'
        });

        // Build structure
        $progressContainer.append($progress);
        $playerBox.append($button).append($progressContainer);
        $player.append($playerBox).append($caption);

        // Replace container content
        $container.empty().append($player);

        // Set up audio functionality using DOM <audio> tag
        var audioSrc = 'https://tuyin.online/images/' + filename;
        var $realAudio = $('<audio preload="metadata" playsinline style="display:none;">')
            .append($('<source>').attr('src', audioSrc).attr('type', 'audio/ogg'));
        $container.append($realAudio);
        var audio = $realAudio[0];
        var isPlaying = false;

        $button.click(function() {
            audio.load(); // Force load to fix mobile playback
            if (isPlaying) {
                audio.pause();
                $button.text('▶️');
                isPlaying = false;
            } else {
                audio.play().then(function() {
                    $button.text('⏸️');
                    isPlaying = true;
                }).catch(function(error) {
                    alert('Could not play audio: ' + error.message);
                });
            }
        });

        audio.addEventListener('timeupdate', function() {
            if (audio.duration) {
                var percentage = (audio.currentTime / audio.duration) * 100;
                $progress.css('width', percentage + '%');
            }
        });

        audio.addEventListener('ended', function() {
            $button.text('▶️');
            $progress.css('width', '0%');
            isPlaying = false;
        });
    });
});