]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/controllers/object-storage-proxy.ts
Remove country limit of 10 items
[github/Chocobozzz/PeerTube.git] / server / controllers / object-storage-proxy.ts
CommitLineData
9ab330b9
C
1import cors from 'cors'
2import express from 'express'
5a122ddd 3import { logger } from '@server/helpers/logger'
9ab330b9
C
4import { OBJECT_STORAGE_PROXY_PATHS } from '@server/initializers/constants'
5import { getHLSFileReadStream, getWebTorrentFileReadStream } from '@server/lib/object-storage'
6import {
7 asyncMiddleware,
8 ensureCanAccessPrivateVideoHLSFiles,
9 ensureCanAccessVideoPrivateWebTorrentFiles,
5a122ddd 10 ensurePrivateObjectStorageProxyIsEnabled,
9ab330b9
C
11 optionalAuthenticate
12} from '@server/middlewares'
13import { HttpStatusCode } from '@shared/models'
14
15const objectStorageProxyRouter = express.Router()
16
17objectStorageProxyRouter.use(cors())
18
19objectStorageProxyRouter.get(OBJECT_STORAGE_PROXY_PATHS.PRIVATE_WEBSEED + ':filename',
5a122ddd 20 ensurePrivateObjectStorageProxyIsEnabled,
9ab330b9
C
21 optionalAuthenticate,
22 asyncMiddleware(ensureCanAccessVideoPrivateWebTorrentFiles),
23 asyncMiddleware(proxifyWebTorrent)
24)
25
26objectStorageProxyRouter.get(OBJECT_STORAGE_PROXY_PATHS.STREAMING_PLAYLISTS.PRIVATE_HLS + ':videoUUID/:filename',
5a122ddd 27 ensurePrivateObjectStorageProxyIsEnabled,
9ab330b9
C
28 optionalAuthenticate,
29 asyncMiddleware(ensureCanAccessPrivateVideoHLSFiles),
30 asyncMiddleware(proxifyHLS)
31)
32
33// ---------------------------------------------------------------------------
34
35export {
36 objectStorageProxyRouter
37}
38
39async function proxifyWebTorrent (req: express.Request, res: express.Response) {
40 const filename = req.params.filename
41
5a122ddd
C
42 logger.debug('Proxifying WebTorrent file %s from object storage.', filename)
43
9ab330b9
C
44 try {
45 const stream = await getWebTorrentFileReadStream({
46 filename,
47 rangeHeader: req.header('range')
48 })
49
50 return stream.pipe(res)
51 } catch (err) {
52 return handleObjectStorageFailure(res, err)
53 }
54}
55
56async function proxifyHLS (req: express.Request, res: express.Response) {
57 const playlist = res.locals.videoStreamingPlaylist
58 const video = res.locals.onlyVideo
59 const filename = req.params.filename
60
5a122ddd
C
61 logger.debug('Proxifying HLS file %s from object storage.', filename)
62
9ab330b9
C
63 try {
64 const stream = await getHLSFileReadStream({
65 playlist: playlist.withVideo(video),
66 filename,
67 rangeHeader: req.header('range')
68 })
69
70 return stream.pipe(res)
71 } catch (err) {
72 return handleObjectStorageFailure(res, err)
73 }
74}
75
76function handleObjectStorageFailure (res: express.Response, err: Error) {
77 if (err.name === 'NoSuchKey') {
78 return res.sendStatus(HttpStatusCode.NOT_FOUND_404)
79 }
80
81 return res.fail({
82 status: HttpStatusCode.INTERNAL_SERVER_ERROR_500,
83 message: err.message,
84 type: err.name
85 })
86}