Skip to content

Instantly share code, notes, and snippets.

@Vojtik69
Created December 7, 2023 13:44
Show Gist options
  • Save Vojtik69/6cd384eef380a9cfc56ae797abdd99dd to your computer and use it in GitHub Desktop.
Save Vojtik69/6cd384eef380a9cfc56ae797abdd99dd to your computer and use it in GitHub Desktop.
// ==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