NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Instagram Downloader
// @version 0.1
// @author Fury Zenblade#1337
// @description Adds a download button to download the last opened/clicked video
// @match http*://*.instagram.com/*
// @license MIT
// @icon https://www.google.com/s2/favicons?sz=64&domain=instagram.com
// @run-at document-start
// ==/UserScript==
function addButton(element) {
if (document.getElementById("download_button")) return; // check if button already exists
var dl_button = document.createElement("button");
dl_button.id = "download_button";
dl_button.innerHTML = "Download";
// on click
dl_button.onclick = function() {
if (last_played_video == null) return;
window.open(last_played_video.url);
}
// add css to dl_button
dl_button.style.cssText = "margin-left: 22px; background-color: #fff; border: 1px solid #000; padding: 5px;";
dl_button.onmouseover = function() {
dl_button.style.backgroundColor = "#ddd"; // change color on hover
if (last_played_video == null){
dl_button.style.cursor = "not-allowed";
dl_button.title = "No video loaded";
} else {
dl_button.style.cursor = "pointer";
dl_button.title = "Download last loaded video";
}
}
dl_button.onmouseout = function() {
dl_button.style.backgroundColor = "#fff"; // change color on hover
}
element.appendChild(dl_button);
}
function WaitForElement(selector, callback) { // @_@
if (document.querySelector(selector)) {
callback();
} else {
setTimeout(function() {
WaitForElement(selector, callback);
}, 100);
}
}
function ReAddButton() {
setTimeout(function() {
var top_bar = document.getElementsByClassName("_acus");
addButton(top_bar[0]);
top_bar[0].addEventListener("click", ReAddButton);
}, 100);
}
(function() {
'use strict';
console.log("Script loaded");
// wait until UI has loaded
WaitForElement("._acus", function() {
var top_bar = document.getElementsByClassName("_acus");
addButton(top_bar[0]);
top_bar[0].addEventListener("click", ReAddButton); // if clicking on different page, add button again
});
// https://stackoverflow.com/questions/3522090/event-when-window-location-href-changes
var oldHref = document.location.href;
window.onload = function() {
var bodyList = document.querySelector("body")
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (oldHref != document.location.href) {
oldHref = document.location.href;
//console.log("URL changed");
ReAddButton();
}
});
});
var config = {
childList: true,
subtree: true
};
observer.observe(bodyList, config);
};
})();
var last_played_video = null;
// intercept XMLHttpRequests
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
this.addEventListener("readystatechange", function() {
if (this.readyState != 4) return; // not done yet
if (!url.contains("/info/")) return; // not a post info request
if (!this.responseText.contains("video_versions")) return; // not a post with video
// parse response json
var response = JSON.parse(this.responseText);
var post_code = response.items[0].code;
var video_versions = response.items[0].video_versions;
/*
console.log("All video versions: ");
for (const video of video_versions) {
console.log("Resolution: " + video.width + "x" + video.height + " " + video.url);
}
*/
var hq_video = video_versions[0];
last_played_video = hq_video;
var post_direct_link = "https://www.instagram.com/p/" + post_code + "/";
console.log(
`Post: https://www.instagram.com/p/${post_code}/\n` +
`${hq_video.width}x${hq_video.height}: ${hq_video.url}`
);
console.log("Post: " + post_direct_link);
console.log(`${hq_video.width}x${hq_video.height}: ${hq_video.url}`);
});
open.call(this, method, url, async, user, password);
}
}) (XMLHttpRequest.prototype.open);