// ==UserScript== // @name Wikimedia Commons: files page: add categories near every file name // @description In your list of uploaded files you will see clickable categories // @namespace Violentmonkey Scripts // @version 1.2 // @author Vitaly Zdanevich // @match https://commons.wikimedia.org/w/index.php?title=Special:ListFiles/* // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { let fileNames = ''; const fileNamesArr = []; const files = document.querySelectorAll('.TablePager_col_img_name > a[href^="/wiki/File:"]'); let i = 0; files.forEach(f => { const fileName = nodeToFilename(f); fileNames += fileName i++; if (i % 50 === 0) { // 50 is API limit fileNamesArr.push(fileNames); fileNames = ''; } else { fileNames += '|' } }); fileNamesArr.forEach(f => { const url = 'https://commons.wikimedia.org/w/api.php?action=query&format=json&prop=categories&formatversion=2&cllimit=max&clshow=!hidden&titles=' + f + '&origin=*'; fetch(url).then(resp => resp.json()).then(data => { const result = {}; // Process the API response if (data.query && data.query.pages) { data.query.pages.forEach(page => { if (page.categories) { const categories = page.categories.map(category => { return category.title; }); result[page.title] = categories; } }); } files.forEach(f => { const fileName = nodeToFilename(f); if (fileName in result) { const categories = result[fileName]; // Create links for each category and append them to the current link's parent element categories.forEach(category => { const categoryLink = $('', { text: category.replace(/^Category:/g, ''), href: 'https://commons.wikimedia.org/wiki/' + category, css: { display: 'block', fontSize: 'small', marginLeft: '10px' } // Add some style for better appearance }); $(f).parent().append(categoryLink); }); } }); }); }) })(); // Extract the "File:..." part from the link href attribute function nodeToFilename(node) { const fileName = node.href.split('/').pop(); return decodeURIComponent(fileName).replace(/_/g, ' '); // Replace underscores with spaces // For smaller response without "normalized" array }