node-av 3.0.0 → 3.0.3

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.
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Parsed filter graph segment.
3
+ *
4
+ * Represents a parsed filtergraph segment that separates parsing from initialization.
5
+ * This allows filter contexts to be configured after creation but before initialization.
6
+ * The workflow involves parsing the filter description, creating filter instances,
7
+ * applying options, and finally initializing and linking the filters.
8
+ *
9
+ * Direct mapping to FFmpeg's AVFilterGraphSegment.
10
+ *
11
+ * @see [AVFilterGraphSegment](https://ffmpeg.org/doxygen/trunk/structAVFilterGraphSegment.html) - FFmpeg Doxygen
12
+ */
13
+ export class FilterGraphSegment {
14
+ native;
15
+ /**
16
+ * @param native - The native filter graph segment instance
17
+ *
18
+ * @internal
19
+ */
20
+ constructor(native) {
21
+ this.native = native;
22
+ }
23
+ /**
24
+ * Create filter instances in the segment.
25
+ *
26
+ * Allocates all filter contexts defined in the segment but does not initialize them.
27
+ * This separation allows configuration of filter properties before the filters are initialized.
28
+ *
29
+ * Direct mapping to avfilter_graph_segment_create_filters().
30
+ *
31
+ * @param flags - Creation flags (default: 0)
32
+ *
33
+ * @returns 0 on success, negative AVERROR on failure:
34
+ * - AVERROR_EINVAL: Invalid segment
35
+ * - AVERROR_ENOMEM: Memory allocation failure
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * import { FFmpegError } from 'node-av';
40
+ *
41
+ * const segment = graph.segmentParse('scale=640:480');
42
+ * if (segment) {
43
+ * const ret = segment.createFilters();
44
+ * FFmpegError.throwIfError(ret, 'createFilters');
45
+ * }
46
+ * ```
47
+ *
48
+ * @see {@link applyOpts} To apply options after creation
49
+ * @see {@link apply} To initialize and link filters
50
+ */
51
+ createFilters(flags = 0) {
52
+ return this.native.createFilters(flags);
53
+ }
54
+ /**
55
+ * Apply options to filter instances.
56
+ *
57
+ * Applies the parsed filter options to their respective filter contexts.
58
+ * This method should be called after creating filters and before initializing them.
59
+ *
60
+ * Direct mapping to avfilter_graph_segment_apply_opts().
61
+ *
62
+ * @param flags - Option flags (default: 0)
63
+ *
64
+ * @returns 0 on success, negative AVERROR on failure:
65
+ * - AVERROR_EINVAL: Invalid options
66
+ * - AVERROR_OPTION_NOT_FOUND: Unknown option
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * import { FFmpegError } from 'node-av';
71
+ *
72
+ * const segment = graph.segmentParse('scale=640:480');
73
+ * if (segment) {
74
+ * FFmpegError.throwIfError(segment.createFilters(), 'createFilters');
75
+ * FFmpegError.throwIfError(segment.applyOpts(), 'applyOpts');
76
+ * }
77
+ * ```
78
+ *
79
+ * @see {@link createFilters} To create filter instances first
80
+ * @see {@link apply} To initialize and link after applying options
81
+ */
82
+ applyOpts(flags = 0) {
83
+ return this.native.applyOpts(flags);
84
+ }
85
+ /**
86
+ * Initialize and link all filters in the segment.
87
+ *
88
+ * Initializes all filter contexts in the segment and creates links between them
89
+ * according to the parsed filter graph description. This is the final step that
90
+ * completes the filter setup. All necessary filter configuration should be done
91
+ * before calling this method.
92
+ *
93
+ * Direct mapping to avfilter_graph_segment_apply().
94
+ *
95
+ * @param inputs - Input filter pads
96
+ *
97
+ * @param outputs - Output filter pads
98
+ *
99
+ * @param flags - Apply flags (default: 0)
100
+ *
101
+ * @returns 0 on success, negative AVERROR on failure:
102
+ * - AVERROR_EINVAL: Invalid segment or pads
103
+ * - AVERROR_ENOMEM: Memory allocation failure
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * import { FFmpegError, FilterInOut } from 'node-av';
108
+ *
109
+ * const segment = graph.segmentParse('scale=640:480');
110
+ * if (segment) {
111
+ * FFmpegError.throwIfError(segment.createFilters(), 'createFilters');
112
+ * FFmpegError.throwIfError(segment.applyOpts(), 'applyOpts');
113
+ *
114
+ * const inputs = new FilterInOut();
115
+ * const outputs = new FilterInOut();
116
+ * FFmpegError.throwIfError(segment.apply(inputs, outputs), 'apply');
117
+ *
118
+ * inputs.free();
119
+ * outputs.free();
120
+ * segment.free();
121
+ * }
122
+ * ```
123
+ *
124
+ * @see {@link createFilters} To create filter instances
125
+ * @see {@link applyOpts} To apply options before initialization
126
+ */
127
+ apply(inputs, outputs, flags = 0) {
128
+ return this.native.apply(inputs.getNative(), outputs.getNative(), flags);
129
+ }
130
+ /**
131
+ * Free the segment and all associated resources.
132
+ *
133
+ * Releases all memory and resources allocated for this filter graph segment.
134
+ * After calling this method, the segment cannot be used anymore.
135
+ *
136
+ * Direct mapping to avfilter_graph_segment_free().
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const segment = graph.segmentParse('scale=640:480');
141
+ * if (segment) {
142
+ * // Use segment...
143
+ * segment.free();
144
+ * }
145
+ * ```
146
+ *
147
+ * @see {@link Symbol.dispose} For automatic cleanup with using statement
148
+ */
149
+ free() {
150
+ this.native.free();
151
+ }
152
+ /**
153
+ * Dispose of the segment.
154
+ *
155
+ * Automatically frees the segment when using the `using` statement.
156
+ * This implements the Disposable interface for automatic resource cleanup.
157
+ * Equivalent to calling free().
158
+ *
159
+ * @example
160
+ * ```typescript
161
+ * {
162
+ * using segment = graph.segmentParse('scale=640:480');
163
+ * // Use segment...
164
+ * } // Automatically freed
165
+ * ```
166
+ */
167
+ [Symbol.dispose]() {
168
+ this.native[Symbol.dispose]();
169
+ }
170
+ }
171
+ //# sourceMappingURL=filter-graph-segment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-graph-segment.js","sourceRoot":"","sources":["../../src/lib/filter-graph-segment.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAA2B;IAEzC;;;;OAIG;IACH,YAAY,MAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,aAAa,CAAC,KAAK,GAAG,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,SAAS,CAAC,KAAK,GAAG,CAAC;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;IACH,KAAK,CAAC,MAAmB,EAAE,OAAoB,EAAE,KAAK,GAAG,CAAC;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,IAAI;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,CAAC,MAAM,CAAC,OAAO,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { FilterContext } from './filter-context.js';
2
+ import { FilterGraphSegment } from './filter-graph-segment.js';
2
3
  import { OptionMember } from './option.js';
3
4
  import type { AVFilterCmdFlag, AVFilterConstants } from '../constants/constants.js';
4
5
  import type { FilterInOut } from './filter-inout.js';
@@ -390,6 +391,42 @@ export declare class FilterGraph extends OptionMember<NativeFilterGraph> impleme
390
391
  * @see {@link parse2} For simplified parsing
391
392
  */
392
393
  parsePtr(filters: string, inputs?: FilterInOut | null, outputs?: FilterInOut | null): number;
394
+ /**
395
+ * Parse a filter graph into a segment.
396
+ *
397
+ * Parses a textual filter description and returns a segment object.
398
+ * The segment separates parsing from initialization, allowing filter
399
+ * contexts to be configured before initialization.
400
+ *
401
+ * Direct mapping to avfilter_graph_segment_parse().
402
+ *
403
+ * @param filters - Filter graph description string
404
+ *
405
+ * @param flags - Parsing flags (default: 0)
406
+ *
407
+ * @returns FilterGraphSegment instance or null on error
408
+ *
409
+ * @example
410
+ * ```typescript
411
+ * import { FFmpegError } from 'node-av';
412
+ *
413
+ * const segment = graph.segmentParse('scale=640:480');
414
+ * if (!segment) {
415
+ * throw new Error('Failed to parse filter');
416
+ * }
417
+ *
418
+ * // Create and configure filters
419
+ * FFmpegError.throwIfError(segment.createFilters(), 'createFilters');
420
+ * FFmpegError.throwIfError(segment.applyOpts(), 'applyOpts');
421
+ * FFmpegError.throwIfError(segment.apply(inputs, outputs), 'apply');
422
+ *
423
+ * segment.free();
424
+ * ```
425
+ *
426
+ * @see {@link FilterGraphSegment} For segment operations
427
+ * @see {@link parse} For standard parsing
428
+ */
429
+ segmentParse(filters: string, flags?: number): FilterGraphSegment | null;
393
430
  /**
394
431
  * Validate the filter graph configuration.
395
432
  *
@@ -1,5 +1,6 @@
1
1
  import { bindings } from './binding.js';
2
2
  import { FilterContext } from './filter-context.js';
3
+ import { FilterGraphSegment } from './filter-graph-segment.js';
3
4
  import { OptionMember } from './option.js';
4
5
  /**
5
6
  * Filter graph for audio/video processing pipelines.
@@ -431,6 +432,45 @@ export class FilterGraph extends OptionMember {
431
432
  parsePtr(filters, inputs, outputs) {
432
433
  return this.native.parsePtr(filters, inputs ? inputs.getNative() : null, outputs ? outputs.getNative() : null);
433
434
  }
435
+ /**
436
+ * Parse a filter graph into a segment.
437
+ *
438
+ * Parses a textual filter description and returns a segment object.
439
+ * The segment separates parsing from initialization, allowing filter
440
+ * contexts to be configured before initialization.
441
+ *
442
+ * Direct mapping to avfilter_graph_segment_parse().
443
+ *
444
+ * @param filters - Filter graph description string
445
+ *
446
+ * @param flags - Parsing flags (default: 0)
447
+ *
448
+ * @returns FilterGraphSegment instance or null on error
449
+ *
450
+ * @example
451
+ * ```typescript
452
+ * import { FFmpegError } from 'node-av';
453
+ *
454
+ * const segment = graph.segmentParse('scale=640:480');
455
+ * if (!segment) {
456
+ * throw new Error('Failed to parse filter');
457
+ * }
458
+ *
459
+ * // Create and configure filters
460
+ * FFmpegError.throwIfError(segment.createFilters(), 'createFilters');
461
+ * FFmpegError.throwIfError(segment.applyOpts(), 'applyOpts');
462
+ * FFmpegError.throwIfError(segment.apply(inputs, outputs), 'apply');
463
+ *
464
+ * segment.free();
465
+ * ```
466
+ *
467
+ * @see {@link FilterGraphSegment} For segment operations
468
+ * @see {@link parse} For standard parsing
469
+ */
470
+ segmentParse(filters, flags = 0) {
471
+ const native = this.native.segmentParse(filters, flags);
472
+ return native ? new FilterGraphSegment(native) : null;
473
+ }
434
474
  /**
435
475
  * Validate the filter graph configuration.
436
476
  *
@@ -1 +1 @@
1
- {"version":3,"file":"filter-graph.js","sourceRoot":"","sources":["../../src/lib/filter-graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filter-graph.js","sourceRoot":"","sources":["../../src/lib/filter-graph.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,7 @@ export { Dictionary } from './dictionary.js';
20
20
  export { Option, OptionInfo, type OptionMember } from './option.js';
21
21
  export { FilterContext } from './filter-context.js';
22
22
  export { FilterGraph } from './filter-graph.js';
23
+ export { FilterGraphSegment } from './filter-graph-segment.js';
23
24
  export { FilterInOut } from './filter-inout.js';
24
25
  export { Filter } from './filter.js';
25
26
  export { BitStreamFilterContext } from './bitstream-filter-context.js';
package/dist/lib/index.js CHANGED
@@ -37,6 +37,7 @@ export { Option, OptionInfo } from './option.js';
37
37
  // Filter related classes
38
38
  export { FilterContext } from './filter-context.js';
39
39
  export { FilterGraph } from './filter-graph.js';
40
+ export { FilterGraphSegment } from './filter-graph-segment.js';
40
41
  export { FilterInOut } from './filter-inout.js';
41
42
  export { Filter } from './filter.js';
42
43
  // Bitstream Filter related classes
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAEA,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,2BAA2B;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,iBAAiB;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,oBAAoB;AACpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAC;AAEpE,yBAAyB;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,mCAAmC;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU;AACV,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY;AACZ,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAEA,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,2BAA2B;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,iBAAiB;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,oBAAoB;AACpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAC;AAEpE,yBAAyB;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,mCAAmC;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,QAAQ;AACR,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU;AACV,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAErD,YAAY;AACZ,cAAc,gBAAgB,CAAC"}
@@ -639,6 +639,7 @@ export interface NativeFilterGraph extends Disposable {
639
639
  parse(filters: string, inputs: NativeFilterInOut | null, outputs: NativeFilterInOut | null): number;
640
640
  parse2(filters: string): number;
641
641
  parsePtr(filters: string, inputs?: NativeFilterInOut | null, outputs?: NativeFilterInOut | null): number;
642
+ segmentParse(filters: string, flags?: number): NativeFilterGraphSegment | null;
642
643
  validate(): number;
643
644
  requestOldest(): Promise<number>;
644
645
  requestOldestSync(): number;
@@ -649,6 +650,22 @@ export interface NativeFilterGraph extends Disposable {
649
650
  queueCommand(target: string, cmd: string, arg: string, ts: number, flags?: AVFilterCmdFlag): number;
650
651
  [Symbol.dispose](): void;
651
652
  }
653
+ /**
654
+ * Native AVFilterGraphSegment binding interface
655
+ *
656
+ * Represents a parsed filtergraph segment.
657
+ * Separates filter parsing from initialization.
658
+ *
659
+ * @internal
660
+ */
661
+ export interface NativeFilterGraphSegment extends Disposable {
662
+ readonly __brand: 'NativeFilterGraphSegment';
663
+ free(): void;
664
+ createFilters(flags?: number): number;
665
+ applyOpts(flags?: number): number;
666
+ apply(inputs: NativeFilterInOut, outputs: NativeFilterInOut, flags?: number): number;
667
+ [Symbol.dispose](): void;
668
+ }
652
669
  /**
653
670
  * Native AVFilterInOut binding interface
654
671
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-av",
3
- "version": "3.0.0",
3
+ "version": "3.0.3",
4
4
  "description": "FFmpeg bindings for Node.js",
5
5
  "author": "seydx (https://github.com/seydx/av)",
6
6
  "type": "module",
@@ -36,13 +36,14 @@
36
36
  "build:examples": "tsc -p tsconfig.examples.json",
37
37
  "build:native": "node-gyp rebuild && cpy --flat build/Release/node-av.node binary/",
38
38
  "build:tests": "tsc -p tsconfig.tests.json",
39
- "build:tsc": "rimraf dist && tsc -p tsconfig.build.json && cpy --flat src/api/data/* dist/api/data --parents",
39
+ "build:tsc": "rimraf dist && npm run generate:ffmpeg-version && tsc -p tsconfig.build.json && cpy --flat src/api/data/* dist/api/data --parents",
40
40
  "clean": "rimraf dist && node-gyp clean && npm run generate && npm run format && npm run lint:fix && npm run build:tests && npm run build:examples && npm run build:tsc",
41
41
  "docs:dev": "npm run predocs && vitepress dev docs --port 5173",
42
42
  "docs:build": "npm run predocs && rimraf docs/.vitepress/dist && vitepress build docs && cpy --flat docs/logo.png docs/.vitepress/dist",
43
43
  "docs:preview": "npm run predocs && vitepress preview docs --port 5174",
44
44
  "format": "prettier --write src/ --write test/ --write scripts/ --write examples/ --ignore-unknown --no-error-on-unmatched-pattern",
45
- "generate": "npm run patch:ffmpeg && npm run generate:constants && npm run generate:encoders && npm run generate:decoders && npm run generate:layouts",
45
+ "generate": "npm run patch:ffmpeg && npm run generate:ffmpeg-version && npm run generate:constants && npm run generate:encoders && npm run generate:decoders && npm run generate:layouts",
46
+ "generate:ffmpeg-version": "node scripts/generate-ffmpeg-version.js",
46
47
  "generate:constants": "cross-env FFMPEG_DEV_PATH=externals/jellyfin-ffmpeg node scripts/generate-constants.js && prettier --write src/constants/constants.ts",
47
48
  "generate:encoders": "cross-env FFMPEG_DEV_PATH=externals/jellyfin-ffmpeg node scripts/generate-encoders.js --with-patches && prettier --write src/constants/encoders.ts",
48
49
  "generate:decoders": "cross-env FFMPEG_DEV_PATH=externals/jellyfin-ffmpeg node scripts/generate-decoders.js --with-patches && prettier --write src/constants/decoders.ts",
@@ -62,14 +63,14 @@
62
63
  "update": "updates --update ./"
63
64
  },
64
65
  "optionalDependencies": {
65
- "@seydx/node-av-darwin-arm64": "^3.0.0",
66
- "@seydx/node-av-darwin-x64": "^3.0.0",
67
- "@seydx/node-av-linux-arm64": "^3.0.0",
68
- "@seydx/node-av-linux-x64": "^3.0.0",
69
- "@seydx/node-av-win32-arm64-mingw": "^3.0.0",
70
- "@seydx/node-av-win32-arm64-msvc": "^3.0.0",
71
- "@seydx/node-av-win32-x64-mingw": "^3.0.0",
72
- "@seydx/node-av-win32-x64-msvc": "^3.0.0"
66
+ "@seydx/node-av-darwin-arm64": "^3.0.3",
67
+ "@seydx/node-av-darwin-x64": "^3.0.3",
68
+ "@seydx/node-av-linux-arm64": "^3.0.3",
69
+ "@seydx/node-av-linux-x64": "^3.0.3",
70
+ "@seydx/node-av-win32-arm64-mingw": "^3.0.3",
71
+ "@seydx/node-av-win32-arm64-msvc": "^3.0.3",
72
+ "@seydx/node-av-win32-x64-mingw": "^3.0.3",
73
+ "@seydx/node-av-win32-x64-msvc": "^3.0.3"
73
74
  },
74
75
  "devDependencies": {
75
76
  "@camera.ui/ffmpeg": "^0.0.14",
@@ -85,10 +86,10 @@
85
86
  "cpy-cli": "^6.0.0",
86
87
  "cross-env": "^10.1.0",
87
88
  "eslint": "^9.37.0",
88
- "eslint-plugin-jsdoc": "^61.1.2",
89
+ "eslint-plugin-jsdoc": "^61.1.4",
89
90
  "globals": "^16.4.0",
90
91
  "node-addon-api": "^8.5.0",
91
- "node-gyp": "^11.4.2",
92
+ "node-gyp": "^11.5.0",
92
93
  "pngjs": "^7.0.0",
93
94
  "prettier": "^3.6.2",
94
95
  "rimraf": "^6.0.1",