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 { getOrCreateAccountAndVideoAndChannel } from '../../lib/activitypub'
17 import { logger } from '../../helpers/logger'
19 const searchRouter = express.Router()
21 searchRouter.get('/videos',
24 videosSearchSortValidator,
27 commonVideosFiltersValidator,
29 asyncMiddleware(searchVideos)
32 // ---------------------------------------------------------------------------
34 export { searchRouter }
36 // ---------------------------------------------------------------------------
38 function searchVideos (req: express.Request, res: express.Response) {
39 const query: VideosSearchQuery = req.query
40 if (query.search.startsWith('http://') || query.search.startsWith('https://')) {
41 return searchVideoUrl(query.search, res)
44 return searchVideosDB(query, res)
47 async function searchVideosDB (query: VideosSearchQuery, res: express.Response) {
48 const options = Object.assign(query, {
49 includeLocalVideos: true,
50 nsfw: buildNSFWFilter(res, query.nsfw)
52 const resultList = await VideoModel.searchAndPopulateAccountAndServer(options)
54 return res.json(getFormattedObjects(resultList.data, resultList.total))
57 async function searchVideoUrl (url: string, res: express.Response) {
69 const res = await getOrCreateAccountAndVideoAndChannel(url, syncParam)
70 video = res ? res.video : undefined
72 logger.info('Cannot search remote video %s.', url)
77 data: video ? [ video.toFormattedJSON() ] : []