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

تحميل اغني من ساوند كلود

javascriptv1MITنُشر ٢٨ يوليو ٢٠٢٦· ♥ 0 · ⬇ 1 · 💬 0

تحميل اغني

// plugins/soundcloud.js
// ✧ 2B - YoRHa Unit No.2 Type B - تحميل من SoundCloud 🎵

import fetch from "node-fetch";
import { theme } from '../core/theme.js';
import { generateWAMessageFromContent, proto, prepareWAMessageMedia } from '@whiskeysockets/baileys';

let CLIENT_IDS = [
  'DzA2vRpkKqKVM37Lh9O3XPIJwTpL4U9M',
  'a3e059563d7fd3372b49b37f00a00bcf',
  'iZIs9mchVcX5lhVRyQGGAYlNPVldzAoX',
  'KKzJxmw11tYpCs6T24P4uUYhqmjalG6M',
  'ZbE1zOjMvRkXpL2qW8yN5cF7uA3sD6gH9jK',
];

async function searchSoundCloud(query, limit = 10) {
  const headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Accept': 'application/json',
    'Accept-Language': 'en-US,en;q=0.9',
    'Origin': 'https://soundcloud.com',
    'Referer': 'https://soundcloud.com/'
  };

  for (const cid of CLIENT_IDS) {
    try {
      const url = `https://api-v2.soundcloud.com/search?q=${encodeURIComponent(query)}&client_id=${cid}&limit=${limit}&variant_ids=`;
      const res = await fetch(url, { headers });
      if (res.status === 429) continue;
      if (!res.ok) continue;
      const data = await res.json();
      const tracks = data?.collection?.filter(item => item.kind === 'track') || [];
      if (tracks.length > 0) return tracks.slice(0, limit);
    } catch (err) {
      console.log(`[2B-SC] Search error: ${err.message}`);
    }
  }
  return [];
}

async function downloadSoundCloud(trackUrl) {
  for (const cid of CLIENT_IDS) {
    try {
      const resolveUrl = `https://api-v2.soundcloud.com/resolve?url=${encodeURIComponent(trackUrl)}&client_id=${cid}`;
      const res = await fetch(resolveUrl, {
        headers: { 'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json' }
      });
      if (res.status === 429) continue;
      if (!res.ok) continue;
      const track = await res.json();
      if (!track?.media?.transcodings?.length) continue;
      
      const tc = track.media.transcodings;
      const pick = tc.find(t => t.format?.protocol === 'progressive') || tc[0];
      if (!pick?.url) continue;
      
      const sep = pick.url.includes('?') ? '&' : '?';
      const streamRes = await fetch(`${pick.url}${sep}client_id=${cid}`, {
        headers: { 'User-Agent': 'Mozilla/5.0', 'Accept': 'application/json' }
      });
      if (streamRes.status === 429) continue;
      if (!streamRes.ok) continue;
      
      const streamData = await streamRes.json();
      if (!streamData?.url) continue;
      
      return {
        audioUrl: streamData.url,
        title: track.title || 'SoundCloud',
        thumb: track.artwork_url ? track.artwork_url.replace('large', 't500x500') : null,
      };
    } catch (err) {
      console.log(`[2B-SC] Download error: ${err.message}`);
    }
  }
  throw new Error('فشل التحميل');
}

