selfdebrid/extractors/wetransfer.js

81 lines
2.5 KiB
JavaScript

const axios = require("axios");
const cheerio = require("cheerio");
const lib = require("../lib");
module.exports = {
get: get,
hostnames: ["we.tl", "wetransfer.com"],
tests: []
};
async function get(url, options) {
lib.log(`wetransfer`, `Fetching page...`, [], true, options);
let resp = await axios({
url: url,
headers: lib.defaultHeaders
});
lib.log(`wetransfer`, `Parsing page...`);
let $ = cheerio.load(resp.data);
let canon = $("link[rel='canonical']").attr("href");
if (canon) {
let id = canon.split(`/downloads/`)[1].split(`/`)[0];
let hash = canon.split(`/downloads/`)[1].split(`/`)[1];
lib.log(`wetransfer`, `Got ID:`, [id]);
lib.log(`wetransfer`, `Got hash:`, [hash]);
let headers = lib.defaultHeaders;
headers["Cache-Control"] = `no-cache`;
headers["Content-Type"] = `application/json`;
headers["Origin"] = `https://wetransfer.com`;
headers["Pragma"] = `no-cache`;
headers["Referer"] = `https://wetransfer.com/`;
headers["Sec-Fetch-Dest"] = `empty`;
headers["Sec-Fetch-Mode"] = `no-cors`;
headers["TE"] = `trailers`;
lib.log(`wetransfer`, `Sending "prepare-download" request...`, [], true, options);
resp = await axios({
method: `POST`,
headers: headers,
data: JSON.stringify({security_hash: hash}),
url: `https://wetransfer.com/api/v4/transfers/${id}/prepare-download`
});
if (resp.data?.state == "downloadable") {
let fileName = resp.data.recommended_filename;
lib.log(`wetransfer`, `Sending "download" request...`, [], true, options);
resp = await axios({
method: `POST`,
headers: headers,
data: JSON.stringify({security_hash: hash, intent: "entire_transfer"}),
url: `https://wetransfer.com/api/v4/transfers/${id}/download`
});
if (resp.data.direct_link) {
delete headers["Cache-Control"];
delete headers["Content-Type"];
delete headers["Pragma"];
delete headers["TE"];
headers["Sec-Fetch-Dest"] = "document";
headers["Sec-Fetch-Mode"] = "navigate";
return {
axiosData: {
headers: headers,
url: resp.data.direct_link
},
metadata: {
fileName: fileName
}
};
} else throw new Error(`Direct link not found.`);
} else throw new Error(`File cannot be downloaded at the moment, state is '${resp.data.state}'.`)
} else throw new Error("Could not find canonical metadata on page.");
}