#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?))