Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions meteor/__mocks__/defaultCollectionObjects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,10 @@ export function defaultStudio(_id: StudioId): DBStudio {
routeSetsWithOverrides: wrapDefaultObject({}),
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
packageContainersWithOverrides: wrapDefaultObject({}),
previewContainerIds: [],
thumbnailContainerIds: [],
packageContainerIdsWithOverrides: wrapDefaultObject({
previewContainerIds: [],
thumbnailContainerIds: [],
}),
peripheralDeviceSettings: {
deviceSettings: wrapDefaultObject({}),
playoutDevices: wrapDefaultObject({}),
Expand Down
6 changes: 4 additions & 2 deletions meteor/server/__tests__/cronjobs.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -595,8 +595,10 @@ describe('cronjobs', () => {
routeSetsWithOverrides: newObjectWithOverrides({}),
routeSetExclusivityGroupsWithOverrides: newObjectWithOverrides({}),
packageContainersWithOverrides: newObjectWithOverrides({}),
previewContainerIds: [],
thumbnailContainerIds: [],
packageContainerIdsWithOverrides: newObjectWithOverrides({
previewContainerIds: [],
thumbnailContainerIds: [],
}),
peripheralDeviceSettings: {
deviceSettings: newObjectWithOverrides({}),
ingestDevices: newObjectWithOverrides({}),
Expand Down
6 changes: 4 additions & 2 deletions meteor/server/api/rest/v1/typeConversion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,10 @@ export async function studioFrom(apiStudio: APIStudio, existingId?: StudioId): P
_rundownVersionHash: '',
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
packageContainersWithOverrides: wrapDefaultObject({}),
previewContainerIds: [],
thumbnailContainerIds: [],
packageContainerIdsWithOverrides: wrapDefaultObject({
previewContainerIds: [],
thumbnailContainerIds: [],
}),
peripheralDeviceSettings: {
deviceSettings: wrapDefaultObject({}),
playoutDevices: wrapDefaultObject({}),
Expand Down
6 changes: 4 additions & 2 deletions meteor/server/api/studio/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,10 @@ export async function insertStudioInner(organizationId: OrganizationId | null, n
routeSetsWithOverrides: wrapDefaultObject({}),
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
packageContainersWithOverrides: wrapDefaultObject({}),
thumbnailContainerIds: [],
previewContainerIds: [],
packageContainerIdsWithOverrides: wrapDefaultObject({
thumbnailContainerIds: [],
previewContainerIds: [],
}),
peripheralDeviceSettings: {
deviceSettings: wrapDefaultObject({}),
playoutDevices: wrapDefaultObject({}),
Expand Down
6 changes: 4 additions & 2 deletions meteor/server/migration/0_1_0.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,10 @@ export const addSteps = addMigrationSteps('0.1.0', [
routeSetsWithOverrides: wrapDefaultObject({}),
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
packageContainersWithOverrides: wrapDefaultObject({}),
thumbnailContainerIds: [],
previewContainerIds: [],
packageContainerIdsWithOverrides: wrapDefaultObject({
thumbnailContainerIds: [],
previewContainerIds: [],
}),
peripheralDeviceSettings: {
deviceSettings: wrapDefaultObject({}),
playoutDevices: wrapDefaultObject({}),
Expand Down
3 changes: 3 additions & 0 deletions meteor/server/migration/X_X_X.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { addMigrationSteps } from './databaseMigration'
import { CURRENT_SYSTEM_VERSION } from './currentSystemVersion'
import { ContainerIdsToObjectWithOverridesMigrationStep } from './steps/ContainerIdsToObjectWithOverridesMigrationStep'

/*
* **************************************************************************************
Expand All @@ -13,4 +14,6 @@ import { CURRENT_SYSTEM_VERSION } from './currentSystemVersion'

export const addSteps = addMigrationSteps(CURRENT_SYSTEM_VERSION, [
// Add your migration here

new ContainerIdsToObjectWithOverridesMigrationStep(),
])
18 changes: 12 additions & 6 deletions meteor/server/migration/__tests__/migrations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,10 @@ describe('Migrations', () => {
routeSetsWithOverrides: wrapDefaultObject({}),
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
packageContainersWithOverrides: wrapDefaultObject({}),
previewContainerIds: [],
thumbnailContainerIds: [],
packageContainerIdsWithOverrides: wrapDefaultObject({
previewContainerIds: [],
thumbnailContainerIds: [],
}),
peripheralDeviceSettings: {
deviceSettings: wrapDefaultObject({}),
playoutDevices: wrapDefaultObject({}),
Expand Down Expand Up @@ -169,8 +171,10 @@ describe('Migrations', () => {
routeSetsWithOverrides: wrapDefaultObject({}),
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
packageContainersWithOverrides: wrapDefaultObject({}),
previewContainerIds: [],
thumbnailContainerIds: [],
packageContainerIdsWithOverrides: wrapDefaultObject({
previewContainerIds: [],
thumbnailContainerIds: [],
}),
peripheralDeviceSettings: {
deviceSettings: wrapDefaultObject({}),
playoutDevices: wrapDefaultObject({}),
Expand Down Expand Up @@ -212,8 +216,10 @@ describe('Migrations', () => {
routeSetsWithOverrides: wrapDefaultObject({}),
routeSetExclusivityGroupsWithOverrides: wrapDefaultObject({}),
packageContainersWithOverrides: wrapDefaultObject({}),
previewContainerIds: [],
thumbnailContainerIds: [],
packageContainerIdsWithOverrides: wrapDefaultObject({
previewContainerIds: [],
thumbnailContainerIds: [],
}),
peripheralDeviceSettings: {
deviceSettings: wrapDefaultObject({}),
playoutDevices: wrapDefaultObject({}),
Expand Down
14 changes: 6 additions & 8 deletions meteor/server/migration/databaseMigration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,8 @@ const coreMigrationSteps: Array<MigrationStepCore> = []
export function addMigrationSteps(version: string, steps: Array<Omit<MigrationStepCore, 'version'>>) {
return (): void => {
for (const step of steps) {
coreMigrationSteps.push({
...step,
version: version,
})
;(step as MigrationStepCore).version = version
coreMigrationSteps.push(step as MigrationStepCore)
}
}
}
Expand Down Expand Up @@ -134,9 +132,9 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
allMigrationSteps.push({
id: step.id,
overrideSteps: step.overrideSteps,
validate: step.validate,
validate: step.validate.bind(step),
canBeRunAutomatically: step.canBeRunAutomatically,
migrate: step.migrate,
migrate: step.migrate?.bind(step),
input: step.input,
dependOnResultFrom: step.dependOnResultFrom,
version: step.version,
Expand Down Expand Up @@ -187,9 +185,9 @@ export async function prepareMigration(returnAllChunks?: boolean): Promise<Prepa
prefixIdsOnStep('blueprint_' + blueprint._id + '_system_', {
id: step.id,
overrideSteps: step.overrideSteps,
validate: step.validate,
validate: step.validate.bind(step),
canBeRunAutomatically: step.canBeRunAutomatically,
migrate: step.migrate,
migrate: step.migrate?.bind(step),
input: step.input,
dependOnResultFrom: step.dependOnResultFrom,
version: step.version,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { MigrationStepCore } from '@sofie-automation/blueprints-integration'
import { Studios } from '../../collections'
import {
convertObjectIntoOverrides,
ObjectWithOverrides,
} from '@sofie-automation/corelib/dist/settings/objectWithOverrides'
import { StudioPackageContainerIds } from '@sofie-automation/shared-lib/dist/core/model/PackageContainer'

export class ContainerIdsToObjectWithOverridesMigrationStep implements Omit<MigrationStepCore, 'version'> {
public readonly id = `convert previewContainerIds to ObjectWithOverrides`
public readonly canBeRunAutomatically = true

public async validate(): Promise<boolean | string> {
const studios = await this.findStudiosToMigrate()

if (studios.length) {
return 'previewContainerIds and thumbnailContainerIds must be converted to an ObjectWithOverrides'
}

return false
}

public async migrate(): Promise<void> {
const studios = await this.findStudiosToMigrate()

for (const studio of studios) {
// @ts-expect-error previewContainerIds is typed as string[]
const oldPreviewContainerIds = studio.previewContainerIds
// @ts-expect-error thumbnailContainerIds is typed as string[]
const oldThumbnailContainerIds = studio.thumbnailContainerIds

const newPackageContainers = convertObjectIntoOverrides({
previewContainerIds: oldPreviewContainerIds ?? [],
thumbnailContainerIds: oldThumbnailContainerIds ?? [],
} satisfies StudioPackageContainerIds) as ObjectWithOverrides<StudioPackageContainerIds>

await Studios.updateAsync(studio._id, {
$set: {
packageContainerIdsWithOverrides: newPackageContainers,
},
$unset: {
previewContainerIds: 1,
thumbnailContainerIds: 1,
},
})
}
}

private async findStudiosToMigrate() {
return Studios.findFetchAsync({
$or: [{ previewContainerIds: { $exists: true } }, { thumbnailContainerIds: { $exists: true } }],
packageContainerIdsWithOverrides: { $exists: false },
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { CustomPublishCollection } from '../../../lib/customPublication'
import { logger } from '../../../logging'
import { ExpectedPackagesContentCache } from './contentCache'
import type { StudioFields } from './publication'
import { applyAndValidateOverrides } from '@sofie-automation/corelib/dist/settings/objectWithOverrides'

/**
* Regenerate the output for the provided ExpectedPackage `regenerateIds`, updating the data in `collection` as needed
Expand Down Expand Up @@ -176,10 +177,7 @@ enum Priorities {
}

function generateExpectedPackageForDevice(
studio: Pick<
StudioLight,
'_id' | 'packageContainersWithOverrides' | 'previewContainerIds' | 'thumbnailContainerIds'
>,
studio: Pick<StudioLight, '_id' | 'packageContainerIdsWithOverrides'>,
expectedPackage: PackageManagerExpectedPackageBase,
deviceId: PeripheralDeviceId,
pieceInstanceId: PieceInstanceId | null,
Expand Down Expand Up @@ -215,7 +213,9 @@ function generateExpectedPackageForDevice(
if (!combinedTargets.length) {
logger.warn(`Pub.expectedPackagesForDevice: No targets found for "${expectedPackage._id}"`)
}
expectedPackage.sideEffect = getSideEffect(expectedPackage, studio)

const packageContainerIds = applyAndValidateOverrides(studio.packageContainerIdsWithOverrides).obj
expectedPackage.sideEffect = getSideEffect(expectedPackage, packageContainerIds)

return {
_id: protectString(`${expectedPackage._id}_${deviceId}_${pieceInstanceId}`),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,13 @@ export type StudioFields =
| 'routeSetsWithOverrides'
| 'mappingsWithOverrides'
| 'packageContainersWithOverrides'
| 'previewContainerIds'
| 'thumbnailContainerIds'
| 'packageContainerIdsWithOverrides'
const studioFieldSpecifier = literal<MongoFieldSpecifierOnesStrict<Pick<DBStudio, StudioFields>>>({
_id: 1,
routeSetsWithOverrides: 1,
mappingsWithOverrides: 1,
packageContainersWithOverrides: 1,
previewContainerIds: 1,
thumbnailContainerIds: 1,
packageContainerIdsWithOverrides: 1,
})

async function setupExpectedPackagesPublicationObservers(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,8 +260,10 @@ describe('lib/mediaObjects', () => {
const mockStudio: Complete<PieceContentStatusStudio> = {
_id: mockDefaultStudio._id,
settings: mockStudioSettings,
previewContainerIds: ['previews0'],
thumbnailContainerIds: ['thumbnails0'],
packageContainerIds: {
previewContainerIds: ['previews0'],
thumbnailContainerIds: ['thumbnails0'],
},
routeSets: applyAndValidateOverrides(mockDefaultStudio.routeSetsWithOverrides).obj,
mappings: applyAndValidateOverrides(mockDefaultStudio.mappingsWithOverrides).obj,
packageContainers: applyAndValidateOverrides(mockDefaultStudio.packageContainersWithOverrides).obj,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import {
import { PieceContentStatusObj } from '@sofie-automation/corelib/dist/dataModel/PieceContentStatus'
import { PieceContentStatusMessageFactory, PieceContentStatusMessageRequiredArgs } from './messageFactory'
import { PackageStatusMessage } from '@sofie-automation/shared-lib/dist/packageStatusMessages'
import { StudioPackageContainerIds } from '@sofie-automation/shared-lib/dist/core/model/PackageContainer'

const DEFAULT_MESSAGE_FACTORY = new PieceContentStatusMessageFactory(undefined)

Expand Down Expand Up @@ -195,8 +196,7 @@ export function getMediaObjectMediaId(
export type PieceContentStatusPiece = Pick<PieceGeneric, '_id' | 'content' | 'expectedPackages' | 'name'> & {
pieceInstanceId?: PieceInstanceId
}
export interface PieceContentStatusStudio
extends Pick<DBStudio, '_id' | 'previewContainerIds' | 'thumbnailContainerIds'> {
export interface PieceContentStatusStudio extends Pick<DBStudio, '_id'> {
/** Mappings between the physical devices / outputs and logical ones */
mappings: MappingsExt
/** Route sets with overrides */
Expand All @@ -206,6 +206,8 @@ export interface PieceContentStatusStudio
*/
packageContainers: Record<string, StudioPackageContainer>

packageContainerIds: StudioPackageContainerIds

settings: IStudioSettings
}

Expand Down Expand Up @@ -645,7 +647,7 @@ async function checkPieceContentExpectedPackageStatus(
matchedExpectedPackageId = expectedPackageId

if (!thumbnailUrl) {
const sideEffect = getSideEffect(expectedPackage, studio)
const sideEffect = getSideEffect(expectedPackage, studio.packageContainerIds)

thumbnailUrl = await getAssetUrlFromPackageContainerStatus(
studio.packageContainers,
Expand All @@ -657,7 +659,7 @@ async function checkPieceContentExpectedPackageStatus(
}

if (!previewUrl) {
const sideEffect = getSideEffect(expectedPackage, studio)
const sideEffect = getSideEffect(expectedPackage, studio.packageContainerIds)

previewUrl = await getAssetUrlFromPackageContainerStatus(
studio.packageContainers,
Expand Down
9 changes: 3 additions & 6 deletions meteor/server/publications/pieceContentStatusUI/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,14 @@ export type StudioFields =
| '_id'
| 'settingsWithOverrides'
| 'packageContainersWithOverrides'
| 'previewContainerIds'
| 'thumbnailContainerIds'
| 'packageContainerIdsWithOverrides'
| 'mappingsWithOverrides'
| 'routeSetsWithOverrides'
export const studioFieldSpecifier = literal<MongoFieldSpecifierOnesStrict<Pick<DBStudio, StudioFields>>>({
_id: 1,
settingsWithOverrides: 1,
packageContainersWithOverrides: 1,
previewContainerIds: 1,
thumbnailContainerIds: 1,
packageContainerIdsWithOverrides: 1,
mappingsWithOverrides: 1,
routeSetsWithOverrides: 1,
})
Expand Down Expand Up @@ -113,8 +111,7 @@ export async function fetchStudio(studioId: StudioId): Promise<PieceContentStatu
return {
_id: studio._id,
settings: applyAndValidateOverrides(studio.settingsWithOverrides).obj,
previewContainerIds: studio.previewContainerIds,
thumbnailContainerIds: studio.thumbnailContainerIds,
packageContainerIds: applyAndValidateOverrides(studio.packageContainerIdsWithOverrides).obj,
mappings: applyAndValidateOverrides(studio.mappingsWithOverrides).obj,
routeSets: applyAndValidateOverrides(studio.routeSetsWithOverrides).obj,
packageContainers: applyAndValidateOverrides(studio.packageContainersWithOverrides).obj,
Expand Down
7 changes: 6 additions & 1 deletion packages/blueprints-integration/src/api/studio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,10 @@ import type {
StudioRouteSet,
StudioRouteSetExclusivityGroup,
} from '@sofie-automation/shared-lib/dist/core/model/StudioRouteSet'
import type { StudioPackageContainer } from '@sofie-automation/shared-lib/dist/core/model/PackageContainer'
import type {
StudioPackageContainer,
StudioPackageContainerIds,
} from '@sofie-automation/shared-lib/dist/core/model/PackageContainer'
import type { IStudioSettings } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings'

export interface StudioBlueprintManifest<TRawConfig = IBlueprintConfig, TProcessedConfig = unknown>
Expand Down Expand Up @@ -158,6 +161,8 @@ export interface BlueprintResultApplyStudioConfig {
routeSetExclusivityGroups?: Record<string, StudioRouteSetExclusivityGroup>
/** Package Containers */
packageContainers?: Record<string, StudioPackageContainer>
/** Which Package Containers are used for media previews/thumbnails in GUI */
packageContainerIds?: StudioPackageContainerIds

studioSettings?: IStudioSettings
}
Expand Down
10 changes: 6 additions & 4 deletions packages/corelib/src/dataModel/Studio.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ import {
StudioRouteType,
StudioAbPlayerDisabling,
} from '@sofie-automation/shared-lib/dist/core/model/StudioRouteSet'
import { StudioPackageContainer } from '@sofie-automation/shared-lib/dist/core/model/PackageContainer'
import {
StudioPackageContainer,
StudioPackageContainerIds,
} from '@sofie-automation/shared-lib/dist/core/model/PackageContainer'
import { IStudioSettings } from '@sofie-automation/shared-lib/dist/core/model/StudioSettings'

export { MappingsExt, MappingExt, MappingsHash, IStudioSettings }
Expand Down Expand Up @@ -76,9 +79,8 @@ export interface DBStudio {
*/
packageContainersWithOverrides: ObjectWithOverrides<Record<string, StudioPackageContainer>>

/** Which package containers is used for media previews in GUI */
previewContainerIds: string[]
thumbnailContainerIds: string[]
/** Which package containers are used for media previews/thumbnails in GUI */
packageContainerIdsWithOverrides: ObjectWithOverrides<StudioPackageContainerIds>

peripheralDeviceSettings: StudioPeripheralDeviceSettings

Expand Down
Loading
Loading