impress-2020/src/server/neopets-assets.js
Matchu bd9017796e Use HTTPS for images.neopets.com and pets.neopets.com
Tbh I didn't even really validate these changes, or that the codepaths right now aren't working, they just seem like clear drop-in upgrades now that HTTPS works and HTTP requests are redirected. Simplify!
2022-08-03 14:36:07 -07:00

59 lines
1.8 KiB
JavaScript

import fetch from "node-fetch";
async function loadAssetManifest(swfUrl) {
const possibleManifestUrls = convertSwfUrlToPossibleManifestUrls(swfUrl);
const responses = await Promise.all(
possibleManifestUrls.map((url) => fetch(url))
);
// Print errors for any responses with unexpected statuses. We'll do this
// even if other requests succeeded, or failed with an expected 404.
for (const res of responses) {
if (!res.ok && res.status !== 404) {
console.error(
`for asset manifest, images.neopets.com returned: ` +
`${res.status} ${res.statusText}. (${res.url})`
);
}
}
const successfulResponse = responses.find((res) => res.ok);
if (!successfulResponse) {
return null;
}
const json = await successfulResponse.json();
return {
assets: json["cpmanifest"]["assets"].map((asset) => ({
format: asset["format"],
assetData: asset["asset_data"].map((assetDatum) => ({
path: assetDatum["url"],
})),
})),
};
}
const SWF_URL_PATTERN = /^https?:\/\/images\.neopets\.com\/cp\/(bio|items)\/swf\/(.+?)_([a-z0-9]+)\.swf$/;
function convertSwfUrlToPossibleManifestUrls(swfUrl) {
const match = new URL(swfUrl, "https://images.neopets.com")
.toString()
.match(SWF_URL_PATTERN);
if (!match) {
throw new Error(`unexpected SWF URL format: ${JSON.stringify(swfUrl)}`);
}
const type = match[1];
const folders = match[2];
const hash = match[3];
// TODO: There are a few potential manifest URLs in play! Long-term, we
// should get this from modeling data. But these are some good guesses!
return [
`https://images.neopets.com/cp/${type}/data/${folders}/manifest.json`,
`https://images.neopets.com/cp/${type}/data/${folders}_${hash}/manifest.json`,
];
}
module.exports = { loadAssetManifest };