From cac08500b0e21aa8a96f89abb919a4351b6ac9eb Mon Sep 17 00:00:00 2001 From: 1c7 Date: Fri, 8 Jun 2018 03:39:03 +0800 Subject: [PATCH] code for extract info from ass --- .DS_Store | Bin 8196 -> 10244 bytes .gitignore | 2 + extract_from_ass_subtitle/.DS_Store | Bin 0 -> 6148 bytes extract_from_ass_subtitle/2. extract_head.js | 97 ++++++++++++++++++ .../3. extract_ass_to_txt.js | 65 ++++++++++++ extract_from_ass_subtitle/common.js | 25 +++++ extract_from_ass_subtitle/package.json | 14 +++ 7 files changed, 203 insertions(+) create mode 100644 .gitignore create mode 100644 extract_from_ass_subtitle/.DS_Store create mode 100644 extract_from_ass_subtitle/2. extract_head.js create mode 100644 extract_from_ass_subtitle/3. extract_ass_to_txt.js create mode 100644 extract_from_ass_subtitle/common.js create mode 100644 extract_from_ass_subtitle/package.json diff --git a/.DS_Store b/.DS_Store index de4edc71ad45801b7ee4926de330242c442b458c..784cf34813faf0719d15b9a39a7b6e1d2e77f4dc 100644 GIT binary patch delta 445 zcmZp1XbF&DU|?W$DortDU{C-uIe-{M3-C-V6q~50$SANeU^hRbz+@f)?RrUuRE7$M z5{4p%M22J_9nX*kWal&F0$GU+#XuMj#H9>LK)FmH&S6MRDNfEw%FoYX1e!^P_MCLX z;N<+=0-$aNhI%kbjxo9UE-ophCCLm7*X_+kE`j_^hGRT(^HZo`OhLxvT0xo3P69{S yH#V$f6J&;XOMx3myMjV~W8rt^$^0^bB219@&;Tg_2A~0mo?IZ)yLpu`Gcy3PF_(atbAo@eUj5HWUU02tg5!~g&Q diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adda1b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +extract_from_ass_subtitle/node_modules +extract_from_ass_subtitle/package-lock.json diff --git a/extract_from_ass_subtitle/.DS_Store b/extract_from_ass_subtitle/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 { + for (var i = 1; i <= 40; i++) { // 40*40(files)=1600 loop, I know.. I know.. not the most ‘efficient’ code, but it's good enough + files.forEach(file => { // file == 1. 计算机早期历史-Early Computing.ass + var number = file.split('.')[0] // number == 1 + var ext = path.extname(file); // ext == ass + if (parseInt(number) === i && ext === '.ass'){ + extract_main_point(file, number); + } + }); + } + }) +} + +// 抽取重点出来,那两行字幕的样式在全部40集中都是统一的,叫'备注 - 主题'和'这一集的名字' +function extract_main_point(file, number){ + var text = fs.readFileSync(file,'utf8') + data = assParser(text); + body = data[3]['body']; + + for (var i = 0; i <= body.length-1; i++) { + var element = body[i]; + if (element.key == 'Dialogue') { + if (element.value.Style == '这一集的名字'){ + var text = element.value.Text; + text = common.remove_curly_brace_keep_text(text); + // console.log(text); + result = result + '## ' + text + '\n'; + } + } + } + + for (var i = 0; i <= body.length-1; i++) { + var element = body[i]; + if (element.key == 'Dialogue') { + if (element.value.Style == '备注 - 主题'){ + var text = element.value.Text; + text = common.remove_curly_brace_keep_text(text); + // console.log(text); + result = result + text.replace(/\\N/g, '\n') + '\n\n\n'; + } + } + } + + + // 如果到了最后一集 + if (number == 40){ + // 清理两边空格(trim),然后末尾加俩空格作为 markdown 换行 + var line_array = result.split('\n'); + line_array.forEach(l => { + final_result = final_result + l.trim() + ' ' + '\n'; + }) + // 处理 HTML entity + final_result = common.convertHTML(final_result); + // 写文件 + fs.writeFile("CS_40episode_point.md", final_result, function(err) { + if(err) { + return console.log(err); + } + console.log("The file was saved!"); + }); + } +} + +// ============= + +loop_current_folder_ass_file_in_order(); diff --git a/extract_from_ass_subtitle/3. extract_ass_to_txt.js b/extract_from_ass_subtitle/3. extract_ass_to_txt.js new file mode 100644 index 0000000..3e23f27 --- /dev/null +++ b/extract_from_ass_subtitle/3. extract_ass_to_txt.js @@ -0,0 +1,65 @@ +const assParser = require('ass-parser'); +const fs = require('fs'); +const common = require('./common.js'); +const path = require('path') + +var result = '' + +var folder = '/Users/remote_edit/Desktop/ass/' + +function loop_current_folder_ass_file_in_order(){ + fs.readdir(folder, (err, files) => { + for (var i = 1; i <= 40; i++) { // 40*40(files)=1600 loop, I know.. I know.. not the most ‘efficient’ code, but it's good enough + files.forEach(file => { // file == 1. 计算机早期历史-Early Computing.ass + var number = file.split('.')[0] // number == 1 + var ext = path.extname(file); // ext == ass + if (parseInt(number) === i && ext === '.ass'){ + extract_main_point(folder+file, number); + // console.log(file); + } + }); + } + }) +} + + +function extract_main_point(file, number){ + var text = fs.readFileSync(file,'utf8') + data = assParser(text); + body = data[3]['body']; + + for (var i = 0; i <= body.length-1; i++) { + var element = body[i]; + if (element.key == 'Dialogue') { + if (element.value.Style == 'en - 白色'){ + var text = element.value.Text; + text = common.remove_curly_brace_keep_text(text); + result = result + text.trim() + '\n'; + } + } + } + + for (var i = 0; i <= body.length-1; i++) { + var element = body[i]; + if (element.key == 'Dialogue') { + if (element.value.Style == 'zh - 黄色'){ + var text = element.value.Text; + text = common.remove_curly_brace_keep_text(text); + result = result + text.trim() + '\n'; + } + } + } + + // 写文件 + fs.writeFile(file+'.txt', result, function(err) { + if(err) { + return console.log(err); + } + console.log("The file was saved!"); + }); + result = ''; +} + +// ============= + +loop_current_folder_ass_file_in_order(); diff --git a/extract_from_ass_subtitle/common.js b/extract_from_ass_subtitle/common.js new file mode 100644 index 0000000..3b12f75 --- /dev/null +++ b/extract_from_ass_subtitle/common.js @@ -0,0 +1,25 @@ +// Remove all {} +// Input: "{\c&HCC9933&}Subtitles by {\c\c&HFFFFFF &}MemoryOnSmells{\c} {\c&HCC9933&}Exclusive for http://UKsubtitles.ru{\c}" +// Output: "Subtitles by MemoryOnSmells Exclusive for http://UKsubtitles.ru" +function remove_curly_brace_keep_text(str) { + return str.replace(/\s*\{.*?\}\s*/g, ' ').trim(); +} + +function convertHTML(str) { + var entityPairs = [ + {character: '&', html: '&'}, + {character: '<', html: '<'}, + {character: '>', html: '>'}, + {character: "'", html: '''}, + {character: '"', html: '"'}, + ]; + + entityPairs.forEach(function(pair){ + var reg = new RegExp(pair.character, 'g'); + str = str.replace(reg, pair.html); + }); + return str; +} + +exports.remove_curly_brace_keep_text = remove_curly_brace_keep_text +exports.convertHTML = convertHTML diff --git a/extract_from_ass_subtitle/package.json b/extract_from_ass_subtitle/package.json new file mode 100644 index 0000000..4760fed --- /dev/null +++ b/extract_from_ass_subtitle/package.json @@ -0,0 +1,14 @@ +{ + "name": "cc_nodejs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "ass-parser": "^0.2.0" + } +}