max / سناب شات منزل الصور والفيديوهات (HD)

// ==UserScript==
// @name         Snapchat Image & Video Downloader (HD)
// @name:tr      Snapchat Resim & Video İndirici (HD)
// @name:zh-CN   Snapchat 图片和视频下载器 (高清)
// @name:fr      Snapchat Téléchargeur d'images et de vidéos (HD)
// @name:ru      Snapchat Загрузчик изображений и видео (HD)
// @name:ar      سناب شات منزل الصور والفيديوهات (HD)
// @name:es      Snapchat Descargador de Imágenes y Videos (HD)
// @name:pt      Snapchat Baixador de Imagens e Vídeos (HD)
// @name:de      Snapchat Bild- & Video-Downloader (HD)
// @name:hi      Snapchat छवि और वीडियो डाउनलोडर (HD)
// @name:it      Snapchat Downloader di Immagini e Video (HD)
// @name:ja      Snapchat 画像&動画ダウンローダー (HD)
// @name:ko      Snapchat 이미지 및 비디오 다운로더 (HD)
// @name:bn      Snapchat ছবি এবং ভিডিও ডাউনলোডার (HD)
// @name:id      Snapchat Pengunduh Gambar & Video (HD)
// @namespace    https://tr-wp.com
// @version      2.5.0
// @description  Download Snapchat images and videos in full resolution with a double-click or a dedicated button. Supports 15+ languages.
// @description:tr Snapchat resimlerini ve videolarını çift tıklamayla veya özel bir butonla tam çözünürlükte indirin. 15+ dil desteği.
// @description:zh-CN 双击或通过专用按钮以全分辨率下载 Snapchat 图片和视频。支持 15+ 种语言。
// @description:fr Téléchargez des images et des vidéos Snapchat en pleine résolution d'un double-clic ou via un bouton dédié. Supporte 15+ langues.
// @description:ru Загружайте изображения и видео из Snapchat в полном разрешении двойным кликом или с помощью специальной кнопки. Поддержка 15+ языков.
// @description:ar قم بتنزيل صور وفيديوهات سناب شات بدقة كاملة بنقرة مزدوجة أو عبر زر مخصص. يدعم أكثر من 15 لغة.
// @description:es Descarga imágenes y videos de Snapchat en resolución completa con un doble clic o un botón dedicado. Soporta más de 15 idiomas.
// @description:pt Baixe imagens e vídeos do Snapchat em resolução total com um duplo clique ou um botão dedicado. Suporta mais de 15 idiomas.
// @description:de Laden Sie Snapchat-Bilder und -Videos in voller Auflösung mit einem Doppelklick oder einer speziellen Schaltfläche herunter. Unterstützt 15+ Sprachen.
// @description:hi डबल-क्लिक या एक समर्पित बटन के साथ पूर्ण रिज़ॉल्यूशन में स्नैपचैट चित्र और वीडियो डाउनलोड करें। 15+ भाषाओं का समर्थन करता है।
// @description:it Scarica immagini e video di Snapchat a risoluzione completa con un doppio clic o un pulsante dedicato. Supporta oltre 15 lingue.
// @description:ja ダブルクリックまたは専用ボタン ile Snapchat の画像とビデオをフル解像度でダウンロードします。15 言語以上をサポート。
// @description:ko 더블 클릭 또는 전용 버튼을 사용하여 전체 해상도로 Snapchat 이미지 및 비디오를 다운로드하십시오. 15개 이상의 언어를 지원합니다.
// @description:bn ডাবল-ক্লিক বা একটি ডেডিকেটেড বোতামের সাহায্যে পূর্ণ রেজোলিউশনে স্ন্যাপচ্যাট ছবি এবং ভিডিও ডাউনলোড করুন। ১৫টিরও বেশি ভাষা সমর্থন করে।
// @description:id Unduh gambar dan video Snapchat dalam resolusi penuh dengan klik ganda veya tombol özel. Mendukung 15+ bahasa.
// @author       Yoka - tr-wp.com
// @match        *://*.snapchat.com/*
// @grant        GM_download
// @grant        GM_addStyle
// @run-at       document-start
// @license      MIT
// @icon         https://www.google.com/s2/favicons?domain=snapchat.com&sz=64
// ==/UserScript==

(function () {
    'use strict';

    const translations = {
        'en': 'Download',
        'tr': 'İndir',
        'es': 'Descargar',
        'fr': 'Télécharger',
        'de': 'Herunterladen',
        'pt': 'Baixar',
        'ru': 'Скачать',
        'zh': '下载',
        'hi': 'डाउनलोड',
        'ar': 'تنزيل',
        'ja': 'ダウンロード',
        'ko': '다운로드',
        'bn': 'ডাউনলোড',
        'it': 'Scarica',
        'id': 'Unduh'
    };

    const getLang = () => {
        const lang = navigator.language.split('-')[0];
        return translations[lang] || translations['en'];
    };

    GM_addStyle(`
        .snap-dl-btn {
            position: absolute;
            bottom: 12px;
            right: 12px;
            z-index: 2147483647;
            background: rgba(0, 0, 0, 0.7);
            color: #fff;
            border: 1px solid rgba(255, 255, 255, 0.4);
            border-radius: 6px;
            padding: 5px 10px;
            font-size: 12px;
            font-weight: bold;
            cursor: pointer;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
            backdrop-filter: blur(5px);
            transition: all 0.2s ease;
            display: flex;
            align-items: center;
            gap: 5px;
        }
        .snap-dl-btn:hover {
            background: rgba(0, 0, 0, 0.9);
            transform: scale(1.05);
            border-color: #fffc00;
        }
        .snap-container-relative { position: relative !important; }
    `);

    const downloadMedia = (el) => {
        const src = el.currentSrc || el.src;
        if (!src || !src.startsWith('blob:')) return;

        const type = el instanceof HTMLVideoElement ? 'video' : 'image';
        const extension = type === 'video' ? 'mp4' : 'png';
        const now = new Date();
        const timestamp = now.toISOString().replace(/[:.]/g, '-');
        const filename = `snapchat_${type}_${timestamp}.${extension}`;

        GM_download({
            url: src,
            name: filename,
            saveAs: false,
            onload: () => console.log(`[SnapDL] ✅ Saved: ${filename}`),
            onerror: err => console.error('[SnapDL] ❌ Error:', err)
        });
    };

    const injectButtons = () => {
        const mediaElements = document.querySelectorAll('img, video');
        const buttonText = getLang();
        
        mediaElements.forEach(el => {
            const src = el.currentSrc || el.src;
            if (!src || !src.startsWith('blob:')) return;
            if (el.dataset.snapDlReady) return;

            el.dataset.snapDlReady = 'true';
            const container = el.parentElement;
            
            if (container) {
                container.classList.add('snap-container-relative');
                const btn = document.createElement('button');
                btn.className = 'snap-dl-btn';
                btn.innerHTML = `<span>⬇</span> ${buttonText}`;
                btn.onclick = (e) => {
                    e.preventDefault();
                    e.stopPropagation();
                    downloadMedia(el);
                };
                container.appendChild(btn);
            }
        });
    };

    document.addEventListener('dblclick', (e) => {
        const el = e.target;
        if (el instanceof HTMLImageElement || el instanceof HTMLVideoElement) {
            downloadMedia(el);
        }
    }, true);

    const observer = new MutationObserver(() => injectButtons());

    const init = () => {
        if (document.body) {
            observer.observe(document.body, { childList: true, subtree: true });
            injectButtons();
        }
    };

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();