Nodejs Docker twitch 다운로드 서버 만들기

목차

개발의 목적

예전에 만든 트위치 다운로드 프로그램은 잘쓰고 있지만 프로그램 사용을위해 ffmpeg나 도커를 설치하는 과정이 간편하게 생각난 영상을 저장하기에는 너무나 번거로웠다. 그래서 ftp나 iis처럼 서버기반으로 만들면 좋을 것 같아 jade와 기존 프로그램을 합쳐서 웹페이지에서 입력을 받고 다운로드까지 해주는 서버를 만들었다. 다만 아직은 jade에 익숙하지않아 UI가 단순하고 다운로드가 얼마나 진행되는지 알 방법이 없다는 게 큰 단점인 것 같다. 이번 기회에 jade나 express에 대해 좀 더 배우고 다음 프로젝트에서도 많이 사용해봐야겠다.

결론

사이트 접속 -> 링크 입력 -> 다운로드까지는 순조롭게잘되지만 다운로드의 진행률, 오류 핸들링, 보안적인 부분에서는 좀 더 공부를 해서 준비해야할 것 같다. 하지만 jade나 웹을 통한 입출력에 대해서는 많이 공부할 수 있었다. 게다가 도커의 장점을 살려서 도커와 외부포트만 준비한다면 어디서든지 오류없이 쉽게 사용할 수 있다는 것이 큰 장점이라고 생각한다.

외부링크

  1. Github 링크
  2. Dockerhub 링크

출력결과

result_img

개발에 사용할 도구들

Docker

Docker는 기존 sudo npm install **** 처럼 프로그램/모듈을 설치하는 것이 아닌 이미 세팅된 프로그램을 리눅스 컨테이너로 불러와 사용하는 것이다. 그 덕분에 세팅하는 시간도 줄어들고 프로그램을 관리할때도 장점이 많다. 다만 컨테이너별로 IP가 할당되기에 다른 컨터이너와 통신을 하려면 조금 까다라운 부분도 있다. 필자도 Docker 장점을 처음에는 잘 몰랐지만 이번에 개발을 하며 Docker을 편리함을 많이 느낄 수 있었다.

Visual Studio Code

Visual Studio Code는 리눅스 리눅스의 Vim같은 텍스트 에디터지만 Visual studio처럼 인텔리센스와 내장된 터미널이 있다는 것이 큰 장점이다. 다만 자바나 파이썬같은 컴파일러는 언어마다 따로 설치해야한다. Visual Studio Code는 어디까지나 쉽게 코딩하고 디버깅할 수 있게 도와주는 도구지 IDE가 아니다! 필자도 Visual Studio Code의 여러 종류의 플러그인을 같이 사용해서 다재다능하게 사용할 수 있다는 점이 강점이라고 생각한다.

개발 과정

Nodejs 파일 준비

1
2
3
// 개발폴더 생성, views 폴더도 개발폴더안에 만든다.
npm init
npm install node-hls-downloader express jade --save
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// index.js

/*
위의 두 글은 빠른 작동확인을 위한 입력예시입니다.
예시1: https://d1m7jfoe9zdc1j.cloudfront.net/a43560afc77def11ccb0_bbaktube_43401346525_1629795192/storyboards/1127872626-strip-0.jpg,91글자,BBAK
예시2: https://d2nvs31859zcd8.cloudfront.net/a9fe8d1bab46ad66567f_haha1550ha_39901245627_1630402871/storyboards/1134842209-strip-0.jpg,93글자,coh2

localhost:3000에 들어가 입력하면 mp4 파일을 생성한 후에 다운로드합니다. 입력이후에 다운로드는 영상길이에 따라 시간이 오래 걸리므로 콘솔로 로그보면서 기다리는 것이 좋을 듯합니다.
글자수는 이전 블로그 글처럼 storyboard 앞까지의 글자수를 세서 입력하면됩니다! 이번 프로그램의 제일 큰 장점은 컴퓨터에 도커나 프로그램 설정없이 웹에서 다운로드 과정을 진핼할 수 있는 것입니다.

이번 프로젝트는 예전의 twitch_downloader를 바탕으로 jade 기반 웹에서 입력을 받아 실행할 수 있는 서버프로그램으로 만들었습니다.

twitch_downloader 블로그 링크: https://ousion.kr/2021/06/Docker_nodejs_twtich_downloader/
*/

