@ttt-productions/media-processing-core 0.0.2

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.
Files changed (125) hide show
  1. package/dist/audio/audio-processor.d.ts +8 -0
  2. package/dist/audio/audio-processor.d.ts.map +1 -0
  3. package/dist/audio/audio-processor.js +152 -0
  4. package/dist/audio/audio-processor.js.map +1 -0
  5. package/dist/audio/index.d.ts +3 -0
  6. package/dist/audio/index.d.ts.map +1 -0
  7. package/dist/audio/index.js +3 -0
  8. package/dist/audio/index.js.map +1 -0
  9. package/dist/audio/probe.d.ts +5 -0
  10. package/dist/audio/probe.d.ts.map +1 -0
  11. package/dist/audio/probe.js +14 -0
  12. package/dist/audio/probe.js.map +1 -0
  13. package/dist/firebase/firestore.d.ts +53 -0
  14. package/dist/firebase/firestore.d.ts.map +1 -0
  15. package/dist/firebase/firestore.js +10 -0
  16. package/dist/firebase/firestore.js.map +1 -0
  17. package/dist/firebase/storage.d.ts +2 -0
  18. package/dist/firebase/storage.d.ts.map +1 -0
  19. package/dist/firebase/storage.js +7 -0
  20. package/dist/firebase/storage.js.map +1 -0
  21. package/dist/image/formats.d.ts +2 -0
  22. package/dist/image/formats.d.ts.map +1 -0
  23. package/dist/image/formats.js +3 -0
  24. package/dist/image/formats.js.map +1 -0
  25. package/dist/image/image-processor.d.ts +7 -0
  26. package/dist/image/image-processor.d.ts.map +1 -0
  27. package/dist/image/image-processor.js +331 -0
  28. package/dist/image/image-processor.js.map +1 -0
  29. package/dist/image/index.d.ts +2 -0
  30. package/dist/image/index.d.ts.map +1 -0
  31. package/dist/image/index.js +2 -0
  32. package/dist/image/index.js.map +1 -0
  33. package/dist/image/resize.d.ts +2 -0
  34. package/dist/image/resize.d.ts.map +1 -0
  35. package/dist/image/resize.js +4 -0
  36. package/dist/image/resize.js.map +1 -0
  37. package/dist/index.d.ts +14 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +14 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/io/fs.d.ts +7 -0
  42. package/dist/io/fs.d.ts.map +1 -0
  43. package/dist/io/fs.js +30 -0
  44. package/dist/io/fs.js.map +1 -0
  45. package/dist/io/types.d.ts +18 -0
  46. package/dist/io/types.d.ts.map +1 -0
  47. package/dist/io/types.js +2 -0
  48. package/dist/io/types.js.map +1 -0
  49. package/dist/moderation/merge.d.ts +3 -0
  50. package/dist/moderation/merge.d.ts.map +1 -0
  51. package/dist/moderation/merge.js +23 -0
  52. package/dist/moderation/merge.js.map +1 -0
  53. package/dist/moderation/types.d.ts +24 -0
  54. package/dist/moderation/types.d.ts.map +1 -0
  55. package/dist/moderation/types.js +2 -0
  56. package/dist/moderation/types.js.map +1 -0
  57. package/dist/process-media.d.ts +5 -0
  58. package/dist/process-media.d.ts.map +1 -0
  59. package/dist/process-media.js +21 -0
  60. package/dist/process-media.js.map +1 -0
  61. package/dist/processing/errors.d.ts +6 -0
  62. package/dist/processing/errors.d.ts.map +1 -0
  63. package/dist/processing/errors.js +8 -0
  64. package/dist/processing/errors.js.map +1 -0
  65. package/dist/processing/process-media.d.ts +6 -0
  66. package/dist/processing/process-media.d.ts.map +1 -0
  67. package/dist/processing/process-media.js +23 -0
  68. package/dist/processing/process-media.js.map +1 -0
  69. package/dist/processing/result.d.ts +4 -0
  70. package/dist/processing/result.d.ts.map +1 -0
  71. package/dist/processing/result.js +11 -0
  72. package/dist/processing/result.js.map +1 -0
  73. package/dist/run-pipeline.d.ts +13 -0
  74. package/dist/run-pipeline.d.ts.map +1 -0
  75. package/dist/run-pipeline.js +181 -0
  76. package/dist/run-pipeline.js.map +1 -0
  77. package/dist/types.d.ts +19 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +2 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/utils/log.d.ts +4 -0
  82. package/dist/utils/log.d.ts.map +1 -0
  83. package/dist/utils/log.js +10 -0
  84. package/dist/utils/log.js.map +1 -0
  85. package/dist/utils/paths.d.ts +2 -0
  86. package/dist/utils/paths.d.ts.map +1 -0
  87. package/dist/utils/paths.js +7 -0
  88. package/dist/utils/paths.js.map +1 -0
  89. package/dist/utils/safe-path.d.ts +3 -0
  90. package/dist/utils/safe-path.d.ts.map +1 -0
  91. package/dist/utils/safe-path.js +23 -0
  92. package/dist/utils/safe-path.js.map +1 -0
  93. package/dist/validation/validate-duration.d.ts +2 -0
  94. package/dist/validation/validate-duration.d.ts.map +1 -0
  95. package/dist/validation/validate-duration.js +4 -0
  96. package/dist/validation/validate-duration.js.map +1 -0
  97. package/dist/validation/validate-mime.d.ts +2 -0
  98. package/dist/validation/validate-mime.d.ts.map +1 -0
  99. package/dist/validation/validate-mime.js +4 -0
  100. package/dist/validation/validate-mime.js.map +1 -0
  101. package/dist/validation/validate-size.d.ts +2 -0
  102. package/dist/validation/validate-size.d.ts.map +1 -0
  103. package/dist/validation/validate-size.js +4 -0
  104. package/dist/validation/validate-size.js.map +1 -0
  105. package/dist/video/ffmpeg.d.ts +35 -0
  106. package/dist/video/ffmpeg.d.ts.map +1 -0
  107. package/dist/video/ffmpeg.js +163 -0
  108. package/dist/video/ffmpeg.js.map +1 -0
  109. package/dist/video/index.d.ts +4 -0
  110. package/dist/video/index.d.ts.map +1 -0
  111. package/dist/video/index.js +4 -0
  112. package/dist/video/index.js.map +1 -0
  113. package/dist/video/probe.d.ts +8 -0
  114. package/dist/video/probe.d.ts.map +1 -0
  115. package/dist/video/probe.js +33 -0
  116. package/dist/video/probe.js.map +1 -0
  117. package/dist/video/video-processor.d.ts +8 -0
  118. package/dist/video/video-processor.d.ts.map +1 -0
  119. package/dist/video/video-processor.js +295 -0
  120. package/dist/video/video-processor.js.map +1 -0
  121. package/dist/workspace/temp.d.ts +6 -0
  122. package/dist/workspace/temp.d.ts.map +1 -0
  123. package/dist/workspace/temp.js +13 -0
  124. package/dist/workspace/temp.js.map +1 -0
  125. package/package.json +40 -0
@@ -0,0 +1,6 @@
1
+ import type { MediaProcessingSpec, MediaProcessingResult } from "@ttt-productions/media-contracts";
2
+ export declare function processMedia(spec: MediaProcessingSpec, ctx: {
3
+ inputPath: string;
4
+ outputBasePath: string;
5
+ }): Promise<MediaProcessingResult>;
6
+ //# sourceMappingURL=process-media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-media.d.ts","sourceRoot":"","sources":["../../src/processing/process-media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,kCAAkC,CAAC;AAM1C,wBAAsB,YAAY,CAChC,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,qBAAqB,CAAC,CAqBhC"}
@@ -0,0 +1,23 @@
1
+ import { processImage } from "../image/image-processor.js";
2
+ import { processVideo } from "../video/video-processor.js";
3
+ import { processAudio } from "../audio/audio-processor.js";
4
+ export async function processMedia(spec, ctx) {
5
+ switch (spec.kind) {
6
+ case "image":
7
+ return processImage(spec, ctx);
8
+ case "video":
9
+ return processVideo(spec, ctx);
10
+ case "audio":
11
+ return processAudio(spec, ctx);
12
+ default:
13
+ return {
14
+ ok: false,
15
+ mediaType: "other",
16
+ error: {
17
+ code: "unknown",
18
+ message: "Unsupported media type"
19
+ }
20
+ };
21
+ }
22
+ }
23
+ //# sourceMappingURL=process-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-media.js","sourceRoot":"","sources":["../../src/processing/process-media.ts"],"names":[],"mappings":"AAKE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAyB,EACzB,GAGC;IAED,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEjC,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEjC,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEjC;YACE,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,SAAS,EAAE,OAAO;gBAClB,KAAK,EAAE;oBACL,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,wBAAwB;iBAClC;aACF,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { MediaProcessingResult } from "@ttt-productions/media-contracts";
2
+ export declare function success(result: Omit<MediaProcessingResult, "ok">): MediaProcessingResult;
3
+ export declare function failure(error: MediaProcessingResult["error"]): MediaProcessingResult;
4
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/processing/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE9E,wBAAgB,OAAO,CACrB,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,GACxC,qBAAqB,CAEvB;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,GACpC,qBAAqB,CAMvB"}
@@ -0,0 +1,11 @@
1
+ export function success(result) {
2
+ return { ok: true, ...result };
3
+ }
4
+ export function failure(error) {
5
+ return {
6
+ ok: false,
7
+ mediaType: "other",
8
+ error
9
+ };
10
+ }
11
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/processing/result.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,OAAO,CACrB,MAAyC;IAEzC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,OAAO,CACrB,KAAqC;IAErC,OAAO;QACL,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,OAAO;QAClB,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { MediaProcessingResult, MediaProcessingSpec } from "@ttt-productions/media-contracts";
2
+ import type { MediaIO } from "./io/types.js";
3
+ import type { ModerationAdapter } from "./moderation/types.js";
4
+ export interface RunPipelineArgs {
5
+ spec: MediaProcessingSpec;
6
+ io: MediaIO;
7
+ outputBaseName?: string;
8
+ moderation?: ModerationAdapter;
9
+ signal?: AbortSignal;
10
+ onProgress?: (p: import("./types.js").MediaPipelineProgress) => void;
11
+ }
12
+ export declare function runMediaPipeline(args: RunPipelineArgs): Promise<MediaProcessingResult>;
13
+ //# sourceMappingURL=run-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-pipeline.d.ts","sourceRoot":"","sources":["../src/run-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,qBAAqB,EACrB,mBAAmB,EAEpB,MAAM,kCAAkC,CAAC;AAI1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAK/D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,YAAY,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACpE;AAiBD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6K5F"}
@@ -0,0 +1,181 @@
1
+ import { parseMediaProcessingSpec } from "@ttt-productions/media-contracts";
2
+ import { createTempWorkspace } from "./workspace/temp.js";
3
+ import { processMedia } from "./process-media.js";
4
+ import { mergeModeration } from "./moderation/merge.js";
5
+ import path from "node:path";
6
+ import { stat } from "node:fs/promises";
7
+ function mediaTypeFromSpecKind(kind) {
8
+ if (kind === "image")
9
+ return "image";
10
+ if (kind === "video")
11
+ return "video";
12
+ if (kind === "audio")
13
+ return "audio";
14
+ return "other";
15
+ }
16
+ function attachProvider(m, provider) {
17
+ if (!m)
18
+ return m;
19
+ return { ...m, provider: m.provider ?? provider, reviewedAt: m.reviewedAt ?? Date.now() };
20
+ }
21
+ export async function runMediaPipeline(args) {
22
+ let { spec, io, outputBaseName = "media", moderation, signal, onProgress } = args;
23
+ if (signal?.aborted) {
24
+ return {
25
+ ok: false,
26
+ mediaType: mediaTypeFromSpecKind(spec.kind),
27
+ error: { code: "processing_canceled", message: "Processing canceled." },
28
+ };
29
+ }
30
+ // Runtime contract validation (fast-fail with actionable errors).
31
+ try {
32
+ spec = parseMediaProcessingSpec(spec);
33
+ }
34
+ catch (e) {
35
+ return {
36
+ ok: false,
37
+ mediaType: mediaTypeFromSpecKind(spec.kind),
38
+ error: {
39
+ code: "invalid_spec",
40
+ message: "Invalid MediaProcessingSpec.",
41
+ details: { issues: e?.issues ?? e?.message ?? String(e) },
42
+ },
43
+ };
44
+ }
45
+ const ws = await createTempWorkspace("ttt-media-");
46
+ try {
47
+ const inputPath = path.join(ws.dir, "input");
48
+ const outputBasePath = path.join(ws.dir, outputBaseName);
49
+ if (signal?.aborted) {
50
+ return { ok: false, mediaType: mediaTypeFromSpecKind(spec.kind), error: { code: "processing_canceled", message: "Processing canceled." } };
51
+ }
52
+ onProgress?.({ phase: "read_input", percent: 0 });
53
+ await io.input.readToFile(inputPath);
54
+ onProgress?.({ phase: "read_input", percent: 1 });
55
+ // PRE moderation (original)
56
+ let mIn;
57
+ if (moderation?.moderateInput) {
58
+ onProgress?.({ phase: "moderation_input", percent: 0 });
59
+ mIn = attachProvider(await moderation.moderateInput({
60
+ spec,
61
+ kind: spec.kind,
62
+ localPath: inputPath,
63
+ mime: io.input.mime,
64
+ }), moderation.provider);
65
+ onProgress?.({ phase: "moderation_input", percent: 1 });
66
+ if (mIn?.status === "rejected") {
67
+ return {
68
+ ok: false,
69
+ mediaType: mediaTypeFromSpecKind(spec.kind),
70
+ moderation: mIn,
71
+ error: {
72
+ code: "rejected",
73
+ message: "Rejected by moderation.",
74
+ details: { provider: mIn.provider, reasons: mIn.reasons, findings: mIn.findings },
75
+ },
76
+ };
77
+ }
78
+ }
79
+ const result = await processMedia(spec, {
80
+ inputPath,
81
+ outputBasePath,
82
+ inputMime: io.input.mime,
83
+ }, { signal, onProgress });
84
+ // Output size enforcement (processed outputs)
85
+ if (result.ok && result.outputs?.length) {
86
+ const perFileLimit = spec.maxOutputBytes ?? spec.maxBytes ?? 200 * 1024 * 1024; // 200MB default
87
+ const totalLimit = spec.maxTotalOutputBytes ?? spec.maxOutputBytes ?? spec.maxBytes ?? 400 * 1024 * 1024; // 400MB default
88
+ let total = 0;
89
+ for (const o of result.outputs) {
90
+ if (!o.path)
91
+ continue;
92
+ const s = await stat(o.path);
93
+ const size = Number(s.size ?? 0);
94
+ total += size;
95
+ if (!o.sizeBytes)
96
+ o.sizeBytes = size;
97
+ if (size > perFileLimit) {
98
+ return {
99
+ ok: false,
100
+ mediaType: mediaTypeFromSpecKind(spec.kind),
101
+ error: {
102
+ code: "too_large",
103
+ message: "Processed output exceeds allowed size.",
104
+ details: { key: o.key, sizeBytes: size, limitBytes: perFileLimit },
105
+ },
106
+ };
107
+ }
108
+ if (total > totalLimit) {
109
+ return {
110
+ ok: false,
111
+ mediaType: mediaTypeFromSpecKind(spec.kind),
112
+ error: {
113
+ code: "too_large",
114
+ message: "Total processed outputs exceed allowed size.",
115
+ details: { totalBytes: total, limitBytes: totalLimit },
116
+ },
117
+ };
118
+ }
119
+ }
120
+ }
121
+ if (!result.ok || !result.outputs?.length) {
122
+ if (mIn)
123
+ result.moderation = mIn;
124
+ onProgress?.({ phase: "done", percent: result.ok ? 1 : 0 });
125
+ return result;
126
+ }
127
+ // Persist outputs
128
+ onProgress?.({ phase: "persist_outputs", percent: 0 });
129
+ const totalOut = result.outputs.length;
130
+ let outIdx = 0;
131
+ for (const out of result.outputs) {
132
+ if (signal?.aborted) {
133
+ return { ok: false, mediaType: result.mediaType, error: { code: "processing_canceled", message: "Processing canceled." } };
134
+ }
135
+ onProgress?.({ phase: "persist_outputs", percent: totalOut ? outIdx / totalOut : 0, detail: { key: out.key } });
136
+ if (!out.path)
137
+ continue;
138
+ const persisted = await io.output.writeFromFile(out.path, out.key);
139
+ if (persisted.url)
140
+ out.url = persisted.url;
141
+ if (persisted.path)
142
+ out.path = persisted.path;
143
+ outIdx += 1;
144
+ }
145
+ onProgress?.({ phase: "persist_outputs", percent: 1 });
146
+ // POST moderation (processed outputs)
147
+ let mOut;
148
+ if (moderation?.moderateOutput) {
149
+ onProgress?.({ phase: "moderation_output", percent: 0 });
150
+ mOut = attachProvider(await moderation.moderateOutput({
151
+ spec,
152
+ kind: spec.kind,
153
+ outputs: (result.outputs ?? [])
154
+ .filter((o) => !!o.path)
155
+ .map((o) => ({ key: o.key, localPath: o.path, mime: o.mime })),
156
+ }), moderation.provider);
157
+ onProgress?.({ phase: "moderation_output", percent: 1 });
158
+ if (mOut?.status === "rejected") {
159
+ return {
160
+ ok: false,
161
+ mediaType: result.mediaType,
162
+ moderation: mOut,
163
+ error: {
164
+ code: "rejected",
165
+ message: "Rejected by moderation.",
166
+ details: { provider: mOut.provider, reasons: mOut.reasons, findings: mOut.findings },
167
+ },
168
+ };
169
+ }
170
+ }
171
+ const merged = mergeModeration(mIn ?? undefined, mOut ?? undefined);
172
+ if (merged)
173
+ result.moderation = merged;
174
+ onProgress?.({ phase: "done", percent: 1 });
175
+ return result;
176
+ }
177
+ finally {
178
+ await ws.cleanup();
179
+ }
180
+ }
181
+ //# sourceMappingURL=run-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-pipeline.js","sourceRoot":"","sources":["../src/run-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { MediaProcessingResult, MediaProcessingSpec } from "@ttt-productions/media-contracts";
2
+ export interface MediaPipelineProgress {
3
+ phase: "read_input" | "moderation_input" | "process" | "persist_outputs" | "moderation_output" | "done";
4
+ /** 0..1 when known */
5
+ percent?: number;
6
+ detail?: Record<string, unknown>;
7
+ }
8
+ export interface ProcessMediaContext {
9
+ inputPath: string;
10
+ outputBasePath: string;
11
+ /** optional mime hint from caller */
12
+ inputMime?: string;
13
+ }
14
+ export interface ProcessMediaOptions {
15
+ signal?: AbortSignal;
16
+ onProgress?: (p: MediaPipelineProgress) => void;
17
+ }
18
+ export type ProcessMediaFn = (spec: MediaProcessingSpec, ctx: ProcessMediaContext, opts?: ProcessMediaOptions) => Promise<MediaProcessingResult>;
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEnG,MAAM,WAAW,qBAAqB;IACpC,KAAK,EACD,YAAY,GACZ,kBAAkB,GAClB,SAAS,GACT,iBAAiB,GACjB,mBAAmB,GACnB,MAAM,CAAC;IACX,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE,mBAAmB,EACxB,IAAI,CAAC,EAAE,mBAAmB,KACvB,OAAO,CAAC,qBAAqB,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export declare function log(...args: unknown[]): void;
2
+ export declare function warn(...args: unknown[]): void;
3
+ export declare function error(...args: unknown[]): void;
4
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/utils/log.ts"],"names":[],"mappings":"AAAA,wBAAgB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,QAEnC;AAED,wBAAgB,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,QAEtC;AAED,wBAAgB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,QAEvC"}
@@ -0,0 +1,10 @@
1
+ export function log(...args) {
2
+ console.log("[media-processing]", ...args);
3
+ }
4
+ export function warn(...args) {
5
+ console.warn("[media-processing]", ...args);
6
+ }
7
+ export function error(...args) {
8
+ console.error("[media-processing]", ...args);
9
+ }
10
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/utils/log.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,CAAC,GAAG,IAAe;IAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAG,IAAe;IACrC,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,IAAe;IACtC,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function joinPath(...parts: string[]): string;
2
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,UAKxC"}
@@ -0,0 +1,7 @@
1
+ export function joinPath(...parts) {
2
+ return parts
3
+ .filter(Boolean)
4
+ .join("/")
5
+ .replace(/\/+/g, "/");
6
+ }
7
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,GAAG,KAAe;IACvC,OAAO,KAAK;SACT,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function sanitizeKey(key: string): string;
2
+ export declare function safeOutputPathFor(base: string, key: string, ext: string): string;
3
+ //# sourceMappingURL=safe-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-path.d.ts","sourceRoot":"","sources":["../../src/utils/safe-path.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAchF"}
@@ -0,0 +1,23 @@
1
+ import path from "node:path";
2
+ // Very conservative key sanitizer. Prevents path traversal / separators.
3
+ export function sanitizeKey(key) {
4
+ const k = String(key ?? "");
5
+ const stripped = k.replace(/[\\/]+/g, "_");
6
+ const cleaned = stripped.replace(/\.+/g, "."); // collapse long dot runs
7
+ const safe = cleaned.replace(/[^a-zA-Z0-9._-]/g, "_");
8
+ return safe.slice(0, 80) || "file";
9
+ }
10
+ export function safeOutputPathFor(base, key, ext) {
11
+ const safeKey = sanitizeKey(key);
12
+ const safeExt = sanitizeKey(ext).replace(/^\./, "");
13
+ const dir = path.dirname(base);
14
+ const baseName = path.basename(base);
15
+ const out = path.join(dir, `${baseName}_${safeKey}.${safeExt}`);
16
+ const resolvedDir = path.resolve(dir);
17
+ const resolvedOut = path.resolve(out);
18
+ if (!resolvedOut.startsWith(resolvedDir + path.sep) && resolvedOut !== resolvedDir) {
19
+ throw new Error("Unsafe output path");
20
+ }
21
+ return out;
22
+ }
23
+ //# sourceMappingURL=safe-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-path.js","sourceRoot":"","sources":["../../src/utils/safe-path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,yBAAyB;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,GAAW,EAAE,GAAW;IACtE,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function validateDuration(durationSec: number, maxDurationSec: number): boolean;
2
+ //# sourceMappingURL=validate-duration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-duration.d.ts","sourceRoot":"","sources":["../../src/validation/validate-duration.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAC5B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAET"}
@@ -0,0 +1,4 @@
1
+ export function validateDuration(durationSec, maxDurationSec) {
2
+ return durationSec <= maxDurationSec;
3
+ }
4
+ //# sourceMappingURL=validate-duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-duration.js","sourceRoot":"","sources":["../../src/validation/validate-duration.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAC5B,WAAmB,EACnB,cAAsB;IAEtB,OAAO,WAAW,IAAI,cAAc,CAAC;AACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function validateMime(mime: string, allowed: string[]): boolean;
2
+ //# sourceMappingURL=validate-mime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-mime.d.ts","sourceRoot":"","sources":["../../src/validation/validate-mime.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAET"}
@@ -0,0 +1,4 @@
1
+ export function validateMime(mime, allowed) {
2
+ return allowed.includes(mime);
3
+ }
4
+ //# sourceMappingURL=validate-mime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-mime.js","sourceRoot":"","sources":["../../src/validation/validate-mime.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CACxB,IAAY,EACZ,OAAiB;IAEjB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function validateSize(bytes: number, maxBytes: number): boolean;
2
+ //# sourceMappingURL=validate-size.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-size.d.ts","sourceRoot":"","sources":["../../src/validation/validate-size.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAET"}
@@ -0,0 +1,4 @@
1
+ export function validateSize(bytes, maxBytes) {
2
+ return bytes <= maxBytes;
3
+ }
4
+ //# sourceMappingURL=validate-size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-size.js","sourceRoot":"","sources":["../../src/validation/validate-size.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CACxB,KAAa,EACb,QAAgB;IAEhB,OAAO,KAAK,IAAI,QAAQ,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,35 @@
1
+ export interface RunCmdResult {
2
+ code: number;
3
+ stdout: string;
4
+ stderr: string;
5
+ }
6
+ export type FfmpegProgressPhase = "transcode" | "poster";
7
+ export interface RunFfmpegOptions {
8
+ cwd?: string;
9
+ signal?: AbortSignal;
10
+ /** Optional total duration in milliseconds (used to compute percent). */
11
+ durationMs?: number;
12
+ onProgress?: (p: {
13
+ phase: FfmpegProgressPhase;
14
+ percent?: number;
15
+ outTimeMs?: number;
16
+ }) => void;
17
+ /** Which phase to report in callbacks. */
18
+ phase?: FfmpegProgressPhase;
19
+ }
20
+ export declare function runCmd(cmd: string, args: string[], opts?: {
21
+ cwd?: string;
22
+ }): Promise<RunCmdResult>;
23
+ /**
24
+ * Runs ffmpeg with optional AbortSignal + progress reporting.
25
+ * If onProgress is provided, ffmpeg is invoked with "-progress pipe:1".
26
+ */
27
+ export declare function runFfmpeg(args: string[], opts?: RunFfmpegOptions): Promise<RunCmdResult>;
28
+ export declare function ensureFfmpegAvailable(): Promise<{
29
+ ok: true;
30
+ version?: string;
31
+ } | {
32
+ ok: false;
33
+ error: unknown;
34
+ }>;
35
+ //# sourceMappingURL=ffmpeg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpeg.d.ts","sourceRoot":"","sources":["../../src/video/ffmpeg.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,KAAK,EAAE,mBAAmB,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC/F,0CAA0C;IAC1C,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAOD,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBlG;AA4CD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuFxF;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CACpD;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAC/D,CAcA"}