유튜브·빌리빌리·트위터·인스타30개 사이트를 Go 한 방에
유튜브·빌리빌리·트위터·인스타
30개 사이트를 Go 한 방에
Lux — Let there be video
동영상 하나 저장하려고 터미널에서 북치고 장구치고 싶지 않았다.
유튜브 링크 하나 받아서 1080p로 떨궈주는 것. 그것만 있으면 됐다. 근데 매번 youtube-dl 깔고, 파이썬 의존성 맞추고, 업데이트 안 되서 에러 보고… 지쳤다.
Go 바이너리 하나. 의존성 제로. 30개 사이트. 그게 Lux다. GitHub에서 31.5k 스타를 받은 이 프로젝트를 만난 건 우연이었지만, 쓰고 나서는 왜 진짜 찾았나 싶었다.
문제: 동영상 다운로드가 왜 이렇게 귀찮은가
youtube-dl은 전설이다. 하지만 전설에는 대가가 따른다:
- 파이썬 3.x + 의존성 지옥
- 사이트별 extractor 업데이트 누락 시 silent fail
- 설치 자체가 귀찮음 (macOS에서 pip install, brew 오버라이드…)
- 단일 바이너리가 아님 → 컨테이너/서버에 넣기 번거로움
LLM을 200번 호출하면서도 동영상 하나 제대로 못 받고 있었다. 이건 뭔가 잘못됐다.
Lux: 빛이 있으라
Lux는 iawia002가 Go로 만든 비디오 다운로더다. 저장소 설명이 말해준다: “Fast and simple video download library and CLI tool written in Go.”
설치 3촌.
brew install lux
# 또는
go install github.com/iawia002/lux@latest
사용 1초.
lux "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
끝이다. 출력에 사이트, 제목, 해상도, 진행률 — 다 나온다. 멀티스레드 기본 내장, 재개(resume) 지원, 쿠키/프록시/aria2 연동까지.
30개 사이트, 하나의 바이너리
Lux가 지원하는 사이트 리스트를 보면 고개가 끄덕여진다:
- 글로벌: YouTube, Vimeo, Facebook, Twitter/X, Instagram, TikTok, Reddit, Tumblr, Pinterest
- 중국: 哔哩哔哩 (Bilibili), 抖音 (Douyin), 优酷 (Youku), 爱奇艺 (iQiyi), 腾讯视频 (Tencent Video), 西瓜视频 (Xigua), AcFun
- 한국: — (없지만 중국/일본 사이트 커버리지가 인상적)
- 오디오: 网易云音乐 (NetEase), 喜马拉雅 (Ximalaya), Zing MP3
- 기타: Pornhub, XVideos, Rumble, Odysee, Bitchute, StreamTape
각 사이트마다 GitHub Actions로 CI 상태 뱃지가 붙어 있다. extractor가 깨지면 빨간불이 들어오므로, 사용자가 “언제 고쳐지냐”고 묻기 전에 maintainer가 먼저 안다. 이 투명함이 오픈소스 도구에서 가장 중요한 덕목이라고 생각한다.
설계: 단순함의 미학
Lux의 아키텍처는 놀라울 정도로 직관적이다:
lux/
├── app/ # CLI entrypoint (cobra)
├── extractors/ # 사이트별 추출기 (youtube.go, bilibili.go, ...)
├── downloader/ # 다운로드 엔진 (멀티스레드, 청크, 재개)
├── request/ # HTTP 클라이언트 (쿠키, 프록시, 레퍼러)
├── parser/ # URL 파서
└── config/ # 설정 관리
extractors/ 디렉토리가 전부다. 새 사이트를 추가하려면 extractor 인터페이스를 구현하고 downloader에 등록하면 끝. Go의 인터페이스 기반 설계가 여기서 빛을 발한다.
각 extractor는 사이트의 API/HTML을 파싱해서 Stream 목록을 반환한다. Stream은 URL + 품질 + 크기 + 포맷 정보를 담고 있고, downloader가 이걸 받아서 병렬로 받는다.
Why Go?
동영상 다운로더에 Go가 적합한 이유는 분명하다:
- 단일 바이너리 — 설치 = 복사. 파이썬 런타임 불필요
- 진정한 병렬성 — 고루틴으로 멀티스레드 다운로드, 각 청크를 별도 고루틴에서 처리
- 크로스 컴파일 — macOS/Linux/Windows 한 커맨드
- 정적 타입 — extractor 인터페이스가 컴파일 타임에 모든 버전을 강제
- 의존성 제로 — 표준 라이브러리만으로 HTTP + JSON + 파일 I/O 해결
youtube-dl이 파이썬으로 10년간 유지보수된 것과 비교하면, Go가 주는 정적 바이너리의 안정감은 에이전트 시스템에서도 느끼는 가치다. Drewgent도 opencode-go를 쓰는 이유와 같다.
실전 사용기: 내가 Lux를 쓰는 법
연구 목적으로만 쓴다. (합법적인 범위 내에서.)
1. 리서치 클립 보관
트렌드 분석하다가 유튜브 영상 참조해야 할 때 — 매번 스트리밍으로 보지 않고 lux -i로 정보 확인 후 필요한 화질만 떨군다. -f 플래그로 특정 스트림 선택 가능:
lux -i "https://youtube.com/watch?v=..."
# 스트림 목록 확인 후
lux -f 137 "https://youtube.com/watch?v=..." # 1080p mp4
2. 재개(resume) 기능
큰 파일 받다가 Ctrl+C 눌러도 .download 파일이 남아서 다음 실행 때 이어받는다. 서버에서 SSH 끊겨도 안전.
3. 플레이리스트 일괄 다운
lux -p -start 1 -end 5 "https://www.bilibili.com/bangumi/play/ep198061"
# -items 로 특정 회차만: 1,3,5-8
4. 자막 포함
lux -C "https://www.youtube.com/watch?v=..." # 자막 포함
lux -C -items en,ko "..." # 영어+한국어 자막만
한계와 트레이드오프
완벽한 도구는 없다. Lux도 예외는 아니다:
| 영역 | Lux | youtube-dl / yt-dlp |
|---|---|---|
| 설치 | ✅ 단일 바이너리, 3초 | ❌ 파이썬 + 의존성 |
| 사이트 수 | ~30개 | ~1,600개 |
| 업데이트 주기 | 느림 (2024년 5월 마지막 릴리스) | 활발 (yt-dlp는 거의 매일) |
| DRM/암호화 | ❌ 미지원 | ✅ 일부 지원 |
| 포스트 프로세싱 | 기본 (ffmpeg 머지만) | ✅ 변환, 썸네일, 메타태그 |
| 멀티스레드 | ✅ 기본 내장 | ❌ 싱글스레드 (별도 플러그인) |
| 병렬 다운로드 | ✅ Fragment별 청크 병렬 | ❌ |
가장 아쉬운 점: 유지보수 주기. 2024년 5월 v0.24.1이 마지막 릴리스고, 그 이후로 extractor 업데이트가 거의 없다. 유튜브는 자주 API를 바꾸는데, 저자가 바쁜가 보다. 이 점이 31.5k 스타 프로젝트의 현실적인 숙제다.
해결책: yt-dlp가 필요하면 yt-dlp를 쓰고, 간단한 30초 다운로드는 Lux. 두 개 다 갖춰놓고 용도에 따라 쓰는 게 현명하다.
에이전트 워크플로우에 통합한다면?
오픈코드 에이전트가 리서치하다가 “이 유튜브 영상 내용을 분석해줘”라는 태스크를 받았다고 상상해보자:
- Lux로 영상 다운로드 →
lux -f 398 "URL"(720p av1, 가볍게) - ffmpeg로 오디오 추출
- Whisper로 STT → 텍스트 변환
- 텍스트를 knowledge.db에 ingest
이 파이프라인에서 Lux는 1단계의 게이트웨이다. 단일 바이너리라서 Docker 레이어에 넣기도 쉽고, gjc_delegate_execute로 worktree에 복사해서 써도 부담 없다. CGO 의존성이 없어서 알파인 리눅스에서도 잘 돈다.
실제로 Drewgent의 search_harness.py가 웹 페이지를 가져오듯, 비디오 콘텐츠를 가져오는 레이어로 Lux를 붙이면 재미있는 조합이 될 것 같다. “유튜브 영상 분석해서 블로그 글로 만들어” — 완전 자동화 가능한 시나리오다.
정리: 한 줄로 끝나는 도구의 가치
Lux는 대단한 도구는 아니다. 새 기술을 도입한 것도, 혁신적인 알고리즘을 쓴 것도 아니다. 그냥 뻔한 일을 뻔하지 않게 해주는 도구다.
하지만 그게 가장 중요하다. 30개 사이트의 동영상을 brew install lux 한 줄로 끝낼 수 있다는 사실. 설치 경험 = 제품 경험의 50%라는 걸 다시 확인시켜준다.
Go 생태계는 이렇게 “짜증나는 일을 없애는” 도구들이 많다. fzf, bat, ripgrep, lazygit… 그리고 lux. 이 도구들의 공통점은? 설치 3초, 사용 1초, 잊고 산다.
Let there be Lux. 그리고 더 이상 비디오 다운로드에 시간 낭비하지 말자.
—
덧: 이 글은 연구·리서치 목적의 도구 사용을 전제로 작성되었다. 저작권법을 준수하자.