@@ -295,13 +295,14 @@ export function resolvePullUrlFromExistingStreams(
295
295
296
296
async function resolvePullUrlAndRegion (
297
297
stream : NewStreamPayload ,
298
- ingest : string
298
+ ingest : string ,
299
+ playbackId : string
299
300
) : Promise < { pullUrl : string ; pullRegion : string } > {
300
301
if ( process . env . NODE_ENV === "test" ) {
301
302
return { pullUrl : null , pullRegion : null } ;
302
303
}
303
304
const url = new URL (
304
- pathJoin ( ingest , `hls` , "not-used-playback" , `index.m3u8` )
305
+ pathJoin ( ingest , `hls` , `ingest- ${ playbackId } ` , `index.m3u8` )
305
306
) ;
306
307
const { lat, lon } = stream . pull ?. location ?? { } ;
307
308
if ( lat && lon ) {
@@ -316,23 +317,31 @@ async function resolvePullUrlAndRegion(
316
317
return null ;
317
318
}
318
319
return {
319
- pullUrl : extractUrlFrom ( response . url ) ,
320
- pullRegion : extractRegionFrom ( response . url ) ,
320
+ pullUrl : extractUrlFrom ( response . url , playbackId ) ,
321
+ pullRegion : extractRegionFrom ( response . url , playbackId ) ,
321
322
} ;
322
323
}
323
324
324
325
// Extracts Mist URL from redirected node URL, e.g. "https://sto-prod-catalyst-0.lp-playback.studio:443/hls/video+" from "https://sto-prod-catalyst-0.lp-playback.studio:443/hls/video+foo/index.m3u8"
325
- export function extractUrlFrom ( playbackUrl : string ) : string {
326
- const hostRegex =
327
- / ( h t t p s ? : \/ \/ .+ - \w + - c a t a l y s t .+ \/ h l s \/ .+ ) n o t - u s e d - p l a y b a c k \/ i n d e x .m 3 u 8 / ;
326
+ export function extractUrlFrom (
327
+ playbackUrl : string ,
328
+ playbackId : string
329
+ ) : string {
330
+ const hostRegex = new RegExp (
331
+ `(https?:\/\/.+-\\w+-catalyst.+\/hls\/.+)ingest-${ playbackId } \/index.m3u8`
332
+ ) ;
328
333
const matches = playbackUrl . match ( hostRegex ) ;
329
334
return matches ? matches [ 1 ] : null ;
330
335
}
331
336
332
337
// Extracts region from redirected node URL, e.g. "sto" from "https://sto-prod-catalyst-0.lp-playback.studio:443/hls/video+foo/index.m3u8"
333
- export function extractRegionFrom ( playbackUrl : string ) : string {
334
- const regionRegex =
335
- / h t t p s ? : \/ \/ ( .+ ) - \w + - c a t a l y s t .+ n o t - u s e d - p l a y b a c k \/ i n d e x .m 3 u 8 / ;
338
+ export function extractRegionFrom (
339
+ playbackUrl : string ,
340
+ playbackId : string
341
+ ) : string {
342
+ const regionRegex = new RegExp (
343
+ `https?:\/\/(.+)-\\w+-catalyst.+ingest-${ playbackId } \/index.m3u8`
344
+ ) ;
336
345
const matches = playbackUrl . match ( regionRegex ) ;
337
346
return matches ? matches [ 1 ] : null ;
338
347
}
@@ -1177,20 +1186,32 @@ app.put(
1177
1186
const streamExisted = streams . length === 1 ;
1178
1187
1179
1188
const ingest = await getIngestBase ( req ) ;
1180
- const { pullUrl, pullRegion } =
1181
- resolvePullUrlFromExistingStreams ( streams ) ||
1182
- ( await resolvePullUrlAndRegion ( rawPayload , ingest ) ) ;
1189
+ let streamPullUrl : string ;
1183
1190
1184
1191
let stream : DBStream ;
1185
1192
if ( ! streamExisted ) {
1186
1193
logger . info (
1187
1194
`pull request creating a new stream with name=${ rawPayload . name } `
1188
1195
) ;
1189
1196
stream = await handleCreateStream ( req , payload ) ;
1197
+ const { pullUrl, pullRegion } = await resolvePullUrlAndRegion (
1198
+ rawPayload ,
1199
+ ingest ,
1200
+ stream . playbackId
1201
+ ) ;
1202
+ streamPullUrl = pullUrl ;
1190
1203
stream . pullRegion = pullRegion ;
1191
1204
await db . stream . replace ( stream ) ;
1192
1205
} else {
1193
1206
const oldStream = streams [ 0 ] ;
1207
+ const { pullUrl, pullRegion } =
1208
+ resolvePullUrlFromExistingStreams ( streams ) ||
1209
+ ( await resolvePullUrlAndRegion (
1210
+ rawPayload ,
1211
+ ingest ,
1212
+ oldStream . playbackId
1213
+ ) ) ;
1214
+ streamPullUrl = pullUrl ;
1194
1215
logger . info (
1195
1216
`pull reusing existing old stream with id=${ oldStream . id } name=${ oldStream . name } `
1196
1217
) ;
@@ -1222,8 +1243,8 @@ app.put(
1222
1243
}
1223
1244
1224
1245
// If pullHost was resolved, then stick to that host for triggering Catalyst pull start
1225
- const playbackUrl = pullUrl
1226
- ? pathJoin ( pullUrl + stream . playbackId , `index.m3u8` )
1246
+ const playbackUrl = streamPullUrl
1247
+ ? pathJoin ( streamPullUrl + stream . playbackId , `index.m3u8` )
1227
1248
: getHLSPlaybackUrl ( ingest , stream ) ;
1228
1249
if ( ! stream . isActive || streamExisted ) {
1229
1250
await triggerCatalystPullStart ( stream , playbackUrl ) ;
0 commit comments