let handler = async (m, { conn, text, usedPrefix, command }) => {

  const react = async (emoji) => {
    try { await conn.sendMessage(m.chat, { react: { text: emoji, key: m.key } }); } catch {}
  };

  if (text && text.includes('soundcloud.com')) {
    react('⏳');
    try {
      const result = await downloadSoundCloud(text.trim());
      await conn.sendMessage(m.chat, {
        audio: { url: result.audioUrl },
        mimetype: 'audio/mpeg',
        ptt: false
      }, { quoted: m });
      react('✅');
    } catch (e) {
      react('❌');
      m.reply(theme.build([
        { type: 'title', text: '❄️ 2B: "فشل التحميل"' },
        { type: 'warning', text: e.message }
      ]));
    }
    return;
  }

  if (!text) {
    return m.reply(theme.build([
      { type: 'title', text: '🎵 2B: "وحدة SoundCloud"' },
      { type: 'divider' },
      { type: 'line', text: '🔮 *تحميل الأغاني من SoundCloud*' },
      { type: 'divider' },
      { type: 'info', label: '⚔️ الاستخدام', value: `${usedPrefix + command} <اسم الأغنية>` },
      { type: 'spacer' },
      { type: 'info', label: '📌 مثال', value: `${usedPrefix + command} faded alan walker` }
    ]));
  }

  react('🔍');
  await m.reply(theme.build([
    { type: 'title', text: '🔍 2B: "جاري البحث"' },
    { type: 'info', label: '🎯 الهدف', value: text }
  ]));

  try {
    const tracks = await searchSoundCloud(text, 10);
    if (!tracks.length) {
      react('❌');
      return m.reply(theme.build([
        { type: 'title', text: '❄️ 2B: "لا توجد نتائج"' },
        { type: 'warning', text: `لم يتم العثور على نتائج للبحث: ${text}` }
      ]));
    }

    // ✅ تجهيز صورة من أول نتيجة فيها صورة
    let headerImage = null;
    for (const track of tracks) {
      if (track.artwork_url) {
        try {
          const imgUrl = track.artwork_url.replace('large', 't500x500');
          const imgRes = await fetch(imgUrl);
          if (imgRes.ok) {
            headerImage = Buffer.from(await imgRes.arrayBuffer());
            break;
          }
        } catch {}
      }
    }

    // بناء القائمة
    const sections = [];
    const rows = [];
    
    for (let i = 0; i < tracks.length; i++) {
      const track = tracks[i];
      const artistName = track.user?.username || track.user?.full_name || 'Unknown';
      const duration = Math.floor(track.duration / 60000) + ':' + Math.floor((track.duration % 60000) / 1000).toString().padStart(2, '0');
      const title = track.title.length > 35 ? track.title.substring(0, 32) + '...' : track.title;
      
      rows.push({
        title: `${i + 1}. ${title}`,
        description: `👤 ${artistName} | ⏱️ ${duration}`,
        id: `.ساوند_تحميل ${track.permalink_url}`
      });
    }
    
    sections.push({
      title: "🎵 نتائج البحث",
      rows: rows
    });

    // ✅ بناء الهيدر بالصورة (طريقة بسيطة)
    let header = { hasMediaAttachment: false };
    
    if (headerImage) {
      const media = await prepareWAMessageMedia(
        { image: headerImage },
        { upload: conn.waUploadToServer }
      );
      header = {
        hasMediaAttachment: true,
        imageMessage: media.imageMessage
      };
    }

    const msg = generateWAMessageFromContent(m.chat, {
      viewOnceMessage: {
        message: {
          interactiveMessage: proto.Message.InteractiveMessage.fromObject({
            body: proto.Message.InteractiveMessage.Body.create({
              text: theme.build([
                { type: 'title', text: '🎵 2B: "نتائج البحث"' },
                { type: 'info', label: '🎯 البحث', value: text },
                { type: 'info', label: '📊 النتائج', value: `${tracks.length} أغنية` },
                { type: 'divider' },
                { type: 'line', text: '⚔️ اضغط على الزر لاختيار الأغنية' }
              ])
            }),
            footer: proto.Message.InteractiveMessage.Footer.create({
              text: '❄️ 2B - YoRHa Unit No.2 Type B ❄️'
            }),
            header: proto.Message.InteractiveMessage.Header.fromObject(header),
            nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
              buttons: [
                {
                  name: 'single_select',
                  buttonParamsJson: JSON.stringify({
                    title: "🎵 اختر الأغنية",
                    sections: sections
                  })
                }
              ],
              messageParamsJson: JSON.stringify({
                bottom_sheet: {
                  in_thread_buttons_limit: 1,
                  list_title: "🎵 قائمة الأغاني",
                  button_title: "🎵 عرض النتائج"
                }
              })
            })
          })
        }
      }
    }, { userJid: conn.user.jid, quoted: m });

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

  } catch (e) {
    console.error('[2B-SC]', e);
    react('❌');
    m.reply(theme.build([
      { type: 'title', text: '❄️ 2B: "فشلت مهمة البحث"' },
      { type: 'warning', text: e.message }
    ]));
  }
};

// معالج الأزرار - تحميل مباشر
handler.before = async function (m, { conn }) {
  if (!m.text) return;
  
  if (m.text.startsWith('.ساوند_تحميل')) {
    const trackUrl = m.text.replace('.ساوند_تحميل', '').trim();
    if (trackUrl) {
      await conn.sendMessage(m.chat, { react: { text: '⏳', key: m.key } }).catch(() => {});
      try {
        const result = await downloadSoundCloud(trackUrl);
        await conn.sendMessage(m.chat, {
          audio: { url: result.audioUrl },
          mimetype: 'audio/mpeg',
          ptt: false
        }, { quoted: m });
        await conn.sendMessage(m.chat, { react: { text: '✅', key: m.key } }).catch(() => {});
      } catch (e) {
        await conn.sendMessage(m.chat, { react: { text: '❌', key: m.key } }).catch(() => {});
        m.reply(theme.build([
          { type: 'title', text: '❄️ 2B: "فشل التحميل"' },
          { type: 'warning', text: e.message }
        ]));
      }
      return true;
    }
  }
  return;
};

handler.help = ['ساوند <اسم>'];
handler.tags = ['downloader'];
handler.command = /^(اغنيه|soundcloud|sc)$/i;

export default handler;

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

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