Facebook HD Video Downloader

Adds a download link for Facebook videos. Works for HD videos as of July 2014. Fork from styfle.

Verzia zo dňa 20.03.2015. Pozri najnovšiu verziu.

// ==UserScript==
// @name            Facebook HD Video Downloader
// @description     Adds a download link for Facebook videos. Works for HD videos as of July 2014. Fork from styfle.
// @author          EThaiZone
// @include     http://facebook.com/photo.php*
// @include     http://*.facebook.com/photo.php*
// @include     https://facebook.com/photo.php*
// @include     https://*.facebook.com/photo.php*
// @include     http://facebook.com/video.php*
// @include     http://*.facebook.com/video.php*
// @include     https://facebook.com/video.php*
// @include     https://*.facebook.com/video.php*
// @include     http://facebook.com/photo/*
// @include     http://*.facebook.com/photo/*
// @include     https://facebook.com/photo/*
// @include     https://*.facebook.com/photo/*
// @include     http://facebook.com/video/*
// @include     http://*.facebook.com/video/*
// @include     https://facebook.com/video/*
// @include     https://*.facebook.com/video/*
// @version 0.0.1.20150320163123
// @namespace https://greasyfork.org/users/3747
// ==/UserScript==

document.addEventListener ("readystatechange", renderFBDownloader, true);

function renderFBDownloader() { 

    // Get the side bar so we can append to it later
    var sidebar = document.getElementById('fbPhotoPageActions');

    // Get all the <embed> elements
    var embedElements = document.querySelectorAll('embed[flashvars]');

    // Flag if we found the video url or not
    var found = false;

    for (var i = 0; i < embedElements.length; i++) {
        // Get the flashvars attribute and decode it
        var flashvars = decodeURIComponent(embedElements[i].getAttribute('flashvars'));

        // Check if this string contains the code we're looking for
        var hd_src_index = flashvars.indexOf('hd_src');
        var p_width_index = flashvars.indexOf('&width=');
        if (hd_src_index > -1 && p_width_index > -1) {
            // This string contains the payload we are looking for so parse it
            var obj = JSON.parse(flashvars.slice(7, p_width_index));
            var video_data = obj.video_data[0];
            
            //var title = video_data.video_id;
            var title = document.querySelectorAll('h2.uiHeaderTitle')[0].innerText;

            // High Def
            if (video_data.hd_src)
            {
                var hd_link = document.createElement('a');
                hd_link.href = video_data.hd_src.replace("https://", "http://");
                hd_link.innerHTML = 'Download HD Video';
                hd_link.className = 'fbPhotosPhotoActionsItem';
                hd_link.download = title + '_hd.mp4';
                sidebar.appendChild(hd_link);
            }

            // Low Def
            if (video_data.sd_src)
            {
                var sd_link = document.createElement('a');
                sd_link.href = video_data.sd_src.replace("https://", "http://");
                sd_link.innerHTML = 'Download SD Video';
                sd_link.className = 'fbPhotosPhotoActionsItem';
                sd_link.download = title + '_sd.mp4';
                sidebar.appendChild(sd_link);
            }

            found = true;
        } // end if

    } // end loop

    if (!found) {
        var not_found = document.createElement('span');
        not_found.innerHTML = 'No download link :(';
        sidebar.appendChild(not_found);
    }
}