MeTube: 셀프 호스팅 YouTube 다운로드 프로그램
(github.com/alexta69)- MeTube는
yt-dlp를 위한 셀프 호스팅 웹 UI로, 브라우저에서 YouTube와 수십 개 지원 사이트의 미디어를 다운로드할 수 있게 함 - 영상, 오디오, 자막, 썸네일 다운로드를 지원하고, 플레이리스트와 채널도 출력 형식과 다운로드 옵션을 조정해 받을 수 있음
- 채널과 플레이리스트를 구독해 주기적으로 새 항목을 확인하고, 새 업로드를 자동으로 대기열에 넣을 수 있음
- Docker 또는 docker-compose로 실행하며, 동시 다운로드 수, 저장 경로, 파일명 템플릿, HTTPS, CORS, 테마, 로그 수준 등을 환경 변수로 설정함
yt-dlp옵션은 전역 옵션, 프리셋, 다운로드별 오버라이드 순서로 결합되며, 다운로드별 오버라이드는 임의 옵션 입력을 허용하므로 신뢰된 환경에서만 켜야 함
MeTube가 하는 일
- MeTube는
yt-dlp기반의 셀프 호스팅 웹 UI임 - YouTube와
yt-dlp가 지원하는 수십 개 사이트에서 미디어를 다운로드할 수 있음 - 주요 기능은 다음과 같음
- 브라우저 UI에서 영상, 오디오, 자막, 썸네일 다운로드
- 플레이리스트와 채널 다운로드
- 출력 경로와 다운로드 옵션 구성
- 채널·플레이리스트 구독 후 새 항목을 주기적으로 확인
- 새 업로드를 자동으로 다운로드 대기열에 추가
실행 방식
- Docker로 바로 실행할 수 있음
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
- docker-compose 예시는
ghcr.io/alexta69/metube이미지를 사용하고, 컨테이너의/downloads를 호스트 다운로드 디렉터리에 마운트함
services:
metube:
image: ghcr.io/alexta69/metube
container_name: metube
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- /path/to/downloads:/downloads
다운로드와 저장소 설정
- MAX_CONCURRENT_DOWNLOADS는 동시에 실행할 수 있는 다운로드 수를 제한하며 기본값은
3임 - DELETE_FILE_ON_TRASHCAN이
true이면 UI의 “Completed” 섹션에서 항목을 휴지통으로 보낼 때 서버의 다운로드 파일도 삭제함 - DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT는 플레이리스트에서 다운로드 가능한 최대 항목 수를 정하며, 기본값
0은 제한 없음임 - 구독 관련 기본값도 환경 변수로 조정함
- SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: 구독별 자동 확인 간격, 기본
60분 - SUBSCRIPTION_SCAN_PLAYLIST_END: 구독 확인 때 가져올 최대 플레이리스트·채널 항목 수, 기본
50 - SUBSCRIPTION_MAX_SEEN_IDS: 구독별 저장할 영상 ID 수 상한, 기본
50000
- SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: 구독별 자동 확인 간격, 기본
- DOWNLOAD_DIR는 다운로드 저장 경로이며 Docker 이미지에서는 기본값이
/downloads임 - 오디오 전용 다운로드는 AUDIO_DOWNLOAD_DIR로 별도 저장 경로를 둘 수 있음
- CUSTOM_DIRS와 CREATE_CUSTOM_DIRS를 통해 UI에서 다운로드 하위 디렉터리를 선택하거나 자동 생성할 수 있음
- STATE_DIR에는
queue.json,pending.json,completed.json,subscriptions.json같은 영속 상태 파일이 저장됨 - TEMP_DIR는 중간 다운로드 파일 경로이며, SSD나 RAM 파일시스템을 쓰면 성능에 도움이 될 수 있지만 RAM 파일시스템은 다운로드 재개를 막을 수 있음
파일명과 yt-dlp 옵션
- OUTPUT_TEMPLATE는 다운로드 파일명 템플릿이며 기본값은
%(title)s.%(ext)s임 - 챕터, 플레이리스트, 채널 다운로드용 템플릿을 별도로 설정할 수 있음
-
OUTPUT_TEMPLATE_CHAPTER
-
OUTPUT_TEMPLATE_PLAYLIST
- OUTPUT_TEMPLATE_CHANNEL
yt-dlp옵션은 JSON 객체로 지정함- 옵션 계층은 넓은 범위에서 좁은 범위 순으로 적용됨
- 전역 옵션: 모든 다운로드의 기본값
- 프리셋: UI에서 다운로드별로 선택하는 이름 붙은 옵션 묶음
- 다운로드별 오버라이드: 특정 다운로드에만 적용하는 자유 입력 옵션
- 충돌하는 키가 있으면 더 구체적인 설정이 우선함
- 다운로드별 오버라이드가 프리셋보다 우선
- 프리셋이 전역 옵션보다 우선
- JSON에서 옵션 값을
null로 설정하면 해당 다운로드에서 그 옵션을 지움 YTDL_OPTIONS_FILE과YTDL_OPTIONS_PRESETS_FILE은 파일 변경을 감시하고 자동으로 다시 로드되므로 컨테이너 재시작이 필요 없음- 파일과 환경 변수를 함께 쓰면서 같은 키나 같은 프리셋 이름을 정의하면 파일 설정이 우선함
-
프리셋과 오버라이드
- 프리셋은 UI의 Advanced Options 아래 “Option Presets”로 표시됨
- 예시 프리셋은 다음 작업을 수행함
- sponsorblock: sponsor, selfpromo, interaction 세그먼트를 제거
- embed-subs: 영어와 독일어 자막을 다운로드하고 영상 파일에 임베드
- limit-rate: 다운로드 속도를 약 5 MB/s로 제한
- 여러 프리셋을 선택하면 순서대로 적용되고, 같은 옵션은 뒤의 프리셋이 앞의 프리셋을 덮어씀
- ALLOW_YTDL_OPTIONS_OVERRIDES를
true로 설정하면 UI에 “Custom yt-dlp Options” 자유 입력 JSON 필드가 나타남 - 다운로드별 오버라이드는 기본적으로 비활성화되어 있음
- 이 기능을 켜면 UI 접근자가 임의의
yt-dlpAPI 옵션을 줄 수 있고, 옵션에 따라 컨테이너 내부에서 임의 명령 실행이 가능할 수 있으므로 신뢰된 환경에서만 활성화해야 함 - MeTube는 초기 메타데이터 가져오기 단계에서 자체
extract_flat,noplaylist동작을 강제하며, 프리셋은 이 단계의 키를 덮어쓸 수 없음
쿠키, 브라우저 연동, 단축 실행
- 제한되거나 비공개인 영상을 다운로드해야 할 때 브라우저 쿠키를 사용할 수 있음
- Firefox 또는 Chrome 확장으로 쿠키를
cookies.txt로 내보냄 - MeTube의 Advanced Options에서 Upload Cookies로 업로드
- 같은 섹션의 Delete Cookies로 업로드한 쿠키 삭제
- Firefox 또는 Chrome 확장으로 쿠키를
- 브라우저 확장은 영상에서 우클릭해 MeTube로 직접 보낼 수 있게 함
- HTTPS 페이지에서 쓰려면 MeTube 인스턴스가 HTTPS 리버스 프록시 뒤에 있어야 함
- 확장은
chrome-extension://...또는moz-extension://...출처에서 요청하므로 CORS_ALLOWED_ORIGINS=* 설정이 필요함
- Chrome 확장은 Google Chrome Webstore에서 설치하거나 소스로 설치할 수 있음
- Firefox 확장은 Firefox Addons에서 설치하거나 소스를 사용할 수 있음
- iOS Shortcut은 Safari 공유 메뉴에서 MeTube로 URL을 보낼 수 있음
- Bookmarklet은 현재 열린 웹페이지를 MeTube에 보내며, HTTPS 페이지에서는 MeTube가 HTTPS로 설정되어 있거나 HTTPS 리버스 프록시 뒤에 있어야 함
- Bookmarklet은 현재 페이지 출처에서 MeTube로 교차 출처 요청을 보내므로, 사용할 사이트 출처를 CORS_ALLOWED_ORIGINS에 추가해야 함
- Raycast용 MeTube extension은 Raycast에서 직접 영상을 추가할 수 있게 함
웹 서버, HTTPS, 리버스 프록시
- 웹 서버 관련 설정은 환경 변수로 조정함
- HOST 기본값은
0.0.0.0 - PORT 기본값은
8081 - URL_PREFIX는 리버스 프록시 뒤 하위 경로 배포에 사용
- PUBLIC_HOST_URL과 PUBLIC_HOST_AUDIO_URL은 완료 파일 다운로드 링크의 기준 URL을 바꿈
- HOST 기본값은
- HTTPS를
true로 설정하고 CERTFILE, KEYFILE을 지정하면 MeTube가 HTTPS 모드로 실행됨 - 리버스 프록시는 HTTPS 종료나 인증 용도로 사용할 수 있음
linuxserver/swag이미지는 MeTube용 subfolder, subdomain 설정 조각과 Authelia 인증 설정을 포함함- NGINX 예시는
/metube/경로를http://metube:8081로 프록시하며, WebSocket 동작을 위해Upgrade와Connection헤더를 설정함 - Apache와 Caddy용 리버스 프록시 예시도 제공됨
업데이트, 문제 해결, 로컬 개발
- MeTube는 yt-dlp에 의존하며, 동영상 사이트 레이아웃 변화 때문에
yt-dlp는 자주 업데이트가 필요함 - 새
yt-dlp안정 릴리스가 나오면 새 MeTube Docker 이미지가 자동으로 게시됨 - 컨테이너를 최신 상태로 유지하는 방식으로 watchtower를 사용할 수 있음
yt-dlpnightly 채널을 따르려면 YTDL_NIGHTLY_UPDATE_TIME에 매일 업그레이드와 MeTube 재시작을 수행할 시간을HH:MM형식으로 설정함- 인증, 후처리, 권한,
YTDL_OPTIONS문제는 먼저yt-dlp에서 직접 디버그한 뒤, 동작하는 옵션을 MeTube로 가져오는 흐름을 권장함 - 로컬 빌드와 실행에는 Node.js 22+ 와 Python 3.13이 필요함
- UI는
pnpm으로 빌드하고, Python 의존성은uv sync로 설치한 뒤uv run python3 app/main.py로 실행함 - Docker 이미지는
docker build -t metube .로 로컬 빌드할 수 있으며, 이 과정에서 UI도 함께 빌드됨
댓글과 토론
Hacker News 의견들
-
Tube Archivist도 고려해볼 만함. 영상 몇 개만 받으려는 용도라면 과하지만, 좋아하는 기술 채널을 보관하고 색인하는 데 쓰고 있음
전사/자막뿐 아니라 댓글, 제목, 설명까지 전체 텍스트와 메타데이터 검색이 가능해서, 짜증나게도 Alphabet이 제공하는 것보다 훨씬 낫다
https://www.tubearchivist.com/- TubeArchivist를 보다가 컨테이너 3개가 필요하다는 점이 마음에 안 들었음. 그러다 selfhosted 서브레딧에서 Pinchflat을 찾았고, 단일 컨테이너로 동작해 배포가 쉬웠으며 지금까지 잘 작동 중임
https://github.com/kieraneglin/pinchflat - 이건 피하고 싶음. 파일 이름 짓기가 데이터베이스가 존재한다는 전제에 기대고 있음
임시 저장소라면 이해되지만, 스스로를 “보관” 소프트웨어라고 부르는 도구라면 보존하려는 데이터보다 자신이 오래 살아남지 못할 수도 있다고 가정해야 함
다운로드 기능이 있는 PeerTube 클론 같아서 기대했는데 결과물을 보고 식었고,yt-dlp에 영리한 설정과 스크립트를 붙이는 편이 보관 작업을 제대로 해줌 - Google은 자기 제품을 구조적이고 고급 방식으로 편하게 쓰게 만들 일이 없음. 그런 방식은 사용자에게 너무 유리하고 통제권을 너무 많이 넘겨주기 때문임. Google은 그런 걸 싫어함
- 오늘 앞서 홈페이지에 올라온 다른 선택지도 있음: Yark: YouTube Archiver with Offline UI
https://news.ycombinator.com/item?id=41100820 - Tube Archivist로 옮기고 싶다는 생각은 오래 했지만, TubeSync로 모아둔 YouTube 영상이 몇 TB나 있어서 다시 받고 싶지 않음
다행히 파일명을 저장할 때 쓴 형식 문자열이 있고, TubeSync가 Django와 PostgreSQL 백엔드를 쓰니 YouTube ID와 연결할 수 있을지도 모름. 그래도 마이그레이션은 꽤 악몽 같아 보임
- TubeArchivist를 보다가 컨테이너 3개가 필요하다는 점이 마음에 안 들었음. 그러다 selfhosted 서브레딧에서 Pinchflat을 찾았고, 단일 컨테이너로 동작해 배포가 쉬웠으며 지금까지 잘 작동 중임
-
정말 원하는 건 YouTube TiVo임
거의 종교적으로 챙겨보지만 업로드가 드문 채널이 100개쯤 있고, 이 채널들의 영상은 절대 놓치고 싶지 않음
하루에 네 번씩 올리는 채널들의 수백 개 새 영상을 YouTube에서 뒤져가며 실제로 보고 싶은 1~2개를 찾고 싶지도 않음. 결국 놓치게 됨
실제로 보고 싶거나 봐야 하는 것만 모은 우선순위 피드를 주면 좋겠고, 전부 내려받아 DLNA로 볼 수 있으면 더 좋음
우리가 좋아하는 걸 놓치지 않게 하는 건 YouTube의 운영 방식이 아님. 3분짜리 영상을 18~22분으로 늘린 영상을 보게 하면서 피드백을 얼굴에 묶어두는 게 YouTube의 방식임- 그건 YouTube 구독으로 해결되는 것 아닌가? 그 100개 채널을 구독하고 구독 페이지를 북마크하면, 보고 싶은 것만 있는 우선순위 피드가 생김
계정을 만들고 싶지 않은 거라면 괜찮고 NewPipe가 잘 맞겠지만, 직접 고른 채널의 영상을 시간순으로 보여주는 전용 페이지가 있는데 “우리가 좋아하는 걸 놓치지 않게 하는 게 YouTube의 방식이 아니다”라고 하는 건 좀 이상함 - NewPipe가 이 용도에 잘 맞음. 메인 페이지 콘텐츠에서 “Default Kiosk” 열을 없애고 “What's New”만 남기면, 구독한 채널의 영상만 볼 수 있음. NewPipe의 구독은 Google 계정과 전혀 통합되어 있지 않음
- YouTube는 아직 RSS를 쓰는 걸로 알고 있음. 그걸 시도해볼 수 있음
- 이 용도로 Invidious를 쓰고 있음. 구독만 대상으로 한 우선순위 피드가 있어서 좋음
발견 가능성은 좋지 않지만, 그게 필요한 사용 사례가 아니라면 살펴볼 만함 - 정확히 그 일을 하려고 쓰는 fraidycat 확장이 있음
https://fraidyc.at/
- 그건 YouTube 구독으로 해결되는 것 아닌가? 그 100개 채널을 구독하고 구독 페이지를 북마크하면, 보고 싶은 것만 있는 우선순위 피드가 생김
-
한 가지가 이해가 안 됨. 왜 서버에 호스팅해야 함? Windows/Linux/mac에서 돌아가는 독립 실행 앱이면 되지 않나
최근에yt-dlp를 쓰기 시작했고 간단한 앱을 만들어볼까 생각했음. 해볼 만한가? 이런 종류의 대안이 이미 있나?- 원하면 Windows/Linux/OSX 장치나 그 위의 가상 머신/컨테이너가 서버가 될 수 있음. 이렇게 하면 만든 쪽에서 웹용 UX와 네이티브 UX를 따로 만들 필요가 없음
많은 사람이 셀프호스팅 앱을 외부 서버나 홈랩, 또는 그 조합에서 돌리고, 그 자원을 백업 등이 갖춰진 인프라처럼 설정함. PC/노트북/태블릿/폰은 비교적 단순한 클라이언트나 캐시로 두면 분실·손상 시 서버와 동기화된 로컬 콘텐츠를 다시 가져오면 되어 교체가 쉬움. 이런 방식의 셀프호스팅이 인기 있는 이유 중 하나임
yt-dlp를 감싼 데스크톱 앱은 몇 개 본 적 있음. 직접 써보지는 않아 안정성이나 신뢰성은 말하기 어렵지만, 재미로 새로 만들고 싶은 게 아니라면 먼저 검색해보는 게 좋음. 원하는 것이 이미 있을 수 있음 - Celluloid는 지원되는 URL을 열라고 하면 자동으로
yt-dlp를 이용해 스트리밍함. Parabolic은yt-dlp를 쓰는 전용 다운로드 도구임
https://flathub.org/apps/details/io.github.celluloid_player....
https://flathub.org/apps/org.nickvision.tubeconverter - YouTube 영상만 내려받는다면
yt-dlp조차 꼭 필요하지 않음. 훨씬 적은 코드와 복잡도로 할 수 있고, 아주 작은 C 프로그램으로 쓰고 있음. 작은 셸 스크립트도 충분히 잘 동작함
아무도 이야기하지 않는 건yt-dlp가 이제 itag 22를 내려받을 수 없고 itag 18은 속도 제한이 걸렸다는 점임. 그래서yt-dlp는 오디오 파일과 비디오 파일을 따로 받은 뒤ffmpeg로 합쳐야 함
YouTube 광고 매출이 컨센서스 추정치를 막 놓쳤음. YouTube 영상 접근성은 앞으로 더 나빠질지도 모름
특정 형식을 고르는 습관이 없다면 이걸 잘 못 느낄 가능성이 큼. 예를 들어 어떤 사람들은 수년간 itag 18과 22만 써왔음 - Freetube도 있음
https://freetubeapp.io/ - 지금 쓰는 장치가 아니라 NAS나 홈 서버에 영상을 내려받아 저장하고 싶을 수 있음
Docker화된 웹 앱은 Windows, macOS, Android, iOS, Linux용 데스크톱/모바일 클라이언트를 각각 만드는 것보다 훨씬 만들고 유지하기 쉬움
- 원하면 Windows/Linux/OSX 장치나 그 위의 가상 머신/컨테이너가 서버가 될 수 있음. 이렇게 하면 만든 쪽에서 웹용 UX와 네이티브 UX를 따로 만들 필요가 없음
-
Jellyfin과 연동되는 인터페이스가 있으면 좋겠음. YouTube를 검색하고
yt-dlp로 내려받은 뒤, 광고 없이 Jellyfin으로 스트리밍하는 식이면 좋음- 거의 그렇게 쓰고 있는데,
yt-dlp단계만 수동임. Jellyfin 플러그인이 있으면 훌륭할 듯함
- 거의 그렇게 쓰고 있는데,
-
꽤 멋짐. 지금은 https://cobalt.tools를 쓰고 있는데 이것도 괜찮음
- 완벽함. 원본 YouTube 오디오 형식을 mp3로 트랜스코딩하지 않고 내려받는 옵션이 있음
-
iOS용 Brave에 YouTube 영상을 내려받아 기기에 저장하는 재생목록 버튼이 있다는 걸 알게 됨. PiP와 오프라인 재생이 가능하고 광고도 없음
Mozilla iOS 백엔드 기반의 공개 라이선스를 쓰는데, 왜 더 많은 앱이 이렇게 하지 않는지 궁금함. Apple이 받아들이게 하는 방법을 찾았고, CEO도 여기에서 그 기법이 타당하다고 방어하는 글을 올린 적 있음
본질적으로는 일반 YouTube 웹사이트 안에서 영상을 로드한 뒤에만 동작하며, YouTube뿐 아니라 어떤 비디오 콘텐츠에도 적용되는 읽기 모드 버튼 같은 방식임 -
YouTube 미러링 도구가 이렇게 많은 게 조금 의아함. 이런 걸 쓴다면 YouTube에서 그냥 스트리밍하지 않고 영상을 다운로드/보관하는 이유가 뭔가?
YouTube에서 삭제될 경우를 대비해 보관하는 게 좋을 때가 있다는 건 이해하지만, 내 경우엔 그런 일이 아주 드묾. 영상을 보고 나면 끝이고, 다시 못 봐도 별로 상관없음- YouTube에서 스트리밍하지 않고 내려받거나 보관하는 이유는 여러 가지임
첫째, 광고 제거는 많은 사람에게 꽤 큰 이유임
둘째, 이미 적었듯이 저작권 주장이나 다른 신고 때문에 영상이나 채널 전체가 내려가면 다시 스트리밍할 수 없음. 보는 콘텐츠에 따라 어떤 사람에게는 이게 당신보다 훨씬 중요할 수 있음
셋째, 오프라인 재생을 위해 내려받을 수 있음. 공식 YouTube 앱으로도 가능하지만 Premium 비용을 내야 하고, 그 가격은 과해 보이며 여전히 삭제 문제에 영향을 받음
넷째, 로컬 색인임. 나중에 다시 보거나 공유하려고 영상을 참조하려면 YouTube 사본 북마크를 유지하거나 매번 검색하는 것보다 자기 구조로 정리하는 편이 더 편할 수 있음
위 이유들이 섞여 있을 수 있고, 내가 고려하거나 기억하지 못한 다른 이유도 있을 것임 - 내게는 사람들이 VCR을 쓰던 것과 같은 이유임. “저작권 침해”가 아니라, 나중에 보거나 인터넷 연결이 없거나 느릴 때 보려고 저장하는 것임
내가 내려받는 대부분은 한 번 보고 지움 - 아이들 홈 네트워크에서는 YouTube를 막고, 대신 직접 선별한 DadTube에 접근하게 함
- 도구가 왜 존재하는지 의아하다면서, 바로 그 도구가 존재해야 하는 가장 큰 이유를 스스로 들고 있음
게다가 YouTube 스트리밍이 불가능할 때도 있음. 인터넷이 끊겼거나, 해외 모바일 요금제라 비용이 부담되거나, 그냥 형편없는 광고를 없애고 싶을 수도 있음 - 대역폭 사용량 제한 때문임. 같은 뮤직비디오 재생목록을 반복해서 틀고 싶으면 제한량을 꽤 잡아먹음
- YouTube에서 스트리밍하지 않고 내려받거나 보관하는 이유는 여러 가지임
-
관련: Yark: YouTube Archiver with Offline UI
https://news.ycombinator.com/item?id=41100820 -
yt-dlp기반 서버 중 하나를 아주 단순한 Pi-hole 같은 이미지 작성 도구와 괜찮은 재생용 프런트엔드 클라이언트 앱으로 감싸면, Pi-hole이 덜 기술적인 사용자에게 퍼진 것처럼 크게 뜰 수 있다고 봄
Raspberry Pi를 사고, microSD 카드를 이미지로 굽고, 좋아하는 YouTube 채널을 고르고, 클라이언트 앱을 설치하면 좋아하는 YouTube 콘텐츠가 모두 로컬에서 광고 없이 제공되는 식임 -
지금은 TubeSync를 쓰고 있음. 기능이 단순하고 버그도 많지만 내게는 충분히 잘 동작함
필요한 작업은 채널이나 재생목록을 구독하고, 영상을 특정 경로에 내려받고, 하루에 한 번 새 콘텐츠를 확인하는 것뿐임
필요한 UX는 채널 설정뿐이고, 그다음에는 파일만 저장한 뒤 Plex가 알아서 하게 두면 됨. 더 나은 선택지를 아는 사람 있나?