diff --git a/docs/supportedsites.rst b/docs/supportedsites.rst
index 87b67331..7947e778 100644
--- a/docs/supportedsites.rst
+++ b/docs/supportedsites.rst
@@ -76,6 +76,7 @@ Manga Fox https://fanfox.net/ Chapters
Manga Here https://www.mangahere.cc/ Chapters, Manga
Manga Stream https://readms.net/ Chapters
MangaDex https://mangadex.org/ Chapters, Manga
+MangaKakalot https://mangakakalot.com/ Chapters, Manga
Mangapanda https://www.mangapanda.com/ Chapters, Manga
MangaPark https://mangapark.net/ Chapters, Manga
Mangareader https://www.mangareader.net/ Chapters, Manga
diff --git a/gallery_dl/extractor/__init__.py b/gallery_dl/extractor/__init__.py
index 12dd36d4..31846633 100644
--- a/gallery_dl/extractor/__init__.py
+++ b/gallery_dl/extractor/__init__.py
@@ -68,6 +68,7 @@ modules = [
"mangadex",
"mangafox",
"mangahere",
+ "mangakakalot",
"mangapanda",
"mangapark",
"mangareader",
diff --git a/gallery_dl/extractor/mangakakalot.py b/gallery_dl/extractor/mangakakalot.py
new file mode 100644
index 00000000..1aab55c6
--- /dev/null
+++ b/gallery_dl/extractor/mangakakalot.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2020 Jake Mannens
+#
+# 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.
+
+"""Extract manga-chapters and entire manga from https://mangakakalot.com/"""
+
+from .common import ChapterExtractor, MangaExtractor
+from .. import text
+
+
+class MangakakalotBase():
+ """Base class for mangakakalot extractors"""
+ category = "mangakakalot"
+ root = "https://mangakakalot.com"
+
+ @staticmethod
+ def parse_page(page, data):
+ """Parse metadata on 'page' and add it to 'data'"""
+ text.extract_all(page, (
+ ("manga" , '
', '
'),
+ ('author' , 'Author(s) :\n', ''),
+ ), values=data)
+ data["author"] = text.remove_html(data["author"])
+ return data
+
+
+class MangakakalotChapterExtractor(MangakakalotBase, ChapterExtractor):
+ """Extractor for manga-chapters from mangakakalot.com"""
+ archive_fmt = "{manga}_{chapter}_{page}"
+ pattern = r"(?:https?://)?mangakakalot\.com(/chapter/([a-z]+\d+)/chapter_([0-9.]+))"
+
+ def __init__(self, match):
+ self.path, self.url_title, self.chapter = match.groups()
+ ChapterExtractor.__init__(self, match, self.root + self.path)
+ self.session.headers['Referer'] = self.root
+
+ def metadata(self, chapter_page):
+ page = self.request(self.root + "/manga/" + self.url_title).text
+ churl = self.root + self.path
+ chpage = self.request(churl).text
+ chapter, sep, minor = self.chapter.partition(".")
+ data = self.parse_page(page, {
+ "chapter": text.parse_int(chapter),
+ "chapter_minor": sep + minor,
+ "lang": "en",
+ "language": "English",
+ })
+ pos = page.index('href="' + churl + '"')
+ data["title"] , pos = text.extract(page, '>', '<', pos)
+ x = chpage.index('\n', chpage.index('
', pos)
+ return data
+
+ def images(self, page):
+ x = page.index('')
+ while True:
+ url, pos = text.extract(page, needle, '"', pos)
+ if not url:
+ return results
+ data["title"], pos = text.extract(page, '>', '', pos)
+ data["date"] , pos = text.extract(page, '', pos)
+ chapter, sep, minor = url.rpartition("/chapter_")[2].partition(".")
+ data["chapter"] = text.parse_int(chapter)
+ data["chapter_minor"] = sep + minor
+ results.append((url, data.copy()))
diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py
index 1adfb8de..919e73dd 100755
--- a/scripts/supportedsites.py
+++ b/scripts/supportedsites.py
@@ -56,6 +56,7 @@ CATEGORY_MAP = {
"mangadex" : "MangaDex",
"mangafox" : "Manga Fox",
"mangahere" : "Manga Here",
+ "mangakakalot" : "MangaKakalot",
"mangapark" : "MangaPark",
"mangastream" : "Manga Stream",
"mastodon.social": "mastodon.social",