1
This commit is contained in:
274
js/content-script.js
Normal file
274
js/content-script.js
Normal file
@@ -0,0 +1,274 @@
|
||||
(function () {
|
||||
var _videoObj = [];
|
||||
var _videoSrc = [];
|
||||
var _key = new Set();
|
||||
chrome.runtime.onMessage.addListener(function (Message, sender, sendResponse) {
|
||||
if (chrome.runtime.lastError) { return; }
|
||||
// 获取页面视频对象
|
||||
if (Message.Message == "getVideoState") {
|
||||
let videoObj = [];
|
||||
let videoSrc = [];
|
||||
document.querySelectorAll("video, audio").forEach(function (video) {
|
||||
if (video.currentSrc != "" && video.currentSrc != undefined) {
|
||||
videoObj.push(video);
|
||||
videoSrc.push(video.currentSrc);
|
||||
}
|
||||
});
|
||||
const iframe = document.querySelectorAll("iframe");
|
||||
if (iframe.length > 0) {
|
||||
iframe.forEach(function (iframe) {
|
||||
if (iframe.contentDocument == null) { return true; }
|
||||
iframe.contentDocument.querySelectorAll("video, audio").forEach(function (video) {
|
||||
if (video.currentSrc != "" && video.currentSrc != undefined) {
|
||||
videoObj.push(video);
|
||||
videoSrc.push(video.currentSrc);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
if (videoObj.length > 0) {
|
||||
if (videoObj.length !== _videoObj.length || videoSrc.toString() !== _videoSrc.toString()) {
|
||||
_videoSrc = videoSrc;
|
||||
_videoObj = videoObj;
|
||||
}
|
||||
Message.index = Message.index == -1 ? 0 : Message.index;
|
||||
const video = videoObj[Message.index];
|
||||
const timePCT = video.currentTime / video.duration * 100;
|
||||
sendResponse({
|
||||
time: timePCT,
|
||||
currentTime: video.currentTime,
|
||||
duration: video.duration,
|
||||
volume: video.volume,
|
||||
count: _videoObj.length,
|
||||
src: _videoSrc,
|
||||
paused: video.paused,
|
||||
loop: video.loop,
|
||||
speed: video.playbackRate,
|
||||
muted: video.muted,
|
||||
type: video.tagName.toLowerCase()
|
||||
});
|
||||
return true;
|
||||
}
|
||||
sendResponse({ count: 0 });
|
||||
return true;
|
||||
}
|
||||
// 速度控制
|
||||
if (Message.Message == "speed") {
|
||||
_videoObj[Message.index].playbackRate = Message.speed;
|
||||
return true;
|
||||
}
|
||||
// 画中画
|
||||
if (Message.Message == "pip") {
|
||||
if (document.pictureInPictureElement) {
|
||||
try { document.exitPictureInPicture(); } catch (e) { return true; }
|
||||
sendResponse({ state: false });
|
||||
return true;
|
||||
}
|
||||
try { _videoObj[Message.index].requestPictureInPicture(); } catch (e) { return true; }
|
||||
sendResponse({ state: true });
|
||||
return true;
|
||||
}
|
||||
// 全屏
|
||||
if (Message.Message == "fullScreen") {
|
||||
if (document.fullscreenElement) {
|
||||
try { document.exitFullscreen(); } catch (e) { return true; }
|
||||
sendResponse({ state: false });
|
||||
return true;
|
||||
}
|
||||
setTimeout(function () {
|
||||
try { _videoObj[Message.index].requestFullscreen(); } catch (e) { return true; }
|
||||
}, 500);
|
||||
sendResponse({ state: true });
|
||||
return true;
|
||||
}
|
||||
// 播放
|
||||
if (Message.Message == "play") {
|
||||
_videoObj[Message.index].play();
|
||||
return true;
|
||||
}
|
||||
// 暂停
|
||||
if (Message.Message == "pause") {
|
||||
_videoObj[Message.index].pause();
|
||||
return true;
|
||||
}
|
||||
// 循环播放
|
||||
if (Message.Message == "loop") {
|
||||
_videoObj[Message.index].loop = Message.action;
|
||||
return true;
|
||||
}
|
||||
// 设置音量
|
||||
if (Message.Message == "setVolume") {
|
||||
_videoObj[Message.index].volume = Message.volume;
|
||||
sendResponse("ok");
|
||||
return true;
|
||||
}
|
||||
// 静音
|
||||
if (Message.Message == "muted") {
|
||||
_videoObj[Message.index].muted = Message.action;
|
||||
return true;
|
||||
}
|
||||
// 设置视频进度
|
||||
if (Message.Message == "setTime") {
|
||||
const time = Message.time * _videoObj[Message.index].duration / 100;
|
||||
_videoObj[Message.index].currentTime = time;
|
||||
sendResponse("ok");
|
||||
return true;
|
||||
}
|
||||
// 截图视频图片
|
||||
if (Message.Message == "screenshot") {
|
||||
try {
|
||||
let video = _videoObj[Message.index];
|
||||
let canvas = document.createElement("canvas");
|
||||
canvas.width = video.videoWidth;
|
||||
canvas.height = video.videoHeight;
|
||||
canvas.getContext("2d").drawImage(video, 0, 0, canvas.width, canvas.height);
|
||||
let link = document.createElement("a");
|
||||
link.href = canvas.toDataURL("image/jpeg");
|
||||
link.download = `${location.hostname}-${secToTime(video.currentTime)}.jpg`;
|
||||
link.click();
|
||||
canvas = null;
|
||||
link = null;
|
||||
sendResponse("ok");
|
||||
return true;
|
||||
} catch (e) { console.log(e); return true; }
|
||||
}
|
||||
if (Message.Message == "getKey") {
|
||||
sendResponse(Array.from(_key));
|
||||
return true;
|
||||
}
|
||||
if (Message.Message == "ffmpeg") {
|
||||
if (!Message.files) {
|
||||
window.postMessage(Message);
|
||||
sendResponse("ok");
|
||||
return true;
|
||||
}
|
||||
Message.quantity ??= Message.files.length;
|
||||
for (let item of Message.files) {
|
||||
const data = { ...Message, ...item };
|
||||
data.type = item.type ?? "video";
|
||||
if (data.data instanceof Blob) {
|
||||
window.postMessage(data);
|
||||
} else {
|
||||
fetch(data.data)
|
||||
.then(response => response.blob())
|
||||
.then(blob => {
|
||||
data.data = blob;
|
||||
window.postMessage(data);
|
||||
});
|
||||
}
|
||||
}
|
||||
sendResponse("ok");
|
||||
return true;
|
||||
}
|
||||
if (Message.Message == "getPage") {
|
||||
if (Message.find) {
|
||||
const DOM = document.querySelector(Message.find);
|
||||
DOM ? sendResponse(DOM.innerHTML) : sendResponse("");
|
||||
return true;
|
||||
}
|
||||
sendResponse(document.documentElement.outerHTML);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
// Heart Beat
|
||||
var Port;
|
||||
function connect() {
|
||||
Port = chrome.runtime.connect(chrome.runtime.id, { name: "HeartBeat" });
|
||||
Port.postMessage("HeartBeat");
|
||||
Port.onMessage.addListener(function (message, Port) { return true; });
|
||||
Port.onDisconnect.addListener(connect);
|
||||
}
|
||||
connect();
|
||||
|
||||
function secToTime(sec) {
|
||||
let time = "";
|
||||
let hour = Math.floor(sec / 3600);
|
||||
let min = Math.floor((sec % 3600) / 60);
|
||||
sec = Math.floor(sec % 60);
|
||||
if (hour > 0) { time = hour + "'"; }
|
||||
if (min < 10) { time += "0"; }
|
||||
time += min + "'";
|
||||
if (sec < 10) { time += "0"; }
|
||||
time += sec;
|
||||
return time;
|
||||
}
|
||||
window.addEventListener("message", (event) => {
|
||||
if (!event.data || !event.data.action) { return; }
|
||||
if (event.data.action == "catCatchAddMedia") {
|
||||
if (!event.data.url) { return; }
|
||||
chrome.runtime.sendMessage({
|
||||
Message: "addMedia",
|
||||
url: event.data.url,
|
||||
href: event.data.href ?? event.source.location.href,
|
||||
extraExt: event.data.ext,
|
||||
mime: event.data.mime,
|
||||
requestHeaders: { referer: event.data.referer },
|
||||
requestId: event.data.requestId
|
||||
});
|
||||
}
|
||||
if (event.data.action == "catCatchAddKey") {
|
||||
let key = event.data.key;
|
||||
if (key instanceof ArrayBuffer || key instanceof Array) {
|
||||
key = ArrayToBase64(key);
|
||||
}
|
||||
if (_key.has(key)) { return; }
|
||||
_key.add(key);
|
||||
chrome.runtime.sendMessage({
|
||||
Message: "send2local",
|
||||
action: "addKey",
|
||||
data: key,
|
||||
});
|
||||
chrome.runtime.sendMessage({
|
||||
Message: "popupAddKey",
|
||||
data: key,
|
||||
url: event.data.url,
|
||||
});
|
||||
}
|
||||
if (event.data.action == "catCatchFFmpeg") {
|
||||
if (!event.data.use ||
|
||||
!event.data.files ||
|
||||
!event.data.files instanceof Array ||
|
||||
event.data.files.length == 0
|
||||
) { return; }
|
||||
event.data.title = event.data.title ?? document.title ?? new Date().getTime().toString();
|
||||
event.data.title = event.data.title.replaceAll('"', "").replaceAll("'", "").replaceAll(" ", "");
|
||||
let data = {
|
||||
Message: event.data.action,
|
||||
action: event.data.use,
|
||||
files: event.data.files,
|
||||
url: event.data.href ?? event.source.location.href,
|
||||
};
|
||||
data = { ...event.data, ...data };
|
||||
chrome.runtime.sendMessage(data);
|
||||
}
|
||||
if (event.data.action == "catCatchFFmpegResult") {
|
||||
if (!event.data.state || !event.data.tabId) { return; }
|
||||
chrome.runtime.sendMessage({ Message: "catCatchFFmpegResult", ...event.data });
|
||||
}
|
||||
if (event.data.action == "catCatchToBackground") {
|
||||
delete event.data.action;
|
||||
chrome.runtime.sendMessage(event.data);
|
||||
}
|
||||
if (event.data.action == "catCatchDashDRMMedia") {
|
||||
// TODO DRM Media
|
||||
console.log("DRM Media", event);
|
||||
}
|
||||
}, false);
|
||||
|
||||
function ArrayToBase64(data) {
|
||||
try {
|
||||
let bytes = new Uint8Array(data);
|
||||
let binary = "";
|
||||
for (let i = 0; i < bytes.byteLength; i++) {
|
||||
binary += String.fromCharCode(bytes[i]);
|
||||
}
|
||||
if (typeof _btoa == "function") {
|
||||
return _btoa(binary);
|
||||
}
|
||||
return btoa(binary);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user