logging added.

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