(광고)같은 유튜브 다운로더, Tube Archivist
요즘 따라 유튜브 다운로더가 밋밋하게 느껴지지 않습니까?
유튜브 영상을 좀 더 계획적으로 관리하고 싶으시다고요?
바로 그럴 때! Tube Archivist가 필요합니다!
타 컨테이너들과 비교하지 마십시요!
Tube Archivist 는 유튜브 다운로더에 필요한 모든 기능을 갖췄습니다!
로그인 기능!
빠른 다운로드!
다운로드 받은 영상을 바로 볼 수 있는 기능까지!
이 모든 구성을 단 613MB에 다운로드 받을 수 있는 절호의 기회!
그게 끝이 아닙니다!
아직도 유튜브 자막 사이트를 따로 찾으십니까?
이제는 그런 노동에서 고생 끝!
자막 자동 다운로드 까지 지원해주는 Tube Archivist!
(en:영어, ko:한국어, ja:일본어 등등... 단, 본 컨테이너는 바로보기 기능에서 자막을 지원하지는 않습니다)
또 있습니다!
Tube Archivist 는 사용자분의 부지런함을 요구하지 않도록 스케쥴 기능을 따로 제공합니다! (단, 본 컨테이너는 사용자의 잘못된 설정에 의한 오류를 책임지지 않으니 유의하시기 바랍니다)
획기적인 기능을 한방 팩으로 만나볼 수 있는 마지막 기회!
613MB! 613MB!
Tube Archivist, 지금 바로 만나보세요!
Q. 왜 컨셉이 이따구인가요?
A. 폐관숙제로 인해 심신이 피폐해졌습니다. 이 모든 것은 1일1숙제를 안 하신 달소님 때문입니다.
Tube Archivist의 docker-compose는 다음과 같이 해주시면 됩니다.
version: '3.3'
services:
tubearchivist:
container_name: tubearchivist
restart: always
image: bbilly1/tubearchivist:latest
ports:
- {원하는포트}:8000
volumes:
- {다운로드받을 폴더}:/youtube
- cache:/cache
environment:
- ES_URL=http://archivist-es:9200 # needs protocol e.g. http and port
- REDIS_HOST=archivist-redis # don't add protocol
- HOST_UID=1000
- HOST_GID=1000
- TA_USERNAME={초기ID} # your initial TA credentials
- TA_PASSWORD={초기 비번} # your initial TA credentials
- ELASTIC_PASSWORD={Elasticsearch비번} # set password for Elasticsearch
- TZ=Asia/Seoul # set your time zone
depends_on:
- archivist-es
- archivist-redis
archivist-redis:
image: redislabs/rejson:latest # for arm64 use bbilly1/rejson
container_name: archivist-redis
restart: always
expose:
- "6379"
volumes:
- redis:/data
depends_on:
- archivist-es
archivist-es:
image: bbilly1/tubearchivist-es # only for amd64, or use official es 7.17.3
container_name: archivist-es
restart: always
environment:
- "xpack.security.enabled=true"
- "ELASTIC_PASSWORD={Elasticsearch비번(위와 동일)}" # matching Elasticsearch password
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es:/usr/share/elasticsearch/data # check for permission error when using bind mount, see readme
expose:
- "9200"
volumes:
cache:
redis:
es:
여기서
volumes:
cache:
redis:
es:
라는 부분이 있는데 이것은 volume container를 설정해주는 것입니다.
이렇게 해주면 이 폴더들은 "/var/lib/docker/volumes/"아래에 들어가게 됩니다.
이 부분을 제거해주는 것이 조금 귀찮은데 컨테이너 삭제 후 "docker volume prune"을 이용하시면 편합니다. (단, 이 방법은 다른 미사용 docker volume에도 영향을 주니 한 번 더 고민해보고 쓰시기 바랍니다. 일부러 잠시 삭제해둔 컨테이너가 있다면 그 컨테이너의 volume container도 같이 삭제 됩니다. 물론 보통은 안 쓰는 건 안 쓰긴 하나 확신이 들 때 사용하시기 바랍니다.)
+) 초기 설치 시 도커 설치 후 웹 화면 나올 때까지 시간이 조금 걸립니다. 여유를 가지고 설치하시기를 권장드립니다.
※ ExpBox님의 댓글에 따라 중복부분이 삭제됐습니다.
이하는 리버스 프록시 유저를 위한 팁입니다.
일반적인 방법으로 리버스프록시를 적용하면 로그인 시
이런 오류를 내뿜습니다.
본 오류는 Django 때문에 발생하는 것으로 추정되는데 정확한 이유는 모르겠으나 해결 방법은 다음과 같습니다. (이 방법은 Django를 기반으로 하는 모든 컨테이너에 유효한 것으로 보이며 linkding이라는 컨테이너에도 적용됩니다.)
nginx 기준으로 "
proxy_set_header X-Forwarded-Proto $scheme;
"를 proxy_pass 아래에 적어주시면 됩니다.
전체적인 구성은 다음과 같습니다. (저는 웹소켓 기능까지 넣었으나 기본적인 방법은 동일합니다.)
server {
listen 80;
server_name {서버DNS};
location / {
proxy_pass http://{내부IP}:{포트번호};
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme; #가장 중요
}
}
컨셉충이 되보려는 것도 어려운 일임을 새삼 깨닫습니다. 달소님의 1일1숙제를 기원합니다.
감사합니다. 덕분에 좋은 어플 알았습니다.
잘 작동하네요.
잘 작동한다니 다행입니다. 컴퓨터랑 싸워가며 오류 해결한 보람이 있네요 ㅎㅎ
즐거운 도커 생활 되셔요~
이래저래 시도하다 보니 설치에 성공했습니다!
다만 헤놀 환경에서는 바로보기가 안되는듯 하네요 ㅋㅋ 제 실력의 부족으로 docker-compose 설정에 오류가 있등가..
다만 다운로드 queue 에 url을 집어넣고 다운받으면 매우 빠르고 좋으나
다운받을 때 각 채널의 이름 폴더를 만들고 그 안에 저장이 됩니다
이 부분은 해당 github 설명 참고하여 고쳐봐야겠어요!
잘안되네요 ㅠㅠ 계속 Bad Request (400) 가 뜨네요... TA_HOST 는 일부러 빼신건가요?
TA_HOST가 정확히 어디부분을 말씀하시는 건가요?
400이면 클라이언트 측 오류일텐데 구체적인 환경을 설명해주실 수 있나요?
저는 ./run.sh: line 16: TA_HOST: Missing required environment variable가 나오면서 실행이 안되고 있습니다~ 그래서 그걸 추가하면 배드리퀘스트가 나오고 있습니다~
이상하네요... 전 그 부분을 제거하고도 작동이 되는데... 혹시 공식 문서에 나온 것을 그대로 써도 동일한 에러가 나나요? 업데이트 날짜를 보니 최근에 뭔가 바뀌었을 가능성도 없진 않다고 봅니다.
version: '3.3'
services:
tubearchivist:
container_name: tubearchivist
restart: unless-stopped
image: bbilly1/tubearchivist
ports:
- 8000:8000
volumes:
- media:/youtube
- cache:/cache
environment:
- ES_URL=http://archivist-es:9200 # needs protocol e.g. http and port
- REDIS_HOST=archivist-redis # don't add protocol
- HOST_UID=1000
- HOST_GID=1000
- TA_HOST=tubearchivist.local # set your host name
- TA_USERNAME=tubearchivist # your initial TA credentials
- TA_PASSWORD=verysecret # your initial TA credentials
- ELASTIC_PASSWORD=verysecret # set password for Elasticsearch
- TZ=America/New_York # set your time zone
depends_on:
- archivist-es
- archivist-redis
archivist-redis:
image: redislabs/rejson # for arm64 use bbilly1/rejson
container_name: archivist-redis
restart: unless-stopped
expose:
- "6379"
volumes:
- redis:/data
depends_on:
- archivist-es
archivist-es:
image: bbilly1/tubearchivist-es # only for amd64, or use official es 8.3.2
container_name: archivist-es
restart: unless-stopped
environment:
- "xpack.security.enabled=true"
- "ELASTIC_PASSWORD=verysecret" # matching Elasticsearch password
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es:/usr/share/elasticsearch/data # check for permission error when using bind mount, see readme
expose:
- "9200"
volumes:
media:
cache:
redis:
es:
댓글 감사합니다~ 혹시 es 권한 맞춰주는건 어떻게 하는 건지 알려주실수 있나요~?
[pid: 50|app: 0|req: 1/1] 192.168.80.1 () {42 vars in 1408 bytes} [Sat Jul 30 03:27:12 2022] GET / => generated 143 bytes in 857 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 2/2] 192.168.80.1 () {42 vars in 1366 bytes} [Sat Jul 30 03:27:13 2022] GET /favicon.ico => generated 143 bytes in 48 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 3/3] 192.168.80.1 () {44 vars in 1439 bytes} [Sat Jul 30 03:27:18 2022] GET / => generated 143 bytes in 53 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 4/4] 192.168.80.1 () {42 vars in 1366 bytes} [Sat Jul 30 03:27:18 2022] GET /favicon.ico => generated 143 bytes in 69 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 5/5] 192.168.80.1 () {44 vars in 1439 bytes} [Sat Jul 30 03:28:27 2022] GET / => generated 143 bytes in 54 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 6/6] 192.168.80.1 () {42 vars in 1366 bytes} [Sat Jul 30 03:28:27 2022] GET /favicon.ico => generated 143 bytes in 48 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 7/7] 192.168.80.1 () {40 vars in 751 bytes} [Sat Jul 30 03:28:44 2022] GET / => generated 143 bytes in 45 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 8/8] 192.168.80.1 () {40 vars in 720 bytes} [Sat Jul 30 03:28:44 2022] GET /favicon.ico => generated 143 bytes in 45 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 9/9] 192.168.80.1 () {62 vars in 1177 bytes} [Sat Jul 30 03:29:56 2022] GET / => generated 143 bytes in 52 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 10/10] 192.168.80.1 () {60 vars in 1091 bytes} [Sat Jul 30 03:29:59 2022] GET /favicon.ico => generated 143 bytes in 49 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 11/11] 192.168.80.1 () {42 vars in 782 bytes} [Sat Jul 30 03:30:43 2022] GET / => generated 143 bytes in 80 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 12/12] 192.168.80.1 () {40 vars in 720 bytes} [Sat Jul 30 03:30:43 2022] GET /favicon.ico => generated 143 bytes in 100 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 13/13] 192.168.80.1 () {42 vars in 782 bytes} [Sat Jul 30 03:30:45 2022] GET / => generated 143 bytes in 55 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 14/14] 192.168.80.1 () {40 vars in 720 bytes} [Sat Jul 30 03:30:45 2022] GET /favicon.ico => generated 143 bytes in 57 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 15/15] 192.168.80.1 () {60 vars in 1122 bytes} [Sat Jul 30 03:37:05 2022] GET / => generated 143 bytes in 49 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 16/16] 192.168.80.1 () {42 vars in 782 bytes} [Sat Jul 30 03:37:17 2022] GET / => generated 143 bytes in 56 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 17/17] 192.168.80.1 () {40 vars in 720 bytes} [Sat Jul 30 03:37:17 2022] GET /favicon.ico => generated 143 bytes in 51 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 18/18] 192.168.80.1 () {42 vars in 1408 bytes} [Sat Jul 30 03:37:31 2022] GET / => generated 143 bytes in 45 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 19/19] 192.168.80.1 () {42 vars in 1366 bytes} [Sat Jul 30 03:37:31 2022] GET /favicon.ico => generated 143 bytes in 49 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 20/20] 192.168.80.1 () {44 vars in 1439 bytes} [Sat Jul 30 03:37:33 2022] GET / => generated 143 bytes in 48 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 21/21] 192.168.80.1 () {42 vars in 1366 bytes} [Sat Jul 30 03:37:34 2022] GET /favicon.ico => generated 143 bytes in 46 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 22/22] 192.168.80.1 () {44 vars in 1439 bytes} [Sat Jul 30 03:42:19 2022] GET / => generated 143 bytes in 60 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 23/23] 192.168.80.1 () {42 vars in 1366 bytes} [Sat Jul 30 03:42:20 2022] GET /favicon.ico => generated 143 bytes in 75 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 24/24] 192.168.80.1 () {44 vars in 1439 bytes} [Sat Jul 30 03:42:22 2022] GET / => generated 143 bytes in 83 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 25/25] 192.168.80.1 () {42 vars in 1366 bytes} [Sat Jul 30 03:42:22 2022] GET /favicon.ico => generated 143 bytes in 57 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 26/26] 192.168.80.1 () {60 vars in 1122 bytes} [Sat Jul 30 03:47:13 2022] GET / => generated 143 bytes in 47 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
[pid: 50|app: 0|req: 27/27] 192.168.80.1 () {60 vars in 1091 bytes} [Sat Jul 30 03:47:15 2022] GET /favicon.ico => generated 143 bytes in 47 msecs (HTTP/1.1 400) 5 headers in 171 bytes (1 switches on core 0)
요런 상태만 나오네요 ㅠㅠ
음... 저도 초보라 로그만 보고는 도움을 드리기 힘듭니다.
좀 더 구체적인 정보가 필요합니다. 도커를 올리는 서버 정보(아키텍처, 클라우드서버인지/개인서버인지 등등)
es 볼륨만 권한 문제가 발생하는 건가요?
docker-compose down
docker system prune -a
docker volume prune
이 명령어들로 전부 정리한 후 다시 설치해도 동일 증상이 재현되나요?
잘 해결되었습니다~
도움은 못 드렸지만 해결되셨다니 다행입니다
즐도커 하세요~
cmt alert