aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/Network.ts4
-rw-r--r--src/client/views/nodes/RecordingBox/ProgressBar.scss1
-rw-r--r--src/client/views/nodes/RecordingBox/RecordingView.tsx2
-rw-r--r--src/server/ApiManagers/UploadManager.ts20
-rw-r--r--src/server/DashUploadUtils.ts67
5 files changed, 69 insertions, 25 deletions
diff --git a/src/client/Network.ts b/src/client/Network.ts
index 2c6d9d711..8c1f31488 100644
--- a/src/client/Network.ts
+++ b/src/client/Network.ts
@@ -36,8 +36,8 @@ export namespace Networking {
return response.json();
}
- export async function UploadSegmentsAndConcatenate<T extends Upload.FileInformation = Upload.FileInformation>(files: File | File[]): Promise<Upload.FileResponse<T>[]> {
- console.log(files)
+ export async function UploadSegmentsAndConcatenate<T extends Upload.FileInformation = Upload.FileInformation>(files: File[]): Promise<Upload.FileResponse<T>[]> {
+ console.log("network.ts : uploading segments and concatenating", files);
const formData = new FormData();
if (!Array.isArray(files) || !files.length) return [];
files.forEach(file => formData.append(Utils.GenerateGuid(), file));
diff --git a/src/client/views/nodes/RecordingBox/ProgressBar.scss b/src/client/views/nodes/RecordingBox/ProgressBar.scss
index d387468c6..c7a190566 100644
--- a/src/client/views/nodes/RecordingBox/ProgressBar.scss
+++ b/src/client/views/nodes/RecordingBox/ProgressBar.scss
@@ -70,7 +70,6 @@
.segment:hover, .segment-selected {
margin: 0px;
border: 4px solid red;
- min-width: 10px;
border-radius: 2px;
}
diff --git a/src/client/views/nodes/RecordingBox/RecordingView.tsx b/src/client/views/nodes/RecordingBox/RecordingView.tsx
index 1e9ce22f1..aea7f56b5 100644
--- a/src/client/views/nodes/RecordingBox/RecordingView.tsx
+++ b/src/client/views/nodes/RecordingBox/RecordingView.tsx
@@ -69,7 +69,7 @@ export function RecordingView(props: IRecordingViewProps) {
const { name } = videoFile;
inputPaths.push(name)
- });
+ })
console.log(videoFiles)
diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts
index faf36c6e5..398b007b5 100644
--- a/src/server/ApiManagers/UploadManager.ts
+++ b/src/server/ApiManagers/UploadManager.ts
@@ -44,22 +44,22 @@ export default class UploadManager extends ApiManager {
register({
method: Method.POST,
- subscription: "/uploadVideosAndConcatenate",
+ subscription: "/uploadVideosandConcatenate",
secureHandler: async ({ req, res }) => {
const form = new formidable.IncomingForm();
form.keepExtensions = true;
form.uploadDir = pathToDirectory(Directory.parsed_files);
return new Promise<void>(resolve => {
form.parse(req, async (_err, _fields, files) => {
- const result: Upload.FileResponse[] = [];
- for (const key in files) {
- const f = files[key];
- if (Array.isArray(f)) {
- const result = await DashUploadUtils.concatenateVideos(f);
- console.log('concatenated', result);
- result && !(result.result instanceof Error) && _success(res, result);
- }
- }
+ const results: Upload.FileResponse[] = [];
+
+ // create an array of all the file paths
+ const filePaths: string[] = Object.keys(files).map(key => files[key].path);
+ console.log("uploading files", Array.isArray(filePaths));
+ const result = await DashUploadUtils.concatenateVideos(filePaths);
+ console.log('concatenated', result);
+ result && !(result.result instanceof Error) && results.push(result);
+ _success(res, results)
resolve();
});
});
diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts
index 6a7c8543d..148b0df65 100644
--- a/src/server/DashUploadUtils.ts
+++ b/src/server/DashUploadUtils.ts
@@ -17,6 +17,7 @@ import { resolvedServerUrl } from "./server_Initialization";
import { AcceptableMedia, Upload } from './SharedMediaTypes';
import request = require('request-promise');
import formidable = require('formidable');
+import { file } from 'jszip';
const { exec } = require("child_process");
const parse = require('pdf-parse');
const ffmpeg = require("fluent-ffmpeg");
@@ -62,19 +63,31 @@ export namespace DashUploadUtils {
const { imageFormats, videoFormats, applicationFormats, audioFormats } = AcceptableMedia; //TODO:glr
- export async function concatenateVideos(videoFiles: File[]): Promise<Upload.FileResponse> {
+ export async function concatenateVideos(filePaths: string[]): Promise<Upload.FileResponse> {
// make a list of paths to create the ordered text file for ffmpeg
- const filePaths = videoFiles.map(file => file.path);
+ //const filePaths = videoFiles.map(file => file.path);
// write the text file to the file system
const inputListName = 'concat.txt';
- const textFilePath = path.join(filesDirectory, "concat.txt");
- writeFile(textFilePath, filePaths.join("\n"), (err) => console.log(err));
-
+ const textFilePath = path.join(filesDirectory, inputListName);
+ // make a list of paths to create the ordered text file for ffmpeg
+ const filePathsText = filePaths.map(filePath => `file '${filePath}'`).join('\n');
+ writeFile(textFilePath, filePathsText, (err) => console.log(err));
+ console.log(filePathsText)
// make output file name based on timestamp
- const outputFileName = `output-${Utils.GenerateGuid()}.mp4`;
+ const outputFileName = `output-${Utils.GenerateGuid()}.mkv`;
+ // create the output file path in the parsed_file directory
+ const outputFilePath = path.join(filesDirectory, outputFileName);
+
+ // concatenate the videos
await new Promise((resolve, reject) => {
- ffmpeg(inputListName).inputOptions(['-f concat', '-safe 0']).outputOptions('-c copy').save(outputFileName)
+ console.log('concatenating videos');
+ var merge = ffmpeg();
+ merge.input(textFilePath)
+ .inputOptions(['-f concat', '-safe 0'])
+ .outputOptions('-c copy')
+ //.videoCodec("copy")
+ .save(outputFilePath)
.on("error", reject)
.on("end", resolve);
})
@@ -83,10 +96,41 @@ export namespace DashUploadUtils {
unlinkSync(textFilePath);
// read the output file from the file system
- const outputFile = fs.readFileSync(outputFileName);
- console.log('outputFile', outputFile);
- // move only the output file to the videos directory
- return MoveParsedFile(outputFile, Directory.videos)
+ // const outputFile = fs.readFileSync(outputFilePath);
+
+ // make a new blob object with the output file buffer
+ // const outputFileBlob = new Blob([outputFile.buffer], { type: 'x-matroska/mkv' });
+
+ // TODO: make with toJSON()
+
+ // make a data object
+ const outputFileObject: formidable.File = {
+ size: 0,
+ name: outputFileName,
+ path: outputFilePath,
+ // size: outputFileBlob.size,
+ type: 'video/x-matroska;codecs=avc1,opus',
+ lastModifiedDate: new Date(),
+
+ toJSON: () => ({ ...outputFileObject, filename: outputFilePath.replace(/.*\//, ""), mtime: null, length: 0, mime: "", toJson: () => undefined as any })
+ }
+
+ // const file = { ...outputFileObject, toJSON: () => ({ ...outputFileObject, filename: outputFilePath.replace(/.*\//, ""), mtime: null, length: 0, mime: "", toJson: () => undefined as any }) };
+
+ // this will convert it to mp4 and save it to the server
+ //return await MoveParsedFile(outputFileObject, Directory.videos);
+
+ return await upload(outputFileObject);
+
+ // // return only the output (first) file to the videos directory
+ // return {
+ // source: file, result: {
+ // accessPaths: {
+ // agnostic: getAccessPaths(Directory.videos, outputFileName)
+ // },
+ // rawText: undefined
+ // }
+ // }
}
export function uploadYoutube(videoId: string): Promise<Upload.FileResponse> {
@@ -122,6 +166,7 @@ export namespace DashUploadUtils {
}
case "video":
if (format.includes("x-matroska")) {
+ console.log("case video");
await new Promise(res => ffmpeg(file.path)
.videoCodec("copy") // this will copy the data instead of reencode it
.save(file.path.replace(".mkv", ".mp4"))