search_vid
Version:
CLI tool for searching subtitles and playing videos at specific timestamps
93 lines (89 loc) • 2.71 kB
JavaScript
#!/usr/bin/env node
import React from 'react';
import { render } from 'ink';
import meow from 'meow';
import App from './app.js';
const cli = meow(`
Usage
$ search_vid <query>
Options
--directory, -d Directory containing video and subtitle files (default: current directory)
--subtitle-ext, -s Subtitle file extension (default: srt)
--video-ext, -v Video file extension (default: mp4)
--no-recursive Disable recursive search
--exact-match, -e Use exact matching instead of fuzzy search
--verbose Show verbose output
--page-size, -p Number of results per page (default: 10)
--tree-view, -t Display results in tree view (default: false)
--help, -h Show this help message
Interactive Controls
↑/↓ Navigate through results
←/→ Change pages
Enter Play selected video
/ Start a new search (use ! prefix for exact match)
Esc Exit search mode
+/- Adjust page size by 5
q Quit the application
Examples
$ search_vid "hello world"
$ search_vid "hello world" --directory ./videos --exact-match
$ search_vid "hello world" --no-recursive --subtitle-ext srt --page-size 5
$ search_vid "hello world" --tree-view
$ search_vid --help
`, {
importMeta: import.meta,
flags: {
directory: {
type: 'string',
alias: 'd',
default: process.cwd(),
},
subtitleExt: {
type: 'string',
alias: 's',
default: 'srt',
},
videoExt: {
type: 'string',
alias: 'v',
default: 'mp4',
},
recursive: {
type: 'boolean',
default: true,
},
exactMatch: {
type: 'boolean',
alias: 'e',
default: true,
},
verbose: {
type: 'boolean',
default: false,
},
pageSize: {
type: 'number',
alias: 'p',
default: 10,
},
treeView: {
type: 'boolean',
alias: 't',
default: false,
},
},
});
if (!cli.input[0]) {
console.error('Please provide a search query');
process.exit(1);
}
render(React.createElement(App, { query: cli.input[0], options: {
directory: cli.flags.directory,
subtitleExt: cli.flags.subtitleExt,
videoExt: cli.flags.videoExt,
recursive: cli.flags.recursive,
exactMatch: cli.flags.exactMatch,
verbose: cli.flags.verbose,
pageSize: cli.flags.pageSize,
treeView: cli.flags.treeView,
} }));