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


You can install it using NPM:

npm install puppeteer


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')) {
        } else {

    await page.goto(process.argv[2]);
    await page.evaluate(() => {
        const el = document.querySelector('#videooverlay');
        el &&;

    await page.waitFor(1000);
    await browser.close();


Using it is very simple. Simply do:

node get-link.js ''

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.


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 $().


node get-link.js | xargs wget


wget $(node get-link.js