// @ts-check import { WebSocketServer } from 'ws'; import { readFileSync, mkdirSync, writeFileSync } from "fs"; import { join as joinPath } from 'path' import matter from 'gray-matter'; const PORT = 8080 const wss = new WebSocketServer({ port: PORT }); console.log(`WebSocket server running on ws://localhost:${PORT}`); wss.on('connection', (ws) => { console.log('New client connected'); let filename = '' const ROOT_DIR = 'docs'; ws.on('message', (message, isBinary) => { if (message instanceof Buffer && isBinary) { writeFileSync(joinPath(ROOT_DIR, filename), message); return; } const { name, ...payload } = JSON.parse(message.toString('utf-8')); switch (name) { case 'download_q': { const { q, duration } = payload; console.log(`Start ${q}`) const q_stem = q.replace(/\.[a-z0-9]+$/, "").replace(/\[.+?\]/g, '').trim(); try { mkdirSync(joinPath(ROOT_DIR, q_stem)); } catch (e) {} let isChanged = false; const ts = []; let { data, content } = matter(readFileSync(joinPath(ROOT_DIR, `${q_stem}.md`), 'utf-8')); data.video = '/' + q; const interval = data.interval; if (typeof interval === 'number') { for (let t = 0; t < duration; t += interval) { const min = Math.floor(t / 60) const sec = Math.floor(t - min * 60) content += `\n${min}:${sec.toString().padStart(2, '0')}\n`; } } const re = /^(?\d{1,2}):(?\d{2})\s*$/; const lines = content.split('\n') content = '' for (const line of lines) { const m = re.exec(line); if (m?.groups) { const { min, sec } = m.groups; const t = `${min}_${sec}`; ts.push(t); content += `\n![${line}](./${q_stem}/${t}.png)\n\n`; isChanged = true; } else { content += `${line}\n`; } } if (isChanged){ writeFileSync(joinPath(ROOT_DIR, `${q_stem}.md`), matter.stringify(content, data)); ws.send(JSON.stringify({ name: "seek_q_ts", q, ts })); } } break; case 'timed_q' : { const { q, t } = payload; const q_stem = q.replace(/\.[a-z0-9]+$/, "").replace(/\[.+?\]/g, '').trim(); filename = t ? joinPath(q_stem, `${t}.png`) : ''; } break; case 'done' : { const { q } = payload console.log(`Done ${q}`) } break; } }); ws.on('close', () => { console.log('Client disconnected'); }); });