#lang racket/base (require racket/cmdline racket/format racket/string simple-log "private/player-agent-config.rkt" "private/player-agent-core.rkt") (provide run-player-agent-cli) (define (track-description track) (cond ((not track) "geen track") (else (define title (hash-ref track 'title #f)) (define artist (hash-ref track 'artist #f)) (define filename (hash-ref track 'filename "onbekend")) (cond ((and artist title (not (string=? artist ""))) (format "~a — ~a" artist title)) (title title) (else filename))))) (define (run-player-agent-cli #:server-url [server-override #f] #:name [name-override #f] #:config-file [config-file #f]) (sl-log-to-display) (define loaded (if config-file (load-player-agent-config config-file) (load-player-agent-config))) (define server-url (string-trim (or server-override (player-agent-config-server-url loaded)))) (define name (string-trim (or name-override (player-agent-config-name loaded)))) (define config (struct-copy player-agent-config loaded (server-url server-url) (name name))) (save-player-agent-config! config) (define (write-status message) (printf "[agent] ~a~n" message) (flush-output)) (define runtime (make-player-agent-runtime server-url name (player-agent-config-app-id config) #:status-callback write-status #:denied-callback (lambda (message) (eprintf "~a~n" message) (flush-output (current-error-port))))) (printf "RKT Web Player CLI Agent~n") (printf "Naam: ~a~n" name) (printf "Server: ~a~n" server-url) (printf "Applicatie-ID: ~a~n" (player-agent-config-app-id config)) (printf "Stoppen: Ctrl+C~n") (flush-output) (define monitor #f) (dynamic-wind (lambda () ((player-agent-runtime-start! runtime)) (set! monitor (thread (lambda () (let loop ((previous #f)) (define snapshot ((player-agent-runtime-snapshot runtime))) (define summary (cons (hash-ref snapshot 'state "stopped") (track-description ((player-agent-runtime-current-track runtime))))) (unless (equal? summary previous) (printf "[playback] ~a — ~a~n" (car summary) (cdr summary)) (flush-output)) (sleep 1) (loop summary)))))) (lambda () (with-handlers ((exn:break? void)) (sync never-evt))) (lambda () (when (and monitor (not (thread-dead? monitor))) (kill-thread monitor)) ((player-agent-runtime-shutdown! runtime))))) (module+ main (define server-url #f) (define name #f) (define config-file #f) (command-line #:program "rkt-web-player-agent-cli" #:once-each (("--server") value "RKT Web Player base URL" (set! server-url value)) (("--name") value "Name shown in the output selector" (set! name value)) (("--config") value "Agent INI file (defaults to the same file as the GUI agent)" (set! config-file value))) (run-player-agent-cli #:server-url server-url #:name name #:config-file config-file))