]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/api/videos/files.ts
Put private videos under a specific subdirectory
[github/Chocobozzz/PeerTube.git] / server / controllers / api / videos / files.ts
index a8b32411d5eb31a7f82eec05f69537f9af01671e..6d9c0b843a90c769a01de7367b0ee1b1db2b3357 100644 (file)
@@ -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,14 +10,19 @@ import {
   authenticate,
   ensureUserHasRight,
   videoFileMetadataGetValidator,
+  videoFilesDeleteHLSFileValidator,
   videoFilesDeleteHLSValidator,
-  videoFilesDeleteWebTorrentValidator
+  videoFilesDeleteWebTorrentFileValidator,
+  videoFilesDeleteWebTorrentValidator,
+  videosGetValidator
 } from '../../../middlewares'
+import { updatePlaylistAfterFileChange } from '@server/lib/hls'
 
 const lTags = loggerTagsFactory('api', 'video')
 const filesRouter = express.Router()
 
 filesRouter.get('/:id/metadata/:videoFileId',
+  asyncMiddleware(videosGetValidator),
   asyncMiddleware(videoFileMetadataGetValidator),
   asyncMiddleware(getVideoFileMetadata)
 )
@@ -25,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)
 )
 
 // ---------------------------------------------------------------------------
@@ -49,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)