@@ -22,6 +22,7 @@ import Helvetica from "pdfkit/js/data/Helvetica.afm"
2222import PDFDocument from "pdfkit"
2323import child_process from "child_process"
2424import mkvExtractor from "mkv-subtitle-extractor"
25+ import srt2vtt from "srt-to-vtt"
2526
2627import util from "util"
2728
@@ -45,6 +46,26 @@ const queue: Array<{started: boolean, info: any}> = []
4546if ( ! fs . existsSync ( path . join ( __dirname , "data" ) ) ) fs . mkdirSync ( path . join ( __dirname , "data" ) )
4647fs . writeFileSync ( path . join ( __dirname , "data/Helvetica.afm" ) , Helvetica )
4748
49+ const srtToVtt = async ( subtitles : string [ ] ) => {
50+ for ( let i = 0 ; i < subtitles . length ; i ++ ) {
51+ await new Promise < void > ( ( resolve , reject ) => {
52+ const readStream = fs . createReadStream ( subtitles [ i ] ) . pipe ( srt2vtt ( ) )
53+ const writeStream = fs . createWriteStream ( `${ path . dirname ( subtitles [ i ] ) } /${ path . basename ( subtitles [ i ] , path . extname ( subtitles [ i ] ) ) } .vtt` )
54+ readStream . pipe ( writeStream )
55+ . on ( "end" , ( ) => resolve ( ) )
56+ . on ( "finish" , ( ) => resolve ( ) )
57+ } )
58+ }
59+
60+ const promiseArray : any [ ] = [ ]
61+ for ( let i = 0 ; i < subtitles . length ; i ++ ) {
62+ promiseArray . push ( new Promise < void > ( ( resolve ) => {
63+ fs . unlink ( subtitles [ i ] , ( ) => resolve ( ) )
64+ } ) )
65+ }
66+ await Promise . all ( promiseArray )
67+ }
68+
4869const extractSubtitles = async ( videos : string [ ] ) => {
4970 for ( let i = 0 ; i < videos . length ; i ++ ) {
5071 await mkvExtractor ( videos [ i ] )
@@ -63,14 +84,24 @@ const extractSubtitles = async (videos: string[]) => {
6384ipcMain . handle ( "extract-subtitles" , async ( event , files : string [ ] ) => {
6485 const directories = files . filter ( ( f ) => fs . lstatSync ( f ) . isDirectory ( ) )
6586 const videos = files . filter ( ( f ) => path . extname ( f ) . toLowerCase ( ) === ".mkv" )
87+ const subtitles = files . filter ( ( f ) => path . extname ( f ) . toLowerCase ( ) === ".srt" )
6688
6789 let openDir = ""
6890
6991 for ( let i = 0 ; i < directories . length ; i ++ ) {
7092 const dir = directories [ i ]
71- let videos = fs . readdirSync ( dir ) . map ( ( i ) => path . join ( dir , i ) )
72- videos = videos . filter ( ( f ) => path . extname ( f ) . toLowerCase ( ) === ".mkv" )
73- await extractSubtitles ( videos )
93+ let files = fs . readdirSync ( dir ) . map ( ( i ) => path . join ( dir , i ) )
94+ let videos = files . filter ( ( f ) => path . extname ( f ) . toLowerCase ( ) === ".mkv" )
95+ let subs = files . filter ( ( f ) => path . extname ( f ) . toLowerCase ( ) === ".srt" )
96+ if ( videos . length ) {
97+ await extractSubtitles ( videos )
98+ let files = fs . readdirSync ( dir ) . map ( ( i ) => path . join ( dir , i ) )
99+ let subs = files . filter ( ( f ) => path . extname ( f ) . toLowerCase ( ) === ".srt" )
100+ await srtToVtt ( subs )
101+ }
102+ if ( subs . length ) {
103+ await srtToVtt ( subs )
104+ }
74105 try {
75106 fs . rmdirSync ( dir )
76107 } catch ( e ) {
@@ -81,8 +112,16 @@ ipcMain.handle("extract-subtitles", async (event, files: string[]) => {
81112
82113 if ( videos . length ) {
83114 await extractSubtitles ( videos )
115+ let subs = fs . readdirSync ( path . dirname ( videos [ 0 ] ) ) . map ( ( i ) => path . join ( path . dirname ( videos [ 0 ] ) , i ) )
116+ subs = subs . filter ( ( f ) => path . extname ( f ) . toLowerCase ( ) === ".srt" )
117+ await srtToVtt ( subs )
84118 if ( ! openDir ) openDir = videos [ 0 ]
85119 }
120+
121+ if ( subtitles . length ) {
122+ await srtToVtt ( subtitles )
123+ if ( ! openDir ) openDir = subtitles [ 0 ]
124+ }
86125 shell . openPath ( path . dirname ( openDir ) )
87126} )
88127
0 commit comments