@lyrra-evanth/src-yt
Version:
YouTube Downloader.
174 lines (163 loc) • 4.97 kB
JavaScript
const axios = require("axios");
const yts = require("yt-search");
function getYouTubeVideoId(url) {
const regex = /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|v\/|embed\/|user\/[^\/\n\s]+\/)?(?:watch\?v=|v%3D|embed%2F|video%2F)?|youtu\.be\/|youtube\.com\/watch\?v=|youtube\.com\/embed\/|youtube\.com\/v\/|youtube\.com\/shorts\/|youtube\.com\/playlist\?list=)([a-zA-Z0-9_-]{11})/;
const match = url.match(regex);
return match ? match[1] : null;
}
const audio = [64,96,128,192,256,320,1000,1411]
const video = [360,480,720,1080,1440]
async function convert(id, quality) {
try {
const response = await axios.get(`https://ytdl.vreden.web.id/convert.php/${id}/${quality}`)
let download;
do {
download = await axios.get(`https://ytdl.vreden.web.id/progress.php/${response.data.convert}`)
if (download.data.status == "Error") return {
status: false,
message: "Progress error"
}
} while (download.data.status !== "Finished")
return {
status: true,
quality: `${quality}${audio.includes(quality) ? "kbps" : "p"}`,
availableQuality: audio.includes(quality) ? audio : video,
url: download.data.url,
filename: `${response.data.title} (${quality}${audio.includes(quality) ? "kbps).mp3" : "p).mp4"}`
}
} catch (error) {
console.error("Converting error:", error)
return {
status: false,
message: "Converting error"
}
}
}
async function ytmp3(link, formats = 128) {
const videoId = getYouTubeVideoId(link);
const format = audio.includes(Number(formats)) ? Number(formats) : 128
if (!videoId) {
return {
status: false,
message: "Invalid YouTube URL"
};
}
try {
let data = await yts("https://youtube.com/watch?v=" + videoId);
let response = await convert(videoId, format)
return {
status: true,
creator: "@lyrra-evanth/src-yt",
metadata: data.all[0],
download: response
};
} catch (error) {
console.log(error)
return {
status: false,
message: error.response ? `HTTP Error: ${error.response.status}` : error.message
};
}
}
async function ytmp4(link, formats = 360) {
const videoId = getYouTubeVideoId(link);
const format = video.includes(Number(formats)) ? Number(formats) : 360
if (!videoId) {
return {
status: false,
message: "Invalid YouTube URL"
};
}
try {
let data = await yts("https://youtube.com/watch?v=" + videoId);
let response = await convert(videoId, format)
return {
status: true,
creator: "@lyrra-evanth/src-yt",
metadata: data.all[0],
download: response
};
} catch (error) {
console.log(error)
return {
status: false,
message: error.response ? `HTTP Error: ${error.response.status}` : error.message
};
}
}
async function transcript(link) {
try {
const response = await axios.get('https://ytb2mp4.com/api/fetch-transcript', {
params: {
'url': link
},
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36',
'Referer': 'https://ytb2mp4.com/youtube-transcript'
}
});
return {
status: true,
creator: "@lyrra-evanth/src-yt",
transcript: response.data.transcript
}
} catch (error) {
return {
status: false,
message: error.message
}
}
}
async function ytdlv2(link, formats = "default") {
try {
const result = await axios.get(`https://ytdl.vreden.web.id/metadata?url=${link}`)
if (formats !== "default") {
const videoId = getYouTubeVideoId(link);
const isAudio = audio.includes(Number(formats))
const isVideo = video.includes(Number(formats))
let format;
let response;
if (isAudio) {
format = isAudio ? Number(formats) : 128
response = await convert(videoId, format)
result.data.downloads.audio = response.url
} else if (isVideo) {
format = isVideo ? Number(formats) : 360
response = await convert(videoId, format)
result.data.downloads.video = response.url
}
}
return {
status: true,
creator: "@lyrra-evanth/src-yt",
...result.data
}
} catch (error) {
return {
status: false,
message: error.message
}
}
}
async function search(teks) {
try {
let data = await yts(teks);
return {
status: true,
creator: "@lyrra-evanth/src-yt",
results: data.all
};
} catch (error) {
return {
status: false,
message: error.message
};
}
}
module.exports = {
search,
ytmp3,
ytmp4,
transcript,
ytdlv2
};