View Full Twitter Image

Undo Twitter's insistence to down-res images when viewing on its dedicated page and add a button to download the full image without the weird file extensions which don't count as actual images.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         View Full Twitter Image
// @version      2.0.1
// @description  Undo Twitter's insistence to down-res images when viewing on its dedicated page and add a button to download the full image without the weird file extensions which don't count as actual images.
// @author       ForgottenUmbrella
// @match        https://pbs.twimg.com/media/*
// @grant        none
// @noframes
// @namespace    https://greatest.deepsurf.us/users/83187
// ==/UserScript==

"use strict";

// Returns the URL to the original image file (as a string), given a `location` object.
function ogImageUrl(location) {
    let url = new URL(location.href);
    const isNewFormat = url.search.length > 0;
    if (isNewFormat) {
        // The old URL format is https://pbs.twimg/media/hash.jpg:orig.
        // The new URL format is https://pbs.twimg.com/media/hash?format=jpg&name=orig.
        let params = new URLSearchParams(url.search);
        params.set("name", "orig");
        url.search = params.toString();
        return url.href;
    }
    return url.href.replace(":large", "") + ":orig";
}

// Returns the filename of the original image, given a `location` to said image.
function imageName(location) {
    const filename = location.pathname.split("/").pop();
    // Remove the ":orig" tag if Twitter is using the old URL format.
    return filename.replace(":orig", "");
}

// Saves the webpage/file being viewed as `filename`.
function download(filename) {
    let element = document.createElement("a");
    // The `download` attribute only works if `href` is set.
    element.href = location.href;
    element.download = filename;
    element.style.display = "none";
    document.body.appendChild(element);
    element.click();
    document.body.removeChild(element);
}

// View original image file.
const isOgImage = location.href.includes("orig");
if (!isOgImage) {
    location.assign(ogImageUrl(location));
}
// Add spacing between image and download button.
const image = document.getElementsByTagName("img")[0];
const spacing = document.createElement("p");
document.body.insertBefore(spacing, image);
// Add download button.
let button = document.createElement("button");
button.innerHTML = "Download";
button.onclick = () => void download(imageName(location));
document.body.insertBefore(button, spacing);