Skip to content

Commit ef6331d

Browse files
authored
Merge pull request #13 from Q42/feature/sanitize-asset-src
Feature/sanitize asset src
2 parents 8d74b65 + 16499ee commit ef6331d

File tree

2 files changed

+67
-14
lines changed

2 files changed

+67
-14
lines changed

src/ts/image.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { PREDEFINED } from '../types/internal';
88
import { BASEPATH, BASEPATH_V5, BASEPATH_V5_EU, DEFAULT_INFO, DEMO_IDS } from './globals';
99
import { Camera } from './camera';
1010
import { readable, writable, get } from 'svelte/store';
11-
import { createGUID, deepCopy, fetchInfo, fetchJson, getIdVal, getLocalData, idIsV5, isFetching, loadSerialTour, once, sanitizeMarker } from './utils';
11+
import { createGUID, deepCopy, fetchInfo, fetchJson, getIdVal, getLocalData, idIsV5, isFetching, loadSerialTour, once, sanitizeImageData, sanitizeMarker } from './utils';
1212
import { State } from './state';
1313
import { archive } from './archive';
1414

@@ -269,12 +269,7 @@ export class MicrioImage {
269269
this.video.subscribe(v => this._video = v);
270270

271271
// Sanitize markers on data set
272-
this.data.subscribe(d => {
273-
// Ignore unpublished or deleted data languages
274-
if(d?.revision) d.revision = Object.fromEntries(Object.entries((d?.revision??{})).filter(r => Number(r[1]) > 0));
275-
d?.markers?.forEach(m => sanitizeMarker(m, this.is360, !this.isV5));
276-
d?.embeds?.forEach(e => {if(!e.uuid) e.uuid = (e.id ?? e.micrioId)+'-'+Math.random()});
277-
})
272+
this.data.subscribe(d => sanitizeImageData(d, this.is360, this.isV5));
278273
}
279274

280275
private setError(e:Error, err?:string) {

src/ts/utils.ts

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)