Recently Written · git

subread-extension

Show your own .srt over a YouTube video, in time with it. Chrome and Firefox.

git clone https://github.com/equwal/subread-extension

Log | Files | Refs


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 };