UNPKG

jul11co-mangadl

Version:
427 lines (360 loc) 14.6 kB
var path = require('path'); var urlutil = require('url'); var utils = require('jul11co-wdt').Utils; module.exports = { name: 'Hakihome', website: 'http://hakihome.com', match: function(link, options) { return /hakihome\.com/g.test(link); }, dispatch: function(saver, $, page, options, callback) { if (options.group_by_site && !options.orig_output_dir) { options.orig_output_dir = options.output_dir; options.output_dir = path.join(options.orig_output_dir, 'Hakihome'); saver.setMangaOutputDir(options.output_dir); } var updateDownloadState = function(cb) { if (options.chapter_url == '' || typeof options.chapter_url == 'undefined') { console.log('Chapter URL missing'); return cb(); } // Check if all chapter pages are visited var all_chapter_pages_visited = true; for (var prop in options.chapter_pages) { if (options.chapter_pages[prop].visited == false) { all_chapter_pages_visited = false; break; } } if (all_chapter_pages_visited) { var state = saver.getStateData(options.chapter_url); if (state && state.done) { // console.log('Chapter done:', options.chapter_url); return cb(); } var chapter_images = []; var chapter_image_urls = []; for (var prop in options.chapter_pages) { var chapter_page = options.chapter_pages[prop]; chapter_images = chapter_images.concat(chapter_page.images); } // Remove duplicates chapter_images = chapter_images.filter(function(chapter_image) { if (chapter_image_urls.indexOf(chapter_image.src) == -1) { chapter_image_urls.push(chapter_image.src); return true; } return false; }); if (options.debug) console.log(chapter_images); var chapter_url = options.chapter_url; // $('.navsubbar a').last().attr('href'); var chapter_title = options.chapter_title || $('.khuonchap .tuade h1').first().text().trim(); // Reset chapter_pages options.chapter_pages = {}; options.chapter_url = ''; saver.downloadMangaChapter({ chapter_url: chapter_url, chapter_title: chapter_title, chapter_images: chapter_images, output_dir: options.chapter_output_dir }, options, cb); } else { // Get next unprocessed page in options.chapter_pages var next_page_url = ''; for (var prop in options.chapter_pages) { if (options.chapter_pages[prop].visited == false) { next_page_url = prop; break; } } var all_chapter_pages_count = 0; var visited_chapter_pages_count = 0; for (var chapter_page_url in options.chapter_pages) { all_chapter_pages_count++; if (options.chapter_pages[chapter_page_url].visited) visited_chapter_pages_count++; } console.log('Chapter page:', (visited_chapter_pages_count+1) + '/' + all_chapter_pages_count, next_page_url); // Process next page saver.processPage(next_page, options, cb); } } // saver.saveHtmlFile($, page, options); // options.request_headers = Object.assign(options.request_headers || {}, { // "Cookie": "ReadType=2; expires=Thu, 2 Aug 2020 20:47:11 UTC;path=/;" // }); options.request_headers = { "Cookie": "ReadType=2;expires=Thu, 2 Aug 2020 20:47:11 UTC;path=/;" }; // if (options.debug) console.log(options.request_headers); if ($('#contentchap').length) { if (options.debug) console.log('---'); if (options.debug) console.log('Chapter page:', page.url); if (!options.chapter_url) { options.chapter_url = page.url; options.chapter_title = $('.khuonchap .tuade h1').first().text().trim(); if (options.debug) console.log('Chapter URL:', options.chapter_url); var chapter_url_obj = urlutil.parse(options.chapter_url); var chapter_output_dir_name = path.basename(chapter_url_obj.pathname); options.chapter_output_dir = path.join(options.output_dir, chapter_output_dir_name); } var page_script = ''; $('script').each(function() { page_script += $(this).html(); }); var chapter_info = null; if (page_script && page_script.indexOf('var jsondata=[') != -1) { var chapter_info_str = utils.extractSubstring(page_script, 'var jsondata=[', '];'); try { chapter_info_str = '{"images": [' + chapter_info_str + ']}'; if (options.debug) console.log(chapter_info_str); chapter_info = JSON.parse(chapter_info_str); } catch(e) { console.log(e); } } else if (options.verbose) { console.log('No JSON data found.'); } if (chapter_info && chapter_info['images'] && chapter_info['images'].length) { var chapter_images = []; chapter_info['images'].forEach(function(page_src,idx) { chapter_images.push({ src: page_src }); }); if (options.debug) console.log(chapter_images); saver.downloadMangaChapter({ chapter_url: options.chapter_url, chapter_title: options.chapter_title, chapter_images: chapter_images, output_dir: options.chapter_output_dir }, options, function(err) { options.chapter_url = ''; callback(err); }); } else { var chapter_page_links = []; chapter_page_links.push(page.url); if ($('.khuonchap #con a').length) { var next_page = $('.khuonchap #con a').attr('href'); if (next_page && next_page != '' && next_page.indexOf(options.chapter_url) != -1) { if (options.debug) console.log('Next page:', next_page); chapter_page_links.push(next_page); } } if (typeof options.chapter_pages == 'undefined') { // Init data holder for chapter pages in options (passed through all callback) options.chapter_pages = {}; } for (var i = 0; i < chapter_page_links.length; i++) { var chapter_page_link = chapter_page_links[i]; var chapter_page_cache = saver.getStateData(chapter_page_link); if (chapter_page_cache && chapter_page_cache.visited && chapter_page_cache.images) { options.chapter_pages[chapter_page_link] = { visited: true, images: chapter_page_cache.images }; } else if (typeof options.chapter_pages[chapter_page_link] == 'undefined') { options.chapter_pages[chapter_page_link] = { visited: false, images: [] }; } } if (options.debug) console.log(options.chapter_pages); if (typeof options.chapter_pages != 'undefined' && typeof options.chapter_pages[page.url] != 'undefined') { options.chapter_pages[page.url].visited = true; } else { // console.log('Wrong state! This page not included in chapter links'); // return callback(); options.chapter_pages[page.url] = { visited: true, images: [] }; } // Get images on current page var images = saver.getImages($, page, '#con'); if (options.debug) console.log(images); // Save to options options.chapter_pages[page.url].images = options.chapter_pages[page.url].images.concat(images); saver.updateStateData(page.url, { images: options.chapter_pages[page.url].images }); updateDownloadState(callback); } } else if ($('.khuon').length && $('.chap .listing').length) { console.log('----'); console.log('Manga page: ' + page.url); var manga_title = $('.khuon .tuade a').first().text().trim(); console.log('Manga title: ' + manga_title); if (options.auto_manga_dir && !options.batch_download) { options.output_dir = path.join(options.output_dir, manga_title); saver.setMangaOutputDir(options.output_dir); } else if (/*options.auto_manga_dir && */options.batch_download) { var manga_output_dir = path.join(options.batch_output_dir, manga_title); saver.deleteStateData(page.url); saver.setMangaOutputDir(manga_output_dir, {save_old_state: true}); options.output_dir = manga_output_dir; } if (saver.isDone(page.url) && !options.refresh_info) { return callback(); } saver.setStateData('url', page.url); if (options.save_index_html) { saver.saveHtmlSync(path.join(options.output_dir, 'index.html'), $.html()); } var manga_info = this.getMangaInfo($, page, options); if (manga_info && manga_info.url) { saver.saveJsonSync(path.join(options.output_dir, 'manga.json'), manga_info); } var chapter_links = saver.getLinks($, page, '.chap .listing', { // filters: ['/read/'], blacklist: ['Contact.html'] }); chapter_links.reverse(); saver.downloadMangaChapters(chapter_links, options, callback); } else if ($('#content .khuon .tuade a').length) { options.paging_links = options.paging_links || {}; if (options.paging_links[page.url]) { return callback(); } options.paging_links[page.url] = 1; console.log('--'); console.log('Manga list: ' + page.url); options.batch_download = true; if (!options.batch_url) { options.batch_url = page.url; } if (!options.batch_output_dir) { options.batch_output_dir = options.output_dir; } if (options.batch_output_dir != options.output_dir) { saver.deleteStateData(page.url); saver.setMangaOutputDir(options.batch_output_dir, {save_old_state: true}); options.output_dir = options.batch_output_dir; } if (!saver.getStateData('url')) { saver.updateStateData('url', page.url); } var manga_links = saver.getLinks($, page, '#content .khuon .tuade', { // filters: ['/read/'] }); var paging_links = saver.getLinks($, page, '#content ul.nav'); saver.downloadMangaList(manga_links, options, function(err) { if (err) return callback(err); saver.setMangaOutputDir(options.batch_output_dir, {save_old_state: true}); options.output_dir = options.batch_output_dir; manga_links.forEach(function(link) { if (!saver.isVisited(link)) saver.setVisited(link); }); saver.setStateData('last_update', new Date()); if (options.all_pages && paging_links.length > 0) { if (options.refresh_info) { paging_links = paging_links.filter(function(link) { return !options.paging_links[link]; }); paging_links.forEach(function(link) { saver.updateStateData(link, {visited: 0}); }); } else { paging_links = paging_links.filter(function(link) { return !saver.isVisited(link); }); } saver.processPages(paging_links, options, callback); } else { callback(); } }); } else { callback(); } }, getMangaInfo: function($, page, options) { var manga_info = {}; if ($('.khuon').length && $('.chap .listing').length) { manga_info.url = page.url; manga_info.name = $('.khuon .tuade a').first().text().trim(); manga_info.cover_image = $('.khuon .noidung img').first().attr('src'); if ($('.khuon .time-tacgia span.time').length) { manga_info.time_str = $('.khuon .time-tacgia span.time').text().trim(); } if ($('.khuon .ca-lan .category a').length) { manga_info.categories = []; $('.khuon .ca-lan .category a').each(function() { var category_name = $(this).text().trim(); if (category_name) { manga_info.categories.push({ name: category_name, url: $(this).attr('href') }); } }); } if ($('.khuon .ca-lan .language a').length) { manga_info.language = { name: $('.khuon .ca-lan .language a').text().trim(), url: $('.khuon .ca-lan .language a').attr('href') } } if ($('.khuon .art-tran .art a').length) { manga_info.artists = []; $('.khuon .art-tran .art a').each(function() { var artist_name = $(this).text().trim(); if (artist_name) { manga_info.artists.push({ name: artist_name, url: $(this).attr('href') }); } }); } if ($('.khuon .art-tran .tran a').length) { manga_info.translators = []; $('.khuon .art-tran .tran a').each(function() { var translator_name = $(this).text().trim(); if (translator_name) { manga_info.translators.push({ name: translator_name, url: $(this).attr('href') }); } }); } if ($('.khuon .tag a').length) { manga_info.tags = []; $('.khuon .tag a').each(function() { var tag_name = $(this).text().trim(); if (tag_name) { manga_info.tags.push({ name: tag_name, url: $(this).attr('href') }); } }); } var manga_chapters = []; $('.chap .listing tr td a.readchap').each(function() { manga_chapters.push({ url: $(this).attr('href'), title: $(this).text().trim() }); }); manga_info.chapter_count = manga_chapters.length; if (options.include_chapters || options.with_chapters) { manga_info.chapters = manga_chapters; } if (options.verbose) { console.log('Manga:'); console.log(' Name: ' + manga_info.name); console.log(' Cover image: ' + manga_info.cover_image); // console.log(' Description: ' + manga_info.description); // console.log(' Authors: ' + manga_info.authors); // console.log(' Genres: ' + manga_info.genres); // console.log(' Status: ' + manga_info.status); console.log(' Chapter count: ' + manga_info.chapter_count); } } return manga_info; } }