@@ -11,7 +11,7 @@ import {
1111 VTContent ,
1212} from '@sofie-automation/blueprints-integration'
1313import { getExpectedPackageId } from '@sofie-automation/corelib/dist/dataModel/ExpectedPackages'
14- import { ExpectedPackageId , PeripheralDeviceId } from '@sofie-automation/corelib/dist/dataModel/Ids'
14+ import { ExpectedPackageId , PeripheralDeviceId , PieceInstanceId } from '@sofie-automation/corelib/dist/dataModel/Ids'
1515import {
1616 getPackageContainerPackageId ,
1717 PackageContainerPackageStatusDB ,
@@ -156,7 +156,9 @@ export function getMediaObjectMediaId(
156156 return undefined
157157}
158158
159- export type PieceContentStatusPiece = Pick < PieceGeneric , '_id' | 'content' | 'expectedPackages' >
159+ export type PieceContentStatusPiece = Pick < PieceGeneric , '_id' | 'content' | 'expectedPackages' > & {
160+ pieceInstanceId ?: PieceInstanceId
161+ }
160162export interface PieceContentStatusStudio
161163 extends Pick <
162164 Studio ,
@@ -506,60 +508,78 @@ async function checkPieceContentExpectedPackageStatus(
506508
507509 checkedPackageContainers . add ( packageContainerId )
508510
509- const expectedPackageId = getExpectedPackageId ( piece . _id , expectedPackage . _id )
510- const packageOnPackageContainer = await getPackageContainerPackageStatus (
511- packageContainerId ,
512- expectedPackageId
513- )
514- const packageName =
515- // @ts -expect-error hack
516- expectedPackage . content . filePath ||
517- // @ts -expect-error hack
518- expectedPackage . content . guid ||
519- expectedPackage . _id
520-
521- if ( ! thumbnailUrl && packageOnPackageContainer ) {
522- const sideEffect = getSideEffect ( expectedPackage , studio )
523-
524- const packageThumbnailPath = sideEffect . thumbnailPackageSettings ?. path
525- const thumbnailContainerId = sideEffect . thumbnailContainerId
526- if ( packageThumbnailPath && thumbnailContainerId ) {
527- thumbnailUrl = getAssetUrlFromExpectedPackages (
528- packageThumbnailPath ,
529- thumbnailContainerId ,
530- studio ,
531- packageOnPackageContainer
532- )
533- }
511+ const expectedPackageIds = [ getExpectedPackageId ( piece . _id , expectedPackage . _id ) ]
512+ if ( piece . pieceInstanceId ) {
513+ // If this is a PieceInstance, try looking up the PieceInstance first
514+ expectedPackageIds . unshift ( getExpectedPackageId ( piece . pieceInstanceId , expectedPackage . _id ) )
534515 }
535516
536- if ( ! previewUrl && packageOnPackageContainer ) {
537- const sideEffect = getSideEffect ( expectedPackage , studio )
538-
539- const packagePreviewPath = sideEffect . previewPackageSettings ?. path
540- const previewContainerId = sideEffect . previewContainerId
541- if ( packagePreviewPath && previewContainerId ) {
542- previewUrl = getAssetUrlFromExpectedPackages (
543- packagePreviewPath ,
544- previewContainerId ,
545- studio ,
546- packageOnPackageContainer
547- )
517+ let warningMessage : ContentMessage | null = null
518+ let matchedExpectedPackageId : ExpectedPackageId | null = null
519+ for ( const expectedPackageId of expectedPackageIds ) {
520+ const packageOnPackageContainer = await getPackageContainerPackageStatus (
521+ packageContainerId ,
522+ expectedPackageId
523+ )
524+ if ( ! packageOnPackageContainer ) continue
525+
526+ matchedExpectedPackageId = expectedPackageId
527+
528+ if ( ! thumbnailUrl ) {
529+ const sideEffect = getSideEffect ( expectedPackage , studio )
530+
531+ const packageThumbnailPath = sideEffect . thumbnailPackageSettings ?. path
532+ const thumbnailContainerId = sideEffect . thumbnailContainerId
533+ if ( packageThumbnailPath && thumbnailContainerId ) {
534+ thumbnailUrl = getAssetUrlFromExpectedPackages (
535+ packageThumbnailPath ,
536+ thumbnailContainerId ,
537+ studio ,
538+ packageOnPackageContainer
539+ )
540+ }
541+ }
542+
543+ if ( ! previewUrl ) {
544+ const sideEffect = getSideEffect ( expectedPackage , studio )
545+
546+ const packagePreviewPath = sideEffect . previewPackageSettings ?. path
547+ const previewContainerId = sideEffect . previewContainerId
548+ if ( packagePreviewPath && previewContainerId ) {
549+ previewUrl = getAssetUrlFromExpectedPackages (
550+ packagePreviewPath ,
551+ previewContainerId ,
552+ studio ,
553+ packageOnPackageContainer
554+ )
555+ }
548556 }
557+
558+ warningMessage = getPackageWarningMessage ( packageOnPackageContainer , sourceLayer )
559+
560+ // Found a packageOnPackageContainer
561+ break
549562 }
550563
551- const warningMessage = getPackageWarningMessage ( packageOnPackageContainer , sourceLayer )
552- if ( warningMessage ) {
553- messages . push ( warningMessage )
564+ if ( ! matchedExpectedPackageId || warningMessage ) {
565+ // If no package matched, we must have a warning
566+ messages . push ( warningMessage ?? getPackageSoruceMissingWarning ( sourceLayer ) )
554567 } else {
555568 // No warning, must be OK
556569
570+ const packageName =
571+ // @ts -expect-error hack
572+ expectedPackage . content . filePath ||
573+ // @ts -expect-error hack
574+ expectedPackage . content . guid ||
575+ expectedPackage . _id
576+
557577 readyCount ++
558578 packageInfos [ expectedPackage . _id ] = {
559579 packageName,
560580 }
561581 // Fetch scan-info about the package:
562- const dbPackageInfos = await getPackageInfos ( expectedPackageId )
582+ const dbPackageInfos = await getPackageInfos ( matchedExpectedPackageId )
563583 for ( const packageInfo of dbPackageInfos ) {
564584 if ( packageInfo . type === PackageInfo . Type . SCAN ) {
565585 packageInfos [ expectedPackage . _id ] . scan = packageInfo . payload
@@ -689,25 +709,28 @@ function getAssetUrlFromExpectedPackages(
689709 }
690710}
691711
712+ function getPackageSoruceMissingWarning ( sourceLayer : ISourceLayer ) : ContentMessage {
713+ // Examples of contents in packageOnPackageContainer?.status.statusReason.user:
714+ // * Target package: Quantel clip "XXX" not found
715+ // * Can't read the Package from PackageContainer "Quantel source 0" (on accessor "${accessorLabel}"), due to: Quantel clip "XXX" not found
716+
717+ return {
718+ status : PieceStatusCode . SOURCE_MISSING ,
719+ message : generateTranslation ( `{{sourceLayer}} can't be found on the playout system` , {
720+ sourceLayer : sourceLayer . name ,
721+ } ) ,
722+ }
723+ }
724+
692725function getPackageWarningMessage (
693- packageOnPackageContainer : Pick < PackageContainerPackageStatusDB , 'status' > | undefined ,
726+ packageOnPackageContainer : Pick < PackageContainerPackageStatusDB , 'status' > ,
694727 sourceLayer : ISourceLayer
695728) : ContentMessage | null {
696729 if (
697- ! packageOnPackageContainer ||
698730 packageOnPackageContainer . status . status ===
699- ExpectedPackageStatusAPI . PackageContainerPackageStatusStatus . NOT_FOUND
731+ ExpectedPackageStatusAPI . PackageContainerPackageStatusStatus . NOT_FOUND
700732 ) {
701- // Examples of contents in packageOnPackageContainer?.status.statusReason.user:
702- // * Target package: Quantel clip "XXX" not found
703- // * Can't read the Package from PackageContainer "Quantel source 0" (on accessor "${accessorLabel}"), due to: Quantel clip "XXX" not found
704-
705- return {
706- status : PieceStatusCode . SOURCE_MISSING ,
707- message : generateTranslation ( `{{sourceLayer}} can't be found on the playout system` , {
708- sourceLayer : sourceLayer . name ,
709- } ) ,
710- }
733+ return getPackageSoruceMissingWarning ( sourceLayer )
711734 } else if (
712735 packageOnPackageContainer . status . status ===
713736 ExpectedPackageStatusAPI . PackageContainerPackageStatusStatus . NOT_READY
0 commit comments