// ==UserScript== // @name Mananelo/Mangakakalot/Manganato Bookmarks Export // @namespace http://smoondev.com/ // @version 2.11 // @description Writes Mangakakalot, Manganelo, Manganato Bookmarks (name and visited number) to "manga_bookmarks.txt" on "Export Bookmarks" button click // @author Shawn Moon // @match https://mangakakalot.com/bookmark* // @match https://manganelo.com/bookmark* // @match https://manganato.com/bookmark* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js // @downloadURL none // ==/UserScript== function addBookarkStyles(css) { var head, style; head = document.getElementsByTagName('head')[0]; if (!head) { return; } style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = css; head.appendChild(style); } addBookarkStyles(` #export_container_nato, #export_container_kakalot { color: #000; cursor: pointer; float: right; } #export_container_kakalot { margin-right: 10px; } #export_nato:hover, #export_kakalot:hover { background-color: #b6e4e3; color: #000; cursor: pointer; } #export_nato, #export_kakalot { padding: 4px 8px; border-radius: 5px; text-decoration: none; color: #fff; background-color: #76cdcb; border: none; font-weight: 600; } #inclURL_nano { } #inclURL_kakalot { margin-left: 10px; } .inclURL_kakalot { color: #ffffff; } #temp_data { position: absolute; top: -9999px; left: -9999px; } `); (async function() { 'use strict'; let pageI, bmTag, bmTitle, lastViewed, btnContainer, exportButtonID, globalCheck = false, inclURL, exportContainer, pageCount = 0, domain = window.location.hostname, bookmarkHeader = `===========================\n${domain} Bookmarks\n===========================\n` if(domain == 'mangakakalot.com') { pageI = '.group_page a' bmTag = '.bookmark_item' bmTitle = '.bookmark_title' lastViewed = '.bookmark_chap a' btnContainer = '.breadcrumbs p' inclURL = 'inclURL_kakalot' pageCount = parseInt($(`${pageI}`).last().text().replace(/\D+/g, '')) exportButtonID = 'export_kakalot' exportContainer = 'export_container_kakalot' } else if(domain == 'manganato.com') { btnContainer = '.panel-breadcrumb' inclURL = 'inclURL_nato' exportButtonID = 'export_nato' exportContainer = 'export_container_nato' } const waitFor = delay => new Promise(resolve => setTimeout(resolve, delay)); const saveFile = saveData => { // save file const fileData = new Blob([saveData], {type:"application/octet-stream"}) saveAs(fileData, "manga_bookmarks.txt") $(`#${exportButtonID}`).html('Export Bookmarks').prop('disabled', false) } const deleteTemp = () => { // delete temp container $('#temp_data').remove() } const getCookie = (name = 'user_acc') => { let returnVal = false const value = `; ${document.cookie}` const parts = value.split(`; ${name}=`) try { if (parts.length === 2) { let user = parts.pop().split(';').shift() user = JSON.parse(decodeURIComponent(user)) returnVal = user.user_data } } catch (e) { returnVal = false } return returnVal } const getBMs = async (userCookie, currentPage = 1) => { var myHeaders = new Headers(); myHeaders.append("Content-Type", "application/x-www-form-urlencoded"); var urlencoded = new URLSearchParams(); urlencoded.append("out_type", "json"); urlencoded.append("bm_source", "manganato"); urlencoded.append("bm_page", currentPage); urlencoded.append("user_data", userCookie); var requestOptions = { method: 'POST', headers: myHeaders, body: urlencoded, redirect: 'follow' }; let bmArray = [] return await fetch("https://user.mngusr.com/bookmark_get_list_full", requestOptions) .then(response => response.json()) .then(result => result) .catch(error => console.log('ExportError', error)); } if($('#export_container').length === 0){ $(`${btnContainer}`).append(`
`) } $(document).on('change', '#inclURL', function() { globalCheck = $(this).is(":checked") }) const getBookmarks = (url) => { // main function generate file deleteTemp() $('body').append("
") let pageSuccess = 0; let bookmarkedTitles = bookmarkHeader for(let i = 0; i < pageCount; i++) { $("#temp_data").append(`
`) $(`#page${i+1}`).load(`https://${domain}/bookmark?page=${i+1} ${bmTag}`, (resp,status,xhr) => { if(status == "success") { pageSuccess++ } if(pageSuccess == pageCount) { let bmItem = $(`#temp_data ${bmTag}`) for(let j = 0; j < bmItem.length; j++) { if($(bmItem[j]).find(`${bmTitle}`).text()) { let last_viewed = $(bmItem[j]).find(`${lastViewed}`), bookmarked_title = $(bmItem[j]).find(`${bmTitle}`); if(bookmarked_title.length > 0) { bookmarkedTitles += $(bmItem[j]).find(`${bmTitle}`).text() + ` || Viewed: ${last_viewed.length > 0 ? last_viewed[0].text : 'Not Found' } ${url ? `- ${last_viewed[0].href}` : ''} \n` } } } saveFile(bookmarkedTitles) deleteTemp() } }) } } $(`#${exportButtonID}`).on('click', async function() { let bookmarkedTitles = bookmarkHeader let inclURLCheck = $(`#${inclURL}`).is(':checked'); if(domain == 'mangakakalot.com') { $(this).html('Generating File...').prop('disabled', true) getBookmarks(inclURLCheck) } else if(domain == 'manganato.com') { let userData = getCookie() if(userData) { $(this).html('Generating File...').prop('disabled', true) let initBMFetch = await getBMs(userData) pageCount = initBMFetch.bm_page_total || 0 if(pageCount > 0) { for(let i = 1; i <= pageCount; i++) { let currPage = await getBMs(userData, i) let currPageBMs = currPage.data for(let j = 0; j < currPageBMs.length; j++) { bookmarkedTitles += `${currPageBMs[j].note_story_name} || Viewed: ${currPageBMs[j].chapter_namenow} ${inclURLCheck ? `- ${currPageBMs[j].link_chapter_now}` : ''} \n` } } saveFile(bookmarkedTitles) } } } }) })();