diff --git a/docs/supportedsites.md b/docs/supportedsites.md
index cb04f31b0f..49649558a9 100644
--- a/docs/supportedsites.md
+++ b/docs/supportedsites.md
@@ -931,6 +931,18 @@ Consider all sites to be NSFW unless otherwise known.
Artists, Artist Listings, Artworks, individual Images |
|
+
+ Wikifeet |
+ https://www.wikifeet.com/ |
+ Galleries |
+ |
+
+
+ Wikifeetx |
+ https://www.wikifeetx.com/ |
+ Galleries |
+ |
+
xHamster |
https://xhamster.com/ |
diff --git a/gallery_dl/extractor/__init__.py b/gallery_dl/extractor/__init__.py
index f26f6a9d98..8c42e1a73d 100644
--- a/gallery_dl/extractor/__init__.py
+++ b/gallery_dl/extractor/__init__.py
@@ -158,6 +158,7 @@
"webtoons",
"weibo",
"wikiart",
+ "wikifeet",
"xhamster",
"xvideos",
"zerochan",
diff --git a/gallery_dl/extractor/wikifeet.py b/gallery_dl/extractor/wikifeet.py
new file mode 100644
index 0000000000..70e96462db
--- /dev/null
+++ b/gallery_dl/extractor/wikifeet.py
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+
+# 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://www.wikifeet.com/"""
+
+from .common import GalleryExtractor
+from .. import text
+import json
+
+
+class WikifeetGalleryExtractor(GalleryExtractor):
+ """Extractor for image galleries from wikifeet.com"""
+ category = "wikifeet"
+ directory_fmt = ("{category}", "{celebrity}")
+ filename_fmt = "{category}_{celeb}_{pid}.{extension}"
+ archive_fmt = "{type}_{celeb}_{pid}"
+ pattern = (r"(?:https?://)(?:(?:www\.)?wikifeetx?|"
+ r"men\.wikifeet)\.com/([^/?#]+)")
+ test = (
+ ("https://www.wikifeet.com/Madison_Beer", {
+ "pattern": (r"https://pics\.wikifeet\.com/Madison_Beer"
+ r"-Feet-\d+\.jpg"),
+ "count" : ">= 352",
+ "keyword": {
+ "celeb" : "Madison_Beer",
+ "celebrity" : "Madison Beer",
+ "birthday" : "dt:1999-03-05 00:00:00",
+ "birthplace": "United States",
+ "rating" : float,
+ "pid" : int,
+ "width" : int,
+ "height" : int,
+ "shoesize" : "7.5 US",
+ "type" : "women",
+ "tags" : list,
+ },
+ }),
+ ("https://www.wikifeetx.com/Tifa_Quinn", {
+ "pattern": (r"https://pics\.wikifeet\.com/Tifa_Quinn"
+ r"-Feet-\d+\.jpg"),
+ "count" : ">= 9",
+ "keyword": {
+ "celeb" : "Tifa_Quinn",
+ "celebrity" : "Tifa Quinn",
+ "birthday" : "[NOT SET]",
+ "birthplace": "United States",
+ "rating" : float,
+ "pid" : int,
+ "width" : int,
+ "height" : int,
+ "shoesize" : "[NOT SET]",
+ "type" : "women",
+ "tags" : list,
+ },
+ }),
+ ("https://men.wikifeet.com/Chris_Hemsworth", {
+ "pattern": (r"https://pics\.wikifeet\.com/Chris_Hemsworth"
+ r"-Feet-\d+\.jpg"),
+ "count" : ">= 860",
+ "keyword": {
+ "celeb" : "Chris_Hemsworth",
+ "celebrity" : "Chris Hemsworth",
+ "birthday" : "dt:1983-08-11 00:00:00",
+ "birthplace": "Australia",
+ "rating" : float,
+ "pid" : int,
+ "width" : int,
+ "height" : int,
+ "shoesize" : "12.5 US",
+ "type" : "men",
+ "tags" : list,
+ },
+ }),
+ )
+
+ def __init__(self, match):
+ self.root = text.root_from_url(match.group(0))
+ if "wikifeetx.com" in self.root:
+ self.category = "wikifeetx"
+ self.type = "men" if "://men." in self.root else "women"
+ self.celeb = match.group(1)
+ GalleryExtractor.__init__(self, match, self.root + "/" + self.celeb)
+
+ def metadata(self, page):
+ extr = text.extract_from(page)
+ return {
+ "celeb" : self.celeb,
+ "type" : self.type,
+ "rating" : text.parse_float(extr('"ratingValue": "', '"')),
+ "celebrity" : text.unescape(extr("times'>", "")),
+ "shoesize" : text.remove_html(extr("Shoe Size:", "edit")),
+ "birthplace": text.remove_html(extr("Birthplace:", "edit")),
+ "birthday" : text.parse_datetime(text.remove_html(
+ extr("Birth Date:", "edit")), "%Y-%m-%d"),
+ }
+
+ def images(self, page):
+ tagmap = {
+ "C": "Close-up",
+ "T": "Toenails",
+ "N": "Nylons",
+ "A": "Arches",
+ "S": "Soles",
+ "B": "Barefoot",
+ }
+ ufmt = "https://pics.wikifeet.com/" + self.celeb + "-Feet-{}.jpg"
+ return [
+ (ufmt.format(data["pid"]), {
+ "pid" : data["pid"],
+ "width" : data["pw"],
+ "height": data["ph"],
+ "tags" : [tagmap[tag] for tag in data["tags"]],
+ })
+ for data in json.loads(text.extr(page, "['gdata'] = ", ";"))
+ ]
diff --git a/scripts/supportedsites.py b/scripts/supportedsites.py
index b6e76c60ba..2addedb83d 100755
--- a/scripts/supportedsites.py
+++ b/scripts/supportedsites.py
@@ -437,6 +437,10 @@ def build_extractor_list():
default["mangalife"] = default["mangasee"]
domains["mangalife"] = "https://manga4life.com/"
+ # add wikifeetx.com
+ default["wikifeetx"] = default["wikifeet"]
+ domains["wikifeetx"] = "https://www.wikifeetx.com/"
+
return categories, domains