summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/vsco.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/vsco.py')
-rw-r--r--gallery_dl/extractor/vsco.py56
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",