// ==UserScript== // @name Breizh autoplay // @namespace http://tampermonkey.net/ // @version 2024-04-10 // @description Add an audio player for audio files on fichiers.breizh.pm // @author Eldeberen // @match https://fichiers.breizh.pm/* // @grant none // ==/UserScript== // Add current song to history function ap_add2history(event) { ap_history.push(event.target); } // Play the next track function ap_next(event) { let item = ap_history.at(-1); let autoplay = document.getElementById("ap-player").open; let random = document.getElementById("ap-random").checked; let loop = document.getElementById("ap-loop").checked; let currentId = ap_medias.indexOf(item); let nextId = -1; // If no autoplay, exit if(!autoplay) return; // If function applied to something that is not an audio song, exit // Note that this should not happen in a regular use if(currentId == -1) return; // Make sure to pause the current track item.pause(); // If random, pick a random song in the list // Else pick the next one if(random) { nextId = Math.floor(Math.random() * ap_medias.length); } else { nextId = currentId + 1; } // If looping, stay in the range if(loop) { nextId %= ap_medias.length; } // If the next song is out, exit if(nextId == ap_medias.length) return; // Finally, set the volume back and jump to the selected song ap_medias[nextId].volume = item.volume; ap_medias[nextId].play(); } // Play/pause current function ap_playpause() { if(ap_paused == null) { ap_paused = ap_history.pop(); ap_paused.pause(); } else { ap_paused.play(); ap_paused = null; } } // Play previous song function ap_prev() { let current = ap_history.pop(); let prev = ap_history.pop(); current.pause(); prev.currentTime = 0; prev.play(); } // Get all audio medias on the page let ap_medias = Array.from(document.querySelectorAll("audio")); // Define a playing history let ap_history = []; let ap_paused = null; // If there is at least one media if(ap_medias.length > 0) { // Create the menu var ap_menu = document.createElement("div"); ap_menu.id = "ap-manu"; ap_menu.innerHTML = `
Player
`; document.querySelector("body").insertBefore(ap_menu, document.getElementById("maintable")); // Add event listeners [["ap-prev", ap_prev], ["ap-playpause", ap_playpause], ["ap-next", ap_next]].map((e) => { document.getElementById(e[0]).addEventListener("click", e[1]); }); // Apply the event listener to all medias ap_medias.map(function(e) { e.addEventListener("ended", ap_next); e.addEventListener("play", ap_add2history); }); }