tone3000 metadata capture: save .meta.json alongside downloaded models
- UI now sends full Tone3000 metadata on install (id, author, architecture, pack_name, description, thumbnail, etc.) - Search results show size, architecture, and pack name - Install endpoint saves a .meta.json file next to each .nam with: author, architecture, description, pack, thumbnail, download date - Enables offline browsing of model provenance
This commit is contained in:
@@ -1950,6 +1950,25 @@ class WebServer:
|
|||||||
path = await client.download_model(model)
|
path = await client.download_model(model)
|
||||||
if not path:
|
if not path:
|
||||||
raise HTTPException(status_code=500, detail="Download failed")
|
raise HTTPException(status_code=500, detail="Download failed")
|
||||||
|
# Save metadata alongside the model file
|
||||||
|
import json
|
||||||
|
meta = {
|
||||||
|
"id": data.get("id"),
|
||||||
|
"name": data.get("name"),
|
||||||
|
"filename": data.get("filename"),
|
||||||
|
"size_bytes": data.get("size"),
|
||||||
|
"author": data.get("author"),
|
||||||
|
"author_avatar": data.get("author_avatar"),
|
||||||
|
"thumbnail": data.get("thumbnail"),
|
||||||
|
"tone_description": data.get("tone_description"),
|
||||||
|
"pack_name": data.get("pack_name"),
|
||||||
|
"architecture": data.get("architecture"),
|
||||||
|
"created_at": data.get("created_at"),
|
||||||
|
"download_date": datetime.datetime.now().isoformat(),
|
||||||
|
"source": "tone3000",
|
||||||
|
}
|
||||||
|
meta_path = path.with_suffix(".meta.json")
|
||||||
|
meta_path.write_text(json.dumps(meta, indent=2))
|
||||||
# Refresh the model list via NAM host
|
# Refresh the model list via NAM host
|
||||||
nam = self.deps.nam_host
|
nam = self.deps.nam_host
|
||||||
if nam:
|
if nam:
|
||||||
|
|||||||
@@ -1021,10 +1021,10 @@ function init(){
|
|||||||
const d=document.createElement('div');
|
const d=document.createElement('div');
|
||||||
d.className='preset-card';
|
d.className='preset-card';
|
||||||
d.style.cursor='default';
|
d.style.cursor='default';
|
||||||
d.innerHTML='<div class="pc-name">'+(item.name||'Unknown')+'</div><div class="pc-num">'+(item.author||'')+'</div><button class="sr-action primary" style="margin-top:4px;align-self:flex-end">Get</button>';
|
d.innerHTML='<div class="pc-name">'+(item.name||'Unknown')+'</div><div class="pc-num">'+(item.author||'')+(item.pack_name?' · '+item.pack_name:'')+'</div><div style="font-size:8px;color:var(--text-dim);margin-top:2px">'+(item.size_display||'')+(item.architecture?' · '+item.architecture:'')+'</div><button class="sr-action primary" style="margin-top:4px;align-self:flex-end">Get</button>';
|
||||||
d.querySelector('button').onclick=async()=>{
|
d.querySelector('button').onclick=async()=>{
|
||||||
d.querySelector('button').textContent='...';
|
d.querySelector('button').textContent='...';
|
||||||
try{await API._fetch('/api/models/tonedownload/install',{method:'POST',body:JSON.stringify({download_url:item.download_url,name:item.name}),timeout:60000});toast('Downloaded!');d.querySelector('button').textContent='✓';}catch(e){toast(e.message);d.querySelector('button').textContent='Retry';}
|
try{await API._fetch('/api/models/tonedownload/install',{method:'POST',body:JSON.stringify({id:item.id,download_url:item.download_url,name:item.name,filename:item.filename,size:item.size,author:item.author,author_avatar:item.author_avatar,thumbnail:item.thumbnail,tone_description:item.tone_description,pack_name:item.pack_name,architecture:item.architecture,created_at:item.created_at}),timeout:60000});toast('Downloaded!');d.querySelector('button').textContent='✓';}catch(e){toast(e.message);d.querySelector('button').textContent='Retry';}
|
||||||
};
|
};
|
||||||
res.appendChild(d);
|
res.appendChild(d);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user