Initial import of rkt-web-player
This commit is contained in:
@@ -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?))
|
||||
Reference in New Issue
Block a user