feat(tonedownload): Tone3000 NAM + IR browser, real anon key, tests

- Tonedownload.py: Tone3000 API client with search/download/cache/enrich
- Server.py: 4 endpoints (search models, search IRs, install model, install IR)
- Models.html + irs.html: Browse Tone3000 tab with search, trending, offline
- Models.js + irs.js: Tone3000 search UI with install tracking via localStorage
- Style.css: Card layout for search results with thumbnail, meta, install btn
- Tests: 47 tests covering data classes, cache, API, search, download, enrichment
- Anon key: Updated from placeholder to real Supabase anon key (verified: API works)
This commit is contained in:
2026-06-09 01:39:12 -04:00
parent b4237f2f1d
commit a31342b478
8 changed files with 1789 additions and 2 deletions
+20
View File
@@ -42,6 +42,26 @@
<button class="btn btn-primary" onclick="uploadIR()">Upload</button>
</div>
</div>
<div class="card">
<div class="card-header">
<h2>Browse Tone3000 <span class="badge badge-tone3000">BETA</span></h2>
</div>
<div class="card-body">
<p class="hint">Search and download impulse responses directly from the Tone3000 community.</p>
<div class="tonedownload-search-row">
<input type="text" id="ir-tone-search" class="file-input tonedownload-input"
placeholder="Search IRs (e.g. Celestion V30)..." onkeydown="if(event.key==='Enter')searchToneIRs()">
<button class="btn btn-primary" onclick="searchToneIRs()">Search</button>
<button class="btn btn-secondary" onclick="loadTrendingIRs()">Trending</button>
</div>
<div id="ir-tone-loader" class="loading" style="display:none">Searching Tone3000...</div>
<div id="ir-tone-offline" class="tonedownload-offline" style="display:none">
<span>⚠ Offline — search unavailable</span>
</div>
<div id="ir-tone-results" class="tonedownload-results"></div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
+20
View File
@@ -42,6 +42,26 @@
<button class="btn btn-primary" onclick="uploadModel()">Upload</button>
</div>
</div>
<div class="card">
<div class="card-header">
<h2>Browse Tone3000 <span class="badge badge-tone3000">BETA</span></h2>
</div>
<div class="card-body">
<p class="hint">Search and download NAM models directly from the Tone3000 community.</p>
<div class="tonedownload-search-row">
<input type="text" id="model-tone-search" class="file-input tonedownload-input"
placeholder="Search models (e.g. Marshall JCM800)..." onkeydown="if(event.key==='Enter')searchToneModels()">
<button class="btn btn-primary" onclick="searchToneModels()">Search</button>
<button class="btn btn-secondary" onclick="loadTrendingModels()">Trending</button>
</div>
<div id="model-tone-loader" class="loading" style="display:none">Searching Tone3000...</div>
<div id="model-tone-offline" class="tonedownload-offline" style="display:none">
<span>⚠ Offline — search unavailable</span>
</div>
<div id="model-tone-results" class="tonedownload-results"></div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}