mirror of https://github.com/mifi/lossless-cut
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
/* eslint-disable no-console */
 | 
						|
import assert from 'node:assert';
 | 
						|
import { execa } from 'execa';
 | 
						|
import ky from 'ky';
 | 
						|
import os from 'node:os';
 | 
						|
import timers from 'node:timers/promises';
 | 
						|
 | 
						|
 | 
						|
const losslessCutExePath = process.argv[2];
 | 
						|
assert(losslessCutExePath);
 | 
						|
const screenshotDevice = process.argv[3];
 | 
						|
const screenshotOutPath = process.argv[4];
 | 
						|
assert(screenshotOutPath);
 | 
						|
 | 
						|
 | 
						|
const port = 8081;
 | 
						|
 | 
						|
const platform = os.platform();
 | 
						|
 | 
						|
const losslessCutArgs = [
 | 
						|
  ...(platform === 'linux' ? ['--no-sandbox'] : []),
 | 
						|
  '--http-api', String(port),
 | 
						|
];
 | 
						|
const ps = execa(losslessCutExePath, losslessCutArgs, { forceKillAfterDelay: 10000 });
 | 
						|
 | 
						|
console.log('Started', losslessCutExePath);
 | 
						|
 | 
						|
// eslint-disable-next-line unicorn/prefer-top-level-await
 | 
						|
ps.catch((err) => console.error(err));
 | 
						|
 | 
						|
const client = ky.extend({ prefixUrl: `http://127.0.0.1:${port}` });
 | 
						|
 | 
						|
async function captureScreenshot(outPath: string) {
 | 
						|
  // https://trac.ffmpeg.org/wiki/Capture/Desktop#Windows
 | 
						|
 | 
						|
  if (platform === 'darwin') {
 | 
						|
    const { stderr } = await execa('ffmpeg', ['-f', 'avfoundation', '-list_devices', 'true', '-i', '', '-hide_banner'], { reject: false, timeout: 30000 });
 | 
						|
    console.log(stderr);
 | 
						|
  }
 | 
						|
 | 
						|
  assert(screenshotDevice);
 | 
						|
 | 
						|
  await execa('ffmpeg', [
 | 
						|
    ...(platform === 'darwin' ? ['-r', '30', '-pix_fmt', 'uyvy422', '-f', 'avfoundation'] : []),
 | 
						|
    ...(platform === 'win32' ? ['-f', 'gdigrab', '-framerate', '30'] : []),
 | 
						|
    ...(platform === 'linux' ? ['-framerate', '25', '-f', 'x11grab'] : []),
 | 
						|
    '-i', screenshotDevice,
 | 
						|
    '-vframes', '1', outPath,
 | 
						|
  ], { timeout: 30000 });
 | 
						|
}
 | 
						|
 | 
						|
try {
 | 
						|
  const resp = await client('', {
 | 
						|
    timeout: 5000,
 | 
						|
    retry: { backoffLimit: 5000, limit: 10 },
 | 
						|
    hooks: { beforeRequest: [() => { console.log('attempt'); }] },
 | 
						|
  }).text();
 | 
						|
  assert(resp.length > 0);
 | 
						|
 | 
						|
  console.log('Waiting for UI to settle');
 | 
						|
 | 
						|
  await timers.setTimeout(5000);
 | 
						|
 | 
						|
  console.log('Capturing screenshot');
 | 
						|
 | 
						|
  await captureScreenshot(screenshotOutPath);
 | 
						|
 | 
						|
  console.log('Sending quit command');
 | 
						|
 | 
						|
  try {
 | 
						|
    await client.post('api/action/quit').text();
 | 
						|
  } catch (err) {
 | 
						|
    console.warn('Quit command failed', err);
 | 
						|
    ps.kill();
 | 
						|
  }
 | 
						|
} finally {
 | 
						|
  // ps.cancel();
 | 
						|
}
 | 
						|
 | 
						|
console.log('Waiting for app to quit');
 | 
						|
 | 
						|
try {
 | 
						|
  const { stdout, stderr } = await ps;
 | 
						|
  console.log('App exited');
 | 
						|
  console.log('stdout:', stdout);
 | 
						|
  console.log('stderr:', stderr);
 | 
						|
} catch (err) {
 | 
						|
  console.warn(err);
 | 
						|
}
 |