1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
import puppeteer from 'puppeteer';
import cheerio from 'cheerio';
import { writeFile } from 'fs';
import { promisify } from 'util';
var writeFileAsync = promisify(writeFile);
import * as types from './types';
var browser = await puppeteer.launch();
async function getPageHTML(url: string) {
var page = await browser.newPage();
await page.goto(url, { waitUntil: 'domcontentloaded' });
var content = await page.content();
await page.close();
return content
}
var html = await getPageHTML('https://optifine.net/downloads');
var $ = cheerio.load(html);
var versions: types.OptifineVersion[] = [];
var downloads = $('td.content span.downloads .downloadLine');
var downloadCount = downloads.length;
downloads.each(async (i, el) => {
var downloadLinkPre = $(el).find('.colMirror a').attr('href').replace("http", "https");
var downloadPageHTML = await getPageHTML(downloadLinkPre);
var d$ = cheerio.load(downloadPageHTML);
var link = "https://optifine.net/" + d$("#Download .downloadButton a").attr("href");
var version: types.OptifineVersion = {
name: $(el).find(".colFile").text(),
minecraft: downloadLinkPre.match(/1\.\d{1,2}(\.\d{1,2})?/)[0],
forge: $(el).find('.colForge').text().toLowerCase().replace('forge', '').trim(),
date: $(el).find('.colDate').text(),
preview: downloadLinkPre.toLowerCase().includes('preview'),
download: {
link,
token: link.match(/(?<=x=).+/)[0],
filename: downloadLinkPre.match(/OptiFine.+?\.jar/).toString()
}
}
versions.push(version);
if( i == downloadCount - 1 ) {
versions = versions.sort((a, b) => {
var dateFormat = /(\d{2})\.(\d{2})\.(\d{4})/;
var aR = a.date.match(dateFormat);
var bR = b.date.match(dateFormat);
return ( new Date(Number(bR[3]), Number(bR[2]) - 1, Number(bR[1])).getTime() ) -
( new Date(Number(aR[3]), Number(aR[2]) - 1, Number(aR[1])).getTime() );
});
console.log(versions)
var minecraftVersions = {};
var latest: types.OptifineVersion;
var latestPre: types.OptifineVersion;
for(var version of versions) {
if (typeof minecraftVersions[version.minecraft] === "undefined")
minecraftVersions[version.minecraft] = [];
minecraftVersions[version.minecraft].push(version);
if (!latest && version.preview == false) {
latest = version;
await writeFileAsync("./out/latest", JSON.stringify(version));
}
if (!latestPre && version.preview == true) {
latestPre = version;
await writeFileAsync("./out/latestPre", JSON.stringify(version));
}
}
for(var mcVersion in minecraftVersions) {
await writeFileAsync("./out/" + mcVersion, JSON.stringify(minecraftVersions[mcVersion]));
}
var response: types.APIResponse = {
lastUpdate: Date.now(),
all: versions,
versions: minecraftVersions,
latest,
latestPre
}
await writeFileAsync("./out/all", JSON.stringify(response));
process.exit(0);
}
});
|