@@ -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,72 @@ 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 ,
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 ) )
515+ }
516+
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+ thumbnailUrl = await getAssetUrlFromPackageContainerStatus (
530532 studio ,
531- packageOnPackageContainer
533+ getPackageContainerPackageStatus ,
534+ expectedPackageId ,
535+ sideEffect . thumbnailContainerId ,
536+ sideEffect . thumbnailPackageSettings ?. path
532537 )
533538 }
534- }
535539
536- if ( ! previewUrl && packageOnPackageContainer ) {
537- const sideEffect = getSideEffect ( expectedPackage , studio )
540+ if ( ! previewUrl ) {
541+ const sideEffect = getSideEffect ( expectedPackage , studio )
538542
539- const packagePreviewPath = sideEffect . previewPackageSettings ?. path
540- const previewContainerId = sideEffect . previewContainerId
541- if ( packagePreviewPath && previewContainerId ) {
542- previewUrl = getAssetUrlFromExpectedPackages (
543- packagePreviewPath ,
544- previewContainerId ,
543+ previewUrl = await getAssetUrlFromPackageContainerStatus (
545544 studio ,
546- packageOnPackageContainer
545+ getPackageContainerPackageStatus ,
546+ expectedPackageId ,
547+ sideEffect . previewContainerId ,
548+ sideEffect . previewPackageSettings ?. path
547549 )
548550 }
551+
552+ warningMessage = getPackageWarningMessage ( packageOnPackageContainer , sourceLayer )
553+
554+ // Found a packageOnPackageContainer
555+ break
549556 }
550557
551- const warningMessage = getPackageWarningMessage ( packageOnPackageContainer , sourceLayer )
552- if ( warningMessage ) {
553- messages . push ( warningMessage )
558+ if ( ! matchedExpectedPackageId || warningMessage ) {
559+ // If no package matched, we must have a warning
560+ messages . push ( warningMessage ?? getPackageSoruceMissingWarning ( sourceLayer ) )
554561 } else {
555562 // No warning, must be OK
556563
564+ const packageName =
565+ // @ts -expect-error hack
566+ expectedPackage . content . filePath ||
567+ // @ts -expect-error hack
568+ expectedPackage . content . guid ||
569+ expectedPackage . _id
570+
557571 readyCount ++
558572 packageInfos [ expectedPackage . _id ] = {
559573 packageName,
560574 }
561575 // Fetch scan-info about the package:
562- const dbPackageInfos = await getPackageInfos ( expectedPackageId )
576+ const dbPackageInfos = await getPackageInfos ( matchedExpectedPackageId )
563577 for ( const packageInfo of dbPackageInfos ) {
564578 if ( packageInfo . type === PackageInfo . Type . SCAN ) {
565579 packageInfos [ expectedPackage . _id ] . scan = packageInfo . payload
@@ -658,15 +672,32 @@ async function checkPieceContentExpectedPackageStatus(
658672 }
659673}
660674
675+ async function getAssetUrlFromPackageContainerStatus (
676+ studio : PieceContentStatusStudio ,
677+ getPackageContainerPackageStatus : (
678+ packageContainerId : string ,
679+ expectedPackageId : ExpectedPackageId
680+ ) => Promise < PackageContainerPackageStatusLight | undefined > ,
681+ expectedPackageId : ExpectedPackageId ,
682+ assetContainerId : string | null | undefined ,
683+ packageAssetPath : string | undefined
684+ ) : Promise < string | undefined > {
685+ if ( ! assetContainerId || ! packageAssetPath ) return
686+
687+ const assetPackageContainer = studio . packageContainers [ assetContainerId ]
688+ if ( ! assetPackageContainer ) return
689+
690+ const previewPackageOnPackageContainer = await getPackageContainerPackageStatus ( assetContainerId , expectedPackageId )
691+ if ( ! previewPackageOnPackageContainer ) return
692+
693+ return getAssetUrlFromExpectedPackages ( packageAssetPath , assetPackageContainer , previewPackageOnPackageContainer )
694+ }
695+
661696function getAssetUrlFromExpectedPackages (
662697 assetPath : string ,
663- assetContainerId : string ,
664- studio : PieceContentStatusStudio ,
698+ packageContainer : StudioPackageContainer ,
665699 packageOnPackageContainer : Pick < PackageContainerPackageStatusDB , 'status' >
666700) : string | undefined {
667- const packageContainer = studio . packageContainers [ assetContainerId ]
668- if ( ! packageContainer ) return
669-
670701 if ( packageOnPackageContainer . status . status !== ExpectedPackageStatusAPI . PackageContainerPackageStatusStatus . READY )
671702 return
672703
@@ -689,25 +720,28 @@ function getAssetUrlFromExpectedPackages(
689720 }
690721}
691722
723+ function getPackageSoruceMissingWarning ( sourceLayer : ISourceLayer ) : ContentMessage {
724+ // Examples of contents in packageOnPackageContainer?.status.statusReason.user:
725+ // * Target package: Quantel clip "XXX" not found
726+ // * Can't read the Package from PackageContainer "Quantel source 0" (on accessor "${accessorLabel}"), due to: Quantel clip "XXX" not found
727+
728+ return {
729+ status : PieceStatusCode . SOURCE_MISSING ,
730+ message : generateTranslation ( `{{sourceLayer}} can't be found on the playout system` , {
731+ sourceLayer : sourceLayer . name ,
732+ } ) ,
733+ }
734+ }
735+
692736function getPackageWarningMessage (
693- packageOnPackageContainer : Pick < PackageContainerPackageStatusDB , 'status' > | undefined ,
737+ packageOnPackageContainer : Pick < PackageContainerPackageStatusDB , 'status' > ,
694738 sourceLayer : ISourceLayer
695739) : ContentMessage | null {
696740 if (
697- ! packageOnPackageContainer ||
698741 packageOnPackageContainer . status . status ===
699- ExpectedPackageStatusAPI . PackageContainerPackageStatusStatus . NOT_FOUND
742+ ExpectedPackageStatusAPI . PackageContainerPackageStatusStatus . NOT_FOUND
700743 ) {
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- }
744+ return getPackageSoruceMissingWarning ( sourceLayer )
711745 } else if (
712746 packageOnPackageContainer . status . status ===
713747 ExpectedPackageStatusAPI . PackageContainerPackageStatusStatus . NOT_READY
0 commit comments