diff --git a/gallery_dl/extractor/__init__.py b/gallery_dl/extractor/__init__.py
index 34040b64..1fc4a0ea 100644
--- a/gallery_dl/extractor/__init__.py
+++ b/gallery_dl/extractor/__init__.py
@@ -41,7 +41,6 @@ modules = [
"imgth",
"imgtrex",
"imgur",
- "imgyt",
"khinsider",
"kissmanga",
"konachan",
@@ -58,7 +57,6 @@ modules = [
"picmaniac",
"pinterest",
"powermanga",
- "rapidimg",
"rule34",
"safebooru",
"sankaku",
@@ -72,6 +70,7 @@ modules = [
"whentai",
"worldthree",
"yandere",
+ "imagehosts",
"recursive",
]
diff --git a/gallery_dl/extractor/imagehosts.py b/gallery_dl/extractor/imagehosts.py
new file mode 100644
index 00000000..0e0da2f6
--- /dev/null
+++ b/gallery_dl/extractor/imagehosts.py
@@ -0,0 +1,129 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2016 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.
+
+"""Extract images from https://img.yt/"""
+
+from .common import Extractor, Message
+from .. import text
+from os.path import splitext
+
+class ImagehostImageExtractor(Extractor):
+ """Base class for single-image extractors from various imagehosts"""
+ subcategory = "image"
+ directory_fmt = ["{category}"]
+ filename_fmt = "{filename}"
+ https = False
+ method = "post"
+ params = "simple"
+
+ def __init__(self, match):
+ Extractor.__init__(self)
+ self.url = ("https://" if self.https else "http://") + match.group(1)
+ self.token = match.group(2)
+ if self.params == "simple":
+ self.params = {
+ "imgContinue": "Continue+to+image+...+",
+ }
+ elif self.params == "complex":
+ self.params = {
+ "op": "view",
+ "id": self.token,
+ "pre": "1",
+ "adb": "1",
+ "next": "Continue+to+image+...+",
+ }
+ else:
+ self.params = {}
+
+ def items(self):
+ page = self.request(self.url, method=self.method, data=self.params).text
+ url, filename = self.get_info(page)
+ data = text.nameext_from_url(filename, {"token": self.token})
+ if self.https and url.startswith("http:"):
+ url = "https:" + url[5:]
+ yield Message.Version, 1
+ yield Message.Directory, data
+ yield Message.Url, url, data
+
+#
+
+class ImgytImageExtractor(ImagehostImageExtractor):
+ """Extractor for single images from img.yt"""
+ category = "imgyt"
+ pattern = [r"(?:https?://)?((?:www\.)?img\.yt/img-([a-z0-9]+)\.html)"]
+ test = [("https://img.yt/img-57a2050547b97.html", {
+ "url": "6801fac1ff8335bd27a1665ad27ad64cace2cd84",
+ "keyword": "7548cc9915f90f5d7ffbafa079085457ae34562c",
+ "content": "54592f2635674c25677c6872db3709d343cdf92f",
+ })]
+ https = True
+
+ def get_info(self, page):
+ url , pos = text.extract(page, "', '')
+ url, pos = text.extract(page, "href='", "'", pos)
+ return url, url
+
+class ImageontimeImageExtractor(HosturimageImageExtractor):
+ """Extractor for single images from imageontime.org"""
+ category = "imageontime"
+ pattern = [r"(?:https?://)?((?:www\.)?imageontime\.org/img-([a-z0-9]+)\.html)"]
+ https = False
+
+class ImguploadImageExtractor(HosturimageImageExtractor):
+ """Extractor for single images from imgupload.yt"""
+ category = "imgupload"
+ pattern = [r"(?:https?://)?((?:www\.)?imgupload\.yt/img-([a-z0-9]+)\.html)"]
+ https = True
+
+#
+
+class ImgspiceImageExtractor(ImagehostImageExtractor):
+ """Extractor for single images from imgspice.com"""
+ category = "imgspice"
+ pattern = [r"(?:https?://)?((?:www\.)?imgspice\.com/([^/]+))"]
+ https = True
+ method = "get"
+ params = None
+
+ def get_info(self, page):
+ filename, pos = text.extract(page, '