본문 바로가기
코딩

[Node.js] Srt 자막파일을 JSON 으로 파싱하고 수정하기 1편

by KRonae 2022. 12. 7.
반응형

안녕하세요 크로네입니다.

 

오늘은 NodeJS 에서 srt(자막파일) 을 JSON 으로 파싱하고,

수정하고, 다시 저장하는 방법에 대해 알아보겠습니다.

 

1. 모듈

일단 NPM 에 들어가서 필요한 모듈을 검색해 봅시다.

https://www.npmjs.com/

저는 srt-parser 라고 검색했는데요,

기능이 마음에 안들어서 그냥 제가 직접 만들었습니다.

 

srt-parse-to 를 검색해 보세요.

https://github.com/KR-onae/srt-parse-to

 

번역하신후에 읽어보셔도 되고, 이 글을 읽으셔도 됩니다.

(참고로 이 글이 올라왔을때에는 사용법이 다를 수 있습니다. 글이 올라갈때의 버전은 2.1.0 버전임을 참고해주세요)

일단 오른쪽 위에 설치 방법이 적혀있습니다.

npm i srt-parse-to

클릭해서 복사후에 CMD 에서 실행하시면 됩니다.
(윈도우 + R → cmd 로 CMD를 켭니다)

 

2. 실습 - 1

먼저 모듈을 require 합니다.

const srt = require("srt-parse-to");

그 다음 srt 파일의 코드를 적어줍니다.

var srtFileSource = `1
00:00:00,500 --> 00:00:03,400
Hello!

2
00:00:03,500 --> 00:00:06,200
World!`;

fs 모듈을 이용해서 파일을 읽을 수도 있습니다.

const fs = require("fs");
var file = fs.readFileSync("test.srt").toString(); // toString 은 제외가능. Buffer 를 String 으로 바꾸기 위함.

위의 코드는 test.srt 파일에서 내용을 읽어 srtFileSource 에 저장하는 코드입니다.

 

그럼 이제 srt 를 JSON 으로 파싱해야겠죠?

아래의 코드를 사용해 보세요.

console.log(srt.toJSON(file));

이 코드를 줄여서 다음의 코드를 사용해도 됩니다.

console.log(file.srtToJSON(file));

 

이제 실행해봅시다.

이곳에서 시작과 끝을 모두 100 ms 만큼 늘리려면 어떻게 해야 할까요?

바로 startAdd 와 endAdd 를 사용하면 됩니다.

 

일단 json 이라는 변수에 변환된 JSON 을 저장합니다.

var json = file.srtToJSON();

이제 start 와 end에 시간을 100 ms 씩 늘려주어야합니다.

다음과 같은 방법으로 시간을 늘려줄 수 있습니다.

for(var i = 0; i < json.length; i++) {
    json[i].startAdd(100);
    json[i].endAdd(100);
}

그 다음 출력해보면...

console.log(json);

이런 값을 얻을 수 있습니다.

이전 출력과는 다르게 100 ms 씩 늘었습니다.

 

하지만 이 함수는 단점이 있습니다.

바로 ms 단위로만 해야한다는겁니다.

 

간단한 식만 있으면 해결될 문제지만,

다른 방법이 필요해보입니다.

 

그래서 원하는곳을 원하는 만큼 늘리는 방법에 대해 알려드리겠습니다.

2. 실습 - 2

일단 먼저 for문을 돌며 원하는 값만큼 늘립니다.

for(var i = 0; i < json.length; i++) {
    json[i].start.milisecond += 1250;
    json[i].start.minute += 2;
    json[i].end.milisecond += 1250;
    json[i].end.minute += 2;
}

그 다음 출력하면 

이런 값이 나옵니다.

하지만 문제가 있습니다.

 

1000ms 는 1s 인데 올림되지 않았습니다.

"그럼 어떻하죠....?"

다 방법이 있습니다.

 

바로 data.prototype.check() 을 이용하면 됩니다.

for(var i = 0; i < json.length; i++) {
    json[i].start.milisecond += 1250;
    json[i].start.minute += 2;
    json[i].end.milisecond += 1250;
    json[i].end.minute += 2;
    json[i].check();
}

위와 같이 for문을 돌며 check 해주면, 더해서 문제가 생길때 바로 올림해줍니다.

결과를 볼까요?

와우! 이제 완벽해 보입니다.

 

하지만, 아직 이 JSON 을 다시 Srt 로 변환하지는 못했습니다.

그래야 저장을 할 수 있을텐데 말이죠.

 

2편에 계속.......

반응형

댓글