Spaces:
Paused
Paused
Update server.js
Browse files
server.js
CHANGED
|
@@ -25,7 +25,7 @@ app.get("/search", async (req, res) => {
|
|
| 25 |
console.log(`Chromium Path: ${chromiumPath || "Using Playwright's default"}`);
|
| 26 |
|
| 27 |
const browser = await chromium.launch({
|
| 28 |
-
headless:
|
| 29 |
executablePath: chromiumPath || undefined,
|
| 30 |
args: ["--no-sandbox", "--disable-blink-features=AutomationControlled", "--disable-dev-shm-usage"]
|
| 31 |
});
|
|
@@ -37,7 +37,7 @@ app.get("/search", async (req, res) => {
|
|
| 37 |
const page = await context.newPage();
|
| 38 |
|
| 39 |
try {
|
| 40 |
-
console.log(`Searching for: ${movieName}`);
|
| 41 |
await page.goto("https://www.fzmovies.net/csearch.php", { waitUntil: "domcontentloaded", timeout: 60000 });
|
| 42 |
|
| 43 |
await page.fill("#searchname", movieName);
|
|
@@ -46,61 +46,54 @@ app.get("/search", async (req, res) => {
|
|
| 46 |
page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 60000 })
|
| 47 |
]);
|
| 48 |
|
| 49 |
-
// Step 1: Get first movie result
|
| 50 |
const movieData = await page.evaluate(() => {
|
| 51 |
const firstResult = document.querySelector(".mainbox a");
|
| 52 |
return firstResult ? { title: firstResult.innerText.trim(), link: firstResult.href } : null;
|
| 53 |
});
|
| 54 |
|
| 55 |
if (!movieData) {
|
| 56 |
-
console.log("No movie found!");
|
| 57 |
await browser.close();
|
| 58 |
return res.status(404).json({ error: "Movie not found" });
|
| 59 |
}
|
| 60 |
|
| 61 |
-
console.log(`Movie Found: ${movieData.title}`);
|
| 62 |
await page.goto(movieData.link, { waitUntil: "domcontentloaded", timeout: 60000 });
|
| 63 |
|
| 64 |
-
// Step 2:
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
const links = document.querySelectorAll('a[href*="download1.php?downloadoptionskey="]');
|
| 68 |
-
return links.length ? baseURL + links[links.length - 1].getAttribute("href") : null;
|
| 69 |
-
});
|
| 70 |
-
|
| 71 |
-
if (!downloadPageLink) {
|
| 72 |
-
await browser.close();
|
| 73 |
-
return res.status(404).json({ error: "Download link not found" });
|
| 74 |
-
}
|
| 75 |
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
// Step 3: Extract "download.php" page link (LAST one)
|
| 79 |
const finalDownloadPage = await page.evaluate(() => {
|
| 80 |
-
const baseURL = "https://www.fzmovies.net/";
|
| 81 |
const links = document.querySelectorAll('a[href*="download.php?downloadkey="]');
|
| 82 |
-
return links.length ?
|
| 83 |
});
|
| 84 |
|
| 85 |
if (!finalDownloadPage) {
|
|
|
|
| 86 |
await browser.close();
|
| 87 |
return res.status(404).json({ error: "Final download page not found" });
|
| 88 |
}
|
| 89 |
|
| 90 |
await page.goto(finalDownloadPage, { waitUntil: "domcontentloaded", timeout: 60000 });
|
| 91 |
|
| 92 |
-
// Step 4: Extract
|
| 93 |
let redirectedDownloadLink = await page.evaluate(() => {
|
| 94 |
const links = document.querySelectorAll('a[href*="dlink.php?id="]');
|
| 95 |
return links.length ? links[links.length - 1].href : null;
|
| 96 |
});
|
| 97 |
|
| 98 |
if (!redirectedDownloadLink) {
|
|
|
|
| 99 |
await browser.close();
|
| 100 |
return res.status(404).json({ error: "Redirected download link not found" });
|
| 101 |
}
|
| 102 |
|
| 103 |
-
|
|
|
|
|
|
|
| 104 |
let finalDownloadURL = null;
|
| 105 |
let retryAttempts = 3;
|
| 106 |
|
|
@@ -109,18 +102,21 @@ app.get("/search", async (req, res) => {
|
|
| 109 |
const downloadPage = await context.newPage();
|
| 110 |
await downloadPage.goto(redirectedDownloadLink, { waitUntil: "networkidle", timeout: 60000 });
|
| 111 |
|
| 112 |
-
//
|
| 113 |
if (await downloadPage.evaluate(() => document.body.innerText.includes("Your previous session has expired"))) {
|
| 114 |
-
console.warn("Session expired! Restarting
|
| 115 |
await page.goto(movieData.link, { waitUntil: "domcontentloaded", timeout: 60000 });
|
| 116 |
|
|
|
|
|
|
|
|
|
|
| 117 |
redirectedDownloadLink = await page.evaluate(() => {
|
| 118 |
const links = document.querySelectorAll('a[href*="dlink.php?id="]');
|
| 119 |
return links.length ? links[links.length - 1].href : null;
|
| 120 |
});
|
| 121 |
|
| 122 |
if (!redirectedDownloadLink) {
|
| 123 |
-
throw new Error("Failed to regenerate download link.");
|
| 124 |
}
|
| 125 |
}
|
| 126 |
|
|
@@ -133,6 +129,7 @@ app.get("/search", async (req, res) => {
|
|
| 133 |
}
|
| 134 |
|
| 135 |
if (!finalDownloadURL) {
|
|
|
|
| 136 |
await browser.close();
|
| 137 |
return res.status(500).json({ error: "Failed to retrieve final download link" });
|
| 138 |
}
|
|
@@ -154,7 +151,7 @@ app.get("/search", async (req, res) => {
|
|
| 154 |
const cleanedDownloadURL = finalDownloadURL.match(/(.*\.(mp4|mkv|avi|mov))/i);
|
| 155 |
const finalLink = cleanedDownloadURL ? cleanedDownloadURL[1] : finalDownloadURL;
|
| 156 |
|
| 157 |
-
console.log(`β
|
| 158 |
console.log(`β
Fresh Download Link: ${finalLink}`);
|
| 159 |
|
| 160 |
await browser.close();
|
|
|
|
| 25 |
console.log(`Chromium Path: ${chromiumPath || "Using Playwright's default"}`);
|
| 26 |
|
| 27 |
const browser = await chromium.launch({
|
| 28 |
+
headless: true,
|
| 29 |
executablePath: chromiumPath || undefined,
|
| 30 |
args: ["--no-sandbox", "--disable-blink-features=AutomationControlled", "--disable-dev-shm-usage"]
|
| 31 |
});
|
|
|
|
| 37 |
const page = await context.newPage();
|
| 38 |
|
| 39 |
try {
|
| 40 |
+
console.log(`π Searching for: ${movieName}`);
|
| 41 |
await page.goto("https://www.fzmovies.net/csearch.php", { waitUntil: "domcontentloaded", timeout: 60000 });
|
| 42 |
|
| 43 |
await page.fill("#searchname", movieName);
|
|
|
|
| 46 |
page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 60000 })
|
| 47 |
]);
|
| 48 |
|
| 49 |
+
// **Step 1: Get first movie result link**
|
| 50 |
const movieData = await page.evaluate(() => {
|
| 51 |
const firstResult = document.querySelector(".mainbox a");
|
| 52 |
return firstResult ? { title: firstResult.innerText.trim(), link: firstResult.href } : null;
|
| 53 |
});
|
| 54 |
|
| 55 |
if (!movieData) {
|
| 56 |
+
console.log("β No movie found!");
|
| 57 |
await browser.close();
|
| 58 |
return res.status(404).json({ error: "Movie not found" });
|
| 59 |
}
|
| 60 |
|
| 61 |
+
console.log(`β
Movie Found: ${movieData.title}`);
|
| 62 |
await page.goto(movieData.link, { waitUntil: "domcontentloaded", timeout: 60000 });
|
| 63 |
|
| 64 |
+
// **Step 2: Click "Download" to regenerate session**
|
| 65 |
+
await page.click('a[href*="download1.php?downloadoptionskey="]');
|
| 66 |
+
await page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 60000 });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
|
| 68 |
+
// **Step 3: Extract the last download.php link**
|
|
|
|
|
|
|
| 69 |
const finalDownloadPage = await page.evaluate(() => {
|
|
|
|
| 70 |
const links = document.querySelectorAll('a[href*="download.php?downloadkey="]');
|
| 71 |
+
return links.length ? links[links.length - 1].href : null;
|
| 72 |
});
|
| 73 |
|
| 74 |
if (!finalDownloadPage) {
|
| 75 |
+
console.log("β No final download page found!");
|
| 76 |
await browser.close();
|
| 77 |
return res.status(404).json({ error: "Final download page not found" });
|
| 78 |
}
|
| 79 |
|
| 80 |
await page.goto(finalDownloadPage, { waitUntil: "domcontentloaded", timeout: 60000 });
|
| 81 |
|
| 82 |
+
// **Step 4: Extract redirection link (dlink.php)**
|
| 83 |
let redirectedDownloadLink = await page.evaluate(() => {
|
| 84 |
const links = document.querySelectorAll('a[href*="dlink.php?id="]');
|
| 85 |
return links.length ? links[links.length - 1].href : null;
|
| 86 |
});
|
| 87 |
|
| 88 |
if (!redirectedDownloadLink) {
|
| 89 |
+
console.log("β No redirected download link found!");
|
| 90 |
await browser.close();
|
| 91 |
return res.status(404).json({ error: "Redirected download link not found" });
|
| 92 |
}
|
| 93 |
|
| 94 |
+
console.log(`π Redirecting to fresh session: ${redirectedDownloadLink}`);
|
| 95 |
+
|
| 96 |
+
// **Step 5: Refresh session & retrieve working link**
|
| 97 |
let finalDownloadURL = null;
|
| 98 |
let retryAttempts = 3;
|
| 99 |
|
|
|
|
| 102 |
const downloadPage = await context.newPage();
|
| 103 |
await downloadPage.goto(redirectedDownloadLink, { waitUntil: "networkidle", timeout: 60000 });
|
| 104 |
|
| 105 |
+
// **Check for session expiration message**
|
| 106 |
if (await downloadPage.evaluate(() => document.body.innerText.includes("Your previous session has expired"))) {
|
| 107 |
+
console.warn("β οΈ Session expired! Restarting...");
|
| 108 |
await page.goto(movieData.link, { waitUntil: "domcontentloaded", timeout: 60000 });
|
| 109 |
|
| 110 |
+
await page.click('a[href*="download1.php?downloadoptionskey="]');
|
| 111 |
+
await page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 60000 });
|
| 112 |
+
|
| 113 |
redirectedDownloadLink = await page.evaluate(() => {
|
| 114 |
const links = document.querySelectorAll('a[href*="dlink.php?id="]');
|
| 115 |
return links.length ? links[links.length - 1].href : null;
|
| 116 |
});
|
| 117 |
|
| 118 |
if (!redirectedDownloadLink) {
|
| 119 |
+
throw new Error("β Failed to regenerate session-based download link.");
|
| 120 |
}
|
| 121 |
}
|
| 122 |
|
|
|
|
| 129 |
}
|
| 130 |
|
| 131 |
if (!finalDownloadURL) {
|
| 132 |
+
console.log("β Final download link retrieval failed!");
|
| 133 |
await browser.close();
|
| 134 |
return res.status(500).json({ error: "Failed to retrieve final download link" });
|
| 135 |
}
|
|
|
|
| 151 |
const cleanedDownloadURL = finalDownloadURL.match(/(.*\.(mp4|mkv|avi|mov))/i);
|
| 152 |
const finalLink = cleanedDownloadURL ? cleanedDownloadURL[1] : finalDownloadURL;
|
| 153 |
|
| 154 |
+
console.log(`β
Fresh Movie Title: ${movieTitle}`);
|
| 155 |
console.log(`β
Fresh Download Link: ${finalLink}`);
|
| 156 |
|
| 157 |
await browser.close();
|