diff options
Diffstat (limited to 'gallery_dl/extractor/vsco.py')
| -rw-r--r-- | gallery_dl/extractor/vsco.py | 56 |
1 files changed, 44 insertions, 12 deletions
diff --git a/gallery_dl/extractor/vsco.py b/gallery_dl/extractor/vsco.py index 6cc5911..a24d3fe 100644 --- a/gallery_dl/extractor/vsco.py +++ b/gallery_dl/extractor/vsco.py @@ -29,10 +29,25 @@ class VscoExtractor(Extractor): self.user = match.group(1).lower() def items(self): + videos = self.config("videos", True) yield Message.Version, 1 yield Message.Directory, {"user": self.user} for img in self.images(): - url = "https://" + (img.get("video_url") or img["responsive_url"]) + + if img["is_video"]: + if not videos: + continue + url = "https://" + img["video_url"] + else: + base = img["responsive_url"].partition("/")[2] + cdn, _, path = base.partition("/") + if cdn.startswith("aws"): + url = "https://image-{}.vsco.co/{}".format(cdn, path) + elif cdn.isdecimal(): + url = "https://image.vsco.co/" + base + else: + url = "https://" + img["responsive_url"] + data = text.nameext_from_url(url, { "id" : img["_id"], "user" : self.user, @@ -66,10 +81,20 @@ class VscoExtractor(Extractor): while True: data = self.request(url, params=params, headers=headers).json() - if not data.get(key): + medias = data.get(key) + if not medias: return - yield from data[key] - params["page"] += 1 + + if "cursor" in params: + for media in medias: + yield media[media["type"]] + cursor = data.get("next_cursor") + if not cursor: + return + params["cursor"] = cursor + else: + yield from medias + params["page"] += 1 @staticmethod def _transform_media(media): @@ -89,9 +114,9 @@ class VscoUserExtractor(VscoExtractor): pattern = BASE_PATTERN + r"(?:/images(?:/\d+)?)?/?(?:$|[?#])" test = ( ("https://vsco.co/missuri/images/1", { + "pattern": r"https://image(-aws.+)?\.vsco\.co/[0-9a-f/]+/vsco\w+", "range": "1-80", "count": 80, - "pattern": r"https://im\.vsco\.co/[^/]+/[0-9a-f/]+/vsco\w+\.\w+", }), ("https://vsco.co/missuri"), ) @@ -102,12 +127,19 @@ class VscoUserExtractor(VscoExtractor): tkn = data["users"]["currentUser"]["tkn"] sid = str(data["sites"]["siteByUsername"][self.user]["site"]["id"]) + site = data["medias"]["bySiteId"][sid] + + url = "{}/api/3.0/medias/profile".format(self.root) + params = { + "site_id" : sid, + "limit" : "14", + "show_only": "0", + "cursor" : site["nextCursor"], + } - url = "{}/api/2.0/medias".format(self.root) - params = {"page": 2, "size": "30", "site_id": sid} return self._pagination(url, params, tkn, "media", ( - data["medias"]["byId"][mid]["media"] - for mid in data["medias"]["bySiteId"][sid]["medias"]["1"] + data["medias"]["byId"][media[media["type"]]]["media"] + for media in site["medias"] )) @@ -118,9 +150,9 @@ class VscoCollectionExtractor(VscoExtractor): archive_fmt = "c_{user}_{id}" pattern = BASE_PATTERN + r"/collection/" test = ("https://vsco.co/vsco/collection/1", { + "pattern": r"https://image(-aws.+)?\.vsco\.co/[0-9a-f/]+/vsco\w+\.\w+", "range": "1-80", "count": 80, - "pattern": r"https://im\.vsco\.co/[^/]+/[0-9a-f/]+/vsco\w+\.\w+", }) def images(self): @@ -136,7 +168,7 @@ class VscoCollectionExtractor(VscoExtractor): return self._pagination(url, params, tkn, "medias", ( data["medias"]["byId"][mid]["media"] for mid in data - ["collections"]["byCollectionId"][cid]["collection"]["1"] + ["collections"]["byCollectionId"][cid]["byPage"]["1"]["collection"] )) @@ -146,7 +178,7 @@ class VscoImageExtractor(VscoExtractor): pattern = BASE_PATTERN + r"/media/([0-9a-fA-F]+)" test = ( ("https://vsco.co/erenyildiz/media/5d34b93ef632433030707ce2", { - "url": "faa214d10f859f374ad91da3f7547d2439f5af08", + "url": "a45f9712325b42742324b330c348b72477996031", "content": "1394d070828d82078035f19a92f404557b56b83f", "keyword": { "id" : "5d34b93ef632433030707ce2", |
