Skip to content

Commit 7b4fa25

Browse files
committed
wip
1 parent 4d3a4cd commit 7b4fa25

File tree

54 files changed

+261
-763
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+261
-763
lines changed

meteor/__mocks__/helpers/database.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ import {
3333
SofieIngestSegment,
3434
SofieIngestRundown,
3535
} from '@sofie-automation/blueprints-integration'
36-
import { DBShowStyleBase, UIShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase'
36+
import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase'
3737
import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/ShowStyleVariant'
3838
import { Blueprint } from '@sofie-automation/corelib/dist/dataModel/Blueprint'
3939
import { ICoreSystem, SYSTEM_ID } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem'
4040
import { stripVersion } from '../../server/systemStatus/semverUtils'
4141
import { internalUploadBlueprint } from '../../server/api/blueprints/api'
42-
import { literal, getRandomId, getRandomString, Complete, normalizeArray } from '@sofie-automation/corelib/dist/lib'
42+
import { literal, getRandomId, getRandomString, normalizeArray } from '@sofie-automation/corelib/dist/lib'
4343
import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString'
4444
import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
4545
import { DBSegment } from '@sofie-automation/corelib/dist/dataModel/Segment'
@@ -891,14 +891,3 @@ export async function setupMockWorker(doc?: Partial<WorkerStatus>): Promise<{
891891
// const studioBlueprint
892892
// const showStyleBlueprint
893893
// const showStyleVariant
894-
895-
export function convertToUIShowStyleBase(showStyleBase: DBShowStyleBase): UIShowStyleBase {
896-
return literal<Complete<UIShowStyleBase>>({
897-
_id: showStyleBase._id,
898-
name: showStyleBase.name,
899-
hotkeyLegend: showStyleBase.hotkeyLegend,
900-
sourceLayers: applyAndValidateOverrides(showStyleBase.sourceLayersWithOverrides).obj,
901-
outputLayers: applyAndValidateOverrides(showStyleBase.outputLayersWithOverrides).obj,
902-
abChannelDisplay: showStyleBase.abChannelDisplay,
903-
})
904-
}

packages/corelib/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
export { Timecode } from 'timecode'
33

44
export { MOS } from '@sofie-automation/shared-lib/dist/mos'
5+
6+
export * from './playout/stateCacheResolver.js'

packages/corelib/src/playout/stateCacheResolver.ts

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { PieceInstance, PieceInstancePiece } from '../dataModel/PieceInstance.js
2323
import { Rundown } from '../dataModel/Rundown.js'
2424
import { DBRundownPlaylist, QuickLoopMarkerType } from '../dataModel/RundownPlaylist.js'
2525
import { DBSegment, SegmentExtended, SegmentOrphanedReason } from '../dataModel/Segment.js'
26-
import { assertNever, literal, groupByToMap } from '../lib.js'
26+
import { assertNever, literal, groupByToMap, Complete } from '../lib.js'
2727
import { FindOneOptions, FindOptions, MongoQuery, mongoWhereFilter } from '../mongo.js'
2828
import { protectString } from '../protectedString.js'
2929
import {
@@ -37,16 +37,21 @@ import {
3737
buildPiecesStartingInThisPartQuery,
3838
getPieceInstancesForPart,
3939
} from './infinites.js'
40-
import { DBShowStyleBase, IOutputLayerExtended, ISourceLayerExtended } from '../dataModel/ShowStyleBase.js'
40+
import {
41+
DBShowStyleBase,
42+
IOutputLayerExtended,
43+
ISourceLayerExtended,
44+
UIShowStyleBase,
45+
} from '../dataModel/ShowStyleBase.js'
4146
import { applyAndValidateOverrides } from '../settings/objectWithOverrides.js'
4247
import { PartInstance, PartInstanceLimited } from '../dataModel/PartInstance.js'
4348
import { UIStudio } from '../dataModel/Studio.js'
4449
import { ReadonlyDeep } from 'type-fest'
4550
import { TimeDuration } from '@sofie-automation/shared-lib/dist/lib/lib'
4651

4752
type SegmentsFindOne = (
48-
selector?: SegmentId | MongoQuery<DBSegment>,
49-
options?: FindOneOptions<DBSegment>
53+
selector: SegmentId | MongoQuery<DBSegment>,
54+
options: FindOneOptions<DBSegment>
5055
) => DBSegment | undefined
5156
type PieceInstancesFind = (
5257
selector?: PieceInstanceId | MongoQuery<PieceInstance>,
@@ -126,7 +131,7 @@ export function getPieceStatusClassName(status: PieceStatusCode | undefined): st
126131
* @return {*} {({
127132
*/
128133
export function getResolvedSegment(
129-
showStyleBase: DBShowStyleBase,
134+
showStyleBaseProp: DBShowStyleBase | UIShowStyleBase,
130135
studio: UIStudio | undefined,
131136
playlist: DBRundownPlaylist,
132137
rundown: Pick<Rundown, '_id' | 'showStyleBaseId'>,
@@ -137,16 +142,16 @@ export function getResolvedSegment(
137142
orderedAllPartIds: PartId[],
138143
currentPartInstance: PartInstance | undefined,
139144
nextPartInstance: PartInstance | undefined,
140-
pieceInstanceSimulation: boolean = false,
141-
includeDisabledPieces: boolean = false,
142145
// TODO: Add new parameters to JSDOC
143146
segmentsFindOne: SegmentsFindOne,
144147
getSegmentsAndPartsSync: GetSegmentsAndPartsSync,
145148
getActivePartInstances: GetActivePartInstances,
146149
piecesFind: PiecesFind,
147150
pieceInstancesFind: PieceInstancesFind,
148151
getCurrentTime: GetCurrentTime = () => Date.now(),
149-
showHiddenSourceLayers: boolean,
152+
pieceInstanceSimulation: boolean = false,
153+
includeDisabledPieces: boolean = false,
154+
showHiddenSourceLayers: boolean = false,
150155
defaultDisplayDuration: number = 0 // I think 0 here is reasonable, and should be overridden by an actual value when used in a UI.
151156
): {
152157
/** A Segment with some additional information */
@@ -177,8 +182,9 @@ export function getResolvedSegment(
177182
let hasAlreadyPlayed = false
178183
let hasRemoteItems = false
179184
let hasGuestItems = false
180-
const resolvedOutputLayers = applyAndValidateOverrides(showStyleBase.outputLayersWithOverrides).obj
181-
const resolvedSourceLayers = applyAndValidateOverrides(showStyleBase.sourceLayersWithOverrides).obj
185+
const showStyleBase = isUIShowStyleBase(showStyleBaseProp)
186+
? showStyleBaseProp
187+
: convertToUIShowStyleBase(showStyleBaseProp)
182188

183189
let autoNextPart = false
184190

@@ -220,7 +226,7 @@ export function getResolvedSegment(
220226
// create local deep copies of the studio outputLayers and sourceLayers so that we can store
221227
// pieces present on those layers inside and also figure out which layers are used when inside the rundown
222228
const outputLayers: Record<string, IOutputLayerExtended> = {}
223-
for (const [id, layer] of Object.entries<IOutputLayer | undefined>(resolvedOutputLayers)) {
229+
for (const [id, layer] of Object.entries<IOutputLayer | undefined>(showStyleBase.outputLayers)) {
224230
if (layer) {
225231
outputLayers[id] = {
226232
...layer,
@@ -230,7 +236,7 @@ export function getResolvedSegment(
230236
}
231237
}
232238
const sourceLayers: Record<string, ISourceLayerExtended> = {}
233-
for (const [id, layer] of Object.entries<ISourceLayer | undefined>(resolvedSourceLayers)) {
239+
for (const [id, layer] of Object.entries<ISourceLayer | undefined>(showStyleBase.sourceLayers)) {
234240
if (layer) {
235241
sourceLayers[id] = {
236242
...layer,
@@ -364,7 +370,7 @@ export function getResolvedSegment(
364370

365371
const partTimes = createPartCurrentTimes(getCurrentTime(), partE.instance.timings?.plannedStartedPlayback)
366372
const preprocessedPieces = processAndPrunePieceInstanceTimings(
367-
resolvedSourceLayers,
373+
showStyleBase.sourceLayers,
368374
rawPieceInstances,
369375
partTimes,
370376
includeDisabledPieces
@@ -927,3 +933,27 @@ export function wrapPartToTemporaryInstance(
927933
part: part as DBPart,
928934
}
929935
}
936+
937+
export function convertToUIShowStyleBase(showStyleBase: DBShowStyleBase): UIShowStyleBase {
938+
return literal<Complete<UIShowStyleBase>>({
939+
_id: showStyleBase._id,
940+
name: showStyleBase.name,
941+
hotkeyLegend: showStyleBase.hotkeyLegend,
942+
sourceLayers: applyAndValidateOverrides(showStyleBase.sourceLayersWithOverrides).obj,
943+
outputLayers: applyAndValidateOverrides(showStyleBase.outputLayersWithOverrides).obj,
944+
abChannelDisplay: showStyleBase.abChannelDisplay,
945+
})
946+
}
947+
948+
export function isUIShowStyleBase(value: unknown): value is UIShowStyleBase {
949+
if (!value || typeof value !== 'object') return false
950+
951+
const v = value as Partial<UIShowStyleBase>
952+
953+
return (
954+
typeof v.sourceLayers === 'object' &&
955+
v.sourceLayers !== null &&
956+
typeof v.outputLayers === 'object' &&
957+
v.outputLayers !== null
958+
)
959+
}

packages/job-worker/src/__mocks__/partinstance.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.

packages/job-worker/src/blueprints/__tests__/context-events.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import { protectString, unprotectString } from '@sofie-automation/corelib/dist/p
99
import { MockJobContext, setupDefaultJobEnvironment } from '../../__mocks__/context.js'
1010
import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../__mocks__/presetCollections.js'
1111
import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
12-
import { wrapPartToTemporaryInstance } from '../../__mocks__/partinstance.js'
1312
import { ReadonlyDeep } from 'type-fest'
1413
import { convertPartInstanceToBlueprints } from '../context/lib.js'
1514
import { EmptyPieceTimelineObjectsBlob } from '@sofie-automation/corelib/dist/dataModel/Piece'
1615
import { ProcessedShowStyleCompound } from '../../jobs/index.js'
16+
import { wrapPartToTemporaryInstance } from '@sofie-automation/corelib/dist/playout/stateCacheResolver'
1717

1818
describe('Test blueprint api context', () => {
1919
async function generateSparsePieceInstances(rundown: DBRundown) {

packages/job-worker/src/playout/__tests__/infinites.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { setupDefaultRundownPlaylist, setupMockShowStyleCompound } from '../../_
77
import { getRandomId } from '@sofie-automation/corelib/dist/lib'
88
import { DBRundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
99
import { runJobWithPlayoutModel } from '../lock.js'
10-
import { wrapPartToTemporaryInstance } from '../../__mocks__/partinstance.js'
1110
import { protectString } from '@sofie-automation/corelib/dist/protectedString'
11+
import { wrapPartToTemporaryInstance } from '@sofie-automation/corelib/dist/playout/stateCacheResolver'
1212

1313
describe('canContinueAdlibOnEndInfinites', () => {
1414
let context: MockJobContext

packages/job-worker/src/playout/lookahead/__tests__/util.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import { MockJobContext, setupDefaultJobEnvironment } from '../../../__mocks__/c
99
import { runJobWithPlayoutModel } from '../../../playout/lock.js'
1010
import { defaultRundownPlaylist } from '../../../__mocks__/defaultCollectionObjects.js'
1111
import _ from 'underscore'
12-
import { wrapPartToTemporaryInstance } from '../../../__mocks__/partinstance.js'
1312
import { wrapDefaultObject } from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
1413
import { QuickLoopMarkerType } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
1514
import { ForceQuickLoopAutoNext } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings'
15+
import { wrapPartToTemporaryInstance } from '@sofie-automation/corelib/dist/playout/stateCacheResolver'
1616

1717
describe('getOrderedPartsAfterPlayhead', () => {
1818
let context!: MockJobContext

packages/meteor-lib/src/collections/PartInstances.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,8 @@
11
import { protectString, unprotectString } from '@sofie-automation/corelib/dist/protectedString'
22
import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part'
3-
import { PartId, RundownPlaylistActivationId } from '@sofie-automation/corelib/dist/dataModel/Ids'
3+
import { PartId } from '@sofie-automation/corelib/dist/dataModel/Ids'
44
import { PartInstance } from '@sofie-automation/corelib/dist/dataModel/PartInstance'
5-
6-
export function wrapPartToTemporaryInstance(
7-
playlistActivationId: RundownPlaylistActivationId,
8-
part: DBPart
9-
): PartInstance {
10-
return {
11-
isTemporary: true,
12-
_id: protectString(`${part._id}_tmp_instance`),
13-
rundownId: part.rundownId,
14-
segmentId: part.segmentId,
15-
playlistActivationId,
16-
segmentPlayoutId: protectString(''), // Only needed when stored in the db, and filled in nearer the time
17-
takeCount: -1,
18-
rehearsal: false,
19-
part: part,
20-
}
21-
}
5+
import { wrapPartToTemporaryInstance } from '@sofie-automation/corelib/dist/playout/stateCacheResolver'
226

237
export function findPartInstanceInMapOrWrapToTemporary<T extends Partial<PartInstance>>(
248
partInstancesMap: Map<PartId, T>,

packages/webui/src/__mocks__/helpers/database.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
SourceLayerType,
88
IBlueprintPieceType,
99
} from '@sofie-automation/blueprints-integration'
10-
import { DBShowStyleBase, UIShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase'
10+
import { DBShowStyleBase } from '@sofie-automation/corelib/dist/dataModel/ShowStyleBase'
1111
import { DBShowStyleVariant } from '@sofie-automation/corelib/dist/dataModel/ShowStyleVariant'
1212
import { ICoreSystem, SYSTEM_ID } from '@sofie-automation/meteor-lib/dist/collections/CoreSystem'
1313
import { literal, getRandomId, Complete, normalizeArray } from '@sofie-automation/corelib/dist/lib'
@@ -546,16 +546,6 @@ export async function setupDefaultRundown(
546546
// // const showStyleBlueprint
547547
// // const showStyleVariant
548548

549-
export function convertToUIShowStyleBase(showStyleBase: DBShowStyleBase): UIShowStyleBase {
550-
return literal<Complete<UIShowStyleBase>>({
551-
_id: showStyleBase._id,
552-
name: showStyleBase.name,
553-
hotkeyLegend: showStyleBase.hotkeyLegend,
554-
sourceLayers: applyAndValidateOverrides(showStyleBase.sourceLayersWithOverrides).obj,
555-
outputLayers: applyAndValidateOverrides(showStyleBase.outputLayersWithOverrides).obj,
556-
abChannelDisplay: showStyleBase.abChannelDisplay,
557-
})
558-
}
559549
export function convertToUIStudio(studio: DBStudio): UIStudio {
560550
return literal<Complete<UIStudio>>({
561551
_id: studio._id,

packages/webui/src/client/lib/RundownResolver.ts

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Piece } from '@sofie-automation/corelib/dist/dataModel/Piece'
22
import { DBSegment, SegmentOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Segment'
33
import { DBPart } from '@sofie-automation/corelib/dist/dataModel/Part'
4-
import { wrapPartToTemporaryInstance } from '@sofie-automation/meteor-lib/dist/collections/PartInstances'
54
import { PieceInstance } from '@sofie-automation/corelib/dist/dataModel/PieceInstance'
65
import {
76
getPieceInstancesForPart,
@@ -12,7 +11,7 @@ import { invalidateAfter } from './invalidatingTime.js'
1211
import { groupByToMap } from '@sofie-automation/corelib/dist/lib'
1312
import { protectString } from '@sofie-automation/shared-lib/dist/lib/protectedString'
1413
import { getCurrentTime } from './systemTime.js'
15-
import { DBRundownPlaylist, QuickLoopMarkerType } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
14+
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
1615
import { Rundown } from '@sofie-automation/corelib/dist/dataModel/Rundown'
1716
import { mongoWhereFilter, MongoQuery } from '@sofie-automation/corelib/dist/mongo'
1817
import { FindOptions } from '@sofie-automation/meteor-lib/dist/collections/lib'
@@ -26,6 +25,7 @@ import {
2625
import { RundownPlaylistClientUtil } from './rundownPlaylistUtil.js'
2726
import { PieceInstances, Pieces } from '../collections/index.js'
2827
import { PartInstance, PartInstanceLimited } from '@sofie-automation/corelib/src/dataModel/PartInstance.js'
28+
import { wrapPartToTemporaryInstance } from '@sofie-automation/corelib/src/playout/stateCacheResolver.js'
2929

3030
function fetchPiecesThatMayBeActiveForPart(
3131
part: DBPart,
@@ -269,50 +269,3 @@ export function getSegmentsWithPartInstances(
269269
}
270270
})
271271
}
272-
273-
export function isLoopDefined(playlist: DBRundownPlaylist | undefined): boolean {
274-
return playlist?.quickLoop?.start != null && playlist?.quickLoop?.end != null
275-
}
276-
277-
export function isAnyLoopMarkerDefined(playlist: DBRundownPlaylist | undefined): boolean {
278-
return playlist?.quickLoop?.start != null || playlist?.quickLoop?.end != null
279-
}
280-
281-
export function isLoopRunning(playlist: DBRundownPlaylist | undefined): boolean {
282-
return !!playlist?.quickLoop?.running
283-
}
284-
285-
export function isLoopLocked(playlist: DBRundownPlaylist | undefined): boolean {
286-
return !!playlist?.quickLoop?.locked
287-
}
288-
289-
export function isEntirePlaylistLooping(playlist: DBRundownPlaylist | undefined): boolean {
290-
return (
291-
playlist?.quickLoop?.start?.type === QuickLoopMarkerType.PLAYLIST &&
292-
playlist?.quickLoop?.end?.type === QuickLoopMarkerType.PLAYLIST
293-
)
294-
}
295-
296-
export function isQuickLoopStart(partId: PartId, playlist: DBRundownPlaylist | undefined): boolean {
297-
return playlist?.quickLoop?.start?.type === QuickLoopMarkerType.PART && playlist.quickLoop.start.id === partId
298-
}
299-
300-
export function isQuickLoopEnd(partId: PartId, playlist: DBRundownPlaylist | undefined): boolean {
301-
return playlist?.quickLoop?.end?.type === QuickLoopMarkerType.PART && playlist.quickLoop.end.id === partId
302-
}
303-
304-
export function isEndOfLoopingShow(
305-
playlist: DBRundownPlaylist | undefined,
306-
isLastSegment: boolean,
307-
isPartLastInSegment: boolean,
308-
part: DBPart
309-
): boolean {
310-
return (
311-
isPartLastInSegment &&
312-
isLoopDefined(playlist) &&
313-
((isLastSegment && playlist?.quickLoop?.end?.type === QuickLoopMarkerType.PLAYLIST) ||
314-
(playlist?.quickLoop?.end?.type === QuickLoopMarkerType.SEGMENT &&
315-
playlist?.quickLoop.end.id === part.segmentId) ||
316-
(playlist?.quickLoop?.end?.type === QuickLoopMarkerType.PART && playlist?.quickLoop.end.id === part._id))
317-
)
318-
}

0 commit comments

Comments
 (0)