6P by GN⁺ | ★ favorite | 댓글 1개
  • You-Get은 웹에서 비디오, 오디오, 이미지 같은 미디어 콘텐츠를 내려받는 작은 명령줄 유틸리티이며, 다른 간편한 방법이 없을 때 쓰는 도구임
  • YouTube, Youku, niconico, Tumblr, SoundCloud, Instagram, bilibili, TikTok 등 여러 사이트에서 동영상·이미지·오디오를 내려받거나, 미디어 플레이어로 온라인 영상을 스트리밍할 수 있음
  • --info로 사용 가능한 품질과 포맷을 확인하고 --itag로 선택할 수 있지만, 포맷 선택은 대부분의 지원 사이트에서 일반적으로 구현되지 않았으며 기본값은 최고 품질임
  • 설치는 pip, GitHub 다운로드·클론, Homebrew, FreeBSD pkg, Flox 등으로 가능하고, 권장 의존성은 Python 3.7.4 이상, FFmpeg 1.0 이상, 선택 사항 RTMPDump임
  • 직접 URL 다운로드, 웹페이지 스크래핑, Google Videos 검색 기반 다운로드, 일시정지·재개, 프록시, 쿠키 로드, 추출 URL·JSON 출력까지 제공하지만 일부 기능은 실험적이거나 안정화되지 않았음

You-Get이 하는 일

  • You-Get은 웹에서 미디어 콘텐츠를 내려받는 작은 명령줄 유틸리티임
    • 대상 콘텐츠는 비디오, 오디오, 이미지임
    • 웹에서 다른 간편한 다운로드 방법이 없을 때 쓰는 용도임
  • 사용 이유로는 개인적으로 즐기기 위한 다운로드, 저장이 막힌 온라인 비디오에 대한 제어, 폐쇄형 기술이나 독점 JavaScript·Flash 회피, 해커 문화와 자유 소프트웨어 지향이 제시됨
  • 주요 기능은 다음과 같음
    • YouTube, Youku, Niconico 등 인기 사이트의 비디오·오디오 다운로드
    • 웹브라우저 없이 미디어 플레이어에서 온라인 비디오 스트리밍
    • 웹페이지를 긁어 관심 있는 이미지 다운로드
    • 바이너리 파일 같은 임의의 비 HTML 콘텐츠 다운로드

설치와 실행 환경

  • 권장 의존성은 Python 3.7.4 이상, FFmpeg 1.0 이상, 선택 사항 RTMPDump
  • 2022년 5월 30일 공지에 따르면 Python 3.5, 3.6, 3.7 지원은 결국 중단될 예정임
  • 설치 경로는 여러 가지임
    • PyPI에서 pip install you-get
    • Zsh 사용자는 Antigen으로 antigen bundle soimort/you-get
    • GitHub의 master 안정 브랜치 또는 develop 브랜치 다운로드
    • 개발자에게 권장되는 git clone git://github.com/soimort/you-get.git
    • macOS는 brew install you-get
    • FreeBSD는 pkg install you-get
    • Mac, Linux, Windows WSL은 flox install you-get
  • Bash, Fish, Zsh용 셸 자동완성 정의는 contrib/completion에 있음
  • 업그레이드는 설치 방식에 따라 pip install --upgrade you-get, 최신 릴리스 다운로드, 또는 develop 브랜치 강제 재설치로 가능함

기본 다운로드 흐름

  • 동영상을 받을 때 you-get -i URL 또는 --info로 사용 가능한 품질과 포맷을 먼저 확인할 수 있음
    • 출력에는 사이트, 제목, 스트림, 컨테이너, 품질, 크기, 다운로드에 사용할 --itag 예시가 포함됨
    • 기본 다운로드는 목록 맨 위 항목을 사용함
  • 다른 포맷을 원하면 출력에 표시된 --itag 값을 사용함
    • 예시로 YouTube의 Me at the zoo 동영상에서 --itag=18로 mp4를 선택할 수 있음
  • YouTube 동영상에 자막이 있으면 비디오 파일과 함께 SubRip 자막 형식으로 내려받음
  • 포맷 선택은 아직 대부분의 지원 사이트에서 일반 기능으로 구현되지 않았음
    • 이 경우 기본 다운로드 포맷은 최고 품질임
  • FFmpeg는 여러 조각으로 스트리밍되는 비디오 다운로드·병합과 YouTube 1080p 이상 고해상도 비디오에 필요함
    • 다운로드 후 조각 병합을 원하지 않으면 --no-merge 또는 -n을 사용함

