Update index.js
Browse files
index.js
CHANGED
|
@@ -516,6 +516,89 @@ form.append('lang', 'en');
|
|
| 516 |
}
|
| 517 |
}
|
| 518 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 519 |
const app = express()
|
| 520 |
.set('json spaces', 4)
|
| 521 |
.use(morgan('dev'))
|
|
@@ -843,6 +926,9 @@ let { url } = req.query
|
|
| 843 |
if (!ytIdRegex.test(url)) return res.json({ message: 'Invalid URL' });
|
| 844 |
let video = await ytmp4(url)
|
| 845 |
let audio = await ytmp3(url)
|
|
|
|
|
|
|
|
|
|
| 846 |
return res.json({
|
| 847 |
video: video,
|
| 848 |
audio: audio
|
|
|
|
| 516 |
}
|
| 517 |
}
|
| 518 |
|
| 519 |
+
async function ytDEEL(url) {
|
| 520 |
+
const { v4: uuidv4 } = require('uuid');
|
| 521 |
+
const theme = encodeURIComponent('system');
|
| 522 |
+
const apiUrl = `https://gradio-blocks-youtube-downloader.hf.space/queue/join?__theme=${theme}`;
|
| 523 |
+
const mp3UploadId = uuidv4(); // Gunakan UUID yang berbeda untuk MP3
|
| 524 |
+
const mp4UploadId = Math.random().toString(36).substring(2); // Gunakan UUID yang berbeda untuk MP4
|
| 525 |
+
|
| 526 |
+
const mp3PostData = {
|
| 527 |
+
data: [url, false],
|
| 528 |
+
event_data: null,
|
| 529 |
+
fn_index: 0,
|
| 530 |
+
session_hash: mp3UploadId, // Gunakan mp3UploadId untuk MP3
|
| 531 |
+
trigger_id: 10
|
| 532 |
+
};
|
| 533 |
+
|
| 534 |
+
const mp4PostData = {
|
| 535 |
+
data: [url, true],
|
| 536 |
+
event_data: null,
|
| 537 |
+
fn_index: 0,
|
| 538 |
+
session_hash: mp4UploadId, // Gunakan mp4UploadId untuk MP4
|
| 539 |
+
trigger_id: 10
|
| 540 |
+
};
|
| 541 |
+
|
| 542 |
+
try {
|
| 543 |
+
// Kirim permintaan MP3
|
| 544 |
+
const mp3Response = await axios.post(apiUrl, mp3PostData, { headers: { 'Content-Type': 'application/json', 'Accept': '*/*' } });
|
| 545 |
+
const mp3EventId = mp3Response.data.event_id;
|
| 546 |
+
|
| 547 |
+
// Tunggu respons MP3
|
| 548 |
+
let mp3Url;
|
| 549 |
+
let mp3Completed = false;
|
| 550 |
+
const mp3StatusUrl = `https://gradio-blocks-youtube-downloader.hf.space/queue/data?session_hash=${mp3UploadId}`;
|
| 551 |
+
while (!mp3Completed) {
|
| 552 |
+
const statusResponse = await axios.get(mp3StatusUrl, { headers: { 'Accept': 'text/event-stream' }, responseType: 'text' });
|
| 553 |
+
const rawData = statusResponse.data.trim().split('\n').map(line => line.replace(/^data: /, ''));
|
| 554 |
+
for (const line of rawData) {
|
| 555 |
+
try {
|
| 556 |
+
const event = JSON.parse(line);
|
| 557 |
+
if (event.msg === 'process_completed') {
|
| 558 |
+
if (event.event_id === mp3EventId && !mp3Completed) {
|
| 559 |
+
mp3Url = event?.output?.data[1]?.value?.url;
|
| 560 |
+
mp3Completed = true;
|
| 561 |
+
}
|
| 562 |
+
}
|
| 563 |
+
} catch (e) {}
|
| 564 |
+
}
|
| 565 |
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
| 566 |
+
}
|
| 567 |
+
|
| 568 |
+
// Kirim permintaan MP4
|
| 569 |
+
const mp4Response = await axios.post(apiUrl, mp4PostData, { headers: { 'Content-Type': 'application/json', 'Accept': '*/*' } });
|
| 570 |
+
const mp4EventId = mp4Response.data.event_id;
|
| 571 |
+
|
| 572 |
+
// Tunggu respons MP4
|
| 573 |
+
let mp4Url;
|
| 574 |
+
let mp4Completed = false;
|
| 575 |
+
const mp4StatusUrl = `https://gradio-blocks-youtube-downloader.hf.space/queue/data?session_hash=${mp4UploadId}`;
|
| 576 |
+
while (!mp4Completed) {
|
| 577 |
+
const statusResponse = await axios.get(mp4StatusUrl, { headers: { 'Accept': 'text/event-stream' }, responseType: 'text' });
|
| 578 |
+
const rawData = statusResponse.data.trim().split('\n').map(line => line.replace(/^data: /, ''));
|
| 579 |
+
for (const line of rawData) {
|
| 580 |
+
try {
|
| 581 |
+
const event = JSON.parse(line);
|
| 582 |
+
if (event.msg === 'process_completed') {
|
| 583 |
+
if (event.event_id === mp4EventId && !mp4Completed) {
|
| 584 |
+
mp4Url = event?.output?.data[0]?.value?.url;
|
| 585 |
+
mp4Completed = true;
|
| 586 |
+
}
|
| 587 |
+
}
|
| 588 |
+
} catch (e) {}
|
| 589 |
+
}
|
| 590 |
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
| 591 |
+
}
|
| 592 |
+
|
| 593 |
+
const result = { mp3: mp3Url, mp4: mp4Url };
|
| 594 |
+
return JSON.stringify(result, null, 2);
|
| 595 |
+
|
| 596 |
+
|
| 597 |
+
} catch (error) {
|
| 598 |
+
throw error;
|
| 599 |
+
}
|
| 600 |
+
}
|
| 601 |
+
|
| 602 |
const app = express()
|
| 603 |
.set('json spaces', 4)
|
| 604 |
.use(morgan('dev'))
|
|
|
|
| 926 |
if (!ytIdRegex.test(url)) return res.json({ message: 'Invalid URL' });
|
| 927 |
let video = await ytmp4(url)
|
| 928 |
let audio = await ytmp3(url)
|
| 929 |
+
let data = await ytDEEL(url)
|
| 930 |
+
video = video.concat(data.mp4);
|
| 931 |
+
audio = audio.concat(data.mp3);
|
| 932 |
return res.json({
|
| 933 |
video: video,
|
| 934 |
audio: audio
|