@@ -213,10 +213,57 @@ export const fetchInfo = (id:string, path?:string) : Promise<Models.ImageInfo.Im
213213 // Ancient Micrio support -- this is only the case for ancient static info.json files
214214 /** @ts -ignore */
215215 if ( r ) { if ( 'Height' in r ) { r . height = r [ 'Height' ] ; r . version = 1.0 ; r . tileSize = 512 ; } if ( 'Width' in r ) r . width = r [ 'Width' ] }
216+ sanitizeImageInfo ( r as Models . ImageInfo . ImageInfo | undefined ) ;
216217 return r as Models . ImageInfo . ImageInfo | undefined ;
217218 } ) ;
218219}
219220
221+ /** @internal */
222+ const ASSET_SRC_REPLACE : Record < string , string > = {
223+ 'micrio-cdn.azureedge.net' : 'micrio.vangoghmuseum.nl/micrio' ,
224+ 'micrio-cdn.vangoghmuseum.nl' : 'micrio.vangoghmuseum.nl/micrio' ,
225+ 'rijks-micrio.azureedge.net' : 'micrio.rijksmuseum.nl'
226+ }
227+
228+ /** @internal */
229+ export const sanitizeAsset = ( a ?:Models . Assets . BaseAsset ) : void => {
230+ if ( a ?. src ) for ( let r in ASSET_SRC_REPLACE )
231+ if ( a . src . includes ( r ) ) a . src = a . src . replace ( r , ASSET_SRC_REPLACE [ r ] ) ;
232+ }
233+
234+ /** @internal */
235+ const sanitizeImageInfo = ( i :Models . ImageInfo . ImageInfo | undefined ) => {
236+ if ( ! i ) return ;
237+ sanitizeAsset ( i . organisation ?. logo ) ;
238+ sanitizeAsset ( i . settings ?. _markers ?. markerIcon ) ;
239+ i . settings ?. _markers ?. customIcons ?. forEach ( sanitizeAsset ) ;
240+ sanitizeAsset ( i . settings ?. _360 ?. video ) ;
241+ }
242+
243+ /** @internal */
244+ export const sanitizeImageData = ( d :Models . ImageData . ImageData | undefined , is360 :boolean , isV5 :boolean ) => {
245+ if ( ! d ) return ;
246+ if ( d . revision ) d . revision = Object . fromEntries ( Object . entries ( ( d . revision ?? { } ) ) . filter ( r => Number ( r [ 1 ] ) > 0 ) ) ;
247+ d . embeds ?. forEach ( e => {
248+ if ( ! e . uuid ) e . uuid = ( e . id ?? e . micrioId ) + '-' + Math . random ( ) ;
249+ sanitizeAsset ( e . video ) ;
250+ } ) ;
251+ d . markers ?. forEach ( m => sanitizeMarker ( m , is360 , ! isV5 ) ) ;
252+ d . music ?. items ?. forEach ( sanitizeAsset ) ;
253+ d . pages ?. forEach ( sanitizeMenuPage ) ;
254+ }
255+
256+ /** @internal */
257+ export const sanitizeSpaceData = ( s :Models . Spaces . Space | undefined ) => {
258+ s ?. icons ?. forEach ( sanitizeAsset ) ;
259+ }
260+
261+ /** @internal */
262+ const sanitizeMenuPage = ( m :Models . ImageData . Menu ) => {
263+ sanitizeAsset ( m . image ) ;
264+ m . children ?. forEach ( sanitizeMenuPage ) ;
265+ }
266+
220267/** Fetch album/info.json from i.micr.io
221268 * @internal
222269*/
@@ -234,13 +281,6 @@ export const sanitizeMarker = (m:Models.ImageData.Marker, is360:boolean, isOld:b
234281 if ( ! ( 'type' in m ) ) m . type = 'default' ;
235282 if ( ! m . popupType ) m . popupType = 'popup' ;
236283
237- // Old data model for split screen
238- const oldSplitLink = m . data ?. _meta ?. secondary ;
239- if ( oldSplitLink ) m . data . micrioSplitLink = oldSplitLink ;
240-
241- if ( isOld && 'class' in m ) m . tags . push ( ...( m . class as string ) . split ( ' ' ) . map ( t => t . trim ( ) ) . filter ( t => ! ! t && ! m . tags . includes ( t ) ) )
242- if ( m . tags . includes ( 'default' ) ) m . type = 'default' ;
243-
244284 // String-based marker icons
245285 if ( typeof m . data . icon == 'string' ) m . data . icon = {
246286 title : '' ,
@@ -251,6 +291,18 @@ export const sanitizeMarker = (m:Models.ImageData.Marker, is360:boolean, isOld:b
251291 src : m . data . icon as string
252292 }
253293
294+ m . images ?. forEach ( sanitizeAsset ) ;
295+ sanitizeAsset ( m . positionalAudio ) ;
296+ sanitizeAsset ( m . data ?. icon ) ;
297+ Object . values ( m . i18n ?? { } ) . forEach ( d => sanitizeAsset ( d . audio ) )
298+
299+ // Old data model for split screen
300+ const oldSplitLink = m . data ?. _meta ?. secondary ;
301+ if ( oldSplitLink ) m . data . micrioSplitLink = oldSplitLink ;
302+
303+ if ( isOld && 'class' in m ) m . tags . push ( ...( m . class as string ) . split ( ' ' ) . map ( t => t . trim ( ) ) . filter ( t => ! ! t && ! m . tags . includes ( t ) ) )
304+ if ( m . tags . includes ( 'default' ) ) m . type = 'default' ;
305+
254306 // Correct 360 marker view on the X-edge
255307 if ( is360 && m . view && m . view [ 2 ] < m . view [ 0 ] ) m . view [ 2 ] ++ ;
256308}
@@ -270,6 +322,7 @@ export async function loadSerialTour(image:MicrioImage, tour:Models.ImageData.Ma
270322 ) ) ) ;
271323
272324 micData . forEach ( d => d ?. markers ?. forEach ( m => sanitizeMarker ( m , image . is360 , ! image . isV5 ) ) ) ;
325+ sanitizeAsset ( tour . image ) ;
273326
274327 let chapter :number = - 1 ;
275328 const notFound :number [ ] = [ ] ;
@@ -281,10 +334,15 @@ export async function loadSerialTour(image:MicrioImage, tour:Models.ImageData.Ma
281334 if ( content ?. title ) chapter = i ;
282335 const vTourData = ! m ?. videoTour ? undefined : 'timeline' in m . videoTour ? < unknown > m as Models . ImageData . VideoTourCultureData
283336 : m . videoTour . i18n ?. [ lang ] ?? undefined ;
337+ sanitizeAsset ( vTourData ?. audio ) ;
338+ sanitizeAsset ( vTourData ?. subtitle ) ;
284339 if ( ! m ) {
285340 console . warn ( `[Micrio] Warning: tour step ${ i + 1 } with id [${ id } ] not found! Removing it from the tour` ) ;
286341 notFound . push ( i ) ;
287342 }
343+
344+ sanitizeAsset ( content ?. audio ) ;
345+
288346 return ! m ? undefined : {
289347 markerId : id ,
290348 marker : m ,
0 commit comments