Greasy Fork is available in English.

Vimeo Download

Adds a download button to the Vimeo video player. This is a rewrite of "Vimeo Embed Download" originally created by aleixdev (https://greasyfork.org/en/scripts/376551).

// ==UserScript==
// @name        Vimeo Download
// @namespace   http://tampermonkey.net/
// @version     3.2
// @description Adds a download button to the Vimeo video player. This is a rewrite of "Vimeo Embed Download" originally created by aleixdev (https://greasyfork.org/en/scripts/376551).
// @author      You
// @match       https://vimeo.com/*
// @match       https://player.vimeo.com/video/*
// @icon        https://www.google.com/s2/favicons?sz=64&domain=vimeo.com
// @unwrap
// ==/UserScript==
(function() {
    if (document.title === 'VimeUhOh') {
        return;
    }

    // function getPlayer() {
    //     if (window.playerConfig) {
    //         return window.playerConfig;
    //     }
    //     const clips = window.vimeo.clips;
    //     const videoId = Object.keys(clips).at();
    //     if (!videoId) {
    //         throw new Error('[Vimeo Download] Error retrieving video meta data:', clips);
    //     }
    //     return clips[videoId]
    // }
    // const { request, video } = getPlayer();
    // console.log(request.files);
    // const streams = request.files.progressive.sort((a, b) => b.width - a.width);
    // console.log(streams);
    // const { url, quality } = streams[0];
    const div = document.createElement('div');
    document.querySelectorAll('track[srclang]').forEach(subtitle => {
        const element = Object.assign(document.createElement('button'), {
            innerHTML: subtitle.srclang,
            title: subtitle.srclang,
            style: 'display: inline-block; font-size: 1.75em; margin: -0.25em 0 0 0.3em; color: rgb(68,187,255)',
            onclick: function() {
                this.disabled = true;
                this.innerText = 'Wait';
                fetch(subtitle.src)
                    .then(response => response.blob())
                    .then(file => {
                    const tempUrl = URL.createObjectURL(file);
                    const aTag = document.createElement("a");
                    aTag.href = tempUrl;
                    aTag.download = 'Subtitle ' + subtitle.srclang + '.vtt'
                    document.body.appendChild(aTag);
                    aTag.click();
                    URL.revokeObjectURL(tempUrl);
                    aTag.remove();
                }).finally(() => {
                    this.disabled = false;
                    this.innerText = subtitle.srclang
                });
            }
        })
        div.append(element);
    })

    // const button = Object.assign(document.createElement('button'), {
    //     innerHTML: 'Download',
    //     title: 'Download ' + quality,
    //     style: 'display: inline-block; font-size: 1.75em; margin: -0.25em 0 0 0.3em; color: rgb(68,187,255)',
    //     onclick: function() {
    //         console.log(url, quality);
    //         this.disabled = true;
    //         this.innerText = 'Wait';
    //         fetch(url)
    //             .then(response => response.blob())
    //             .then(file => {
    //             const tempUrl = URL.createObjectURL(file);
    //             const aTag = document.createElement("a");
    //             aTag.href = tempUrl;
    //             aTag.download = name
    //             document.body.appendChild(aTag);
    //             aTag.click();
    //             URL.revokeObjectURL(tempUrl);
    //             aTag.remove();
    //         }).finally(() => {
    //             this.disabled = false;
    //             this.innerText = 'Download'
    //         });
    //     }
    // })
    const interval = setInterval(function() {
        if (!document.querySelector('.vp-controls')) return;
        clearInterval(interval)
        document.querySelector('.vp-controls').append(/*button,*/ div);
    }, 100);
})();