URL, 웹페이지, 검색 기반 다운로드

  • 정확한 리소스 URL이 있으면 you-get URL로 직접 내려받을 수 있음
    • 예시로 JPEG 이미지 URL을 입력하면 사이트, 제목, 타입, 크기를 표시하고 파일을 저장함
  • 정확한 리소스 URL이 아니라 웹페이지 URL을 주면 페이지를 긁어 관심 있는 항목을 찾으려 함
    • 이 기능은 실험적이며 완벽하지 않음
    • Tumblr, Blogger 같은 인기 사이트에서 큰 이미지 스크래핑에 가장 잘 동작함
    • 인터넷의 모든 사이트에 적용되는 보편 패턴은 없음
  • URL이 아닌 문자열을 넘기면 Google Videos에서 검색하고 가장 관련성이 높은 비디오를 다운로드함
    • 원하는 것과 정확히 같지 않을 수 있지만, 매우 그럴듯한 결과일 가능성이 있다고 되어 있음

다운로드 제어와 실행 옵션

  • 다운로드 중 Ctrl+C로 중단할 수 있고, 출력 디렉터리에 임시 .download 파일이 남음
    • 같은 인자로 다시 실행하면 마지막 세션부터 재개
    • 임시 확장자가 사라진 완전한 파일이 있으면 다운로드를 건너뜀
    • --force 또는 -f는 강제 재다운로드를 수행하며, 같은 이름의 기존 파일이나 임시 파일을 덮어씀
  • --output-dir 또는 -o로 저장 경로를 지정하고, --output-filename 또는 -O로 파일명을 지정할 수 있음
    • 기본 비디오 제목에 현재 셸, 운영체제, 파일시스템과 맞지 않는 특수 문자가 있을 때 유용함
    • 배치 다운로드 스크립트에서 지정 폴더와 지정 이름으로 저장할 때도 유용함
  • --http-proxy 또는 -x로 HTTP 프록시를 지정할 수 있음
    • 기본적으로 시스템 프록시 설정인 http_proxy 환경 변수가 적용됨
    • 프록시를 끄려면 --no-proxy를 사용함
    • Youku 같은 일부 사이트에서 중국 본토에서만 접근 가능한 비디오 정보를 추출할 때 --extractor-proxy 또는 -y를 사용할 수 있음
  • --player 또는 -p는 다운로드 대신 mpv, vlc 같은 미디어 플레이어에 비디오를 전달함
    • 브라우저를 플레이어로 지정하면 광고나 댓글 섹션 없이 브라우저에서 볼 수 있음
    • 다른 다운로드 매니저를 시작하는 데도 쓸 수 있지만 잘 맞지 않을 수 있음

인증, 추출 데이터, 지원 사이트

  • 공개되지 않은 비디오처럼 계정 로그인이 필요한 콘텐츠는 --cookies 또는 -c로 브라우저 쿠키를 전달해야 함
    • 현재 지원 쿠키 형식은 Mozilla cookies.sqlite와 Netscape cookies.txt
  • --url 또는 -u는 페이지에서 추출한 다운로드 가능 리소스 URL 목록을 출력함
  • --json은 추출 데이터 요약을 JSON 형식으로 출력함
    • 이 기능은 아직 안정화되지 않았으며 JSON 스키마는 향후 깨지는 변경이 있을 수 있음
  • 지원 사이트 목록에는 YouTube, X(Twitter), VK, Vimeo, Tumblr, SoundCloud, Pinterest, Internet Archive, Instagram, Facebook, Dailymotion, Bandcamp, niconico, bilibili, Youku, Naver, TikTok, Zhihu 등이 포함됨
    • 사이트별로 비디오, 이미지, 오디오 지원 여부가 다름
  • 목록에 없는 사이트는 범용 추출기가 페이지에서 관심 있는 리소스를 찾아 다운로드함

