[
  {
    "path": "README.md",
    "content": "# bunken (文献)\n\nA chrome extension to download ebooks directly from Goodreads. Fetches ebooks from [LibGen](http://libgen.is), [LibGen Fiction](http://libgen.is/fiction), [Memory Of The World](http://library.memoryoftheworld.org) & [OpenLibrary](https://openlibrary.org). \n\n⚠️ Users are advised to exercise caution and use this Chrome extension at their own risk, as I disclaim any liability for the outcomes or actions resulting from its utilization.\n\n![](https://media.discordapp.net/attachments/706928005313855620/847449469381509130/unknown.png?width=970&height=701)\n\n## How to install\n1. Clone this repository.\n2. Open chrome extensions panel by visiting `chrome://extensions`.\n3. Turn developer mode on.\n4. Click on Load Unpacked.\n5. Select the folder containing the repository with the root directory.\n6. Visit any books' page on Goodreads. The ebooks should load under Related Books section.\n7. Choose different sources according to your needs.\n\n## How to contribute\nHelp contribute by using it, finding bugs and opening issues. Pull requests are also appreciated!\n\nAPI repository available at [laxyapahuja/bunken-api](https://github.com/laxyapahuja/bunken-api).\n"
  },
  {
    "path": "manifest.json",
    "content": "{\n    \"name\": \"bunken\",\n    \"version\": \"3.1\",\n    \"manifest_version\": 3,\n    \"action\": {\n        \"default_icon\": \"./icon.png\",\n        \"default_title\": \"bunken\"\n    },\n    \"icons\": {\n        \"300\": \"./icon.png\"\n    },\n    \"content_scripts\": [{\n        \"matches\": [\"https://www.goodreads.com/book/show/*\"],\n        \"js\": [\"support/goodreads/content.js\"],\n        \"run_at\": \"document_end\"\n    }],\n    \"web_accessible_resources\": [{ \"resources\": [\"support/goodreads/script.js\"], \"matches\": [\"*://*.goodreads.com/*\"] }],\n    \"permissions\": [\n        \"tabs\"\n    ],\n    \"host_permissions\": [\n        \"*://libgen.is/*\",\n        \"*://goodreads.com/*\",\n        \"*://api.bunken.tk/*\"\n    ]\n}"
  },
  {
    "path": "support/goodreads/content.js",
    "content": "let s = document.createElement('script');\n\ns.src = chrome.runtime.getURL('support/goodreads/script.js');\n\ndocument.head.appendChild(s);"
  },
  {
    "path": "support/goodreads/script.js",
    "content": "const API = 'https://api.bunken.tk/'\n\nlet isRedesign = !document.querySelector(\"[property='books:isbn']\")\nlet bookJSON = isRedesign ? JSON.parse(document.querySelector('[type=\"application/ld+json\"]').innerText) : {}\nlet ebookElement = document.createElement('div')\nlet ebookResultsElement;\nlet relatedElement = isRedesign ? document.querySelector('.BookActions') : document.querySelector('[id^=\"relatedWorks-\"]')\nlet bookTitle = document.querySelector(\"[property='og:title']\").getAttribute(\"content\");\nlet ISBNCode = isRedesign ? bookJSON.isbn : document.querySelector(\"[property='books:isbn']\").getAttribute(\"content\");\nlet authorName = isRedesign ? bookJSON.author[0].name : document.getElementsByClassName('authorName')[0].innerText\n\nfunction insertAfter(referenceNode, newNode) {\n    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\n}\n\nfunction ebookElementInflator(results) {\n    ebookResultsElement.innerHTML = ''\n    results.forEach(book => {\n        let resultElement = document.createElement('div')\n        resultElement.className = 'elementList'\n        let bookElement = document.createElement('div')\n        let bookLinkElement = document.createElement('a')\n        bookLinkElement.href = book.link\n        bookLinkElement.textContent = book.title\n        bookLinkElement.className = 'actionLinkLite bookPageGenreLink'\n        bookLinkElement.target = \"_blank\"\n        bookElement.appendChild(bookLinkElement)\n        resultElement.appendChild(bookElement)\n\n        if (book.downloads != null) {\n            book.downloads.forEach(download => {\n                let downloadElement = document.createElement('div')\n                let downloadLinkElement = document.createElement('a')\n                downloadLinkElement.href = download.link\n                downloadLinkElement.textContent = download.format\n                downloadLinkElement.style.color = 'blue'\n                downloadElement.appendChild(downloadLinkElement)\n                resultElement.appendChild(downloadElement)\n            })\n        }\n\n        let authorElement = document.createElement('div')\n        authorElement.textContent = book.author\n        resultElement.appendChild(authorElement)\n\n        let clearElement = document.createElement('div')\n        clearElement.className = 'clear'\n        resultElement.appendChild(clearElement)\n\n        ebookResultsElement.appendChild(resultElement)\n    })\n}\n\nfunction sourceSelect() {\n    let e = document.getElementById(\"source\");\n    let value = e.options[e.selectedIndex].value;\n    search(value)\n}\n\nfunction setupUI() {\n    let template = `<div class=\"h2Container gradientHeaderContainer\">\n                        <h2 class=\"brownBackground\">E-Books</h2>\n                    </div>\n                    <select id=\"source\" onchange=\"sourceSelect()\">\n                    <option value=\"libgen/fiction\">Source: LibGen Fiction</option>\n                    <option value=\"libgen\">Source: LibGen</option>\n                    <option value=\"motw\">Source: Memory Of The World</option>\n                    <option value=\"audiobookbay\">Source: AudioBookBay</option>\n                    <option value=\"openlibrary\">Source: OpenLibrary</option>\n                    </select> \n                    <div id=\"ebookResults\" class=\"bigBoxContent containerWithHeaderContent\" style=\"overflow-y: auto; max-height: 300px;\" id=\"resultsDiv\">Searching...</div>`\n    ebookElement.innerHTML = template\n    ebookElement.className = 'bigBox'\n    ebookElement.innerHTML += `<h4>made by <a target=\"_blank\" href=\"https://laxya.co\">laxyapahuja</a></h4><h4>extension not working? message me on <a target=\"_blank\" href=\"https://discord.gg/GwDraJjMga\">discord</a>.</h4>`\n    insertAfter(relatedElement, ebookElement)\n    ebookResultsElement = document.getElementById('ebookResults')\n}\n\nfunction search(source) {\n    ebookResultsElement.innerHTML = 'Searching...'\n    fetch(`${API}${source}?title=${encodeURIComponent(bookTitle)}&isbn=${encodeURIComponent(ISBNCode)}&author=${encodeURIComponent(authorName)}`).then(response => {\n        response.json().then(res => {\n            ebookElementInflator(res)\n        })\n    })\n}\n\nsetupUI();\nsearch('libgen/fiction')"
  }
]