Files
cat-catch/js/media-control.js
ChuXun 53f9554f38 1
2025-10-19 20:55:27 +08:00

204 lines
8.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function () {
let _tabId = -1; // 选择的页面ID
let _index = -1; //选择的视频索引
let VideoTagTimer; // 获取所有视频标签的定时器
let VideoStateTimer; // 获取所有视频信息的定时器
let compareTab = [];
let compareVideo = [];
function setVideoTagTimer() {
clearInterval(VideoTagTimer);
VideoTagTimer = setInterval(getVideoTag, 1000);
}
function getVideoTag() {
chrome.tabs.query({ windowType: "normal" }, function (tabs) {
let videoTabList = [];
for (let tab of tabs) {
videoTabList.push(tab.id);
}
if (compareTab.toString() == videoTabList.toString()) {
return;
}
compareTab = videoTabList;
// 列出所有标签
for (let tab of tabs) {
if ($("#option" + tab.id).length == 1) { continue; }
$("#videoTabIndex").append(`<option value='${tab.id}' id="option${tab.id}">${stringModify(tab.title)}</option>`);
}
// 删除没有媒体的标签. 异步的原因使用一个for去处理无法保证标签顺序一致
for (let tab of videoTabList) {
chrome.tabs.sendMessage(tab, { Message: "getVideoState", index: 0 }, { frameId: 0 }, function (state) {
if (chrome.runtime.lastError || state.count == 0) {
$("#option" + tab).remove();
return;
}
$("#videoTabTips").remove();
if (tab == G.tabId && _tabId == -1) {
_tabId = tab;
$("#videoTabIndex").val(tab);
}
});
}
});
}
function setVideoStateTimer() {
clearInterval(VideoStateTimer);
VideoStateTimer = setInterval(getVideoState, 500);
}
function getVideoState(setSpeed = false) {
if (_tabId == -1) {
let currentTabId = $("#videoTabIndex").val();
if (currentTabId == -1) { return; }
_tabId = parseInt(currentTabId);
}
chrome.tabs.sendMessage(_tabId, { Message: "getVideoState", index: _index }, { frameId: 0 }, function (state) {
if (chrome.runtime.lastError || state.count == 0) { return; }
if (state.type == "audio") {
$("#pip").hide();
$("#screenshot").hide();
}
$("#volume").val(state.volume);
if (state.duration && state.duration != Infinity) {
$("#timeShow").html(secToTime(state.currentTime) + " / " + secToTime(state.duration));
$("#time").val(state.time);
}
state.paused ? $("#control").html(i18n.play).data("switch", "play") : $("#control").html(i18n.pause).data("switch", "pause");
state.speed == 1 ? $("#speed").html(i18n.speedPlayback).data("switch", "speed") : $("#speed").html(i18n.normalPlay).data("switch", "normal");
$("#loop").prop("checked", state.loop);
$("#muted").prop("checked", state.muted);
if (setSpeed && state.speed != 1) {
$("#playbackRate").val(state.speed);
}
if (compareVideo.toString() != state.src.toString()) {
compareVideo = state.src;
$("#videoIndex").empty();
for (let i = 0; i < state.count; i++) {
let src = state.src[i].split("/").pop();
if (src.length >= 60) {
src = src.substr(0, 35) + '...' + src.substr(-35);
}
$("#videoIndex").append(`<option value='${i}'>${src}</option>`);
}
}
_index = _index == -1 ? 0 : _index;
$("#videoIndex").val(_index);
});
}
// 点击其他设置标签页 开始读取tab信息以及视频信息
getVideoTag();
$("#otherTab").click(function () {
chrome.tabs.get(G.mediaControl.tabid, function (tab) {
if (chrome.runtime.lastError) {
_tabId = -1;
_index = -1;
setVideoTagTimer(); getVideoState(); setVideoStateTimer();
return;
}
chrome.tabs.sendMessage(G.mediaControl.tabid, { Message: "getVideoState", index: 0 }, function (state) {
_tabId = G.mediaControl.tabid;
if (state.count > G.mediaControl.index) {
_index = G.mediaControl.index;
}
$("#videoTabIndex").val(_tabId);
setVideoTagTimer(); getVideoState(true); setVideoStateTimer();
(chrome.storage.session ?? chrome.storage.local).set({ mediaControl: { tabid: _tabId, index: _index } });
});
});
// setVideoTagTimer(); getVideoState(); setVideoStateTimer();
});
// 切换标签选择 切换视频选择
$("#videoIndex, #videoTabIndex").change(function () {
if (!G.isFirefox) { $("#pip").show(); }
$("#screenshot").show();
if (this.id == "videoTabIndex") {
_tabId = parseInt($("#videoTabIndex").val());
} else {
_index = parseInt($("#videoIndex").val());
}
(chrome.storage.session ?? chrome.storage.local).set({ mediaControl: { tabid: _tabId, index: _index } });
getVideoState(true);
});
let wheelPlaybackRateTimeout;
$("#playbackRate").on("wheel", function (event) {
$(this).blur();
let speed = parseFloat($(this).val());
speed = event.originalEvent.wheelDelta < 0 ? speed - 0.1 : speed + 0.1;
speed = parseFloat(speed.toFixed(1));
if (speed < 0.1 || speed > 16) { return false; }
$(this).val(speed);
clearTimeout(wheelPlaybackRateTimeout);
wheelPlaybackRateTimeout = setTimeout(() => {
chrome.storage.sync.set({ playbackRate: speed });
chrome.tabs.sendMessage(_tabId, { Message: "speed", speed: speed, index: _index });
}, 200);
return false;
});
// 倍速播放
$("#speed").click(function () {
if (_index < 0 || _tabId < 0) { return; }
if ($(this).data("switch") == "speed") {
const speed = parseFloat($("#playbackRate").val());
chrome.tabs.sendMessage(_tabId, { Message: "speed", speed: speed, index: _index });
chrome.storage.sync.set({ playbackRate: speed });
return;
}
chrome.tabs.sendMessage(_tabId, { Message: "speed", speed: 1, index: _index });
});
// 画中画
$("#pip").click(function () {
if (_index < 0 || _tabId < 0) { return; }
chrome.tabs.sendMessage(_tabId, { Message: "pip", index: _index }, function (state) {
if (chrome.runtime.lastError) { return; }
state.state ? $("#pip").html(i18n.exit) : $("#pip").html(i18n.pictureInPicture);
});
});
// 全屏
$("#fullScreen").click(function () {
if (_index < 0 || _tabId < 0) { return; }
chrome.tabs.get(_tabId, function (tab) {
chrome.tabs.highlight({ 'tabs': tab.index }, function () {
chrome.tabs.sendMessage(_tabId, { Message: "fullScreen", index: _index }, function (state) {
close();
});
});
});
});
// 暂停 播放
$("#control").click(function () {
if (_index < 0 || _tabId < 0) { return; }
const action = $(this).data("switch");
chrome.tabs.sendMessage(_tabId, { Message: action, index: _index });
});
// 循环 静音
$("#loop, #muted").click(function () {
if (_index < 0 || _tabId < 0) { return; }
const action = $(this).prop("checked");
chrome.tabs.sendMessage(_tabId, { Message: this.id, action: action, index: _index });
});
// 调节音量和视频进度时 停止循环任务
$("#volume, #time").mousedown(function () {
if (_index < 0 || _tabId < 0) { return; }
clearInterval(VideoStateTimer);
});
// 调节音量
$("#volume").mouseup(function () {
if (_index < 0 || _tabId < 0) { return; }
chrome.tabs.sendMessage(_tabId, { Message: "setVolume", volume: $(this).val(), index: _index }, function () {
if (chrome.runtime.lastError) { return; }
setVideoStateTimer();
});
});
// 调节视频进度
$("#time").mouseup(function () {
if (_index < 0 || _tabId < 0) { return; }
chrome.tabs.sendMessage(_tabId, { Message: "setTime", time: $(this).val(), index: _index }, function () {
if (chrome.runtime.lastError) { return; }
setVideoStateTimer();
});
});
// 视频截图
$("#screenshot").click(function () {
if (_index < 0 || _tabId < 0) { return; }
chrome.tabs.sendMessage(_tabId, { Message: "screenshot", index: _index });
});
})();