تخطَّ إلى المحتوى
ARAB CODEمجتمع المطورين العرب

سبوتيفاي

javascriptv1MITنُشر ٢٢ أغسطس ٢٠٢٦· ♥ 0 · ⬇ 1 · 💬 0

تحميل و بحث من سبوتيفاي

// plugins/spotify.js
import axios from 'axios';
import { generateWAMessageFromContent, proto, prepareWAMessageMedia } from '@whiskeysockets/baileys';

const API_URL = 'https://2b.hidenfree.com';

async function searchSpotify(query, limit = 10) {
    const { data } = await axios.get(`${API_URL}/api/spotify/search`, {
        params: { q: query, limit },
        timeout: 30000,
        validateStatus: () => true
    });
    return data;
}

async function downloadSpotify(query) {
    const { data } = await axios.get(`${API_URL}/api/spotify/public`, {
        params: { api_key: 'free_key', q: query },
        timeout: 300000,
        validateStatus: () => true
    });
    return data;
}

async function downloadFile(fileKey) {
    const res = await axios.get(`${API_URL}/api/spotify/download?file=${fileKey}`, {
        responseType: 'arraybuffer',
        timeout: 300000,
        validateStatus: () => true
    });
    return Buffer.from(res.data);
}

let handler = async (m, { conn, text }) => {
    if (!text) return m.reply('🎵 *Spotify*\n\n📌 .سبوتيفاي <اسم الأغنية>');

    if (text.startsWith('dl_')) {
        const encodedData = text.replace('dl_', '');
        
        await m.react('⏳');

        try {
            const decoded = decodeURIComponent(encodedData);
            const [title, artist, album, duration, explicit, thumb, url] = decoded.split('|');

            // ✅ 1. أرسل المعلومات + الصورة الأول
            let msgText = `🎵 *${title}*\n`;
            if (artist && artist !== 'undefined') msgText += `👤 *الفنان:* ${artist}\n`;
            if (album && album !== 'undefined') msgText += `💿 *الألبوم:* ${album}\n`;
            if (duration && duration !== 'undefined') msgText += `⏱️ *المدة:* ${duration}\n`;
            if (explicit === 'true') msgText += `🔞 *Explicit:* نعم\n`;

            if (thumb && thumb !== 'undefined' && thumb !== 'null') {
                await conn.sendMessage(m.chat, {
                    image: { url: thumb },
                    caption: msgText
                }, { quoted: m });
            } else {
                await m.reply(msgText);
            }

            // ✅ 2. بعدها نبدأ التحميل
            await m.reply('⏳ *جاري التحميل...*');

            const searchQuery = `${title} ${artist}`.trim();
            const dlData = await downloadSpotify(searchQuery);
            
            if (!dlData?.success || !dlData?.fileKey) throw new Error(dlData?.error || 'فشل التحميل');

            const audioBuffer = await downloadFile(dlData.fileKey);
            if (!audioBuffer.length) throw new Error('ملف فارغ');

            await conn.sendMessage(m.chat, {
                audio: audioBuffer,
                mimetype: 'audio/mpeg',
                fileName: `${title}.mp3`,
                ptt: false
            }, { quoted: m });

            await m.react('✅');
        } catch (e) {
            await m.react('❌');
            m.reply('❌ ' + e.message);
        }
        return;
    }

    // ✅ بحث
    await m.react('🔍');

    try {
        const data = await searchSpotify(text, 10);
        const tracks = data?.tracks || [];
        
        if (!tracks.length) { await m.react('❌'); return m.reply('❌ لا توجد نتائج'); }

        let headerImageBuffer = null;
        for (const t of tracks) {
            if (t.thumb) {
                try {
                    const imgRes = await axios.get(t.thumb, { responseType: 'arraybuffer', timeout: 15000 });
                    headerImageBuffer = Buffer.from(imgRes.data);
                    break;
                } catch {}
            }
        }

        let header = { hasMediaAttachment: false };
        if (headerImageBuffer) {
            try {
                const media = await prepareWAMessageMedia(
                    { image: headerImageBuffer },
                    { upload: conn.waUploadToServer }
                );
                header = { hasMediaAttachment: true, imageMessage: media.imageMessage };
            } catch {}
        }

        let rows = tracks.map((t, i) => {
            const encodedData = encodeURIComponent(`${t.title}|${t.artist}|${t.album}|${t.duration}|${t.explicit}|${t.thumb}|${t.url}`);
            return {
                title: `${i + 1}. ${t.title}`,
                description: `👤 ${t.artist} | 💿 ${t.album} | ⏱️ ${t.duration}`,
                id: `.سبوتيفاي dl_${encodedData}`
            };
        });

        const msg = generateWAMessageFromContent(m.chat, {
            viewOnceMessage: {
                message: {
                    interactiveMessage: proto.Message.InteractiveMessage.fromObject({
                        body: proto.Message.InteractiveMessage.Body.create({ text: `🎵 *نتائج: ${text}*\n📊 ${tracks.length} أغنية` }),
                        footer: proto.Message.InteractiveMessage.Footer.create({ text: '✧ 2B' }),
                        header: proto.Message.InteractiveMessage.Header.fromObject(header),
                        nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
                            buttons: [{
                                name: 'single_select',
                                buttonParamsJson: JSON.stringify({
                                    title: "🎵 اختر الأغنية",
                                    sections: [{ title: "النتائج", rows }]
                                })
                            }],
                            messageParamsJson: ''
                        })
                    })
                }
            }
        }, { userJid: conn.user.jid, quoted: m });

        await conn.relayMessage(m.chat, msg.message, { messageId: msg.key.id });
        await m.react('✅');

    } catch (e) {
        console.error('[Spotify]', e.message);
        await m.react('❌');
    }
};

handler.command = /^(سبوتيفاي|spotify|spot)$/i;
handler.tags = ['downloader'];
export default handler;

التعليقات (0)

سجّل الدخول للتعليق.