aboutsummaryrefslogblamecommitdiffhomepage
path: root/server/controllers/api/videos/files.ts
blob: 67b60ff639855ff54678e45aff773f29a72893f1 (plain) (tree)
1
2
3
4
5
6
7
8



                                                                      

                                                                                                                     
                                                                
                                                          


                  
                     
                                
                                   
                               

                                        
                    





                                               
                                      





                                                 
                                                   
                                                






                                                    

 

                                                                            
               
                                                   

                                                     
 

                                                                                                      

                                                   

                                                         















                                                                                        


                                                                                          


                                                                           









                                                                                      
 
                                                                                       
 

                                                                    





                                                      

                                                                              
                                                                                               

                                   
                                                                              
 
                                     




                                                      
                                                                                           


                                             
                                                                                             
 
                                              



                                                      
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 { updatePlaylistAfterFileChange } from '@server/lib/hls'
import { removeAllWebVideoFiles, removeHLSFile, removeHLSPlaylist, removeWebVideoFile } from '@server/lib/video-file'
import { VideoFileModel } from '@server/models/video/video-file'
import { HttpStatusCode, UserRight } from '@shared/models'
import {
  asyncMiddleware,
  authenticate,
  ensureUserHasRight,
  videoFileMetadataGetValidator,
  videoFilesDeleteHLSFileValidator,
  videoFilesDeleteHLSValidator,
  videoFilesDeleteWebVideoFileValidator,
  videoFilesDeleteWebVideoValidator,
  videosGetValidator
} from '../../../middlewares'

const lTags = loggerTagsFactory('api', 'video')
const filesRouter = express.Router()

filesRouter.get('/:id/metadata/:videoFileId',
  asyncMiddleware(videosGetValidator),
  asyncMiddleware(videoFileMetadataGetValidator),
  asyncMiddleware(getVideoFileMetadata)
)

filesRouter.delete('/:id/hls',
  authenticate,
  ensureUserHasRight(UserRight.MANAGE_VIDEO_FILES),
  asyncMiddleware(videoFilesDeleteHLSValidator),
  asyncMiddleware(removeHLSPlaylistController)
)
filesRouter.delete('/:id/hls/:videoFileId',
  authenticate,
  ensureUserHasRight(UserRight.MANAGE_VIDEO_FILES),
  asyncMiddleware(videoFilesDeleteHLSFileValidator),
  asyncMiddleware(removeHLSFileController)
)

filesRouter.delete(
  [ '/:id/webtorrent', '/:id/web-videos' ], // TODO: remove webtorrent in V7
  authenticate,
  ensureUserHasRight(UserRight.MANAGE_VIDEO_FILES),
  asyncMiddleware(videoFilesDeleteWebVideoValidator),
  asyncMiddleware(removeAllWebVideoFilesController)
)
filesRouter.delete(
  [ '/:id/webtorrent/:videoFileId', '/:id/web-videos/:videoFileId' ], // TODO: remove webtorrent in V7
  authenticate,
  ensureUserHasRight(UserRight.MANAGE_VIDEO_FILES),
  asyncMiddleware(videoFilesDeleteWebVideoFileValidator),
  asyncMiddleware(removeWebVideoFileController)
)

// ---------------------------------------------------------------------------

export {
  filesRouter
}

// ---------------------------------------------------------------------------

async function getVideoFileMetadata (req: express.Request, res: express.Response) {
  const videoFile = await VideoFileModel.loadWithMetadata(toInt(req.params.videoFileId))

  return res.json(videoFile.metadata)
}

// ---------------------------------------------------------------------------

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

  logger.info('Deleting HLS file %d of %s.', videoFileId, video.url, lTags(video.uuid))

  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 removeAllWebVideoFilesController (req: express.Request, res: express.Response) {
  const video = res.locals.videoAll

  logger.info('Deleting Web Video files of %s.', video.url, lTags(video.uuid))

  await removeAllWebVideoFiles(video)
  await federateVideoIfNeeded(video, false, undefined)

  return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
}

async function removeWebVideoFileController (req: express.Request, res: express.Response) {
  const video = res.locals.videoAll

  const videoFileId = +req.params.videoFileId
  logger.info('Deleting Web Video file %d of %s.', videoFileId, video.url, lTags(video.uuid))

  await removeWebVideoFile(video, videoFileId)
  await federateVideoIfNeeded(video, false, undefined)

  return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
}