@@ -178,9 +178,13 @@ export async function CommitIngestOperation(
178178 // Ensure any adlibbed parts are updated to follow the segmentId of the previous part
179179 await updateSegmentIdsForAdlibbedPartInstances ( context , ingestModel , beforePartMap )
180180
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
181183 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 ( ) ) ) } ` )
183185 }
186+ // End of temporary section
187+
184188 // ensure instances have matching segmentIds with the parts
185189 await updatePartInstancesSegmentIds ( context , ingestModel , data . renamedSegments , beforePartMap )
186190
@@ -220,6 +224,8 @@ export async function CommitIngestOperation(
220224 const pSaveIngest = ingestModel . saveAllToDatabase ( )
221225 pSaveIngest . catch ( ( ) => null ) // Ensure promise isn't reported as unhandled
222226
227+ ensureNextPartInstanceIsNotDeleted ( playoutModel )
228+
223229 await validateAdlibTestingSegment ( context , playoutModel )
224230
225231 try {
@@ -273,14 +279,18 @@ function canRemoveSegment(
273279 logger . warn ( `Not allowing removal of previous playing segment "${ segmentId } ", making segment unsynced instead` )
274280 return false
275281 }
276- if (
277- currentPartInstance ?. segmentId === segmentId ||
278- ( nextPartInstance ?. segmentId === segmentId && isTooCloseToAutonext ( currentPartInstance , false ) )
279- ) {
282+ if ( currentPartInstance ?. segmentId === segmentId ) {
280283 // Don't allow removing an active rundown
281284 logger . warn ( `Not allowing removal of current playing segment "${ segmentId } ", making segment unsynced instead` )
282285 return false
283286 }
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+ }
284294
285295 if ( nextPartInstance ?. segmentId === segmentId && nextPartInstance . orphaned === 'adlib-part' ) {
286296 // Don't allow removing an active rundown
@@ -365,6 +375,8 @@ async function updatePartInstancesSegmentIds(
365375
366376 const writeOps : AnyBulkWriteOperation < DBPartInstance > [ ] = [ ]
367377
378+ logger . debug ( `updatePartInstancesSegmentIds: renameRules: ${ JSON . stringify ( renameRules ) } ` )
379+
368380 for ( const [ newSegmentId , rule ] of rulesInOrder ) {
369381 if ( rule . fromSegmentIds . length ) {
370382 writeOps . push ( {
@@ -402,32 +414,24 @@ async function updatePartInstancesSegmentIds(
402414 if ( writeOps . length ) await context . directCollections . PartInstances . bulkWrite ( writeOps )
403415
404416 // 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+ } )
416427 if ( badPartInstances . length > 0 ) {
417428 logger . error (
418429 `updatePartInstancesSegmentIds: Failed to update all PartInstances using old SegmentIds "${ JSON . stringify (
419430 oldSegmentIds
420431 ) } ": ${ JSON . stringify ( badPartInstances ) } , writeOps: ${ JSON . stringify ( writeOps ) } `
421432 )
422433 }
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
431435 }
432436}
433437
@@ -662,10 +666,27 @@ async function getSelectedPartInstances(
662666 } )
663667 : [ ]
664668
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+
665686 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,
669690 }
670691}
671692
@@ -815,6 +836,16 @@ async function removeSegments(
815836 } )
816837 }
817838 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+ )
818849 ingestModel . removeSegment ( segmentId )
819850 }
820851}
@@ -824,3 +855,12 @@ async function validateAdlibTestingSegment(_context: JobContext, playoutModel: P
824855 rundown . updateAdlibTestingSegmentRank ( )
825856 }
826857}
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