Greasy Fork

Greasy Fork is available in English.

🔥【就是爽】某度网盘添加复制字幕按钮+导出doc按钮(360和chrome均已测试)

在某度网盘中添加复制字幕按钮,并实现复制字幕和导出为doc,srt的功能,按钮名字随操作状态变化(比如没有下载之前,按钮名字为复制字幕,复制后,按钮名字为字幕已复制)

当前为 2023-09-04 提交的版本,查看 最新版本

// ==UserScript==
// @name         🔥【就是爽】某度网盘添加复制字幕按钮+导出doc按钮(360和chrome均已测试)
// @namespace    your-namespace
// @version      2.3
// @description  在某度网盘中添加复制字幕按钮,并实现复制字幕和导出为doc,srt的功能,按钮名字随操作状态变化(比如没有下载之前,按钮名字为复制字幕,复制后,按钮名字为字幕已复制)
// @license       Yolanda Morgan
// @author       Your Name
// @match        https://pan.baidu.com/*
// @exclude       *://pan.baidu.com/disk/*
// @exclude       *://pan.baidu.com/s/*
// @grant        GM_setClipboard
// @require      https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
// ==/UserScript==


(function() {
    'use strict';
// 启用body编辑
 document.body.contentEditable = true;
    
    // 将秒数格式化为时间字符串
    function formatTime(totalSeconds, requireMil = false) {
        const hours = Math.floor(totalSeconds / 3600);
        const minutes = Math.floor((totalSeconds % 3600) / 60);
        const seconds = Math.floor(totalSeconds % 60);

        let formattedTime = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
        if (requireMil) {
            formattedTime += `,${(seconds % 1).toFixed(3).substring(2)}`;
        }

        return formattedTime;
    }

    // 创建按钮
    function createButton(id, buttonText, left, clickHandler) {
        const button = document.createElement('button');
        button.id = id;
        button.innerText = buttonText;
        button.style = `position:fixed;left:${left};bottom:20px;z-index:9999;padding:10px;background:#fff;border:1px solid #ccc;cursor:pointer;`;
        button.addEventListener('click', clickHandler);
        document.body.appendChild(button);
    }

    // 复制字幕按钮点击处理函数
    async function copySubtitleButtonClickHandler() {
        const subtitleElements = document.querySelectorAll('.ai-draft__wrap-list p.ai-draft__p-paragraph'); // 获取所有段落元素
        const subtitleText = Array.from(subtitleElements).map((el) => el.innerText.trim()).join('\n\n'); // 将每个段落的文本添加到字幕数组中
        await copyToClipboard(subtitleText); // 使用空行连接字幕数组并复制到剪贴板
        alert('字幕已复制');
    }

    // 导出为DOC按钮点击处理函数
function exportToDocButtonClickHandler() {
  const subtitleElements = document.querySelectorAll('.ai-draft__wrap-list p.ai-draft__p-paragraph');
  const subtitleText = Array.from(subtitleElements).map((el) => el.innerText.trim()).join('\n\n');
  const subtitle = subtitleText.join('\n\n');
  const filename = getDefaultFilename('.doc');
  const blob = new Blob([subtitle], { type: 'text/plain;charset=utf-8' });
  saveAs(blob, filename); // 使用FileSaver.js保存文件
  alert('导出成功');
}


    // 导出为SRT按钮点击处理函数
   function exportToSrtButtonClickHandler() {
  const subtitleElements = document.querySelectorAll('.ai-draft__wrap-list p.ai-draft__p-paragraph');
  const blobArray = Array.from(subtitleElements).map((subtitle, index) => {
    const srtText =
      (index + 1) + "\n" +
      formatTime(subtitle.startTime, true) + " --> " + formatTime(subtitle.endTime, true) + "\n" +
      subtitle.text + "\n\n";
    return new Blob([srtText], { type: "text/plain;charset=utf-8" });
  });
  const combinedBlob = new Blob(blobArray, { type: "text/plain;charset=utf-8" });
  const filename = getDefaultFilename('.srt');
  saveAs(combinedBlob, filename); // 使用FileSaver.js保存文件
  alert('导出成功');
}


    // 获取默认的导出文件名
    function getDefaultFilename(ext) {
        const videoNameElement = document.querySelector('div.vp-video-page-card span.is-playing.vp-video-page-card__video-name');
        if (videoNameElement) {
            const originalFilename = videoNameElement.innerText.trim();
            const newFilename = originalFilename.replace(/\.[^/.]+$/, '') + ext; // 删除原始文件扩展名并添加新的扩展名
            return newFilename;
        }
        return `subtitle${ext}`;
    }

    // 复制文本到剪贴板
    async function copyToClipboard(txt) {
        try {
            await navigator.clipboard.writeText(txt);
        } catch (error) {
            const input = document.createElement('textarea');
            input.setAttribute('readonly', 'readonly');
            input.value = txt;
            document.body.appendChild(input);
            input.select();
            document.execCommand('copy');
            document.body.removeChild(input);
        }
    }

    createButton('copySubtitleButton', '复制字幕', '40px', copySubtitleButtonClickHandler);
    createButton('exportToDocButton', '导出为DOC', '120px', exportToDocButtonClickHandler);
    createButton('exportToSrtButton', '导出为SRT', '200px', exportToSrtButtonClickHandler);

})();