Repositori ini berisi skrip yang saya gunakan untuk mengunduh video live LinkedIn.
Untuk menggunakan skrip, ubah variabel PUBLIC_URL
dan VIDEO_ID
di linkedin.sh
.
Saya memberikan ceramah baru -baru ini di pertemuan komunitas di mana mereka menggunakan LinkedIn Live baru yang mewah untuk streaming acara tersebut. Pasca-acara, saya memutuskan ingin salinan video tetapi LinkedIn sepertinya tidak setuju dengan saya bahwa saya harus memiliki salinan video saya. Juga, tidak ada situs web pengunduh video yang ada yang berhasil, dan tidak ada saran yang diberikan oleh orang lain secara online juga. Rupanya LinkedIn telah mengubah cara mereka melakukan video. Jadi. Tab jaringan itu!
Posting pendek ini mendokumentasikan bagaimana saya berhasil mengunduh video LinkedIn dengan sedikit peretasan pada konsol chrome dan skrip shell. Anda harus merasa nyaman dengan baris perintah agar segala sesuatunya berolahraga.
Jadi, Anda telah melihat posting LinkedIn dengan video yang Anda inginkan secara lokal tersedia. Kami mulai dengan mengklik video sehingga terbuka dalam mode seperti teater. Untuk video saya, URL tampak seperti:
https://www.linkedin.com/video/live/urn:li:ugcPost:%UGC_POST_ID%/
Setelah halaman dimuat, jangan tekan Play - buka konsol Chrome dan buka tab Jaringan. Sekarang tekan Play dan lihat di tab Jaringan untuk panggilan manifest(format=m3u8-aapl-v3)
. Panggilan ini tampaknya membuat permintaan untuk mengambil varian yang mungkin dari video dan responsnya harus terlihat mirip dengan:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=351536,RESOLUTION=340x192,CODECS="avc1.64000d,mp4a.40.5"
QualityLevels(200000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=709236,RESOLUTION=384x216,CODECS="avc1.640015,mp4a.40.5"
QualityLevels(550000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=1015836,RESOLUTION=512x288,CODECS="avc1.640015,mp4a.40.5"
QualityLevels(850000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=1526836,RESOLUTION=704x396,CODECS="avc1.64001e,mp4a.40.5"
QualityLevels(1350000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=2395536,RESOLUTION=960x540,CODECS="avc1.64001f,mp4a.40.5"
QualityLevels(2200000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=3724136,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.5"
QualityLevels(3500000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=138976,CODECS="mp4a.40.5"
QualityLevels(128000)/Manifest(audio_und,format=m3u8-aapl-v3)
Manifes di atas digunakan untuk menentukan QualityLevel
apa yang harus dialirkan ketika BANDWIDTH
berada di atas tingkat tertentu. Kita akan lihat bagaimana itu digunakan nanti.
Permintaan minat berikutnya yang harus datang tak lama setelah permintaan di atas selesai harus memiliki nama Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
. Mengkliknya dan pergi ke tab Respons, Anda akan melihat file besar yang terdiri dari baris seperti ini:
...
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_1%,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_2%,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_3%,format=m3u8-aapl-v3,audiotrack=audio_und)
...
Ini tampaknya menentukan daftar fragmen video yang mengalir melalui browser Anda untuk membentuk video lengkap.
Melihat sedikit di bawah permintaan di atas, Anda akan menemukan panggilan jaringan bernama Fragments(video=%FRAGMENT_ID%,format=m3u8-aapl-v3,audiotrack=audio_und)
. Nah, bukankah itu terlihat akrab?
Lihatlah URL lengkap panggilan (klik kanan pada baris, salin sebagai curl) dari permintaan tersebut dan Anda harus menemukannya menyerupai format berikut:
https://streamwus2-livectorprodmedia11-usw22.licdn.com/%UUID%/%SOME_VIDEO_ID%-livemanifest.ism/QualityLevels(2200000)/Fragments(video=%FRAGMENT_ID%,format=m3u8-aapl-v3,audiotrack=audio_und)
Perhatikan QualityLevels
dan Fragments
. Ini adalah panggilan yang mengambil fragmen data yang disusun untuk membentuk video Anda.
Jadi kita sekarang tahu bagaimana videonya dialirkan, kita dapat mereplikasi ini minimal dengan:
manifest...
, perhatikan tingkat QualityLevel
Manifest...
, salin URL sebagai perintah curlQualityLevel
dari langkah 2, memodifikasi URL dalam permintaan curl sehingga kualitas tertinggimanifest
.cat ./manifest | grep -v '#' | cut -f 2 -d '=' | cut -f 1 -d ',' > ./fragment_ids
touch video.mp4
while read FRAGMENT_ID ; do
echo ' processing ${FRAGMENT_ID} ' ;
curl ... >> video.mp4
done < ./fragment_ids ;