👾

유튜브·빌리빌리·트위터·인스타
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. 두 개 다 갖춰놓고 용도에 따라 쓰는 게 현명하다.

에이전트 워크플로우에 통합한다면?

오픈코드 에이전트가 리서치하다가 “이 유튜브 영상 내용을 분석해줘”라는 태스크를 받았다고 상상해보자:

  1. Lux로 영상 다운로드 → lux -f 398 "URL" (720p av1, 가볍게)
  2. ffmpeg로 오디오 추출
  3. Whisper로 STT → 텍스트 변환
  4. 텍스트를 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. 그리고 더 이상 비디오 다운로드에 시간 낭비하지 말자.

덧: 이 글은 연구·리서치 목적의 도구 사용을 전제로 작성되었다. 저작권법을 준수하자.