NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Download on Google Scholar // @namespace https://openuserjs.org/users/clemente // @match https://scholar.google.*/* // @grant GM_xmlhttpRequest // @version 1.4 // @author clemente // @license MIT // @description Display a download button next to results // @description:de Eine Download-Schaltfläche neben den Ergebnissen anzeigen // @description:es Mostra un botón de descarga junto a los resultados // @description:fr Ajoute un bouton de téléchargement à côté des résultats // @description:it Visualizzare un pulsante per il download accanto ai risultati // @icon https://scholar.google.com/favicon.ico // @connect sci-hub.it.nf // @inject-into content // @noframes // @homepageURL https://openuserjs.org/scripts/clemente/Download_on_Google_Scholar // @supportURL https://openuserjs.org/scripts/clemente/Download_on_Google_Scholar/issues // ==/UserScript== /* jshint esversion: 6 */ const SCI_HUB_DOMAIN = "sci-hub.it.nf"; const SCI_HUB_URL = `https://${SCI_HUB_DOMAIN}`; function gm_fetch(url) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: url, onload: function({ status, responseText }) { if (status < 200 && status >= 300) return reject(); resolve(responseText); }, onerror: function() { reject(); }, }); }); } async function getDownloadLink(link) { try { const scihubPageHtml = await gm_fetch(`${SCI_HUB_URL}/${link}`); const parser = new DOMParser(); const scihubPageDocument = parser.parseFromString(scihubPageHtml, "text/html"); const pdfDownloadLink = scihubPageDocument.querySelector(`a[onclick$="?download=true'"]`); const match = pdfDownloadLink.getAttribute("onclick").match(/^location\.href='(.*)'$/); const downloadLink = match[1]; return downloadLink; } catch (e) { // If there is an error, the article is probably not available on Sci-Hub return null; } } function buildDownloadButton(downloadLink) { const result = document.createElement('div'); result.classList.add("gs_ggs"); // gs_fl const buttonWrapper = document.createElement('div'); buttonWrapper.classList.add("gs_ggsd"); const button = document.createElement('div'); button.classList.add("gs_or_ggsm"); const link = document.createElement('a'); link.classList.add("gs_or_ggsm"); link.textContent = ` ${SCI_HUB_DOMAIN}`; link.href = downloadLink; link.download = true; link.style = `color: orange`; const extension = document.createElement('span'); extension.classList.add("gs_ctg2"); extension.textContent = "[PDF]" link.prepend(extension); button.prepend(link); buttonWrapper.prepend(button); result.prepend(buttonWrapper); return result; } function addDownloadButtonOnResults() { document.querySelectorAll('.gs_r.gs_scl').forEach(async node => { if (node.querySelector('.gs_ggs')) { // If there is already an available download, do nothing return; } const detectedLink = node.querySelector('.gs_rt a').href; const downloadLink = await getDownloadLink(detectedLink); if (!downloadLink) { return; } const downloadButton = buildDownloadButton(downloadLink); node.prepend(downloadButton); }); } addDownloadButtonOnResults();