]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/server-commands/videos/streaming-playlists-command.ts
Bumped to version v5.2.1
[github/Chocobozzz/PeerTube.git] / shared / server-commands / videos / streaming-playlists-command.ts
CommitLineData
34aa316f 1import { wait } from '@shared/core-utils'
c0e8b12e 2import { HttpStatusCode } from '@shared/models'
34aa316f 3import { unwrapBody, unwrapBodyOrDecodeToJSON, unwrapTextOrDecode } from '../requests'
57f879a5
C
4import { AbstractCommand, OverrideCommandOptions } from '../shared'
5
6export class StreamingPlaylistsCommand extends AbstractCommand {
7
34aa316f 8 async get (options: OverrideCommandOptions & {
57f879a5 9 url: string
71e3e879
C
10
11 videoFileToken?: string
12 reinjectVideoFileToken?: boolean
13
34aa316f
C
14 withRetry?: boolean // default false
15 currentRetry?: number
d102de1b 16 }): Promise<string> {
261dac40 17 const { videoFileToken, reinjectVideoFileToken, expectedStatus, withRetry = false, currentRetry = 1 } = options
57f879a5 18
34aa316f
C
19 try {
20 const result = await unwrapTextOrDecode(this.getRawRequest({
21 ...options,
22
23 url: options.url,
71e3e879
C
24 query: {
25 videoFileToken,
26 reinjectVideoFileToken
27 },
34aa316f
C
28 implicitToken: false,
29 defaultExpectedStatus: HttpStatusCode.OK_200
30 }))
31
261dac40
C
32 // master.m3u8 could be empty
33 if (!result && (!expectedStatus || expectedStatus === HttpStatusCode.OK_200)) {
34 throw new Error('Empty result')
35 }
36
34aa316f
C
37 return result
38 } catch (err) {
a63943fe 39 if (!withRetry || currentRetry > 10) throw err
34aa316f 40
c106db14 41 await wait(250)
34aa316f
C
42
43 return this.get({
44 ...options,
45
46 withRetry,
47 currentRetry: currentRetry + 1
48 })
49 }
57f879a5
C
50 }
51
5170f492 52 async getFragmentedSegment (options: OverrideCommandOptions & {
57f879a5
C
53 url: string
54 range?: string
5170f492
C
55
56 withRetry?: boolean // default false
57 currentRetry?: number
57f879a5 58 }) {
644391be 59 const { withRetry = false, currentRetry = 1 } = options
5170f492
C
60
61 try {
62 const result = await unwrapBody<Buffer>(this.getRawRequest({
63 ...options,
64
65 url: options.url,
66 range: options.range,
67 implicitToken: false,
68 responseType: 'application/octet-stream',
69 defaultExpectedStatus: HttpStatusCode.OK_200
70 }))
71
72 return result
73 } catch (err) {
a63943fe 74 if (!withRetry || currentRetry > 10) throw err
5170f492 75
c106db14 76 await wait(250)
5170f492
C
77
78 return this.getFragmentedSegment({
79 ...options,
80
81 withRetry,
82 currentRetry: currentRetry + 1
83 })
84 }
57f879a5
C
85 }
86
5170f492 87 async getSegmentSha256 (options: OverrideCommandOptions & {
57f879a5 88 url: string
5170f492
C
89
90 withRetry?: boolean // default false
91 currentRetry?: number
57f879a5 92 }) {
644391be 93 const { withRetry = false, currentRetry = 1 } = options
5170f492
C
94
95 try {
96 const result = await unwrapBodyOrDecodeToJSON<{ [ id: string ]: string }>(this.getRawRequest({
97 ...options,
98
99 url: options.url,
100 contentType: 'application/json',
101 implicitToken: false,
102 defaultExpectedStatus: HttpStatusCode.OK_200
103 }))
104
105 return result
106 } catch (err) {
a63943fe 107 if (!withRetry || currentRetry > 10) throw err
5170f492 108
c106db14 109 await wait(250)
5170f492
C
110
111 return this.getSegmentSha256({
112 ...options,
113
114 withRetry,
115 currentRetry: currentRetry + 1
116 })
117 }
57f879a5
C
118 }
119}