乐趣区

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

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


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

结语

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

退出移动版