diff options
Diffstat (limited to 'server/controllers/static.ts')
-rw-r--r-- | server/controllers/static.ts | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/server/controllers/static.ts b/server/controllers/static.ts index 0f4772310..06123518f 100644 --- a/server/controllers/static.ts +++ b/server/controllers/static.ts | |||
@@ -19,6 +19,9 @@ import { join } from 'path' | |||
19 | import { root } from '../helpers/core-utils' | 19 | import { root } from '../helpers/core-utils' |
20 | import { CONFIG } from '../initializers/config' | 20 | import { CONFIG } from '../initializers/config' |
21 | import { getPreview, getVideoCaption } from './lazy-static' | 21 | import { getPreview, getVideoCaption } from './lazy-static' |
22 | import { VideoStreamingPlaylistType } from '@shared/models/videos/video-streaming-playlist.type' | ||
23 | import { MVideoFile, MVideoFullLight } from '@server/typings/models' | ||
24 | import { getTorrentFilePath, getVideoFilePath } from '@server/lib/video-paths' | ||
22 | 25 | ||
23 | const staticRouter = express.Router() | 26 | const staticRouter = express.Router() |
24 | 27 | ||
@@ -39,6 +42,11 @@ staticRouter.use( | |||
39 | asyncMiddleware(videosGetValidator), | 42 | asyncMiddleware(videosGetValidator), |
40 | asyncMiddleware(downloadTorrent) | 43 | asyncMiddleware(downloadTorrent) |
41 | ) | 44 | ) |
45 | staticRouter.use( | ||
46 | STATIC_DOWNLOAD_PATHS.TORRENTS + ':id-:resolution([0-9]+)-hls.torrent', | ||
47 | asyncMiddleware(videosGetValidator), | ||
48 | asyncMiddleware(downloadHLSVideoFileTorrent) | ||
49 | ) | ||
42 | 50 | ||
43 | // Videos path for webseeding | 51 | // Videos path for webseeding |
44 | staticRouter.use( | 52 | staticRouter.use( |
@@ -58,6 +66,12 @@ staticRouter.use( | |||
58 | asyncMiddleware(downloadVideoFile) | 66 | asyncMiddleware(downloadVideoFile) |
59 | ) | 67 | ) |
60 | 68 | ||
69 | staticRouter.use( | ||
70 | STATIC_DOWNLOAD_PATHS.HLS_VIDEOS + ':id-:resolution([0-9]+).:extension', | ||
71 | asyncMiddleware(videosGetValidator), | ||
72 | asyncMiddleware(downloadHLSVideoFile) | ||
73 | ) | ||
74 | |||
61 | // HLS | 75 | // HLS |
62 | staticRouter.use( | 76 | staticRouter.use( |
63 | STATIC_PATHS.STREAMING_PLAYLISTS.HLS, | 77 | STATIC_PATHS.STREAMING_PLAYLISTS.HLS, |
@@ -227,24 +241,55 @@ async function generateNodeinfo (req: express.Request, res: express.Response) { | |||
227 | } | 241 | } |
228 | 242 | ||
229 | async function downloadTorrent (req: express.Request, res: express.Response) { | 243 | async function downloadTorrent (req: express.Request, res: express.Response) { |
230 | const { video, videoFile } = getVideoAndFile(req, res) | 244 | const video = res.locals.videoAll |
245 | |||
246 | const videoFile = getVideoFile(req, video.VideoFiles) | ||
247 | if (!videoFile) return res.status(404).end() | ||
248 | |||
249 | return res.download(getTorrentFilePath(video, videoFile), `${video.name}-${videoFile.resolution}p.torrent`) | ||
250 | } | ||
251 | |||
252 | async function downloadHLSVideoFileTorrent (req: express.Request, res: express.Response) { | ||
253 | const video = res.locals.videoAll | ||
254 | |||
255 | const playlist = getHLSPlaylist(video) | ||
256 | if (!playlist) return res.status(404).end | ||
257 | |||
258 | const videoFile = getVideoFile(req, playlist.VideoFiles) | ||
231 | if (!videoFile) return res.status(404).end() | 259 | if (!videoFile) return res.status(404).end() |
232 | 260 | ||
233 | return res.download(video.getTorrentFilePath(videoFile), `${video.name}-${videoFile.resolution}p.torrent`) | 261 | return res.download(getTorrentFilePath(playlist, videoFile), `${video.name}-${videoFile.resolution}p-hls.torrent`) |
234 | } | 262 | } |
235 | 263 | ||
236 | async function downloadVideoFile (req: express.Request, res: express.Response) { | 264 | async function downloadVideoFile (req: express.Request, res: express.Response) { |
237 | const { video, videoFile } = getVideoAndFile(req, res) | 265 | const video = res.locals.videoAll |
266 | |||
267 | const videoFile = getVideoFile(req, video.VideoFiles) | ||
238 | if (!videoFile) return res.status(404).end() | 268 | if (!videoFile) return res.status(404).end() |
239 | 269 | ||
240 | return res.download(video.getVideoFilePath(videoFile), `${video.name}-${videoFile.resolution}p${videoFile.extname}`) | 270 | return res.download(getVideoFilePath(video, videoFile), `${video.name}-${videoFile.resolution}p${videoFile.extname}`) |
241 | } | 271 | } |
242 | 272 | ||
243 | function getVideoAndFile (req: express.Request, res: express.Response) { | 273 | async function downloadHLSVideoFile (req: express.Request, res: express.Response) { |
244 | const resolution = parseInt(req.params.resolution, 10) | ||
245 | const video = res.locals.videoAll | 274 | const video = res.locals.videoAll |
275 | const playlist = getHLSPlaylist(video) | ||
276 | if (!playlist) return res.status(404).end | ||
277 | |||
278 | const videoFile = getVideoFile(req, playlist.VideoFiles) | ||
279 | if (!videoFile) return res.status(404).end() | ||
280 | |||
281 | const filename = `${video.name}-${videoFile.resolution}p-${playlist.getStringType()}${videoFile.extname}` | ||
282 | return res.download(getVideoFilePath(playlist, videoFile), filename) | ||
283 | } | ||
284 | |||
285 | function getVideoFile (req: express.Request, files: MVideoFile[]) { | ||
286 | const resolution = parseInt(req.params.resolution, 10) | ||
287 | return files.find(f => f.resolution === resolution) | ||
288 | } | ||
246 | 289 | ||
247 | const videoFile = video.VideoFiles.find(f => f.resolution === resolution) | 290 | function getHLSPlaylist (video: MVideoFullLight) { |
291 | const playlist = video.VideoStreamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS) | ||
292 | if (!playlist) return undefined | ||
248 | 293 | ||
249 | return { video, videoFile } | 294 | return Object.assign(playlist, { Video: video }) |
250 | } | 295 | } |