pindown.mjs

Pinterest Video/Image/GIF Downloader

#downloader#tools#media
13
1 Jan 2026, 06:02
RawEdit
javascript0 lines
/***
  @ Base: https://pindown.cc/
  @ Author: Shannz
  @ Note: Pinterest Video/Image/GIF Downloader.  
***/

import axios from 'axios';
import * as cheerio from 'cheerio';
import qs from 'qs';

const CONFIG = {
    BASE_URL: "https://pindown.cc",
    ENDPOINTS: {
        HOME: "/en/",
        DOWNLOAD: "/en/download"
    },
    HEADERS: {
        "User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, br",
        "Cache-Control": "max-age=0",
        "Upgrade-Insecure-Requests": "1",
        "Origin": "https://pindown.cc",
        "Referer": "https://pindown.cc/en/",
        "Sec-Fetch-Site": "same-origin",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Dest": "document",
        "Priority": "u=0, i"
    }
};

const cleanText = (str) => {
    return str ? str.replace(/\s+/g, ' ').trim() : '';
};

export const pindown = {
    download: async (pinUrl) => {
        try {
            if (!pinUrl) return { error: 'URL Pinterest tidak boleh kosong.' };
            const homeResponse = await axios.get(CONFIG.BASE_URL + CONFIG.ENDPOINTS.HOME, {
                headers: CONFIG.HEADERS
            });

            const cookies = homeResponse.headers['set-cookie'];
            const sessionCookie = cookies ? cookies.join('; ') : '';
            const $home = cheerio.load(homeResponse.data);
            const csrfToken = $home('input[name="csrf_token"]').val();

            if (!csrfToken) {
                return { error: 'Gagal mendapatkan CSRF Token.' };
            }

            const postData = qs.stringify({
                'csrf_token': csrfToken,
                'url': pinUrl
            });

            const downloadResponse = await axios.post(
                CONFIG.BASE_URL + CONFIG.ENDPOINTS.DOWNLOAD,
                postData,
                {
                    headers: {
                        ...CONFIG.HEADERS,
                        'Content-Type': 'application/x-www-form-urlencoded',
                        'Cookie': sessionCookie,
                        'Referer': CONFIG.BASE_URL + CONFIG.ENDPOINTS.HOME
                    }
                }
            );

            const $ = cheerio.load(downloadResponse.data);
            const alertError = $('.alert-danger').text();
            if (alertError) {
                return { error: cleanText(alertError) };
            }

            const resultContainer = $('.square-box');
            if (resultContainer.length === 0) {
                return { error: 'Konten tidak ditemukan atau URL tidak valid.' };
            }

            const title = cleanText(resultContainer.find('.font-weight-bold').text());
            const duration = cleanText(resultContainer.find('.text-muted').text());
            const thumbnail = resultContainer.find('.square-box-img img').attr('src');
            
            const result = {
                title: title,
                duration: duration || null,
                thumbnail: thumbnail,
                medias: []
            };

            resultContainer.find('.square-box-btn a').each((i, el) => {
                const link = $(el).attr('href');
                const text = cleanText($(el).text());

                let type = 'unknown';
                if (text.includes('Video')) type = 'video';
                else if (text.includes('Image')) type = 'image';
                else if (text.includes('GIF')) type = 'gif';

                let ext = 'jpg';
                if (link.includes('.mp4')) ext = 'mp4';
                else if (link.includes('.gif')) ext = 'gif';
                else if (link.includes('.png')) ext = 'png';

                result.medias.push({
                    type: type,
                    extension: ext,
                    quality: text.replace('Download ', ''),
                    url: link
                });
            });

            return result;

        } catch (error) {
            console.error(`Pindown Error: ${error.message}`);
            if (error.response) {
                 console.error(`Status: ${error.response.status}`);
            }
            return { error: error.message };
        }
    }
};