var express = require('express');
var app = express();
const download = require("node-hls-downloader").download;

app.locals.pretty = true;
app.set('view engine', 'jade');
app.set('views', './views');

// localhost:3000 페이지를 렌더링합니다!
app.get('/', (req, res) => {
res.render('welcome.jade');
})

// localhost:3000/input 페이지를 렌더링합니다. 이 페이지에서는 링크주소, 글자수, 다운로드 받을 파일이름을 입력받습니다.
app.get('/input', (req, res) => {
res.render('input.jade');
})

// 영상을 다운로드받고 클라이언트가 영상을 다운로드를 받습니다.
app.get('/input_check', (req, res) => {

const link_address = req.query.link_address
const link_number = req.query.link_number
const filename = req.query.filename

//ffmpeg에 맞게 변수 가공합니다.
var changed_link = link_address.substring(0,link_number) + "chunked/index-dvr.m3u8";
console.log("target link is : " + changed_link);
//target link is : https://d1m7jfoe9zdc1j.cloudfront.net/a43560afc77def11ccb0_bbaktube_43401346525_1629795192/chunked/index-dvr.m3u8

const changed_name = filename + ".mp4"
console.log("File name is : " + changed_name);

async function asyncCapture(){
await download({
quality: "best",
concurrency: 8,
// concurrency는 cpu 쓰레드에 맞게 조절하면 될듯합니다.
// httpHeaders: "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36",
outputFile: changed_name,
streamUrl: changed_link,
});

console.log("Complete");

filepath = __dirname + "/" + filename + ".mp4";
res.download(filepath);
}

asyncCapture();

})
// 웹서버 3000포트에서 시작
app.listen(3000, () => console.log('connected, 3000'));

운영체제에 ffmpeg를 준비하고 도커화하기전에 작동이 잘되는지 확인하자

Doker 준비

Visualcode에서 명령창을 열어서 Dockerfiles to workspace를 진행한다.

dockerfile에 다음처럼 추가한다.

1
2
3
COPY --from=mwader/static-ffmpeg:4.4.0 /ffmpeg /usr/local/bin/
COPY --from=mwader/static-ffmpeg:4.4.0 /ffprobe /usr/local/bin/
COPY --from=mwader/static-ffmpeg:4.4.0 /qt-faststart /usr/local/bin/

다음 터미널에서 다음처럼 이미지를 빌드하고 시작한다.

1
2
docker build -t "webtwitchdownloader" .
docker run -it --rm --name "webtwitch" -p 3000:3000 webtwitchdownloader

시행착오

  • dockerfile에 꼭 ffmpeg를 다운로드 받도록 설정해야합니다.
1
2
3
COPY --from=mwader/static-ffmpeg:4.4.0 /ffmpeg /usr/local/bin/
COPY --from=mwader/static-ffmpeg:4.4.0 /ffprobe /usr/local/bin/
COPY --from=mwader/static-ffmpeg:4.4.0 /qt-faststart /usr/local/bin/
  • 다운시간이 꽤 걸립니다. 콘솔창에서 에러내용이나 다운중이라고 나오니 여유를 가지고 기다려합니다. 만약 쓰레드가 많은 컴퓨터라면 쓰레드랑 인터넷을 여유있게주는 것도 속도향상에 도움이됩니다.
  • 원본 방송에서 저작권이나 기타이유로 음원이 삭제된 부분은 다운로드가 진행되지않습니다!
  • 도커허브에서 링크를 가져올때 public 링크를 가져와야합니다! 아님 로그인이후에 접속이 되지않습니다!

참고한 자료들과 같이보기 좋은 자료들

  1. https://bitlog.tistory.com/101
  2. https://hianna.tistory.com/349
  3. https://medium.com/@aksgh10230069/node-js-file-download-582dc7871b4
  4. https://naltatis.github.io/jade-syntax-docs/#basics
  5. https://itholic.github.io/js-form/
  6. https://stackoverflow.com/questions/17762188/simple-form-node-js-application
  7. https://wayhome25.github.io/nodejs/2017/02/18/nodejs-10-express-template-engine-jade/