diff --git a/src/airsonic_ui/audio.cljs b/src/airsonic_ui/audio.cljs new file mode 100644 index 0000000..16f79ca --- /dev/null +++ b/src/airsonic_ui/audio.cljs @@ -0,0 +1,13 @@ +(ns airsonic-ui.audio + (:require [re-frame.core :as re-frame])) + +;; TODO: Manage multiple songs, buffering, stopping, progress notification... + +(def current-audio (atom nil)) + +(re-frame/reg-fx + :play-song + (fn [song-url] + (let [audio (js/Audio. song-url)] + (reset! current-audio audio) + (.play audio)))) diff --git a/src/airsonic_ui/core.cljs b/src/airsonic_ui/core.cljs index f5f1d5c..17bd202 100644 --- a/src/airsonic_ui/core.cljs +++ b/src/airsonic_ui/core.cljs @@ -2,6 +2,7 @@ (:require [reagent.core :as reagent] [re-frame.core :as re-frame] [day8.re-frame.http-fx] + [airsonic-ui.audio] ; <- just registers effects [airsonic-ui.routes :as routes] [airsonic-ui.events :as events] [airsonic-ui.views :as views] diff --git a/src/airsonic_ui/events.cljs b/src/airsonic_ui/events.cljs index ec2a421..9782914 100644 --- a/src/airsonic_ui/events.cljs +++ b/src/airsonic_ui/events.cljs @@ -62,6 +62,16 @@ (println "api call gone bad; CORS headers missing? check for :status 0" event) db)) +;; musique + +(re-frame/reg-event-fx + ::play-song + (fn [{:keys [db]} [_ song]] + (let [song-url (api/url "stream" (merge {:id (:id song)} + (:login db)))] + (println "Requesting to stream song at" song-url) + {:play-song song-url}))) + ;; routing (re-frame/reg-event-fx diff --git a/src/airsonic_ui/views.cljs b/src/airsonic_ui/views.cljs index 71cbe82..8c151eb 100644 --- a/src/airsonic_ui/views.cljs +++ b/src/airsonic_ui/views.cljs @@ -47,7 +47,10 @@ ;; single album (defn song-item [song] - [:div (str (:artist song) " - " (:title song))]) + [:div (str (:artist song) " - ") + [:a + {:on-click #(re-frame/dispatch [::events/play-song song])} + (:title song)]]) (defn song-list [songs] [:ul