aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/behance.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2020-10-12 18:14:27 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2020-10-12 18:14:27 -0400
commite0c914765184ebbf99cffdecfe8cdbe10f42486e (patch)
tree4dd89f11195c3f58b3b62b9911bbdc40d0e44471 /gallery_dl/extractor/behance.py
parent9074eee175f76b824fbb6695d56426105191c51c (diff)
New upstream version 1.15.1.upstream/1.15.1
Diffstat (limited to 'gallery_dl/extractor/behance.py')
-rw-r--r--gallery_dl/extractor/behance.py281
1 files changed, 270 insertions, 11 deletions
diff --git a/gallery_dl/extractor/behance.py b/gallery_dl/extractor/behance.py
index 1126615..be498bc 100644
--- a/gallery_dl/extractor/behance.py
+++ b/gallery_dl/extractor/behance.py
@@ -31,8 +31,14 @@ class BehanceExtractor(Extractor):
def _update(data):
# compress data to simple lists
if data["fields"] and isinstance(data["fields"][0], dict):
- data["fields"] = [field["name"] for field in data["fields"]]
- data["owners"] = [owner["display_name"] for owner in data["owners"]]
+ data["fields"] = [
+ field.get("name") or field.get("label")
+ for field in data["fields"]
+ ]
+ data["owners"] = [
+ owner.get("display_name") or owner.get("displayName")
+ for owner in data["owners"]
+ ]
tags = data.get("tags") or ()
if tags and isinstance(tags[0], dict):
@@ -101,7 +107,7 @@ class BehanceGalleryExtractor(BehanceExtractor):
cookies = {
"_evidon_consent_cookie":
'{"consent_date":"2019-01-31T09:41:15.132Z"}',
- "bcp": "815b5eee-8bdf-4898-ac79-33c2bcc0ed19",
+ "bcp": "4c34489d-914c-46cd-b44c-dfd0e661136d",
"gk_suid": "66981391",
"gki": '{"feature_project_view":false,'
'"feature_discover_login_prompt":false,'
@@ -184,14 +190,267 @@ class BehanceCollectionExtractor(BehanceExtractor):
self.collection_id = match.group(1)
def galleries(self):
- url = "{}/collection/{}/a".format(self.root, self.collection_id)
- params = {"offset": 0}
- headers = {"X-Requested-With": "XMLHttpRequest"}
+ url = self.root + "/v3/graphql"
+ headers = {
+ "Origin" : self.root,
+ "Referer": self.root + "/collection/" + self.collection_id,
+ "X-BCP" : "4c34489d-914c-46cd-b44c-dfd0e661136d",
+ "X-NewRelic-ID" : "VgUFVldbGwsFU1BRDwUBVw==",
+ "X-Requested-With": "XMLHttpRequest",
+ }
+ cookies = {
+ "bcp" : "4c34489d-914c-46cd-b44c-dfd0e661136d",
+ "gk_suid": "66981391",
+ "ilo0" : "true",
+ }
+
+ query = """
+query GetMoodboardItemsAndRecommendations(
+ $id: Int!
+ $firstItem: Int!
+ $afterItem: String
+ $shouldGetRecommendations: Boolean!
+ $shouldGetItems: Boolean!
+ $shouldGetMoodboardFields: Boolean!
+ ) {
+ viewer @include(if: $shouldGetMoodboardFields) {
+ isOptedOutOfRecommendations
+ }
+ moodboard(id: $id) {
+ ...moodboardFields @include(if: $shouldGetMoodboardFields)
+
+ items(first: $firstItem, after: $afterItem) @include(if: $shouldGetItems)
+ {
+ pageInfo {
+ endCursor
+ hasNextPage
+ }
+ nodes {
+ ...nodesFields
+ }
+ }
+
+ recommendedItems(first: 80) @include(if: $shouldGetRecommendations) {
+ nodes {
+ ...nodesFields
+ fetchSource
+ }
+ }
+ }
+ }
+
+ fragment moodboardFields on Moodboard {
+ id
+ label
+ privacy
+ followerCount
+ isFollowing
+ projectCount
+ url
+ isOwner
+ owners {
+ id
+ displayName
+ url
+ firstName
+ location
+ locationUrl
+ images {
+ size_50 {
+ url
+ }
+ size_100 {
+ url
+ }
+ size_115 {
+ url
+ }
+ size_230 {
+ url
+ }
+ size_138 {
+ url
+ }
+ size_276 {
+ url
+ }
+ }
+ }
+ }
+
+ fragment projectFields on Project {
+ id
+ isOwner
+ publishedOn
+ matureAccess
+ hasMatureContent
+ modifiedOn
+ name
+ url
+ isPrivate
+ slug
+ fields {
+ label
+ }
+ colors {
+ r
+ g
+ b
+ }
+ owners {
+ url
+ displayName
+ id
+ location
+ locationUrl
+ isProfileOwner
+ images {
+ size_50 {
+ url
+ }
+ size_100 {
+ url
+ }
+ size_115 {
+ url
+ }
+ size_230 {
+ url
+ }
+ size_138 {
+ url
+ }
+ size_276 {
+ url
+ }
+ }
+ }
+ covers {
+ size_original {
+ url
+ }
+ size_max_808 {
+ url
+ }
+ size_808 {
+ url
+ }
+ size_404 {
+ url
+ }
+ size_202 {
+ url
+ }
+ size_230 {
+ url
+ }
+ size_115 {
+ url
+ }
+ }
+ stats {
+ views {
+ all
+ }
+ appreciations {
+ all
+ }
+ comments {
+ all
+ }
+ }
+ }
+
+ fragment exifDataValueFields on exifDataValue {
+ id
+ label
+ value
+ searchValue
+ }
+
+ fragment nodesFields on MoodboardItem {
+ id
+ entityType
+ width
+ height
+ flexWidth
+ flexHeight
+ images {
+ size
+ url
+ }
+
+ entity {
+ ... on Project {
+ ...projectFields
+ }
+
+ ... on ImageModule {
+ project {
+ ...projectFields
+ }
+
+ exifData {
+ lens {
+ ...exifDataValueFields
+ }
+ software {
+ ...exifDataValueFields
+ }
+ makeAndModel {
+ ...exifDataValueFields
+ }
+ focalLength {
+ ...exifDataValueFields
+ }
+ iso {
+ ...exifDataValueFields
+ }
+ location {
+ ...exifDataValueFields
+ }
+ flash {
+ ...exifDataValueFields
+ }
+ exposureMode {
+ ...exifDataValueFields
+ }
+ shutterSpeed {
+ ...exifDataValueFields
+ }
+ aperture {
+ ...exifDataValueFields
+ }
+ }
+ }
+
+ ... on MediaCollectionComponent {
+ project {
+ ...projectFields
+ }
+ }
+ }
+ }
+"""
+ variables = {
+ "afterItem": "MAo=",
+ "firstItem": 40,
+ "id" : self.collection_id,
+ "shouldGetItems" : True,
+ "shouldGetMoodboardFields": False,
+ "shouldGetRecommendations": False,
+ }
+ data = {"query": query, "variables": variables}
while True:
- data = self.request(url, params=params, headers=headers).json()
- for item in data["items"]:
- yield item["project"]
- if len(data["items"]) < 40:
+ items = self.request(
+ url, method="POST", headers=headers,
+ cookies=cookies, json=data,
+ ).json()["data"]["moodboard"]["items"]
+
+ for node in items["nodes"]:
+ yield node["entity"]
+
+ if not items["pageInfo"]["hasNextPage"]:
return
- params["offset"] += len(data["items"])
+ variables["afterItem"] = items["pageInfo"]["endCursor"]