diff options
Diffstat (limited to 'gallery_dl/extractor/pixeldrain.py')
| -rw-r--r-- | gallery_dl/extractor/pixeldrain.py | 70 |
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"]) |
