# MeTube: 셀프 호스팅 YouTube 다운로드 프로그램

> Clean Markdown view of GeekNews topic #16083. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=16083](https://news.hada.io/topic?id=16083)
- GeekNews Markdown: [https://news.hada.io/topic/16083.md](https://news.hada.io/topic/16083.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-07-30T09:56:05+09:00
- Updated: 2024-07-30T09:56:05+09:00
- Original source: [github.com/alexta69](https://github.com/alexta69/metube)
- Points: 6
- Comments: 1

## Topic Body

- **32비트 ARM 빌드 중단**
  - 새로운 Node 버전이 32비트 ARM을 지원하지 않음
  - 보안 업데이트와 종속성 문제로 64비트 OS로 마이그레이션 필요

- **MeTube 소개**
  - youtube-dl의 웹 GUI (yt-dlp 포크 사용)
  - YouTube 및 여러 사이트에서 비디오 다운로드 지원

### Docker로 실행

- **Docker 명령어**
  ```bash
  docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
  ```

- **docker-compose 예제**
  ```yaml
  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에 추가**
  ```yaml
  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 설정 예제**
  ```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 설정 예제**
  ```apache
  &lt;Location /metube/&gt;
    ProxyPass http://localhost:8081/ retry=0 timeout=30
    ProxyPassReverse http://localhost:8081/
  &lt;/Location&gt;
  &lt;Location /metube/socket.io&gt;
    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
  &lt;/Location&gt;
  ```

- **Caddy 설정 예제**
  ```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
  ```bash
  cd metube/ui
  npm install
  node_modules/.bin/ng build
  cd ..
  pip3 install pipenv
  pipenv install
  pipenv run python3 app/main.py
  ```

- **Docker 이미지 로컬 빌드**
  ```bash
  docker build -t metube .
  ```

### 개발 노트

- **Windows, macOS, Linux에서 작동**
- **VSCode에서 서버 실행 시 다운로드 폴더는 사용자의 Downloads 폴더**

### GN⁺의 정리

- MeTube는 youtube-dl의 웹 GUI로, 여러 사이트에서 비디오를 다운로드할 수 있는 기능을 제공함
- Docker를 사용하여 쉽게 배포 및 설정할 수 있으며, 다양한 환경 변수를 통해 사용자 맞춤 설정이 가능함
- 브라우저 확장 프로그램과 iOS 단축키를 통해 편리하게 비디오를 다운로드할 수 있음
- yt-dlp의 최신 버전을 자동으로 업데이트하여 항상 최신 상태를 유지함
- 유사한 기능을 제공하는 프로젝트로는 JDownloader, Video DownloadHelper 등이 있음

## Comments



### Comment 27678

- Author: neo
- Created: 2024-07-30T09:56:05+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41098974) 
- 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가 있음
