Goodreads Plus

Add "Search MAM" button to Goodreads

  1. // ==UserScript==
  2. // @name Goodreads Plus
  3. // @namespace https://greasyfork.org/en/users/78880
  4. // @version 0.3.13
  5. // @description Add "Search MAM" button to Goodreads
  6. // @author Slengpung
  7. // @match https://www.goodreads.com/*
  8. // @grant none
  9. // @license MIT
  10. // ==/UserScript==
  11.  
  12. window.addEventListener("load", Greasemonkey_main, false);
  13. function Greasemonkey_main() {
  14. console.log("[G+] Tweaking Goodreads...");
  15. var page = window.location.pathname.split('/')[1];
  16. var mamSearchUrl = "";
  17. var buttonBar = "";
  18. var mamButton = "";
  19. var buttonUl = "";
  20. var bookTitle = "";
  21. if(page === 'book'){
  22. console.log("[G+] We got a book URL");
  23.  
  24. // Try different ways to grab book title
  25. try {
  26. bookTitle = document.getElementsByClassName("Text__title1")[0].innerHTML;
  27. }
  28. catch {
  29. bookTitle = document.getElementById("bookTitle").innerText;
  30. }
  31. finally {
  32. console.log("[G+] Book title: " + bookTitle);
  33. bookTitle = bookTitle.replace('&', '%26');
  34. bookTitle = bookTitle.replace('&', '%26');
  35. }
  36. mamSearchUrl = "https://www.myanonamouse.net/tor/browse.php?tor[text]=" + bookTitle;
  37. // Add 'Search MAM' button
  38. // Old or new layout?
  39. var old = document.getElementById("buyButtonContainer");
  40. if(old != null) {
  41. console.log("[G+] Old layout");
  42. buttonBar = document.getElementById("buyButtonContainer");
  43. if (buttonBar === null || buttonBar == "null") {
  44. buttonBar = document.getElementById("asyncBuyButtonContainer");
  45. }
  46. buttonUl = buttonBar.getElementsByTagName("ul");
  47. mamButton = document.createElement("li");
  48. mamButton.innerHTML = '<a id="mamLink" href="' + mamSearchUrl + '" target="_blank" class="buttonBar">Search MAM</a>';
  49. mamButton.className = "Button";
  50. buttonUl[0].appendChild(mamButton);
  51. console.log("[G+] 'Search MAM' button added!");
  52. }
  53. else {
  54. console.log("[G+] New layout");
  55. buttonBar = document.getElementsByClassName("BookActions")[0];
  56. mamButton = document.getElementsByClassName("BookActions__button")[0].cloneNode(true);
  57. mamButton.innerHTML = '<div class="BookActions__button"><a href="' + mamSearchUrl + '">' +
  58. '<div class="Button__container Button__container--block">' +
  59. '<button type="button" class="Button Button--secondary Button--medium Button--block">' +
  60. '<span class="Button__labelItem" style="text-decoration=none">Search MAM</span></button></div></a></div>';
  61. buttonBar.appendChild(mamButton)
  62. console.log("[G+] 'Search MAM' button added!");
  63. }
  64. } else if(page === 'review'){
  65. var bookList = document.querySelectorAll('#booksBody .title div a');
  66. // Loop over all the books
  67. for(var i=0; i<bookList.length; i++){
  68. bookTitle = getBookTitle(bookList[i]);
  69. bookTitle = bookTitle.replace('&amp;', '%26');
  70. bookTitle = bookTitle.replace('&', '%26');
  71. mamSearchUrl = "https://www.myanonamouse.net/tor/browse.php?tor[text]=" + bookTitle;
  72. // Add 'Search MAM' button
  73. var newLink = document.createElement('a');
  74. var linkText = document.createTextNode('[Search MAM]');
  75. newLink.appendChild(linkText);
  76. newLink.setAttribute('href',mamSearchUrl);
  77. newLink.setAttribute('style','color:#b3b3b3;font-style:italic');
  78. bookList[i].parentNode.parentNode.appendChild(newLink);
  79. }
  80. console.log("[G+] 'Search MAM' buttons added!");
  81. }
  82. }
  83. // Grab book title (and only title) from the element
  84. function getBookTitle(el){
  85. var bookTitle = el.innerHTML.trim().split('<', 1)+'';
  86. console.log("Book title: " + bookTitle.trim());
  87. return bookTitle.trim();
  88. }