Skip to content

Architecture technique

Vue d'ensemble

Stack technique

ComposantTechnologieRôle
Framework desktopTauri 2.x (Rust)Fenêtre native, IPC, packaging
InterfaceVue.js 3 + Composition APIUI réactive
État globalPiniaState management
Internationalisationvue-i18nFR / EN / ES / JA
CommunicationWebSocket (tokio-tungstenite)OBS overlay + Stream Deck
Tests unitairesVitestComposables, stores
Tests E2EPlaywrightFlux complets

Les quatre composants

1. Application principale (Tauri)

Le cœur du système. L'utilisateur y gère sa setlist, configure ses platines et contrôle la lecture. Toute modification déclenche un broadcast WebSocket vers tous les clients connectés.

Construite avec Vue.js 3 côté UI et Rust côté backend. Tauri assure le pont entre les deux via des commandes IPC typées.

2. OBS Overlay

Un simple fichier HTML (obs-overlay/index.html) ajouté comme Browser Source dans OBS Studio. Il se connecte au WebSocket de l'application et met à jour l'affichage à chaque message PLAYING_UPDATE. Aucun serveur externe requis — tout passe par localhost.

3. Plugin Stream Deck

Un plugin JavaScript pour Elgato Stream Deck. Chaque bouton représente une platine. Il se connecte au même WebSocket et envoie des commandes en retour (TOGGLE_DECK, PLAY_TRACK, STOP_DECK). Les boutons se mettent à jour dynamiquement (pochette, titre, état playing/idle).

4. Widget npm dlp-player

Un package JavaScript autonome (publication npm à venir). Il lit un JSON de playlist exporté depuis DLP et synchronise l'affichage des tracks avec un lecteur média (<video>, <audio>, iframe YouTube ou SoundCloud). Deux modes d'affichage : list (tracklist à côté du lecteur) et overlay (superposé en bas). Aucune dépendance avec l'application desktop — fonctionne entièrement côté client.

Le serveur WebSocket

Le backend Rust démarre un serveur WebSocket sur localhost:9876 au lancement de l'application. Il gère :

  • Les connexions multiples — OBS Overlay + Stream Deck peuvent être connectés simultanément
  • Le broadcast — quand un track change, tous les clients reçoivent PLAYING_UPDATE
  • La synchronisation config — le plugin Stream Deck demande GET_DECKS_CONFIG au démarrage pour récupérer les platines configurées

Protocole

Tout client WebSocket peut se connecter — pas d'authentification, le serveur est uniquement local.

javascript
const ws = new WebSocket('ws://localhost:9876')

ws.onmessage = (event) => {
  const { type, payload } = JSON.parse(event.data)
  if (type === 'PLAYING_UPDATE') {
    // Mettre à jour l'affichage
  }
}

Messages sortants (App → Clients)

PLAYING_UPDATE — Envoyé quand les tracks en cours de lecture changent.

json
{
  "type": "PLAYING_UPDATE",
  "payload": {
    "tracks": [
      {
        "id": "uuid",
        "title": "Titre du morceau",
        "artist": "Nom de l'artiste",
        "image": "data:image/jpeg;base64,... ou URL",
        "deckName": "Vinyl 1",
        "qrCodeUrl": "https://..."
      }
    ]
  }
}

DECK_CANDIDATES — Réponse à GET_DECK_CANDIDATES. Fournit les tracks disponibles pour une platine donnée.

json
{
  "type": "DECK_CANDIDATES",
  "payload": {
    "deckId": "deck-1",
    "currentlyPlaying": { "id": "...", "title": "...", "artist": "...", "image": "..." },
    "lastPlayed":       { "id": "...", "title": "...", "artist": "...", "image": "..." },
    "nextUnplayed":     { "id": "...", "title": "...", "artist": "...", "image": "..." }
  }
}

DECKS_CONFIG — Réponse à GET_DECKS_CONFIG. Liste toutes les platines configurées.

json
{
  "type": "DECKS_CONFIG",
  "payload": {
    "decks": [
      { "id": "deck-1", "name": "Vinyl 1", "deckType": "vinyl", "image": "data:image/png;base64,..." },
      { "id": "deck-2", "name": "CDJ 1",   "deckType": "cd",    "image": "data:image/png;base64,..." }
    ]
  }
}

CONFIG_UPDATE — Envoyé quand la configuration visuelle de l'overlay change (thème, options d'affichage, animations).

Messages entrants (Clients → App)

MessagePayloadDescription
GET_DECKS_CONFIG{}Demander la liste des platines configurées
TOGGLE_DECK{ "deck_id": "deck-1" }Activer/désactiver une platine
GET_DECK_CANDIDATES{ "deck_id": "deck-1" }Demander les tracks candidates pour une platine
PLAY_TRACK{ "track_id": "uuid" }Lancer la lecture d'un track
STOP_DECK{ "deck_id": "deck-1" }Arrêter une platine

Types de platine

ValeurDescription
vinylPlatine vinyle
cdLecteur CD / CDJ
controllerContrôleur DJ
softwareLogiciel (Rekordbox, Serato, Traktor...)

Gestion des versions

La version est définie une seule fois dans package.json et synchronisée automatiquement vers tauri.conf.json et Cargo.toml via un script sync-version.js, appelé automatiquement avant chaque build et tauri via les hooks npm prebuild / pretauri.