|
@@ -1,7 +1,5 @@
|
|
|
(ns tubo.player.events
|
|
|
(:require
|
|
|
- [tubo.stream.views :as stream]
|
|
|
- [tubo.utils :as utils]
|
|
|
[goog.object :as gobj]
|
|
|
[re-frame.core :as rf]
|
|
|
[vimsical.re-frame.cofx.inject :as inject]))
|
|
@@ -20,7 +18,7 @@
|
|
|
|
|
|
(rf/reg-fx
|
|
|
:src
|
|
|
- (fn [{:keys [player src current-pos]}]
|
|
|
+ (fn [{:keys [player src]}]
|
|
|
(set! (.-source @player) (clj->js src))))
|
|
|
|
|
|
(rf/reg-fx
|
|
@@ -34,16 +32,16 @@
|
|
|
(set! (.-currentTime @player) time)))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
- :background-player/seek
|
|
|
+ :bg-player/seek
|
|
|
[(rf/inject-cofx ::inject/sub [:player])]
|
|
|
(fn [{:keys [db player]} [_ time]]
|
|
|
- (when (:background-player/ready db)
|
|
|
+ (when (:bg-player/ready db)
|
|
|
{:current-time {:time time :player player}})))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:main-player/seek
|
|
|
[(rf/inject-cofx ::inject/sub [:main-player])]
|
|
|
- (fn [{:keys [db main-player]} [_ time]]
|
|
|
+ (fn [{:keys [main-player]} [_ time]]
|
|
|
{:current-time {:time time :player main-player}}))
|
|
|
|
|
|
(rf/reg-fx
|
|
@@ -53,14 +51,14 @@
|
|
|
(set! (.-paused @player) paused?))))
|
|
|
|
|
|
(rf/reg-event-db
|
|
|
- :background-player/set-paused
|
|
|
+ :bg-player/set-paused
|
|
|
(fn [db [_ val]]
|
|
|
(assoc db :paused val)))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
- :background-player/pause
|
|
|
+ :bg-player/pause
|
|
|
[(rf/inject-cofx ::inject/sub [:player])]
|
|
|
- (fn [{:keys [db player]} [_ paused?]]
|
|
|
+ (fn [{:keys [player]} [_ paused?]]
|
|
|
{:pause! {:paused? paused?
|
|
|
:player player}}))
|
|
|
|
|
@@ -73,12 +71,12 @@
|
|
|
:player main-player}})))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
- :background-player/play
|
|
|
+ :bg-player/play
|
|
|
[(rf/inject-cofx ::inject/sub [:elapsed-time])
|
|
|
(rf/inject-cofx ::inject/sub [:main-player])]
|
|
|
(fn [{:keys [db elapsed-time main-player]}]
|
|
|
- {:fx [[:dispatch [:background-player/set-paused false]]
|
|
|
- [:dispatch [:background-player/seek @elapsed-time]]
|
|
|
+ {:fx [[:dispatch [:bg-player/set-paused false]]
|
|
|
+ [:dispatch [:bg-player/seek @elapsed-time]]
|
|
|
(when (and (:main-player/ready db) @main-player)
|
|
|
[:dispatch [:main-player/pause true]])]}))
|
|
|
|
|
@@ -86,23 +84,23 @@
|
|
|
:main-player/play
|
|
|
[(rf/inject-cofx ::inject/sub [:elapsed-time])
|
|
|
(rf/inject-cofx ::inject/sub [:player])]
|
|
|
- (fn [{:keys [db elapsed-time player]}]
|
|
|
- {:fx [(when (and (:background-player/ready db) @player)
|
|
|
- [:dispatch [:background-player/pause true]])]}))
|
|
|
+ (fn [{:keys [db player]}]
|
|
|
+ {:fx [(when (and (:bg-player/ready db) @player)
|
|
|
+ [:dispatch [:bg-player/pause true]])]}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
- :background-player/stop
|
|
|
- (fn [{:keys [db]}]
|
|
|
- {:fx [[:dispatch [:background-player/pause true]]
|
|
|
- [:dispatch [:background-player/seek 0]]]}))
|
|
|
+ :bg-player/stop
|
|
|
+ (fn [_]
|
|
|
+ {:fx [[:dispatch [:bg-player/pause true]]
|
|
|
+ [:dispatch [:bg-player/seek 0]]]}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
- :background-player/start
|
|
|
+ :bg-player/start
|
|
|
[(rf/inject-cofx ::inject/sub [:player])
|
|
|
(rf/inject-cofx ::inject/sub [:elapsed-time])]
|
|
|
- (fn [{:keys [db player elapsed-time]} _]
|
|
|
- {:fx [[:dispatch [:background-player/set-paused true]]
|
|
|
- [:dispatch [:background-player/pause false]]
|
|
|
+ (fn [{:keys [db player]} _]
|
|
|
+ {:fx [[:dispatch [:bg-player/set-paused true]]
|
|
|
+ [:dispatch [:bg-player/pause false]]
|
|
|
[:dispatch [:player/change-volume (:volume-level db) player]]]}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
@@ -110,7 +108,7 @@
|
|
|
[(rf/inject-cofx ::inject/sub [:elapsed-time])]
|
|
|
(fn [{:keys [db elapsed-time]} _]
|
|
|
{:fx [[:dispatch [:main-player/pause false]]
|
|
|
- (when (and (:main-player/show db) (not (:background-player/ready db)))
|
|
|
+ (when (and (:main-player/show db) (not (:bg-player/ready db)))
|
|
|
[:dispatch [:main-player/seek @elapsed-time]])]}))
|
|
|
|
|
|
(rf/reg-fx
|
|
@@ -122,7 +120,7 @@
|
|
|
|
|
|
(rf/reg-fx
|
|
|
:media-session-handlers
|
|
|
- (fn [{:keys [current-pos player stream]}]
|
|
|
+ (fn [{:keys [current-pos player]}]
|
|
|
(when (gobj/containsKey js/navigator "mediaSession")
|
|
|
(let [current-time (and @player (.-currentTime @player))
|
|
|
update-position
|
|
@@ -136,11 +134,16 @@
|
|
|
"pause" #(.pause @player)
|
|
|
"previoustrack" #(rf/dispatch [:queue/change-pos (dec current-pos)])
|
|
|
"nexttrack" #(rf/dispatch [:queue/change-pos (inc current-pos)])
|
|
|
- "seekbackward" (fn [^js/navigator.MediaSessionActionDetails details]
|
|
|
- (seek (- current-time (or (.-seekOffset details) 10))))
|
|
|
- "seekforward" (fn [^js/navigator.MediaSessionActionDetails details]
|
|
|
- (seek (+ current-time (or (.-seekOffset details) 10))))
|
|
|
- "seekto" (fn [^js/navigator.MediaSessionActionDetails details]
|
|
|
+ "seekbackward" (fn [^js/navigator.MediaSessionActionDetails
|
|
|
+ details]
|
|
|
+ (seek (- current-time
|
|
|
+ (or (.-seekOffset details) 10))))
|
|
|
+ "seekforward" (fn [^js/navigator.MediaSessionActionDetails
|
|
|
+ details]
|
|
|
+ (seek (+ current-time
|
|
|
+ (or (.-seekOffset details) 10))))
|
|
|
+ "seekto" (fn [^js/navigator.MediaSessionActionDetails
|
|
|
+ details]
|
|
|
(seek (.-seekTime details)))
|
|
|
"stop" #(seek 0)}]
|
|
|
(doseq [[action cb] events]
|
|
@@ -155,7 +158,7 @@
|
|
|
:volume {:player player :volume value}}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
- :background-player/mute
|
|
|
+ :bg-player/mute
|
|
|
[(rf/inject-cofx :store)]
|
|
|
(fn [{:keys [db store]} [_ value player]]
|
|
|
{:db (assoc db :muted value)
|
|
@@ -163,11 +166,11 @@
|
|
|
:mute {:player player :muted? value}}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
- :background-player/hide
|
|
|
+ :bg-player/hide
|
|
|
[(rf/inject-cofx :store)]
|
|
|
(fn [{:keys [db store]} _]
|
|
|
- {:db (assoc db :background-player/show false)
|
|
|
- :store (assoc store :background-player/show false)}))
|
|
|
+ {:db (assoc db :bg-player/show false)
|
|
|
+ :store (assoc store :bg-player/show false)}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/loop
|
|
@@ -181,7 +184,7 @@
|
|
|
:store (assoc store :loop-playback loop-state)})))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
- :background-player/dispose
|
|
|
+ :bg-player/dispose
|
|
|
[(rf/inject-cofx :store)]
|
|
|
(fn [{:keys [db store]} _]
|
|
|
(let [remove-entries
|
|
@@ -191,14 +194,14 @@
|
|
|
(assoc :queue-pos 0)))]
|
|
|
{:db (remove-entries db)
|
|
|
:store (remove-entries store)
|
|
|
- :fx [[:dispatch [:background-player/pause true]]
|
|
|
- [:dispatch [:background-player/seek 0]]
|
|
|
- [:dispatch [:background-player/hide]]]})))
|
|
|
+ :fx [[:dispatch [:bg-player/pause true]]
|
|
|
+ [:dispatch [:bg-player/seek 0]]
|
|
|
+ [:dispatch [:bg-player/hide]]]})))
|
|
|
|
|
|
(rf/reg-event-db
|
|
|
- :background-player/ready
|
|
|
+ :bg-player/ready
|
|
|
(fn [db [_ ready]]
|
|
|
- (assoc db :background-player/ready ready)))
|
|
|
+ (assoc db :bg-player/ready ready)))
|
|
|
|
|
|
(rf/reg-event-db
|
|
|
:main-player/ready
|
|
@@ -213,38 +216,40 @@
|
|
|
idx (.indexOf (:queue updated-db) stream)]
|
|
|
{:db updated-db
|
|
|
:store (assoc store :queue (:queue updated-db))
|
|
|
- :fx [[:dispatch [:player/fetch-stream
|
|
|
- (:url stream) idx (= (count (:queue db)) 0)]]
|
|
|
+ :fx [[:dispatch
|
|
|
+ [:player/fetch-stream
|
|
|
+ (:url stream) idx (= (count (:queue db)) 0)]]
|
|
|
(when (and notify? (not (= (count (:queue db)) 0)))
|
|
|
- [:dispatch [:notifications/add
|
|
|
- {:status-text "Added stream to queue"
|
|
|
- :failure :info}]])]})))
|
|
|
+ [:dispatch
|
|
|
+ [:notifications/add
|
|
|
+ {:status-text "Added stream to queue"
|
|
|
+ :failure :info}]])]})))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/show-main-player
|
|
|
(fn [{:keys [db]} [_ val]]
|
|
|
- {:db (assoc db :main-player/show val)
|
|
|
+ {:db (assoc db :main-player/show val)
|
|
|
:body-overflow val}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/switch-from-main
|
|
|
[(rf/inject-cofx ::inject/sub [:elapsed-time])]
|
|
|
- (fn [{:keys [db elapsed-time]} [_ stream]]
|
|
|
- {:db (assoc db :background-player/show true)
|
|
|
+ (fn [{:keys [db]} _]
|
|
|
+ {:db (assoc db :bg-player/show true)
|
|
|
:fx [[:dispatch [:player/show-main-player false]]
|
|
|
[:dispatch [:main-player/pause true]]]}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/switch-to-main
|
|
|
[(rf/inject-cofx :store)]
|
|
|
- (fn [{:keys [db]} [_ stream]]
|
|
|
- {:fx [[:dispatch [:player/show-main-player true]]]
|
|
|
- :db (assoc db :background-player/show false)
|
|
|
+ (fn [{:keys [db]} _]
|
|
|
+ {:fx [[:dispatch [:player/show-main-player true]]]
|
|
|
+ :db (assoc db :bg-player/show false)
|
|
|
:scroll-to-top nil}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/load-related-streams
|
|
|
- (fn [{:keys [db]} [_ res]]
|
|
|
+ (fn [_ [_ res]]
|
|
|
(let [{:keys [related-streams]} (js->clj res :keywordize-keys true)]
|
|
|
{:fx [[:dispatch [:queue/add-n related-streams]]]})))
|
|
|
|
|
@@ -254,45 +259,53 @@
|
|
|
(rf/inject-cofx ::inject/sub [:player])]
|
|
|
(fn [{:keys [db store player]} [_ idx play? res]]
|
|
|
(let [stream-res (js->clj res :keywordize-keys true)]
|
|
|
- {:db (assoc db
|
|
|
- :background-player/show (not (:main-player/show db))
|
|
|
- :background-player/loading false)
|
|
|
- :store (assoc store :background-player/show (not (:main-player/show db)))
|
|
|
- :fx (apply conj [(when play? [:dispatch [:queue/change-stream stream-res idx]])]
|
|
|
- (when (and (:background-player/ready db) play?)
|
|
|
- [[:media-session-metadata
|
|
|
- {:title (:name stream-res)
|
|
|
- :artist (:uploader-name stream-res)
|
|
|
- :artwork [{:src (:thumbnail-url stream-res)}]}]
|
|
|
- [:media-session-handlers
|
|
|
- {:current-pos idx
|
|
|
- :player player}]]))})))
|
|
|
+ {:db (assoc db
|
|
|
+ :bg-player/show (not (:main-player/show db))
|
|
|
+ :bg-player/loading false)
|
|
|
+ :store (assoc store :bg-player/show (not (:main-player/show db)))
|
|
|
+ :fx (apply conj
|
|
|
+ [(when play?
|
|
|
+ [:dispatch [:queue/change-stream stream-res idx]])]
|
|
|
+ (when (and (:bg-player/ready db) play?)
|
|
|
+ [[:media-session-metadata
|
|
|
+ {:title (:name stream-res)
|
|
|
+ :artist (:uploader-name stream-res)
|
|
|
+ :artwork [{:src (:thumbnail-url stream-res)}]}]
|
|
|
+ [:media-session-handlers
|
|
|
+ {:current-pos idx
|
|
|
+ :player player}]]))})))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/bad-response
|
|
|
(fn [{:keys [db]} [_ idx play? res]]
|
|
|
{:db (assoc db
|
|
|
- :background-player/loading false)
|
|
|
+ :bg-player/loading
|
|
|
+ false)
|
|
|
:fx [[:dispatch [:bad-response res]]
|
|
|
(when play?
|
|
|
- (if (> (-> db :queue count) 1)
|
|
|
+ (if (> (-> db
|
|
|
+ :queue
|
|
|
+ count)
|
|
|
+ 1)
|
|
|
[:dispatch [:queue/change-pos (inc idx)]]
|
|
|
- [:dispatch [:background-player/dispose]]))]}))
|
|
|
+ [:dispatch [:bg-player/dispose]]))]}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/fetch-related-streams
|
|
|
(fn [{:keys [db]} [_ url]]
|
|
|
- {:fx [[:dispatch [:stream/fetch url
|
|
|
- [:player/load-related-streams]] [:bad-response]]]
|
|
|
- :db (assoc db :background-player/loading true)}))
|
|
|
+ {:fx [[:dispatch
|
|
|
+ [:stream/fetch url
|
|
|
+ [:player/load-related-streams]] [:bad-response]]]
|
|
|
+ :db (assoc db :bg-player/loading true)}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/fetch-stream
|
|
|
(fn [{:keys [db]} [_ url idx play?]]
|
|
|
- {:fx [[:dispatch [:stream/fetch url
|
|
|
- [:player/load-stream idx play?]
|
|
|
- [:player/bad-response idx play?]]]]
|
|
|
- :db (assoc db :background-player/loading play?)}))
|
|
|
+ {:fx [[:dispatch
|
|
|
+ [:stream/fetch url
|
|
|
+ [:player/load-stream idx play?]
|
|
|
+ [:player/bad-response idx play?]]]]
|
|
|
+ :db (assoc db :bg-player/loading play?)}))
|
|
|
|
|
|
(rf/reg-event-fx
|
|
|
:player/start-radio
|
|
@@ -301,12 +314,14 @@
|
|
|
(when (not= (count (:queue db)) 0)
|
|
|
[:dispatch [:queue/change-pos (count (:queue db))]])
|
|
|
[:dispatch [:player/fetch-related-streams (:url stream)]]
|
|
|
- [:dispatch [:notifications/add
|
|
|
- {:status-text "Started stream radio"
|
|
|
- :failure :info}]]]}))
|
|
|
+ [:dispatch
|
|
|
+ [:notifications/add
|
|
|
+ {:status-text "Started stream radio"
|
|
|
+ :failure :info}]]]}))
|
|
|
|
|
|
(rf/reg-event-db
|
|
|
:main-player/toggle-layout
|
|
|
(fn [db [_ layout]]
|
|
|
- (assoc-in db [:queue (:queue-pos db) layout]
|
|
|
- (not (get-in db [:queue (:queue-pos db) layout])))))
|
|
|
+ (assoc-in db
|
|
|
+ [:queue (:queue-pos db) layout]
|
|
|
+ (not (get-in db [:queue (:queue-pos db) layout])))))
|