 
            (go-loop []
              (match [(<! ch)]
-                    [:play]        (do (.play audio) (recur))
+                    [:play]        (do (when (let [st (:status @state)]
+                                               (or (= st :error)
+                                                   (= st :aborted)))
+                                         (.load audio))
+                                       (.play audio) (recur))
                     [:pause]       (do (.pause audio) (recur))
                     [[:seek time]] (do (set! (.-currentTime audio) time) (recur))
                     :else nil))))

             [(events/listen audio "durationchange" update-time)
              (events/listen audio "timeupdate" update-time)
              (events/listen audio "progress" update-progress)
              (events/listen audio "play" #(update-status :playing))
              (events/listen audio "playing" #(update-status :playing))
              (events/listen audio "pause" #(update-status :paused))
              (events/listen audio "ended" #(update-status :ended))


    [:div.audio-player {:class (clj->js (:status @state))}
     [:div.play-button
      {:class (when (is-playing) "is-playing")
       :on-click toggle-play}]

     [:div.seek-bar
      {:on-click seek-time
