summaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/pinterest.py
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2020-12-30 18:41:48 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2020-12-30 18:41:48 -0500
commit87a5aa088ce33a1196ff409b76a9ea8233bdc634 (patch)
tree7e6155edcc5dd12e40b47ad814b3bc69e65c52fc /gallery_dl/extractor/pinterest.py
parent8f7c87a2697113134c311aaeafd9c919555a2741 (diff)
New upstream version 1.16.1.upstream/1.16.1
Diffstat (limited to 'gallery_dl/extractor/pinterest.py')
-rw-r--r--gallery_dl/extractor/pinterest.py69
1 files changed, 51 insertions, 18 deletions
diff --git a/gallery_dl/extractor/pinterest.py b/gallery_dl/extractor/pinterest.py
index aa11289..739e67e 100644
--- a/gallery_dl/extractor/pinterest.py
+++ b/gallery_dl/extractor/pinterest.py
@@ -14,7 +14,6 @@ from ..cache import cache
import itertools
import json
-
BASE_PATTERN = r"(?:https?://)?(?:\w+\.)?pinterest\.[\w.]+"
@@ -31,29 +30,59 @@ class PinterestExtractor(Extractor):
def items(self):
self.api.login()
data = self.metadata()
- yield Message.Version, 1
- yield Message.Directory, data
+ videos = self.config("videos", True)
+ yield Message.Directory, data
for pin in self.pins():
- if "images" in pin:
- url, pin_data = self.data_from_pin(pin)
- pin_data.update(data)
- yield Message.Url, url, pin_data
+
+ try:
+ media = self._media_from_pin(pin)
+ except Exception:
+ self.log.debug("Unable to fetch download URL for pin %s",
+ pin.get("id"))
+ continue
+
+ if not videos and media.get("duration") is not None:
+ continue
+
+ pin.update(data)
+ pin.update(media)
+ url = media["url"]
+ text.nameext_from_url(url, pin)
+
+ if pin["extension"] == "m3u8":
+ url = "ytdl:" + url
+ pin["extension"] = "mp4"
+ pin["_ytdl_extra"] = {"protocol": "m3u8_native"}
+
+ yield Message.Url, url, pin
def metadata(self):
"""Return general metadata"""
def pins(self):
- """Return all relevant pin-objects"""
+ """Return all relevant pin objects"""
@staticmethod
- def data_from_pin(pin):
- """Get image url and metadata from a pin-object"""
- img = pin["images"]["orig"]
- url = img["url"]
- pin["width"] = img["width"]
- pin["height"] = img["height"]
- return url, text.nameext_from_url(url, pin)
+ def _media_from_pin(pin):
+ videos = pin.get("videos")
+ if videos:
+ video_formats = videos["video_list"]
+
+ for fmt in ("V_HLSV4", "V_HLSV3_WEB", "V_HLSV3_MOBILE"):
+ if fmt in video_formats:
+ media = video_formats[fmt]
+ break
+ else:
+ media = max(video_formats.values(),
+ key=lambda x: x.get("width", 0))
+
+ if "V_720P" in video_formats:
+ media["_fallback"] = (video_formats["V_720P"]["url"],)
+
+ return media
+
+ return pin["images"]["orig"]
class PinterestPinExtractor(PinterestExtractor):
@@ -66,6 +95,11 @@ class PinterestPinExtractor(PinterestExtractor):
"content": ("4c435a66f6bb82bb681db2ecc888f76cf6c5f9ca",
"d3e24bc9f7af585e8c23b9136956bd45a4d9b947"),
}),
+ # video pin (#1189)
+ ("https://www.pinterest.com/pin/422564377542934214/", {
+ "pattern": r"https://v\.pinimg\.com/videos/mc/hls/d7/22/ff"
+ r"/d722ff00ab2352981b89974b37909de8.m3u8",
+ }),
("https://www.pinterest.com/pin/858146903966145188/", {
"exception": exception.NotFoundError,
}),
@@ -78,7 +112,7 @@ class PinterestPinExtractor(PinterestExtractor):
def metadata(self):
self.pin = self.api.pin(self.pin_id)
- return self.data_from_pin(self.pin)[1]
+ return self.pin
def pins(self):
return (self.pin,)
@@ -173,8 +207,7 @@ class PinterestRelatedPinExtractor(PinterestPinExtractor):
})
def metadata(self):
- pin = self.api.pin(self.pin_id)
- return {"original_pin": self.data_from_pin(pin)[1]}
+ return {"original_pin": self.api.pin(self.pin_id)}
def pins(self):
return self.api.pin_related(self.pin_id)