Unpaywall Button

Adds a button to archive the page on Archive.today for specific websites

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         Unpaywall Button
// @license       MIT
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Adds a button to archive the page on Archive.today for specific websites
// @author       Your Name
// @include      *://cnn.com/*
// @include      *://*.cnn.com/*
// @include      *://bbc.com/*
// @include      *://*.bbc.com/*
// @include      *://nytimes.com/*
// @include      *://*.nytimes.com/*
// @include      *://foxnews.com/*
// @include      *://*.foxnews.com/*
// @include      *://huffpost.com/*
// @include      *://*.huffpost.com/*
// @include      *://reuters.com/*
// @include      *://*.reuters.com/*
// @include      *://bloomberg.com/*
// @include      *://*.bloomberg.com/*
// @include      *://theguardian.com/*
// @include      *://*.theguardian.com/*
// @include      *://forbes.com/*
// @include      *://*.forbes.com/*
// @include      *://usatoday.com/*
// @include      *://*.usatoday.com/*
// @include      *://npr.org/*
// @include      *://*.npr.org/*
// @include      *://washingtonpost.com/*
// @include      *://*.washingtonpost.com/*
// @include      *://aljazeera.com/*
// @include      *://*.aljazeera.com/*
// @include      *://abcnews.go.com/*
// @include      *://*.abcnews.go.com/*
// @include      *://cbsnews.com/*
// @include      *://*.cbsnews.com/*
// @include      *://nbcnews.com/*
// @include      *://*.nbcnews.com/*
// @include      *://news.yahoo.com/*
// @include      *://*.news.yahoo.com/*
// @include      *://latimes.com/*
// @include      *://*.latimes.com/*
// @include      *://politico.com/*
// @include      *://*.politico.com/*
// @include      *://wsj.com/*
// @include      *://*.wsj.com/*
// @include      *://thehill.com/*
// @include      *://*.thehill.com/*
// @include      *://vox.com/*
// @include      *://*.vox.com/*
// @include      *://buzzfeednews.com/*
// @include      *://*.buzzfeednews.com/*
// @include      *://time.com/*
// @include      *://*.time.com/*
// @include      *://cnbc.com/*
// @include      *://*.cnbc.com/*
// @include      *://businessinsider.com/*
// @include      *://*.businessinsider.com/*
// @include      *://axios.com/*
// @include      *://*.axios.com/*
// @include      *://slate.com/*
// @include      *://*.slate.com/*
// @include      *://newyorker.com/*
// @include      *://*.newyorker.com/*
// @include      *://vanityfair.com/*
// @include      *://*.vanityfair.com/*
// @include      *://nationalreview.com/*
// @include      *://*.nationalreview.com/*
// @include      *://dailywire.com/*
// @include      *://*.dailywire.com/*
// @include      *://drudgereport.com/*
// @include      *://*.drudgereport.com/*
// @include      *://breitbart.com/*
// @include      *://*.breitbart.com/*
// @include      *://theatlantic.com/*
// @include      *://*.theatlantic.com/*
// @include      *://newyorkpost.com/*
// @include      *://*.newyorkpost.com/*
// @include      *://independent.co.uk/*
// @include      *://*.independent.co.uk/*
// @include      *://telegraph.co.uk/*
// @include      *://*.telegraph.co.uk/*
// @include      *://dailymail.co.uk/*
// @include      *://*.dailymail.co.uk/*
// @include      *://express.co.uk/*
// @include      *://*.express.co.uk/*
// @include      *://mirror.co.uk/*
// @include      *://*.mirror.co.uk/*
// @include      *://thesun.co.uk/*
// @include      *://*.thesun.co.uk/*
// @include      *://metro.co.uk/*
// @include      *://*.metro.co.uk/*
// @include      *://sky.com/*
// @include      *://*.sky.com/*
// @include      *://euronews.com/*
// @include      *://*.euronews.com/*
// @include      *://rt.com/*
// @include      *://*.rt.com/*
// @include      *://france24.com/*
// @include      *://*.france24.com/*
// @include      *://dw.com/*
// @include      *://*.dw.com/*
// @include      *://ctvnews.ca/*
// @include      *://*.ctvnews.ca/*
// @include      *://globalnews.ca/*
// @include      *://*.globalnews.ca/*
// @include      *://cbc.ca/*
// @include      *://*.cbc.ca/*
// @grant        GM.xmlHttpRequest
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    const hostnames = [
        'archive.is',
        'archive.ph',
        'archive.today',
        'archive.fp',
        'archive.li',
        'archive.md',
        'archive.vn'
    ];

    function sleep(t) {
        return new Promise(resolve => setTimeout(resolve, t));
    }

    function checkAvailability(hostname) {
        return new Promise(function(resolve, reject) {
            const onResponse = function(response) {
                if ((response.status >= 200 && response.status <= 400) || response.status === 429) {
                    resolve(response);
                } else {
                    reject(new Error('HOST_UNAVAILABLE'));
                }
            };
            GM.xmlHttpRequest({
                url: `https://${hostname}/`,
                method: 'GET',
                headers: {
                    Range: 'bytes=0-63'
                },
                onload: onResponse,
                onerror: onResponse
            });
        });
    }

    async function archivePage(url) {
        let workingHostname = null;
        for (const hostname of hostnames) {
            try {
                await checkAvailability(hostname);
                workingHostname = hostname;
                break;
            } catch (err) {
                if (err && 'message' in err && err.message === 'HOST_UNAVAILABLE') {
                    console.debug(`${hostname} is NOT available`);
                } else {
                    throw err;
                }
            }
        }

        if (workingHostname) {
            document.location.href = `https://${workingHostname}/?run=1&url=${encodeURIComponent(url)}`;
        } else {
            alert('All Archive.today domains seem to be down.');
        }
    }

    function createButton() {
        const button = document.createElement('button');
        button.innerText = 'Unpaywall';
        button.style.position = 'fixed';
        button.style.bottom = '10px';
        button.style.right = '10px';
        button.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
        button.style.color = 'white';
        button.style.border = 'none';
        button.style.borderRadius = '5px';
        button.style.padding = '10px';
        button.style.cursor = 'pointer';
        button.style.zIndex = '10000';
        button.style.opacity = '0.8';

        button.addEventListener('click', () => archivePage(window.location.href));

        document.body.appendChild(button);
    }

    function main() {
        console.log('Unpaywall script running');
        createButton();
    }

    main();
})();