From d3adfd603bc42162fbc2d9384a4c53bc90835d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 5 Feb 2026 20:05:42 +0100 Subject: [PATCH] [artstation] fix & update 'challenge' extractor --- gallery_dl/extractor/artstation.py | 30 +++++++++++++++++------------- test/results/artstation.py | 20 +++++++++++++++++++- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/gallery_dl/extractor/artstation.py b/gallery_dl/extractor/artstation.py index c034d536..433190e8 100644 --- a/gallery_dl/extractor/artstation.py +++ b/gallery_dl/extractor/artstation.py @@ -319,9 +319,9 @@ class ArtstationChallengeExtractor(ArtstationExtractor): "{challenge[id]} - {challenge[title]}") archive_fmt = "c_{challenge[id]}_{asset_id}" pattern = (r"(?:https?://)?(?:www\.)?artstation\.com" - r"/contests/[^/?#]+/challenges/(\d+)" + r"/c(?:hallenges|ontests)/[^/?#]+/c(?:ategori|halleng)es/(\d+)" r"/?(?:\?sorting=([a-z]+))?") - example = "https://www.artstation.com/contests/NAME/challenges/12345" + example = "https://www.artstation.com/challenges/NAME/categories/12345" def __init__(self, match): ArtstationExtractor.__init__(self, match) @@ -329,24 +329,28 @@ class ArtstationChallengeExtractor(ArtstationExtractor): self.sorting = match[2] or "popular" def items(self): - base = f"{self.root}/contests/_/challenges/{self.challenge_id}" - challenge_url = base + ".json" - submission_url = base + "/submissions.json" - update_url = self.root + "/contests/submission_updates.json" + base = self.root + "/api/v2/competition/" + challenge_url = f"{base}challenges/{self.challenge_id}.json" + submission_url = base + "submissions.json" challenge = self.request_json(challenge_url) yield Message.Directory, "", {"challenge": challenge} - params = {"sorting": self.sorting} + params = { + "page" : 1, + "per_page" : 50, + "challenge_id": self.challenge_id, + "sort_by" : self.sorting, + } + for submission in self._pagination(submission_url, params): - - params = {"submission_id": submission["id"]} + update_url = (f"{base}submissions/{submission['id']}" + f"/submission_updates.json") + params = {"page": 1, "per_page": 50} for update in self._pagination(update_url, params=params): - - del update["replies"] update["challenge"] = challenge - for url in text.extract_iter( - update["body_presentation_html"], ' href="', '"'): + for url in util.unique_sequence(text.extract_iter( + update["body"], ' href="', '"')): update["asset_id"] = self._id_from_url(url) text.nameext_from_url(url, update) yield Message.Url, self._no_cache(url), update diff --git a/test/results/artstation.py b/test/results/artstation.py index 4a095d0c..aa2c2b71 100644 --- a/test/results/artstation.py +++ b/test/results/artstation.py @@ -108,10 +108,28 @@ __tests__ = ( }, { - "#url" : "https://www.artstation.com/contests/beyond-human/challenges/23?sorting=winners", + "#url" : "https://www.artstation.com/challenges/beyond-human/categories/23/submissions", + "#class" : artstation.ArtstationChallengeExtractor, +}, + +{ + "#url" : "https://www.artstation.com/contests/beyond-human/challenges/23?sorting=popular", "#class" : artstation.ArtstationChallengeExtractor, "#range" : "1-30", "#count" : 30, + + "challenge": { + "id" : 23, + "headline" : "Imagining Where Future Humans Live", + "created_at": "2017-06-26T14:45:43+00:00", + "contest" : { + "archived" : True, + "published": True, + "slug" : "beyond-human", + "title" : "Beyond Human", + "submissions_count": 4258, + }, + }, }, {