aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/naverchzzk.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/naverchzzk.py')
-rw-r--r--gallery_dl/extractor/naverchzzk.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/gallery_dl/extractor/naverchzzk.py b/gallery_dl/extractor/naverchzzk.py
new file mode 100644
index 0000000..de4ee7a
--- /dev/null
+++ b/gallery_dl/extractor/naverchzzk.py
@@ -0,0 +1,81 @@
+# -*- 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://chzzk.naver.com/"""
+
+from .common import Extractor, Message
+from .. import text, util
+
+
+class NaverChzzkExtractor(Extractor):
+ """Base class for chzzk.naver.com extractors"""
+ category = "naver-chzzk"
+ filename_fmt = "{uid}_{id}_{num}.{extension}"
+ directory_fmt = ("{category}", "{user[userNickname]}")
+ archive_fmt = "{uid}_{id}_{num}"
+
+ def request_api(self, uid, id=None, params=None):
+ return self.request_json(
+ f"https://apis.naver.com/nng_main/nng_comment_api/v1/type"
+ f"/CHANNEL_POST/id/{uid}/comments/{id or ''}",
+ params=params)["content"]
+
+ def items(self):
+ for comment in self.comments():
+ data = comment["comment"]
+ files = data.pop("attaches") or ()
+ data["id"] = data["commentId"]
+ data["uid"] = data["objectId"]
+ data["user"] = comment["user"]
+ data["count"] = len(files)
+ data["date"] = text.parse_datetime(
+ data["createdDate"], "%Y%m%d%H%M%S")
+
+ yield Message.Directory, data
+ for data["num"], file in enumerate(files, 1):
+ if extra := file.get("extraJson"):
+ file.update(util.json_loads(extra))
+ file["date"] = text.parse_datetime(
+ file["createdDate"], "%Y-%m-%dT%H:%M:%S.%f%z")
+ file["date_updated"] = text.parse_datetime(
+ file["updatedDate"], "%Y-%m-%dT%H:%M:%S.%f%z")
+ data["file"] = file
+ url = file["attachValue"]
+ yield Message.Url, url, text.nameext_from_url(url, data)
+
+
+class NaverChzzkCommentExtractor(NaverChzzkExtractor):
+ """Extractor for individual comment from chzzk.naver.com"""
+ subcategory = "comment"
+ pattern = r"(?:https?://)?chzzk\.naver\.com/(\w+)/community/detail/(\d+)"
+ example = "https://chzzk.naver.com/0123456789abcdef/community/detail/12345"
+
+ def comments(self):
+ uid, id = self.groups
+ res = self.request_api(uid, id)
+ return ({"comment": res["comment"], "user": res["user"]},)
+
+
+class NaverChzzkCommunityExtractor(NaverChzzkExtractor):
+ """Extractor for comments from chzzk.naver.com"""
+ subcategory = "community"
+ pattern = r"(?:https?://)?chzzk\.naver\.com/(\w+)/community"
+ example = "https://chzzk.naver.com/0123456789abcdef/community"
+ request_interval = (0.5, 1.5)
+
+ def comments(self):
+ uid = self.match[1]
+ params = {
+ "limit": 10,
+ "offset": text.parse_int(self.config("offset")),
+ "pagingType": "PAGE",
+ }
+ while True:
+ comments = self.request_api(uid, params=params)["comments"]
+ yield from comments["data"]
+ if not comments["page"]["next"]:
+ return
+ params["offset"] += params["limit"]