113 lines
3.4 KiB
Racket
113 lines
3.4 KiB
Racket
#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))
|