@@ -11,3 +11,229 @@ for (const {name, m3u8, object} of fixtures) {
11
11
t . is ( result , utils . stripCommentsAndEmptyLines ( m3u8 ) ) ;
12
12
} ) ;
13
13
}
14
+
15
+ test ( 'stringify.postProcess.segment.add' , t => {
16
+ const obj = HLS . parse ( `
17
+ #EXTM3U
18
+ #EXT-X-VERSION:3
19
+ #EXT-X-TARGETDURATION:6
20
+ #EXTINF:6.006,
21
+ http://media.example.com/01.ts
22
+ #EXTINF:6.006,
23
+ http://media.example.com/02.ts
24
+ #EXTINF:6.006,
25
+ http://ads.example.com/ad-01.ts
26
+ #EXTINF:6.006,
27
+ http://ads.example.com/ad-02.ts
28
+ #EXTINF:6.006,
29
+ http://media.example.com/03.ts
30
+ #EXTINF:3.003,
31
+ http://media.example.com/04.ts
32
+ ` ) ;
33
+ const expected = `
34
+ #EXTM3U
35
+ #EXT-X-VERSION:3
36
+ #EXT-X-TARGETDURATION:6
37
+ #EXT-X-MY-PROGRAM-DATE-TIME:2014-03-05T11:14:00.000Z
38
+ #EXTINF:6.006,
39
+ http://media.example.com/01.ts
40
+ #EXT-X-MY-PROGRAM-DATE-TIME:2014-03-05T11:14:06.006Z
41
+ #EXTINF:6.006,
42
+ http://media.example.com/02.ts
43
+ #EXT-X-MY-PROGRAM-DATE-TIME:2014-03-05T11:14:12.012Z
44
+ #EXTINF:6.006,
45
+ http://ads.example.com/ad-01.ts
46
+ #EXT-X-MY-PROGRAM-DATE-TIME:2014-03-05T11:14:18.018Z
47
+ #EXTINF:6.006,
48
+ http://ads.example.com/ad-02.ts
49
+ #EXT-X-MY-PROGRAM-DATE-TIME:2014-03-05T11:14:24.024Z
50
+ #EXTINF:6.006,
51
+ http://media.example.com/03.ts
52
+ #EXT-X-MY-PROGRAM-DATE-TIME:2014-03-05T11:14:30.030Z
53
+ #EXTINF:3.003,
54
+ http://media.example.com/04.ts
55
+ ` ;
56
+ let time = new Date ( '2014-03-05T11:14:00.000Z' ) . getTime ( ) ;
57
+ const segmentProcessor = ( lines , start , end , segment ) => {
58
+ let hasPdt = false ;
59
+ for ( let i = start ; i <= end ; i ++ ) {
60
+ if ( lines [ i ] . startsWith ( '#EXT-X-PROGRAM-DATE-TIME' ) ) {
61
+ hasPdt = true ;
62
+ break ;
63
+ }
64
+ }
65
+ if ( ! hasPdt ) {
66
+ lines . splice ( start , 0 , `#EXT-X-MY-PROGRAM-DATE-TIME:${ new Date ( Math . round ( time ) ) . toISOString ( ) } ` ) ;
67
+ }
68
+ time += segment . duration * 1000 ;
69
+ } ;
70
+ const result = HLS . stringify ( obj , { segmentProcessor} ) ;
71
+ t . is ( result , utils . stripCommentsAndEmptyLines ( expected ) ) ;
72
+ } ) ;
73
+
74
+ test ( 'stringify.postProcess.segment.delete' , t => {
75
+ const obj = HLS . parse ( `
76
+ #EXTM3U
77
+ #EXT-X-VERSION:3
78
+ #EXT-X-TARGETDURATION:6
79
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:00.000Z
80
+ #EXTINF:6.006,
81
+ http://media.example.com/01.ts
82
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:06.006Z
83
+ #EXTINF:6.006,
84
+ http://media.example.com/02.ts
85
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:12.012Z
86
+ #EXT-X-DATERANGE:ID="splice-6FFFFFF0",START-DATE="2014-03-05T11:15:00.000Z",PLANNED-DURATION=59.993,SCTE35-OUT=0xFC002F0000000000FF000014056FFFFFF000E011622DCAFF000052636200000000000A0008029896F50000008700000000
87
+ #EXTINF:6.006,
88
+ http://ads.example.com/ad-01.ts
89
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:18.018Z
90
+ #EXTINF:6.006,
91
+ http://ads.example.com/ad-02.ts
92
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:24.024Z
93
+ #EXT-X-DATERANGE:ID="splice-6FFFFFF0",DURATION=59.993,SCTE35-IN=0xFC002A0000000000FF00000F056FFFFFF000401162802E6100000000000A0008029896F50000008700000000
94
+ #EXTINF:6.006,
95
+ http://media.example.com/03.ts
96
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:30.030Z
97
+ #EXTINF:3.003,
98
+ http://media.example.com/04.ts
99
+ ` ) ;
100
+ const expected = `
101
+ #EXTM3U
102
+ #EXT-X-VERSION:3
103
+ #EXT-X-TARGETDURATION:6
104
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:00.000Z
105
+ #EXTINF:6.006,
106
+ http://media.example.com/01.ts
107
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:06.006Z
108
+ #EXTINF:6.006,
109
+ http://media.example.com/02.ts
110
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:12.012Z
111
+ #EXTINF:6.006,
112
+ http://ads.example.com/ad-01.ts
113
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:18.018Z
114
+ #EXTINF:6.006,
115
+ http://ads.example.com/ad-02.ts
116
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:24.024Z
117
+ #EXTINF:6.006,
118
+ http://media.example.com/03.ts
119
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:30.030Z
120
+ #EXTINF:3.003,
121
+ http://media.example.com/04.ts
122
+ ` ;
123
+ const segmentProcessor = ( lines , start , end ) => {
124
+ for ( let i = start ; i <= end ; i ++ ) {
125
+ const line = lines [ i ] ;
126
+ if ( line . startsWith ( '#EXT-X-DATERANGE' ) ) {
127
+ lines [ i ] = '' ;
128
+ }
129
+ }
130
+ } ;
131
+ const result = HLS . stringify ( obj , { segmentProcessor} ) ;
132
+ t . is ( result , utils . stripCommentsAndEmptyLines ( expected ) ) ;
133
+ } ) ;
134
+
135
+ test ( 'stringify.postProcess.segment.update' , t => {
136
+ const obj = HLS . parse ( `
137
+ #EXTM3U
138
+ #EXT-X-VERSION:3
139
+ #EXT-X-TARGETDURATION:6
140
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:00.000Z
141
+ #EXTINF:6.006,
142
+ http://media.example.com/01.ts
143
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:06.006Z
144
+ #EXTINF:6.006,
145
+ http://media.example.com/02.ts
146
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:12.012Z
147
+ #EXT-X-DATERANGE:ID="splice-6FFFFFF0",START-DATE="2014-03-05T11:15:00.000Z",PLANNED-DURATION=59.993,SCTE35-OUT=0xFC002F0000000000FF000014056FFFFFF000E011622DCAFF000052636200000000000A0008029896F50000008700000000
148
+ #EXTINF:6.006,
149
+ http://ads.example.com/ad-01.ts
150
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:18.018Z
151
+ #EXTINF:6.006,
152
+ http://ads.example.com/ad-02.ts
153
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:24.024Z
154
+ #EXT-X-DATERANGE:ID="splice-6FFFFFF0",DURATION=59.993,SCTE35-IN=0xFC002A0000000000FF00000F056FFFFFF000401162802E6100000000000A0008029896F50000008700000000
155
+ #EXTINF:6.006,
156
+ http://media.example.com/03.ts
157
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:30.030Z
158
+ #EXTINF:3.003,
159
+ http://media.example.com/04.ts
160
+ ` ) ;
161
+ const expected = `
162
+ #EXTM3U
163
+ #EXT-X-VERSION:3
164
+ #EXT-X-TARGETDURATION:6
165
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:00.000Z
166
+ #EXTINF:6.006,
167
+ http://media.example.com/01.ts
168
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:06.006Z
169
+ #EXTINF:6.006,
170
+ http://media.example.com/02.ts
171
+ <b>#EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:12.012Z
172
+ #EXT-X-DATERANGE:ID="splice-6FFFFFF0",START-DATE="2014-03-05T11:15:00.000Z",PLANNED-DURATION=59.993,SCTE35-OUT=0xFC002F0000000000FF000014056FFFFFF000E011622DCAFF000052636200000000000A0008029896F50000008700000000
173
+ #EXTINF:6.006,
174
+ http://ads.example.com/ad-01.ts
175
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:18.018Z
176
+ #EXTINF:6.006,
177
+ http://ads.example.com/ad-02.ts</b>
178
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:24.024Z
179
+ #EXT-X-DATERANGE:ID="splice-6FFFFFF0",DURATION=59.993,SCTE35-IN=0xFC002A0000000000FF00000F056FFFFFF000401162802E6100000000000A0008029896F50000008700000000
180
+ #EXTINF:6.006,
181
+ http://media.example.com/03.ts
182
+ #EXT-X-PROGRAM-DATE-TIME:2014-03-05T11:14:30.030Z
183
+ #EXTINF:3.003,
184
+ http://media.example.com/04.ts
185
+ ` ;
186
+ const segmentProcessor = ( lines , start , end ) => {
187
+ for ( let i = start ; i <= end ; i ++ ) {
188
+ const line = lines [ i ] ;
189
+ if ( line . startsWith ( '#EXT-X-DATERANGE' ) ) {
190
+ if ( line . includes ( 'PLANNED-DURATION' ) ) {
191
+ lines [ start ] = `<b>${ lines [ start ] } ` ;
192
+ } else if ( start > 0 ) {
193
+ lines [ start - 1 ] = `${ lines [ start - 1 ] } </b>` ;
194
+ }
195
+ }
196
+ }
197
+ } ;
198
+ const result = HLS . stringify ( obj , { segmentProcessor} ) ;
199
+ t . is ( result , utils . stripCommentsAndEmptyLines ( expected ) ) ;
200
+ } ) ;
201
+
202
+ test ( 'stringify.postProcess.variant.update' , t => {
203
+ const obj = HLS . parse ( `
204
+ #EXTM3U
205
+ #EXT-X-STREAM-INF:BANDWIDTH=1280000
206
+ http://example.com/low.m3u8
207
+ #EXT-X-STREAM-INF:BANDWIDTH=2560000
208
+ http://example.com/mid.m3u8
209
+ #EXT-X-STREAM-INF:BANDWIDTH=7680000
210
+ http://example.com/hi.m3u8
211
+ ` ) ;
212
+ const expected = `
213
+ #EXTM3U
214
+ #EXT-X-STREAM-INF:BANDWIDTH=1280000,MY-RESOLUTION=1280x720
215
+ http://example.com/low.m3u8
216
+ #EXT-X-STREAM-INF:BANDWIDTH=2560000,MY-RESOLUTION=1920x1080
217
+ http://example.com/mid.m3u8
218
+ #EXT-X-STREAM-INF:BANDWIDTH=7680000,MY-RESOLUTION=3840x2160
219
+ http://example.com/hi.m3u8
220
+ ` ;
221
+ const variantProcessor = ( lines , start , end , { bandwidth} ) => {
222
+ for ( let i = start ; i <= end ; i ++ ) {
223
+ const line = lines [ i ] ;
224
+ if ( line . startsWith ( '#EXT-X-STREAM-INF' ) ) {
225
+ let resolution = '640x360' ;
226
+ if ( bandwidth >= 1000000 && bandwidth < 2000000 ) {
227
+ resolution = '1280x720' ;
228
+ } else if ( bandwidth >= 2000000 && bandwidth < 3000000 ) {
229
+ resolution = '1920x1080' ;
230
+ } else if ( bandwidth >= 3000000 ) {
231
+ resolution = '3840x2160' ;
232
+ }
233
+ lines [ i ] = `${ line } ,MY-RESOLUTION=${ resolution } ` ;
234
+ }
235
+ }
236
+ } ;
237
+ const result = HLS . stringify ( obj , { variantProcessor} ) ;
238
+ t . is ( result , utils . stripCommentsAndEmptyLines ( expected ) ) ;
239
+ } ) ;
0 commit comments