1 import cors from 'cors'
2 import express from 'express'
3 import { OBJECT_STORAGE_PROXY_PATHS } from '@server/initializers/constants'
4 import { getHLSFileReadStream, getWebTorrentFileReadStream } from '@server/lib/object-storage'
7 ensureCanAccessPrivateVideoHLSFiles,
8 ensureCanAccessVideoPrivateWebTorrentFiles,
10 } from '@server/middlewares'
11 import { HttpStatusCode } from '@shared/models'
13 const objectStorageProxyRouter = express.Router()
15 objectStorageProxyRouter.use(cors())
17 objectStorageProxyRouter.get(OBJECT_STORAGE_PROXY_PATHS.PRIVATE_WEBSEED + ':filename',
19 asyncMiddleware(ensureCanAccessVideoPrivateWebTorrentFiles),
20 asyncMiddleware(proxifyWebTorrent)
23 objectStorageProxyRouter.get(OBJECT_STORAGE_PROXY_PATHS.STREAMING_PLAYLISTS.PRIVATE_HLS + ':videoUUID/:filename',
25 asyncMiddleware(ensureCanAccessPrivateVideoHLSFiles),
26 asyncMiddleware(proxifyHLS)
29 // ---------------------------------------------------------------------------
32 objectStorageProxyRouter
35 async function proxifyWebTorrent (req: express.Request, res: express.Response) {
36 const filename = req.params.filename
39 const stream = await getWebTorrentFileReadStream({
41 rangeHeader: req.header('range')
44 return stream.pipe(res)
46 return handleObjectStorageFailure(res, err)
50 async function proxifyHLS (req: express.Request, res: express.Response) {
51 const playlist = res.locals.videoStreamingPlaylist
52 const video = res.locals.onlyVideo
53 const filename = req.params.filename
56 const stream = await getHLSFileReadStream({
57 playlist: playlist.withVideo(video),
59 rangeHeader: req.header('range')
62 return stream.pipe(res)
64 return handleObjectStorageFailure(res, err)
68 function handleObjectStorageFailure (res: express.Response, err: Error) {
69 if (err.name === 'NoSuchKey') {
70 return res.sendStatus(HttpStatusCode.NOT_FOUND_404)
74 status: HttpStatusCode.INTERNAL_SERVER_ERROR_500,