2020-10-08 21:09:05 +00:00
|
|
|
"use strict";
|
2020-10-02 12:01:51 +00:00
|
|
|
|
2020-10-10 14:27:01 +00:00
|
|
|
// Core modules
|
|
|
|
const fs = require("fs");
|
|
|
|
|
|
|
|
// Public modules from npm
|
2020-10-10 14:39:53 +00:00
|
|
|
//const { File } = require('megajs');
|
2020-10-10 14:27:01 +00:00
|
|
|
|
|
|
|
// Modules from file
|
|
|
|
const { prepareBrowser, preparePage } = require("../puppeteer-helper.js");
|
|
|
|
const shared = require("../shared.js");
|
|
|
|
|
2020-09-29 15:11:43 +00:00
|
|
|
class GameDownload {
|
2020-10-08 21:09:05 +00:00
|
|
|
constructor() {
|
|
|
|
/**
|
|
|
|
* @public
|
|
|
|
* Platform that hosts game files
|
|
|
|
* @type String
|
|
|
|
*/
|
|
|
|
this.hosting = "";
|
|
|
|
/**
|
|
|
|
* @public
|
|
|
|
* Link to game files
|
|
|
|
* @type String
|
|
|
|
*/
|
|
|
|
this.link = null;
|
2020-09-29 15:11:43 +00:00
|
|
|
/**
|
|
|
|
* @public
|
2020-10-08 21:09:05 +00:00
|
|
|
* Operating systems supported by the game version indicated in this class.
|
|
|
|
* Can be *WINDOWS/LINUX/MACOS*
|
|
|
|
* @type String[]
|
2020-09-29 15:11:43 +00:00
|
|
|
*/
|
2020-10-08 21:09:05 +00:00
|
|
|
this.supportedOS = [];
|
|
|
|
}
|
2020-09-29 15:11:43 +00:00
|
|
|
|
2020-10-08 21:09:05 +00:00
|
|
|
/**
|
|
|
|
* @public
|
2020-10-10 14:27:01 +00:00
|
|
|
* Download the game data in the indicated path.
|
|
|
|
* Supported hosting platforms: MEGA, NOPY
|
|
|
|
* @param {String} path Save path
|
|
|
|
* @return {Promise<Boolean>} Result of the operation
|
2020-10-08 21:09:05 +00:00
|
|
|
*/
|
2020-10-10 14:27:01 +00:00
|
|
|
async download(path) {
|
|
|
|
if (this.link.includes("mega.nz")) return await downloadMEGA(this.link, path);
|
|
|
|
else if (this.link.includes("nopy.to")) return await downloadNOPY(this.link, path);
|
|
|
|
}
|
2020-09-29 15:11:43 +00:00
|
|
|
}
|
2020-10-02 12:01:51 +00:00
|
|
|
module.exports = GameDownload;
|
2020-09-29 15:11:43 +00:00
|
|
|
|
2020-10-10 14:27:01 +00:00
|
|
|
async function downloadMEGA(url, savepath) {
|
|
|
|
// The URL is masked
|
|
|
|
let browser = await prepareBrowser();
|
|
|
|
let page = await preparePage(browser);
|
|
|
|
await page.setCookie(...shared.cookies); // Set cookies to avoid login
|
|
|
|
await page.goto(url);
|
|
|
|
await page.waitForSelector("a.host_link");
|
2020-09-29 15:11:43 +00:00
|
|
|
|
2020-10-10 14:27:01 +00:00
|
|
|
// Obtain the link for the unmasked page and click it
|
|
|
|
let link = await page.$("a.host_link");
|
|
|
|
await link.click();
|
|
|
|
await page.goto(url, {
|
|
|
|
waitUntil: shared.WAIT_STATEMENT,
|
|
|
|
}); // Go to the game page and wait until it loads
|
|
|
|
|
|
|
|
// Obtain the URL after the redirect
|
|
|
|
let downloadURL = page.url();
|
|
|
|
|
|
|
|
// Close browser and page
|
|
|
|
await page.close();
|
|
|
|
await browser.close();
|
|
|
|
|
|
|
|
let stream = fs.createWriteStream(savepath);
|
|
|
|
let file = File.fromURL(downloadURL);
|
|
|
|
file.download().pipe(stream);
|
|
|
|
return fs.existsSync(savepath);
|
|
|
|
}
|
|
|
|
|
|
|
|
async function downloadNOPY(url, savepath) {
|
|
|
|
// Prepare browser
|
|
|
|
let browser = await prepareBrowser();
|
|
|
|
let page = await preparePage(browser);
|
|
|
|
await page.goto(url);
|
|
|
|
await page.waitForSelector("#download");
|
|
|
|
|
|
|
|
// Set the save path
|
|
|
|
await page._client.send('Page.setDownloadBehavior', {
|
|
|
|
behavior: 'allow',
|
|
|
|
downloadPath: path.basename(path.dirname(savepath)) // Is a directory
|
|
|
|
});
|
|
|
|
|
|
|
|
// Obtain the download button and click it
|
|
|
|
let downloadButton = await page.$("#download");
|
|
|
|
await downloadButton.click();
|
|
|
|
|
|
|
|
// Await for all the connections to close
|
|
|
|
await page.waitForNavigation({
|
|
|
|
waitUntil: 'networkidle0',
|
|
|
|
timeout: 0 // Disable timeout
|
|
|
|
});
|
|
|
|
|
|
|
|
// Close browser and page
|
|
|
|
await page.close();
|
|
|
|
await browser.close();
|
|
|
|
|
|
|
|
return fs.existsSync(savepath);
|
|
|
|
}
|