GN⁺: MeTube: 셀프 호스팅 YouTube 다운로드 프로그램
(github.com/alexta69)-
32비트 ARM 빌드 중단
- 새로운 Node 버전이 32비트 ARM을 지원하지 않음
- 보안 업데이트와 종속성 문제로 64비트 OS로 마이그레이션 필요
-
MeTube 소개
- youtube-dl의 웹 GUI (yt-dlp 포크 사용)
- YouTube 및 여러 사이트에서 비디오 다운로드 지원
Docker로 실행
-
Docker 명령어
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
-
docker-compose 예제
version: "3" services: metube: image: ghcr.io/alexta69/metube container_name: metube restart: unless-stopped ports: - "8081:8081" volumes: - /path/to/downloads:/downloads
환경 변수로 설정
- UID: MeTube가 실행될 사용자 ID (기본값: 1000)
- GID: MeTube가 실행될 그룹 ID (기본값: 1000)
- UMASK: umask 값 (기본값: 022)
-
DEFAULT_THEME: 기본 테마 (
light
,dark
,auto
, 기본값:auto
) -
DOWNLOAD_DIR: 다운로드 저장 경로 (기본값:
/downloads
) -
AUDIO_DOWNLOAD_DIR: 오디오 전용 다운로드 저장 경로 (기본값:
DOWNLOAD_DIR
) -
DOWNLOAD_DIRS_INDEXABLE: 다운로드 디렉토리 인덱싱 가능 여부 (기본값:
false
) -
CUSTOM_DIRS: 사용자 지정 디렉토리 다운로드 활성화 여부 (기본값:
true
) -
CREATE_CUSTOM_DIRS: 디렉토리 자동 생성 지원 여부 (기본값:
true
) -
STATE_DIR: 큐 지속성 파일 저장 경로 (기본값:
/downloads/.metube
) -
TEMP_DIR: 중간 다운로드 파일 저장 경로 (기본값:
/downloads
) -
DELETE_FILE_ON_TRASHCAN: UI에서 삭제된 파일 서버에서 삭제 여부 (기본값:
false
) -
URL_PREFIX: 웹 서버의 기본 경로 (기본값:
/
) - PUBLIC_HOST_URL: UI에서 표시되는 다운로드 링크의 기본 URL
- PUBLIC_HOST_AUDIO_URL: 오디오 다운로드 링크의 기본 URL
-
OUTPUT_TEMPLATE: 다운로드 파일 이름 템플릿 (기본값:
%(title)s.%(ext)s
) -
OUTPUT_TEMPLATE_CHAPTER: 챕터로 나눈 비디오 파일 이름 템플릿 (기본값:
%(title)s - %(section_number)s %(section_title)s.%(ext)s
) - YTDL_OPTIONS: youtube-dl에 전달할 추가 옵션 (JSON 형식)
-
YTDL_OPTIONS_FILE:
YTDL_OPTIONS
를 채우기 위한 JSON 파일 경로
브라우저 쿠키 사용
-
docker-compose.yml에 추가
volumes: - /path/to/cookies:/cookies environment: - YTDL_OPTIONS={"cookiefile":"/cookies/cookies.txt"}
-
쿠키 추출 확장 프로그램 설치
- Firefox
- Chrome
브라우저 확장 프로그램
- Chrome: Google Chrome Webstore에서 설치 가능
- Firefox: Firefox Addons에서 설치 가능
iOS 단축키
- iOS 단축키: Safari에서 URL을 MeTube로 전송
- 서버 주소 및 포트 입력 필요
iOS 호환성
- iOS 비디오 파일 요구 사항: h264 또는 h265 비디오 코덱 및 aac 오디오 코덱 필요
- MP4 형식 다운로드 시 "Best (iOS)" 옵션 선택 가능
북마클릿
- Chrome 북마클릿: 현재 열린 웹페이지를 MeTube로 전송
- HTTPS 페이지에서 사용 시 HTTPS 역방향 프록시 필요
역방향 프록시 뒤에서 실행
-
NGINX 설정 예제
location /metube/ { proxy_pass http://metube:8081; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; }
-
Apache 설정 예제
<Location /metube/> ProxyPass http://localhost:8081/ retry=0 timeout=30 ProxyPassReverse http://localhost:8081/ </Location> <Location /metube/socket.io> RewriteEngine On RewriteCond %{QUERY_STRING} transport=websocket [NC] RewriteRule /(.*) ws://localhost:8081/socket.io/$1 [P,L] ProxyPass http://localhost:8081/socket.io retry=0 timeout=30 ProxyPassReverse http://localhost:8081/socket.io </Location>
-
Caddy 설정 예제
example.com { route /metube/* { uri strip_prefix metube reverse_proxy metube:8081 } }
yt-dlp 업데이트
- 자동 야간 빌드: 새로운 yt-dlp 버전이 있으면 자동으로 빌드 및 Docker 이미지 업데이트
- watchtower 설치 및 설정 권장
문제 해결 및 이슈 제출
- MeTube는 yt-dlp의 UI: yt-dlp 관련 문제는 MeTube 프로젝트에 제출하지 않음
-
yt-dlp 명령어 직접 사용 권장: 옵션 테스트 후
YTDL_OPTIONS
에 적용
로컬 빌드 및 실행
-
필요한 도구: node.js 및 Python 3.11
cd metube/ui npm install node_modules/.bin/ng build cd .. pip3 install pipenv pipenv install pipenv run python3 app/main.py
-
Docker 이미지 로컬 빌드
docker build -t metube .
개발 노트
- Windows, macOS, Linux에서 작동
- VSCode에서 서버 실행 시 다운로드 폴더는 사용자의 Downloads 폴더
GN⁺의 정리
- MeTube는 youtube-dl의 웹 GUI로, 여러 사이트에서 비디오를 다운로드할 수 있는 기능을 제공함
- Docker를 사용하여 쉽게 배포 및 설정할 수 있으며, 다양한 환경 변수를 통해 사용자 맞춤 설정이 가능함
- 브라우저 확장 프로그램과 iOS 단축키를 통해 편리하게 비디오를 다운로드할 수 있음
- yt-dlp의 최신 버전을 자동으로 업데이트하여 항상 최신 상태를 유지함
- 유사한 기능을 제공하는 프로젝트로는 JDownloader, Video DownloadHelper 등이 있음
Hacker News 의견
-
Tube Archivist는 기술 채널을 아카이브하고 인덱싱하는 데 유용함
- 고급 전체 텍스트 및 메타데이터 검색 기능을 제공함
- Alphabet보다 훨씬 나은 검색 기능을 제공함
-
YouTube TiVo와 같은 기능을 원함
- 자주 시청하는 100개의 채널을 놓치고 싶지 않음
- 우선순위 피드가 필요함
- DLNA를 통해 다운로드 및 시청 가능하면 더 좋음
- YouTube는 사용자가 좋아하는 콘텐츠를 놓치지 않게 하는 데 관심이 없음
-
yt-dlp를 사용하여 간단한 앱을 만들 생각을 하고 있음
- 서버에 호스팅할 필요가 없다고 생각함
- 대안이 있는지 궁금함
-
Jellyfin과 연동되는 인터페이스가 있으면 좋겠음
- YouTube를 검색하고 yt-dlp로 다운로드한 후 광고 없이 Jellyfin을 통해 스트리밍 가능
-
많은 YouTube 미러링 도구가 있는 것이 의아함
- 비디오를 다운로드/아카이브하는 이유가 궁금함
- 비디오가 삭제될 경우를 대비해 아카이브하는 것이 좋지만, 개인적으로는 드물게 발생함
- 비디오를 보고 나면 다시 볼 필요가 없다고 생각함
-
yt-dlp 기반 서버가 PiHole처럼 간단한 이미저와 프론트엔드 클라이언트 앱으로 포장되면 인기를 끌 수 있을 것 같음
- Raspberry Pi를 구매하고 microSD 카드를 이미지화한 후, 좋아하는 YT 채널을 선택하고 클라이언트 앱을 설치하면 로컬에서 광고 없이 YT 콘텐츠를 이용 가능
-
TubeSync를 사용 중임
- 간단한 기능과 많은 버그에도 불구하고 충분히 잘 작동함
- 채널이나 재생목록을 구독하고 비디오를 경로에 다운로드하며, 하루에 한 번 새로운 콘텐츠를 확인함
- 채널 설정을 위한 UX만 필요함
- 파일을 저장하고 Plex가 나머지를 처리하게 함
- 더 나은 옵션이 있는지 궁금함
-
Cobalt.tools를 사용 중임
- 만족스러움
-
플레이리스트에 추가한 비디오를 다운로드하여 공유 Plex 서버에 저장함
- 주로 콘서트 비디오와 스케이트 파트를 아카이브함
-
관련 도구로 Yark: YouTube Archiver with Offline UI가 있음