Skip to content

Commit f98db25

Browse files
committed
wip
1 parent b64155a commit f98db25

File tree

12 files changed

+284
-187
lines changed

12 files changed

+284
-187
lines changed

meteor/server/api/ingest/packageInfo.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import {
2-
ExpectedPackageDBFromBucketAdLib,
3-
ExpectedPackageDBFromBucketAdLibAction,
4-
ExpectedPackageDBFromStudioBaselineObjects,
5-
ExpectedPackageDBType,
6-
ExpectedPackageFromRundown,
7-
ExpectedPackageFromRundownBaseline,
8-
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
1+
import { ExpectedPackageDBType, ExpectedPackageDBNew } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
92
import { PackageInfoDB } from '@sofie-automation/corelib/dist/dataModel/PackageInfos'
103
import { ExpectedPackages, Rundowns } from '../../collections'
114
import { assertNever } from '../../lib/tempLib'
@@ -107,9 +100,7 @@ async function onUpdatedPackageInfoForRundown(
107100
})
108101
}
109102

110-
function onUpdatedPackageInfoForBucketItemDebounce(
111-
pkg: ExpectedPackageDBFromBucketAdLib | ExpectedPackageDBFromBucketAdLibAction
112-
) {
103+
function onUpdatedPackageInfoForBucketItemDebounce(pkg: ExpectedPackageDBNew) {
113104
lazyIgnore(
114105
`onUpdatedPackageInfoForBucket_${pkg.studioId}_${pkg.bucketId}_${pkg.pieceExternalId}`,
115106
() => {

meteor/server/collections/packages-media.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { CollectionName } from '@sofie-automation/corelib/dist/dataModel/Collections'
22
import { ExpectedMediaItem } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem'
3-
import { ExpectedPackageDB } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
3+
import { ExpectedPackageDBNew } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
44
import { ExpectedPackageWorkStatus } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackageWorkStatuses'
55
import { ExpectedPlayoutItem } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem'
66
import { PackageContainerPackageStatusDB } from '@sofie-automation/corelib/dist/dataModel/PackageContainerPackageStatus'
@@ -27,20 +27,18 @@ registerIndex(ExpectedMediaItems, {
2727
rundownId: 1,
2828
})
2929

30-
export const ExpectedPackages = createAsyncOnlyReadOnlyMongoCollection<ExpectedPackageDB>(
30+
export const ExpectedPackages = createAsyncOnlyReadOnlyMongoCollection<ExpectedPackageDBNew>(
3131
CollectionName.ExpectedPackages
3232
)
3333
registerIndex(ExpectedPackages, {
3434
studioId: 1,
35-
fromPieceType: 1,
3635
})
3736
registerIndex(ExpectedPackages, {
3837
studioId: 1,
39-
pieceId: 1,
38+
rundownId: 1,
4039
})
4140
registerIndex(ExpectedPackages, {
4241
rundownId: 1,
43-
pieceId: 1,
4442
})
4543

4644
export const ExpectedPackageWorkStatuses = createAsyncOnlyMongoCollection<ExpectedPackageWorkStatus>(

meteor/server/publications/packageManager/expectedPackages/contentCache.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ReactiveCacheCollection } from '../../lib/ReactiveCacheCollection'
22
import { literal } from '@sofie-automation/corelib/dist/lib'
33
import { MongoFieldSpecifierOnesStrict } from '@sofie-automation/corelib/dist/mongo'
4-
import { ExpectedPackageDB } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
4+
import { ExpectedPackageDBNew } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
55
import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/RundownPlaylist'
66
import { PieceInstance, PieceInstancePiece } from '@sofie-automation/corelib/dist/dataModel/PieceInstance'
77

@@ -29,14 +29,14 @@ export const pieceInstanceFieldsSpecifier = literal<MongoFieldSpecifierOnesStric
2929
})
3030

3131
export interface ExpectedPackagesContentCache {
32-
ExpectedPackages: ReactiveCacheCollection<ExpectedPackageDB>
32+
ExpectedPackages: ReactiveCacheCollection<ExpectedPackageDBNew>
3333
RundownPlaylists: ReactiveCacheCollection<RundownPlaylistCompact>
3434
PieceInstances: ReactiveCacheCollection<PieceInstanceCompact>
3535
}
3636

3737
export function createReactiveContentCache(): ExpectedPackagesContentCache {
3838
const cache: ExpectedPackagesContentCache = {
39-
ExpectedPackages: new ReactiveCacheCollection<ExpectedPackageDB>('expectedPackages'),
39+
ExpectedPackages: new ReactiveCacheCollection<ExpectedPackageDBNew>('expectedPackages'),
4040
RundownPlaylists: new ReactiveCacheCollection<RundownPlaylistCompact>('rundownPlaylists'),
4141
PieceInstances: new ReactiveCacheCollection<PieceInstanceCompact>('pieceInstances'),
4242
}

packages/corelib/src/dataModel/ExpectedPackages.ts

Lines changed: 99 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
AdLibActionId,
66
BucketAdLibActionId,
77
BucketAdLibId,
8-
BucketId,
98
ExpectedPackageId,
109
PartId,
1110
PieceId,
@@ -26,20 +25,20 @@ import { ReadonlyDeep } from 'type-fest'
2625
The Package Manager will then copy the file to the right place.
2726
*/
2827

29-
export type ExpectedPackageFromRundown = ExpectedPackageDBFromPiece | ExpectedPackageDBFromAdLibAction
28+
// export type ExpectedPackageFromRundown = ExpectedPackageDBFromPiece | ExpectedPackageDBFromAdLibAction
3029

31-
export type ExpectedPackageFromRundownBaseline =
32-
| ExpectedPackageDBFromBaselineAdLibAction
33-
| ExpectedPackageDBFromBaselineAdLibPiece
34-
| ExpectedPackageDBFromRundownBaselineObjects
30+
// export type ExpectedPackageFromRundownBaseline =
31+
// | ExpectedPackageDBFromBaselineAdLibAction
32+
// | ExpectedPackageDBFromBaselineAdLibPiece
33+
// | ExpectedPackageDBFromRundownBaselineObjects
3534

36-
export type ExpectedPackageDBFromBucket = ExpectedPackageDBFromBucketAdLib | ExpectedPackageDBFromBucketAdLibAction
35+
// export type ExpectedPackageDBFromBucket = ExpectedPackageDBFromBucketAdLib | ExpectedPackageDBFromBucketAdLibAction
3736

38-
export type ExpectedPackageDB =
39-
| ExpectedPackageFromRundown
40-
| ExpectedPackageDBFromBucket
41-
| ExpectedPackageFromRundownBaseline
42-
| ExpectedPackageDBFromStudioBaselineObjects
37+
// export type ExpectedPackageDB =
38+
// | ExpectedPackageFromRundown
39+
// | ExpectedPackageDBFromBucket
40+
// | ExpectedPackageFromRundownBaseline
41+
// | ExpectedPackageDBFromStudioBaselineObjects
4342

4443
export enum ExpectedPackageDBType {
4544
PIECE = 'piece',
@@ -52,88 +51,110 @@ export enum ExpectedPackageDBType {
5251
RUNDOWN_BASELINE_OBJECTS = 'rundown_baseline_objects',
5352
STUDIO_BASELINE_OBJECTS = 'studio_baseline_objects',
5453
}
55-
export interface ExpectedPackageDBBase extends Omit<ExpectedPackage.Base, '_id'> {
56-
_id: ExpectedPackageId
57-
/** The local package id - as given by the blueprints */
58-
blueprintPackageId: string
54+
55+
/*
56+
* What about this new concept. The aim here is to avoid the constant inserting and deleting of expectedPackages during playout, and avoiding duplicate packages with the same content.
57+
* The idea is to have a single expectedPackage for each 'content'.
58+
* Ingest will 'deduplicate' the packages produced by the blueprints, with playout able to reference them with pieceInstanceIds.
59+
*
60+
* During the ingest save phase, it will need to reload the `playoutSources` property, in case it has changed. And if there are uses remaining, it will need to keep the package after clearing the `ingestSources`.
61+
* During playout operations, pieceInstanceIds will be added and removed as needed. If there remains no sources (of either type), then the document can be removed. If an in-progress ingest tried to reclaim it, it will get reinserted.
62+
*
63+
* Playout can then load just the ones referenced by piece instances, and just before it needs to use them (for bluerpint types or something), can ensure that everything needed has been loaded.
64+
* During a take, any packages referenced by the previous(?) partinstance must be removed.
65+
* When doing a reset of the rundown, all playout references must be removed.
66+
* When inserting/removing pieceinstances, the expectedPackages must be updated.
67+
*/
68+
export interface ExpectedPackageDBNew {
69+
_id: ExpectedPackageId // derived from rundownId and hash of `package`
70+
71+
// /** The local package id - as given by the blueprints */
72+
// blueprintPackageId: string // TODO - remove this?
5973

6074
/** The studio of the Rundown of the Piece this package belongs to */
6175
studioId: StudioId
6276

77+
/** The rundown of the Piece this package belongs to */
78+
rundownId: RundownId
79+
6380
/** Hash that changes whenever the content or version changes. See getContentVersionHash() */
6481
contentVersionHash: string
6582

66-
// pieceId: ProtectedString<any> | null
67-
fromPieceType: ExpectedPackageDBType
68-
6983
created: Time
84+
85+
package: ReadonlyDeep<ExpectedPackage.Any>
86+
87+
// HACK: This should be ExpectedPackageIngestSource[], but for the first iteration this is limited to a single source
88+
ingestSources: [ExpectedPackageIngestSource] | never[]
89+
90+
// playoutSources: {
91+
// /** Any playout PieceInstance. This is limited to the current and next partInstances */ // nocommit - verify this
92+
// pieceInstanceIds: PieceInstanceId[]
93+
// }
7094
}
71-
export interface ExpectedPackageDBFromPiece extends ExpectedPackageDBBase {
95+
96+
export interface ExpectedPackageIngestSourcePiece {
7297
fromPieceType: ExpectedPackageDBType.PIECE | ExpectedPackageDBType.ADLIB_PIECE
7398
/** The Piece this package belongs to */
7499
pieceId: PieceId
75100
/** The Part this package belongs to */
76101
partId: PartId
77102
/** The Segment this package belongs to */
78103
segmentId: SegmentId
79-
/** The rundown of the Piece this package belongs to */
80-
rundownId: RundownId
81-
}
82-
83-
export interface ExpectedPackageDBFromBaselineAdLibPiece extends ExpectedPackageDBBase {
84-
fromPieceType: ExpectedPackageDBType.BASELINE_ADLIB_PIECE
85-
/** The Piece this package belongs to */
86-
pieceId: PieceId
87-
/** The rundown of the Piece this package belongs to */
88-
rundownId: RundownId
89104
}
90-
91-
export interface ExpectedPackageDBFromAdLibAction extends ExpectedPackageDBBase {
105+
export interface ExpectedPackageIngestSourceAdlibAction {
92106
fromPieceType: ExpectedPackageDBType.ADLIB_ACTION
93-
/** The Adlib Action this package belongs to */
107+
/** The Piece this package belongs to */
94108
pieceId: AdLibActionId
95109
/** The Part this package belongs to */
96110
partId: PartId
97111
/** The Segment this package belongs to */
98112
segmentId: SegmentId
99-
/** The rundown of the Piece this package belongs to */
100-
rundownId: RundownId
101113
}
102-
export interface ExpectedPackageDBFromBaselineAdLibAction extends ExpectedPackageDBBase {
114+
export interface ExpectedPackageIngestSourceBaselineAdlibPiece {
115+
fromPieceType: ExpectedPackageDBType.BASELINE_ADLIB_PIECE
116+
/** The Piece this package belongs to */
117+
pieceId: PieceId
118+
}
119+
export interface ExpectedPackageIngestSourceBaselineAdlibAction {
103120
fromPieceType: ExpectedPackageDBType.BASELINE_ADLIB_ACTION
104121
/** The Piece this package belongs to */
105122
pieceId: RundownBaselineAdLibActionId
106-
/** The rundown of the Piece this package belongs to */
107-
rundownId: RundownId
108123
}
109-
110-
export interface ExpectedPackageDBFromRundownBaselineObjects extends ExpectedPackageDBBase {
124+
export interface ExpectedPackageIngestSourceBaselineObjects {
111125
fromPieceType: ExpectedPackageDBType.RUNDOWN_BASELINE_OBJECTS
112-
/** The rundown of the Piece this package belongs to */
113-
rundownId: RundownId
114-
pieceId: null
115-
}
116-
export interface ExpectedPackageDBFromStudioBaselineObjects extends ExpectedPackageDBBase {
117-
fromPieceType: ExpectedPackageDBType.STUDIO_BASELINE_OBJECTS
118-
pieceId: null
119126
}
120127

121-
export interface ExpectedPackageDBFromBucketAdLib extends ExpectedPackageDBBase {
122-
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB
123-
bucketId: BucketId
124-
/** The Bucket adlib this package belongs to */
125-
pieceId: BucketAdLibId
126-
/** The `externalId` of the Bucket adlib this package belongs to */
127-
pieceExternalId: string
128-
}
129-
export interface ExpectedPackageDBFromBucketAdLibAction extends ExpectedPackageDBBase {
130-
fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB_ACTION
131-
bucketId: BucketId
132-
/** The Bucket adlib-action this package belongs to */
133-
pieceId: BucketAdLibActionId
134-
/** The `externalId` of the Bucket adlib-action this package belongs to */
135-
pieceExternalId: string
136-
}
128+
export type ExpectedPackageIngestSourcePart = ExpectedPackageIngestSourcePiece | ExpectedPackageIngestSourceAdlibAction
129+
130+
export type ExpectedPackageIngestSourceRundownBaseline =
131+
| ExpectedPackageIngestSourceBaselineAdlibPiece
132+
| ExpectedPackageIngestSourceBaselineAdlibAction
133+
| ExpectedPackageIngestSourceBaselineObjects
134+
135+
export type ExpectedPackageIngestSource = ExpectedPackageIngestSourcePart | ExpectedPackageIngestSourceRundownBaseline
136+
137+
// export interface ExpectedPackageDBFromStudioBaselineObjects extends ExpectedPackageDBBase {
138+
// fromPieceType: ExpectedPackageDBType.STUDIO_BASELINE_OBJECTS
139+
// pieceId: null
140+
// }
141+
142+
// export interface ExpectedPackageDBFromBucketAdLib extends ExpectedPackageDBBase {
143+
// fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB
144+
// bucketId: BucketId
145+
// /** The Bucket adlib this package belongs to */
146+
// pieceId: BucketAdLibId
147+
// /** The `externalId` of the Bucket adlib this package belongs to */
148+
// pieceExternalId: string
149+
// }
150+
// export interface ExpectedPackageDBFromBucketAdLibAction extends ExpectedPackageDBBase {
151+
// fromPieceType: ExpectedPackageDBType.BUCKET_ADLIB_ACTION
152+
// bucketId: BucketId
153+
// /** The Bucket adlib-action this package belongs to */
154+
// pieceId: BucketAdLibActionId
155+
// /** The `externalId` of the Bucket adlib-action this package belongs to */
156+
// pieceExternalId: string
157+
// }
137158

138159
export function getContentVersionHash(expectedPackage: ReadonlyDeep<Omit<ExpectedPackage.Any, '_id'>>): string {
139160
return hashObj({
@@ -159,3 +180,18 @@ export function getExpectedPackageId(
159180
): ExpectedPackageId {
160181
return protectString(`${ownerId}_${getHash(localExpectedPackageId)}`)
161182
}
183+
184+
export function getExpectedPackageIdNew(
185+
/** _id of the rundown*/
186+
rundownId: RundownId,
187+
/** The locally unique id of the expectedPackage */
188+
expectedPackage: ReadonlyDeep<ExpectedPackage.Any>
189+
): ExpectedPackageId {
190+
// This may be too agressive, but we don't know how to merge some of the properties
191+
const objHash = hashObj({
192+
...expectedPackage,
193+
listenToPackageInfoUpdates: false, // Not relevant for the hash
194+
} satisfies ReadonlyDeep<ExpectedPackage.Any>)
195+
196+
return protectString(`${rundownId}_${getHash(objHash)}`)
197+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { ExpectedPackage, Time } from '@sofie-automation/blueprints-integration'
2+
import type {
3+
ExpectedPackageIngestSourcePart,
4+
ExpectedPackageIngestSourceRundownBaseline,
5+
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
6+
import type { ExpectedPackageId } from '@sofie-automation/corelib/dist/dataModel/Ids'
7+
import type { ReadonlyDeep } from 'type-fest'
8+
9+
export interface IngestExpectedPackage {
10+
_id: ExpectedPackageId
11+
12+
/** Hash that changes whenever the content or version changes. See getContentVersionHash() */
13+
contentVersionHash: string
14+
15+
created: Time
16+
17+
package: ReadonlyDeep<ExpectedPackage.Any>
18+
19+
ingestSources: Array<ExpectedPackageIngestSourcePart | ExpectedPackageIngestSourceRundownBaseline>
20+
}

packages/job-worker/src/ingest/model/IngestModel.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import { ExpectedMediaItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedMediaItem'
22
import {
3-
ExpectedPackageDBFromBaselineAdLibAction,
4-
ExpectedPackageDBFromBaselineAdLibPiece,
5-
ExpectedPackageDBFromRundownBaselineObjects,
6-
ExpectedPackageFromRundown,
3+
ExpectedPackageDBNew,
4+
ExpectedPackageIngestSource,
75
} from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
86
import { ExpectedPlayoutItemRundown } from '@sofie-automation/corelib/dist/dataModel/ExpectedPlayoutItem'
97
import {
@@ -32,12 +30,7 @@ import { ProcessedShowStyleBase, ProcessedShowStyleVariant } from '../../jobs/sh
3230
import { WrappedShowStyleBlueprint } from '../../blueprints/cache'
3331
import { IBlueprintRundown } from '@sofie-automation/blueprints-integration'
3432
import type { INotificationsModel } from '../../notifications/NotificationsModel'
35-
36-
export type ExpectedPackageForIngestModelBaseline =
37-
| ExpectedPackageDBFromBaselineAdLibAction
38-
| ExpectedPackageDBFromBaselineAdLibPiece
39-
| ExpectedPackageDBFromRundownBaselineObjects
40-
export type ExpectedPackageForIngestModel = ExpectedPackageFromRundown | ExpectedPackageForIngestModelBaseline
33+
import type { IngestExpectedPackage } from './IngestExpectedPackage'
4134

4235
export interface IngestModelReadonly {
4336
/**
@@ -66,7 +59,7 @@ export interface IngestModelReadonly {
6659
/**
6760
* The ExpectedPackages for the baseline of this Rundown
6861
*/
69-
readonly expectedPackagesForRundownBaseline: ReadonlyDeep<ExpectedPackageForIngestModelBaseline>[]
62+
readonly expectedPackagesForRundownBaseline: ReadonlyDeep<IngestExpectedPackage>[]
7063

7164
/**
7265
* The baseline Timeline objects of this Rundown
@@ -146,7 +139,7 @@ export interface IngestModelReadonly {
146139
* Search for an ExpectedPackage through the whole Rundown
147140
* @param id Id of the ExpectedPackage
148141
*/
149-
findExpectedPackage(packageId: ExpectedPackageId): ReadonlyDeep<ExpectedPackageForIngestModel> | undefined
142+
findExpectedPackageIngestSources(packageId: ExpectedPackageId): ReadonlyDeep<ExpectedPackageIngestSource>[]
150143
}
151144

152145
export interface IngestModel extends IngestModelReadonly, BaseModel, INotificationsModel {
@@ -214,11 +207,11 @@ export interface IngestModel extends IngestModelReadonly, BaseModel, INotificati
214207
*/
215208
setExpectedMediaItemsForRundownBaseline(expectedMediaItems: ExpectedMediaItemRundown[]): void
216209

217-
/**
218-
* Set the ExpectedPackages for the baseline of this Rundown
219-
* @param expectedPackages The new ExpectedPackages
220-
*/
221-
setExpectedPackagesForRundownBaseline(expectedPackages: ExpectedPackageForIngestModelBaseline[]): void
210+
// /**
211+
// * Set the ExpectedPackages for the baseline of this Rundown
212+
// * @param expectedPackages The new ExpectedPackages
213+
// */
214+
// setExpectedPackagesForRundownBaseline(expectedPackages: ExpectedPackageForIngestModelBaseline[]): void
222215

223216
/**
224217
* Set the data for this Rundown.
@@ -249,7 +242,8 @@ export interface IngestModel extends IngestModelReadonly, BaseModel, INotificati
249242
setRundownBaseline(
250243
timelineObjectsBlob: PieceTimelineObjectsBlob,
251244
adlibPieces: RundownBaselineAdLibItem[],
252-
adlibActions: RundownBaselineAdLibAction[]
245+
adlibActions: RundownBaselineAdLibAction[],
246+
expectedPackages: ExpectedPackageDBNew[]
253247
): Promise<void>
254248

255249
/**

0 commit comments

Comments
 (0)