Complete refactoring for rktplayer, in order to make it play on DLNA renderers and also use UpNP media server resources.

This commit is contained in:
2026-08-08 14:29:01 +02:00
parent 186b3bb8d7
commit f5fdc38e67
69 changed files with 5953 additions and 1647 deletions
+149
View File
@@ -0,0 +1,149 @@
#lang racket/base
(require racket/class
"library-cfg.rkt"
"library-item.rkt"
"../misc/utils.rkt")
(provide libraries-config%
(all-from-out "library-cfg.rkt")
(all-from-out "library-item.rkt"))
(define libraries-config%
(class object%
(init-field settings)
(define items
#f)
(define revisions
(make-hash))
(define cfg
(send settings clone 'settings))
(define/private (sorted-items value)
(sort value
(lambda (a b)
(string<? (library-item-name a)
(library-item-name b)))))
(define/private (get-items)
(when (eq? items #f)
(let ((stored (send cfg get 'libraries '())))
(dbg-rktplayer "libraries from ini: ~a" stored)
(set! items
(sorted-items
(map store->library-item stored)))))
items)
(define/private (store-items! value)
(let ((new-items (sorted-items value)))
(send cfg
set!
'libraries
(map library-item->store new-items))
(set! items new-items)))
(define/private (increment-revision! id)
(hash-update! revisions id add1 0))
(define/public (libraries)
(map (lambda (item)
(new library-cfg%
[library-cfg-id (library-item-id item)]
[libraries-config this]))
(get-items)))
(define/public (count)
(length (get-items)))
(define/public (library-id idx)
(let ((all-items (get-items)))
(if (and (>= idx 0)
(< idx (length all-items)))
(library-item-id (list-ref all-items idx))
#f)))
(define/public (get-item id)
(check/c libraries-config% get-item id symbol?)
(findf (lambda (item)
(eq? (library-item-id item) id))
(get-items)))
(define/public (get-item-revision id)
(check/c libraries-config% get-item-revision id symbol?)
(hash-ref revisions id 0))
(define/public (get-library id)
(check/c libraries-config% get-library id symbol?)
(and (send this get-item id)
(new library-cfg%
[library-cfg-id id]
[libraries-config this])))
(define/public (remove-library id)
(check/c libraries-config% remove-library id symbol?)
(store-items!
(filter (lambda (item)
(not (eq? (library-item-id item) id)))
(get-items)))
(increment-revision! id))
(define/public (add-library item)
(check/c libraries-config% add-library item library-item?)
(let ((id (library-item-id item)))
(when (send this get-item id)
(raise-arguments-error
'libraries-config%:add-library
"a library with this id already exists"
"id" id))
(store-items! (cons item (get-items)))
(increment-revision! id)
id))
(define/public (update-item! item)
(check/c libraries-config% update-item! item library-item?)
(let* ((id (library-item-id item))
(current-item (send this get-item id)))
(unless current-item
(raise-arguments-error
'libraries-config%:update-item!
"library does not exist"
"id" id))
(unless (and (eq? (library-item-kind current-item)
(library-item-kind item))
(= (library-item-kind-version current-item)
(library-item-kind-version item)))
(raise-arguments-error
'libraries-config%:update-item!
"library kind and kind-version cannot be changed"
"id" id))
(store-items!
(map (lambda (existing)
(if (eq? (library-item-id existing) id)
item
existing))
(get-items)))
(increment-revision! id)
(void)))
(define/public (current-library)
(let ((item
(findf library-item-current
(get-items))))
(if item
(send this get-library
(library-item-id item))
(if (null? (get-items))
#f
(send this get-library
(library-item-id
(car (get-items))))))))
(super-new)))