// ==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);
}
}
});
}
}
})();