[pinterest] move file extraction into separate method

This commit is contained in:
Mike Fährmann
2024-10-18 20:55:20 +02:00
parent 9751b716ef
commit 5477ed181d

View File

@@ -30,12 +30,11 @@ class PinterestExtractor(Extractor):
self.root = text.ensure_http_scheme(domain) self.root = text.ensure_http_scheme(domain)
self.api = PinterestAPI(self) self.api = PinterestAPI(self)
self.videos = self.config("videos", True)
def items(self): def items(self):
data = self.metadata() data = self.metadata()
videos = self.config("videos", True)
yield Message.Directory, data
for pin in self.pins(): for pin in self.pins():
if isinstance(pin, tuple): if isinstance(pin, tuple):
@@ -43,34 +42,26 @@ class PinterestExtractor(Extractor):
yield Message.Queue, url, data yield Message.Queue, url, data
continue continue
pin.update(data)
carousel_data = pin.get("carousel_data")
if carousel_data:
pin["count"] = len(carousel_data["carousel_slots"])
for num, slot in enumerate(carousel_data["carousel_slots"], 1):
slot["media_id"] = slot.pop("id")
pin.update(slot)
pin["num"] = num
size, image = next(iter(slot["images"].items()))
url = image["url"].replace("/" + size + "/", "/originals/")
yield Message.Url, url, text.nameext_from_url(url, pin)
else:
try: try:
media = self._media_from_pin(pin) files = self._extract_files(pin)
except Exception: except Exception as exc:
self.log.debug("Unable to fetch download URL for pin %s", self.log.debug("", exc_info=exc)
pin.get("id")) self.log.warning(
"%s: Error when extracting download URLs (%s: %s)",
pin.get("id"), exc.__class__.__name__, exc)
continue continue
if videos or media.get("duration") is None: pin.update(data)
pin.update(media) pin["count"] = len(files)
pin["num"] = pin["count"] = 1
pin["media_id"] = ""
url = media["url"] yield Message.Directory, pin
for pin["num"], file in enumerate(files, 1):
url = file["url"]
text.nameext_from_url(url, pin) text.nameext_from_url(url, pin)
pin.update(file)
if "media_id" not in file:
pin["media_id"] = ""
if pin["extension"] == "m3u8": if pin["extension"] == "m3u8":
url = "ytdl:" + url url = "ytdl:" + url
@@ -85,26 +76,38 @@ class PinterestExtractor(Extractor):
def pins(self): def pins(self):
"""Return all relevant pin objects""" """Return all relevant pin objects"""
@staticmethod def _extract_files(self, pin):
def _media_from_pin(pin): carousel_data = pin.get("carousel_data")
if carousel_data:
files = []
for slot in carousel_data["carousel_slots"]:
size, image = next(iter(slot["images"].items()))
slot["media_id"] = slot.pop("id")
slot["url"] = image["url"].replace(
"/" + size + "/", "/originals/", 1)
files.append(slot)
return files
videos = pin.get("videos") videos = pin.get("videos")
if videos: if videos:
video_formats = videos["video_list"] if not self.videos:
return ()
pass
video_formats = videos["video_list"]
for fmt in ("V_HLSV4", "V_HLSV3_WEB", "V_HLSV3_MOBILE"): for fmt in ("V_HLSV4", "V_HLSV3_WEB", "V_HLSV3_MOBILE"):
if fmt in video_formats: if fmt in video_formats:
media = video_formats[fmt] file = video_formats[fmt]
break break
else: else:
media = max(video_formats.values(), file = max(video_formats.values(),
key=lambda x: x.get("width", 0)) key=lambda x: x.get("width", 0))
if "V_720P" in video_formats: if "V_720P" in video_formats:
media["_fallback"] = (video_formats["V_720P"]["url"],) file["_fallback"] = (video_formats["V_720P"]["url"],)
return (file,)
return media return (pin["images"]["orig"],)
return pin["images"]["orig"]
class PinterestPinExtractor(PinterestExtractor): class PinterestPinExtractor(PinterestExtractor):