// ==UserScript== // @name A2P // @namespace http://tampermonkey.net/ // @version 1.0.5 // @description Anime2Potplayer,用Potplayer打开浏览器播放的动漫,这样就可以使用SVP4补帧啦! // @author MakotoArai(https://github.com/MakotoArai-CN) // @supportURL https://blog.ciy.cool // @license GPL-v3 // @icon https://cravatar.cn/avatar/1e84fce3269537e4aa7473602516bf6d?s=256 // @match *anich.emmmm.eu.org/* // @match *.mutedm.com/* // @match *.iyinghua.com/* // @match *.5dm.link/* // @match *.dmd77.com/* // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== 'use strict'; window.onload = function () { console.info("%cA2P%c%s", "color:red;font-size:40px;font-weight:bold;", "color:black;font-size:16px;font-weight:normal", "\n" + GM_info.script.version); // 定时器用于动态嗅探视频链接 const videoTimer = setInterval(findVideoUrl, 1000); // 域名包含 anich.emmmm.eu.org 则启用下面的逻辑 if (window.location.href.includes("anich.emmmm.eu.org")) { // 定时器检测url是否改变,如果改变则重新调用findVideoUrl setInterval(function () { if (GM_getValue("url") !== window.location.href) { // 存入url方便对比 GM_setValue("url", window.location.href); findVideoUrl(); } }, 1500); } function findVideoUrl() { const videoElement = document.querySelector("video"); if (videoElement && videoElement.src) { if (videoElement.src.includes("blob:")) return; clearInterval(videoTimer); preparePotplayerInteraction(videoElement, GM_getValue("check") ?? false); } } function preparePotplayerInteraction(videoElement, check = true) { const videoUrl = videoElement.src; console.log(`检测到视频链接: ${videoUrl}`); creatBtn(videoElement); if (check) { window.location.href = `potplayer://${videoUrl}`; // 检测是否播放,如果正在播放则暂停网页的播放 var pause_Flag = 0; const checkTimer = setInterval(() => { const isPlaying = !videoElement.paused && !videoElement.ended && videoElement.readyState > 2; // console.log(isPlaying ? "正在播放" : "已暂停或结束"); if (isPlaying) videoElement.pause(); if (!isPlaying || pause_Flag > 100) clearInterval(checkTimer); pause_Flag++; }, 1500); }; } function creatBtn(videoElement) { // 插入自定义CDN document.head.insertAdjacentHTML("beforeend", ` `); // 右键菜单 var menu = document.createElement("div"); // 插入自定义css document.head.insertAdjacentHTML("beforeend", ` )`); /* 右键菜单 */ menu.innerHTML = `
`; document.body.appendChild(menu); // 自定义鼠标右键 // 自定义鼠标右键菜单行为 (function () { let mouseX = 0; let mouseY = 0; let windowWidth = 0; let windowHeight = 0; // 获取元素 const menu = document.querySelector('.usercm'); // 鼠标移动事件 window.addEventListener('mousemove', function (e) { windowWidth = window.innerWidth; windowHeight = window.innerHeight; mouseX = e.clientX; mouseY = e.clientY; // 设置菜单位置 let left = e.pageX; let top = e.pageY; if (mouseX + menu.offsetWidth >= windowWidth) { left = left - menu.offsetWidth - 5; } if (mouseY + menu.offsetHeight >= windowHeight) { top = top - menu.offsetHeight - 5; } // 绑定右键点击事件 document.documentElement.addEventListener('contextmenu', function (event) { if (event.button === 2) { // 右键点击 event.preventDefault(); menu.style.left = `${left}px`; menu.style.top = `${top}px`; menu.style.display = 'block'; } }); // 点击隐藏菜单 document.documentElement.addEventListener('click', function () { menu.style.display = 'none'; }); }); // 禁用默认右键菜单 window.oncontextmenu = function (e) { e.preventDefault(); return false; }; // 判断是否是移动端 const userAgent = navigator.userAgent; const mobileKeywords = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']; let isMobile = false; for (let keyword of mobileKeywords) { if (userAgent.indexOf(keyword) > -1) { isMobile = true; break; } } // 非移动端才启用自定义右键菜单 if (!isMobile) { // 上面已经实现了 mouseMoveShow 和 disabledContextMenu // console.log('已启用自定义右键菜单'); } })(); const potplayer = document.querySelector(".potplayer"); const aa2p = document.querySelector(".aa2p"); const videoUrl = videoElement.src; potplayer.addEventListener("click", function () { window.location.href = `potplayer://${videoUrl}`; // 暂停播放 videoElement.pause(); }) // Alt + X 按键跳转 document.onkeydown = function (e) { const keyNum = window.event ? e.keyCode : e.which; if (e.altKey && Number.isInteger(keyNum)) { switch (keyNum) { case 88: window.location.href = `potplayer://${videoUrl}`; videoElement.pause(); break; } } }; aa2p.innerHTML = `${GM_getValue("check") ? "关闭自动跳转" : "开启自动跳转"}`; aa2p.addEventListener("click", function () { const check = GM_getValue("check") ?? false; if (check) { GM_setValue("check", false); aa2p.innerHTML = `开启自动跳转`; } else { GM_setValue("check", true); aa2p.innerHTML = `关闭自动跳转`; } }) } }