Someone came up to me recently with the task of downloading a few video files hosted via OpenLoad. The files belonged to them, and OpenLoad has an API designed for this, but I didn’t find out about it until it was too late.
Nevertheless, the process of programmatically (headless) downloading files loaded with VideoJS, as is the case for OpenLoad, is pretty interesting, so I thought I should share my approach.
The Problem
Developers that don’t want other people to be able to easily download their videos usually protect their content by obfuscating the code or loading it over JS. OpenLoad is fetching the source video URL after you press play, so it’s not as easy as fetching the video’s source code and parsing the link, because it doesn’t exist initially, it’s obfuscated into the JS code.
The Solution
To solve this issue, I wrote a small script which is using Chromium’s Puppeteer tool for creating headless requests using the Chromium browser. This little script is requesting an OpenLoad embed link, pressing the play button once, which triggers a network request to the video file’s URL. Because Puppeteer allows you to listen for the network requests, all I had to do is look for the request that contained the video file extension, and then echo that out. From there, all I needed to do was to download the file.
The Tool
Installation
You can install it using NPM:
npm install puppeteer
Code
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setRequestInterception(true); page.on('request', request => { if (request.url().includes('.mp4')) { console.log(request.url()); process.exit(); } else { request.continue(); } }); await page.goto(process.argv[2]); await page.evaluate(() => { const el = document.querySelector('#videooverlay'); el && el.click(); }); await page.waitFor(1000); await browser.close(); })();
Usage
Using it is very simple. Simply do:
node get-link.js 'https://openload.com/embed/ABCDEFGHIJ'
Replace ABCDEFGHIJ
with your video’s code.
If it works, it will return the video file’s direct link to stdout otherwise, it will return nothing.
Downloading
If your downloader is not written in JS, you probably want to use that as a bridge. To do that, simply execute the above command using a shell helper. E.g.: os.system() in Python or exec() in PHP.
If you want to download it directly from command line, use xargs
or $()
.
xargs
node get-link.js https://openload.co/embed/ABCDEFGHIJ/ | xargs wget
$()
wget $(node get-link.js https://openload.co/embed/ABCDEFGHIJ/)
Hi my friend cool script I had something similar, but this won’t work now.
Any idea how to fix it ?