UNPKG

dysrt

Version:

剪映导出字幕转srt

97 lines (79 loc) 2.35 kB
#!/usr/bin/env node const path = require('path') const fs = require('fs-extra') const walk = require('klaw') const commander = require('commander') const inquirer = require('inquirer') const signale = require('signale') const Srt = require('./srt') const { version } = require('../package.json') const interactive = new signale.Signale({ interactive: true }) commander.version(version). on('--help', () => { console.log() console.log('Examples:') console.log(' $ dysrt ./template.json') console.log(' $ dysrt /**/ ') }). parse(process.argv) if (process.argv.length < 3) { console.log('请指定字幕文件或工程目录') process.exit(1) } let filePath = process.argv[2] if (fs.lstatSync(filePath).isFile()) { convertJson2Srt(filePath) }else if (fs.lstatSync(filePath).isDirectory()){ convertJson2Srt(filePath+'/template.json') } function convertJson2Srt (file) { // let originData = JSON.parse(fs.readFileSync(file)) let originData = fs.readJSONSync(file) let textTracks = (originData.tracks).filter(v => { return v.subType == 'sub_sticker_text' && v.type == 'sticker' }) textTracks = textTracks.flatMap(x => { return x.segments }) // textTracks=textTracks.map(v=>v.segments).flat(2) textTracks.sort((a, b) => { return a.target_timerange.start - b.target_timerange.start }) let data = '' function formatTime (time) { if (time > -1) { var hour = Math.floor(time / 3600) var min = Math.floor(time / 60) % 60 var sec = (time % 60).toFixed(3) if (hour < 10) { time = '0' + hour + ':' } else { time = hour + ':' } if (min < 10) { time += '0' } time += min + ':' if (sec < 10) { time += '0' } time += ('' + sec).replace('.', ',') } return time } textTracks.forEach((e, i) => { //生成字幕文件内容 data += (i) + '\n' + formatTime(e.target_timerange.start / 1000) + ' --> ' + formatTime( (e.target_timerange.start + e.target_timerange.duration) / 1000) + '\n' + (originData.materials.texts.find(x => x.id == e.material_id).content) + '\n\n' }) let resfile =('./dysrt-'+Date.now()+'.srt') fs.writeFile(resfile, data, (err) => { if (err) throw err console.log('字幕已被保存') }) }