File size: 3,182 Bytes
2821330
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const yts = require('yt-search');

module.exports.config = {
  name: "music",
  hasPermission: 0,
  version: "1.0.0",
commandCategory: "Media",
  description: "Get music",
  usePrefix: true,
  credits: "Jonell Magallanes",
  cooldowns: 10
};
  module.exports.run = async function ({ api, event, args }) {
    if (!args[0]) {
      return api.sendMessage(`❌ Please enter a music name!`, event.threadID);
    }

    const song = args.join(" ");
    let findingMessage;

    try {
      findingMessage = await api.sendMessage(
        `πŸ” | Finding "${song}". Please wait...`,
        event.threadID
      );

      const searchResults = await yts(song);
      const firstResult = searchResults.videos[0];

      if (!firstResult) {
        await api.editMessage(
          `❌ | No results found for "${song}".`,
          findingMessage.messageID,
          event.threadID
        );
        return;
      }

      const { title, url } = firstResult;

      await api.editMessage(
        `⏱️ | Music Title found: "${title}". Downloading...`,
        findingMessage.messageID
      );

      const response = await axios.get(
        `https://ccprojectapis.ddns.net/api/music?url=${url}`
      );

      if (!response.data || !response.data.data || !response.data.data.link) {
        throw new Error("Invalid API response while fetching download link.");
      }

      const downloadLink = response.data.data.link;
      const filePath = path.resolve(__dirname, 'cache', `${Date.now()}.mp3`);
      const fileStream = fs.createWriteStream(filePath);

      const responseStream = await axios({
        method: 'get',
        url: downloadLink,
        responseType: 'stream',
      });

      responseStream.data.pipe(fileStream);

      fileStream.on('finish', async () => {
        const stats = fs.statSync(filePath);
        const fileSizeInMB = stats.size / (1024 * 1024);

        if (fileSizeInMB > 25) {
          await api.editMessage(
            `❌ | The file size exceeds the 25MB limit. Unable to send "${title}".`,
            findingMessage.messageID,
            event.threadID
          );
          fs.unlinkSync(filePath);
          return;
        }

        await api.sendMessage(
          {
            body: `🎡 Music Player\nHere is your music for "${song}"\n\nTitle: ${title}\nYouTube Link: ${url}`,
            attachment: fs.createReadStream(filePath),
          },
          event.threadID
        );

        fs.unlinkSync(filePath);
        api.unsendMessage(findingMessage.messageID);
      });

      responseStream.data.on('error', async (error) => {
        console.error(error);
        await api.editMessage(
          `❌ | Error while streaming the file: ${error.message}`,
          findingMessage.messageID,
          event.threadID
        );
        fs.unlinkSync(filePath);
      });
    } catch (error) {
      console.error(error);
      if (findingMessage) {
        await api.editMessage(
          `❌ | An error occurred: ${error.message}`,
          findingMessage.messageID,
          event.threadID
        );
      }
  }
};