Penting
Pengembangan aktif pada repositori ini telah dihentikan sementara sejak 14-07-2023. Meskipun mungkin masih berfungsi untuk beberapa skenario, perlu diketahui bahwa dukungan kini hanya ditangani oleh komunitas, dan PR saat ini tidak digabungkan ke dalam repo. Untuk pembaruan berkelanjutan, kami mendorong Anda untuk menjelajahi fork seperti @distube/ytdl-core. Kami mungkin meninjau kembali perkembangan di masa depan. Terima kasih atas minat dan dukungan jangka panjang Anda!
Salam Hormat TFAN, 13-08-2024
Modul pengunduhan YouTube lainnya. Ditulis hanya dengan Javascript dan antarmuka streaming yang ramah node.
Anda dapat menghubungi kami untuk mendapatkan dukungan di server obrolan kami
const fs = memerlukan('fs');const ytdl = memerlukan('ytdl-core');// TypeScript: impor ytdl dari 'ytdl-core'; dengan --esModuleInterop// TypeScript: import * as ytdl from 'ytdl-core'; dengan --allowSyntheticDefaultImports// TypeScript: import ytdl = require('ytdl-core'); dengan tidak satupun dari yang di atasytdl('http://www.youtube.com/watch?v=aqz-KE-bpKQ') .pipe(fs.createWriteStream('video.mp4'));
Mencoba mengunduh video dari url yang diberikan. Mengembalikan aliran yang dapat dibaca. options
dapat memiliki yang berikut ini, selain opsi getInfo()
dan opsi chooseFormat()
.
range
- Rentang byte dalam bentuk {start: INT, end: INT}
yang menentukan bagian file yang akan diunduh, yaitu {start: 10355705, end: 12452856}. Tidak didukung pada format tersegmentasi (DASH MPD, m3u8).
Ini akan mengunduh sebagian file, dan bukan video yang disambung secara terpisah.
begin
- Jam berapa video akan dimulai. Mendukung format 00:00:00.000
, 0ms, 0s, 0m, 0h
, atau jumlah milidetik. Contoh: 1:30
, 05:10.123
, 10m30s
.
Untuk video langsung, ini juga menerima stempel waktu unix atau objek Tanggal, dan defaultnya adalah Date.now()
.
Opsi ini tidak terlalu dapat diandalkan untuk video non-langsung, lihat #129 dan #219.
liveBuffer
- Berapa banyak waktu buffer yang digunakan untuk video langsung dalam milidetik. Standarnya adalah 20000
.
highWaterMark
- Berapa banyak unduhan video yang akan di-buffer ke dalam memori. Lihat dokumen node untuk mengetahui lebih lanjut. Defaultnya adalah 512KB.
dlChunkSize
- Jika format yang dipilih adalah video saja atau audio saja, unduhan dipisahkan menjadi beberapa bagian untuk menghindari pembatasan. Opsi ini menentukan ukuran setiap potongan dalam byte. Menyetelnya ke 0 akan menonaktifkan chunking. Defaultnya adalah 10 MB.
IPv6Block
- Blok IPv6 untuk diputar, sebuah alternatif untuk menggunakan proxy. Baca selengkapnya. Defaultnya adalah undefined
.
ytdl.videoInfo
- Info.
ytdl.videoFormat
- Format Video.
Dipancarkan saat info
video diambil, bersama dengan format yang dipilih untuk diunduh.
number
- Panjang potongan dalam byte atau nomor segmen.
number
- Total byte atau segmen yang diunduh.
number
- Total byte atau segmen.
Dipancarkan setiap kali potongan baru diterima. Melewati nilai yang menjelaskan kemajuan pengunduhan.
Semua acara miniget diteruskan dan dapat didengarkan dari aliran kembali.
Panggilan untuk membatalkan dan berhenti mengunduh video.
Gunakan ini jika Anda hanya ingin mendapatkan metainfo dari sebuah video.
Mendapat metainfo dari video. Termasuk format tambahan, dan siap mengunduh URL yang diuraikan. Inilah yang digunakan fungsi ytdl()
secara internal.
options
dapat memiliki yang berikut ini
requestOptions
- Apa pun untuk digabungkan ke dalam opsi permintaan yang digunakan untuk memanggil miniget, seperti headers
.
requestCallback
- Menyediakan fungsi panggilan balik yang menerima objek aliran permintaan miniget yang digunakan saat mengambil metainfo.
lang
- Simbol 2 karakter suatu bahasa. Standarnya adalah en
.
Setelah Anda menerima metadata dari video dengan fungsi ytdl.getInfo
, Anda dapat meneruskan informasi tersebut beserta opsi lain ke fungsi ini.
Dapat digunakan jika Anda ingin memilih sendiri formatnya. Memunculkan Kesalahan jika gagal menemukan format yang cocok.
options
dapat memiliki yang berikut ini
quality
- Kualitas video untuk diunduh. Dapat berupa nilai itag, daftar nilai itag, atau salah satu string berikut: highest
/ lowest
/ highestaudio
/ lowestaudio
/ highestvideo
/ lowestvideo
. highestaudio
/ lowestaudio
mencoba meminimalkan bitrate video untuk format audio yang sama baiknya, sedangkan highestvideo
/ lowestvideo
mencoba meminimalkan audio masing-masing. Defaultnya adalah highest
, yang lebih memilih format dengan video dan audio.
Format video pada umumnya akan diurutkan dengan cara berikut menggunakan 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
format 18 pada 360p akan dipilih pertama karena ini adalah format kualitas tertinggi dengan video dan audio. Jika Anda menginginkan format kualitas lebih tinggi dengan video dan audio, lihat bagian menangani streaming terpisah.
filter
- Digunakan untuk memfilter daftar format yang dapat dipilih. Dapat berupa audioandvideo
atau videoandaudio
untuk memfilter format yang berisi video dan audio, video
untuk memfilter format yang berisi video, atau videoonly
untuk format yang berisi video dan tidak ada track audio tambahan. Bisa juga berupa audio
atau audioonly
. Anda dapat memberikan fungsi pemfilteran yang dipanggil dengan setiap format yang tersedia. Fungsi ini diberikan objek format
sebagai argumen pertamanya, dan akan mengembalikan nilai true jika formatnya lebih disukai.
// Contoh dengan custom function.ytdl(url, { filter: format => format.container === 'mp4' })
format
- Terutama digunakan untuk mengunduh aliran video atau audio tertentu. Ini bisa berupa objek format
tertentu yang dikembalikan dari getInfo
.
Menyediakan opsi ini akan mengabaikan opsi filter
dan quality
karena formatnya disediakan secara eksplisit.
// Contoh pemilihan format video.let info = menunggu ytdl.getInfo(videoID);let format = ytdl.chooseFormat(info.formats, { quality: '134' });console.log('Format ditemukan!', format);
Jika Anda hanya ingin bekerja dengan beberapa format, Anda dapat menggunakan opsi filter
di atas.
// Contoh pemfilteran format ke audio saja.let info = menunggu ytdl.getInfo(videoID);let audioFormats = ytdl.filterFormats(info.formats, 'audioonly');console.log('Format hanya dengan audio: ' + audioFormats.length);
Mengembalikan nilai benar jika string yang diberikan memenuhi format ID YouTube.
Mengembalikan nilai benar jika dapat menguraikan ID video yang valid.
Mengembalikan ID video dari URL YouTube. Memunculkan Kesalahan jika gagal mengurai ID.
Sama seperti ytdl.getURLVideoID()
di atas, tetapi dapat dipanggil dengan ID video secara langsung, dalam hal ini ia akan mengembalikannya. Inilah yang digunakan ytdl secara internal. Memunculkan Kesalahan jika gagal mengurai ID.
String versi diambil langsung dari package.json.
ytdl tidak dapat mengunduh video yang termasuk dalam kategori berikut
Dibatasi secara regional (memerlukan proxy)
Pribadi (jika Anda memiliki akses, memerlukan cookie)
Sewa (jika Anda memiliki akses, memerlukan cookie)
Konten YouTube Premium (jika Anda memiliki akses, memerlukan cookie)
Hanya HLS Livestream yang saat ini didukung. Format lain akan disaring di ytdl.chooseFormats
Tautan unduhan yang dihasilkan berlaku selama 6 jam, dan hanya dapat diunduh dari alamat IP yang sama.
Jika melakukan terlalu banyak permintaan, YouTube mungkin memblokir. Hal ini akan mengakibatkan permintaan Anda ditolak dengan HTTP-StatusCode 429. Langkah-langkah berikut mungkin dapat membantu Anda:
Perbarui ytdl-core ke versi terbaru
Gunakan proxy (Anda dapat menemukan contohnya di sini)
Perluas Ide Proxy dengan memutar (IPv6-)Alamat
baca ini untuk informasi lebih lanjut tentang ini
Gunakan cookie (Anda dapat menemukan contohnya di sini)
agar hal ini berlaku, Anda harus terlebih dahulu menunggu hingga batas tarif saat ini berakhir
Tunggu (biasanya hilang dalam beberapa hari)
Untuk tugas yang membutuhkan banyak permintaan, mungkin berguna untuk menyebarkan permintaan Anda ke beberapa Alamat IP sumber. Mengubah IP sumber yang Anda gunakan mirip dengan menggunakan proxy, hanya saja tanpa melewati batasan seperti kunci wilayah. Lebih banyak Alamat IP menghasilkan lebih sedikit permintaan per IP dan karenanya meningkatkan batas tarif Anda. Karena Alamat IPv4 adalah Sumber Daya terbatas, kami menyarankan untuk menggunakan IPv6.
Menggunakan blok IPv6 pada dasarnya berarti memiliki jutaan alamat IPv6 sesuai permintaan Anda. Dalam blok /64 IPv6 (yang biasanya merupakan Blok yang diberikan kepada satu Rumah Tangga), terdapat 18,446,744,073,709,551,616 alamat IPv6 unik. Ini memungkinkan Anda membuat setiap permintaan dengan alamat IPv6 berbeda.
Meskipun menggunakan Blok IP tidak membantu terhadap batas kecepatan, Anda harus mengatur sistem host Anda untuk menerima lalu lintas http dari setiap pesan dalam Blok IP. Kami tidak dapat membantu Anda dengan pengaturan untuk host/penyedia hosting tertentu, tetapi mencari di internet kemungkinan besar bisa.
Biasanya video 1080p atau lebih baik tidak memiliki audio yang dikodekan dengannya. Audio harus diunduh secara terpisah dan digabungkan melalui perpustakaan pengkodean. ffmpeg
adalah alat yang paling banyak digunakan, dengan banyak modul Node.js tersedia. Gunakan objek format
yang dikembalikan dari ytdl.getInfo
untuk mengunduh aliran tertentu untuk digabungkan agar sesuai dengan kebutuhan Anda. Lihat example/ffmpeg.js untuk contoh melakukan hal ini.
YouTube memperbarui situs webnya setiap saat, tidak jarang situs ini berhenti berfungsi. Jika tidak berhasil dan Anda menggunakan versi terbaru, jangan ragu untuk membuka masalah. Pastikan untuk memeriksa apakah belum ada yang mengalami kesalahan yang sama.
Jalankan pengujian di test/irl-test.js
untuk memastikan ini benar-benar masalah dengan ytdl-core.
npm run test:irl
Tes ini tidak diejek, mereka mencoba untuk mulai mengunduh beberapa video. Jika ini gagal, maka saatnya untuk melakukan debug. Jika kesalahan yang Anda dapatkan adalah penguraian tanda tangan, periksa lib/sig.js
. Jika tidak, kesalahan mungkin terjadi pada lib/info.js
.
npm instal ytdl-core@terbaru
Atau untuk pengguna Benang:
benang tambahkan ytdl-core@latest
Pastikan Anda menginstal ytdl-core versi terbaru untuk mengikuti perbaikan terbaru.
Jika Anda menggunakan bot atau aplikasi yang menggunakan ytdl-core seperti ytdl-core-discord atau discord-player, itu mungkin bergantung pada versi yang lebih lama. Untuk memperbarui versi ytdl-core, perpustakaan tersebut harus memperbarui file package.json
-nya, Anda tidak bisa begitu saja mengubah versi pada package.json
proyek Anda, aplikasi akan tetap menggunakan versi ytdl-core miliknya yang lebih lama.
Lihat di repo mereka untuk melihat apakah mereka sudah memiliki permintaan penarikan aktif yang memperbarui ytdl-core. Jika tidak, buka masalah yang meminta mereka memperbarui ytdl-core, atau lebih baik lagi, potong proyek dan kirimkan permintaan penarikan dengan versi yang diperbarui.
Sementara Anda menunggu permintaan tarik digabungkan, Anda dapat menunjuk ke cabangnya di package.json
Anda
"ytdl-core-discord": "amishshah/ytdl-core-discord#dependabot/npm_and_yarn/ytdl-core-2.0.1"
Masalah penggunaan ytdl-core versi lama menjadi begitu umum, sehingga ytdl-core sekarang memeriksa pembaruan pada waktu proses, dan setiap 12 jam. Jika menemukan pembaruan, ia akan mencetak peringatan ke konsol yang menyarankan Anda untuk memperbarui. Karena sifat perpustakaan ini, penting untuk selalu menggunakan versi terbaru karena YouTube terus melakukan pembaruan.
Jika Anda ingin menonaktifkan pemeriksaan pembaruan ini, Anda dapat melakukannya dengan menyediakan variabel env YTDL_NO_UPDATE
.
env YTDL_NO_UPDATE=1 node myapp.js
ytdl - Pembungkus cli ini.
pully - Pembungkus cli lain yang ditujukan untuk format kualitas tinggi.
ytsr - Hasil pencarian video YouTube.
ytpl - Daftar putar YouTube dan pemecah saluran.
Tes ditulis dengan moka
tes npm