ui: tab Diritti con tabella streaming + export CSV + settings Jamendo

- Nav item "⚖️ Diritti" nel gruppo Organizza (dopo Upgrade), feature=audio
- View #view-royalty: hero amber, folder picker, checkbox recursive,
  progress bar, tabella streaming (file · artista · titolo · stato ·
  match+licenza) con badge colorati
- Hint esplicito: "Non trovato" NON implica SIAE
- Modulo RoyaltyUI (pattern CatalogUI/DedupUI): streaming via
  royalty:progress / royalty:entry / royalty:done, link ai match
  aperti via open_external_url, export CSV client-side (Blob + download)
- Settings: nuovo campo jamendo_client_id (opzionale) + hint link
  devportal.jamendo.com; save/load via save_settings
- CSS: .royalty-scroll, .royalty-table, .royalty-badge-*,
  .royalty-row-rf/error, .progress-fill.amber, .percent.amber

node --check webui/js/app.js OK · 184 test verdi.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
lucianoandClaude Opus 4.7 committed 2026-10-09 14:29:45 +02:00
1 parent ddacd050d8
commit 8266722654
3 files changed
+544

No files matched your search

+110
View File
@@ -76,6 +76,10 @@
<span class="nav-icon">⚡</span>
<span>Upgrade</span>
</button>
<button class="nav-item" data-view="royalty" data-feature="audio">
<span class="nav-icon">⚖️</span>
<span>Diritti</span>
</button>
<div class="nav-section-label">Altro</div>
<button class="nav-item" data-view="record" data-feature="record">
@@ -591,6 +595,22 @@
</div>
</div>
<h2 class="section-label">Jamendo (tab Diritti)</h2>
<div class="card">
<div class="field">
<label class="field-label">Jamendo client_id (opzionale, per check royalty-free)</label>
<input type="text" id="jamendoClientIdInput" class="input pill" placeholder="Es: 0e23c33a" />
<div class="hint">
<span class="hint-ico">ⓘ</span>
<div>
Registrati gratis su <code>devportal.jamendo.com</code> per avere una chiave e
verificare contro il catalogo Jamendo (~500k brani Creative Commons).
Senza chiave la tab Diritti usa solo ccMixter.
</div>
</div>
</div>
</div>
<h2 class="section-label">Download</h2>
<div class="card">
<div class="field">
@@ -1709,6 +1729,96 @@
</div>
</section>
<!-- ===== VIEW: DIRITTI (royalty-free check) ===== -->
<section class="view" id="view-royalty">
<header class="hero hero-amber">
<div class="hero-content">
<div class="hero-eyebrow amber">DIRITTI</div>
<h1 class="hero-title">Royalty-free o da verificare</h1>
<p class="hero-subtitle">
Confronta i brani locali con i cataloghi Creative Commons
(ccMixter, Jamendo). Segnala solo i brani con match certo RF —
gli altri richiedono verifica manuale.
</p>
</div>
<div class="hero-deco">⚖️</div>
</header>
<h2 class="section-label">Cartella da analizzare</h2>
<div class="card">
<div class="beatport-header">
<button id="royalty-pick-folder" class="btn btn-primary pill">📁 Scegli cartella</button>
<button id="royalty-start-btn" class="btn btn-amber pill" disabled>
<span class="ico">▶</span> Avvia analisi
</button>
<button id="royalty-stop-btn" class="btn btn-danger pill" hidden>
<span class="ico">◼</span> Interrompi
</button>
</div>
<div class="beatport-header" style="margin-top:12px;">
<span id="royalty-path-display" class="beatport-output-info" style="margin:0;">Nessuna cartella selezionata</span>
</div>
<div class="beatport-header" style="margin-top:12px;gap:16px;">
<label style="display:flex;gap:6px;align-items:center;color:var(--text-2);font-size:13px;">
<input type="checkbox" id="royalty-recursive" checked />
<span>Ricerca ricorsiva (include sottocartelle)</span>
</label>
</div>
<div class="hint" style="margin-top:10px;">
<span class="hint-ico">ⓘ</span>
<div>
L'app verifica solo contro DB <strong>Creative Commons / royalty-free</strong>.
"Non trovato" NON implica automaticamente SIAE: significa "da verificare manualmente".
Per abilitare anche Jamendo registra una <code>client_id</code> gratuita su
<code>devportal.jamendo.com</code> e inseriscila in Impostazioni.
</div>
</div>
<div id="royalty-status" class="beatport-status"></div>
</div>
<h2 class="section-label">Progresso</h2>
<div class="card">
<div class="progress">
<div class="progress-bar"><div id="royaltyProgressFill" class="progress-fill amber"></div></div>
<div class="progress-meta">
<span id="royaltyPercent" class="percent amber">0%</span>
<span id="royaltyCounter">In attesa</span>
</div>
</div>
</div>
<h2 class="section-label">Risultati</h2>
<div class="card" id="royalty-summary-card" hidden>
<div class="catalog-summary" id="royalty-summary-line"></div>
</div>
<div id="royalty-table-wrap" class="royalty-scroll" hidden>
<table class="catalog-table royalty-table">
<thead>
<tr>
<th class="royalty-col-file">File</th>
<th class="royalty-col-artist">Artista</th>
<th class="royalty-col-title">Titolo</th>
<th class="royalty-col-status">Stato</th>
<th class="royalty-col-match">Match / Licenza</th>
</tr>
</thead>
<tbody id="royalty-table-body"></tbody>
</table>
</div>
<div class="catalog-footer-bar" id="royalty-footer-bar" hidden>
<span class="counter" id="royalty-footer-count">0 file analizzati</span>
<button id="royalty-export-csv" class="btn btn-ghost pill" disabled>
<span class="ico">📄</span> Esporta CSV
</button>
</div>
<h2 class="section-label">Log</h2>
<div class="card log-card">
<div class="log" id="royalty-log"></div>
</div>
</section>
</main>
</div>