- terms.html: riscritto da 9 a 18 sezioni con indice cliccabile.
Include EULA (concessione, restrizioni, IP), Acceptable Use Policy
(cosa si puo'/non si puo' fare con i Contenuti), disclaimer marchi
terze parti (Spotify/YouTube/...), procedura DMCA, esclusione
garanzie AS IS, cap responsabilita = importo pagato negli ultimi
12 mesi, clausola di manleva (indemnification) a carico dell'utente.
- index.html: nuova box "Uso responsabile" sotto al pricing con i 4
punti chiave; FAQ ampliate (no affiliazione, segnalazioni copyright);
testo di accettazione esplicito Termini+Privacy+Refund sotto al CTA;
footer con titolarita "Luciano Zappacosta".
- css/style.css: stili per use-policy box e price-consent.
Linee guida prese da boilerplate di settore (4K Video Downloader,
JDownloader, MediaHuman) adattate al diritto italiano e GDPR.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- index.html: hero con mockup app, 6 feature cards, come funziona,
pricing 39,90 EUR, FAQ accordion, footer
- css/style.css: tema dark Spotify-like coerente con l'app
- js/main.js: animazioni scroll, hook Lemon Squeezy overlay
- legal/{terms,privacy,refund}.html: documenti richiesti da LS/GDPR
- _headers: HSTS, no-sniff, cache lunga per asset
- _redirects: placeholder per futuri /download/{macos,windows}
- README con istruzioni deploy push-to-deploy via Cloudflare Pages
Da fare prima del lancio: sostituire REPLACE_WITH_LS_PRODUCT_URL
in index.html con l'URL del prodotto Lemon Squeezy.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
L'input URL ora accetta anche query libere: se non sembra un link
(http/https/spotify:/dominio noto), il testo viene parsato come
{artist, name} e scaricato via download_playlist con una traccia.
Riusa lo stesso flusso ytsearch1: gia in uso per le tracklist da file.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Aggiunto helper subprocess_flags() in core/paths.py che ritorna
CREATE_NO_WINDOW su Windows. Applicato a tutte le subprocess.run/Popen
in downloader, upgrader e recorder per evitare il flash di console nera
ad ogni traccia scaricata.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Aggiunta una sezione 'Guida' (icona 📖, hero indaco) con manuale
d'uso interno, organizzato in 10 capitoli con sommario sticky a
sinistra:
- Introduzione, Setup iniziale
- Una sezione per ogni tab (Scarica, Video, Upgrade, Metadati,
Registra, Impostazioni)
- Aggiornamenti
- Troubleshooting con tabella di 8 sintomi/cause/fix
- Risorse esterne (GitHub, yt-dlp FAQ, BlackHole)
UX:
- Layout grid 200px (TOC) + content fluido. Su schermi <900px
il TOC diventa una row in alto
- TOC sticky con highlight del link attivo via IntersectionObserver
- Link esterni (data-ext) aperti nel browser di sistema via
open_external_url
- Hint nella tab Registra ora apre la sezione 'Tab Registra' della
guida invece del README su GitHub
- Box info/success/warn riusabili, stile <code> verde, <pre>
monospace, tabella troubleshooting
CSS:
- Nuova palette indigo + hero-indigo
- Stili .guide-layout, .guide-toc, .g-section, .g-box, .g-table,
.kbd, .toc-link.active
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Creata un'icona coerente con la palette dell'app: squircle Apple-style
(corner radius ~22%), gradient verde Spotify -> verde scuro, nota
musicale (♫) bianca centrata con leggero glow, sottile highlight in
alto e bordo soft per definizione.
- assets/generate_icon.py: script PIL riproducibile, produce
icon.png (master 1024) -> icon.iconset/ -> iconutil -> icon.icns
(macOS) e icon.ico multi-size (Windows)
- assets/icon.png / icon.icns / icon.ico committati
- assets/icon.iconset/ in .gitignore (intermedio rigenerabile)
- build_macos.py: --icon assets/icon.icns se presente
- build_windows.py: --icon assets/icon.ico se presente
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Tolgo dal tracking i file di playlist personali presenti nel
working tree fin dai primi commit:
- Beatport Top 100 Melodic House & Techno.txt
- PlayList_2026.txt
- PlayList_da_scaricare.txt
- Vibes_List.txt
Aggiunti i pattern al .gitignore cosi' non rientrano per sbaglio.
I file rimangono sul disco locale (git rm --cached, non -rf).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- main.py: titolo finestra pywebview -> 'MusicTools'
- core/config.py: APP_NAME='MusicTools', cartella config bundled
ora ~/Library/Application Support/MusicTools/ e %APPDATA%/MusicTools/.
Migrazione one-shot: se non esiste la nuova ma esiste la legacy
'MusicDownload', il config.json viene copiato cosi' le impostazioni
non vanno perse dopo l'aggiornamento
- core/recorder.py: messaggio errore permesso microfono
- api/bridge.py: User-Agent update check + guida Spotify menzionano
MusicTools
- build_macos.py / build_windows.py / .github/workflows/build.yml:
prodotti rinominati (MusicTools.app, MusicTools.exe,
MusicTools-macOS.zip, MusicTools-Windows.zip, Release 'Build MusicTools')
- webui: <title>, brand-name sidebar, intestazioni commenti
- README: tutti i riferimenti aggiornati + nota che il repo Git
conserva il nome storico 'musicdownload' (URL stabili per
release gia' pubblicate)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Aggiunto toggle Video/Solo audio nella tab Video. In modalita audio
yt-dlp scarica solo bestaudio ed estrae in MP3 al bitrate impostato
in Impostazioni (default 320 kbps), con embed thumbnail come la tab
Scarica.
- core/downloader.py: download_video() accetta audio_only e
audio_bitrate; quando True usa format 'bestaudio/best' e
--extract-audio --audio-format mp3
- api/bridge.py: start_video_download passa audio_only nel worker;
log mostra 'Solo audio MP3 320K' vs 'Video 1080p'
- webui: segmented control 'Video (MP4)' / 'Solo audio (MP3)' rosa,
selettore qualita nascosto in modalita audio, hint aggiornato
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- README: sezione 'Guida rapida' riscritta con installazione,
permesso microfono macOS, Setup A (output dedicato a BlackHole)
e Setup B (Multi-Output Device con BlackHole + altoparlanti,
Master Device + Drift Correction). Aggiunta tabella
Troubleshooting (5 sintomi tipici con fix)
- webui: hint nella tab Registra arricchito (riassunto a step
inline + link al README su GitHub via window open)
- CSS: .hint passa a align-items flex-start per contenuto
multi-riga, aggiunti stili per <code> e <a> dentro l'hint
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Il vecchio worker non drenava lo stderr di ffmpeg: dopo ~64KB il
pipe si bloccava e quando ffmpeg falliva subito (es. permesso
microfono negato su macOS) si vedeva solo 'ffmpeg exit -6' senza
contesto.
- Thread dedicato _drain_stderr() che legge stderr in continuo e
mantiene le ultime 50 righe in un buffer protetto
- _extract_friendly_error() riconosce i casi tipici e produce
messaggi italiani:
* exit -6 su macOS -> 'permesso Microfono mancante'
* Input/Output error -> 'dispositivo non disponibile'
* 'no such device' -> 'premere Aggiorna'
- Pre-flight check: aspetta che ffmpeg stampi 'Press [q]' (segnale
di device aperto) prima di emettere 'started'. Se ffmpeg muore
prima, l'errore viene segnalato senza falso 'recording in corso'
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Tabella riepilogativa delle 6 tab dell'app (Scarica, Video,
Upgrade, Metadati, Registra, Impostazioni) con descrizione
breve di ciascuna feature
- Sezione 'Auto-skip dei duplicati' e 'Sottocartella automatica
per le tracklist' (feature aggiunte in v1.2.x)
- Aggiunta 'mutagen' nelle dipendenze principali
- Nuova sezione 'Guida rapida: registrazione audio di sistema
(macOS)' con istruzioni complete per installare BlackHole
e creare un Multi-Output Device per sentire e registrare
contemporaneamente
- Struttura progetto: aggiunti core/metadata.py e core/recorder.py
- Esempio tag nel paragrafo 'Build & Release' bumpato a v1.3.0
- Nota sull'aggiornamento app: ricorda il vincolo del repo pubblico
per far funzionare l'API GitHub Releases
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>