중요한
이 저장소의 활성 개발은 2023년 7월 14일부터 일시 중지되었습니다. 일부 시나리오에서는 여전히 작동할 수 있지만 지원은 이제 커뮤니티에서만 처리되며 PR은 현재 리포지토리에 병합되지 않습니다. 지속적인 업데이트를 위해 @distube/ytdl-core와 같은 포크를 탐색해 보시기 바랍니다. 우리는 미래에 개발을 다시 검토할 수도 있습니다. 많은 관심과 오랜 지원 부탁드립니다!
감사합니다 TFAN, 2024-08-13
또 다른 YouTube 다운로드 모듈. Javascript와 노드 친화적인 스트리밍 인터페이스만으로 작성되었습니다.
채팅 서버에서 지원을 받으려면 당사에 문의하세요.
const fs = require('fs');const ytdl = require('ytdl-core');// TypeScript: 'ytdl-core'에서 ytdl 가져오기; --esModuleInterop// TypeScript 사용: import *를 'ytdl-core'에서 ytdl로; --allowSyntheticDefaultImports// TypeScript 사용: import ytdl = require('ytdl-core'); 위의 어느 쪽도 사용하지 않음ytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
지정된 URL에서 비디오를 다운로드하려고 시도합니다. 읽을 수 있는 스트림을 반환합니다. options
getInfo()
옵션 및 chooseFormat()
옵션 외에 다음이 포함될 수 있습니다.
range
- 다운로드할 파일의 일부를 지정하는 {start: INT, end: INT}
형식의 바이트 범위(예: {start: 10355705, end: 12452856}). 세그먼트화된(DASH MPD, m3u8) 형식에서는 지원되지 않습니다.
이렇게 하면 별도로 연결된 비디오가 아닌 파일의 일부가 다운로드됩니다.
begin
- 비디오의 시작 시간입니다. 00:00:00.000
, 0ms, 0s, 0m, 0h
또는 밀리초 수 형식을 지원합니다. 예: 1:30
, 05:10.123
, 10m30s
.
라이브 비디오의 경우 유닉스 타임스탬프 또는 날짜 객체도 허용하며 기본값은 Date.now()
입니다.
이 옵션은 실시간이 아닌 비디오에 대해서는 그다지 신뢰할 수 없습니다. #129 및 #219를 참조하세요.
liveBuffer
- 라이브 비디오에 사용할 시간 버퍼의 양(밀리초)입니다. 기본값은 20000
입니다.
highWaterMark
- 메모리에 버퍼링할 비디오 다운로드 양입니다. 자세한 내용은 노드 문서를 참조하세요. 기본값은 512KB입니다.
dlChunkSize
- 선택한 형식이 비디오 전용 또는 오디오 전용인 경우 제한을 피하기 위해 다운로드가 여러 청크로 분리됩니다. 이 옵션은 각 청크의 크기를 바이트 단위로 지정합니다. 0으로 설정하면 청킹이 비활성화됩니다. 기본값은 10MB입니다.
IPv6Block
- 프록시를 사용하는 대신 순환할 IPv6 블록입니다. 자세히 읽어보세요. 기본값은 undefined
.
ytdl.videoInfo
- 정보.
ytdl.videoFormat
- 비디오 형식.
다운로드하기 위해 선택한 형식과 함께 동영상 info
가져올 때 발생합니다.
number
- 청크 길이(바이트) 또는 세그먼트 번호입니다.
number
- 다운로드된 총 바이트 또는 세그먼트입니다.
number
- 총 바이트 또는 세그먼트입니다.
새로운 청크가 수신될 때마다 방출됩니다. 다운로드 진행 상황을 설명하는 값을 전달합니다.
모든 미니겟 이벤트는 전달되며 반환된 스트림에서 들을 수 있습니다.
비디오 다운로드를 중단하고 중지하려면 전화하세요.
비디오에서 메타정보만 얻으려는 경우 이 방법을 사용하세요.
비디오에서 메타정보를 가져옵니다. 추가 형식이 포함되어 있으며 해독된 URL을 다운로드할 준비가 되어 있습니다. 이것이 ytdl()
함수가 내부적으로 사용하는 것입니다.
options
다음을 가질 수 있습니다
requestOptions
- headers
와 같이 miniget이 호출되는 요청 옵션에 병합할 모든 항목입니다.
requestCallback
- 메타정보를 가져오는 동안 사용되는 미니겟 요청 스트림 객체를 수신하는 콜백 함수를 제공합니다.
lang
- 언어의 2문자 기호입니다. 기본값은 en
입니다.
ytdl.getInfo
함수를 사용하여 동영상에서 메타데이터를 수신하면 해당 정보를 다른 옵션과 함께 이 함수에 전달할 수 있습니다.
형식을 직접 선택하려는 경우 사용할 수 있습니다. 일치하는 형식을 찾지 못하면 오류가 발생합니다.
options
다음을 가질 수 있습니다
quality
- 다운로드할 비디오 품질입니다. itag 값, itag 값 목록 또는 highest
/ lowest
/ 최고 highestaudio
/ lowestaudio
/ highestvideo
/ lowestvideo
문자열 중 하나일 수 있습니다. highestaudio
/ lowestaudio
동일하게 좋은 오디오 형식에 대해 비디오 비트 전송률을 최소화하려고 시도하는 반면, highestvideo
/ lowestvideo
각각 오디오를 최소화하려고 시도합니다. 기본값은 highest
으로, 비디오와 오디오가 모두 포함된 형식을 선호합니다.
일반적인 비디오 형식은 quality: 'highest'
itag container quality codecs bitrate audio bitrate 18 mp4 360p avc1.42001E, mp4a.40.2 696.66KB 96KB 137 mp4 1080p avc1.640028 4.53MB 248 webm 1080p vp9 2.52MB 136 mp4 720p avc1.4d4016 2.2MB 247 webm 720p vp9 1.44MB 135 mp4 480p avc1.4d4014 1.1MB 134 mp4 360p avc1.4d401e 593.26KB 140 mp4 mp4a.40.2 128KB
360p의 형식 18이 비디오와 오디오 모두에서 최고 품질 형식이므로 먼저 선택됩니다. 비디오와 오디오가 모두 포함된 고품질 형식을 원할 경우 별도의 스트림 처리 섹션을 참조하세요.
filter
- 선택할 형식 목록을 필터링하는 데 사용됩니다. audioandvideo
또는 videoandaudio
로 비디오와 오디오를 모두 포함하는 형식을 필터링할 수 있고, video
비디오가 포함된 형식으로 필터링할 수 있으며, videoonly
만 포함하고 추가 오디오 트랙이 없는 형식으로 필터링할 수 있습니다. audio
또는 audioonly
일 수도 있습니다. 사용 가능한 각 형식으로 호출되는 필터링 기능을 제공할 수 있습니다. 이 함수에는 첫 번째 인수로 format
개체가 제공되며 형식이 바람직할 경우 true를 반환해야 합니다.
// 사용자 정의 function.ytdl(url, { filter: format => format.container === 'mp4' })의 예
format
- 주로 특정 비디오 또는 오디오 스트림을 다운로드하는 데 사용됩니다. 이는 getInfo
에서 반환된 특정 format
개체일 수 있습니다.
이 옵션을 제공하면 형식이 명시적으로 제공되므로 filter
및 quality
옵션이 무시됩니다.
// 동영상 형식 선택 예시.let info = wait ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, { quality: '134' });console.log('형식을 찾았습니다!', 체재);
일부 형식으로만 작업하려면 위의 filter
옵션을 사용할 수 있습니다.
// 형식을 오디오로만 필터링하는 예.let info = wait ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('오디오만 포함된 형식: ' + audioFormats.length);
주어진 문자열이 YouTube의 ID 형식을 충족하면 true를 반환합니다.
유효한 동영상 ID를 파싱할 수 있으면 true를 반환합니다.
YouTube URL에서 동영상 ID를 반환합니다. ID 구문 분석에 실패하면 오류가 발생합니다.
위의 ytdl.getURLVideoID()
와 동일하지만 동영상 ID로 직접 호출할 수 있으며, 이 경우 동영상 ID를 반환합니다. 이것이 ytdl이 내부적으로 사용하는 것입니다. ID 구문 분석에 실패하면 오류가 발생합니다.
package.json에서 직접 가져온 버전 문자열입니다.
ytdl은 다음에 해당하는 동영상을 다운로드할 수 없습니다.
지역적으로 제한됨(프록시 필요)
비공개(액세스 권한이 있는 경우 쿠키 필요)
대여(액세스 권한이 있는 경우 쿠키가 필요함)
YouTube Premium 콘텐츠(액세스 가능한 경우 쿠키 필요)
현재는 HLS Livestream만 지원됩니다. 다른 형식은 ytdl.chooseFormats에서 필터링됩니다.
생성된 다운로드 링크는 6시간 동안 유효하며 동일한 IP 주소에서만 다운로드할 수 있습니다.
요청이 너무 많으면 YouTube에서 차단할 수 있습니다. 이로 인해 HTTP-StatusCode 429로 요청이 거부됩니다. 다음 단계가 도움이 될 수 있습니다.
ytdl-core를 최신 버전으로 업데이트하세요.
프록시 사용(여기에서 예를 찾을 수 있음)
(IPv6-) 주소를 순환하여 프록시 아이디어 확장
이에 대한 자세한 내용은 이것을 읽어보세요.
쿠키 사용(여기에서 예를 찾을 수 있음)
이를 적용하려면 먼저 현재 속도 제한이 만료될 때까지 기다려야 합니다.
기다려 주세요. (보통 며칠 내에 사라집니다.)
요청 집약적인 작업의 경우 요청을 여러 소스 IP 주소에 분산시키는 것이 유용할 수 있습니다. 사용하는 소스 IP를 변경하는 것은 지역 잠금과 같은 제한 사항을 우회하지 않는다는 점을 제외하면 프록시 사용과 유사합니다. IP 주소가 많을수록 IP당 요청 수가 줄어들므로 속도 제한이 늘어납니다. IPv4 주소는 제한된 리소스이므로 IPv6를 사용하는 것이 좋습니다.
IPv6 블록을 사용하면 기본적으로 요청에 따라 수백만 개의 IPv6 주소를 갖게 됩니다. /64 IPv6 블록(일반적으로 단일 가구에 제공되는 블록)에는 18,446,744,073,709,551,616개의 고유 IPv6 주소가 있습니다. 이렇게 하면 서로 다른 IPv6 주소로 각 요청을 수행할 수 있습니다.
IP 블록을 사용하면 속도 제한을 방지하는 데 도움이 되더라도 IP 블록의 모든 메시지에서 http 트래픽을 허용하도록 호스트 시스템을 설정해야 합니다. 특정 호스트/호스팅 공급자에 대한 설정에 대해서는 도움을 드릴 수 없지만 인터넷을 검색하면 도움이 될 가능성이 높습니다.
일반적으로 1080p 이상의 비디오에는 오디오가 인코딩되지 않습니다. 오디오는 별도로 다운로드하고 인코딩 라이브러리를 통해 병합해야 합니다. ffmpeg
는 가장 널리 사용되는 도구이며, 많은 Node.js 모듈을 사용할 수 있습니다. ytdl.getInfo
에서 반환된 format
개체를 사용하여 필요에 맞게 결합할 특정 스트림을 다운로드합니다. 이에 대한 예는 example/ffmpeg.js를 참조하세요.
YouTube는 항상 웹사이트를 업데이트하므로 이것이 작동하지 않는 경우는 그리 드물지 않습니다. 최신 버전을 사용 중이고 문제가 해결되지 않으면 언제든지 문제를 제기해 주세요. 동일한 오류가 발생하는 것이 없는지 확인하세요.
test/irl-test.js
에서 테스트를 실행하여 이것이 실제로 ytdl-core의 문제인지 확인하세요.
npm run test:irl
이 테스트는 조롱되지 않으며 몇 가지 비디오 다운로드를 시작하려고 시도합니다. 이것이 실패하면 디버깅할 시간입니다. 발생한 오류가 서명 해독인 경우 lib/sig.js
확인하세요. 그렇지 않으면 lib/info.js
내에서 오류가 발생할 가능성이 높습니다.
npm 설치 ytdl-core@latest
또는 Yarn 사용자의 경우:
원사 추가 ytdl-core@latest
최신 수정 사항을 유지하려면 최신 버전의 ytdl-core를 설치하고 있는지 확인하세요.
ytdl-core-discord 또는 discord-player와 같은 ytdl-core를 사용하는 봇이나 앱을 사용하는 경우 이전 버전에 종속될 수 있습니다. ytdl-core 버전을 업데이트하려면 해당 라이브러리가 package.json
파일을 업데이트해야 합니다. 단순히 프로젝트의 package.json
에서 버전을 변경할 수는 없으며 앱은 여전히 자체 이전 버전의 ytdl-core를 사용합니다.
저장소에서 ytdl-core를 업데이트하는 활성 풀 요청이 이미 있는지 확인하세요. 그렇지 않은 경우 ytdl-core를 업데이트하도록 요청하는 문제를 열거나, 프로젝트를 포크하고 업데이트된 버전으로 끌어오기 요청을 제출하는 것이 더 좋습니다.
풀 요청이 병합될 때까지 기다리는 동안 package.json
에서 해당 분기를 가리킬 수 있습니다.
"ytdl-core-discord": "amishshah/ytdl-core-discord#dependentabot/npm_and_yarn/ytdl-core-2.0.1"
오래된 버전의 ytdl-core를 사용하는 문제가 너무 널리 퍼져서 이제 ytdl-core는 런타임 및 12시간마다 업데이트를 확인합니다. 업데이트를 찾으면 업데이트를 알리는 경고를 콘솔에 인쇄합니다. 본 라이브러리의 특성상 유튜브는 계속 업데이트되므로 항상 최신 버전을 사용하는 것이 중요합니다.
이 업데이트 확인을 비활성화하려면 YTDL_NO_UPDATE
env 변수를 제공하면 됩니다.
env YTDL_NO_UPDATE=1 node myapp.js
ytdl - 이에 대한 cli 래퍼입니다.
pully - 고품질 형식을 목표로 하는 또 다른 cli 래퍼입니다.
ytsr - YouTube 동영상 검색결과.
ytpl - YouTube 재생목록 및 채널 확인자입니다.
테스트는 mocha로 작성됩니다.
npm 테스트