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.11.4 - 2016-10-14 - fixed japscan.com
New: v1.11.5 - 2016-10-27 - update thanks to @nobody123: "Added cartoomad.com, ikanman.com, tw.ikanman.com, mangamint.com, reader.manga-download.org (foolslide), titaniascans.com (uses spinyback impl), komikstation.com, manga-ar.net (foolslide), and gmanga.me Fixed mangastream.com/read/* urls (credit: Snorlax)"

  • --- /tmp/diffy20240609-3099193-633nmz 2024-06-09 03:35:49.102861786 +0000
  • +++ /tmp/diffy20240609-3099193-n9dbm1 2024-06-09 03:35:49.102861786 +0000
  • @@ -1,7 +1,7 @@
  • // ==UserScript==
  • // @name Manga Loader
  • // @namespace http://www.fuzetsu.com/MangaLoader
  • -// @version 1.11.4
  • +// @version 1.11.5
  • // @description 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
  • // @copyright 2016+, fuzetsu
  • // @noframes
  • @@ -12,6 +12,7 @@
  • // @match *://mangafox.me/manga/*/*/*
  • // @match *://readms.com/r/*/*/*/*
  • // @match *://mangastream.com/r/*/*/*/*
  • +// @match *://mangastream.com/read/*/*/*/*
  • // @match *://www.mangareader.net/*/*
  • // @match *://*.mangahere.co/manga/*/*
  • // @match *://www.mangapanda.com/*/*
  • @@ -68,6 +69,12 @@
  • // @match *://*.otakusmash.com/*/*
  • // @match *://*.mangahome.com/manga/*/*
  • // @match *://*.readcomics.tv/*/chapter*
  • +// @match *://*.cartoomad.com/comic/*
  • +// @match *://*.ikanman.com/comic/*/*
  • +// @match *://*.mangamint.com/*
  • +// @match *://*.titaniascans.com/reader/*/*
  • +// @match *://*.komikstation.com/*/*/*
  • +// @match *://*.gmanga.me/mangas/*/*/*
  • // -- FOOLSLIDE START
  • // @match *://manga.redhawkscans.com/reader/read/*
  • // @match *://reader.s2smanga.com/read/*
  • @@ -95,6 +102,8 @@
  • // @match *://jaiminisbox.com/reader/read/*
  • // @match *://reader.sensescans.com/read/*
  • // @match *://*.gomanga.co/reader/read/*
  • +// @match *://reader.manga-download.org/read/*/*
  • +// @match *://*.manga-ar.net/manga/*/*/*
  • // -- FOOLSLIDE END
  • // ==/UserScript==
  • @@ -387,7 +396,8 @@
  • curpage: '#pages',
  • nextchap: '#next_chapter',
  • prevchap: '#back_chapter'
  • -}, { // pecintakomik
  • +}, {
  • + name: 'pecintakomik',
  • match: "^https?://www\\.pecintakomik\\.com/manga/[^/]*/[^/]*",
  • img: '.picture',
  • next: '.pager a:nth-child(3)',
  • @@ -660,7 +670,9 @@
  • "jaiminisbox.com/reader/read/.+",
  • "abandonedkittenscans.mokkori.fr/reader/read/.+",
  • "reader.sensescans.com/read/.+",
  • - "gomanga.co/reader/read/.+"
  • + "gomanga.co/reader/read/.+",
  • + "reader\.manga-download\.org/read/.+",
  • + "(www\.)?manga-ar\.net/manga/.+/.+/.+"
  • ].join('|') + ")",
  • img: function() {
  • return W.pages[W.current_page].url;
  • @@ -676,7 +688,7 @@
  • },
  • nextchap: function(prev) {
  • var desired;
  • - var dropdown = getEls('ul.dropdown')[1] || getEls('ul.uk-nav')[1];
  • + var dropdown = getEls('ul.dropdown')[1] || getEls('ul.uk-nav')[1] || getEls('ul.dropdown-menu')[3];
  • if(!dropdown) return;
  • getEls('a', dropdown).forEach(function(chap, idx, arr) {
  • if(location.href.indexOf(chap.href) === 0) desired = arr[idx + (prev ? 1 : -1)];
  • @@ -908,10 +920,10 @@
  • curpage: '.viewerPage',
  • numpages: '.viewerPage'
  • }, {
  • - name: 'spinybackmanga',
  • - match: '^https?://spinybackmanga.com/\\?manga=[^&]+&chapter=.+',
  • + name: 'spinybackmanga and titaniascans',
  • + match: '^https?://(spinybackmanga.com/\\?manga=[^&]+&chapter=.+|www\.titaniascans\.com/reader/.+/.+)',
  • img: '#thePicLink img',
  • - next: '#thePicLink img',
  • + next: '#thePicLink',
  • curpage: function() {
  • return W.current;
  • },
  • @@ -940,7 +952,8 @@
  • return this.nextchap(true);
  • },
  • pages: function(url, num, cb, ex) {
  • - cb(W.imageArray[num - 1], num);
  • + var next = url.replace(/(?:(\/)2\/|[0-9]*)$/, '$1' + (num + 1));
  • + cb(W.imageArray[num - 1], next);
  • }
  • }, {
  • name: 'manga.ae',
  • @@ -1110,6 +1123,131 @@
  • curchap: 'select[name=chapter_select]',
  • numchaps: 'select[name=chapter_select]',
  • wait: 'select[name=page_select]'
  • +}, {
  • + name: 'cartoomad',
  • + match: "https?://(www\\.)?cartoomad\.com/comic/[0-9]+\.html",
  • + img: 'tr:nth-child(5) > td > a > img',
  • + next: 'tr:nth-child(5) > td > a',
  • + curpage: 'a.onpage',
  • + numpages: function() {
  • + return extractInfo('select[name=jump]') - 1;
  • + }
  • +}, {
  • + name: 'ikanman',
  • + match: "https?://(www|tw)\.ikanman\.com/comic/[0-9]+/[0-9]+\.html",
  • + img: '#mangaFile',
  • + next: function() {
  • + return W._next;
  • + },
  • + curpage: '#page',
  • + numpages: '#pageSelect',
  • + nextchap: function(prev) {
  • + var chap = prev ? W._prevchap : W._nextchap;
  • + if (chap > 0) {
  • + return location.href.replace(/(\/comic\/[0-9]+\/)[0-9]+\.html.*/, "$1" + chap + ".html");
  • + } else {
  • + return false;
  • + }
  • + },
  • + prevchap: function() {
  • + return this.nextchap(true);
  • + },
  • + wait: function() {
  • + // fetch chapter IDs via ajax
  • + if (!W._ajaxdone) {
  • + W._ajaxdone = -1;
  • + ajax({
  • + method: 'GET',
  • + async: false,
  • + url: '/support/chapter.ashx?' + 'bid=' + W.cInfo.bid + '&cid=' + W.cInfo.cid,
  • + responseType: 'json',
  • + onload: function (e) {
  • + var res = e.target.response;
  • + console.log('res', res);
  • + if (!res) return log('failed to load ikanman chapters, site has probably been updated, report on forums', 'error');
  • + W._nextchap = res.n;
  • + W._prevchap = res.p;
  • + W._ajaxdone = 1;
  • + }
  • + });
  • + }
  • + if (W._ajaxdone == 1 && getEl('#mangaFile')) {
  • + var ex = extractInfo.bind(this);
  • + W._next = location.href.replace(/(_p[0-9]+)?\.html.*/, '_p' + (ex('curpage') + 1) + '.html');
  • + W._base = ex('img').replace(/[^\/]+$/, '');
  • + return true;
  • + }
  • + },
  • + pages: function(url, num, cb, ex) {
  • + var nexturl = url.replace(/(_p[0-9]+)?\.html.*/, '_p' + (num + 1) + '.html');
  • + var imgurl = W._base + W.cInfo.files[num - 1];
  • + cb(imgurl, nexturl);
  • + }
  • +}, {
  • + name: 'mangamint',
  • + match: 'https?://www\.mangamint\.com/[^/]+$',
  • + img: '#images img',
  • + next: '#images a',
  • + curpage: '#manga_page',
  • + numpages: '#manga_page',
  • + nextchap: function(prev) {
  • + return location.origin + '/node/' + extractInfo('#select_node', {type: 'value', val: prev ? -1 : 1});
  • + },
  • + prevchap: function() {
  • + return this.nextchap(true);
  • + },
  • + curchap: '#select_node',
  • + numchaps: '#select_node'
  • +}, {
  • + name: 'komikstation',
  • + match: "^https?://www\.komikstation\.com/.+/.+/.+",
  • + img: '#mainpage',
  • + next: function() {
  • + return W._base + '?page=' + (W.glbCurrentpage + 1);
  • + },
  • + numpages: '#index select',
  • + curpage: '#index select',
  • + pages: function(url, num, cb, ex) {
  • + next = W._base + '?page=' + (num + 1);
  • + cb(W.pages[num - 1], next);
  • + },
  • + wait: function() {
  • + W._base = location.href.replace(/[?#].+$/, '');
  • + return W.pages;
  • + }
  • +}, {
  • + name: 'gmanga',
  • + match: "^https?://gmanga.me/mangas/",
  • + img: function() {
  • + return W.pages[W.firstImg - 1];
  • + },
  • + next: function() {
  • + return location.href + '#' + (W.firstImg + 1);
  • + },
  • + numpages: function() {
  • + return W.totalImgs;
  • + },
  • + curpage: function() {
  • + return W.firstImg;
  • + },
  • + nextchap: function(prev) {
  • + var num = parseInt(extractInfo('#chapter', {type: 'value', val: prev ? 1 : -1}));
  • + return num && location.href.replace(/(\/mangas\/[^\/]+\/)[0-9]+(\/[^\/]+)/, '$1' + num + '$2');
  • + },
  • + prevchap: function() {
  • + return this.nextchap(true);
  • + },
  • + numchaps: '#chapter',
  • + curchap: '#chapter',
  • + invchap: true,
  • + pages: function(url, num, cb, ex) {
  • + var nexturl = location.href + '#' + (num + 1);
  • + cb(W.pages[num - 1], nexturl);
  • + },
  • + wait: function() {
  • + W.pages = W.release_pages && W.release_pages[1];
  • + return W.pages;
  • + }
  • }];
  • // END OF IMPL