// ==UserScript==
// @name 南工在线转码助手
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Display cookies, video ID, and manage transcoding queue from online.njtech.edu.cn
// @author 千纸鹤也要飞啊
// @match *://online.njtech.edu.cn/video/*
// @grant GM_addStyle
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
// 添加悬浮窗样式
GM_addStyle(`
#cookie-display {
position: fixed;
top: 20px;
right: 20px;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
z-index: 9999;
font-size: 12px;
max-width: 300px;
word-break: break-all;
}
#cookie-display-header {
display: flex;
justify-content: space-between;
margin-bottom: 5px;
}
#cookie-display-content {
margin-top: 5px;
}
.close-button {
cursor: pointer;
padding: 0 5px;
}
.queue-button, .show-queue-button, .start-transcoding-button {
padding: 5px 8px;
background-color: #4CAF50; /* Green */
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
flex: 1; /* 让按钮平分宽度 */
margin: 0 5px; /* 按钮之间的间距 */
}
.queue-button:hover,
.show-queue-button:hover,
.start-transcoding-button:hover {
background-color: #45a049;
}
.start-transcoding-button {
background-color: #FFD700; /* Yellow */
}
.start-transcoding-button:hover {
background-color: #FFC107; /* Lighter Yellow */
}
`);
// 创建悬浮窗
function createFloatingWindow() {
const title = document.createElement('span');
title.textContent = '转码助手';
const closeButton = document.createElement('span');
closeButton.textContent = '×';
closeButton.className = 'close-button';
closeButton.onclick = () => div.style.display = 'none';
const div = document.createElement('div');
div.id = 'cookie-display';
const header = document.createElement('div');
header.id = 'cookie-display-header';
const content = document.createElement('div');
content.id = 'cookie-display-content';
const queueButton = document.createElement('button');
queueButton.textContent = '添加到转码队列';
queueButton.className = 'queue-button';
queueButton.onclick = addToTranscodeQueue;
const showQueueButton = document.createElement('button');
showQueueButton.textContent = '展示待转码队列';
showQueueButton.className = 'show-queue-button';
showQueueButton.onclick = showTranscodingQueue;
const startTranscodingButton = document.createElement('button');
startTranscodingButton.textContent = '开始转码队列';
startTranscodingButton.className = 'start-transcoding-button';
startTranscodingButton.onclick = startTranscodingQueue; // 触发转码队列的函数
// 使用容器实现按钮排列
const buttonContainer = document.createElement('div');
buttonContainer.style.display = 'flex';
buttonContainer.appendChild(queueButton);
buttonContainer.appendChild(showQueueButton);
buttonContainer.appendChild(startTranscodingButton); // 添加新按钮
header.appendChild(title);
header.appendChild(closeButton);
div.appendChild(header);
div.appendChild(content);
div.appendChild(buttonContainer); // 添加按钮容器
return div;
}
// 获取指定cookie值
function getCookie(name) {
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
return match ? match[2] : null;
}
// 获取视频ID
function getVideoID() {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get('id') || '未找到';
}
// 更新cookie和ID显示
function updateDisplay() {
const content = document.getElementById('cookie-display-content');
const onlineToken = getCookie('online_token') || '未找到';
const csrfToken = getCookie('csrfToken') || '未找到';
const videoID = getVideoID();
content.innerHTML = `
online_token: ${onlineToken}
csrfToken: ${csrfToken}
视频ID: ${videoID}
`;
}
// 添加到转码队列的功能
async function addToTranscodeQueue() {
const onlineToken = getCookie('online_token');
const videoID = getVideoID();
if (!onlineToken || videoID === '未找到') {
alert('未找到在线令牌或视频ID,请检查!');
return;
}
const url = 'https://online.njtech.edu.cn/api/v2/automation/media_transcoder/work_queue/items';
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/problem+json',
Authorization: `Bearer ${onlineToken}`
},
body: JSON.stringify({
episodes: [],
seasons: [],
videos: [videoID]
})
};
try {
const response = await fetch(url, options);
if (response.status === 204) {
alert('成功添加到转码队列!');
} else if (response.status === 500) {
alert('已在队列中!');
} else {
const errorData = await response.json();
console.error(errorData);
alert('添加到转码队列失败,查看控制台获取详细错误信息。');
}
} catch (error) {
console.error(error);
alert('发生错误,查看控制台获取详细错误信息。');
}
}
// 展示待转码队列的功能
async function showTranscodingQueue() {
const onlineToken = getCookie('online_token');
if (!onlineToken) {
alert('未找到在线令牌,请检查!');
return;
}
const url = 'https://online.njtech.edu.cn/api/v2/automation/media_transcoder/work_queue';
const options = {
method: 'GET',
headers: {
Accept: 'application/json, application/problem+json',
Authorization: `Bearer ${onlineToken}`
}
};
try {
const response = await fetch(url, options);
const data = await response.json();
// 提取字符串并展示
const queueItems = data.queue;
// 创建对话框
const dialogContent = document.createElement('div');
if (queueItems.length === 0) {
dialogContent.innerHTML = '待转码队列: 暂无待转码项。';
} else {1
dialogContent.innerHTML = '待转码队列:';
queueItems.forEach((item, index) => {
dialogContent.innerHTML += `${index + 1}. ${item},`; // 添加序号并换行
});
}
// 使用 alert 替代或者使用自定义的对话框
alert(dialogContent.innerHTML); // 此处使用 alert,若要使用自定义对话框,请自行创建并修改样式。
} catch (error) {
console.error(error);
alert('获取待转码队列失败,查看控制台获取详细错误信息。');
}
}
// 开始转码队列的功能
async function startTranscodingQueue() {
// 显示对话框提示用户转码已开始
alert("转码已开始");
const url = 'https://online.njtech.edu.cn/api/v2/automation/media_transcoder/transcoding';
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/problem+json',
Authorization: 'Bearer onlinetoken'
},
body: undefined
};
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}
// 主函数
function init() {
const floatingWindow = createFloatingWindow();
document.body.appendChild(floatingWindow);
// 初始更新cookie和ID显示
updateDisplay();
// 每5秒更新一次cookie和ID显示
setInterval(updateDisplay, 5000);
}
// 当页面加载完成后初始化
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();