tools/shots/shot.mjs (2087 bytes)
1 // Load an .srt into SubRead on a video, seek, and save a 1280x800 screenshot. 2 // args: url srtPath seconds outPng panel(0|1) 3 import { writeFileSync } from 'node:fs'; 4 export default async (p, [url, srt, seconds, out, panel = '0']) => { 5 await p.send('Page.enable'); 6 await p.send('DOM.enable'); 7 await p.send('Emulation.setDeviceMetricsOverride', { width: 1280, height: 800, deviceScaleFactor: 1, mobile: false }); 8 await p.send('Page.navigate', { url }); 9 await p.sleep(3000); 10 await p.evaluate(`(async () => { 11 for (let i = 0; i < 40 && !(document.querySelector('video') && document.querySelector('.subread-button')); i++) await new Promise(r => setTimeout(r, 500)); 12 const v = document.querySelector('video'); v.pause(); 13 const cc = document.querySelector('.ytp-subtitles-button'); 14 if (cc?.getAttribute('aria-pressed') === 'true') cc.click(); 15 if (!document.querySelector('ytd-watch-flexy[theater]')) document.querySelector('.ytp-size-button')?.click(); 16 await new Promise(r => setTimeout(r, 1500)); 17 document.querySelector('.subread-button').click(); 18 })()`); 19 const { result } = await p.send('Runtime.evaluate', { expression: `document.querySelector('.subread-file')` }); 20 await p.send('DOM.setFileInputFiles', { files: [srt], objectId: result.objectId }); 21 await p.sleep(1000); 22 const status = await p.evaluate(`(async () => { 23 const v = document.querySelector('video'); 24 v.currentTime = ${Number(seconds)}; 25 await new Promise(r => v.addEventListener('seeked', r, { once: true })); 26 v.pause(); 27 ${panel === '1' ? '' : "document.querySelector('.subread-button').click();"} 28 window.scrollTo(0, 0); 29 document.querySelector('#movie_player')?.dispatchEvent(new MouseEvent('mouseleave')); 30 await new Promise(r => setTimeout(r, 2500)); 31 return [document.querySelector('.subread-status')?.textContent, document.querySelector('.subread-line')?.textContent].join(' | '); 32 })()`); 33 const shot = await p.send('Page.captureScreenshot', { format: 'png' }); 34 writeFileSync(out, Buffer.from(shot.data, 'base64')); 35 return status; 36 };