diff --git a/dlna-player.rkt b/dlna-player.rkt index d952ef6..dabd7b1 100644 --- a/dlna-player.rkt +++ b/dlna-player.rkt @@ -3,12 +3,15 @@ ;; Stateful local-file player built on racket-audio metadata and racket-upnp. (require racket/file + simple-log racket/path racket/string racket/udp racket-audio/taglib racket-upnp) +(sl-def-log dlna-player) + (provide make-dlna-player dlna-player? dlna-player-play! @@ -105,7 +108,9 @@ #f)) (define (read-track-info path) - (with-handlers ([exn:fail? (lambda (_) (fallback-track-info path))]) + (with-handlers ([exn:fail? (lambda (exception) + (warn-dlna-player "Could not read metadata for ~a: ~a" path (exn-message exception)) + (fallback-track-info path))]) (call-with-id3-tags path (lambda (tags) @@ -149,8 +154,12 @@ (dlna-player-cache-lock player) (lambda () (hash-ref (dlna-player-metadata-cache player) key #f)))]) - (or cached + (if cached + (begin + (dbg-dlna-player "Metadata cache hit for ~a" path) + cached) (let ([info (read-track-info path)]) + (dbg-dlna-player "Metadata cache miss for ~a" path) (call-with-semaphore (dlna-player-cache-lock player) (lambda () @@ -178,6 +187,7 @@ (format "track-~a~a" number (file-extension path)))))) (define (publish-track! player track) + (dbg-dlna-player "Publishing track file=~a title=~a" (dlna-track-info-file track) (dlna-track-info-title track)) (let* ([server (dlna-player-server player)] [uri (media-file-server-publish! @@ -189,6 +199,7 @@ (with-handlers ([exn:fail? (lambda (exception) + (err-dlna-player "Could not create DIDL-Lite metadata for ~a: ~a" uri (exn-message exception)) (media-file-server-unpublish! server uri) (raise exception))]) (publication @@ -207,7 +218,10 @@ (define (safe-unpublish! player item) (when item - (with-handlers ([exn:fail? (lambda (_) (void))]) + (with-handlers ([exn:fail? (lambda (exception) + (warn-dlna-player "Could not unpublish ~a: ~a" (publication-uri item) (exn-message exception)) + (void))]) + (dbg-dlna-player "Unpublishing track URI ~a" (publication-uri item)) (media-file-server-unpublish! (dlna-player-server player) (publication-uri item))))) @@ -256,6 +270,7 @@ (with-handlers ([exn:fail? (lambda (exception) + (err-dlna-player "Renderer operation failed: ~a" (exn-message exception)) (set-reachable! player #f) (raise exception))]) (let ([result @@ -298,13 +313,17 @@ (define (refresh-volume! player #:force? [force? #f]) (when (or force? (volume-refresh-due? player)) (let ([renderer (dlna-player-renderer player)]) - (with-handlers ([exn:fail? (lambda (_) (void))]) + (with-handlers ([exn:fail? (lambda (exception) + (warn-dlna-player "Could not refresh renderer volume: ~a" (exn-message exception)) + (void))]) (let ([volume (media-renderer-volume renderer)]) (update-cache! player (lambda (info) (struct-copy dlna-info info [volume volume]))))) - (with-handlers ([exn:fail? (lambda (_) (void))]) + (with-handlers ([exn:fail? (lambda (exception) + (warn-dlna-player "Could not refresh renderer mute state: ~a" (exn-message exception)) + (void))]) (let ([muted? (media-renderer-muted? renderer)]) (update-cache! player @@ -318,7 +337,8 @@ (define (refresh-player! player #:force-volume? [force-volume? #f]) (with-handlers ([exn:fail? - (lambda (_) + (lambda (exception) + (warn-dlna-player "Could not refresh renderer state: ~a" (exn-message exception)) (set-reachable! player #f) #f)]) (call-with-semaphore @@ -335,6 +355,7 @@ [renderer-duration (and position (transport-position-duration position))]) + (dbg-dlna-player "Renderer state=~a uri=~a position=~a duration=~a" state (or uri "") (or seconds "unknown") (or renderer-duration "unknown")) (promote-or-clear-publications! player uri) (let* ([current (dlna-player-current player)] [next (dlna-player-next player)] @@ -429,6 +450,7 @@ volume-poll-seconds)) (let* ([local-address (or listen-ip (renderer-local-address renderer))] + [_ (info-dlna-player "Creating DLNA player renderer=~a address=~a listen-ip=~a port=~a path=~a" (media-renderer-name renderer) (media-renderer-address renderer) local-address port path)] [server (start-media-file-server (server-base-url local-address port path) @@ -458,6 +480,7 @@ player)) (define (dlna-player-play! player file) + (info-dlna-player "Play requested file=~a" file) (check-player 'dlna-player-play! player) (let* ([track (player-track-info 'dlna-player-play! player file)] [item (publish-track! player track)]) @@ -501,6 +524,7 @@ (void)))) (define (dlna-player-set-next-file! player file) + (info-dlna-player "Set next track requested file=~a" file) (check-player 'dlna-player-set-next-file! player) (let* ([track (player-track-info @@ -537,6 +561,7 @@ (void)))) (define (dlna-player-pause! player) + (info-dlna-player "Pause requested") (check-player 'dlna-player-pause! player) (let ([position (dlna-info-position (estimated-info player))]) (call-renderer @@ -554,6 +579,7 @@ (void))) (define (dlna-player-resume! player) + (info-dlna-player "Resume requested") (check-player 'dlna-player-resume! player) (call-renderer player @@ -567,6 +593,7 @@ (void)) (define (dlna-player-stop! player) + (info-dlna-player "Stop requested") (check-player 'dlna-player-stop! player) (call-renderer player @@ -583,6 +610,7 @@ (void)) (define (dlna-player-seek! player seconds) + (info-dlna-player "Seek requested seconds=~a" seconds) (check-player 'dlna-player-seek! player) (unless (and (rational? seconds) (not (negative? seconds))) (raise-argument-error 'dlna-player-seek! @@ -622,6 +650,7 @@ (* duration (/ (min 100 (max 0 percentage)) 100.0))))) (define (dlna-player-volume! player percentage) + (info-dlna-player "Volume requested percentage=~a" percentage) (check-player 'dlna-player-volume! player) (unless (rational? percentage) (raise-argument-error 'dlna-player-volume! "real?" percentage)) @@ -646,6 +675,7 @@ (void))) (define (dlna-player-muted! player muted?) + (info-dlna-player "Mute requested muted?=~a" muted?) (check-player 'dlna-player-muted! player) (unless (boolean? muted?) (raise-argument-error 'dlna-player-muted! "boolean?" muted?)) @@ -673,6 +703,7 @@ (unless (dlna-player? player) (raise-argument-error 'dlna-player-close! "dlna-player?" player)) (when (dlna-player-running? player) + (info-dlna-player "Closing DLNA player") (set-dlna-player-running?! player #f) (let ([poll-thread (dlna-player-poll-thread player)]) (when poll-thread diff --git a/info.rkt b/info.rkt index 51dfa87..693280a 100644 --- a/info.rkt +++ b/info.rkt @@ -1,7 +1,7 @@ #lang info (define pkg-authors '(hnmdijkema)) -(define version "0.1.1") +(define version "0.1.2") (define license 'GPL-2.0-or-later) (define collection "racket-audio-dlna") (define pkg-desc @@ -10,8 +10,9 @@ (define deps '("base" "net-lib" + "simple-log" "racket-audio" - ("racket-upnp" #:version "0.1.3"))) + ("racket-upnp" #:version "0.1.4"))) (define build-deps '("racket-doc"