1 import * as express from 'express'
2 import { buildNSFWFilter } from '../../helpers/express-utils'
3 import { getFormattedObjects } from '../../helpers/utils'
4 import { VideoModel } from '../../models/video/video'
7 commonVideosFiltersValidator,
13 videosSearchSortValidator
14 } from '../../middlewares'
15 import { VideosSearchQuery } from '../../../shared/models/search'
16 import { getOrCreateVideoAndAccountAndChannel } from '../../lib/activitypub'
17 import { logger } from '../../helpers/logger'
18 import { User } from '../../../shared/models/users'
19 import { CONFIG } from '../../initializers/constants'
21 const searchRouter = express.Router()
23 searchRouter.get('/videos',
26 videosSearchSortValidator,
29 commonVideosFiltersValidator,
31 asyncMiddleware(searchVideos)
34 // ---------------------------------------------------------------------------
36 export { searchRouter }
38 // ---------------------------------------------------------------------------
40 function searchVideos (req: express.Request, res: express.Response) {
41 const query: VideosSearchQuery = req.query
42 const search = query.search
43 if (search && (search.startsWith('http://') || search.startsWith('https://'))) {
44 return searchVideoUrl(search, res)
47 return searchVideosDB(query, res)
50 async function searchVideosDB (query: VideosSearchQuery, res: express.Response) {
51 const options = Object.assign(query, {
52 includeLocalVideos: true,
53 nsfw: buildNSFWFilter(res, query.nsfw)
55 const resultList = await VideoModel.searchAndPopulateAccountAndServer(options)
57 return res.json(getFormattedObjects(resultList.data, resultList.total))
60 async function searchVideoUrl (url: string, res: express.Response) {
62 const user: User = res.locals.oauth ? res.locals.oauth.token.User : undefined
64 // Check if we can fetch a remote video with the URL
66 CONFIG.SEARCH.REMOTE_URI.ANONYMOUS === true ||
67 (CONFIG.SEARCH.REMOTE_URI.USERS === true && user !== undefined)
79 const res = await getOrCreateVideoAndAccountAndChannel(url, syncParam)
80 video = res ? res.video : undefined
82 logger.info('Cannot search remote video %s.', url)
85 video = await VideoModel.loadByUrlAndPopulateAccount(url)
90 data: video ? [ video.toFormattedJSON() ] : []