import express from 'express'
-import toInt from 'validator/lib/toInt'
import { pickCommonVideoQuery } from '@server/helpers/query'
import { doJSONRequest } from '@server/helpers/requests'
-import { VideoViews } from '@server/lib/video-views'
import { openapiOperationDoc } from '@server/middlewares/doc'
import { getServerActor } from '@server/models/application/application'
import { guessAdditionalAttributesFromQuery } from '@server/models/video/formatter/video-format-utils'
import { getFormattedObjects } from '../../../helpers/utils'
import { REMOTE_SCHEME, VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers/constants'
import { sequelizeTypescript } from '../../../initializers/database'
-import { sendView } from '../../../lib/activitypub/send/send-view'
import { JobQueue } from '../../../lib/job-queue'
import { Hooks } from '../../../lib/plugins/hooks'
import {
paginationValidator,
setDefaultPagination,
setDefaultVideosSort,
- videoFileMetadataGetValidator,
videosCustomGetValidator,
videosGetValidator,
videosRemoveValidator,
videosSortValidator
} from '../../../middlewares'
import { VideoModel } from '../../../models/video/video'
-import { VideoFileModel } from '../../../models/video/video-file'
import { blacklistRouter } from './blacklist'
import { videoCaptionsRouter } from './captions'
import { videoCommentRouter } from './comment'
+import { filesRouter } from './files'
import { videoImportsRouter } from './import'
import { liveRouter } from './live'
import { ownershipVideoRouter } from './ownership'
import { rateVideoRouter } from './rate'
+import { statsRouter } from './stats'
+import { studioRouter } from './studio'
+import { transcodingRouter } from './transcoding'
import { updateRouter } from './update'
import { uploadRouter } from './upload'
-import { watchingRouter } from './watching'
+import { viewRouter } from './view'
const auditLogger = auditLoggerFactory('videos')
const videosRouter = express.Router()
videosRouter.use('/', blacklistRouter)
+videosRouter.use('/', statsRouter)
videosRouter.use('/', rateVideoRouter)
videosRouter.use('/', videoCommentRouter)
+videosRouter.use('/', studioRouter)
videosRouter.use('/', videoCaptionsRouter)
videosRouter.use('/', videoImportsRouter)
videosRouter.use('/', ownershipVideoRouter)
-videosRouter.use('/', watchingRouter)
+videosRouter.use('/', viewRouter)
videosRouter.use('/', liveRouter)
videosRouter.use('/', uploadRouter)
videosRouter.use('/', updateRouter)
+videosRouter.use('/', filesRouter)
+videosRouter.use('/', transcodingRouter)
videosRouter.get('/categories',
openapiOperationDoc({ operationId: 'getCategories' }),
asyncMiddleware(videosGetValidator),
asyncMiddleware(getVideoDescription)
)
-videosRouter.get('/:id/metadata/:videoFileId',
- asyncMiddleware(videoFileMetadataGetValidator),
- asyncMiddleware(getVideoFileMetadata)
-)
videosRouter.get('/:id',
openapiOperationDoc({ operationId: 'getVideo' }),
optionalAuthenticate,
asyncMiddleware(checkVideoFollowConstraints),
getVideo
)
-videosRouter.post('/:id/views',
- openapiOperationDoc({ operationId: 'addView' }),
- asyncMiddleware(videosCustomGetValidator('only-video')),
- asyncMiddleware(viewVideo)
-)
videosRouter.delete('/:id',
openapiOperationDoc({ operationId: 'delVideo' }),
return res.json(video.toFormattedDetailsJSON())
}
-async function viewVideo (req: express.Request, res: express.Response) {
- const video = res.locals.onlyVideo
-
- const ip = req.ip
- const success = await VideoViews.Instance.processView({ video, ip })
-
- if (success) {
- const serverActor = await getServerActor()
- await sendView(serverActor, video, undefined)
-
- Hooks.runAction('action:api.video.viewed', { video: video, ip })
- }
-
- return res.status(HttpStatusCode.NO_CONTENT_204).end()
-}
-
async function getVideoDescription (req: express.Request, res: express.Response) {
const videoInstance = res.locals.videoAll
return res.json({ description })
}
-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 listVideos (req: express.Request, res: express.Response) {
const serverActor = await getServerActor()
return res.json(getFormattedObjects(resultList.data, resultList.total, guessAdditionalAttributesFromQuery(query)))
}
-async function removeVideo (_req: express.Request, res: express.Response) {
+async function removeVideo (req: express.Request, res: express.Response) {
const videoInstance = res.locals.videoAll
await sequelizeTypescript.transaction(async t => {
auditLogger.delete(getAuditIdFromRes(res), new VideoAuditView(videoInstance.toFormattedDetailsJSON()))
logger.info('Video with name %s and uuid %s deleted.', videoInstance.name, videoInstance.uuid)
- Hooks.runAction('action:api.video.deleted', { video: videoInstance })
+ Hooks.runAction('action:api.video.deleted', { video: videoInstance, req, res })
return res.type('json')
.status(HttpStatusCode.NO_CONTENT_204)