Ce logiciel est destiné à mon usage personnel et je ne suis pas responsable de la façon dont vous allez l'utiliser. Alors évitez les ennuis, faites des bocaux et non des guerres !
L'une de mes activités professionnelles consiste à faire connaître Redis, et cela s'accompagne également de vidéos et de webinaires en direct. Récemment, je fais des lives LinkedIn, je diffuse mon direct depuis Zoom, et je ne me souviens pas tout le temps d'appuyer sur le bouton "Enregistrer".
Cependant, et heureusement, LinkedIn conserve l'enregistrement de mon live comme « Live enregistré précédemment », afin de pouvoir le visionner plus tard. Je n'ai aucune idée de la rétention offerte par LinkedIn pour ces vidéos, mais je suis sûr qu'il ne permet pas de télécharger de telles vidéos.
Alors j'ai cherché sur Google et je n'ai rien trouvé de grave. Téléchargement YouTube, téléchargeur Pinterest, téléchargeur Facebook, mais tous les téléchargeurs liés à LinkedIn étaient tout simplement faux.
Ainsi, je dois créer mon propre téléchargeur de vidéos LinkedIn ! ?
Maintenant, l'idée était... Je ne pense pas trouver de lien (src ou href) vers une vidéo dans la source 1 d'un certain format (mp4, webm, vid mkv, avi, mov et ainsi de suite) , mais je pense trouver quelque chose en rapport avec le streaming vidéo... mais pas dans la source 1 , sûrement au niveau du réseau.
J'ai donc ouvert Chrome et sa barre DevTools, sélectionné le panneau Réseau, puis j'ai tapé (collé) l'URL de mon événement vidéo LinkedIn dans la barre d'adresse et appuyé sur Entrée !
Et c'est ce que j'ai obtenu.
Maintenant, je dois trouver quelque chose qui me rappelle quelque chose en ce qui concerne la vidéo/le flux/les morceaux/le binaire/quoi que ce soit... alors j'ai commencé à faire défiler le panneau Réseau et après quelques défilements, j'ai entendu la première cloche ! ?
Un meilleur aperçu dans le même parchemin, et j'ai également trouvé d'autres informations. ?
Oui, les métadonnées, mais je sais qu’on y arrive ! Mais voyons ce que nous avons obtenu jusqu'à présent :
Maintenant, nous avons besoin de ces fragments.
En descendant encore un peu, voici le premier fragment. ?
Enfin un format binaire ! Ce doit être un fragment du film.
Une vérification rapide avec curl...
Ouvrez le terminal, copiez-collez...
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 %
Voyons si c'est une vraie vidéo...
C'est une vraie vidéo, et elle dure environ 2 secondes, ce qui correspond à la TARGETDURATION que nous avons trouvée dans la liste complète des fragments. ?
Continuez à faire défiler et les voici.
Des fragments, je vois des fragments partout.
Je ne vais pas décrire le code, vous pouvez y jeter un oeil vous-même, mais je peux vous dire ce qui était nécessaire :
La mise en œuvre est à envisager au mieux, ce qui veut dire qu'elle fonctionne sur mon ordinateur !
La dernière partie de l'implémentation, le téléchargement/la diffusion en continu du fichier, a été possible grâce à @swathisprasad (Swathi Prasad) et son dépôt https://github.com/swathisprasad/download-using-streaming-response-body
Pour le reste, bien sûr grâce à StackOverflow.
Essayez-le avec Docker si vous voulez :
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
Merci d'avoir lu jusqu'à présent !
Si vous l’avez aimé ou trouvé utile, donnez-moi une étoile !
Les PR sont plus que les bienvenus, tant sur le frontend que sur le backend ! ?
J'ai menti, j'ai bien cherché le lien de la vidéo dans le source de la page ! ? ↩ ↩ 2