Greasy Fork

Greasy Fork is available in English.

南工在线转码助手

Display cookies, video ID, and manage transcoding queue from online.njtech.edu.cn

当前为 2024-12-21 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         南工在线转码助手
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Display cookies, video ID, and manage transcoding queue from online.njtech.edu.cn
// @author       千纸鹤也要飞啊
// @match        *://online.njtech.edu.cn/video/*
// @grant        GM_addStyle
// ==/UserScript==

(function () {
  "use strict";

  GM_addStyle(`
        #cookie-display {
            position: fixed;
            top: 20px;
            right: 20px;
            padding: 10px;
            border: 3px solid #ccc;
            border-radius: 10px;
            background-color: var(--global-background);
            box-shadow: 0 2px 5px rgba(0,0,0,0.2);
            z-index: 9999;
            font-size: 12px;
            max-width: 300px;
            word-break: break-all;
            cursor: grab; /* 添加抓取光标 */
        }
        #cookie-display.dragging {
            cursor: grabbing; /* 添加拖动光标 */
        }
        #cookie-display-header {
            display: flex;
            justify-content: space-between;
            margin-bottom: 5px;
        }
        #cookie-display-content {
            margin-top: 5px;
            text-size:16px;
        }
        .close-button {
            cursor: pointer;
            padding: 0 5px;
        }
        .queue-button, .show-queue-button, .start-transcoding-button {
            padding: 5px 8px;
            background-color: #4CAF50;
            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;
        }
        .start-transcoding-button:hover {
            background-color: #FFC107;
        }
        .danger-button {
            padding: 10px;
            background-color: red;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 14px;
            margin-top: 10px;
            width: calc(100%);
        }
        .danger-button:hover {
            background-color: darkred;
        }
    `);

  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);

    const dangerButton = document.createElement("button");
    dangerButton.textContent = "一键转码所有未转码的视频(危险)";
    dangerButton.className = "danger-button";
    dangerButton.onclick = startTranscodingAll;

    header.appendChild(title);
    header.appendChild(closeButton);
    div.appendChild(header);
    div.appendChild(content);
    div.appendChild(buttonContainer);
    div.appendChild(dangerButton);

    // 添加拖动逻辑
    let isDragging = false;
    let offsetX = 0;
    let offsetY = 0;

    header.onmousedown = function (e) {
      isDragging = true;
      div.classList.add("dragging");
      offsetX = e.clientX - div.offsetLeft;
      offsetY = e.clientY - div.offsetTop;
    };

    document.onmousemove = function (e) {
      if (isDragging) {
        div.style.left = `${e.clientX - offsetX}px`;
        div.style.top = `${e.clientY - offsetY}px`;
      }
    };

    document.onmouseup = function () {
      if (isDragging) {
        isDragging = false;
        div.classList.remove("dragging");
      }
    };

    return div;
  }

  function getCookie(name) {
    const match = document.cookie.match(
      new RegExp("(^| )" + name + "=([^;]+)")
    );
    return match ? match[2] : null;
  }

  function getVideoID() {
    const urlParams = new URLSearchParams(window.location.search);
    return urlParams.get("id") || "未找到";
  }

  function updateDisplay() {
    const content = document.getElementById("cookie-display-content");
    const onlineToken = getCookie("online_token") || "未找到";
    const csrfToken = getCookie("csrfToken") || "未找到";
    const videoID = getVideoID();

    content.innerHTML = `
            <strong>online_token:</strong> ${onlineToken}<br>
            <strong>csrfToken:</strong> ${csrfToken}<br>
            <strong>视频ID:</strong> ${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 {
        dialogContent.innerHTML = "待转码队列:";
        queueItems.forEach((item, index) => {
          dialogContent.innerHTML += `${index + 1}. ${item}<br>`;
        });
      }

      alert(dialogContent.innerHTML);
    } 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);
    }
  }

  async function startTranscodingAll() {
    alert("开始转码所有未转码的视频,操作危险!");

    const url = 'https://online.njtech.edu.cn/api/v2/automation/media_transcoder/COMPOSCAN_TRANSCODING';
    const options = {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Accept: 'application/problem+json',
        Authorization: 'Bearer ' + getCookie("online_token")
      },
      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);
    updateDisplay();
    setInterval(updateDisplay, 5000);
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", init);
  } else {
    init();
  }
})();