Bagaimana cara semua layanan "Simpan video dari YouTube" ini berfungsi?

62

Maksud saya, bagaimana cara kerjanya, secara umum? Bagaimana mereka menerima tautan ke aliran video itu sendiri (bukan hanya halaman yang berisi pemutar Flash)?

Saya melakukan pencarian di web tetapi tidak dapat menemukan sesuatu yang berguna (semua tautan menunjuk ke layanan tersebut, tetapi tidak satupun dari mereka yang tahu bagaimana mereka benar-benar diterapkan).

PaulD
sumber

Jawaban:

51

Ada pengunduh baris perintah open source yang sangat populer yang disebut youtube-dl, yang melakukan hal itu. Ini mengambil tautan file video dan audio yang sebenarnya dari tautan YouTube yang diberikan - atau situs video web populer lainnya seperti Vimeo, Yahoo! Video, uStream, dll.

Untuk melihat bagaimana itu dilakukan, lihat ke ekstraktor YouTube . Terlalu banyak untuk ditampilkan di sini. Ekstraktor lain ada untuk situs yang lebih sederhana . Steven Penny juga memiliki pengunduh JavaScript sederhana untuk YouTube, yang sedikit lebih mudah.

Tetapi pada dasarnya, untuk pemutar video Flash, itu harus diinisialisasi dan dikonfigurasi melalui beberapa JavaScript. Secara sederhana, pemutar objek Flash akan menerima URL aliran video untuk dimuat.

Untuk menemukan aliran video, Anda harus mem-parsing kode HTML dan JS dari halaman video untuk menemukan kode inisialisasi yang relevan, dan kemudian dari sana mencoba menemukan tautan ke file MP4 yang sebenarnya. Mungkin ada di sana dalam plaintext, tetapi bisa juga dibuat dengan cepat dengan beberapa token unduhan tertentu. Seringkali, JavaScript dikaburkan untuk membuatnya lebih sulit untuk merekayasa ulang itu. Atau informasi video mungkin terkandung dalam file XML yang dimuat secara asinkron oleh JS.

Untuk video unduhan progresif HTML5, file sumber yang sebenarnya biasanya disebutkan secara langsung di sourceanak videotag, jadi jika Anda ingin mencari halaman mp4atau serupa. Misalnya di acara berita Jerman Tagesschau 100 , Anda akan menemukan:

<source src="http://media.tagesschau.de/video/2014/0626/TV-20140626-1649-5801.webl.h264.mp4" type="video/mp4">

Untuk teknologi pemutaran yang lebih maju seperti MPEG DASH atau HTTP Live Streaming (HLS) Apple, Anda harus mengurai file meta-informasi untuk mendapatkan aliran video yang sebenarnya. File meta ( .mpdmisalnya dalam DASH, dan .m3u8untuk HLS) akan berisi tautan ke segmen video dan audio, yang nantinya harus Anda gabungkan untuk mendapatkan file yang dapat diputar.

Tidak ada solusi umum untuk ini. Ini membutuhkan inspeksi dan debugging yang cermat dari situs target.

slhck
sumber
3
Satu pertanyaan, apa kebijakan Youtube / Google dalam hal ini? Apakah mereka setuju dengan ini, atau tidak terlalu banyak?
JMK
31
Persyaratan Layanan YouTube di §5.1.L melarang konsumsi konten mereka melalui cara lain selain streaming, jadi secara teoritis tidak diizinkan. Dalam praktiknya, mereka tidak akan bisa memaksakan itu. Setiap pengunduh dapat mensimulasikan bahwa itu hanya streaming.
slhck
2
@ Svenvenenny apakah Anda memiliki versi yang tidak diperkecil itu?
TankorSmash
5
@ slhck Flash juga dapat membuat permintaan HTTP dengan sendirinya. Sebagai gantinya, ia menggunakan mesin HTTP browser. Jika Flash sendiri yang membuat permintaan, mereka tidak akan "terlihat" oleh browser. Tentu akan bagus untuk pengiklan. ;)
Daniel B
3
@lhck mereka tidak bisa menegakkannya secara terprogram , tetapi jika mereka mengeluarkan tim pengacara mereka, bisakah mereka menegakkannya secara hukum ?
Cruncher
35

Bookmarklet YouTube

Ini adalah bagaimana saya melakukannya dengan JavaScript

Mulai dengan ytplayer.config.argsobjek. Ini berisi semua URL untuk video. Itu dipecah menjadi

url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts              // DASH: contains video or audio stream

Masing-masing adalah array yang dipisahkan koma dari apa yang saya sebut "objek streaming". Setiap "aliran objek" akan berisi nilai-nilai seperti ini

url  // direct HTTP link to a video
itag // code specifying the quality
s    // signature, security measure to counter downloading

Setiap URL akan disandikan sehingga Anda harus mendekodekannya. Sekarang bagian yang sulit.

