aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/behance.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2025-07-31 01:22:01 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2025-07-31 01:22:01 -0400
commita6e995c093de8aae2e91a0787281bb34c0b871eb (patch)
tree2d79821b05300d34d8871eb6c9662b359a2de85d /gallery_dl/extractor/behance.py
parent7672a750cb74bf31e21d76aad2776367fd476155 (diff)
New upstream version 1.30.2.upstream/1.30.2
Diffstat (limited to 'gallery_dl/extractor/behance.py')
-rw-r--r--gallery_dl/extractor/behance.py57
1 files changed, 31 insertions, 26 deletions
diff --git a/gallery_dl/extractor/behance.py b/gallery_dl/extractor/behance.py
index 14598b7..4a7c074 100644
--- a/gallery_dl/extractor/behance.py
+++ b/gallery_dl/extractor/behance.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
-# Copyright 2018-2023 Mike Fährmann
+# Copyright 2018-2025 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
@@ -17,6 +17,8 @@ class BehanceExtractor(Extractor):
category = "behance"
root = "https://www.behance.net"
request_interval = (2.0, 4.0)
+ browser = "firefox"
+ tls12 = False
def _init(self):
self._bcp = self.cookies.get("bcp", domain="www.behance.net")
@@ -44,15 +46,15 @@ class BehanceExtractor(Extractor):
"variables": variables,
}
- return self.request(url, method="POST", headers=headers,
- json=data).json()["data"]
+ return self.request_json(
+ url, method="POST", headers=headers, json=data)["data"]
def _update(self, data):
# compress data to simple lists
- if data.get("fields") and isinstance(data["fields"][0], dict):
+ if (fields := data.get("fields")) and isinstance(fields[0], dict):
data["fields"] = [
field.get("name") or field.get("label")
- for field in data["fields"]
+ for field in fields
]
data["owners"] = [
@@ -68,6 +70,9 @@ class BehanceExtractor(Extractor):
data["date"] = text.parse_timestamp(
data.get("publishedOn") or data.get("conceived_on") or 0)
+ if creator := data.get("creator"):
+ creator["name"] = creator["url"].rpartition("/")[2]
+
# backwards compatibility
data["gallery_id"] = data["id"]
data["title"] = data["name"]
@@ -87,13 +92,12 @@ class BehanceGalleryExtractor(BehanceExtractor):
def __init__(self, match):
BehanceExtractor.__init__(self, match)
- self.gallery_id = match.group(1)
+ self.gallery_id = match[1]
def _init(self):
BehanceExtractor._init(self)
- modules = self.config("modules")
- if modules:
+ if modules := self.config("modules"):
if isinstance(modules, str):
modules = modules.split(",")
self.modules = set(modules)
@@ -114,12 +118,15 @@ class BehanceGalleryExtractor(BehanceExtractor):
def get_gallery_data(self):
"""Collect gallery info dict"""
- url = "{}/gallery/{}/a".format(self.root, self.gallery_id)
+ url = f"{self.root}/gallery/{self.gallery_id}/a"
cookies = {
- "gki": '{"feature_project_view":false,'
- '"feature_discover_login_prompt":false,'
- '"feature_project_login_prompt":false}',
+ "gk_suid": "14118261",
+ "gki": "feature_3_in_1_checkout_test:false,hire_browse_get_quote_c"
+ "ta_ab_test:false,feature_hire_dashboard_services_ab_test:f"
+ "alse,feature_show_details_jobs_row_ab_test:false,feature_a"
+ "i_freelance_project_create_flow:false,",
"ilo0": "true",
+ "originalReferrer": "",
}
page = self.request(url, cookies=cookies).text
@@ -141,9 +148,7 @@ class BehanceGalleryExtractor(BehanceExtractor):
raise exception.AuthorizationError()
return ()
- result = []
- append = result.append
-
+ results = []
for module in data["modules"]:
mtype = module["__typename"][:-6].lower()
@@ -161,7 +166,7 @@ class BehanceGalleryExtractor(BehanceExtractor):
sizes.get("fs") or
sizes.get("hd") or
sizes.get("disp"))
- append((size["url"], module))
+ results.append((size["url"], module))
elif mtype == "video":
try:
@@ -173,7 +178,7 @@ class BehanceGalleryExtractor(BehanceExtractor):
url = "ytdl:" + url
module["_ytdl_manifest"] = "hls"
module["extension"] = "mp4"
- append((url, module))
+ results.append((url, module))
continue
except Exception as exc:
self.log.debug("%s: %s", exc.__class__.__name__, exc)
@@ -194,7 +199,7 @@ class BehanceGalleryExtractor(BehanceExtractor):
self.log.debug("%s: %s", exc.__class__.__name__, exc)
url = "ytdl:" + renditions[-1]["url"]
- append((url, module))
+ results.append((url, module))
elif mtype == "mediacollection":
for component in module["components"]:
@@ -202,21 +207,21 @@ class BehanceGalleryExtractor(BehanceExtractor):
if size:
parts = size["url"].split("/")
parts[4] = "source"
- append(("/".join(parts), module))
+ results.append(("/".join(parts), module))
break
elif mtype == "embed":
- embed = module.get("originalEmbed") or module.get("fluidEmbed")
- if embed:
+ if embed := (module.get("originalEmbed") or
+ module.get("fluidEmbed")):
embed = text.unescape(text.extr(embed, 'src="', '"'))
module["extension"] = "mp4"
- append(("ytdl:" + embed, module))
+ results.append(("ytdl:" + embed, module))
elif mtype == "text":
module["extension"] = "txt"
- append(("text:" + module["text"], module))
+ results.append(("text:" + module["text"], module))
- return result
+ return results
class BehanceUserExtractor(BehanceExtractor):
@@ -228,7 +233,7 @@ class BehanceUserExtractor(BehanceExtractor):
def __init__(self, match):
BehanceExtractor.__init__(self, match)
- self.user = match.group(1)
+ self.user = match[1]
def galleries(self):
endpoint = "GetProfileProjects"
@@ -256,7 +261,7 @@ class BehanceCollectionExtractor(BehanceExtractor):
def __init__(self, match):
BehanceExtractor.__init__(self, match)
- self.collection_id = match.group(1)
+ self.collection_id = match[1]
def galleries(self):
endpoint = "GetMoodboardItemsAndRecommendations"