【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);
});
处理结果(还算比较理想):
随机打开一个视频都能正常显示双语字幕了:
结语
原来只花了几分钟实现了这么一个批量处理字幕文件并显示双语字幕,结果花了一上午来写这篇水文,可见那些高产的大佬花了多少的时间和心血,向你们致敬!最后,请问有大佬收徒吗?我是会关门的那种!
【Copy攻城狮日志】Node快速重命名文件,告别Potplay字幕困扰问题的更多相关文章
- 【Copy攻城狮日志】docker搭建jenkins拉取svn代码打包vue项目部署到nginx
↑开局一张图,故事全靠编↑ 前言 打开搜索引擎输入『Copy攻城狮』,发现最新的一条记录已经是去年的4月,意味着我又有一年时间没有再总结成长了.习惯了“温水煮青蛙”的日子,无论是经验水平还是薪资收入, ...
- Git——快速重命名文件和查看commit提交版本【四】
快速重命名文件 $ git mv README.md readme.md 使用git mv命令后直接commit即可,不再需要进行add或rm操作 查看版本历史 所有的参数都可以进行组合使用的,比如我 ...
- iOS程序猿如何快速掌握 PHP,化身"全栈攻城狮"?
这是一篇以 iOS 开发人员的视角写给广大iOS 程序猿的 PHP 入门指南.在这篇文章里我努力去发掘 objectiv-c 与 php 之间的共性,来帮助有一定 iOS 开发经验的攻城狮来快速上手一 ...
- Android优秀资源整理合集(论菜鸟到高级攻城狮)
转载请注明转自:http://blog.csdn.net/u011176685/article/details/51434702 csdn文章:Android优秀资源整理合集(论菜鸟到高级攻城狮) 时 ...
- Fiddler无所不能——之测试开发攻城狮必备利器
Fiddler无所不能——之测试开发攻城狮必备利器 1.模拟真实网络环境4g网.3g网络.2g网络.弱网.请求超时 开启弱网Rules——Performance——勾选Simulate Modem S ...
- JBPM4之decision节点:3、程序猿|菜鸟|攻城狮|牛人
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...
- 攻城狮送女友的CSS3生日蛋糕
在线预览:http://keleyi.com/keleyi/phtml/html5/29.htm 代码如下: <!DOCTYPE html> <html> <head&g ...
- 遗留系统:IT攻城狮永远的痛
我常常觉得我们非常幸运,我们现在所处的时代是一个令人振奋的时代,我们进入了软件工业时代.在这个时代里,我们进行软件开发已经不再是一个一个的小作坊,我们在进行着集团化的大规模开发.我们开发的软件不再是为 ...
- iOS攻城狮修炼之路
自己总结的学习iOS的笔记,打造一个全面的知识体系,iOS攻城狮修炼之路[持续更新中] iOS学习笔记01-APP相关 iOS学习笔记02-UIScrollView iOS学习笔记03-UITable ...
随机推荐
- #Week5 Regularization
一.The Problem of Overfitting 欠拟合(high bias):模型不能很好地适应训练集: 过拟合(high variance):模型过于强调拟合原始数据,测试时效果会比较差. ...
- HR问了一句DB是啥?SQL是啥?DB是Database数据库,SQL是数据库语言! 然后呢? 数据库从入门到精通--入门必看!
写在前面 本文的写作知识体系来源于我的数据库老师SDAU张承明,部分知识来自于网络,我呢对知识进行了细化和添加了自己的一些看法,并且加入了一些实例帮助理解,本文不是面向SQL高手写的,可以看作是数据库 ...
- 数学--数论--HDU 12151七夕节 Plus (因子和线性筛)
Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" ...
- 一个简单的wed服务器SHTTPD(7)———— SHTTPD内容类型的实现
//start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191 ...
- 写给Android 混淆小白的快速混淆方法
为啥子要混淆 简单来说,Android 进行ProGuard,可以起到压缩,混淆,预检,优化的功能,虽然不能说更安全但还是一个不容忽视的环节. 开始混淆第一步 首先在build.gradle 中将混淆 ...
- Redis集群搭建的三种方式
一.Redis主从 1.1 Redis主从原理 和MySQL需要主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生性能瓶颈,特别是在读压力上,为了分担压力,Redis支持主从复制. ...
- SSTI(服务器模板注入)学习
SSTI(服务器模板注入)学习 0x01 SSTI概念 SSTI看到ss两个字母就会想到服务器,常见的还有SSRF(服务器端请求伪造).SSTI就是服务器端模板注入(Server-Side Templ ...
- 学习Vue第四节,v-model和双向数据绑定
Vue指令之v-model和双向数据绑定 <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu ...
- java并发之线程安全问题
并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务. 而Java并发则由多线程实现的. 在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中.(当然这是比 ...
- 使用Proteus模拟操作HDG12864F-1液晶屏
在Proteus中模拟了89C52操作HDG12864F-1液晶屏,原理图如下: 一.HDG12864F-1官网信息 该液晶屏是Hantronix的产品,官网上搜索出这个型号是系列型号中的一种,各种型 ...