implemented audio/video in note content renderer + streaming API #886

This commit is contained in:
zadam
2021-04-17 22:35:47 +02:00
parent 9ba514d930
commit d3cccae2df
6 changed files with 10251 additions and 25 deletions

View File

@@ -6,6 +6,7 @@ const utils = require('../../services/utils');
const noteRevisionService = require('../../services/note_revisions');
const tmp = require('tmp');
const fs = require('fs');
const { Readable } = require('stream');
function updateFile(req) {
const {noteId} = req.params;
@@ -73,6 +74,38 @@ function openFile(req, res) {
return downloadNoteFile(noteId, res, false);
}
function fileContentProvider(req) {
// Read file name from route params.
const note = repository.getNote(req.params.noteId);
const fileName = getFilename(note);
let content = note.getContent();
if (typeof content === "string") {
content = Buffer.from(content, 'utf8');
}
const totalSize = content.byteLength;
const mimeType = note.mime;
const getStream = range => {
if (!range) {
// Request if for complete content.
return Readable.from(content);
}
// Partial content request.
const { start, end } = range;
return Readable.from(content.slice(start, end + 1));
}
return {
fileName,
totalSize,
mimeType,
getStream
};
}
function saveToTmpDir(req) {
const noteId = req.params.noteId;
@@ -95,6 +128,7 @@ function saveToTmpDir(req) {
module.exports = {
updateFile,
openFile,
fileContentProvider,
downloadFile,
downloadNoteFile,
saveToTmpDir

View File

@@ -48,6 +48,8 @@ const sql = require('../services/sql');
const protectedSessionService = require('../services/protected_session');
const entityChangesService = require('../services/entity_changes.js');
const csurf = require('csurf');
const {createPartialContentHandler} = require("express-partial-content");
const csrfMiddleware = csurf({
cookie: true,
@@ -175,7 +177,10 @@ function register(app) {
route(PUT, '/api/notes/:noteId/file', [auth.checkApiAuthOrElectron, uploadMiddleware, csrfMiddleware],
filesRoute.updateFile, apiResultHandler);
route(GET, '/api/notes/:noteId/open', [auth.checkApiAuthOrElectron], filesRoute.openFile);
route(GET, '/api/notes/:noteId/open', [auth.checkApiAuthOrElectron],
createPartialContentHandler(filesRoute.fileContentProvider, {
debug: (string, extra) => { console.log(string, extra); }
}));
route(GET, '/api/notes/:noteId/download', [auth.checkApiAuthOrElectron], filesRoute.downloadFile);
// this "hacky" path is used for easier referencing of CSS resources
route(GET, '/api/notes/download/:noteId', [auth.checkApiAuthOrElectron], filesRoute.downloadFile);