diff options
-rw-r--r-- | src/client/views/nodes/AudioBox.tsx | 23 | ||||
-rw-r--r-- | src/client/views/nodes/WebBox.tsx | 2 | ||||
-rw-r--r-- | src/server/ApiManagers/UploadManager.ts | 14 | ||||
-rw-r--r-- | src/server/DashUploadUtils.ts | 19 | ||||
-rw-r--r-- | src/server/SharedMediaTypes.ts | 1 |
5 files changed, 42 insertions, 17 deletions
diff --git a/src/client/views/nodes/AudioBox.tsx b/src/client/views/nodes/AudioBox.tsx index 2fd70963d..80d59af0b 100644 --- a/src/client/views/nodes/AudioBox.tsx +++ b/src/client/views/nodes/AudioBox.tsx @@ -20,6 +20,8 @@ import { DocumentView } from "./DocumentView"; import { Docs } from "../../documents/Documents"; import { ComputedField } from "../../../new_fields/ScriptField"; +// testing testing + interface Window { MediaRecorder: MediaRecorder; } @@ -46,6 +48,7 @@ export class AudioBox extends DocExtendableComponent<FieldViewProps, AudioDocume _ele: HTMLAudioElement | null = null; _recorder: any; _recordStart = 0; + _stream: MediaStream | undefined; public static START = 0; @observable private static _scrubTime = 0; @@ -137,12 +140,11 @@ export class AudioBox extends DocExtendableComponent<FieldViewProps, AudioDocume } recordAudioAnnotation = () => { - let gumStream: any; const self = this; navigator.mediaDevices.getUserMedia({ audio: true }).then(function (stream) { - gumStream = stream; + self._stream = stream; self._recorder = new MediaRecorder(stream); self.dataDoc[self.props.fieldKey + "-recordingStart"] = new DateField(new Date()); AudioBox.START = new DateField(new Date()).date.getTime(); @@ -154,13 +156,10 @@ export class AudioBox extends DocExtendableComponent<FieldViewProps, AudioDocume method: 'POST', body: formData }); - const json = await res.json(); - json.map(async (file: any) => { - const path = file.result.accessPaths.agnostic.client; - const url = Utils.prepend(path); - // upload to server with known URL - self.props.Document[self.props.fieldKey] = new AudioField(url); - }); + const files = await res.json(); + const url = Utils.prepend(files[0].result.accessPaths.agnostic.client); + // upload to server with known URL + self.props.Document[self.props.fieldKey] = new AudioField(url); }; self._recordStart = new Date().getTime(); console.log("RECORD START = " + self._recordStart); @@ -169,8 +168,8 @@ export class AudioBox extends DocExtendableComponent<FieldViewProps, AudioDocume self._recorder.start(); setTimeout(() => { self.stopRecording(); - gumStream.getAudioTracks()[0].stop(); - }, 60 * 60 * 1000); // stop after an hour? + self._stream?.getAudioTracks()[0].stop(); + }, 60 * 1000); // stop after a minute }); } @@ -185,6 +184,7 @@ export class AudioBox extends DocExtendableComponent<FieldViewProps, AudioDocume this._recorder.stop(); this.dataDoc.duration = (new Date().getTime() - this._recordStart) / 1000; this.audioState = "paused"; + this._stream?.getAudioTracks()[0].stop(); const ind = AudioBox.ActiveRecordings.indexOf(this.props.Document); ind !== -1 && (AudioBox.ActiveRecordings.splice(ind, 1)); }); @@ -237,6 +237,7 @@ export class AudioBox extends DocExtendableComponent<FieldViewProps, AudioDocume </audio>; } + // line 226 is stop button but it doesn't do anything render() { const interactive = this.active() ? "-interactive" : ""; return <div className={`audiobox-container`} onContextMenu={this.specificContextMenu} diff --git a/src/client/views/nodes/WebBox.tsx b/src/client/views/nodes/WebBox.tsx index c169d9423..2f8b6167f 100644 --- a/src/client/views/nodes/WebBox.tsx +++ b/src/client/views/nodes/WebBox.tsx @@ -36,7 +36,7 @@ export class WebBox extends DocAnnotatableComponent<FieldViewProps, WebDocument> public static LayoutString(fieldKey: string) { return FieldView.LayoutString(WebBox, fieldKey); } @observable private collapsed: boolean = true; - @observable private url: string = ""; + @observable private url: string = "hello"; private _longPressSecondsHack?: NodeJS.Timeout; private _iframeRef = React.createRef<HTMLIFrameElement>(); diff --git a/src/server/ApiManagers/UploadManager.ts b/src/server/ApiManagers/UploadManager.ts index 50a759c9d..42e33ece0 100644 --- a/src/server/ApiManagers/UploadManager.ts +++ b/src/server/ApiManagers/UploadManager.ts @@ -19,7 +19,8 @@ export enum Directory { videos = "videos", pdfs = "pdfs", text = "text", - pdf_thumbnails = "pdf_thumbnails" + pdf_thumbnails = "pdf_thumbnails", + audio = "audio" } export function serverPathToFile(directory: Directory, filename: string) { @@ -61,9 +62,18 @@ export default class UploadManager extends ApiManager { }); register({ + method: Method.GET, + subscription: "/hello", + secureHandler: ({ req, res }) => { + res.send("<h1>world!</h1>"); + } + }); + + register({ method: Method.POST, subscription: "/uploadRemoteImage", secureHandler: async ({ req, res }) => { + const { sources } = req.body; if (Array.isArray(sources)) { const results = await Promise.all(sources.map(source => DashUploadUtils.UploadImage(source))); @@ -77,6 +87,7 @@ export default class UploadManager extends ApiManager { method: Method.POST, subscription: "/uploadDoc", secureHandler: ({ req, res }) => { + const form = new formidable.IncomingForm(); form.keepExtensions = true; // let path = req.body.path; @@ -181,6 +192,7 @@ export default class UploadManager extends ApiManager { method: Method.POST, subscription: "/inspectImage", secureHandler: async ({ req, res }) => { + const { source } = req.body; if (typeof source === "string") { return res.send(await DashUploadUtils.InspectImage(source)); diff --git a/src/server/DashUploadUtils.ts b/src/server/DashUploadUtils.ts index cc3dd75a4..cf78af60a 100644 --- a/src/server/DashUploadUtils.ts +++ b/src/server/DashUploadUtils.ts @@ -53,7 +53,7 @@ export namespace DashUploadUtils { const size = "content-length"; const type = "content-type"; - const { imageFormats, videoFormats, applicationFormats } = AcceptibleMedia; + const { imageFormats, videoFormats, applicationFormats, audioFormats } = AcceptibleMedia; export async function upload(file: File): Promise<Upload.FileResponse> { const { type, path, name } = file; @@ -76,14 +76,22 @@ export namespace DashUploadUtils { if (applicationFormats.includes(format)) { return UploadPdf(file); } - default: // "blob": - return MoveParsedFile(file, Directory.videos); + case "audio": + if (audioFormats.includes(format)) { + return MoveParsedFile(file, Directory.audio); + } } console.log(red(`Ignoring unsupported file (${name}) with upload type (${type}).`)); return { source: file, result: new Error(`Could not upload unsupported file (${name}) with upload type (${type}).`) }; } + async function UploadAudio(file: File) { + const { path: sourcePath } = file; + + return MoveParsedFile(file, Directory.audio); + } + async function UploadPdf(file: File) { const { path: sourcePath } = file; const dataBuffer = readFileSync(sourcePath); @@ -94,6 +102,7 @@ export namespace DashUploadUtils { const writeStream = createWriteStream(serverPathToFile(Directory.text, textFilename)); writeStream.write(result.text, error => error ? reject(error) : resolve()); }); + console.log(MoveParsedFile(file, Directory.pdfs)); return MoveParsedFile(file, Directory.pdfs); } @@ -197,8 +206,10 @@ export namespace DashUploadUtils { accessPaths: { agnostic: getAccessPaths(destination, name) } + } - }); + } + ); }); }); } diff --git a/src/server/SharedMediaTypes.ts b/src/server/SharedMediaTypes.ts index 185e787cc..3d3683912 100644 --- a/src/server/SharedMediaTypes.ts +++ b/src/server/SharedMediaTypes.ts @@ -10,6 +10,7 @@ export namespace AcceptibleMedia { export const imageFormats = [...pngs, ...jpgs, ...gifs, ...webps, ...tiffs]; export const videoFormats = [".mov", ".mp4"]; export const applicationFormats = [".pdf"]; + export const audioFormats = [".wav", ".mp3", ".flac", ".au", ".aiff", ".m4a", ".webm;codecs=opus"]; } export namespace Upload { |