From 1bb4c9ab2e8b3b3022351b33a82a5e527fa5d4d7 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 29 Jul 2022 14:50:41 +0200 Subject: Add ability to delete a specific video file --- server/controllers/api/videos/files.ts | 62 +++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 13 deletions(-) (limited to 'server/controllers/api') diff --git a/server/controllers/api/videos/files.ts b/server/controllers/api/videos/files.ts index 0fbda280e..6d9c0b843 100644 --- a/server/controllers/api/videos/files.ts +++ b/server/controllers/api/videos/files.ts @@ -2,6 +2,7 @@ import express from 'express' import toInt from 'validator/lib/toInt' import { logger, loggerTagsFactory } from '@server/helpers/logger' import { federateVideoIfNeeded } from '@server/lib/activitypub/videos' +import { removeAllWebTorrentFiles, removeHLSFile, removeHLSPlaylist, removeWebTorrentFile } from '@server/lib/video-file' import { VideoFileModel } from '@server/models/video/video-file' import { HttpStatusCode, UserRight } from '@shared/models' import { @@ -9,10 +10,13 @@ import { authenticate, ensureUserHasRight, videoFileMetadataGetValidator, + videoFilesDeleteHLSFileValidator, videoFilesDeleteHLSValidator, + videoFilesDeleteWebTorrentFileValidator, videoFilesDeleteWebTorrentValidator, videosGetValidator } from '../../../middlewares' +import { updatePlaylistAfterFileChange } from '@server/lib/hls' const lTags = loggerTagsFactory('api', 'video') const filesRouter = express.Router() @@ -27,14 +31,26 @@ filesRouter.delete('/:id/hls', authenticate, ensureUserHasRight(UserRight.MANAGE_VIDEO_FILES), asyncMiddleware(videoFilesDeleteHLSValidator), - asyncMiddleware(removeHLSPlaylist) + asyncMiddleware(removeHLSPlaylistController) +) +filesRouter.delete('/:id/hls/:videoFileId', + authenticate, + ensureUserHasRight(UserRight.MANAGE_VIDEO_FILES), + asyncMiddleware(videoFilesDeleteHLSFileValidator), + asyncMiddleware(removeHLSFileController) ) filesRouter.delete('/:id/webtorrent', authenticate, ensureUserHasRight(UserRight.MANAGE_VIDEO_FILES), asyncMiddleware(videoFilesDeleteWebTorrentValidator), - asyncMiddleware(removeWebTorrentFiles) + asyncMiddleware(removeAllWebTorrentFilesController) +) +filesRouter.delete('/:id/webtorrent/:videoFileId', + authenticate, + ensureUserHasRight(UserRight.MANAGE_VIDEO_FILES), + asyncMiddleware(videoFilesDeleteWebTorrentFileValidator), + asyncMiddleware(removeWebTorrentFileController) ) // --------------------------------------------------------------------------- @@ -51,33 +67,53 @@ async function getVideoFileMetadata (req: express.Request, res: express.Response return res.json(videoFile.metadata) } -async function removeHLSPlaylist (req: express.Request, res: express.Response) { +// --------------------------------------------------------------------------- + +async function removeHLSPlaylistController (req: express.Request, res: express.Response) { const video = res.locals.videoAll logger.info('Deleting HLS playlist of %s.', video.url, lTags(video.uuid)) + await removeHLSPlaylist(video) + + await federateVideoIfNeeded(video, false, undefined) + + return res.sendStatus(HttpStatusCode.NO_CONTENT_204) +} + +async function removeHLSFileController (req: express.Request, res: express.Response) { + const video = res.locals.videoAll + const videoFileId = +req.params.videoFileId - const hls = video.getHLSPlaylist() - await video.removeStreamingPlaylistFiles(hls) - await hls.destroy() + logger.info('Deleting HLS file %d of %s.', videoFileId, video.url, lTags(video.uuid)) - video.VideoStreamingPlaylists = video.VideoStreamingPlaylists.filter(p => p.id !== hls.id) + const playlist = await removeHLSFile(video, videoFileId) + if (playlist) await updatePlaylistAfterFileChange(video, playlist) await federateVideoIfNeeded(video, false, undefined) return res.sendStatus(HttpStatusCode.NO_CONTENT_204) } -async function removeWebTorrentFiles (req: express.Request, res: express.Response) { +// --------------------------------------------------------------------------- + +async function removeAllWebTorrentFilesController (req: express.Request, res: express.Response) { const video = res.locals.videoAll logger.info('Deleting WebTorrent files of %s.', video.url, lTags(video.uuid)) - for (const file of video.VideoFiles) { - await video.removeWebTorrentFileAndTorrent(file) - await file.destroy() - } + await removeAllWebTorrentFiles(video) + await federateVideoIfNeeded(video, false, undefined) + + return res.sendStatus(HttpStatusCode.NO_CONTENT_204) +} + +async function removeWebTorrentFileController (req: express.Request, res: express.Response) { + const video = res.locals.videoAll + + const videoFileId = +req.params.videoFileId + logger.info('Deleting WebTorrent file %d of %s.', videoFileId, video.url, lTags(video.uuid)) - video.VideoFiles = [] + await removeWebTorrentFile(video, videoFileId) await federateVideoIfNeeded(video, false, undefined) return res.sendStatus(HttpStatusCode.NO_CONTENT_204) -- cgit v1.2.3