YouTube memiliki setidaknya 3 tingkat keamanan untuk video mereka

unsecured // as expected, you can download these with just the unencoded URL
s         // see below
RTMPE     // uses "rtmpe://" protocol, no known method for these

Video RTMPE biasanya digunakan pada film panjang penuh resmi, dan dilindungi dengan SWF Verification Type 2. Ini sudah ada sejak 2011 dan belum direkayasa balik.

Jenis "s" video adalah yang paling sulit yang sebenarnya dapat diunduh. Anda biasanya akan melihat ini di video VEVO dan sejenisnya. Mereka mulai dengan tanda tangan seperti

AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5

Kemudian tanda tangan diacak dengan fungsi seperti ini

function mo(a) {
  a = a.split("");
  a = lo.rw(a, 1);
  a = lo.rw(a, 32);
  a = lo.IC(a, 1);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 44);
  return a.join("")
}

Fungsi ini dinamis, biasanya berubah setiap hari. Untuk membuatnya lebih sulit, fungsi dihosting di URL seperti

http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js

ini memperkenalkan masalah kebijakan asal yang sama . Pada dasarnya, Anda tidak dapat mengunduh file ini www.youtube.comkarena mereka adalah domain yang berbeda. Solusi dari masalah ini adalah CORS . Dengan CORS, s.ytimg.combisa menambahkan tajuk ini

Access-Control-Allow-Origin: http://www.youtube.com

dan itu akan memungkinkan JavaScript untuk mengunduh www.youtube.com. Tentu saja mereka tidak melakukan ini. Solusi untuk solusi ini adalah dengan menggunakan proxy CORS. Ini adalah proksi yang merespons dengan tajuk berikut untuk semua permintaan

Access-Control-Allow-Origin: *

Jadi, sekarang Anda telah memproksi file JS Anda, dan menggunakan fungsi untuk mengacak tanda tangan, Anda dapat menggunakannya dalam querystring untuk mengunduh video.

Steven Penny
sumber
1
Apakah Anda tahu (untuk pemutaran DASH) bagaimana pemutar YouTube menentukan rentang byte yang diminta dari representasi media? File MPD hanya mencantumkan segmen.
slhck
2
Tidak persis .. Ada satu file untuk video dan audio, tetapi YouTube meminta mereka dengan rentang byte, dalam beberapa potongan. Jika Anda beralih ke kualitas lain, itu akan mengubah rentang byte juga. Hanya ingin tahu bagaimana pemain tahu detik mana yang sesuai dengan byte yang diimbangi.
slhck
1
Bisakah Anda memberikan contoh svideo RTMPEjenis dan jenis video?
Chloe
@SurajJain di sini adalah halaman baru - saya akan menulis ulang jawaban ini karena saya menggunakan metode yang berbeda sekarang github.com/svnpenn/umber/blob/master/bmklet/youtube/download.js
Steven Penny
Tautan memberi saya 404. Sudahkah Anda menghapus repo?
darksoulsong
1

Jawaban saya: mulai 22 Januari 2019, menggunakan metode ini dapat ditangkap jika Anda mencoba memotong tanpa menghubungkan informasi pengguna Anda juga.

Mengapa? karena saya pengguna baru untuk platform ini, saya tidak bisa berkomentar untuk aturan yang ditentukan oleh @ Daniel-B . Menurut ToS baru (dalam bahasa Jerman seperti saya di Jerman; tolong terjemahkan) untuk YouTube di bawah $ 6,1 G $:

Anda menyetujui sistem otomatis apa pun (termasuk - tetapi tidak terbatas pada - robot, spider, atau pembaca offline) untuk menggunakannya di situs web mengakses sedemikian rupa sehingga lebih banyak permintaan ke server dalam waktu tertentu yang diarahkan YouTube agar dapat diproduksi secara wajar sebagai manusia dalam periode waktu yang sama menggunakan peramban web standar yang tidak dimodifikasi untuk umum;

Sekarang mereka dapat mengetahui durasi waktu untuk setiap permintaan dan dapat melacak jika Anda melanggar. Bagaimana mungkin sekarang, mengingat skenario ini dan alamat IP eksternal Anda akan diketahui bahkan jika Anda menggunakan VPN untuk melindungi diri sendiri tanpa menghubungkan detail pengguna ke layanan apa pun.

pengguna103720
sumber
1
Selamat datang untuk pelancong dari masa depan ... Tidak jelas bagaimana ini menjawab pertanyaan penulis
Ramhound
Jika Anda ingin memperingatkan penulis, sehubungan dengan jawaban tertentu, Anda harus mengirim komentar dan menurunkan setiap jawaban yang menurut Anda tidak membantu karena kemungkinan masalah hukum yang dapat terjadi. Jawaban ini berbunyi lebih seperti apa yang akan Anda temukan di posting forum diskusi, dan Super User, bukan forum diskusi
Ramhound