Browse Source

feat(frontend): add MediaSession API effects

Miguel Ángel Moreno 1 year ago
parent
commit
284ff27c86
1 changed files with 41 additions and 0 deletions
  1. 41 0
      src/frontend/tubo/events.cljs

+ 41 - 0
src/frontend/tubo/events.cljs

@@ -2,6 +2,7 @@
   (:require
    [akiroz.re-frame.storage :refer [reg-co-fx!]]
    [day8.re-frame.http-fx]
+   [goog.object :as gobj]
    [re-frame.core :as rf]
    [reitit.frontend.easy :as rfe]
    [reitit.frontend.controllers :as rfc]
@@ -71,6 +72,46 @@
      (if paused?
        (.play player)
        (.pause player)))))
+(rf/reg-fx
+ ::stream-metadata
+ (fn [metadata]
+   (when (gobj/containsKey js/navigator "mediaSession")
+     (set! (.-metadata js/navigator.mediaSession) (js/MediaMetadata. (clj->js metadata))))))
+
+(rf/reg-fx
+ ::media-session
+ (fn [{:keys [current-pos player stream]}]
+   (when (gobj/containsKey js/navigator "mediaSession")
+     (let [updatePositionState
+           #(.setPositionState js/navigator.mediaSession
+                               {:duration     (.-duration @player)
+                                :playbackRate (.-playbackRate @player)
+                                :position     (.-currentTime @player)})]
+       (.setActionHandler js/navigator.mediaSession "play" #(.play @player))
+       (.setActionHandler js/navigator.mediaSession "pause" #(.pause @player))
+       (.setActionHandler js/navigator.mediaSession "previoustrack"
+                          #(rf/dispatch [::change-media-queue-pos (- current-pos 1)]))
+       (.setActionHandler js/navigator.mediaSession "nexttrack"
+                          #(rf/dispatch [::change-media-queue-pos (+ current-pos 1)]))
+       (.setActionHandler js/navigator.mediaSession "seekbackward"
+                          (fn [^js/navigator.MediaSessionActionDetails details]
+                            (set! (.-currentTime @player)
+                                  (- (.-currentTime @player) (or (.-seekOffset details) 10)))
+                            (updatePositionState)))
+       (.setActionHandler js/navigator.mediaSession "seekforward"
+                          (fn [^js/navigator.MediaSessionActionDetails details]
+                            (set! (.-currentTime @player)
+                                  (+ (.-currentTime @player) (or (.-seekOffset details) 10)))
+                            (updatePositionState)))
+       (.setActionHandler js/navigator.mediaSession "seekto"
+                          (fn [^js/navigator.MediaSessionActionDetails details]
+                            (set! (.-currentTime @player) (.-seekTime details))
+                            (updatePositionState)))
+       (.setActionHandler js/navigator.mediaSession "stop"
+                          (fn []
+                            (.pause @player)
+                            (set! (.-currentTime @player) 0)))))))
+
 (rf/reg-event-fx
  ::history-go
  (fn [_ [_ idx]]