Greasy Fork

Greasy Fork is available in English.

南工在线转码助手

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

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

// ==UserScript==
// @name         南工在线转码助手
// @namespace    http://tampermonkey.net/
// @version      1.2
// @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;
          }
      `);
  
    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);
  
      // 添加拖动逻辑
      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);
      }
    }
  
    function init() {
      const floatingWindow = createFloatingWindow();
      document.body.appendChild(floatingWindow);
      updateDisplay();
      setInterval(updateDisplay, 5000);
    }
  
    if (document.readyState === "loading") {
      document.addEventListener("DOMContentLoaded", init);
    } else {
      init();
    }
  })();