Archive.org Direct Download Links with Sizes & Sort

Show direct download links with file sizes, sorted largest first, on archive.org pages

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Archive.org Direct Download Links with Sizes & Sort
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Show direct download links with file sizes, sorted largest first, on archive.org pages
// @match        https://archive.org/details/*
// @grant        none
// ==/UserScript==

(async function () {
    'use strict';

    const identifierMatch = window.location.pathname.match(/^\/details\/([^/?#]+)/);
    if (!identifierMatch) return;
    const identifier = identifierMatch[1];

    let metadata;
    try {
        const res = await fetch(`https://archive.org/metadata/${identifier}`);
        metadata = await res.json();
    } catch (e) {
        console.error('Failed to fetch archive metadata', e);
        return;
    }

    const baseHost = metadata.d1 || metadata.d2 || 'https://archive.org';
    const basePath = `/items/${identifier}/`;

    const isMetaFile = (filename) => (
        filename.endsWith('_meta.xml') ||
        filename.endsWith('_meta.json') ||
        filename.endsWith('_files.xml') ||
        filename.endsWith('_thumb.jpg') ||
        filename.endsWith('_archive.torrent') ||
        filename.endsWith('.sqlite') ||
        filename.startsWith('dark') ||
        filename.startsWith('__ia_thumb') ||
        filename.startsWith('ia_logo') ||
        filename.endsWith('.bif')
    );

    // Convert bytes to readable string
    const formatSize = (bytes) => {
        if (bytes === undefined) return '';
        if (bytes > 1e9) return (bytes / 1e9).toFixed(2) + ' GB';
        if (bytes > 1e6) return (bytes / 1e6).toFixed(2) + ' MB';
        if (bytes > 1e3) return (bytes / 1e3).toFixed(2) + ' KB';
        return bytes + ' B';
    };

    // Filter & sort files largest first
    const files = metadata.files.filter(f => f.name && !isMetaFile(f.name));
    files.sort((a, b) => (b.size || 0) - (a.size || 0));

    const panel = document.createElement('div');
    panel.style = `
        position: fixed;
        top: 10px;
        right: 10px;
        background: #0078e7;
        padding: 10px;
        border-radius: 8px;
        z-index: 99999;
        box-shadow: 0 3px 8px rgba(0,0,0,0.3);
        max-height: 70vh;
        overflow-y: auto;
        width: 320px;
        font-family: Arial, sans-serif;
        color: white;
    `;

    const title = document.createElement('div');
    title.textContent = '⬇️ Direct Download Links (Largest First)';
    title.style = 'margin-bottom: 8px; font-size: 16px; font-weight: bold;';
    panel.appendChild(title);

    files.forEach(file => {
        const encodedName = encodeURIComponent(file.name).replace(/%20/g, '+');
        const fileUrl = `${baseHost}${basePath}${encodedName}`;

        const link = document.createElement('a');
        link.href = fileUrl;
        link.textContent = `${file.name} (${formatSize(file.size)})`;
        link.target = '_blank';
        link.style = `
            display: block;
            margin-bottom: 6px;
            color: #fff;
            text-decoration: underline;
            cursor: pointer;
            font-size: 12px;
            word-break: break-word;
        `;
        link.download = file.name;

        panel.appendChild(link);
    });

    document.body.appendChild(panel);
})();