@@ -178,9 +178,13 @@ export async function CommitIngestOperation(
178
178
// Ensure any adlibbed parts are updated to follow the segmentId of the previous part
179
179
await updateSegmentIdsForAdlibbedPartInstances ( context , ingestModel , beforePartMap )
180
180
181
+ // TODO: This whole section can probably be removed later, it's really unneccessary in the grand scheme of
182
+ // things, it's here only to debug some problems
181
183
if ( data . renamedSegments && data . renamedSegments . size > 0 ) {
182
- logger . debug ( `Renamed segments: ${ JSON . stringify ( Array . from ( data . renamedSegments . entries ( ) ) ) } ` )
184
+ logger . verbose ( `Renamed segments: ${ JSON . stringify ( Array . from ( data . renamedSegments . entries ( ) ) ) } ` )
183
185
}
186
+ // End of temporary section
187
+
184
188
// ensure instances have matching segmentIds with the parts
185
189
await updatePartInstancesSegmentIds ( context , ingestModel , data . renamedSegments , beforePartMap )
186
190
@@ -220,6 +224,8 @@ export async function CommitIngestOperation(
220
224
const pSaveIngest = ingestModel . saveAllToDatabase ( )
221
225
pSaveIngest . catch ( ( ) => null ) // Ensure promise isn't reported as unhandled
222
226
227
+ ensureNextPartInstanceIsNotDeleted ( playoutModel )
228
+
223
229
await validateAdlibTestingSegment ( context , playoutModel )
224
230
225
231
try {
@@ -273,14 +279,18 @@ function canRemoveSegment(
273
279
logger . warn ( `Not allowing removal of previous playing segment "${ segmentId } ", making segment unsynced instead` )
274
280
return false
275
281
}
276
- if (
277
- currentPartInstance ?. segmentId === segmentId ||
278
- ( nextPartInstance ?. segmentId === segmentId && isTooCloseToAutonext ( currentPartInstance , false ) )
279
- ) {
282
+ if ( currentPartInstance ?. segmentId === segmentId ) {
280
283
// Don't allow removing an active rundown
281
284
logger . warn ( `Not allowing removal of current playing segment "${ segmentId } ", making segment unsynced instead` )
282
285
return false
283
286
}
287
+ if ( nextPartInstance ?. segmentId === segmentId && isTooCloseToAutonext ( currentPartInstance , false ) ) {
288
+ // Don't allow removing an active rundown
289
+ logger . warn (
290
+ `Not allowing removal of nexted segment "${ segmentId } ", because it's too close to an auto-next, making segment unsynced instead`
291
+ )
292
+ return false
293
+ }
284
294
285
295
if ( nextPartInstance ?. segmentId === segmentId && nextPartInstance . orphaned === 'adlib-part' ) {
286
296
// Don't allow removing an active rundown
@@ -365,6 +375,8 @@ async function updatePartInstancesSegmentIds(
365
375
366
376
const writeOps : AnyBulkWriteOperation < DBPartInstance > [ ] = [ ]
367
377
378
+ logger . debug ( `updatePartInstancesSegmentIds: renameRules: ${ JSON . stringify ( renameRules ) } ` )
379
+
368
380
for ( const [ newSegmentId , rule ] of rulesInOrder ) {
369
381
if ( rule . fromSegmentIds . length ) {
370
382
writeOps . push ( {
@@ -402,32 +414,24 @@ async function updatePartInstancesSegmentIds(
402
414
if ( writeOps . length ) await context . directCollections . PartInstances . bulkWrite ( writeOps )
403
415
404
416
// Double check that there are no parts using the old segment ids:
405
- const oldSegmentIds = Array . from ( renameRules . keys ( ) )
406
- const [ badPartInstances , badParts ] = await Promise . all ( [
407
- await context . directCollections . PartInstances . findFetch ( {
408
- rundownId : ingestModel . rundownId ,
409
- segmentId : { $in : oldSegmentIds } ,
410
- } ) ,
411
- await context . directCollections . Parts . findFetch ( {
412
- rundownId : ingestModel . rundownId ,
413
- segmentId : { $in : oldSegmentIds } ,
414
- } ) ,
415
- ] )
417
+ // TODO: This whole section can probably be removed later, it's really unneccessary in the grand scheme of
418
+ // things, it's here only to debug some problems
419
+ const oldSegmentIds : SegmentId [ ] = [ ]
420
+ for ( const renameRule of renameRules . values ( ) ) {
421
+ oldSegmentIds . push ( ...renameRule . fromSegmentIds )
422
+ }
423
+ const badPartInstances = await context . directCollections . PartInstances . findFetch ( {
424
+ rundownId : ingestModel . rundownId ,
425
+ segmentId : { $in : oldSegmentIds } ,
426
+ } )
416
427
if ( badPartInstances . length > 0 ) {
417
428
logger . error (
418
429
`updatePartInstancesSegmentIds: Failed to update all PartInstances using old SegmentIds "${ JSON . stringify (
419
430
oldSegmentIds
420
431
) } ": ${ JSON . stringify ( badPartInstances ) } , writeOps: ${ JSON . stringify ( writeOps ) } `
421
432
)
422
433
}
423
-
424
- if ( badParts . length > 0 ) {
425
- logger . error (
426
- `updatePartInstancesSegmentIds: Failed to update all Parts using old SegmentIds "${ JSON . stringify (
427
- oldSegmentIds
428
- ) } ": ${ JSON . stringify ( badParts ) } , writeOps: ${ JSON . stringify ( writeOps ) } `
429
- )
430
- }
434
+ // End of the temporary section
431
435
}
432
436
}
433
437
@@ -662,10 +666,27 @@ async function getSelectedPartInstances(
662
666
} )
663
667
: [ ]
664
668
669
+ const currentPartInstance = instances . find ( ( inst ) => inst . _id === playlist . currentPartInfo ?. partInstanceId )
670
+ const nextPartInstance = instances . find ( ( inst ) => inst . _id === playlist . nextPartInfo ?. partInstanceId )
671
+ const previousPartInstance = instances . find ( ( inst ) => inst . _id === playlist . previousPartInfo ?. partInstanceId )
672
+
673
+ if ( playlist . currentPartInfo ?. partInstanceId && ! currentPartInstance )
674
+ logger . error (
675
+ `playlist.currentPartInfo is set, but PartInstance "${ playlist . currentPartInfo ?. partInstanceId } " was not found!`
676
+ )
677
+ if ( playlist . nextPartInfo ?. partInstanceId && ! nextPartInstance )
678
+ logger . error (
679
+ `playlist.nextPartInfo is set, but PartInstance "${ playlist . nextPartInfo ?. partInstanceId } " was not found!`
680
+ )
681
+ if ( playlist . previousPartInfo ?. partInstanceId && ! previousPartInstance )
682
+ logger . error (
683
+ `playlist.previousPartInfo is set, but PartInstance "${ playlist . previousPartInfo ?. partInstanceId } " was not found!`
684
+ )
685
+
665
686
return {
666
- currentPartInstance : instances . find ( ( inst ) => inst . _id === playlist . currentPartInfo ?. partInstanceId ) ,
667
- nextPartInstance : instances . find ( ( inst ) => inst . _id === playlist . nextPartInfo ?. partInstanceId ) ,
668
- previousPartInstance : instances . find ( ( inst ) => inst . _id === playlist . previousPartInfo ?. partInstanceId ) ,
687
+ currentPartInstance,
688
+ nextPartInstance,
689
+ previousPartInstance,
669
690
}
670
691
}
671
692
@@ -815,6 +836,16 @@ async function removeSegments(
815
836
} )
816
837
}
817
838
for ( const segmentId of purgeSegmentIds ) {
839
+ logger . debug (
840
+ `IngestModel: Removing segment "${ segmentId } " (` +
841
+ `previousPartInfo?.partInstanceId: ${ newPlaylist . previousPartInfo ?. partInstanceId } ,` +
842
+ `currentPartInfo?.partInstanceId: ${ newPlaylist . currentPartInfo ?. partInstanceId } ,` +
843
+ `nextPartInfo?.partInstanceId: ${ newPlaylist . nextPartInfo ?. partInstanceId } ,` +
844
+ `previousPartInstance.segmentId: ${ ! previousPartInstance ? 'N/A' : previousPartInstance . segmentId } ,` +
845
+ `currentPartInstance.segmentId: ${ ! currentPartInstance ? 'N/A' : currentPartInstance . segmentId } ,` +
846
+ `nextPartInstance.segmentId: ${ ! nextPartInstance ? 'N/A' : nextPartInstance . segmentId } ` +
847
+ `)`
848
+ )
818
849
ingestModel . removeSegment ( segmentId )
819
850
}
820
851
}
@@ -824,3 +855,12 @@ async function validateAdlibTestingSegment(_context: JobContext, playoutModel: P
824
855
rundown . updateAdlibTestingSegmentRank ( )
825
856
}
826
857
}
858
+ function ensureNextPartInstanceIsNotDeleted ( playoutModel : PlayoutModel ) {
859
+ if ( playoutModel . nextPartInstance ) {
860
+ // Check if the segment of the nextPartInstance exists
861
+ if ( ! playoutModel . findSegment ( playoutModel . nextPartInstance . partInstance . segmentId ) ) {
862
+ // The segment doesn't exist, set nextPartInstance to null, it'll be set by ensureNextPartIsValid() later.
863
+ playoutModel . setPartInstanceAsNext ( null , false , false )
864
+ }
865
+ }
866
+ }
0 commit comments