문제 보고와 라이선스

  • 원하는 콘텐츠를 받을 수 없을 때는 Known Bugs를 먼저 확인함
  • 새 문제 보고나 기여 전에는 기여 가이드라인을 읽어야 함
  • 빠른 질문은 Gitter 채널 #soimort/you-get에서 할 수 있음
  • 소프트웨어는 MIT license로 배포됨
    • 소프트웨어는 보증 없이 “있는 그대로” 제공됨
    • 저작권 침해나 기타 불법 목적 사용에 대해서 작성자는 책임지지 않음
    • 저장소는 코드만 제공하며 사용 방식은 사용자 재량에 맡겨짐

댓글과 토론

Hacker News 의견들
  • 한동안 인터넷은 비싸고 대역폭은 낮았지만 YouTube에서 음악과 강의를 듣는 걸 좋아했음. 어느 순간 오디오 스트림만 받으면 대역폭 비용을 90% 줄일 수 있다는 걸 깨달았음
    youtube-dlyt-dlp에는 요청한 형식/품질의 URL을 출력하는 -G 플래그가 있었고, 컴퓨터에서는 명령줄로 URL을 얻어 VLC에 넣어 썼음
    휴대폰에서는 처음엔 SSH로 VPS에 파일을 먼저 받은 뒤 다시 폰으로 내려받는 복잡한 우회를 썼지만, 나중에 폰 브라우저가 URL을 직접 재생할 수 있다는 걸 알고 youtube-dl -G -f bestaudio {url}용 PHP 프런트엔드를 만들었음
    지금은 온라인에 없고 코드도 잃어버렸지만 사실상 한 줄짜리였음. you-get--url / -u로 같은 용도를 지원하는 듯해서, 이 기능이 얼마나 유용한지 알리고 싶었음
    화면을 끄고 재생하면 배터리도 80% 절약됨. YouTube도 이걸 알고 있어서, 오디오 스트림만 가져오는 백그라운드 재생을 유료 기능으로 만든 것 같음

    • Brave Mobile 브라우저는 백그라운드 동영상 오디오 재생을 켤 수 있어서 YouTube Premium 같은 구독이 필요 없어짐
    • youtube-dl은 더 이상 잘 동작하지 않는 듯하고, 나는 포크인 yt-dlp를 써야 했음. 이렇게 프로젝트를 갈아타는 건 늘 불안하지만, 적어도 널리 쓰이는 것 같긴 함
    • 어머니가 오디오북을 정말 좋아해서, YouTube 링크를 공유하면 처리하는 Telegram 봇node-red로 만들어 드렸음
      링크는 FIFO로 보내지고, 작은 데몬이 순차적으로 다운로드해서 전용 incoming 폴더에 저장함. 봇은 오디오만 받을 수도 있고 전체 동영상도 받을 수 있는데, 어머니의 Telegram ID에서는 오디오만 받도록 해둠
      이 폴더는 Jellyfin이 감시하고 있어서 어머니가 내려받거나 바로 들을 수 있음. 2년 동안 오디오북을 1TB 넘게 받으셨고 아주 좋아하심
      데몬 코드: https://gist.github.com/entropie/d265e94136b9777cc6b3190189b...
    • 저대역폭 상황에서는 자주 144p를 고름. 용량은 좋은 품질의 오디오 전용 스트림과 거의 비슷하지만, 45분에 한 번이라도 화자를 볼 수 있다는 장점이 있음. 배터리도 마찬가지로 아낄 수 있음
      144p 영상은 묘하게 평화롭고 편안함. 반짝이는 색감이나 복잡한 디테일에 산만해지지 않고, 그냥 듣는 데 집중할 수 있음
    • iOS Safari에서는 Safari 앱을 벗어난 뒤 지금 재생 중 인터페이스에서 동영상 재생 버튼을 빠르게 누르면, YouTube 동영상 오디오를 백그라운드 재생하는 식으로 꼬이게 만들 수 있음
      주로 YouTube Premium이 있어도 백그라운드에서 재생되지 않는 멤버십 전용 영상을 재생할 때 씀. iOS가 업데이트될 때마다 이 “글리치”를 막지 않길 기도함
  • 이 프로젝트는 수정 PR 없이 이슈만 보고하는 걸 원하지 않는 것처럼 보임
    “you-get 사용 중 발견한 문제를 보고하려면 Pull Request를 열어야 하며…”라는 식이라, 이런 방식은 전에 본 적이 없음

    • 다른 사람이 말했듯이 수정 자체가 아니라 실패하는 테스트를 원한다는 뜻으로 보임
      요구사항은 문제의 자세한 설명과, 그 문제를 단위 테스트로 다루는 최소 한 개의 커밋임. 여기서 “addressing”이라는 단어는 별로고, “demonstrating”이 더 나았을 것 같음
    • 중국어 버전에는 “GitHub Issues 남용을 막기 위해 일반 이슈는 받지 않는다”로 번역되는 추가 헤더가 있음. 예전 영어 문구에는 이렇게 적혀 있었음
      you-get은 현재 이슈 처리에 공격적인 접근을 실험 중이며, 버그 보고는 pull request를 통해 코드로 다뤄져야 한다는 내용임
      https://github.com/soimort/you-get/commit/75b44b83826b3c2d9a...
      아마 스팸이 너무 많았던 것 같음. 참고로 tests/test.py는 여러 웹사이트에 대해 추출기를 직접 실행하는 것처럼 보이고, 네트워크 요청과 응답을 어디서 모킹하는지는 못 찾겠음. PR 만드는 사람에게 과정을 단순하게 하려는 의도일 수도 있음
    • 문제 해결 여부를 보여줄 수 있는 테스트가 포함된 PR을 제출하라는 뜻으로 보임
    • 사람들이 테스트나 전체 수정까지 시도하도록 장려하는 생각은 흥미롭지만, 그것만 받겠다고 하는 건 좀 과해 보임. 다만 내가 you-get을 유지보수하는 건 아니니, 그들이 어떤 일을 겪는지는 모름
      명령줄 프로그램을 제대로 실행할 줄 모르는 사람들이 반복적으로 올리는 이슈 폭주를 걸러내는 효과적인 방법일 수도 있음
    • 실패하는 테스트를 작성하는 건 비교적 쉽고, 이슈 조정에 드는 일을 크게 줄여줌. GitHub Issues가 지원 포럼으로 변하는 위험도 낮아짐
      이 덕분에 프로젝트 유지보수가 쉬워지고 더 오래 유지된다면 괜찮다고 봄
  • 제목과 설명 앞부분만 보고는 페이지에서 아무거나 잡아내려는 휴리스틱 기반 도구라고 생각했음. 특정 사이트 지원 도구가 없을 때, 즉 대부분은 “yt-dlp가 지원하지 않을 때” 유용한 그런 도구 말임
    그런데 실제로는 어느 정도 인기 있는 소스마다 별도 추출기가 있는 추출기 기반 구조임. 결국 더 단순한 yt-dlp 복제판에 가까운 것 아닌가 싶음

  • 계속 이 오류가 나는 사람이 있는지 궁금함
    you-get: [error] oops, something went wrong.로 시작해서 네트워크 문제 확인, 최신 버전 확인, 알려진 버그 확인, --debug 옵션 실행을 안내함
    디버그 플래그를 써도 별 도움이 안 됐고, pattern = str(pattern, 'latin1')에서 TypeError: decoding to str: need a bytes-like object, NoneType found가 났음
    나이 제한을 우회할 수 있는지 보려고 했는데, 나이 제한 없는 영상에서도 같은 오류가 났음

    • Python 버전을 확인해보는 게 좋음
      Pyenv 같은 도구로 최신 Python으로 바꾸거나, docker run -it -v $(pwd):/mnt python:3.13 bash 같은 식으로 Docker 이미지를 띄워 그 안에서 유틸리티를 써보면 됨
  • 왜 이게 yt-dlp보다 나은지 설명해줄 수 있나?

    • 흥미로운 질문임. 의존성은 라이브러리 하나뿐이지만, 실제로 얼마나 많은 코드가 직접 작성된 것인지는 궁금함
      예를 들어 전용 mp4 조이너가 있는 게 신기했음. 이미 ffmpeg가 있다면 직접 더 잘 만들 방법은 거의 없을 텐데
      https://github.com/soimort/you-get/blob/develop/src/you_get/...
    • yt-dlp보다 낫다고 어떻게 추론했는지 궁금함. Google이 계속 막으려 드는 영역에서는 선택지가 많을수록 좋다고 봄
  • 사이트별 추출기와 변환기 라이브러리를 갖춘 ytdl 스타일 미디어 다운로더를 정확히 “멍청한” 도구라고 부르긴 어렵지만, ytdl 같은 프로젝트가 더 생기는 건 여전히 좋음

  • 지원 사이트 목록에 Bandcamp가 있는 이유를 잘 모르겠음. Bandcamp는 아티스트에게 먼저 돈을 내면 파일을 그냥 다운로드할 수 있게 해줌
    이 도구로 받을 수 있는 건 아티스트가 구매 전 무료로 들어보게 허용했기 때문임. 이 도구로 내려받는 건 완전히 불필요하고 좀 무례한 행동처럼 보임. Bandcamp에는 주로 소규모 독립 아티스트와 레이블이 있음

    • 지원 사이트 목록은 도덕적 이유로 어디에 이 도구를 써야 하는지 선언하는 게 아님. 그냥 이 도구가 동작하는 인기 사이트 목록일 뿐임
    • 구독하거나 구매한 뒤에도 이 도구를 쓸 수 있다고 봄. 사람들은 이미 돈 낸 콘텐츠도, 각기 다른 폐쇄형 생태계의 앱 5개에 로그인하는 수고를 줄이려고 이런 자동화 도구로 내려받음
    • 모두가 Bandcamp에 결제할 수 있는 나라에 사는 건 아닐 수도 있음
      개인적으로도 불안정하거나 느린 네트워크, 비싼 통신사 때문에 오프라인으로 미디어를 소비하고 싶거나 그래야 할 때가 있음. 그렇다고 마음에 들면 나중에 돈을 내지 않겠다는 뜻은 아님
    • 해적질하는 사람들은 어느 소득 수준부터 어떤 콘텐츠를 훔치는 게 도덕적이거나 비도덕적이라고 보나?
    • 모두가 아티스트가 자기 작품에 돈을 받아야 한다는 데 동의하는 건 아님
  • 잘 만든 것 같음. 하지만 소비자 입장에서는 yt-dlp 대신 you-get을 써야 할 이유가 뭔지 궁금함
    방대한 사이트에서 꽤 잘 동작하는 yt-dlp보다 어떤 강점이 있나?
    [1] https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites....

  • 설명서에 “Google Videos에서 검색하고 다운로드: $ you-get "Richard Stallman eats"”라고 되어 있음
    설명서를 자주 읽지는 않는데, 이번엔 읽었다가 좀 역겨운 이스터 에그를 발견했음

  • 마음에 듦. Chrome/Firefox용 동반 확장이 있어서 you-get을 백엔드로 쓰고 매끄럽게 구현하면 좋겠다고 상상함
    더 앞서 나가면, YouTube에 들어갔을 때 YouTube 플레이어를 우회하고 광고 없이 콘텐츠를 직접 재생하는 you-get 확장을 떠올릴 수 있음. YouTube뿐 아니라 다른 플랫폼에도 적용 가능함