summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/piczel.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/piczel.py')
-rw-r--r--gallery_dl/extractor/piczel.py118
1 files changed, 118 insertions, 0 deletions
diff --git a/gallery_dl/extractor/piczel.py b/gallery_dl/extractor/piczel.py
new file mode 100644
index 0000000..6a5c41c
--- /dev/null
+++ b/gallery_dl/extractor/piczel.py
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2018-2019 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://piczel.tv/"""
+
+from .common import Extractor, Message
+from .. import text
+
+
+class PiczelExtractor(Extractor):
+ """Base class for piczel extractors"""
+ category = "piczel"
+ directory_fmt = ("{category}", "{user[username]}")
+ filename_fmt = "{category}_{id}_{title}_{num:>02}.{extension}"
+ archive_fmt = "{id}_{num}"
+ root = "https://piczel.tv"
+ api_root = "https://apollo.piczel.tv"
+
+ def __init__(self, match):
+ Extractor.__init__(self, match)
+ self.item_id = match.group(1)
+
+ def items(self):
+ first = True
+ yield Message.Version, 1
+ for image in self.unpack(self.get_images()):
+ if first:
+ yield Message.Directory, image
+ first = False
+ path = image["image"]["image"]["url"]
+ url = "{}/static/{}".format(self.api_root, path)
+ yield Message.Url, url, text.nameext_from_url(url, image)
+
+ @staticmethod
+ def unpack(images):
+ """Unpack 'images' into individual image objects"""
+ for image in images:
+ if image["multi"]:
+ multi = image["images"]
+ del image["images"]
+ for image["num"], img in enumerate(multi):
+ image["image"] = img
+ yield image
+ else:
+ image["num"] = 0
+ yield image
+
+ def get_images(self):
+ """Return an iterable with all relevant image objects"""
+
+
+class PiczelUserExtractor(PiczelExtractor):
+ """Extractor for all images from a user's gallery"""
+ subcategory = "user"
+ pattern = r"(?:https?://)?(?:www\.)?piczel\.tv/gallery/([^/?&#]+)/?$"
+ test = ("https://piczel.tv/gallery/Lulena", {
+ "count": ">= 13",
+ })
+
+ def get_images(self):
+ url = "{}/api/users/{}/gallery".format(self.api_root, self.item_id)
+ return self.request(url).json()
+
+
+class PiczelFolderExtractor(PiczelExtractor):
+ """Extractor for images inside a user's folder"""
+ subcategory = "folder"
+ directory_fmt = ("{category}", "{user[username]}", "{folder[name]}")
+ archive_fmt = "f{folder[id]}_{id}_{num}"
+ pattern = (r"(?:https?://)?(?:www\.)?piczel\.tv"
+ r"/gallery/(?!image)[^/?&#]+/(\d+)")
+ test = ("https://piczel.tv/gallery/Lulena/1114", {
+ "count": ">= 4",
+ })
+
+ def get_images(self):
+ url = "{}/api/gallery/folder/{}".format(self.api_root, self.item_id)
+ images = self.request(url).json()
+ images.reverse()
+ return images
+
+
+class PiczelImageExtractor(PiczelExtractor):
+ """Extractor for individual images"""
+ subcategory = "image"
+ pattern = r"(?:https?://)?(?:www\.)?piczel\.tv/gallery/image/(\d+)"
+ test = ("https://piczel.tv/gallery/image/7807", {
+ "url": "9b9e416b6ab7e58676fab84453d5028f306ece34",
+ "content": "df9a053a24234474a19bce2b7e27e0dec23bff87",
+ "keyword": {
+ "created_at": "2018-07-22T05:13:58.000Z",
+ "description": None,
+ "extension": "png",
+ "favorites_count": int,
+ "folder": dict,
+ "folder_id": 1113,
+ "id": 7807,
+ "is_flash": False,
+ "is_video": False,
+ "multi": False,
+ "nsfw": False,
+ "num": 0,
+ "password_protected": False,
+ "tags": "fanart, commission, altair, recreators, ",
+ "title": "Altair",
+ "user": dict,
+ "views": int,
+ },
+ })
+
+ def get_images(self):
+ url = "{}/api/gallery/image/{}".format(self.api_root, self.item_id)
+ return (self.request(url).json(),)