aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/ApiManagers/UploadManager.ts28
-rw-r--r--src/server/DashUploadUtils.ts40
2 files changed, 52 insertions, 16 deletions
diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts
index 634548154..faf36c6e5 100644
--- a/src/server/ApiManagers/UploadManager.ts
+++ b/src/server/ApiManagers/UploadManager.ts
@@ -40,7 +40,31 @@ export function clientPathToFile(directory: Directory, filename: string) {
export default class UploadManager extends ApiManager {
- protected initialize(register: Registration): void {
+ protected initialize(register: Registration): void {
+
+ register({
+ method: Method.POST,
+ 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);
+ }
+ }
+ resolve();
+ });
+ });
+ }
+ });
register({
method: Method.POST,
@@ -50,7 +74,7 @@ export default class UploadManager extends ApiManager {
form.keepExtensions = true;
form.uploadDir = pathToDirectory(Directory.parsed_files);
return new Promise<void>(resolve => {
- form.parse(req, async (_err, _fields, files) => {
+ form.parse(req, async (_err, _fields, files) => {
const results: Upload.FileResponse[] = [];
for (const key in files) {
const f = files[key];
diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts
index 0c4f87905..6a7c8543d 100644
--- a/src/server/DashUploadUtils.ts
+++ b/src/server/DashUploadUtils.ts
@@ -1,9 +1,9 @@
import { green, red } from 'colors';
import { ExifImage } from 'exif';
+import * as exifr from 'exifr';
import { File } from 'formidable';
import { createWriteStream, existsSync, readFileSync, rename, unlinkSync, writeFile } from 'fs';
import * as path from 'path';
-import * as exifr from 'exifr';
import { basename } from "path";
import * as sharp from 'sharp';
import { Stream } from 'stream';
@@ -17,7 +17,6 @@ import { resolvedServerUrl } from "./server_Initialization";
import { AcceptableMedia, Upload } from './SharedMediaTypes';
import request = require('request-promise');
import formidable = require('formidable');
-import { output } from '../../webpack.config';
const { exec } = require("child_process");
const parse = require('pdf-parse');
const ffmpeg = require("fluent-ffmpeg");
@@ -63,19 +62,31 @@ export namespace DashUploadUtils {
const { imageFormats, videoFormats, applicationFormats, audioFormats } = AcceptableMedia; //TODO:glr
- export async function combineSegments(filePtr: File[], inputPaths: string[]): Promise<File> {
- const inputListName = 'order.txt';
-
- return new Promise<File>((resolve, reject) => {
- fs.writeFileSync(inputListName, inputPaths.join('\n'));
- ffmpeg(inputListName).inputOptions(['-f concat', '-safe 0']).outputOptions('-c copy').save('output.mp4')
+ export async function concatenateVideos(videoFiles: File[]): Promise<Upload.FileResponse> {
+ // make a list of paths to create the ordered text file for ffmpeg
+ 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));
+
+
+ // make output file name based on timestamp
+ const outputFileName = `output-${Utils.GenerateGuid()}.mp4`;
+ await new Promise((resolve, reject) => {
+ ffmpeg(inputListName).inputOptions(['-f concat', '-safe 0']).outputOptions('-c copy').save(outputFileName)
.on("error", reject)
- .on("end", () => {
- fs.unlinkSync(inputListName);
- filePtr[0].path = 'output.mp4';
- resolve(filePtr[0]);
- });
- });
+ .on("end", resolve);
+ })
+
+ // delete concat.txt from the file system
+ 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)
}
export function uploadYoutube(videoId: string): Promise<Upload.FileResponse> {
@@ -237,6 +248,7 @@ export namespace DashUploadUtils {
}
let resolvedUrl: string;
/**
+ *
* At this point, we want to take whatever url we have and make sure it's requestable.
* Anything that's hosted by some other website already is, but if the url is a local file url
* (locates the file on this server machine), we have to resolve the client side url by cutting out the