Created
December 7, 2023 13:44
-
-
Save Vojtik69/6cd384eef380a9cfc56ae797abdd99dd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name CBDB UserJS | |
// @version 2.0 | |
// @description Přidává tlačítka pro rychlý proklik na vyhledávání v annas-archive.org a knihovny.cz, a zobrazuje počet knih dostupných v MLP a definovaných vybraných pobočkách. | |
// @match *://www.cbdb.cz/moje-knihy* | |
// @match *://www.cbdb.cz/kniha* | |
// @updateURL https://gist.githubusercontent.com/Vojtik69/6cd384eef380a9cfc56ae797abdd99dd/raw/62e54af8568b5a0af21c2730b707611197d2d25e/CBDB.cz%2520UserJS | |
// @downloadURL https://gist.githubusercontent.com/Vojtik69/6cd384eef380a9cfc56ae797abdd99dd/raw/62e54af8568b5a0af21c2730b707611197d2d25e/CBDB.cz%2520UserJS | |
// @grant GM_addStyle | |
// @grant GM.xmlHttpRequest | |
// @run-at document-idle | |
// ==/UserScript== | |
//POZNÁMKY: | |
// Počet knih v knihovně se počítá jen podle prvního nalezeného vydání na knihy.cz, což je u vícekrát vydaných knih nepřesné... Zároveň může být podle názvu nalezena i jiná kniha. | |
// Vím, že ten kód je úplně příšernej, ale prošel už 3 velkými úpravami na základě změn na CBDB a knihovny.cz. Stálo by za to ho celý hezky přepsata zjednodušit, ale jednak není čas a jednak "nesahej na to, co funguje" | |
// Pokud to někdo upraví, budu rád | |
// Zde definujte pobočky Vašeho zájmu (asi ty, které máte poblíž) | |
var blizkePobocky = ["Ústřední knihovna", "Prosek"]; | |
//--------- A teď už samotný kód -------------------------------- | |
var celkem = 0, blizko = 0; | |
var autor, nazev, atribut_annas, atribut_knihovny, annas, knihovny, extensionWrapper; | |
if (document.getElementById("book_right")){ | |
nazev = encodeURI(document.getElementsByTagName('h1')[0].innerText) ; | |
autor = encodeURI(document.getElementById("book_author").getElementsByTagName('a')[0].innerText) ; | |
//----- | |
annas = document.createElement ('a'); | |
annas.target = '_blank'; | |
annas.innerHTML = '<img src="https://s2.googleusercontent.com/s2/favicons?domain=annas-archive.org&sz=32" style="height: 20px">'; | |
knihovny = document.createElement ('a'); | |
knihovny.target = '_blank'; | |
knihovny.innerHTML = '<img src="https://yt3.googleusercontent.com/ytc/AL5GRJWjMmp2lrCdcPcxK9_hKHhfKmpXbaxaDnq1LOfY=s900-c-k-c0x00ffffff-no-rj" style="height: 20px">'; | |
atribut_annas = 'https://annas-archive.org/search?index=&lang=cs&q=%22' + nazev + '%22 %22' + autor + '%22'; | |
atribut_knihovny = 'https://www.knihovny.cz/Search/Results?filter%5B%5D=~record_format_facet_mv%3A%220%2FBOOKS%2F%22&filter%5B%5D=~region_institution_facet_mv%3A%222%2FLibrary%2FPR%2FMKP%2F%22&join=AND&bool0%5B%5D=AND&lookfor0%5B%5D='+nazev+'&lookfor0%5B%5D='+autor+'&type0%5B%5D=adv_search_title_series&type0%5B%5D=adv_search_author_corporation'; | |
annas.setAttribute ('id', 'odkaz-na-annas'); | |
annas.setAttribute ('href', atribut_annas); | |
document.getElementById("book_action_buttons").lastElementChild.appendChild(annas); | |
knihovny.setAttribute ('id', 'odkaz-na-knihovny'); | |
knihovny.setAttribute ('href', atribut_knihovny); | |
document.getElementById("book_action_buttons").lastElementChild.appendChild(knihovny); | |
//---- | |
var exampleXHR1 = GM.xmlHttpRequest({ | |
context: 1, | |
method: "GET", | |
url: 'https://www.knihovny.cz/Search/Results?filter%5B%5D=~record_format_facet_mv%3A%220%2FBOOKS%2F%22&filter%5B%5D=~region_institution_facet_mv%3A%222%2FLibrary%2FPR%2FMKP%2F%22&join=AND&bool0%5B%5D=AND&lookfor0%5B%5D='+nazev+'&lookfor0%5B%5D='+autor+'&type0%5B%5D=adv_search_title_series&type0%5B%5D=adv_search_author_corporation', | |
headers: { | |
//'User-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11', | |
//'Cookie': '__utma=79894472.1123168921.1571226270.1571226270.1571226270.1; __utmc=79894472; __utmz=79894472.1571226270.1.1.utmcsr=email.seznam.cz|utmccn=(referral)|utmcmd=referral|utmcct=/;JSESSIONID=02FD26D90D959B703409362004DDD805; XSESSIONX=7DE1C93C322D544BFE14' | |
}, | |
onload: function(response){if(response){prvniVolani(response);} | |
else {var objekt = {}; | |
objekt.context = 1; | |
prvniVolani(objekt);}} | |
}).catch(e => { | |
var pocet_knih = document.createElement ('div'); | |
pocet_knih.innerHTML = "Nenalezeno"; | |
document.getElementById("book_right").appendChild(pocet_knih); | |
return; | |
}); | |
} | |
//----------------------- | |
var i; | |
var list = document.querySelectorAll(".col-12.col-sm-6.col-md-3"); | |
for (i = 0; i < list.length; i++){ | |
annas = document.createElement ('a'); | |
annas.target = '_blank'; | |
annas.innerHTML = '<img src="https://s2.googleusercontent.com/s2/favicons?domain=annas-archive.org&sz=32" style="height: 20px">'; | |
knihovny = document.createElement ('a'); | |
knihovny.target = '_blank'; | |
knihovny.innerHTML = '<img src="https://yt3.googleusercontent.com/ytc/AOPolaShqLr5RAIII8qbGG3f4-1l625E-vaFFyhtVGTH=s176-c-k-c0x00ffffff-no-rj" style="height: 20px">'; | |
try { | |
nazev = encodeURIComponent(list[i].querySelector(" div.my_books_item > div.my_books_item_name_wrapper > div.my_books_item_name > a > b").textContent) ; | |
autor = encodeURIComponent(list[i].querySelector(" div.my_books_item > div.my_books_item_name_wrapper > div.my_books_item_authors > a").textContent) ; | |
} | |
catch (error) { | |
nazev = ""; | |
autor = ""; | |
} | |
atribut_annas = 'https://annas-archive.org/search?index=&lang=cs&q=%22' + nazev + '%22 %22' + autor + '%22'; | |
atribut_knihovny = 'https://www.knihovny.cz/Search/Results?filter%5B%5D=~record_format_facet_mv%3A%220%2FBOOKS%2F%22&filter%5B%5D=~region_institution_facet_mv%3A%222%2FLibrary%2FPR%2FMKP%2F%22&join=AND&bool0%5B%5D=AND&lookfor0%5B%5D='+nazev+'&lookfor0%5B%5D='+autor+'&type0%5B%5D=adv_search_title_series&type0%5B%5D=adv_search_author_corporation'; | |
annas.setAttribute ('id', 'odkaz-na-annas'); | |
annas.setAttribute ('href', atribut_annas); | |
knihovny.setAttribute ('id', 'odkaz-na-knihovny'); | |
knihovny.setAttribute ('href', atribut_knihovny); | |
extensionWrapper = document.createElement ('div'); | |
extensionWrapper.setAttribute ('class', 'extension-wrapper'); | |
extensionWrapper.appendChild(annas); | |
extensionWrapper.appendChild(knihovny); | |
if (document.getElementById("book_right")){ | |
document.getElementById("book_action_buttons").appendChild(annas); | |
document.getElementById("book_action_buttons").appendChild(knihovny);} | |
else{ | |
list[i].firstElementChild.appendChild(extensionWrapper);} | |
var polozka = list[i].firstElementChild; | |
polozka.id = i; | |
//console.log('https://www.knihovny.cz/Search/Results/?bool0%5B%5D=AND&type0%5B%5D=AllFields&lookfor0%5B%5D='+nazev+'%20'+autor+'&join=AND&searchTypeTemplate=basic&database=Solr&filter=H4Gwhgdg5grmUFMBcAiAwgLwQYwBYoB9hsAHAawH0ATBAFx3qooDMB7AJwFsxaWxs6FAM612FTgDdUABgD0AIQDyigNIBlWYVCtsYEBXYIoAS1YQKxiCOO0YtU-eb9BIsZNQAmWQBljAI3YwdgBPWQAFACVZAFkVMM0gA...&limit=20&sort=relevance&page=1'); | |
console.log('https://www.knihovny.cz/Search/Results?filter%5B%5D=~record_format_facet_mv%3A%220%2FBOOKS%2F%22&filter%5B%5D=~region_institution_facet_mv%3A%222%2FLibrary%2FPR%2FMKP%2F%22&join=AND&bool0%5B%5D=AND&lookfor0%5B%5D='+nazev+'&lookfor0%5B%5D='+autor+'&type0%5B%5D=adv_search_title_series&type0%5B%5D=adv_search_author_corporation'); | |
setTimeout(i=i,200); | |
var exampleXHR2 = GM.xmlHttpRequest({ | |
context: i+1, | |
method: "GET", | |
//url: 'https://www.knihovny.cz/Search/Results/?bool0%5B%5D=AND&type0%5B%5D=AllFields&lookfor0%5B%5D=' + nazev + '%20' + autor + '&join=AND&searchTypeTemplate=basic&database=Solr&filter=H4Gwhgdg5grmUFMBcAiAwgLwQYwBYoB9hsAHAawH0ATBAFx3qooDMB7AJwFsxaWxs6FAM612FTgDdUABgD0AIQDyigNIBlWYVCtsYEBXYIoAS1YQKxiCOO0YtU-eb9BIsZNQAmWQBljAI3YwdgBPWQAFACVZAFkVMM0gA...&limit=20&sort=relevance&page=1', | |
url: 'https://www.knihovny.cz/Search/Results?filter%5B%5D=~record_format_facet_mv%3A%220%2FBOOKS%2F%22&filter%5B%5D=~region_institution_facet_mv%3A%222%2FLibrary%2FPR%2FMKP%2F%22&join=AND&bool0%5B%5D=AND&lookfor0%5B%5D='+nazev+'&lookfor0%5B%5D='+autor+'&type0%5B%5D=adv_search_title_series&type0%5B%5D=adv_search_author_corporation', | |
headers: { | |
//'User-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11', | |
//'Cookie': '__utma=79894472.1123168921.1571226270.1571226270.1571226270.1; __utmc=79894472; __utmz=79894472.1571226270.1.1.utmcsr=email.seznam.cz|utmccn=(referral)|utmcmd=referral|utmcct=/;JSESSIONID=02FD26D90D959B703409362004DDD805; XSESSIONX=7DE1C93C322D544BFE14' | |
}, | |
onload: function(response,i){ | |
if(response){prvniVolani(response);} | |
else {var objekt = {}; | |
objekt.context = i+1; | |
prvniVolani(objekt);} | |
} | |
}).catch(e => { | |
var pocet_knih = document.createElement ('div'); | |
pocet_knih.innerHTML = "Nenalezeno"; | |
document.getElementById(response.context).appendChild(pocet_knih); | |
return; | |
}); | |
} | |
function prvniVolani(response) { | |
//alert(response.responseText); | |
var parser = new DOMParser(); | |
var htmlDoc = parser.parseFromString(response.responseText,"text/html"); | |
if(htmlDoc.getElementsByClassName("result well")[0]){ | |
var bookId = htmlDoc.getElementsByClassName("result well")[0].getElementsByClassName("hiddenId")[0].getAttribute("value"); | |
var odkaz = 'https://www.knihovny.cz'+ htmlDoc.getElementsByClassName("result well")[0].lastElementChild.firstElementChild.firstElementChild.getAttribute("href"); | |
console.log("i = " + bookId); | |
console.log("i = " + odkaz); | |
var j = response.context-1; | |
console.log(bookId +"j= " +j); | |
//// | |
var countingXHR = GM.xmlHttpRequest({ | |
context: j+1, | |
method: "GET", | |
url: odkaz, | |
headers: { | |
'User-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11', | |
'Cookie': '__utma=79894472.1123168921.1571226270.1571226270.1571226270.1; __utmc=79894472; __utmz=79894472.1571226270.1.1.utmcsr=email.seznam.cz|utmccn=(referral)|utmcmd=referral|utmcct=/;JSESSIONID=02FD26D90D959B703409362004DDD805; XSESSIONX=7DE1C93C322D544BFE14' | |
}, | |
onload: function(response,j){ | |
if(response){console.log(bookId +" - Mám response z prvniVolani, response.context = " + response.context); volaniDostupnost(response,bookId)} | |
else{ | |
var objekt = {}; | |
objekt.context = j+1; | |
console.log(bookId +" - NEMÁM response z prvniVolani, objekt = " + objekt); | |
volaniDostupnost(objekt,bookId); | |
}} | |
});} | |
else{ | |
var pocet_knih = document.createElement ('div'); | |
pocet_knih.innerHTML = "Nenalezeno"; | |
pocet_knih.setAttribute("class", "kniha-addon"); | |
list[response.context].firstElementChild.appendChild(pocet_knih); | |
return; | |
} | |
} | |
function volaniDostupnost(response,bookId) { | |
var pocet_knih = document.createElement ('div'); | |
pocet_knih.setAttribute("id", "kniha-" + bookId); | |
pocet_knih.setAttribute("class", "kniha-addon"); | |
pocet_knih.setAttribute("style", "color: hsl(0, 3%, 82%);"); | |
if (document.getElementById("book_right")){ | |
document.getElementById("book_right").appendChild(pocet_knih);} | |
else{ | |
try{list[response.context-1].firstElementChild.appendChild(pocet_knih);} | |
catch (error){console.log (response.context-1 + " - chyba: " + error);} | |
//document.getElementById(response.context).appendChild(pocet_knih); | |
} | |
var knih_celkem = document.createElement ('div'); | |
knih_celkem.innerHTML = '<span>Dostupných: </span><span id="kniha-' + bookId + '-celkem">0</span>'; | |
document.getElementById("kniha-" + bookId).appendChild(knih_celkem); | |
var knih_pobliz = document.createElement ('div'); | |
knih_pobliz.innerHTML = '<span>Poblíž: </span><span id="kniha-' + bookId + '-pobliz">0</span>'; | |
document.getElementById("kniha-" + bookId).appendChild(knih_pobliz); | |
celkem = 0; | |
blizko = 0; | |
var j=response.context-1; | |
// Funkce pro odeslání XMLHttpRequest s omezením opakování | |
function sendRequestWithRetry(bookId, j, retries) { | |
return new Promise((resolve, reject) => { | |
GM.xmlHttpRequest({ | |
context: j + 1, | |
method: "POST", | |
url: 'https://www.knihovny.cz/AJAX/JSON?method=getHolding&id=' + bookId, | |
data: "", | |
headers: { | |
"Content-Type": "application/x-www-form-urlencoded" | |
}, | |
onload: function (response) { | |
console.log('id=' + j + ' -> https://www.knihovny.cz/AJAX/JSON?method=getHolding&id=' + bookId); | |
// Zkontrolujeme, zda this.status je rovno 200 | |
if (this.status === 200) { | |
zpracujDostupnost(response, bookId); | |
} else { | |
// Pokud this.status není 200 a počet opakování je menší než 5, | |
// zavoláme funkci znovu po 1 vteřině | |
if (retries < 10) { | |
console.log(bookId + " - počkám a zopakuji"); | |
setTimeout(function () { | |
try { | |
sendRequestWithRetry(bookId, j, retries + 1); | |
} catch (error) { | |
console.error('Chyba při opakování:', error); | |
} | |
}, 2000); // 1000 ms = 1 sekunda | |
} else { | |
console.log('Dosáhli jsme limitu opakování (10).'); | |
} | |
} | |
} | |
}); | |
}); | |
} | |
// Spustíme první XMLHttpRequest s omezením na 5 opakování | |
try{sendRequestWithRetry(bookId, j, 0);} | |
catch(error){console.log('id=' + j + 'Chyba: ' + error)} | |
} | |
function zpracujDostupnost(response,bookId) { | |
var obj = ""; | |
console.log('i='+response.context-1+' -> '+response.responseText); | |
try{ | |
obj = JSON.parse(response.responseText); | |
console.log('i='+response.context-1+' -> '+obj);} | |
catch (error){ | |
console.log('Nepodařilo se parsovat response do JSON'); | |
console.log('i='+response.context-1+' -> '+obj); | |
} | |
if (obj != ""){ | |
var kniha, finished = 0; | |
for(kniha in obj.data.holding) { | |
if(obj.data.holding[kniha].status == "Dostupné") { | |
var celkem=document.getElementById("kniha-" + bookId + "-celkem").innerHTML; | |
celkem++; | |
document.getElementById("kniha-" + bookId + "-celkem").innerHTML=celkem; | |
} | |
if(obj.data.holding[kniha].status == "Dostupné" && blizkePobocky.includes(obj.data.holding[kniha].location)) { | |
var pobliz=document.getElementById("kniha-" + bookId + "-pobliz").innerHTML; | |
pobliz++; | |
document.getElementById("kniha-" + bookId + "-pobliz").innerHTML=pobliz; | |
} | |
} | |
if (typeof obj.data.next_item_token != 'undefined' && typeof obj.data.remaining != 'undefined' ){ | |
console.log(obj.data.remaining); | |
for(var remaining in obj.data.remaining) { | |
if(i != 0) { var postData = postData + "&"; } | |
postData = postData + "ids[]=" + remaining; | |
} | |
postData = postData + "&bibId=" + bookId; | |
volaniDostupnost(bookId, obj.data.remaining[0], postData, obj.data.next_item_token) | |
} | |
else{finished = 1;} | |
if (finished){ | |
document.getElementById("kniha-" + bookId ).setAttribute("style", "color: black"); | |
if(document.getElementById("kniha-" + bookId + "-pobliz").innerHTML > 0) | |
{document.getElementById("kniha-" + bookId + "-pobliz").setAttribute("style", "color: limegreen; font-weight: bold;");} | |
} | |
} | |
} | |
//--- Style our newly added elements using CSS. | |
GM_addStyle ( ` | |
#odkaz-na-annas, #odkaz-na-knihovny { | |
position: relative; | |
//top: 200px; | |
//left: 200px; | |
font-size: 20px; | |
//background: orange; | |
//border: 1px outset black; | |
margin: 5px 10px; | |
//opacity: 0.9; | |
z-index: 1100; | |
padding: 5px 5px; | |
color: black; | |
} | |
#myButton { | |
cursor: pointer; | |
} | |
#myContainer p { | |
// color: red; | |
// background: white; | |
} | |
.book_right{ | |
margin-bottom: 20px; | |
} | |
#book_right { | |
margin-bottom: 20px; | |
} | |
#book_right .kniha-addon { | |
margin-left: 20px; | |
line-height: 1.8em; | |
} | |
#book_action_buttons a img { | |
height: 50px !important; | |
margin-bottom: 20px;} | |
.my_books_item{ | |
text-align: center; | |
} | |
.extension-wrapper{ | |
text-align: center; | |
} | |
` ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment