@haibun/utils 1.47.0 → 1.47.1

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,39 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ # Function to handle errors
6
+ handle_error() {
7
+ echo "ERROR: Video generation failed!"
8
+ echo "Reason: $1"
9
+ exit 1
10
+ }
11
+
12
+ # Set up directories needed for Docker volume mounting
13
+ echo "Setting up environment..."
14
+ mkdir -p assets 2>/dev/null || true
15
+
16
+ # Find the installed package location
17
+ PACKAGE_DIR=$(npm root)/@haibun/utils
18
+
19
+ # Generate editly configuration from monitor.json
20
+ echo "Generating editly configuration..."
21
+ # Use the correct path to the built JS file
22
+ node "$PACKAGE_DIR/build/generate-video.js" "$1" "$2" editly-config.json || handle_error "Failed to generate editly configuration"
23
+
24
+ # Run editly using Docker directly instead of alias
25
+ echo "Generating video with editly..."
26
+
27
+ # Run Docker command with proper error handling
28
+ if ! docker run --rm -u $(id -u):$(id -g) -v $PWD:/data vimagick/editly editly-config.json; then
29
+ handle_error "Docker editly command failed. Check docker installation and permissions."
30
+ fi
31
+
32
+ # Verify output file exists
33
+ OUTPUT_FILE=${2:-haibun-test-video.mp4}
34
+ if [ -f "$OUTPUT_FILE" ]; then
35
+ echo "Video generation complete!"
36
+ echo "Output file: $OUTPUT_FILE"
37
+ else
38
+ handle_error "Output video file was not created"
39
+ fi
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate-video.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-video.d.ts","sourceRoot":"","sources":["../src/generate-video.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ import { getMediafileDuration } from '@haibun/core/build/steps/lib/tts.js';
2
+ import * as fs from 'fs';
3
+ const generateEditlyConfig = async (logEntries, outputPath, inputFilePath, title) => {
4
+ // Get the base directory from the input file path to resolve relative paths
5
+ const basePath = inputFilePath.substring(0, inputFilePath.lastIndexOf('/') + 1);
6
+ console.log(`Base path for assets: ${basePath}`);
7
+ // Collect assets and find videoStart
8
+ const assets = { video: [], speech: [], featureStart: undefined };
9
+ for (const entry of logEntries) {
10
+ const startTime = entry.messageContext?.incidentDetails?.result?.actionResult?.start;
11
+ if (entry.messageContext?.artifact?.artifactType === 'video') {
12
+ const videoPath = entry.messageContext.artifact.path;
13
+ const resolvedPath = `${basePath}${videoPath}`;
14
+ if (!fs.existsSync(resolvedPath))
15
+ throw new Error(`Media file not found at ${resolvedPath}`);
16
+ assets.video.push({ type: 'video', path: resolvedPath, start: startTime, messageContext: entry.messageContext, metadata: entry.messageContext.artifact });
17
+ }
18
+ if (entry.messageContext?.artifact?.artifactType === 'speech') {
19
+ const speechPath = entry.messageContext.artifact.path;
20
+ const resolvedPath = `${basePath}${speechPath}`;
21
+ if (!fs.existsSync(resolvedPath))
22
+ throw new Error(`Media file not found at ${resolvedPath}`);
23
+ assets.speech.push({ type: 'speech', path: resolvedPath, start: startTime, messageContext: entry.messageContext, metadata: entry.messageContext.artifact });
24
+ }
25
+ }
26
+ // Extract featureStart from FEATURE_START's incidentDetails.startTime
27
+ const featureStartEntry = logEntries.find(e => e.messageContext?.incident === 'FEATURE_START' && e.messageContext?.incidentDetails?.startTime);
28
+ if (featureStartEntry) {
29
+ assets.featureStart = featureStartEntry.messageContext.incidentDetails.startTime;
30
+ }
31
+ const featureEndEntry = logEntries.find(e => e.messageContext?.incident === 'FEATURE_END' && e.messageContext?.incidentDetails?.totalTime);
32
+ const totalDuration = featureEndEntry.messageContext.incidentDetails.totalTime / 1000;
33
+ if (!featureEndEntry)
34
+ throw new Error('No FEATURE_END with totalTime found in log.');
35
+ // Find the main video asset
36
+ if (assets.video.length === 0)
37
+ throw new Error('No video asset found.');
38
+ const mainVideoAsset = assets.video[0];
39
+ const videoFileDuration = await getMediafileDuration(mainVideoAsset.path);
40
+ if (!assets.featureStart)
41
+ throw new Error('No FEATURE_START with startTime found in log.');
42
+ const videoFileStats = fs.statSync(mainVideoAsset.path);
43
+ const videoFileBirthOrCtime = videoFileStats.birthtimeMs || videoFileStats.ctimeMs;
44
+ const videoLayerStart = (videoFileBirthOrCtime - assets.featureStart) / 1000;
45
+ // Print assets
46
+ console.log("\nAssets:");
47
+ console.log("video:", assets.video.map(v => ({ start: v.start, path: v.path })));
48
+ console.log("speech:", assets.speech.map(s => ({ start: s.start, path: s.path })));
49
+ console.log("featureStart", assets.featureStart);
50
+ console.log("totalDuration", totalDuration);
51
+ console.log('videoFileBirthOrCtime', videoFileBirthOrCtime);
52
+ console.log("videoFileDuration", videoFileDuration);
53
+ console.log("videoLayerStart", videoLayerStart);
54
+ // Find the minimum start time among all assets (timeline zero)
55
+ const timelineZero = 0;
56
+ // Find FEATURE_END for duration
57
+ // Build layers for the single clip
58
+ const layers = [];
59
+ // Add a title layer at the start, lasting until the video starts
60
+ if (videoLayerStart > 0) {
61
+ layers.push({
62
+ type: 'title',
63
+ text: title,
64
+ textColor: '#cccccc',
65
+ backgroundColor: '#222',
66
+ position: 'center',
67
+ start: 0,
68
+ duration: videoLayerStart,
69
+ fadeIn: 0,
70
+ transition: null
71
+ });
72
+ }
73
+ // Only add detached-audio for speech assets (no subtitle for speech)
74
+ for (const speech of assets.speech) {
75
+ const relStartS = ((speech.start ?? 0) - timelineZero) / 1000;
76
+ layers.push({
77
+ type: 'detached-audio',
78
+ path: speech.path,
79
+ cutFrom: 0,
80
+ start: relStartS,
81
+ mixVolume: 100
82
+ });
83
+ }
84
+ layers.push({
85
+ type: 'video',
86
+ path: mainVideoAsset.path,
87
+ start: videoLayerStart
88
+ });
89
+ // Sort layers by their start time (if present)
90
+ layers.sort((a, b) => (a.start ?? 0) - (b.start ?? 0));
91
+ const config = {
92
+ outPath: outputPath,
93
+ defaults: {
94
+ layer: {
95
+ // fontPath: "/usr/share/fonts/truetype/ubuntu/UbuntuSansMono[wght].ttf"
96
+ }
97
+ },
98
+ clips: [
99
+ {
100
+ duration: totalDuration,
101
+ layers
102
+ }
103
+ ]
104
+ };
105
+ return config;
106
+ };
107
+ const main = async () => {
108
+ try {
109
+ if (process.argv.length < 5) {
110
+ console.error('Usage: node generate-video.js <inputFile> <outputFile> <configOutput> <title>');
111
+ process.exit(1);
112
+ }
113
+ const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf-8'));
114
+ const args = process.argv.slice(2);
115
+ const inputFile = args[0];
116
+ const outputFile = args[1];
117
+ const configOutput = args[2];
118
+ const title = args[3] || packageJson?.description || packageJson?.name;
119
+ console.log(args);
120
+ console.log(`Input file: ${inputFile}`);
121
+ console.log(`Output video file: ${outputFile}`);
122
+ console.log(`Config output: ${configOutput}`);
123
+ console.log('Title:', title);
124
+ // Read monitor.json
125
+ const logData = fs.readFileSync(inputFile, 'utf-8');
126
+ const logEntries = JSON.parse(logData);
127
+ console.log(`Loaded ${logEntries.length} log entries`);
128
+ // Generate editly config
129
+ const editlyConfig = await generateEditlyConfig(logEntries, outputFile, inputFile, title);
130
+ // Write config to file
131
+ fs.writeFileSync(configOutput, JSON.stringify(editlyConfig, null, 2));
132
+ console.log(`\nEditly config written to ${configOutput}`);
133
+ console.log(`To generate video, run: editly ${configOutput}`);
134
+ }
135
+ catch (error) {
136
+ console.error('Error:', error);
137
+ process.exit(1);
138
+ }
139
+ };
140
+ main().catch((error) => {
141
+ console.error('Error in main function:', error);
142
+ });
143
+ //# sourceMappingURL=generate-video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-video.js","sourceRoot":"","sources":["../src/generate-video.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@haibun/utils",
3
3
  "type": "module",
4
- "version": "1.47.0",
4
+ "version": "1.47.1",
5
5
  "description": "",
6
6
  "main": "index.js",
7
7
  "files": ["ref.package.json", "build/**", "scaffold/**"],
8
8
  "bin": {
9
9
  "scaffold": "build/scaffold/index.js",
10
10
  "version": "build/version.js",
11
- "link": "build/npm-link-haibuns.js"
11
+ "link": "build/npm-link-haibuns.js",
12
+ "generate-video": "bin/generate-video.sh"
12
13
  },
13
14
  "scripts": {
14
15
  "test": "vitest run",
@@ -21,5 +22,5 @@
21
22
  "author": "",
22
23
  "license": "ISC",
23
24
  "gitHead": "7cf9680bd922fb622fb59f1e6bf5b65284cb8fd5",
24
- "dependencies": { "@haibun/cli": "1.47.0", "@haibun/core": "1.47.0" }
25
+ "dependencies": { "@haibun/cli": "1.47.1", "@haibun/core": "1.47.1" }
25
26
  }