multi player / per user playing and translation

This commit is contained in:
2026-08-28 16:53:05 +02:00
parent 2743dfb4c0
commit e10f2cf7d7
17 changed files with 1432 additions and 482 deletions
+52 -1
View File
@@ -11,7 +11,9 @@
open-playlist-store
close-playlist-store!
load-user-playlists
save-user-playlists!)
save-user-playlists!
load-user-language
save-user-language!)
(struct persisted-tab (id name tracks) #:transparent)
(struct playlist-store (keystore lock) #:transparent)
@@ -19,6 +21,11 @@
(define (user-playlists-key username)
(format "playlists-for-~a" username))
(define (user-language-key username)
(format "language-for-~a" username))
(define supported-language-names '("en" "nl" "de" "fr" "es"))
(define (track->datum item)
(hasheq 'file (path->string (track-file item))
'title (track-title item)
@@ -116,6 +123,45 @@
(ks-set! ks index-key ids))
(void)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; goal : Load one user's persisted interface language.
; pre : Store is #f or an open playlist store; username is normalized.
; post : Store contents remain unchanged.
; result : A supported ISO language name, or #f when none was saved.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (load-user-language store username)
(and store
(call-with-semaphore
(playlist-store-lock store)
(λ ()
(define value
(ks-get (playlist-store-keystore store)
(user-language-key username)
#f))
(and (member value supported-language-names) value)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; goal : Persist one user's interface language.
; pre : Store is #f or open, username is normalized, and language is one of
; en, nl, de, fr, or es.
; post : The user's language key contains language when a store exists.
; result : Void.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (save-user-language! store username language)
(unless (member language supported-language-names)
(raise-argument-error
'save-user-language!
"one of en, nl, de, fr, or es"
language))
(when store
(call-with-semaphore
(playlist-store-lock store)
(λ ()
(ks-set! (playlist-store-keystore store)
(user-language-key username)
language))))
(void))
(module+ test
(require rackunit
uuid/random)
@@ -166,6 +212,11 @@
(check-equal?
(map persisted-tab-name (load-user-playlists store "local" libraries))
'("Local"))
(check-false (load-user-language store "hans"))
(save-user-language! store "hans" "fr")
(check-equal? (load-user-language store "hans") "fr")
(check-exn exn:fail:contract?
(λ () (save-user-language! store "hans" "it")))
;; Rewriting the user's GUID index durably removes the omitted playlist.
(save-user-playlists!