• 【Copy攻城狮日志】Node快速重命名文件,告别Potplay字幕困扰问题



    ↑开局一张图,故事全靠编↑

    前言

    Copy攻城狮日志的惯例,开局一张图,开始为您讲述一个鲜为人知的故事。故事的开头要从本大狮从盗版网站下载udemy课程的犯罪伊始说起,去年的某月某天,我真正接触到了“你的大学”udemy,本来想好好学学nodejs,结果发现Max的课199刀,因为恰好遇到没打折,然后一路google,结果到了某个bt网站找到了相应的种子。埋头一想,先开他个某雷会员下一波再说。别说,公司的网还是比较炸天的,17G的文件没多会就下载完毕了,用老司机工具PotPlay把玩一下,结果全都是英文字幕。然后“从入门到放弃”,一放就是大几个月……

    My English is poor


    当专业的您看到这个标题的时候,您就能猜到我的“英国历史”水平,对的,另一段鲜为人知的故事是我的确没有拿到四级证书,这不得不提到我荒废的大学时代,现在依旧为过去的不努力而偿债。大学一开始我有想过好好学英语的,可能因为英语老师深深地吸引了我,甚至还加了wx,后来就不了了之了,哪怕是一句“hi”都不曾发过火。再后来就是每年都考四级,每年都挂,除了宿舍那考研的哥们在女友的“威逼利诱”之下在最后一学期终于顺利通过并考研成功。而我,和English却越走越远,直到工作中不得不去认识记忆那些乏味的API名字、专有名词……说回来udemy,个人感觉上面的课还是比较给力的,看过一些入门课,里面的讲师个个都是人才,说话又好听,带来的知识理念都比较新。所以我对下载的这个学习资料还是比较满意的,除了英文字幕看不太懂直到慢慢放弃。

    PotPlay字幕及翻译


    Potplay是一款老司机软件,这里就不多表。16年的时候第一次使用就被深深的迷住了,不仅可以正规学习还可以特殊学习,一度导致营养更不上。后来装了左边的18年版本或就再也没有更新过,直到最近才知道新版加了字幕在线翻译功能。通过学习一些博文,似乎掌握了怎么看懂片中的情节--实时翻译字幕。凑巧的是下载的学习资料刚好有外挂字幕,符合字幕在线翻译的基本要求,不带字幕的视频+外挂字幕+在线翻译这样的结构是比较符合字幕在线翻译的。操作也十分简单,我这里用的“被泼冷水的”某度AI,先试用的标准版,目前使用体验尚佳。发达的大佬可以去撸个google云300刀的券直接对接google翻译。具体翻译接入可以直接上手把玩探索.


    百度翻译接入可参考:PotPlayer_Subtitle_Translate_Baidu
    翻译API配置(估计先要注册对应平台账号并开通服务):

    *-en.srt翻车

    其实一直有个问题在困扰我,同样的文件,旧版播放能正常显示字幕,新版的就无法正常显示字幕。通过细致的对比,发现旧版播放器能正常读取*-en.srt字幕文件,而新版播放器不能且认为是另外视频文件的字幕,当我把字幕文件文件名中的-en去掉之后发现新版播放器也能正常显示字幕并且还自动翻译了。


    至于是不是bug,我也没打算去深究。问题很明确,因为字幕文件名和视频文件名不匹配,导致播放器无法自动识别。解决问题的其中一个途径是复制并重命名所有的字幕文件,将文件名中最后的“-en”替换为空字符。既然问题和解决方法都有了,那么是时候表演真正的Copy技术了……

    Node批量处理文件名

    对面的大佬“人生苦短,他用Python”,而我“万寿无疆,我用NodeJS”。直接Copy代码:

    const fs = require("fs");
    const path = require("path");
    const util = require("util");
    const readdir = util.promisify(fs.readdir);
    const stat = util.promisify(fs.stat);
    const timeStart = new Date();
    const filePath = path.resolve("./");
    
    function readDirRecur(file, callback) {
      return readdir(file).then((files) => {
        files = files.map((item) => {
          let fullPath = file + "/" + item;
          return stat(fullPath).then((stats) => {
            if (stats.isDirectory()) {
              return readDirRecur(fullPath, callback);
            } else {
              /*not use ignore files*/
              if (item[0] == ".") {
                //console.log(item + ' is a hide file.');
              } else {
                callback && callback(fullPath);
              }
            }
          });
        });
        return Promise.all(files);
      });
    }
    
    readDirRecur(filePath, function (filePath) {
      // 只处理.srt文件 将-en.srt处理为.srt
      if (path.extname(filePath) === ".srt") {
        let newPath = filePath.replace(/(.*)-en/, "$1");
        if (fs.existsSync(newPath)) {
          console.log("该路径已存在");
          // fs.unlinkSync(newPath)
        } else {
          fs.copyFileSync(filePath, newPath);
        }
      }
    })
      .then(function () {
        console.log("done", new Date() - timeStart); //done 3.3
      })
      .catch(function (err) {
        console.log(err);
      });

    处理结果(还算比较理想):

     


    随机打开一个视频都能正常显示双语字幕了:

    结语

    原来只花了几分钟实现了这么一个批量处理字幕文件并显示双语字幕,结果花了一上午来写这篇水文,可见那些高产的大佬花了多少的时间和心血,向你们致敬!最后,请问有大佬收徒吗?我是会关门的那种!

  • 相关阅读:
    Arduino nano的bootloader文件烧录
    arduino通信问题的学习与解决
    arduino中的serial .available()和serial.read()
    arduino 通过串口接收string,int类型数据
    Arduino读取串口数据并进行字符串分割
    Arduino 的读串口与写串口
    代理模式
    策略模式
    python中的深拷贝
    Python中的三个特殊函数
  • 原文地址:https://www.cnblogs.com/hu-qi/p/nodejs-change-filename.html
Copyright © 2020-2023  润新知