|
|
|
@ -1,5 +1,6 @@ |
|
|
|
|
const fs = require("fs"); |
|
|
|
|
const jsdom = require("jsdom"); |
|
|
|
|
const fetch = require("node-fetch"); |
|
|
|
|
const { JSDOM } = jsdom; |
|
|
|
|
const { window } = new JSDOM(""); |
|
|
|
|
global.window = window; |
|
|
|
@ -24,17 +25,25 @@ const file = fs |
|
|
|
|
const xml = libxmljs.parseHtml(file); |
|
|
|
|
const talks = xml.find("//mediaitem"); |
|
|
|
|
|
|
|
|
|
talks.forEach((talk, idx) => { |
|
|
|
|
const { filename, markdown } = xml2md(talk, idx); |
|
|
|
|
(async () => { |
|
|
|
|
const all = await Promise.all( |
|
|
|
|
talks.map(async (talk, idx) => { |
|
|
|
|
const { filename, markdown } = await xml2md(talk, idx); |
|
|
|
|
|
|
|
|
|
fs.promises.writeFile(`./markdown-talks/${filename}.md`, markdown); |
|
|
|
|
}); |
|
|
|
|
await fs.promises.writeFile(`./markdown-talks/${filename}.md`, markdown); |
|
|
|
|
}), |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
console.log(all.length); |
|
|
|
|
|
|
|
|
|
process.exit(0); |
|
|
|
|
})(); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* |
|
|
|
|
* @param {libxmljs.Element} talk |
|
|
|
|
*/ |
|
|
|
|
function xml2md(talk, index) { |
|
|
|
|
async function xml2md(talk, index) { |
|
|
|
|
const title = talk.attr("title").value(); |
|
|
|
|
|
|
|
|
|
const abstract = talk |
|
|
|
@ -51,7 +60,13 @@ function xml2md(talk, index) { |
|
|
|
|
.map((s) => s.trim()); |
|
|
|
|
|
|
|
|
|
const thumbSmall = MIRROR_URL + talk.get("thumbnail").attr("file").value(); |
|
|
|
|
const thumbLarge = thumbSmall.replace("-thumb-small", "-thumb-large"); |
|
|
|
|
|
|
|
|
|
/** @type{string | undefined} */ |
|
|
|
|
let thumbLarge = thumbSmall.replace("-thumb-small", "-thumb-large"); |
|
|
|
|
|
|
|
|
|
if (!(await resourceExists(thumbLarge))) { |
|
|
|
|
thumbLarge = undefined; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const links = talk |
|
|
|
|
.find("mediafile") |
|
|
|
@ -83,8 +98,7 @@ title: '${title.replaceAll("'", "''")}' |
|
|
|
|
presentors: |
|
|
|
|
- '${presentors.join("\n - ").replaceAll("'", "''")}' |
|
|
|
|
thumbnails: |
|
|
|
|
small: '${thumbSmall}' |
|
|
|
|
large: '${thumbLarge}' |
|
|
|
|
small: '${thumbSmall}'${thumbLarge ? `\n large: ${thumbLarge}` : ""} |
|
|
|
|
links: |
|
|
|
|
${links.join("\n")} |
|
|
|
|
--- |
|
|
|
@ -105,3 +119,27 @@ ${converter.makeMarkdown(abstract ?? "")} |
|
|
|
|
markdown, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* |
|
|
|
|
* @param {string} url |
|
|
|
|
*/ |
|
|
|
|
async function resourceExists(url) { |
|
|
|
|
|
|
|
|
|
const time = Math.trunc(Math.random() * 10000); |
|
|
|
|
await sleep(time); |
|
|
|
|
|
|
|
|
|
// const timer = setTimeout(() => console.log("not done", time, url), time + 3000);
|
|
|
|
|
const response = await fetch(url); |
|
|
|
|
|
|
|
|
|
clearTimeout(timer) |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
response.status.toString().startsWith("2") || |
|
|
|
|
response.status.toString().startsWith("3") |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function sleep(time) { |
|
|
|
|
return new Promise((resolve) => setTimeout(resolve, time)); |
|
|
|
|
} |
|
|
|
|