Este repositorio contiene un script que he usado para descargar videos en vivo de LinkedIn.
Para usar el script, modifique las variables PUBLIC_URL
y VIDEO_ID
en linkedin.sh
.
Recientemente di una charla en una reunión comunitaria donde estaban usando el nuevo y elegante LinkedIn Live para transmitir el evento. Después del evento, decidí que quería una copia del video, pero LinkedIn no parecía estar de acuerdo conmigo en que debería tener una copia de mi video. Además, ninguno de los sitios web existentes de descargas de video funcionó, y ninguno de los consejos dados por otras personas en línea también lo hizo. Aparentemente, LinkedIn había cambiado la forma en que hicieron videos. Entonces. La pestaña de red era!
Esta breve publicación documenta cómo logré descargar un video de LinkedIn con un poco de piratería en los scripts de Chrome Console y Shell. Debe sentirse cómodo con la línea de comandos para que las cosas funcionen.
Así que ha visto una publicación de LinkedIn con un video que desea disponible localmente. Comenzamos haciendo clic en el video para que se abra en modo teatro. Para mi video, la URL parecía:
https://www.linkedin.com/video/live/urn:li:ugcPost:%UGC_POST_ID%/
Una vez que la página está cargada, no presione el juego : abra la consola Chrome y vaya a la pestaña de red. Ahora presione el juego y busque en la pestaña de red para obtener una llamada manifest(format=m3u8-aapl-v3)
. Esta llamada parece estar haciendo una solicitud para recuperar las posibles variantes del video y la respuesta debe parecer similar a:
#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)
El manifiesto anterior se usa para determinar qué QualityLevel
debe transmitirse cuando el BANDWIDTH
está por encima de cierta tasa. Veremos cómo se usa eso más adelante.
La siguiente solicitud de interés que debe venir poco después de que se complete la solicitud anterior debe tener el Nombre Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
. Al hacer clic en ella y ir a la pestaña Respuesta, debería ver un archivo enorme que consiste en líneas como estas:
...
#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)
...
Aparentemente, estos definen la lista de fragmentos de video que se transmiten a través de sus navegadores para formar el video completo.
Mirando ligeramente por debajo de la solicitud anterior, encontrará llamadas de red llamadas Fragments(video=%FRAGMENT_ID%,format=m3u8-aapl-v3,audiotrack=audio_und)
. Bueno, ¿eso no parece familiar?
Consulte la URL completa de la llamada (haga clic derecho en la fila, copie como curl) de esas solicitudes y debe encontrar que se asemeja al siguiente formato:
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)
Observe los niveles y Fragments
QualityLevels
. Esta es la llamada que recupera los fragmentos de datos que se recopilan para formar su video.
Así que ahora sabemos cómo se transmite el video, podemos replicar esto mínimamente por:
manifest...
, tenga en cuenta el QualityLevel
Manifest...
, copie la URL como un comando curlQualityLevel
del paso 2, modifique la URL en la solicitud de curl para que sea de la más alta calidadmanifest
.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 ;