Initial import of rkt-web-player

This commit is contained in:
2026-08-26 22:12:52 +02:00
parent e1247719a9
commit d22a7ad529
13 changed files with 3045 additions and 1 deletions
+121
View File
@@ -0,0 +1,121 @@
#lang racket/base
(require racket/cmdline
racket/contract
racket/list
racket/string
simple-ini
simple-log
"private/library.rkt"
"private/player.rkt"
"private/server.rkt")
(provide run-web-player)
(sl-def-log rkt-web-player)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Provided functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; goal : Start the audio player and its web interface.
; pre : The ports are valid TCP ports; every music path is an existing directory.
; post : Libraries are browsed lazily; player resources close with the server.
; result : The result returned by serve/servlet.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define/contract (run-web-player music-paths
#:listen-ip [listen-ip "127.0.0.1"]
#:port [port 8080]
#:dlna-port [dlna-port 8734]
#:launch-browser? [launch-browser? #t])
(->* ((listof path-string?))
(#:listen-ip string?
#:port exact-positive-integer?
#:dlna-port exact-positive-integer?
#:launch-browser? boolean?)
any)
(let* ((libraries (make-music-libraries music-paths))
(player (make-player libraries #:dlna-port dlna-port)))
(info-rkt-web-player
"Starting with ~a music library/libraries on http://~a:~a/"
(length libraries)
listen-ip
port)
(dynamic-wind
void
(λ ()
(serve-player player
#:listen-ip listen-ip
#:port port
#:launch-browser? launch-browser?))
(λ ()
(player-close! player)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Command line
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(module+ main
(define listen-ip #f)
(define port #f)
(define dlna-port #f)
(define launch-browser? #t)
(define config-file #f)
(define music-paths
(command-line
#:program "rkt-web-player"
#:once-each
[("--listen-ip") address
"Address on which the web server listens"
(set! listen-ip address)]
[("--port") value
"Web server port"
(set! port (string->number value))]
[("--dlna-port") value
"Port used to publish local audio to DLNA renderers"
(set! dlna-port (string->number value))]
[("--config") path
"Read defaults from an INI file"
(set! config-file path)]
[("--no-browser")
"Do not open the web interface automatically"
(set! launch-browser? #f)]
#:args paths
paths))
(define config
(if config-file
(file->ini config-file)
(make-ini)))
(define configured-paths-value
(ini-get config 'library 'paths ""))
(define configured-paths
(cond
((list? configured-paths-value)
configured-paths-value)
((and (string? configured-paths-value)
(not (string=? (string-trim configured-paths-value) "")))
(map string-trim
(string-split configured-paths-value ";")))
(else '())))
(define all-paths
(remove-duplicates
(append music-paths
configured-paths)
equal?))
(sl-log-to-display)
(run-web-player
all-paths
#:listen-ip (or listen-ip
(ini-get config 'server 'listen-ip "127.0.0.1"))
#:port (or port
(ini-get config 'server 'port 8080))
#:dlna-port (or dlna-port
(ini-get config 'player 'dlna-port 8734))
#:launch-browser? launch-browser?))