aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/pixeldrain.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/pixeldrain.py')
-rw-r--r--gallery_dl/extractor/pixeldrain.py70
1 files changed, 70 insertions, 0 deletions
diff --git a/gallery_dl/extractor/pixeldrain.py b/gallery_dl/extractor/pixeldrain.py
index 83f3577..7a4d1a5 100644
--- a/gallery_dl/extractor/pixeldrain.py
+++ b/gallery_dl/extractor/pixeldrain.py
@@ -96,3 +96,73 @@ class PixeldrainAlbumExtractor(PixeldrainExtractor):
file["date"] = self.parse_datetime(file["date_upload"])
text.nameext_from_url(file["name"], file)
yield Message.Url, url, file
+
+
+class PixeldrainFolderExtractor(PixeldrainExtractor):
+ """Extractor for pixeldrain filesystem files and directories"""
+ subcategory = "folder"
+ filename_fmt = "{filename[:230]}.{extension}"
+ archive_fmt = "{path}_{num}"
+ pattern = BASE_PATTERN + r"/(?:d|api/filesystem)/([^?]+)"
+ example = "https://pixeldrain.com/d/abcdefgh"
+
+ def metadata(self, data):
+ return {
+ "type" : data["type"],
+ "path" : data["path"],
+ "name" : data["name"],
+ "mime_type" : data["file_type"],
+ "size" : data["file_size"],
+ "hash_sha256": data["sha256_sum"],
+ "date" : self.parse_datetime(data["created"]),
+ }
+
+ def items(self):
+ recursive = self.config("recursive")
+
+ url = "{}/api/filesystem/{}".format(self.root, self.groups[0])
+ stat = self.request(url + "?stat").json()
+
+ paths = stat["path"]
+ path = paths[stat["base_index"]]
+ if path["type"] == "dir":
+ children = [
+ child
+ for child in stat["children"]
+ if child["name"] != ".search_index.gz"
+ ]
+ else:
+ children = (path,)
+
+ folder = self.metadata(path)
+ folder["id"] = paths[0]["id"]
+
+ yield Message.Directory, folder
+
+ num = 0
+ for child in children:
+ if child["type"] == "file":
+ num += 1
+ url = "{}/api/filesystem{}?attach".format(
+ self.root, child["path"])
+ share_url = "{}/d{}".format(self.root, child["path"])
+ data = self.metadata(child)
+ data.update({
+ "id" : folder["id"],
+ "num" : num,
+ "url" : url,
+ "share_url": share_url,
+ })
+ data["filename"], _, data["extension"] = \
+ child["name"].rpartition(".")
+ yield Message.Url, url, data
+
+ elif child["type"] == "dir":
+ if recursive:
+ url = "{}/d{}".format(self.root, child["path"])
+ child["_extractor"] = PixeldrainFolderExtractor
+ yield Message.Queue, url, child
+
+ else:
+ self.log.debug("'%s' is of unknown type (%s)",
+ child.get("name"), child["type"])