diff --git a/packages/stage-ui/src/utils/live2d-zip-loader.ts b/packages/stage-ui/src/utils/live2d-zip-loader.ts index cd62d9d43..945402950 100644 --- a/packages/stage-ui/src/utils/live2d-zip-loader.ts +++ b/packages/stage-ui/src/utils/live2d-zip-loader.ts @@ -2,7 +2,23 @@ import type { ModelSettings } from 'pixi-live2d-display/cubism4' import JSZip from 'jszip' -import { Cubism4ModelSettings, ZipLoader } from 'pixi-live2d-display/cubism4' +import { Cubism4ModelSettings, ModelSettings as ModelSettingsClass, ZipLoader } from 'pixi-live2d-display/cubism4' + +// TODO: this is a bit hacky, do we have other choice? +// NOTICE: Patch to handle UTF-8 encoded file paths in model settings +const originalValidateFiles = ModelSettingsClass.prototype.validateFiles +ModelSettingsClass.prototype.validateFiles = function (files: string[]): string[] { + const normalizedFiles = files.map((f) => { + try { + return decodeURI(f) + } + catch { + // Not a valid URI, return original string. + return f + } + }) + return originalValidateFiles.call(this, normalizedFiles) +} ZipLoader.zipReader = (data: Blob, _url: string) => JSZip.loadAsync(data)