// ==UserScript== // @name 为Alist生成M3U8播放列表文件 // @namespace createM3U8forAlist.whatGUI // @version 2024-12-23 // @description 为Alist中的视频文件生成并上传或下载一个M3U8播放列表 // @author whatGUI // @match http://*/* // @match https://*/* // @icon https://alist.nn.ci/favicon.ico // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/503540/%E4%B8%BAAlist%E7%94%9F%E6%88%90M3U8%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8%E6%96%87%E4%BB%B6.user.js // @updateURL https://update.greasyfork.icu/scripts/503540/%E4%B8%BAAlist%E7%94%9F%E6%88%90M3U8%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8%E6%96%87%E4%BB%B6.meta.js // ==/UserScript== (function () { "use strict"; function addCSS() { const style = document.createElement("style"); style.textContent = ` .m3u8-toolbar { position: fixed; right: 65px; bottom: 20px; } .m3u8-toolbar-icon { width: 2rem; height: 2rem; color: #ff8718; padding: 4px; border-radius: 0.5rem; cursor: pointer; margin-top: 0.25rem; } .m3u8-toolbar-icon:hover { color: #ffffff; background-color: #ff8718; } .m3u8-dialog { position: fixed; z-index: 9999; opacity: 0; animation: fadeIn 0.3s forwards; } .m3u8-dialog-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.65); } .m3u8-dialog-content { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; padding: 20px; border-radius: 0.5rem; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); max-width: 90%; width: 24rem; text-align: center; } .m3u8-dialog-content h2 { margin-bottom: 1rem; font-size: 1.5em; color: #11181c; } .m3u8-dialog-content button { background-color: #ffe5cc; color: #ff8718; border: none; padding: 10px 20px; margin: 10px; border-radius: 5px; cursor: pointer; font-size: 1em; } .m3u8-dialog-content button:hover { background-color: #ffd1a3; } .m3u8-dialog-content button#closeDialog { background-color: #eceef0; color: #11181c; } .m3u8-dialog-content button#closeDialog:hover { background-color: #e6e8eb; } @keyframes fadeIn { to { opacity: 1; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } .fade-out { animation: fadeOut 0.3s forwards; } `; document.head.appendChild(style); } function addButton() { const buttonDiv = document.createElement("div"); buttonDiv.className = "m3u8-toolbar"; buttonDiv.innerHTML = ``; document.body.appendChild(buttonDiv); buttonDiv.addEventListener("click", addDialog); const showBtn = localStorage.getItem("more-open") === "true"; buttonDiv.style.display = showBtn ? "block" : "none"; waitForElement(".left-toolbar-box", (element) => { element.addEventListener("click", (e) => { const svgElement = e.target.closest("svg"); if (svgElement) { if (svgElement.getAttribute("tips") === "more") { buttonDiv.style.display = "none"; } else if ( svgElement.classList.contains("toolbar-toggle") ) { buttonDiv.style.display = "block"; } } }); }); } function waitForElement( selector, callback, waitTime = 250, maxAttempts = 10 ) { let attempts = 0; const interval = setInterval(() => { const element = document.querySelector(selector); if (element) { console.log("Element is now available."); clearInterval(interval); callback(element); } else if (attempts >= maxAttempts) { console.log("Element not found after maximum attempts."); clearInterval(interval); } attempts++; }, waitTime); } const DIALOG_HTML = `