feat(relink): accept CivitArchive URLs when linking models

This commit is contained in:
Will Miao
2026-08-26 21:31:30 +08:00
parent 3025c64fea
commit 641a61f804
21 changed files with 756 additions and 121 deletions
+45
View File
@@ -11,6 +11,7 @@ import {
getThumbnailUrl,
extractCivitaiImageId,
extractCivitaiModelUrlParts,
classifyModelRelinkUrl,
isCivitaiUrl,
isSupportedCivitaiPageHost,
OptimizationMode
@@ -305,4 +306,48 @@ describe('civitaiUtils', () => {
expect(extractCivitaiImageId('https://example.com/images/126920345')).toBe(null);
});
});
describe('classifyModelRelinkUrl', () => {
it('classifies civitai.com model URLs', () => {
expect(
classifyModelRelinkUrl('https://civitai.com/models/649516/name?modelVersionId=726676')
).toEqual({ source: 'civitai', modelId: '649516', modelVersionId: '726676' });
});
it('classifies civitai.red model URLs without a version id', () => {
expect(
classifyModelRelinkUrl('https://civitai.red/models/65423/')
).toEqual({ source: 'civitai', modelId: '65423', modelVersionId: null });
});
it('classifies civarchive and civitaiarchive model URLs', () => {
expect(
classifyModelRelinkUrl('https://civarchive.com/models/1746460')
).toEqual({ source: 'civarchive', modelId: '1746460', modelVersionId: null });
expect(
classifyModelRelinkUrl('http://www.civitaiarchive.com/models/42?modelVersionId=43')
).toEqual({ source: 'civarchive', modelId: '42', modelVersionId: '43' });
});
it('rejects archive hosts when the path has no numeric model id', () => {
expect(
classifyModelRelinkUrl('https://civarchive.com/images/123')
).toEqual({ source: null, modelId: null, modelVersionId: null });
});
it('rejects unsupported hosts and malformed input', () => {
expect(
classifyModelRelinkUrl('https://example.com/models/65423')
).toEqual({ source: null, modelId: null, modelVersionId: null });
expect(
classifyModelRelinkUrl('not a url')
).toEqual({ source: null, modelId: null, modelVersionId: null });
expect(
classifyModelRelinkUrl('')
).toEqual({ source: null, modelId: null, modelVersionId: null });
expect(
classifyModelRelinkUrl(null)
).toEqual({ source: null, modelId: null, modelVersionId: null });
});
});
});