@mediaproc/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +72 -0
- package/README.md +947 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +51 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +4 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +170 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +50 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/help.d.ts +3 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +55 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +57 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +30 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/remove.d.ts +4 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +38 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +16 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +16 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-api.d.ts +45 -0
- package/dist/plugin-api.d.ts.map +1 -0
- package/dist/plugin-api.js +2 -0
- package/dist/plugin-api.js.map +1 -0
- package/dist/plugin-manager.d.ts +31 -0
- package/dist/plugin-manager.d.ts.map +1 -0
- package/dist/plugin-manager.js +88 -0
- package/dist/plugin-manager.js.map +1 -0
- package/dist/plugin-registry.d.ts +27 -0
- package/dist/plugin-registry.d.ts.map +1 -0
- package/dist/plugin-registry.js +167 -0
- package/dist/plugin-registry.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,CAAC;SAC9C,MAAM,CAAC,CAAC,IAAY,EAAE,QAA+C,EAAE,EAAE;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,mBAAmB,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Plugin API for mediaproc
|
|
4
|
+
*
|
|
5
|
+
* All plugins must export a `register` function that takes a Commander program
|
|
6
|
+
* and registers their commands.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import type { Command } from 'commander';
|
|
11
|
+
*
|
|
12
|
+
* export const name = '@mediaproc/image';
|
|
13
|
+
* export const version = '1.0.0';
|
|
14
|
+
*
|
|
15
|
+
* export function register(program: Command): void {
|
|
16
|
+
* const imageCmd = program
|
|
17
|
+
* .command('image')
|
|
18
|
+
* .description('Image processing commands');
|
|
19
|
+
*
|
|
20
|
+
* imageCmd
|
|
21
|
+
* .command('resize <input>')
|
|
22
|
+
* .option('-w, --width <width>', 'Width')
|
|
23
|
+
* .option('-h, --height <height>', 'Height')
|
|
24
|
+
* .action(async (input, options) => {
|
|
25
|
+
* // Implementation
|
|
26
|
+
* });
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export interface PluginAPI {
|
|
31
|
+
/**
|
|
32
|
+
* Plugin name (should match package name)
|
|
33
|
+
*/
|
|
34
|
+
name: string;
|
|
35
|
+
/**
|
|
36
|
+
* Plugin version
|
|
37
|
+
*/
|
|
38
|
+
version: string;
|
|
39
|
+
/**
|
|
40
|
+
* Register commands with the CLI
|
|
41
|
+
*/
|
|
42
|
+
register(program: Command): void | Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
export type { Command };
|
|
45
|
+
//# sourceMappingURL=plugin-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-api.d.ts","sourceRoot":"","sources":["../src/plugin-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,YAAY,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-api.js","sourceRoot":"","sources":["../src/plugin-api.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import type { MediaProcPlugin } from './types.js';
|
|
3
|
+
export declare class PluginManager {
|
|
4
|
+
private plugins;
|
|
5
|
+
private readonly pluginPrefix;
|
|
6
|
+
/**
|
|
7
|
+
* Discover and load all installed @mediaproc/* plugins
|
|
8
|
+
*/
|
|
9
|
+
loadPlugins(program: Command): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Discover installed plugins by scanning node_modules
|
|
12
|
+
*/
|
|
13
|
+
private discoverPlugins;
|
|
14
|
+
/**
|
|
15
|
+
* Load a specific plugin and register its commands
|
|
16
|
+
*/
|
|
17
|
+
loadPlugin(pluginName: string, program: Command): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Get list of loaded plugins
|
|
20
|
+
*/
|
|
21
|
+
getLoadedPlugins(): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Check if a plugin is loaded
|
|
24
|
+
*/
|
|
25
|
+
isPluginLoaded(pluginName: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get plugin instance
|
|
28
|
+
*/
|
|
29
|
+
getPlugin(pluginName: string): MediaProcPlugin | undefined;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=plugin-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-manager.d.ts","sourceRoot":"","sources":["../src/plugin-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAE9C;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAalD;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBxE;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI3C;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;CAG3D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
export class PluginManager {
|
|
5
|
+
plugins = new Map();
|
|
6
|
+
pluginPrefix = '@mediaproc/';
|
|
7
|
+
/**
|
|
8
|
+
* Discover and load all installed @mediaproc/* plugins
|
|
9
|
+
*/
|
|
10
|
+
async loadPlugins(program) {
|
|
11
|
+
const installedPlugins = this.discoverPlugins();
|
|
12
|
+
for (const pluginName of installedPlugins) {
|
|
13
|
+
try {
|
|
14
|
+
await this.loadPlugin(pluginName, program);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
18
|
+
console.error(chalk.yellow(`Warning: Failed to load plugin ${pluginName}:`), errorMessage);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Discover installed plugins by scanning node_modules
|
|
24
|
+
*/
|
|
25
|
+
discoverPlugins() {
|
|
26
|
+
const plugins = [];
|
|
27
|
+
try {
|
|
28
|
+
// Try to read package.json to find dependencies
|
|
29
|
+
const packageJsonPath = join(process.cwd(), 'package.json');
|
|
30
|
+
if (existsSync(packageJsonPath)) {
|
|
31
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
32
|
+
const allDeps = {
|
|
33
|
+
...packageJson.dependencies,
|
|
34
|
+
...packageJson.devDependencies,
|
|
35
|
+
};
|
|
36
|
+
// Find all @mediaproc/* packages
|
|
37
|
+
for (const dep of Object.keys(allDeps)) {
|
|
38
|
+
if (dep.startsWith(this.pluginPrefix) && dep !== '@mediaproc/core') {
|
|
39
|
+
plugins.push(dep);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// Silently fail - no plugins installed yet
|
|
46
|
+
}
|
|
47
|
+
return plugins;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load a specific plugin and register its commands
|
|
51
|
+
*/
|
|
52
|
+
async loadPlugin(pluginName, program) {
|
|
53
|
+
try {
|
|
54
|
+
// Dynamic import of the plugin
|
|
55
|
+
const plugin = await import(pluginName);
|
|
56
|
+
if (typeof plugin.register !== 'function') {
|
|
57
|
+
throw new Error(`Plugin ${pluginName} does not export a register() function`);
|
|
58
|
+
}
|
|
59
|
+
// Register plugin commands with the CLI
|
|
60
|
+
await plugin.register(program);
|
|
61
|
+
this.plugins.set(pluginName, plugin);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
66
|
+
throw new Error(`Failed to load plugin ${pluginName}: ${errorMessage}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get list of loaded plugins
|
|
71
|
+
*/
|
|
72
|
+
getLoadedPlugins() {
|
|
73
|
+
return Array.from(this.plugins.keys());
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if a plugin is loaded
|
|
77
|
+
*/
|
|
78
|
+
isPluginLoaded(pluginName) {
|
|
79
|
+
return this.plugins.has(pluginName);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get plugin instance
|
|
83
|
+
*/
|
|
84
|
+
getPlugin(pluginName) {
|
|
85
|
+
return this.plugins.get(pluginName);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=plugin-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../src/plugin-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Registry - Maps short names to full package names
|
|
3
|
+
* This allows users to type: mediaproc add image
|
|
4
|
+
* Instead of: mediaproc add @mediaproc/image
|
|
5
|
+
*/
|
|
6
|
+
export interface PluginRegistryEntry {
|
|
7
|
+
name: string;
|
|
8
|
+
package: string;
|
|
9
|
+
description: string;
|
|
10
|
+
category: 'core' | 'advanced' | 'future-proof';
|
|
11
|
+
dependencies?: string[];
|
|
12
|
+
systemRequirements?: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare const PLUGIN_REGISTRY: Record<string, PluginRegistryEntry>;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve short name to full package name
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolvePluginPackage(shortName: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get all available plugins grouped by category
|
|
21
|
+
*/
|
|
22
|
+
export declare function getPluginsByCategory(): Record<string, PluginRegistryEntry[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a plugin exists in registry
|
|
25
|
+
*/
|
|
26
|
+
export declare function isValidPlugin(name: string): boolean;
|
|
27
|
+
//# sourceMappingURL=plugin-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-registry.d.ts","sourceRoot":"","sources":["../src/plugin-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,cAAc,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAyI/D,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAe9D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAiB5E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Registry - Maps short names to full package names
|
|
3
|
+
* This allows users to type: mediaproc add image
|
|
4
|
+
* Instead of: mediaproc add @mediaproc/image
|
|
5
|
+
*/
|
|
6
|
+
export const PLUGIN_REGISTRY = {
|
|
7
|
+
// Core Media Plugins
|
|
8
|
+
'image': {
|
|
9
|
+
name: 'image',
|
|
10
|
+
package: '@mediaproc/image',
|
|
11
|
+
description: 'Image processing (resize, convert, filters, effects)',
|
|
12
|
+
category: 'core',
|
|
13
|
+
systemRequirements: ['Sharp (auto-installed)'],
|
|
14
|
+
},
|
|
15
|
+
'video': {
|
|
16
|
+
name: 'video',
|
|
17
|
+
package: '@mediaproc/video',
|
|
18
|
+
description: 'Video processing (transcode, compress, extract)',
|
|
19
|
+
category: 'core',
|
|
20
|
+
systemRequirements: ['FFmpeg'],
|
|
21
|
+
},
|
|
22
|
+
'audio': {
|
|
23
|
+
name: 'audio',
|
|
24
|
+
package: '@mediaproc/audio',
|
|
25
|
+
description: 'Audio processing (convert, normalize, extract)',
|
|
26
|
+
category: 'core',
|
|
27
|
+
systemRequirements: ['FFmpeg'],
|
|
28
|
+
},
|
|
29
|
+
// Document Media (Very Important)
|
|
30
|
+
'document': {
|
|
31
|
+
name: 'document',
|
|
32
|
+
package: '@mediaproc/document',
|
|
33
|
+
description: 'PDF/DOCX/PPTX/EPUB processing, OCR, compression',
|
|
34
|
+
category: 'core',
|
|
35
|
+
systemRequirements: ['Ghostscript', 'Tesseract OCR', 'Poppler'],
|
|
36
|
+
},
|
|
37
|
+
'doc': {
|
|
38
|
+
name: 'doc',
|
|
39
|
+
package: '@mediaproc/document',
|
|
40
|
+
description: 'Alias for document plugin',
|
|
41
|
+
category: 'core',
|
|
42
|
+
},
|
|
43
|
+
// Animation & Motion Media
|
|
44
|
+
'animation': {
|
|
45
|
+
name: 'animation',
|
|
46
|
+
package: '@mediaproc/animation',
|
|
47
|
+
description: 'GIF/APNG/WebP animations, Lottie, SVG animations',
|
|
48
|
+
category: 'core',
|
|
49
|
+
systemRequirements: ['FFmpeg'],
|
|
50
|
+
},
|
|
51
|
+
'anim': {
|
|
52
|
+
name: 'anim',
|
|
53
|
+
package: '@mediaproc/animation',
|
|
54
|
+
description: 'Alias for animation plugin',
|
|
55
|
+
category: 'core',
|
|
56
|
+
},
|
|
57
|
+
// 3D & Spatial Media (Advanced)
|
|
58
|
+
'3d': {
|
|
59
|
+
name: '3d',
|
|
60
|
+
package: '@mediaproc/3d',
|
|
61
|
+
description: '3D models (GLTF, GLB, OBJ), textures, HDRI, AR/VR assets',
|
|
62
|
+
category: 'advanced',
|
|
63
|
+
systemRequirements: ['gltf-transform'],
|
|
64
|
+
},
|
|
65
|
+
'spatial': {
|
|
66
|
+
name: 'spatial',
|
|
67
|
+
package: '@mediaproc/3d',
|
|
68
|
+
description: 'Alias for 3d plugin',
|
|
69
|
+
category: 'advanced',
|
|
70
|
+
},
|
|
71
|
+
// Metadata-only Processing (Underrated but Powerful)
|
|
72
|
+
'metadata': {
|
|
73
|
+
name: 'metadata',
|
|
74
|
+
package: '@mediaproc/metadata',
|
|
75
|
+
description: 'EXIF cleanup, GPS removal, codec inspection, compliance checks',
|
|
76
|
+
category: 'core',
|
|
77
|
+
systemRequirements: ['ExifTool'],
|
|
78
|
+
},
|
|
79
|
+
'meta': {
|
|
80
|
+
name: 'meta',
|
|
81
|
+
package: '@mediaproc/metadata',
|
|
82
|
+
description: 'Alias for metadata plugin',
|
|
83
|
+
category: 'core',
|
|
84
|
+
},
|
|
85
|
+
'inspect': {
|
|
86
|
+
name: 'inspect',
|
|
87
|
+
package: '@mediaproc/metadata',
|
|
88
|
+
description: 'Alias for metadata plugin',
|
|
89
|
+
category: 'core',
|
|
90
|
+
},
|
|
91
|
+
// Streaming & Packaging Media (Advanced, Industry-Relevant)
|
|
92
|
+
'stream': {
|
|
93
|
+
name: 'stream',
|
|
94
|
+
package: '@mediaproc/stream',
|
|
95
|
+
description: 'HLS/DASH packaging, chunking, encryption, manifests',
|
|
96
|
+
category: 'advanced',
|
|
97
|
+
systemRequirements: ['FFmpeg', 'Shaka Packager (optional)'],
|
|
98
|
+
},
|
|
99
|
+
'streaming': {
|
|
100
|
+
name: 'streaming',
|
|
101
|
+
package: '@mediaproc/stream',
|
|
102
|
+
description: 'Alias for stream plugin',
|
|
103
|
+
category: 'advanced',
|
|
104
|
+
},
|
|
105
|
+
// AI-Assisted Media (Future-Proof)
|
|
106
|
+
'ai': {
|
|
107
|
+
name: 'ai',
|
|
108
|
+
package: '@mediaproc/ai',
|
|
109
|
+
description: 'Auto-captioning, scene detection, face blur, background removal, speech-to-text',
|
|
110
|
+
category: 'future-proof',
|
|
111
|
+
systemRequirements: ['TensorFlow/ONNX Runtime (optional)', 'Whisper (optional)'],
|
|
112
|
+
},
|
|
113
|
+
'ml': {
|
|
114
|
+
name: 'ml',
|
|
115
|
+
package: '@mediaproc/ai',
|
|
116
|
+
description: 'Alias for ai plugin',
|
|
117
|
+
category: 'future-proof',
|
|
118
|
+
},
|
|
119
|
+
// Media Pipelines (Highest Level)
|
|
120
|
+
'pipeline': {
|
|
121
|
+
name: 'pipeline',
|
|
122
|
+
package: '@mediaproc/pipeline',
|
|
123
|
+
description: 'Declarative YAML-based media processing workflows',
|
|
124
|
+
category: 'advanced',
|
|
125
|
+
dependencies: ['Can use any installed plugins'],
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Resolve short name to full package name
|
|
130
|
+
*/
|
|
131
|
+
export function resolvePluginPackage(shortName) {
|
|
132
|
+
// If already full package name, return as-is
|
|
133
|
+
if (shortName.startsWith('@mediaproc/')) {
|
|
134
|
+
return shortName;
|
|
135
|
+
}
|
|
136
|
+
// Look up in registry
|
|
137
|
+
const entry = PLUGIN_REGISTRY[shortName.toLowerCase()];
|
|
138
|
+
if (!entry) {
|
|
139
|
+
throw new Error(`Unknown plugin: ${shortName}\nRun 'mediaproc plugins' to see available plugins`);
|
|
140
|
+
}
|
|
141
|
+
return entry.package;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get all available plugins grouped by category
|
|
145
|
+
*/
|
|
146
|
+
export function getPluginsByCategory() {
|
|
147
|
+
const grouped = {
|
|
148
|
+
core: [],
|
|
149
|
+
advanced: [],
|
|
150
|
+
'future-proof': [],
|
|
151
|
+
};
|
|
152
|
+
const seen = new Set();
|
|
153
|
+
for (const entry of Object.values(PLUGIN_REGISTRY)) {
|
|
154
|
+
if (!seen.has(entry.package)) {
|
|
155
|
+
grouped[entry.category].push(entry);
|
|
156
|
+
seen.add(entry.package);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return grouped;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Check if a plugin exists in registry
|
|
163
|
+
*/
|
|
164
|
+
export function isValidPlugin(name) {
|
|
165
|
+
return name.startsWith('@mediaproc/') || name.toLowerCase() in PLUGIN_REGISTRY;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=plugin-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-registry.js","sourceRoot":"","sources":["../src/plugin-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export interface MediaProcPlugin {
|
|
3
|
+
name: string;
|
|
4
|
+
version: string;
|
|
5
|
+
register: (program: Command) => void | Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface PluginMetadata {
|
|
8
|
+
name: string;
|
|
9
|
+
version: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
author?: string;
|
|
12
|
+
apiVersion: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CommandOptions {
|
|
15
|
+
input?: string;
|
|
16
|
+
output?: string;
|
|
17
|
+
quality?: number;
|
|
18
|
+
format?: string;
|
|
19
|
+
verbose?: boolean;
|
|
20
|
+
dryRun?: boolean;
|
|
21
|
+
workers?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ProcessingResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
input: string;
|
|
26
|
+
output?: string;
|
|
27
|
+
error?: string;
|
|
28
|
+
duration?: number;
|
|
29
|
+
inputSize?: number;
|
|
30
|
+
outputSize?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface PluginConfig {
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
options?: Record<string, any>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mediaproc/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Universal media processing CLI with plugin architecture",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"mediaproc": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"build:all": "pnpm build && pnpm --filter '@mediaproc/*' build",
|
|
19
|
+
"clean": "rm -rf dist",
|
|
20
|
+
"clean:all": "pnpm clean && pnpm --filter '@mediaproc/*' clean",
|
|
21
|
+
"dev": "tsc --watch",
|
|
22
|
+
"test": "echo \"Tests not implemented yet\"",
|
|
23
|
+
"prepublishOnly": "pnpm clean && pnpm build",
|
|
24
|
+
"prepare": "pnpm build"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"media",
|
|
28
|
+
"processor",
|
|
29
|
+
"cli",
|
|
30
|
+
"image",
|
|
31
|
+
"video",
|
|
32
|
+
"audio",
|
|
33
|
+
"document",
|
|
34
|
+
"ffmpeg",
|
|
35
|
+
"sharp",
|
|
36
|
+
"plugin"
|
|
37
|
+
],
|
|
38
|
+
"author": {
|
|
39
|
+
"name": "0xshariq",
|
|
40
|
+
"url": "https://github.com/0xshariq"
|
|
41
|
+
},
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/0xshariq/mediaproc-cli.git"
|
|
46
|
+
},
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/0xshariq/mediaproc-cli/issues"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/0xshariq/mediaproc-cli#readme",
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18.0.0"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@gltf-transform/cli": "^4.2.1",
|
|
56
|
+
"@gltf-transform/core": "^4.2.1",
|
|
57
|
+
"@lottiefiles/dotlottie-web": "^0.60.0",
|
|
58
|
+
"chalk": "^5.3.0",
|
|
59
|
+
"commander": "^11.1.0",
|
|
60
|
+
"execa": "^8.0.1",
|
|
61
|
+
"ghostscript4js": "^3.2.3",
|
|
62
|
+
"node-poppler": "^9.0.1",
|
|
63
|
+
"ora": "^7.0.1",
|
|
64
|
+
"shaka-player": "^4.16.12",
|
|
65
|
+
"sharp": "^0.33.5",
|
|
66
|
+
"tesseract.js": "^7.0.0"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@types/node": "^20.10.4",
|
|
70
|
+
"typescript": "^5.3.3"
|
|
71
|
+
}
|
|
72
|
+
}
|