(defpackage :objc.clog-dnc-player
(:use :cl :clog)
(:export ))
(in-package :objc.clog-dnc-player)
(named-readtables:in-readtable :objc-readtable)
(fw.lu:defclass+ store ()
((%track-name
:accessor track-name
:initform nil)
(%track-artist
:accessor track-artist
:initform nil)
(%track-album
:accessor track-album
:initform nil)
(%player-state
:accessor player-state
:initform nil)))
(defvar *store*)
(defun incorporate (store info)
(prog1 store
(trivia:match info
((trivia:hash-table-entries
"Name" name
"Album" album
"Artist" artist
"Player State" player-state)
(setf
(track-name store) name
(track-album store) album
(track-artist store) artist
(player-state store) player-state)))))
(defun reducer-task (store)
(lambda ()
(loop
for message = (sb-concurrency:receive-message
objc.notification:*mailbox*)
do (incorporate *store* message))))
(defun on-new-window (body)
(let ((name (create-section body :h2 :content "track"))
(artist (create-div body :content "artist"))
(album (create-div body :content "album"))
(player-state (create-div body :content "player-state"))
(play-pause (create-button body :content "play/pause")))
(link-slot-to-element *store* track-name name)
(link-slot-to-element *store* track-artist artist)
(link-slot-to-element *store* track-album album)
(link-slot-to-element *store* player-state player-state)
(set-on-click play-pause
(lambda (button)
(declare (ignore button))
[(objc.scripting-bridge::itunes-app) @(playpause)]?))))
(defvar *initialized* nil)
(defun doit ()
(unless *initialized*
(setf *initialized* t)
(setf *store* (make-instance 'store))
(bt:make-thread (reducer-task *store*) :name "Reducer")
(objc.notification:setup-notifications)
(objc.notification:observe-notifications (objc.notification:dnc)
"com.apple.Music.playerInfo")
(bt:make-thread 'objc.notification:main-loop-ticker)
(set-on-new-window 'on-new-window :path "/player")))
|