X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fvideos%2Findex.ts;h=7f5e74626e401714667d6be9c53d702e04116250;hb=0c948c1659c0a6010f2bf58c402b1c9af192aa5e;hp=552e5edac74c08223a07feb3a3394f5ff4af6713;hpb=07197db4c567f22bbc9c12339062896dc76bac2f;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts index 552e5edac..7f5e74626 100644 --- a/server/controllers/api/videos/index.ts +++ b/server/controllers/api/videos/index.ts @@ -6,7 +6,7 @@ import { retryTransactionWrapper } from '../../../helpers/database-utils' import { getVideoFileResolution } from '../../../helpers/ffmpeg-utils' import { processImage } from '../../../helpers/image-utils' import { logger } from '../../../helpers/logger' -import { createReqFiles, getFormattedObjects, getServerActor, resetSequelizeInstance } from '../../../helpers/utils' +import { getFormattedObjects, getServerActor, resetSequelizeInstance } from '../../../helpers/utils' import { CONFIG, IMAGE_MIMETYPE_EXT, @@ -19,13 +19,19 @@ import { VIDEO_MIMETYPE_EXT, VIDEO_PRIVACIES } from '../../../initializers' -import { fetchRemoteVideoDescription, getVideoActivityPubUrl, shareVideoByServerAndChannel } from '../../../lib/activitypub' +import { + changeVideoChannelShare, + fetchRemoteVideoDescription, + getVideoActivityPubUrl, + shareVideoByServerAndChannel +} from '../../../lib/activitypub' import { sendCreateVideo, sendCreateView, sendUpdateVideo } from '../../../lib/activitypub/send' import { JobQueue } from '../../../lib/job-queue' import { Redis } from '../../../lib/redis' import { asyncMiddleware, authenticate, + optionalAuthenticate, paginationValidator, setDefaultPagination, setDefaultSort, @@ -41,9 +47,11 @@ import { VideoModel } from '../../../models/video/video' import { VideoFileModel } from '../../../models/video/video-file' import { abuseVideoRouter } from './abuse' import { blacklistRouter } from './blacklist' -import { videoChannelRouter } from './channel' import { videoCommentRouter } from './comment' import { rateVideoRouter } from './rate' +import { VideoFilter } from '../../../../shared/models/videos/video-query.type' +import { VideoSortField } from '../../../../client/src/app/shared/video/sort-field.type' +import { isNSFWHidden, createReqFiles } from '../../../helpers/express-utils' const videosRouter = express.Router() @@ -68,7 +76,6 @@ const reqVideoFileUpdate = createReqFiles( videosRouter.use('/', abuseVideoRouter) videosRouter.use('/', blacklistRouter) videosRouter.use('/', rateVideoRouter) -videosRouter.use('/', videoChannelRouter) videosRouter.use('/', videoCommentRouter) videosRouter.get('/categories', listVideoCategories) @@ -81,6 +88,7 @@ videosRouter.get('/', videosSortValidator, setDefaultSort, setDefaultPagination, + optionalAuthenticate, asyncMiddleware(listVideos) ) videosRouter.get('/search', @@ -89,6 +97,7 @@ videosRouter.get('/search', videosSortValidator, setDefaultSort, setDefaultPagination, + optionalAuthenticate, asyncMiddleware(searchVideos) ) videosRouter.put('/:id', @@ -235,7 +244,7 @@ async function addVideo (req: express.Request, res: express.Response, videoPhysi video.VideoFiles = [ videoFile ] - if (videoInfo.tags) { + if (videoInfo.tags !== undefined) { const tagInstances = await TagModel.findOrCreateTags(videoInfo.tags, t) await video.$set('Tags', tagInstances, sequelizeOptions) @@ -258,7 +267,8 @@ async function addVideo (req: express.Request, res: express.Response, videoPhysi if (CONFIG.TRANSCODING.ENABLED === true) { // Put uuid because we don't have id auto incremented for now const dataInput = { - videoUUID: videoCreated.uuid + videoUUID: videoCreated.uuid, + isNewVideo: true } await JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput }) @@ -301,31 +311,46 @@ async function updateVideo (req: express.Request, res: express.Response) { const sequelizeOptions = { transaction: t } + const oldVideoChannel = videoInstance.VideoChannel if (videoInfoToUpdate.name !== undefined) videoInstance.set('name', videoInfoToUpdate.name) if (videoInfoToUpdate.category !== undefined) videoInstance.set('category', videoInfoToUpdate.category) if (videoInfoToUpdate.licence !== undefined) videoInstance.set('licence', videoInfoToUpdate.licence) if (videoInfoToUpdate.language !== undefined) videoInstance.set('language', videoInfoToUpdate.language) if (videoInfoToUpdate.nsfw !== undefined) videoInstance.set('nsfw', videoInfoToUpdate.nsfw) - if (videoInfoToUpdate.privacy !== undefined) videoInstance.set('privacy', parseInt(videoInfoToUpdate.privacy.toString(), 10)) if (videoInfoToUpdate.support !== undefined) videoInstance.set('support', videoInfoToUpdate.support) if (videoInfoToUpdate.description !== undefined) videoInstance.set('description', videoInfoToUpdate.description) if (videoInfoToUpdate.commentsEnabled !== undefined) videoInstance.set('commentsEnabled', videoInfoToUpdate.commentsEnabled) + if (videoInfoToUpdate.privacy !== undefined) { + const newPrivacy = parseInt(videoInfoToUpdate.privacy.toString(), 10) + videoInstance.set('privacy', newPrivacy) + + if (wasPrivateVideo === true && newPrivacy !== VideoPrivacy.PRIVATE) { + videoInstance.set('publishedAt', new Date()) + } + } const videoInstanceUpdated = await videoInstance.save(sequelizeOptions) - if (videoInfoToUpdate.tags) { + // Video tags update? + if (videoInfoToUpdate.tags !== undefined) { const tagInstances = await TagModel.findOrCreateTags(videoInfoToUpdate.tags, t) - await videoInstance.$set('Tags', tagInstances, sequelizeOptions) - videoInstance.Tags = tagInstances + await videoInstanceUpdated.$set('Tags', tagInstances, sequelizeOptions) + videoInstanceUpdated.Tags = tagInstances } - // Now we'll update the video's meta data to our friends - if (wasPrivateVideo === false) { - await sendUpdateVideo(videoInstanceUpdated, t) + // Video channel update? + if (res.locals.videoChannel && videoInstanceUpdated.channelId !== res.locals.videoChannel.id) { + await videoInstanceUpdated.$set('VideoChannel', res.locals.videoChannel, { transaction: t }) + videoInstance.VideoChannel = res.locals.videoChannel + + if (wasPrivateVideo === false) await changeVideoChannelShare(videoInstanceUpdated, oldVideoChannel, t) } + // Now we'll update the video's meta data to our friends + if (wasPrivateVideo === false) await sendUpdateVideo(videoInstanceUpdated, t) + // Video is not private anymore, send a create action to remote servers if (wasPrivateVideo === true && videoInstanceUpdated.privacy !== VideoPrivacy.PRIVATE) { await sendCreateVideo(videoInstanceUpdated, t) @@ -384,7 +409,14 @@ async function getVideoDescription (req: express.Request, res: express.Response) } async function listVideos (req: express.Request, res: express.Response, next: express.NextFunction) { - const resultList = await VideoModel.listForApi(req.query.start, req.query.count, req.query.sort, req.query.filter) + const resultList = await VideoModel.listForApi({ + start: req.query.start, + count: req.query.count, + sort: req.query.sort, + hideNSFW: isNSFWHidden(res), + filter: req.query.filter as VideoFilter, + withFiles: false + }) return res.json(getFormattedObjects(resultList.data, resultList.total)) } @@ -411,11 +443,12 @@ async function removeVideo (req: express.Request, res: express.Response) { } async function searchVideos (req: express.Request, res: express.Response, next: express.NextFunction) { - const resultList = await VideoModel.searchAndPopulateAccountAndServerAndTags( - req.query.search, - req.query.start, - req.query.count, - req.query.sort + const resultList = await VideoModel.searchAndPopulateAccountAndServer( + req.query.search as string, + req.query.start as number, + req.query.count as number, + req.query.sort as VideoSortField, + isNSFWHidden(res) ) return res.json(getFormattedObjects(resultList.data, resultList.total))