Skip to content

Contratti API ​

TuneCamp espone un'API RESTful per la comunicazione tra la webapp e il backend, oltre a endpoint dedicati per ActivityPub e per il protocollo Subsonic. La specifica OpenAPI completa è contenuta in openapi.yml.

Autenticazione ​

La maggior parte degli endpoint richiede un JWT (JSON Web Token) nell'intestazione Authorization:

Authorization: Bearer <token>

È possibile ottenere un token inviando le proprie credenziali tramite una richiesta POST a /api/auth/login.


Endpoint Principali ​

Autenticazione (/api/auth) ​

MetodoPercorsoDescrizione
POST/api/users/registerRegistra un nuovo utente
POST/api/auth/loginAutentica l'utente e restituisce un JWT
GET/api/auth/statusRestituisce la sessione corrente e il profilo utente

Catalogo Musicale (/api/catalog, /api/tracks, /api/albums) ​

MetodoPercorsoDescrizione
GET/api/albumsElenca tutti gli album locali. Restituisce status (draft | published) e is_release (booleano) per distinguere i contenuti della libreria dalle release ufficiali
GET/api/albums/:idDettagli dell'album, inclusa la lista delle tracce
GET/api/artistsElenca tutti gli artisti
POST/api/tracksCrea una traccia dai metadati (un link, o una riga in attesa del suo file). L'audio non viene scaricato: la traccia nasce senza file_path finché non le si carica un file. Qui non esiste alcuna opzione localize — questo server non scarica audio dalle piattaforme di streaming
GET/api/tracksElenca le tracce visibili al chiamante. Ogni riga porta downloadable: se QUESTO utente può prendere il file, non solo ascoltarlo (i client che offrono un pulsante di download lo leggono invece di tirare a indovinare)
GET/api/tracks/:idMetadati della traccia
GET/api/tracks/:id/streamStream audio binario (supporta l'intestazione Range per le tracce cloud)
GET/api/tracks/:id/downloadScarica il file audio locale di una singola traccia. Vincolato alla modalità di distribuzione della release: il contenuto a pagamento richiede un codice di sblocco (?code=), un acquisto registrato o un abbonamento attivo (altrimenti 402); le release solo-streaming ed external showcase rispondono 403. Staff, proprietario e artista collegato scavalcano il gate
POST/api/tracks/:id/localizeSolo admin: copia una traccia su cloud (percorso gdrive://) in un file locale durevole. Le piattaforme di streaming vengono rifiutate con 400 — si usa Sidecamp
GET/api/albums/:id/downloadScarica uno ZIP dei file audio locali dell'album (esclude le tracce streaming/linkate). Stesso gate sulla modalità di distribuzione della rotta a traccia singola
GET/api/releases/:id/downloadScarica uno ZIP dei file audio locali di una release. Risolve id numerico o slug; le release private sono limitate a proprietario/admin e vale lo stesso gate sulla modalità di distribuzione della rotta a traccia singola
GET/api/waveform/:idDati della forma d'onda per la visualizzazione grafica
GET/api/releases/:id/artwork/:filenameServe in modo sicuro gli artwork aggiuntivi delle release

Campioni Gratuiti / Samples (/api/samples) ​

MetodoPercorsoDescrizione
GET/api/samplesElenca i campioni approvati. mine=true limita ai caricamenti del chiamante (qualsiasi stato); q filtra per termine di ricerca
GET/api/samples/moderation/pendingRoot-admin/admin/super-user: elenca i campioni in attesa di moderazione/curatela
GET/api/samples/:idMetadati del campione
GET/api/samples/:id/downloadScarica il file audio del campione. Supporta autenticazione tramite query ?token= (i campioni approvati sono pubblici; i campioni in sospeso richiedono il proprietario o un moderatore)
POST/api/samplesCarica un campione (multipart/form-data: file, title, description, bpm, musicalKey, license, attributionName, tags). Inizia nello stato pending
PUT/api/samples/:idAggiorna i metadati del campione (proprietario o moderatore)
DELETE/api/samples/:idElimina un campione (proprietario o moderatore)
POST/api/samples/:id/approveRoot-admin/admin/super-user: approva un campione in sospeso
POST/api/samples/:id/rejectRoot-admin/admin/super-user: rifiuta un campione in sospeso con note opzionali

I campioni gratuiti non sono asset di vendita: nessun prezzo, nessun flusso di acquisto o crediti. La licenza è una tra cc0, cc-by, cc-by-sa, royalty-free. Il caricamento è raggiungibile da /publish; la gestione dei propri caricamenti si trova nella scheda "Samples" su /my-music; la moderazione si trova in "Sample Curation" su /admin.

Pacchetti di Campioni / Sample Packs (/api/sample-packs) ​

MetodoPercorsoDescrizione
GET/api/sample-packsElenca i pacchetti approvati. mine=true limita ai propri pack (qualsiasi stato); q filtra per ricerca
GET/api/sample-packs/moderation/pendingRoot-admin/admin/super-user: elenca i pack in attesa di moderazione
GET/api/sample-packs/:idMetadati del pack inclusi i campioni membri
GET/api/sample-packs/:id/coverImmagine di copertina del pack; fallback su SVG segnaposto se non impostata
POST/api/sample-packsCarica più file contemporaneamente come pack (multipart/form-data: files[], title, description, license, attributionName). Stesse regole di pubblicazione di /api/samples; inizia in pending salvo auto-approvazione
POST/api/sample-packs/:id/coverImposta/sostituisce la copertina del pack (multipart/form-data: cover). Solo proprietario o moderatore
PUT/api/sample-packs/:idAggiorna i metadati del pack (proprietario o moderatore)
DELETE/api/sample-packs/:idElimina un pack e tutti i campioni associati (proprietario o moderatore)
POST/api/sample-packs/:id/approveRoot-admin/admin/super-user: approva un pack in sospeso (a cascata sui suoi campioni)
POST/api/sample-packs/:id/rejectRoot-admin/admin/super-user: rifiuta un pack in sospeso con note opzionali

Un campione inserito in un pack (samples.pack_id impostato) è escluso dall'elenco pubblico di /api/samples ed emerge unicamente attraverso il rispettivo pack.

Collab (/api/collab) ​

Tutte le route richiedono l'autenticazione. Vedi COLLAB.md per la documentazione completa.

MetodoPercorsoDescrizione
GET/api/collabElenca i progetti condivisi. mine=true limita ai propri
GET/api/collab/:idMetadati del progetto con relative versioni e stem
POST/api/collabCrea un progetto (richiede canPublishContent)
DELETE/api/collab/:idElimina un progetto e i suoi stem (solo proprietario)
POST/api/collab/:id/versionsSalva uno snapshot di versione append-only (state, note opzionale)
POST/api/collab/:id/stemsCarica uno stem audio (multipart/form-data: file, nome opzionale)
GET/api/collab/:id/stems/:stemId/downloadEsegue lo streaming audio di uno stem
DELETE/api/collab/:id/stems/:stemIdElimina uno stem (autore dello stem o proprietario del progetto)

Pagamenti e Monetizzazione (/api/payments) ​

MetodoPercorsoDescrizione
POST/api/payments/stripe/create-sessionCrea una sessione di Stripe Checkout per acquisti in valuta fiat
POST/api/payments/stripe/create-trackcap-sessionCrea una sessione di Stripe Checkout per acquistare slot aggiuntivi per il caricamento di tracce
GET/api/payments/onramp-configConfigurazione di Stripe Crypto Onramp
POST/api/payments/verifyVerifica una transazione on-chain (ETH/USDC) su Base
GET/api/payments/download/:trackId?code=...Scarica una traccia acquistata tramite codice di sblocco
GET/api/payments/rate/USDTasso di cambio corrente ETH/USD

Archiviazione e Cloud (/api/storage) ​

MetodoPercorsoDescrizione
GET/api/storage/gdrive/authAvvia il flusso OAuth2 di Google Drive
GET/api/storage/gdrive/filesElenca file e cartelle su Google Drive
POST/api/storage/gdrive/importImporta un file di Drive come riferimento gdrive://
POST/api/storage/gdrive/localize/:idScarica permanentemente un file cloud sul server locale

Metadati e Ricerca Esterna (/api/metadata) ​

MetodoPercorsoDescrizione
GET/api/metadata/search?q=...Cerca i metadati dell'album tra i provider esterni (MusicBrainz, Discogs, iTunes, TheAudioDB)
GET/api/metadata/lyrics?artist=...&title=...Recupera i testi delle canzoni tramite Lyrics.ovh
POST/api/metadata/applyApplica i metadati selezionati a una traccia locale

Social, Commenti e Post (/api/artists, /api/comments, /api/ap) ​

MetodoPercorsoDescrizione
GET/api/artists/:id/postsElenca i post pubblici di un artista
POST/api/admin/postsCrea un nuovo post (solo per amministratori)
GET/api/comments/track/:trackIdElenca i commenti per una traccia specifica
POST/api/comments/track/:trackIdAggiunge un commento (richiede autenticazione)
GET/api/ap/timeline/:artistIdAttività recente degli attori seguiti
GET/api/ap/users/:slugProfilo ActivityPub (actor) per un utente locale
POST/api/ap/inboxRiceve messaggi ActivityPub remoti in entrata
POST/api/releases/:id/reportSegnala una release per violazione di copyright o contenuti inappropriati
GET/api/admin/reportsElenca tutte le segnalazioni attive di release (solo amministratori)
DELETE/api/admin/reports/:idRisolve o archivia una segnalazione (solo amministratori)

Amministrazione (/api/admin) ​

MetodoPercorsoDescrizione
GET/api/admin/system/usersElenca gli utenti registrati (solo per amministratori)
POST/api/admin/system/rescanAvvia una scansione completa della libreria
POST/api/admin/upload/tracksArchivia uno o più file audio e li importa nella libreria (solo admin/artisti). releaseSlug li collega a una release; artist/album ne indicano il contenitore. title e trackNum impostano titolo e posizione di una traccia e valgono solo se viene inviato un singolo file — con più file ciascuno mantiene i propri tag. Li usa l'editor delle release per riempire una tracklist importata, i cui file raramente sono taggati come la release li elenca
POST/api/admin/upload/additional-artworksCarica più artwork/booklet aggiuntivi per una release (solo admin/artisti)
GET/api/admin/statsStatistiche di utilizzo del server e del database
GET/api/admin/system/resourcesSnapshot in tempo reale delle risorse del processo/host — CPU, memoria, RAM dell'host, dimensioni del database SQLite e attività in background in esecuzione (solo per amministratori root)
GET/api/admin/storage/overviewUtilizzo del disco a livello di istanza e suddivisione per utente (solo per amministratori root)

L'acquisizione di contenuti P2P (Soulseek, BitTorrent, yt-dlp) è stata spostata dal backend all'app desktop Sidecamp; i precedenti endpoint /api/admin/torrents* non esistono più.

Radio (/api/radio) ​

Una singola stazione sempre attiva che trasmette in streaming il catalogo dell'istanza. L'avvio/arresto è riservato agli amministratori; lo stream e i feed sono pubblici.

MetodoPercorsoDescrizione
GET/api/radioStato corrente della stazione (traccia in riproduzione, numero di ascoltatori)
POST/api/radio/startAvvia la stazione (solo per amministratori)
POST/api/radio/stopFerma la stazione (solo per amministratori)
GET/api/radio/stream.m3uPlaylist M3U per lettori esterni
GET/api/radio/feed.rssFeed RSS della stazione
GET/api/radio/hls/:filePlaylist/segmenti HLS per la riproduzione nel browser

Protocolli di Terze Parti ​

API Subsonic (/rest) ​

TuneCamp implementa il protocollo Subsonic (v1.16.1) per la compatibilità con i client mobili esistenti come DSub, Symfonium, Tempo e Substreamer.

  • Percorso di base: /rest/*.view
  • I metodi supportati includono: getAlbumList, getMusicDirectory, stream e altri.

Consulta SUBSONIC.md per la tabella di compatibilità completa.

Model Context Protocol (/api/mcp) ​

TuneCamp implementa il protocollo MCP in modo che i client IA esterni possano interrogare il catalogo e le statistiche del server.

MetodoPercorsoDescrizione
GET/api/mcp/sseApre il canale asincrono SSE. Richiede autenticazione Bearer tc_...
POST/api/mcp/messageInvia una richiesta JSON-RPC dal client al server

Vedi mcp-setup-guide.md per la configurazione del client.


Formato delle Risposte ​

Tutte le risposte delle API (eccetto gli stream audio) sono in formato JSON. In caso di errore, il server restituisce un codice di stato HTTP appropriato e un oggetto di errore:

json
{
  "error": "Messaggio di errore descrittivo"
}

Rilasciato sotto licenza MIT.