重要
このリポジトリでのアクティブな開発は、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 * as ytdl from 'ytdl-core'; --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
。
ライブビデオの場合、これは Unix タイムスタンプまたは Date オブジェクトも受け入れ、デフォルトは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
- miniget が呼び出されるリクエスト オプションにマージするものheaders
など)。
requestCallback
- メタ情報の取得中に使用されるミニゲット リクエスト ストリーム オブジェクトを受け取るコールバック関数を提供します。
lang
- 言語を表す 2 文字の記号。デフォルトはen
です。
ytdl.getInfo
関数を使用してビデオからメタデータを受信したら、その情報を他のオプションとともにこの関数に渡すことができます。
自分で形式を選択したい場合に使用できます。一致する形式が見つからない場合は、エラーをスローします。
options
次のものを指定できます
quality
- ダウンロードするビデオの品質。 itag 値、itag 値のリスト、または次の文字列の 1 つを指定できます: 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
含む形式をフィルタするには video、ビデオを含み追加のオーディオ トラックを含まない形式にはvideoonly
指定できます。 audio
またはaudioonly
にすることもできます。利用可能な各形式で呼び出されるフィルタリング関数を指定できます。この関数には最初の引数としてformat
オブジェクトが与えられ、そのフォーマットが望ましい場合は true を返す必要があります。
// カスタム function.ytdl(url, { filter: format => format.container === 'mp4' }) を使用した例
format
- 主に特定のビデオまたはオーディオ ストリームをダウンロードするために使用されます。これは、 getInfo
から返される特定のformat
オブジェクトにすることができます。
形式が明示的に提供されているため、このオプションを指定すると、 filter
とquality
オプションが無視されます。
// ビデオ形式を選択する例。let info = await ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, {quality: '134' });console.log('Format found!',形式);
一部の形式のみを使用したい場合は、上記のfilter
オプションを使用できます。
// 形式を音声のみにフィルタリングする例。let info = await 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 は以下に該当する動画をダウンロードできません
地域的に制限されている (プロキシが必要)
プライベート (アクセス権がある場合は Cookie が必要です)
レンタル (アクセスできる場合は Cookie が必要です)
YouTube Premium コンテンツ (アクセス権がある場合は Cookie が必要です)
現在、HLS ライブストリームのみがサポートされています。他の形式は ytdl.chooseFormats で除外されます
生成されたダウンロード リンクは 6 時間有効で、同じ IP アドレスからのみダウンロードできます。
リクエストが多すぎると、YouTube がブロックする可能性があります。これにより、リクエストは HTTP-StatusCode 429 で拒否されます。次の手順が役立つ場合があります。
ytdl-core を最新バージョンに更新する
プロキシを使用する (ここで例を見つけることができます)
(IPv6-) アドレスをローテーションすることでプロキシ アイデアを拡張する
これについて詳しくは、これをお読みください
Cookie を使用する (ここで例を見つけることができます)
これを有効にするには、まず現在のレート制限が期限切れになるまで待つ必要があります
しばらくお待ちください(通常は数日以内に治ります)
リクエストが集中するタスクの場合、リクエストを複数の送信元 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 install 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#dependabot/npm_and_yarn/ytdl-core-2.0.1"
ytdl-core の古いバージョンを使用する問題が非常に蔓延したため、ytdl-core は実行時および 12 時間ごとに更新をチェックするようになりました。アップデートが見つかった場合は、アップデートを促す警告がコンソールに出力されます。このライブラリの性質上、YouTube は継続的に更新されるため、常に最新バージョンを使用することが重要です。
この更新チェックを無効にしたい場合は、 YTDL_NO_UPDATE
環境変数を指定することで無効にできます。
env YTDL_NO_UPDATE=1 node myapp.js
ytdl - これの cli ラッパー。
pully - これのもう 1 つの cli ラッパーは、高品質フォーマットを目的としています。
ytsr - YouTube の動画検索結果。
ytpl - YouTube プレイリストおよびチャンネル リゾルバー。
テストは mocha で書かれています
npmテスト