Manga Loader (unmaintained)

Support for over 70 sites! Loads manga chapter into one page in a long strip format, supports switching chapters, minimal script with no dependencies, easy to implement new sites, loads quickly and works on mobile devices through bookmarklet

Old: v1.7.7 - 2015-08-08 - fixed order of next page crash to allow image to load; added prismblush
New: v1.7.8 - 2015-08-17 - added kukudm, vortex-scans, japanzai, roseliascans, mangatopia, twistedhelscans (the site doesn't seem to be working ATM), sensescans, kireicake, substitutescans, mangaichiscans, shoujosense, friendshipscans; apply wait condition even when not autoloading

  • --- /tmp/diffy20250429-458059-63fk61 2025-04-29 18:09:45.224894108 +0000
  • +++ /tmp/diffy20250429-458059-gw3iox 2025-04-29 18:09:45.224894108 +0000
  • @@ -1,7 +1,7 @@
  • // ==UserScript==
  • // @name Manga Loader
  • // @namespace http://www.fuzetsu.com/MangaLoader
  • -// @version 1.7.7
  • +// @version 1.7.8
  • // @description Loads manga chapter into one page in a long strip format, supports switching chapters and works for a variety of sites, minimal script with no dependencies, easy to implement new sites, loads quickly and works on mobile devices through bookmarklet
  • // @copyright 2014+, fuzetsu
  • // @noframes
  • @@ -55,10 +55,23 @@
  • // @match http://manga.redhawkscans.com/reader/read/*
  • // @match http://reader.s2smanga.com/read/*
  • // @match http://casanovascans.com/read/*
  • +// @match http://reader.vortex-scans.com/read/*
  • +// @match http://reader.japanzai.com/read/*
  • +// @match http://reader.roseliascans.com/read/*
  • +// @match http://mangatopia.net/slide/read/*
  • +// @match http://www.twistedhelscans.com/read/*
  • +// @match http://reader.sensescans.com/reader/read/*
  • +// @match http://reader.kireicake.com/reader/read/*
  • +// @match http://substitutescans.com/reader/read/*
  • +// @match http://mangaichiscans.mokkori.fr/fs/read/*
  • +// @match http://reader.shoujosense.com/read/*
  • +// @match http://www.friendshipscans.com/slide/read/*
  • +
  • // @match http://hentaifr.net/*
  • // @match *://mangatraders.org/read-online/*/*
  • // @match http://www.mangainn.me/manga/chapter/*
  • // @match http://prismblush.com/comic/*
  • +// @match http://www.kukudm.com/comiclist/*/*
  • // ==/UserScript==
  • // should be set to true externally if auto loading is wanted (e.g. bookmarklet)
  • @@ -677,9 +690,13 @@
  • invchap: true
  • }, {
  • name: 'foolslide',
  • - match: "^(http://manga.redhawkscans.com/reader/read/.+|http://reader.s2smanga.com/read/.+|http://casanovascans.com/read/.+)",
  • - img: 'img.open',
  • - next: 'img.open',
  • + match: "^(http://manga.redhawkscans.com/reader/read/.+|http://reader.s2smanga.com/read/.+|http://casanovascans.com/read/.+|http://reader.vortex-scans.com/read/.+|http://reader.japanzai.com/read/.+|http://reader.roseliascans.com/read/.+|http://mangatopia.net/slide/read/.+|http://www.twistedhelscans.com/read/.+|http://reader.sensescans.com/reader/read/.+|http://reader.kireicake.com/reader/read/.+|http://substitutescans.com/reader/read/.+|http://mangaichiscans.mokkori.fr/fs/read/.+|http://reader.shoujosense.com/read/.+|http://www.friendshipscans.com/slide/read/.+)",
  • + img: function() {
  • + return W.pages[W.current_page].url;
  • + },
  • + next: function() {
  • + return 'N/A';
  • + },
  • numpages: function() {
  • return W.pages.length;
  • },
  • @@ -763,6 +780,25 @@
  • match: "^http://prismblush.com/comic/.+",
  • img: '#comic img',
  • next: '#comic a'
  • +}, {
  • + name: 'kukudm',
  • + match: "http://www.kukudm.com/comiclist/[0-9]+/[0-9]+/[0-9]+.htm",
  • + img: function(ctx) {
  • + var script = getEl('td > script[language=javascript]', ctx);
  • + if(script) {
  • + return 'http://n.kukudm.com/' + script.textContent.match(/newkuku[^']+/)[0];
  • + }
  • + },
  • + next: function(ctx) {
  • + var links = getEls('td > a', ctx);
  • + return links[links.length - 1].getAttribute('href');
  • + },
  • + numpages: function(cur) {
  • + return parseInt(document.body.textContent.match(/共([0-9]+)页/)[1]);
  • + },
  • + curpage: function() {
  • + return parseInt(document.body.textContent.match(/第([0-9]+)页/)[1]);
  • + }
  • }];
  • var log = function(msg, type) {
  • @@ -1354,27 +1390,30 @@
  • var success = implementations.some(function(imp) {
  • var intervalId;
  • + var waitAndLoad = function() {
  • + if(typeof imp.wait === 'function') {
  • + log('Waiting for load condition to be fulfilled');
  • + intervalId = setInterval(function() {
  • + if(imp.wait()) {
  • + log('Condition fulfilled, loading');
  • + clearInterval(intervalId);
  • + loadManga(imp);
  • + }
  • + }, 200);
  • + } else {
  • + setTimeout(loadManga.bind(null, imp), imp.wait || 0);
  • + }
  • + };
  • if (imp.match && (new RegExp(imp.match, 'i')).test(pageUrl)) {
  • currentImpName = imp.name;
  • if (autoload !== 'no' && (BM_MODE || mAutoload || autoload)) {
  • log('autoloading...');
  • - if(typeof imp.wait === 'function') {
  • - log('Waiting for load condition to be fulfilled');
  • - intervalId = setInterval(function() {
  • - if(imp.wait()) {
  • - log('Condition fulfilled, loading');
  • - clearInterval(intervalId);
  • - loadManga(imp);
  • - }
  • - }, 200);
  • - } else {
  • - setTimeout(loadManga.bind(null, imp), imp.wait || 0);
  • - }
  • -
  • + waitAndLoad();
  • +
  • return true;
  • }
  • // append button to dom that will trigger the page load
  • btnLoad = createButton('Load Manga', function(evt) {
  • - loadManga(imp);
  • + waitAndLoad();
  • this.remove();
  • }, btnLoadCss);
  • document.body.appendChild(btnLoad);