From 5c9ecb2781c698248386677dbefd80ea45d585b5 Mon Sep 17 00:00:00 2001 From: jsopn Date: Wed, 15 May 2024 18:56:10 +0700 Subject: [PATCH] pinterest: implement image and gifs support (#475) Co-authored-by: jj Co-authored-by: wukko --- README.md | 2 +- src/modules/processing/services/pinterest.js | 22 ++++++++++---- src/modules/processing/servicesConfig.json | 2 +- src/test/tests.json | 32 ++++++++++++++++++++ 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8374817a..e9da513a 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ this list is not final and keeps expanding over time. if support for a service y | service | notes or features | | :-------- | :----- | | instagram | supports photos, videos, and stories. lets you pick what to save from multi-media posts. | -| pinterest | supports videos and stories. | +| pinterest | supports photos, gifs, videos and stories. | | reddit | supports gifs and videos. | | soundcloud | supports private links. | | tiktok | supports videos with or without watermark, images from slideshow without watermark, and full (original) audios. | diff --git a/src/modules/processing/services/pinterest.js b/src/modules/processing/services/pinterest.js index 2364b729..23d9f4d8 100644 --- a/src/modules/processing/services/pinterest.js +++ b/src/modules/processing/services/pinterest.js @@ -1,6 +1,7 @@ import { genericUserAgent } from "../../config.js"; -const linkRegex = /"url":"(https:\/\/v1.pinimg.com\/videos\/.*?)"/g; +const videoRegex = /"url":"(https:\/\/v1.pinimg.com\/videos\/.*?)"/g; +const imageRegex = /src="(https:\/\/i\.pinimg\.com\/.*\.(jpg|gif))"/g; export default async function(o) { let id = o.id; @@ -19,15 +20,24 @@ export default async function(o) { if (!html) return { error: 'ErrorCouldntFetch' }; - let videoLink = [...html.matchAll(linkRegex)] + let videoLink = [...html.matchAll(videoRegex)] .map(([, link]) => link) - .filter(a => a.endsWith('.mp4') && a.includes('720p'))[0]; + .find(a => a.endsWith('.mp4') && a.includes('720p')); - if (!videoLink) return { error: 'ErrorEmptyDownload' }; - - return { + if (videoLink) return { urls: videoLink, filename: `pinterest_${o.id}.mp4`, audioFilename: `pinterest_${o.id}_audio` } + + let imageLink = [...html.matchAll(imageRegex)] + .map(([, link]) => link) + .find(a => a.endsWith('.jpg') || a.endsWith('.gif')); + + if (imageLink) return { + urls: imageLink, + isPhoto: true + } + + return { error: 'ErrorEmptyDownload' }; } diff --git a/src/modules/processing/servicesConfig.json b/src/modules/processing/servicesConfig.json index 0b32016c..eaea0167 100644 --- a/src/modules/processing/servicesConfig.json +++ b/src/modules/processing/servicesConfig.json @@ -91,7 +91,7 @@ "enabled": true }, "pinterest": { - "alias": "pinterest videos & stories", + "alias": "pinterest (all media)", "patterns": ["pin/:id", "pin/:id/:garbage", "url_shortener/:shortLink"], "enabled": true }, diff --git a/src/test/tests.json b/src/test/tests.json index 95c95a65..a0ef8e6b 100644 --- a/src/test/tests.json +++ b/src/test/tests.json @@ -976,6 +976,38 @@ "code": 200, "status": "redirect" } + }, { + "name": "regular picture", + "url": "https://www.pinterest.com/pin/412994228343400946/", + "params": {}, + "expected": { + "code": 200, + "status": "redirect" + } + }, { + "name": "regular picture (.ca TLD)", + "url": "https://www.pinterest.ca/pin/412994228343400946/", + "params": {}, + "expected": { + "code": 200, + "status": "redirect" + } + }, { + "name": "regular gif", + "url": "https://www.pinterest.com/pin/814447913881127862/", + "params": {}, + "expected": { + "code": 200, + "status": "redirect" + } + }, { + "name": "regular gif (.ca TLD)", + "url": "https://www.pinterest.ca/pin/814447913881127862/", + "params": {}, + "expected": { + "code": 200, + "status": "redirect" + } }], "streamable": [{ "name": "regular video",