//made by zaky/n//dari comotan wkwk/n/nconst ytdl = require('ytdl-core');/nconst fs = require('fs');/nconst ffmpeg = require('fluent-ffmpeg');/nconst search = require('yt-search');/n/nlet handler = async (m, { conn, text }) => {/n if (!text) return m.reply('Example: .play kill bill');/n/n conn.sendMessage(m.chat, {/n react: {/n text: '🕒',/n key: m.key,/n }/n });/n/n try {/n let results = await search(text);/n let videoId = results.videos[0].videoId;/n let info = await ytdl.getInfo(videoId);/n let title = info.videoDetails.title.replace(/[^/w/s]/gi, '');/n let thumbnailUrl = https://i.ytimg.com/vi/${videoId}/hqdefault.jpg;/n let url = info.videoDetails.video_url;/n let duration = parseInt(info.videoDetails.lengthSeconds);/n let uploadDate = new Date(info.videoDetails.publishDate).toLocaleDateString();/n let views = info.videoDetails.viewCount;/n let minutes = Math.floor(duration / 60);/n let description = results.videos[0].description;/n let seconds = duration % 60;/n let durationText = ${minutes}:${seconds < 10 ? '0' : ''}${seconds};/n /n function formatViews(views) {/n if (views >= 1000000) {/n return (views / 1000000).toFixed(1) + 'M';/n } else if (views >= 1000) {/n return (views / 1000).toFixed(1) + 'K';/n } else {/n return views.toString();/n }/n }/n/n let audio = ytdl(videoId, { quality: 'highestaudio' });/n let inputFilePath = 'tmp/' + title + '.webm';/n let outputFilePath = 'tmp/' + title + '.mp3';/n/n let fileSize = 0;/n audio.on('data', (chunk) => {/n fileSize += chunk.length;/n if (fileSize > 50 * 1024 * 1024) {/n audio.destroy();/n fs.unlinkSync(inputFilePath);/n return m.reply('😅Audio exceeds 50MB limit');/n }/n });/n /n let viewsFormatted = formatViews(views);/n let infoText = /n*${title.toUpperCase()}*/n /n╭─ • 「 *YOUTUBE PLAY* 」/n│ ◦ *Duration*: ${durationText}/n│ ◦ *Upload Date*: ${uploadDate}/n│ ◦ *Views*: ${viewsFormatted}/n╰──── •;/n/n conn.sendMessage(m.chat, {/n text: infoText,/n contextInfo: {/n externalAdReply: {/n showAdAttribution: true,/n title: ${title},/n body: description,/n thumbnailUrl: thumbnailUrl,/n mediaUrl: url,/n sourceUrl: url,/n mediaType: 2,/n renderLargerThumbnail: true/n }/n }/n }, { quoted: m });/n/n audio.pipe(fs.createWriteStream(inputFilePath)).on('finish', async () => {/n ffmpeg(inputFilePath)/n .toFormat('mp3')/n .on('end', async () => {/n let thumbnailData = await conn.getFile(thumbnailUrl);/n let buffer = fs.readFileSync(outputFilePath);/n conn.sendFile(m.chat, buffer, ${title}.mp3, '', m);/n fs.unlinkSync(inputFilePath);/n fs.unlinkSync(outputFilePath);/n })/n .on('error', (err) => {/n console.log(err);/n m.reply(🥺An error occurred while converting the audio: ${err.message});/n fs.unlinkSync(inputFilePath);/n fs.unlinkSync(outputFilePath);/n })/n .save(outputFilePath);/n });/n/n } catch (e) {/n console.log(e);/n m.reply(🥺An error occurred while searching for the song: ${e.message});/n }/n};/n/nhandler.help = ['play'];/nhandler.tags = ['downloader'];/nhandler.command = /^play$/i;/nhandler.limit = true;/n/nmodule.exports = handler;


原文地址: http://www.cveoy.top/t/topic/fQTM 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录