diff --git a/packages/job-worker/src/playout/timeline/generate.ts b/packages/job-worker/src/playout/timeline/generate.ts index 8bc040653b..d558f15cbf 100644 --- a/packages/job-worker/src/playout/timeline/generate.ts +++ b/packages/job-worker/src/playout/timeline/generate.ts @@ -40,7 +40,7 @@ import { deserializePieceTimelineObjectsBlob } from '@sofie-automation/corelib/d import { convertResolvedPieceInstanceToBlueprints } from '../../blueprints/context/lib' import { buildTimelineObjsForRundown, RundownTimelineTimingContext } from './rundown' import { SourceLayers } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase' -import { deNowifyMultiGatewayTimeline } from './multi-gateway' +import { calculateNowOffsetLatency, deNowifyMultiGatewayTimeline } from './multi-gateway' import { validateTimeline } from 'superfly-timeline' import { getPartTimingsOrDefaults, PartCalculatedTimings } from '@sofie-automation/corelib/dist/playout/timings' import { applyAbPlaybackForTimeline } from '../abPlayback' @@ -144,14 +144,21 @@ export async function updateTimeline(context: JobContext, playoutModel: PlayoutM throw new Error(`RundownPlaylist ("${playoutModel.playlist._id}") is not active")`) } - const { versions, objs: timelineObjs, timingContext: timingInfo } = await getTimelineRundown(context, playoutModel) + const nowOffsetLatency = calculateNowOffsetLatency(context, playoutModel) + const targetNowTime = getCurrentTime() + (nowOffsetLatency ?? 0) + + const { + versions, + objs: timelineObjs, + timingContext: timingInfo, + } = await getTimelineRundown(context, playoutModel, targetNowTime) flattenAndProcessTimelineObjects(context, timelineObjs) preserveOrReplaceNowTimesInObjects(playoutModel, timelineObjs) if (playoutModel.isMultiGatewayMode) { - deNowifyMultiGatewayTimeline(context, playoutModel, timelineObjs, timingInfo) + deNowifyMultiGatewayTimeline(playoutModel, timelineObjs, timingInfo, targetNowTime) logAnyRemainingNowTimes(context, timelineObjs) } @@ -281,7 +288,8 @@ function getPartInstanceTimelineInfo( */ async function getTimelineRundown( context: JobContext, - playoutModel: PlayoutModel + playoutModel: PlayoutModel, + targetNowTime: number ): Promise<{ objs: Array versions: TimelineCompleteGenerationVersions @@ -311,11 +319,10 @@ async function getTimelineRundown( ) } - const currentTime = getCurrentTime() const partInstancesInfo: SelectedPartInstancesTimelineInfo = { - current: getPartInstanceTimelineInfo(currentTime, showStyle.sourceLayers, currentPartInstance), - next: getPartInstanceTimelineInfo(currentTime, showStyle.sourceLayers, nextPartInstance), - previous: getPartInstanceTimelineInfo(currentTime, showStyle.sourceLayers, previousPartInstance), + current: getPartInstanceTimelineInfo(targetNowTime, showStyle.sourceLayers, currentPartInstance), + next: getPartInstanceTimelineInfo(targetNowTime, showStyle.sourceLayers, nextPartInstance), + previous: getPartInstanceTimelineInfo(targetNowTime, showStyle.sourceLayers, previousPartInstance), } if (partInstancesInfo.next && nextPartInstance) { @@ -352,7 +359,7 @@ async function getTimelineRundown( const resolvedPieces = getResolvedPiecesForPartInstancesOnTimeline( context, partInstancesInfo, - getCurrentTime() + targetNowTime ) const blueprintContext = new OnTimelineGenerateContext( context.studio, diff --git a/packages/job-worker/src/playout/timeline/multi-gateway.ts b/packages/job-worker/src/playout/timeline/multi-gateway.ts index d606baa8a2..b51a0fe876 100644 --- a/packages/job-worker/src/playout/timeline/multi-gateway.ts +++ b/packages/job-worker/src/playout/timeline/multi-gateway.ts @@ -7,7 +7,6 @@ import { PieceTimelineMetadata } from './pieceGroup' import { StudioPlayoutModelBase } from '../../studio/model/StudioPlayoutModel' import { logger } from '../../logging' import { JobContext } from '../../jobs' -import { getCurrentTime } from '../../lib' import { PlayoutModel } from '../model/PlayoutModel' import { RundownTimelineTimingContext, getInfinitePartGroupId } from './rundown' import { getExpectedLatency } from '@sofie-automation/corelib/dist/studio/playout' @@ -23,17 +22,16 @@ import { PlayoutPieceInstanceModel } from '../model/PlayoutPieceInstanceModel' * This does introduce a risk of error when changes are made to how we generate the timeline, but that risk should be small. */ export function deNowifyMultiGatewayTimeline( - context: JobContext, playoutModel: PlayoutModel, timelineObjs: TimelineObjRundown[], - timingContext: RundownTimelineTimingContext | undefined + timingContext: RundownTimelineTimingContext | undefined, + targetNowTime: number ): void { if (!timingContext) return const timelineObjsMap = normalizeArray(timelineObjs, 'id') - const nowOffsetLatency = calculateNowOffsetLatency(context, playoutModel) - const targetNowTime = getCurrentTime() + (nowOffsetLatency ?? 0) + logger.info(`deNowifyMultiGatewayTimeline: ${targetNowTime}`) // Replace `start: 'now'` in currentPartInstance on timeline const currentPartInstance = playoutModel.currentPartInstance