git.fiddlerwoaroof.com
Raw Blame History
(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")))