Spaces:
Running
Running
Update index.js
Browse files
index.js
CHANGED
@@ -173,6 +173,78 @@ app.get('/download', async (req, res) => {
|
|
173 |
}
|
174 |
});
|
175 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
176 |
// Fungsi untuk ping website
|
177 |
async function pingWebsite() {
|
178 |
const browser = await puppeteer.launch({
|
|
|
173 |
}
|
174 |
});
|
175 |
|
176 |
+
async function nhentai(url) {
|
177 |
+
const instanceID = generateRandomID();
|
178 |
+
const tempDir = `./${instanceID}`;
|
179 |
+
await fss.mkdir(tempDir);
|
180 |
+
const title = url.split('g/').filter(part => part).pop();
|
181 |
+
try {
|
182 |
+
const response = await axios.get(url)
|
183 |
+
const $ = cheerio.load(response.data);
|
184 |
+
const scriptContent = $('script').filter((i, el) => {
|
185 |
+
return $(el).html().includes('window._gallery = JSON.parse');
|
186 |
+
}).html();
|
187 |
+
|
188 |
+
const jsonString = scriptContent.match(/JSON\.parse\("(.*)"\)/)[1];
|
189 |
+
const decodedString = jsonString.replace(/\\u0022/g, '"').replace(/\\u005C/g, '\\');
|
190 |
+
const jsonData = JSON.parse(decodedString);
|
191 |
+
//console.log(jsonData)
|
192 |
+
|
193 |
+
const imgList = [];
|
194 |
+
for (let i = 0; i < jsonData.images.pages.length; i++) {
|
195 |
+
imgList.push({ path: `https://external-content.duckduckgo.com/iu/?u=https://i5.nhentai.net/galleries/${jsonData.media_id}/${i + 1}.jpg&f=1&nofb=1` });
|
196 |
+
}
|
197 |
+
|
198 |
+
const imagePaths = await downloadImageNhs(imgList, tempDir, instanceID);
|
199 |
+
const pdfPath = await createPDF(imagePaths, instanceID, tempDir);
|
200 |
+
|
201 |
+
console.log(`PDF berhasil dibuat: ${pdfPath}`);
|
202 |
+
return { path: pdfPath, result: jsonData };
|
203 |
+
} catch (error) {
|
204 |
+
console.log(error);
|
205 |
+
throw error;
|
206 |
+
} finally {
|
207 |
+
await fss.rmdir(tempDir, { recursive: true });
|
208 |
+
}
|
209 |
+
}
|
210 |
+
|
211 |
+
async function downloadImageNh(image, tempDir, instanceID) {
|
212 |
+
const response = await axios.get(image.path, {
|
213 |
+
responseType: 'arraybuffer',
|
214 |
+
headers: {
|
215 |
+
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0.1; SM-N916S Build/MMB29K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/106.0.5249.126 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/389.0.0.42.111;]',
|
216 |
+
'Referer': 'https://nhentai.net/'
|
217 |
+
}
|
218 |
+
});
|
219 |
+
|
220 |
+
const imagePath = `${tempDir}/image_${instanceID}_${Date.now()}_${Math.floor(Math.random() * 1000)}.jpg`;
|
221 |
+
await writeFileAsync(imagePath, response.data);
|
222 |
+
|
223 |
+
return imagePath;
|
224 |
+
}
|
225 |
+
|
226 |
+
async function downloadImageNhs(imgList, tempDir, instanceID) {
|
227 |
+
const imagePaths = [];
|
228 |
+
for (const img of imgList) {
|
229 |
+
const imagePath = await downloadImageNh(img, tempDir, instanceID);
|
230 |
+
imagePaths.push(imagePath);
|
231 |
+
}
|
232 |
+
return imagePaths;
|
233 |
+
}
|
234 |
+
|
235 |
+
app.get('/nhentai', async (req, res) => {
|
236 |
+
const { url } = req.query;
|
237 |
+
if (!url) {
|
238 |
+
return res.status(400).send('URL is required');
|
239 |
+
}
|
240 |
+
try {
|
241 |
+
const result = await nhentai(url);
|
242 |
+
res.json(result);
|
243 |
+
} catch (error) {
|
244 |
+
res.status(500).send('Error processing request');
|
245 |
+
}
|
246 |
+
});
|
247 |
+
|
248 |
// Fungsi untuk ping website
|
249 |
async function pingWebsite() {
|
250 |
const browser = await puppeteer.launch({
|