halihali便携按钮

快速上一集下一集,快速跳到指定位,窗口化全屏功能,切源功能。

当前为 2021-12-19 提交的版本,查看 最新版本

// ==UserScript==
// @license      MIT
// @name         halihali便携按钮
// @namespace    哈哩哈哩快速操作按钮
// @description  快速上一集下一集,快速跳到指定位,窗口化全屏功能,切源功能。
// @version      0.9
// @author       You
// @match        http://*/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        unsafeWindow
// @grant        GM_setValue
// @grant        GM_addValueChangeListener

// ==/UserScript==

(function () {
    'use strict';


    let url = location.hostname;

    if(url.indexOf("halihali") != -1){
        //out rect
        if (document.getElementById("playiframe")) {//外部容器
            console.log("浏览器外壳层");
            let style = document.createElement("style");
            style.type = "text/css";
            let str = `
            .MyFullscreen {
                position:fixed;
                top:0px;
                left:0px;
                z-index:9999;
                width:100%;
                height:100%;
            }
            .PlayerSettings{
                position:fixed;
                left:0;
                z-index:999999;
                top:50vh;
                transform: translate(0,-50%);
                background:rgba(0,0,0,0.8);
                width:60px;
                min-width:50px;
                min-height:260px;
                float:left;
                padding:20px;
                border-radius:10px;
                margin:2px;
                transition: all 0.2s;
            }
            .PlayerSettings>*{
                min-width:60px;
                min-height:40px;
                float:left;
            }
            .PlayerSettings>*+*{
                margin-left:0px;
            }
            .EditView{
                text-align:center;
                width:60px;
            }
            .Hide{
                opacity:0;
            }
            `;
            style.innerHTML = str.split("\n").map(o => o.trim()).filter(o => o).join("");
            console.log(style.innerHTML);
            document.head.appendChild(style);

            let layout = document.createElement("div");
            layout.className = "PlayerSettings";
            layout.classList.add("PlayerSettings", "Hide");
            document.body.appendChild(layout);
            layout.onmouseover = function () {
                layout.classList.remove("Hide");
            };
            layout.onmouseout = function () {
                layout.classList.add("Hide");
            };

            let episodes = (add) => {
                localStorage.setItem("ifNextFullscreen", "true");

                let url = location.href;
                let index = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
                index = Number.parseInt(index) + add;
                url = url.substring(0, url.lastIndexOf("/") + 1) + index + url.substring(url.lastIndexOf("."));
                location.href = url;
            }

            let fullscreens = () =>{
                localStorage.setItem("ifNextFullscreen", "false");
                let player = document.getElementById("player");
                player.classList.toggle("MyFullscreen", !player.classList.contains("MyFullscreen"));
            }

            let nextResVideo = () =>{
                GM_setValue("MsgEvent", URL.createObjectURL(new Blob()));
            }
            let progressVideo = (timme) =>{
                GM_setValue("VdoControl", -1);
                GM_setValue("VdoControl", timme);
            }

            let items = [
                {
                    label: "全屏",
                    click: () => {
                        fullscreens();
                    }
                },
                {
                    label: "上一集",
                    click: () => {
                        episodes(-1);
                    }
                },
                {
                    label: "下一集",
                    click: () => {
                        episodes(1);
                    }
                },
                {
                    label:"换源",
                    click:() => {
                        nextResVideo();
                    }
                },
                {
                    label:"progress"
                },
                {
                    label:"跳片头",
                    click:()=>{
                        let et = document.querySelector("#et_time").value;
                        let saveTime = (localStorage.getItem("headTime") == null) ? 100 : localStorage.getItem("headTime");
                        if(et != saveTime){
                            localStorage.setItem("headTime", et)
                        }
                        progressVideo(et);
                    }
                },
            ]

            items.forEach(item => {
                if(item.label == "progress"){
                    //<input type="text" id="et_time">
                    let elEt = document.createElement("input");
                    elEt.className = "EditView";
                    elEt.id = "et_time";
                    elEt.value = (localStorage.getItem("headTime") == null) ? 100 : localStorage.getItem("headTime");
                    layout.appendChild(elEt);
                }else{
                    let el = document.createElement("button");
                    el.innerText = item.label;
                    el.addEventListener("click", item.click);
                    layout.appendChild(el);
                }
            })

            if(localStorage.getItem("ifNextFullscreen") == "true"){
                fullscreens();
            }

            //自动切换下一集
            GM_addValueChangeListener("AutoNext", (name, oldValue, newValue, remote)=>{
                episodes(1);
            });
        }

    }
    else{


        //center rect
        let play = document.getElementById("divplay");
        if (play) {
            play.style.height = "100%";
            let iframe = play.querySelector("#playiframe");//内部播放器
            if (iframe) {
                console.log("内部播放器中间件");
                iframe.style.height = "100%";
                let playRoad = document.getElementById("playroad");
                playRoad.style.position = "absolute";
                playRoad.style.left = "0px";
                playRoad.style.top = "0px";
                playRoad.style.width = "100%";
                playRoad.style.opacity = "0";
                playRoad.onmouseover = function () {
                    this.style.opacity = "1";
                };
                playRoad.onmouseout = function () {
                    this.style.opacity = "0";
                };

                //切换视频源
                GM_addValueChangeListener("MsgEvent", (name, oldValue, newValue, remote)=>{
                    let resLists = document.getElementById("playroad");
                    //优先备用线2
                    let checkBei = false;
                    resLists.childNodes.forEach(item => {
                        if(item.innerText == "备用线2" && item.style.color != "rgb(47, 179, 255)"){//未选中
                            item.click();
                            checkBei = true;
                        }
                    });

                    if(checkBei){
                        return;
                    }
                    //无备用线,走正常下一源
                    let tagFlag = false;
                    resLists.childNodes.forEach(item => {

                        if(item.tagName == 'A'){
                            if(item.style.color == "rgb(47, 179, 255)"){//选中 蓝色
                                tagFlag = true;
                            }else if(item.style.color == "rgb(170, 170, 170)" && tagFlag){//灰色
                                tagFlag = false;
                                item.click();
                            }else if(item.style.color == "rgb(255, 0, 0)" && tagFlag){//红色
                                tagFlag = false;
                                item.click();
                            }
                        }
                    });
                });
            }
            return;
        }
        else{

            if(!document.querySelector('video')){
                return;
            }

            //结束监听
            document.querySelector('video').addEventListener("ended", ()=>{
                console.log("播放结束");
                GM_setValue("AutoNext", URL.createObjectURL(new Blob()));
            });

            //video rect
            GM_addValueChangeListener("VdoControl", (name, oldValue, newValue, remote)=>{
                //快进
                if(oldValue == "-1" && document.querySelector('video')){
                    document.querySelector('video').muted = true;
                    document.querySelector('video').play();
                    document.querySelector('video').currentTime += +newValue;
                }
                //快进自动播放
                if(oldValue == "-1" && document.querySelector('video')){
                    let vdo = document.querySelector('body');
                    let btnSound = document.querySelector('#soundBtn');
                    if(!btnSound){
                        let el = document.createElement("button");
                        el.id = "soundBtn";
                        el.style.position = "absolute";
                        el.style.width = "100px";
                        el.style.height = "40px";
                        el.style.bottom = "0px";
                        el.style.color = "rgb(255,255,255)";
                        el.style.background = "rgba(0,0,0,0.8)";
                        el.innerText = "音量";
                        el.addEventListener("click", ()=>{
                            document.querySelector('#soundBtn').remove();
                            document.querySelector('video').muted = false;
                        });
                        vdo.appendChild(el);
                    }

                }
            });
        }
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址