diff --git a/src/platform/assets/utils/assetMetadataUtils.ts b/src/platform/assets/utils/assetMetadataUtils.ts index b2201444d..acddf4950 100644 --- a/src/platform/assets/utils/assetMetadataUtils.ts +++ b/src/platform/assets/utils/assetMetadataUtils.ts @@ -149,3 +149,13 @@ export function getAssetUserDescription(asset: AssetItem): string { ? asset.user_metadata.user_description : '' } + +/** + * Gets the filename for an asset with fallback chain + * Checks user_metadata.filename first, then metadata.filename, then asset.name + * @param asset - The asset to extract filename from + * @returns The filename string + */ +export function getAssetFilename(asset: AssetItem): string { + return getStringProperty(asset, 'filename') ?? asset.name +} diff --git a/src/platform/assets/utils/createModelNodeFromAsset.test.ts b/src/platform/assets/utils/createModelNodeFromAsset.test.ts index cbc28f866..8594510b6 100644 --- a/src/platform/assets/utils/createModelNodeFromAsset.test.ts +++ b/src/platform/assets/utils/createModelNodeFromAsset.test.ts @@ -282,16 +282,6 @@ describe('createModelNodeFromAsset', () => { expectedCode: 'INVALID_ASSET' as const, errorPattern: /Invalid filename.*expected non-empty string/ }, - { - case: 'non-string filename', - overrides: { - user_metadata: { filename: 123 }, - metadata: undefined, - name: '' - }, - expectedCode: 'INVALID_ASSET' as const, - errorPattern: /Invalid filename.*expected non-empty string, got number/ - }, { case: 'empty filename with no fallback', overrides: { diff --git a/src/platform/assets/utils/createModelNodeFromAsset.ts b/src/platform/assets/utils/createModelNodeFromAsset.ts index dee53ef60..7bf8b752b 100644 --- a/src/platform/assets/utils/createModelNodeFromAsset.ts +++ b/src/platform/assets/utils/createModelNodeFromAsset.ts @@ -6,6 +6,7 @@ import { MISSING_TAG, MODELS_TAG } from '@/platform/assets/services/assetService' +import { getAssetFilename } from '@/platform/assets/utils/assetMetadataUtils' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import { app } from '@/scripts/app' import { useLitegraphService } from '@/services/litegraphService' @@ -69,11 +70,8 @@ export function createModelNodeFromAsset( const validAsset = validatedAsset.data - const userMetadata = validAsset.user_metadata ?? {} - - const filename = - userMetadata.filename || validAsset.metadata?.filename || validAsset.name - if (typeof filename !== 'string' || filename.length === 0) { + const filename = getAssetFilename(validAsset) + if (filename.length === 0) { console.error( `Asset ${validAsset.id} has invalid user_metadata.filename (expected non-empty string, got ${typeof filename})` ) diff --git a/src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts b/src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts index 9d2be02a8..75cf47fec 100644 --- a/src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts +++ b/src/renderer/extensions/vueNodes/widgets/composables/useComboWidget.ts @@ -13,6 +13,7 @@ import { assetFilenameSchema, assetItemSchema } from '@/platform/assets/schemas/assetSchema' +import { getAssetFilename } from '@/platform/assets/utils/assetMetadataUtils' import { assetService } from '@/platform/assets/services/assetService' import { isCloud } from '@/platform/distribution/types' import { useSettingStore } from '@/platform/settings/settingStore' @@ -115,7 +116,7 @@ const createAssetBrowserWidget = ( return } - const filename = validatedAsset.data.user_metadata?.filename + const filename = getAssetFilename(validatedAsset.data) const validatedFilename = assetFilenameSchema.safeParse(filename) if (!validatedFilename.success) {