Este software es para mi uso personal y no soy responsable de la forma en que usted lo utilizará. ¡Así que no te metas en problemas, haz frascos y no guerras!
Una de las actividades de mi trabajo consiste en difundir Redis, y esto también incluye videos y seminarios web en vivo. Recientemente estoy haciendo directos en LinkedIn, transmitiendo mis directos desde Zoom, y no todo el tiempo me acuerdo de pulsar el botón "Grabar".
Sin embargo, y afortunadamente, LinkedIn mantiene la grabación de mi directo como "Grabado previamente en directo", para poder verlo más tarde. No tengo idea de la retención que LinkedIn proporciona para esos videos, pero estoy seguro de que no proporciona una forma de descargarlos.
Así que busqué en Google y no encontré nada serio. Descarga de YouTube, descarga de Pinterest, descarga de Facebook, pero todos los descargadores relacionados con LinkedIn eran simplemente falsos.
Por lo tanto, ¡necesito crear mi propio descargador de videos de LinkedIn! ?
Ahora, la idea era... No creo que encuentre un enlace (src o href) a algún video en la fuente 1 de algún tipo de formato (mp4, webm, vid mkv, avi, mov, etc.) , pero sí creo que encontraré algo relacionado con el vídeo streaming... pero no en la fuente 1 , seguramente a nivel de red.
Entonces, abrí Chrome y su barra DevTools, seleccioné el panel Red y luego escribí (pegué) la URL de mi evento de video de LinkedIn en la barra de direcciones y presioné Enter.
Y eso es lo que tengo.
Ahora necesito encontrar algo que me suene con respecto a vídeo/transmisión/fragmentos/binario/lo que sea... así que comencé a desplazarme por el panel Red y después de unos pocos desplazamientos escuché la primera campana. ?
Una mejor mirada en el mismo pergamino, y también encontré otra información. ?
Sí, metadatos, ¡pero sé que estamos llegando allí! Pero veamos qué tenemos hasta ahora:
Ahora necesitamos esos fragmentos.
Bajando un poco más y aquí está el primer fragmento. ?
¡Por fin un formato binario! Debe ser un fragmento de la película.
Una revisión rápida con curl...
Abre la terminal, copia y pega...
foogaro@MBP-di-Luigi tmp % curl ' https://streamweu-livectorprodmedia17-euwe.licdn.com/44eefc72-771d-4bfd-8985-aede1310be0f/L4E609f69d951866001-livemanifest.ism/QualityLevels(3200000)/Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und) ' --compressed
Warning: Binary output can mess up your terminal. Use " --output - " to tell
Warning: curl to output it to your terminal anyway, or consider " --output
Warning: <FILE> " to save to a file.
foogaro@MBP-di-Luigi tmp % curl ' https://streamweu-livectorprodmedia17-euwe.licdn.com/44eefc72-771d-4bfd-8985-aede1310be0f/L4E609f69d951866001-livemanifest.ism/QualityLevels(3200000)/Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und) ' --compressed -O
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 158k 100 158k 0 0 868k 0 --:--:-- --:--:-- --:--:-- 924k
foogaro@MBP-di-Luigi tmp % ll
total 320
drwxr-xr-x 3 foogaro staff 96 24 Ago 22:37 .
drwxr-xr-x 6 foogaro staff 192 24 Ago 22:37 ..
-rw-r--r-- 1 foogaro staff 162808 24 Ago 22:37 Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und)
foogaro@MBP-di-Luigi tmp % file Fragments ( video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und )
Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und): MPEG transport stream data
foogaro@MBP-di-Luigi tmp % curl ' https://streamweu-livectorprodmedia17-euwe.licdn.com/44eefc72-771d-4bfd-8985-aede1310be0f/L4E609f69d951866001-livemanifest.ism/QualityLevels(3200000)/Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und) ' --compressed -o video.mpeg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 158k 100 158k 0 0 926k 0 --:--:-- --:--:-- --:--:-- 981k
foogaro@MBP-di-Luigi tmp % ll
total 640
drwxr-xr-x 4 foogaro staff 128 24 Ago 22:39 .
drwxr-xr-x 6 foogaro staff 192 24 Ago 22:37 ..
-rw-r--r-- 1 foogaro staff 162808 24 Ago 22:37 Fragments(video=65886000,format=m3u8-aapl-v3,audiotrack=audio_und)
-rw-r--r-- 1 foogaro staff 162808 24 Ago 22:39 video.mpeg
foogaro@MBP-di-Luigi tmp %
A ver si es un vídeo de verdad...
Es un vídeo real y dura unos 2 segundos, lo que coincide con la TARGETDURATION que encontramos en la lista completa de fragmentos. ?
Sigue desplazándote y aquí están.
Fragmentos, veo fragmentos por todas partes.
No voy a describir el código, puedes echarle un vistazo tú mismo, pero puedo decirte lo que se necesitaba:
La implementación debe considerarse con el mejor esfuerzo, lo que significa que funciona en mi computadora.
La última parte de la implementación, descargar/transmitir el archivo, fue posible gracias a @swathisprasad (Swathi Prasad) y su repositorio https://github.com/swathisprasad/download-using-streaming-response-body
Por lo demás, por supuesto gracias a StackOverflow.
Pruébalo con Docker si quieres:
foogaro@MBP-di-Luigi linkedin-video-downloader % docker run -it --rm=true -p 8080:8080 foogaro/linkedin-video-downloader
. ____ _ __ _ _
/ \ / ___ ' _ __ _ _(_)_ __ __ _
( ( )___ | ' _ | ' _| | ' _ / _ ` |
\ / ___) | | _) | | | | | || (_ | | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.0)
2022-08-24 22:57:01.107 INFO 1 --- [ main] c.foogaro.data.LinkedInVideoApplication : Starting LinkedInVideoApplication v1.0.0 using Java 11.0.16.1 on c543811fe9f3 with PID 1 (/app/app.jar started by root in /app)
2022-08-24 22:57:01.121 INFO 1 --- [ main] c.foogaro.data.LinkedInVideoApplication : No active profile set, falling back to 1 default profile: "default"
2022-08-24 22:57:03.037 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-08-24 22:57:03.060 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-08-24 22:57:03.060 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
2022-08-24 22:57:03.171 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-08-24 22:57:03.171 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1969 ms
2022-08-24 22:57:03.900 INFO 1 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2022-08-24 22:57:04.286 INFO 1 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path ' /actuator '
2022-08-24 22:57:04.363 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ' '
2022-08-24 22:57:04.391 INFO 1 --- [ main] c.foogaro.data.LinkedInVideoApplication : Started LinkedInVideoApplication in 3.931 seconds (JVM running for 4.532)
2022-08-24 22:57:05.282 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet ' dispatcherServlet '
2022-08-24 22:57:05.283 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet ' dispatcherServlet '
2022-08-24 22:57:05.289 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms
2022-08-24 22:57:21.779 INFO 1 --- [nio-8080-exec-7] c.f.d.c.LinkedInVideoController : Steaming video download as: linkedin-video-1661421441774.zip
2022-08-24 22:57:21.800 INFO 1 --- [ taskExecutor-1] c.f.d.c.LinkedInVideoController : Video ID: c50f2327-7fa7-4cc8-8a2c-35711eb5296d/L4E60a4445e9d065000
2022-08-24 22:57:21.800 INFO 1 --- [ taskExecutor-1] c.f.d.c.LinkedInVideoController : Quality Level: 3200000
2022-08-24 22:57:21.991 INFO 1 --- [ taskExecutor-1] c.f.d.c.LinkedInVideoController : Number of video fragments: 2154
¡Gracias por leer hasta ahora!
Si te gustó o te resultó útil ¡dame una estrella!
¡Los RP son más que bienvenidos, tanto en el frontend como en el backend! ?
¡Mentí, busqué el enlace del video en la fuente de la página! ? ↩ ↩ 2