diff --git a/docs/supportedsites.md b/docs/supportedsites.md
index eed7aa107e..3e088e72a7 100644
--- a/docs/supportedsites.md
+++ b/docs/supportedsites.md
@@ -433,6 +433,12 @@ Consider all sites to be NSFW unless otherwise known.
Chapters, Manga |
|
+
+ MangaSee |
+ https://mangasee123.com/ |
+ Chapters, Manga |
+ |
+
Mangoxo |
https://www.mangoxo.com/ |
diff --git a/gallery_dl/extractor/__init__.py b/gallery_dl/extractor/__init__.py
index d07c063686..d74d06d2f6 100644
--- a/gallery_dl/extractor/__init__.py
+++ b/gallery_dl/extractor/__init__.py
@@ -74,6 +74,7 @@
"mangakakalot",
"manganelo",
"mangapark",
+ "mangasee",
"mangoxo",
"myhentaigallery",
"myportfolio",
diff --git a/gallery_dl/extractor/mangasee.py b/gallery_dl/extractor/mangasee.py
new file mode 100644
index 0000000000..1b3dd18765
--- /dev/null
+++ b/gallery_dl/extractor/mangasee.py
@@ -0,0 +1,112 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2021 Mike Fährmann
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+
+"""Extractors for https://mangasee123.com/"""
+
+from .common import ChapterExtractor, MangaExtractor
+from .. import text
+import json
+
+
+class MangaseeBase():
+ category = "mangasee"
+ browser = "firefox"
+ root = "https://mangasee123.com"
+
+ @staticmethod
+ def _transform_chapter(data):
+ chapter = data["Chapter"]
+ return {
+ "title" : data["ChapterName"] or "",
+ "index" : chapter[0],
+ "chapter" : int(chapter[1:-1]),
+ "chapter_minor": "" if chapter[-1] == "0" else "." + chapter[-1],
+ "chapter_string": chapter,
+ "lang" : "en",
+ "language": "English",
+ "date" : text.parse_datetime(
+ data["Date"], "%Y-%m-%d %H:%M:%S"),
+ }
+
+
+class MangaseeChapterExtractor(MangaseeBase, ChapterExtractor):
+ pattern = r"(?:https?://)?mangasee123\.com(/read-online/[^/?#]+\.html)"
+ test = (("https://mangasee123.com/read-online"
+ "/Tokyo-Innocent-chapter-4.5-page-1.html"), {
+ "pattern": r"https://[^/]+/manga/Tokyo-Innocent/0004\.5-00\d\.png",
+ "count": 8,
+ "keyword": {
+ "chapter": 4,
+ "chapter_minor": ".5",
+ "chapter_string": "100045",
+ "count": 8,
+ "date": "dt:2020-01-20 21:52:53",
+ "extension": "png",
+ "filename": r"re:0004\.5-00\d",
+ "index": "1",
+ "lang": "en",
+ "language": "English",
+ "manga": "Tokyo Innocent",
+ "page": int,
+ "title": "",
+ },
+ })
+
+ def metadata(self, page):
+ extr = text.extract_from(page)
+ self.chapter = data = json.loads(extr("vm.CurChapter =", ";\r\n"))
+ self.domain = extr('vm.CurPathName = "', '"')
+ self.slug = extr('vm.IndexName = "', '"')
+
+ data = self._transform_chapter(data)
+ data["manga"] = extr('vm.SeriesName = "', '"')
+ return data
+
+ def images(self, page):
+ chapter = self.chapter["Chapter"][1:]
+ if chapter[-1] == "0":
+ chapter = chapter[:-1]
+ else:
+ chapter = chapter[:-1] + "." + chapter[-1]
+
+ base = "https://{}/manga/{}/".format(self.domain, self.slug)
+ if self.chapter["Directory"]:
+ base += self.chapter["Directory"] + "/"
+ base += chapter + "-"
+
+ return [
+ ("{}{:>03}.png".format(base, i), None)
+ for i in range(1, int(self.chapter["Page"]) + 1)
+ ]
+
+
+class MangaseeMangaExtractor(MangaseeBase, MangaExtractor):
+ chapterclass = MangaseeChapterExtractor
+ pattern = r"(?:https?://)?mangasee123\.com(/manga/[^/?#]+)"
+ test = (("https://mangasee123.com/manga"
+ "/Nakamura-Koedo-To-Daizu-Keisuke-Wa-Umaku-Ikanai"), {
+ "pattern": MangaseeChapterExtractor.pattern,
+ "count": ">= 17",
+ })
+
+ def chapters(self, page):
+ slug, pos = text.extract(page, 'vm.IndexName = "', '"')
+ chapters = json.loads(text.extract(
+ page, "vm.Chapters = ", ";\r\n", pos)[0])
+
+ result = []
+ for data in map(self._transform_chapter, chapters):
+ url = "{}/read-online/{}-chapter-{}{}".format(
+ self.root, slug, data["chapter"], data["chapter_minor"])
+ if data["index"] != "1":
+ url += "-index-" + data["index"]
+ url += "-page-1.html"
+
+ data["manga"] = slug
+ result.append((url, data))
+ return result
diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py
index 1bb5d654d2..92e703084f 100755
--- a/scripts/supportedsites.py
+++ b/scripts/supportedsites.py
@@ -68,6 +68,7 @@
"mangakakalot" : "MangaKakalot",
"manganelo" : "Manganato",
"mangapark" : "MangaPark",
+ "mangasee" : "MangaSee",
"mangastream" : "Manga Stream",
"mastodon.social": "mastodon.social",
"myhentaigallery": "My Hentai Gallery",