您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A full-page music player with a modern interface, including download buttons, time display, and interaction banners.
- // ==UserScript==
- // @name Music Player for Open Directories
- // @namespace http://tampermonkey.net/
- // @version 1.2
- // @description A full-page music player with a modern interface, including download buttons, time display, and interaction banners.
- // @author GhostyTongue
- // @match *://*/*
- // @grant none
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- var e, t, n = document.links, i = [], o = 0;
- for (t in n) {
- var a = n[t].toString().toUpperCase();
- if (a.indexOf("JAVASCRIPT:") !== 0 && (a.indexOf(".MP3") !== -1 || a.indexOf(".FLAC") !== -1 || a.indexOf(".OGG") !== -1 || a.indexOf(".WAV") !== -1)) {
- i.push(n[t]);
- }
- }
- if (i.length > 0) {
- var d = x("div", "player-container", "", "", ""),
- header = x("div", "player-header", "", "", ""),
- parentButton = x("button", "parent-button", "Parent Directory", "", function() {
- window.location.href = "../";
- }),
- title = x("div", "player-title", "Music Player", "", ""),
- r = x("div", "playing", "", "", ""),
- p = x("div", "progressbar", "", "", function(t) {
- var n = t.clientX;
- n /= window.innerWidth;
- e.currentTime = e.duration * n;
- }),
- l = x("div", "progress", "", "", ""),
- timeDisplay = x("div", "time-display", "0:00", "", "");
- p.appendChild(l);
- r.appendChild(p);
- r.appendChild(timeDisplay);
- header.appendChild(parentButton);
- header.appendChild(title);
- d.appendChild(header);
- var s = x("div", "songname", "", "", "");
- r.appendChild(s);
- var u = x("div", "buttons", "", "", "");
- var playPauseButton = x("button", "control-button", "⏯", "", function() {
- e.paused ? (e.play(), this.innerHTML = "⏯") : (e.pause(), this.innerHTML = "▶️");
- showBanner(e.paused ? "Paused" : "Playing");
- });
- u.appendChild(playPauseButton);
- u.appendChild(x("button", "control-button", "⏮", "", y));
- u.appendChild(x("button", "control-button", "⏭", "", C));
- u.appendChild(x("button", "control-button", "🔀", "", function() {
- o = Math.floor(Math.random() * i.length);
- f();
- }));
- r.appendChild(u);
- d.appendChild(r);
- var c = x("ul", "playlist", "", "", "");
- for (var songIndex in i) {
- var h = decodeURIComponent(unescape(i[songIndex].href)),
- li = x("li", "playlist-item", h.substring(h.lastIndexOf("/") + 1), songIndex, function() {
- o = parseInt(this.getAttribute("data"));
- f();
- }),
- downloadButton = x("a", "download-button", "Download", "", function(e) {
- e.stopPropagation();
- });
- downloadButton.href = h;
- downloadButton.download = h.substring(h.lastIndexOf("/") + 1);
- li.appendChild(downloadButton);
- c.appendChild(li);
- }
- d.appendChild(c);
- var g = x("style", "", "", "", "");
- g.innerHTML = `
- .player-container {
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- background-color: #282c34;
- color: white;
- font-family: Arial, sans-serif;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- z-index: 1000;
- }
- .player-header {
- display: flex;
- justify-content: center;
- padding: 10px;
- background-color: #20232a;
- border-bottom: 1px solid #444;
- }
- .parent-button {
- position: absolute;
- left: 10px;
- background-color: #61dafb;
- border: none;
- color: #282c34;
- padding: 10px 20px;
- cursor: pointer;
- font-weight: bold;
- }
- .player-title {
- font-size: 2em;
- margin: auto;
- text-align: center;
- }
- .playing {
- padding: 20px;
- }
- .progressbar {
- position: relative;
- height: 20px;
- background-color: #444;
- border-radius: 10px;
- margin-bottom: 10px;
- cursor: pointer;
- }
- .progress {
- position: absolute;
- height: 100%;
- background-color: #61dafb;
- border-radius: 10px;
- }
- .time-display {
- text-align: center;
- font-size: 1em;
- margin-bottom: 20px;
- }
- .songname {
- margin-bottom: 20px;
- text-align: center;
- font-size: 1.5em;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- .buttons {
- text-align: center;
- margin-bottom: 20px;
- }
- .control-button {
- background: none;
- border: none;
- color: #61dafb;
- font-size: 3em;
- cursor: pointer;
- margin: 0 20px;
- }
- .playlist {
- flex: 1;
- overflow-y: auto;
- background-color: #20232a;
- padding: 20px;
- list-style: none;
- margin: 0;
- }
- .playlist-item {
- padding: 10px;
- cursor: pointer;
- border-bottom: 1px solid #444;
- font-size: 1.2em;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- .playlist-item:hover {
- background-color: #61dafb;
- color: #282c34;
- }
- .download-button {
- background-color: #61dafb;
- border: none;
- color: #282c34;
- padding: 5px 10px;
- cursor: pointer;
- font-size: 0.9em;
- text-decoration: none;
- border-radius: 5px;
- }
- .banner {
- position: fixed;
- bottom: 20px;
- left: 50%;
- transform: translateX(-50%);
- background-color: #61dafb;
- color: #282c34;
- padding: 10px 20px;
- border-radius: 5px;
- display: none;
- font-size: 1.2em;
- z-index: 1001;
- transition: opacity 0.5s;
- }
- `;
- d.appendChild(g);
- var banner = x("div", "banner", "", "", "");
- d.appendChild(banner);
- var m = document.createElement("meta"),
- b = document.createAttribute("name");
- b.value = "viewport";
- m.setAttributeNode(b);
- b = document.createAttribute("content");
- b.value = "width=device-width, initial-scale=1";
- m.setAttributeNode(b);
- document.head.appendChild(m);
- document.body.innerHTML = "";
- document.body.appendChild(d);
- (e = new Audio()).addEventListener("ended", C, !1);
- v();
- f();
- navigator.mediaSession.setActionHandler("previoustrack", y);
- navigator.mediaSession.setActionHandler("nexttrack", C);
- document.addEventListener("keydown", function(event) {
- if (event.code === "Space") {
- event.preventDefault();
- playPauseButton.click();
- }
- });
- }
- function f() {
- e.src = i[o];
- e.play();
- var t = decodeURIComponent(i[o].href);
- s.innerHTML = t.substring(t.lastIndexOf("/") + 1);
- navigator.mediaSession.metadata = new MediaMetadata({
- title: s.innerHTML
- });
- showBanner("Playing");
- }
- function x(e, t, n, i, o) {
- var a = document.createElement(e);
- t !== "" && a.classList.add(t);
- var d = document.createAttribute("data");
- d.value = i;
- a.setAttributeNode(d);
- a.appendChild(document.createTextNode(n));
- a.onclick = o;
- return a;
- }
- function v() {
- l.style.width = e.currentTime / e.duration * 100 + "%";
- timeDisplay.innerHTML = formatTime(e.currentTime) + " / " + formatTime(e.duration);
- requestAnimationFrame(v);
- }
- function formatTime(seconds) {
- var minutes = Math.floor(seconds / 60);
- var seconds = Math.floor(seconds % 60);
- return minutes + ":" + (seconds < 10 ? "0" : "") + seconds;
- }
- function y() {
- o > 0 ? o-- : o = i.length - 1;
- f();
- }
- function C() {
- o < i.length - 1 ? o++ : o = 0;
- f();
- }
- function showBanner(message) {
- banner.innerHTML = message;
- banner.style.display = "block";
- setTimeout(function() {
- banner.style.opacity = 0;
- setTimeout(function() {
- banner.style.display = "none";
- banner.style.opacity = 1;
- }, 500);
- }, 2000);
- }
- })();