[New] GitHub Downloads Counter

Counts the total downloads of all published releases in a Search Result and in Repository view.

// ==UserScript==
// @name         [New] GitHub Downloads Counter
// @namespace    https://greasyfork.org/users/1162863
// @version      1.0
// @description  Counts the total downloads of all published releases in a Search Result and in Repository view.
// @author       Andrewblood
// @match        *://*.github.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=github.com
// @grant        GM_xmlhttpRequest
// @connect      api.github.com
// @license      Andrewblood
// ==/UserScript==

(function() {
    'use strict';

    // Here your Access Token if you have one
    const accessToken = ''; // 'ghp_your_access_token_here'

    setTimeout(function() {
        getRepoDownloads();
        processSearchResults();
    }, 1000 * 3);

    // Funktion zum Abrufen der Downloads über die GitHub API
    function getDownloads(repoPath, callback) {
        const apiUrl = `https://api.github.com/repos/${repoPath}/releases`;
        let totalDownloads = 0;

        // API-Anfrage senden
        GM_xmlhttpRequest({
            method: "GET",
            url: apiUrl,
            headers: accessToken ? { 'Authorization': `token ${accessToken}` } : {}, // Token hinzufügen, falls vorhanden
            onload: function(res) {
                if (res.status === 200) {
                    const releases = JSON.parse(res.responseText);

                    // Downloads zählen
                    releases.forEach(release => {
                        release.assets.forEach(asset => {
                            totalDownloads += asset.download_count || 0; // Zähle die Downloads
                        });
                    });

                    // Rückgabe der Gesamtzahl der Downloads
                    callback(totalDownloads);
                } else {
                    console.error(`Error fetching downloads: ${res.status}`); // Fehlermeldung
                    callback(0); // Rückgabe 0 bei Fehler
                }
            }
        });
    }

    // Funktion zum Anzeigen der Gesamtzahl der Downloads für jedes Repository
    function displayTotalDownloads(repoElement, total) {
        const totalElement = document.createElement('div');
        totalElement.textContent = `Total Downloads: ${total}`; // Anzeige der Gesamtzahl
        totalElement.style.marginTop = '5px';
        totalElement.style.fontWeight = 'bold';
        repoElement.appendChild(totalElement);
    }

    // Funktion zum Verarbeiten der Suchergebnisse
    function processSearchResults() {
        const repoElements = document.querySelectorAll('.Box-sc-g0xbh4-0.iwUbcA');
        repoElements.forEach(repo => {
            const repoLink = repo.querySelector('.prc-Link-Link-85e08'); // Link zum Repository
            if (repoLink) {
                const repoPath = repoLink.href.replace('https://github.com/', ''); // Repository-Pfad

                // Downloads abrufen und anzeigen
                getDownloads(repoPath, function(totalDownloads) {
                    displayTotalDownloads(repo, totalDownloads); // Gesamtzahl anzeigen
                });
            }
        });
    }

    // Funktion zum Abrufen der Downloads über die GitHub API
    function getRepoDownloads() {
        const header = document.querySelector('#repo-title-component');
        const repoPath = window.location.pathname.replace('/releases', '');
        const apiUrl = `https://api.github.com/repos${repoPath}/releases`;
        let totalDownloads = 0;
        if (header) {

            // API-Anfrage senden
            GM_xmlhttpRequest({
                method: "GET",
                url: apiUrl,
                onload: function(res) {
                    if (res.status === 200) {
                        const releases = JSON.parse(res.responseText);

                        // Downloads zählen
                        releases.forEach(release => {
                            release.assets.forEach(asset => {
                                totalDownloads += asset.download_count || 0; // Zähle die Downloads
                            });
                        });

                        const totalElement = document.createElement('div');
                        totalElement.textContent = `Total Downloads: ${totalDownloads}`; // Anzeige der Gesamtzahl
                        totalElement.style.marginLeft = '10px';
                        header.appendChild(totalElement);
                    } else {
                        console.error(`Error: ${res.status}`);
                    }
                }
            });
        }
    }

})();