A music player that connects to your cloud/distributed storage.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

No nested state

+234 -295
+155 -109
src/Applications/UI.elm
··· 9 9 import Conditional exposing (..) 10 10 import Css exposing (url) 11 11 import Debouncer.Basic as Debouncer 12 + import Dict 12 13 import Json.Decode 13 14 import Keyboard 14 15 import LastFm ··· 27 28 import UI.Adjunct as Adjunct 28 29 import UI.Alfred.State as Alfred 29 30 import UI.Audio.State as Audio 30 - import UI.Audio.Types as Audio 31 31 import UI.Authentication as Authentication 32 32 import UI.Authentication.ContextMenu as Authentication 33 33 import UI.Authentication.State as Authentication ··· 93 93 page = 94 94 Maybe.withDefault Page.Index maybePage 95 95 in 96 - { alfred = Nothing 97 - , contextMenu = Nothing 98 - , confirmation = Nothing 96 + { confirmation = Nothing 99 97 , currentTime = Time.millisToPosix flags.initialTime 100 98 , darkMode = flags.darkMode 101 99 , downloading = Nothing ··· 107 105 , isUpgrading = flags.upgrade 108 106 , lastFm = LastFm.initialModel 109 107 , navKey = key 110 - , notifications = [] 111 108 , page = page 112 109 , pressedKeys = [] 113 110 , processAutomatically = True 114 111 , url = url 115 112 , viewport = flags.viewport 116 113 117 - -- Children 118 - ----------- 119 - , authentication = Authentication.initialModel url 120 - , backdrop = Backdrop.initialModel 121 - , equalizer = Equalizer.initialModel 122 - , playlists = Playlists.initialModel 123 - , queue = Queue.initialModel 124 - , sources = Sources.initialModel 125 - , tracks = Tracks.initialModel 114 + ----------------------------------------- 115 + -- Audio 116 + ----------------------------------------- 117 + , audioDuration = 0 118 + , audioHasStalled = False 119 + , audioIsLoading = False 120 + , audioIsPlaying = False 121 + , audioPosition = 0 122 + , progress = Dict.empty 123 + , rememberProgress = True 126 124 127 - -- Parts 128 - -------- 129 - , audio = Audio.initialModel 130 - 125 + ----------------------------------------- 131 126 -- Debouncing 132 - ------------- 127 + ----------------------------------------- 133 128 , debounce = 134 129 0.25 135 130 |> Debouncer.fromSeconds 136 131 |> Debouncer.debounce 137 132 |> Debouncer.toDebouncer 133 + 134 + ----------------------------------------- 135 + -- Instances 136 + ----------------------------------------- 137 + , alfred = Nothing 138 + , contextMenu = Nothing 139 + , notifications = [] 140 + 141 + ----------------------------------------- 142 + -- Children (TODO) 143 + ----------------------------------------- 144 + , authentication = Authentication.initialModel url 145 + , backdrop = Backdrop.initialModel 146 + , equalizer = Equalizer.initialModel 147 + , playlists = Playlists.initialModel 148 + , queue = Queue.initialModel 149 + , sources = Sources.initialModel 150 + , tracks = Tracks.initialModel 138 151 } 139 152 |> update 140 153 (PageChanged page) ··· 175 188 Alfred.runAction a 176 189 177 190 ----------------------------------------- 191 + -- Audio 192 + ----------------------------------------- 193 + NoteProgress a -> 194 + Audio.noteProgress a 195 + 196 + SetAudioDuration a -> 197 + Audio.setDuration a 198 + 199 + SetAudioHasStalled a -> 200 + Audio.setHasStalled a 201 + 202 + SetAudioIsLoading a -> 203 + Audio.setIsLoading a 204 + 205 + SetAudioIsPlaying a -> 206 + Audio.setIsPlaying a 207 + 208 + SetAudioPosition a -> 209 + Audio.setPosition a 210 + 211 + Stop -> 212 + Audio.stop 213 + 214 + TogglePlay -> 215 + Audio.playPause 216 + 217 + ----------------------------------------- 178 218 -- Authentication 179 219 ----------------------------------------- 180 220 AuthenticationBootFailure a -> ··· 190 230 Authentication.remoteStorageWebfinger a b 191 231 192 232 ----------------------------------------- 193 - -- Children 194 - ----------------------------------------- 195 - AuthenticationMsg sub -> 196 - \model -> 197 - Return3.wieldNested 198 - Reply.translate 199 - { mapCmd = AuthenticationMsg 200 - , mapModel = \child -> { model | authentication = child } 201 - , update = Authentication.update 202 - } 203 - { model = model.authentication 204 - , msg = sub 205 - } 206 - 207 - BackdropMsg sub -> 208 - \model -> 209 - Return3.wieldNested 210 - Reply.translate 211 - { mapCmd = BackdropMsg 212 - , mapModel = \child -> { model | backdrop = child } 213 - , update = Backdrop.update 214 - } 215 - { model = model.backdrop 216 - , msg = sub 217 - } 218 - 219 - PlaylistsMsg sub -> 220 - \model -> 221 - Return3.wieldNested 222 - Reply.translate 223 - { mapCmd = PlaylistsMsg 224 - , mapModel = \child -> { model | playlists = child } 225 - , update = Playlists.update 226 - } 227 - { model = model.playlists 228 - , msg = sub 229 - } 230 - 231 - QueueMsg sub -> 232 - \model -> 233 - Return3.wieldNested 234 - Reply.translate 235 - { mapCmd = QueueMsg 236 - , mapModel = \child -> { model | queue = child } 237 - , update = Queue.update 238 - } 239 - { model = model.queue 240 - , msg = sub 241 - } 242 - 243 - SourcesMsg sub -> 244 - \model -> 245 - Return3.wieldNested 246 - Reply.translate 247 - { mapCmd = SourcesMsg 248 - , mapModel = \child -> { model | sources = child } 249 - , update = Sources.update 250 - } 251 - { model = model.sources 252 - , msg = sub 253 - } 254 - 255 - TracksMsg sub -> 256 - \model -> 257 - Return3.wieldNested 258 - Reply.translate 259 - { mapCmd = TracksMsg 260 - , mapModel = \child -> { model | tracks = child } 261 - , update = Tracks.update 262 - } 263 - { model = model.tracks 264 - , msg = sub 265 - } 266 - 267 - ----------------------------------------- 268 233 -- Equalizer 269 234 ----------------------------------------- 270 235 ActivateKnob a b -> ··· 394 359 EtCetera.setIsOnline a 395 360 396 361 ----------------------------------------- 397 - -- TODO 362 + -- Children (TODO) 398 363 ----------------------------------------- 399 - Audio a -> 400 - Audio.update a 364 + AuthenticationMsg sub -> 365 + \model -> 366 + Return3.wieldNested 367 + Reply.translate 368 + { mapCmd = AuthenticationMsg 369 + , mapModel = \child -> { model | authentication = child } 370 + , update = Authentication.update 371 + } 372 + { model = model.authentication 373 + , msg = sub 374 + } 375 + 376 + BackdropMsg sub -> 377 + \model -> 378 + Return3.wieldNested 379 + Reply.translate 380 + { mapCmd = BackdropMsg 381 + , mapModel = \child -> { model | backdrop = child } 382 + , update = Backdrop.update 383 + } 384 + { model = model.backdrop 385 + , msg = sub 386 + } 387 + 388 + PlaylistsMsg sub -> 389 + \model -> 390 + Return3.wieldNested 391 + Reply.translate 392 + { mapCmd = PlaylistsMsg 393 + , mapModel = \child -> { model | playlists = child } 394 + , update = Playlists.update 395 + } 396 + { model = model.playlists 397 + , msg = sub 398 + } 399 + 400 + QueueMsg sub -> 401 + \model -> 402 + Return3.wieldNested 403 + Reply.translate 404 + { mapCmd = QueueMsg 405 + , mapModel = \child -> { model | queue = child } 406 + , update = Queue.update 407 + } 408 + { model = model.queue 409 + , msg = sub 410 + } 411 + 412 + SourcesMsg sub -> 413 + \model -> 414 + Return3.wieldNested 415 + Reply.translate 416 + { mapCmd = SourcesMsg 417 + , mapModel = \child -> { model | sources = child } 418 + , update = Sources.update 419 + } 420 + { model = model.sources 421 + , msg = sub 422 + } 423 + 424 + TracksMsg sub -> 425 + \model -> 426 + Return3.wieldNested 427 + Reply.translate 428 + { mapCmd = TracksMsg 429 + , mapModel = \child -> { model | tracks = child } 430 + , update = Tracks.update 431 + } 432 + { model = model.tracks 433 + , msg = sub 434 + } 401 435 402 436 403 437 ··· 407 441 subscriptions : Model -> Sub Msg 408 442 subscriptions model = 409 443 Sub.batch 410 - [ Audio.subscriptions model 411 - , Ports.fromAlien alien 444 + [ Ports.fromAlien alien 445 + 446 + ----------------------------------------- 447 + -- Audio 448 + ----------------------------------------- 449 + , Ports.noteProgress NoteProgress 450 + , Ports.requestPlayPause (always TogglePlay) 451 + , Ports.requestStop (always Stop) 452 + , Ports.setAudioDuration SetAudioDuration 453 + , Ports.setAudioHasStalled SetAudioHasStalled 454 + , Ports.setAudioIsLoading SetAudioIsLoading 455 + , Ports.setAudioIsPlaying SetAudioIsPlaying 456 + , Ports.setAudioPosition SetAudioPosition 412 457 413 458 ----------------------------------------- 414 459 -- Backdrop ··· 431 476 , Ports.requestPrevious <| always (QueueMsg Queue.Rewind) 432 477 433 478 ----------------------------------------- 479 + -- Resize 480 + ----------------------------------------- 481 + , Browser.Events.onResize 482 + (\w h -> 483 + ( w, h ) 484 + |> ResizedWindow 485 + |> Debouncer.provideInput 486 + |> Debounce 487 + ) 488 + 489 + ----------------------------------------- 434 490 -- Services 435 491 ----------------------------------------- 436 492 , Ports.scrobble Scrobble ··· 446 502 , Ports.setIsOnline SetIsOnline 447 503 , Sub.map KeyboardMsg Keyboard.subscriptions 448 504 , Time.every (60 * 1000) SetCurrentTime 449 - 450 - -- Resize 451 - --------- 452 - , Browser.Events.onResize 453 - (\w h -> 454 - ( w, h ) 455 - |> ResizedWindow 456 - |> Debouncer.provideInput 457 - |> Debounce 458 - ) 459 505 ] 460 506 461 507
+2 -2
src/Applications/UI/Adjunct.elm
··· 60 60 Return.performance (Reply Reply.ShiftQueue) m 61 61 62 62 [ Keyboard.ArrowUp ] -> 63 - Return.performance (Reply (Reply.Seek <| (m.audio.position - 10) / m.audio.duration)) m 63 + Return.performance (Reply (Reply.Seek <| (m.audioPosition - 10) / m.audioDuration)) m 64 64 65 65 [ Keyboard.ArrowDown ] -> 66 - Return.performance (Reply (Reply.Seek <| (m.audio.position + 10) / m.audio.duration)) m 66 + Return.performance (Reply (Reply.Seek <| (m.audioPosition + 10) / m.audioDuration)) m 67 67 68 68 [ Keyboard.Character "N" ] -> 69 69 Return.performance (Reply Reply.ScrollToNowPlaying) m
+11 -95
src/Applications/UI/Audio/State.elm
··· 7 7 import Monocle.Lens as Lens exposing (Lens) 8 8 import Return exposing (return) 9 9 import Return.Ext as Return exposing (communicate) 10 - import UI.Audio.Types as Audio exposing (Msg(..)) 11 10 import UI.Ports as Ports 12 11 import UI.Queue as Queue 13 12 import UI.Reply as Reply ··· 15 14 16 15 17 16 18 - -- 🌳 19 - 20 - 21 - initialModel : Audio.Model 22 - initialModel = 23 - { duration = 0 24 - , hasStalled = False 25 - , isLoading = False 26 - , isPlaying = False 27 - , position = 0 28 - 29 - -- 30 - , progress = Dict.empty 31 - , rememberProgress = True 32 - } 33 - 34 - 35 - lens : Lens UI.Model Audio.Model 36 - lens = 37 - { get = .audio 38 - , set = \audio ui -> { ui | audio = audio } 39 - } 40 - 41 - 42 - 43 17 -- 📣 44 18 45 19 46 - update : Audio.Msg -> Manager 47 - update msg = 48 - case msg of 49 - NoteProgress a -> 50 - organize (noteProgress a) 51 - 52 - PlayPause -> 53 - playPause 54 - 55 - SetDuration a -> 56 - setDuration a 57 - 58 - SetHasStalled a -> 59 - organize (setHasStalled a) 60 - 61 - SetIsLoading a -> 62 - organize (setIsLoading a) 63 - 64 - SetIsPlaying a -> 65 - organize (setIsPlaying a) 66 - 67 - SetPosition a -> 68 - organize (setPosition a) 69 - 70 - Stop -> 71 - stop 72 - 73 - 74 - organize : Organizer Audio.Model -> Manager 75 - organize = 76 - Management.organize lens 77 - 78 - 79 - 80 - -- 📰 81 - 82 - 83 - subscriptions : UI.Model -> Sub UI.Msg 84 - subscriptions _ = 85 - [ Ports.noteProgress NoteProgress 86 - , Ports.requestPlayPause (always PlayPause) 87 - , Ports.requestStop (always Stop) 88 - , Ports.setAudioDuration SetDuration 89 - , Ports.setAudioHasStalled SetHasStalled 90 - , Ports.setAudioIsLoading SetIsLoading 91 - , Ports.setAudioIsPlaying SetIsPlaying 92 - , Ports.setAudioPosition SetPosition 93 - ] 94 - |> Sub.batch 95 - |> Sub.map UI.Audio 96 - 97 - 98 - 99 - -- 🔱 100 - 101 - 102 - noteProgress : { trackId : String, progress : Float } -> Organizer Audio.Model 20 + noteProgress : { trackId : String, progress : Float } -> Manager 103 21 noteProgress { trackId, progress } model = 104 22 let 105 23 updatedProgressTable = ··· 128 46 -- TODO! 129 47 Return.performance (UI.QueueMsg Queue.Shift) model 130 48 131 - else if model.audio.isPlaying then 49 + else if model.audioIsPlaying then 132 50 communicate (Ports.pause ()) model 133 51 134 52 else ··· 150 68 Nothing -> 151 69 Cmd.none 152 70 in 153 - model 154 - |> Lens.modify lens (\audio -> { audio | duration = duration }) 155 - |> Return.communicate cmd 71 + return { model | audioDuration = duration } cmd 156 72 157 73 158 - setHasStalled : Bool -> Organizer Audio.Model 74 + setHasStalled : Bool -> Manager 159 75 setHasStalled hasStalled model = 160 - Return.singleton { model | hasStalled = hasStalled } 76 + Return.singleton { model | audioHasStalled = hasStalled } 161 77 162 78 163 - setIsLoading : Bool -> Organizer Audio.Model 79 + setIsLoading : Bool -> Manager 164 80 setIsLoading isLoading model = 165 - Return.singleton { model | isLoading = isLoading } 81 + Return.singleton { model | audioIsLoading = isLoading } 166 82 167 83 168 - setIsPlaying : Bool -> Organizer Audio.Model 84 + setIsPlaying : Bool -> Manager 169 85 setIsPlaying isPlaying model = 170 - Return.singleton { model | isPlaying = isPlaying } 86 + Return.singleton { model | audioIsPlaying = isPlaying } 171 87 172 88 173 - setPosition : Float -> Organizer Audio.Model 89 + setPosition : Float -> Manager 174 90 setPosition position model = 175 - Return.singleton { model | position = position } 91 + Return.singleton { model | audioPosition = position } 176 92 177 93 178 94 stop : Manager
-37
src/Applications/UI/Audio/Types.elm
··· 1 - module UI.Audio.Types exposing (..) 2 - 3 - import Dict exposing (Dict) 4 - 5 - 6 - 7 - -- 🌳 8 - 9 - 10 - type alias Model = 11 - { duration : Float 12 - , hasStalled : Bool 13 - , isLoading : Bool 14 - , isPlaying : Bool 15 - , position : Float 16 - 17 - ----------------------------------------- 18 - -- Progress 19 - ----------------------------------------- 20 - , progress : Dict String Float 21 - , rememberProgress : Bool 22 - } 23 - 24 - 25 - 26 - -- 📣 27 - 28 - 29 - type Msg 30 - = NoteProgress { trackId : String, progress : Float } 31 - | PlayPause 32 - | SetDuration Float 33 - | SetHasStalled Bool 34 - | SetIsLoading Bool 35 - | SetIsPlaying Bool 36 - | SetPosition Float 37 - | Stop
+11 -15
src/Applications/UI/Reply/Translate.elm
··· 38 38 import Tracks 39 39 import Tracks.Encoding as Tracks 40 40 import UI.Audio.State as Audio 41 - import UI.Audio.Types as Audio 42 41 import UI.Authentication as Authentication 43 42 import UI.Authentication.ContextMenu as Authentication 44 43 import UI.Backdrop as Backdrop ··· 106 105 Audio.playPause model 107 106 108 107 ToggleRememberProgress -> 109 - model 110 - |> Lens.modify 111 - Audio.lens 112 - (\a -> { a | rememberProgress = not a.rememberProgress }) 113 - |> translate 114 - SaveSettings 108 + translate 109 + SaveSettings 110 + { model | rememberProgress = not model.rememberProgress } 115 111 116 112 ----------------------------------------- 117 113 -- Authentication ··· 437 433 model.currentTime 438 434 model.sources.collection 439 435 model.tracks.cached 440 - (if model.audio.rememberProgress then 441 - model.audio.progress 436 + (if model.rememberProgress then 437 + model.progress 442 438 443 439 else 444 440 Dict.empty ··· 573 569 model.currentTime 574 570 model.sources.collection 575 571 model.tracks.cached 576 - (if model.audio.rememberProgress then 577 - model.audio.progress 572 + (if model.rememberProgress then 573 + model.progress 578 574 579 575 else 580 576 Dict.empty ··· 751 747 Export -> 752 748 { favourites = model.tracks.favourites 753 749 , playlists = List.filterNot .autoGenerated model.playlists.collection 754 - , progress = model.audio.progress 750 + , progress = model.progress 755 751 , settings = Just (gatherSettings model) 756 752 , sources = model.sources.collection 757 753 , tracks = model.tracks.collection.untouched ··· 797 793 |> return model 798 794 799 795 SaveProgress -> 800 - model.audio.progress 796 + model.progress 801 797 |> Json.Encode.dict identity Json.Encode.float 802 798 |> Alien.broadcast Alien.SaveProgress 803 799 |> Ports.toBrain ··· 875 871 876 872 877 873 gatherSettings : Model -> Settings.Settings 878 - gatherSettings { audio, backdrop, lastFm, processAutomatically, tracks } = 874 + gatherSettings { backdrop, lastFm, processAutomatically, rememberProgress, tracks } = 879 875 { backgroundImage = backdrop.chosen 880 876 , hideDuplicates = tracks.hideDuplicates 881 877 , lastFm = lastFm.sessionKey 882 878 , processAutomatically = processAutomatically 883 - , rememberProgress = audio.rememberProgress 879 + , rememberProgress = rememberProgress 884 880 }
+47 -23
src/Applications/UI/Types.elm
··· 39 39 import Time 40 40 import Tracks 41 41 import Tracks.Encoding as Tracks 42 - import UI.Audio.Types as Audio 43 42 import UI.Authentication as Authentication 44 43 import UI.Authentication.ContextMenu as Authentication 45 44 import UI.Backdrop as Backdrop ··· 84 83 85 84 86 85 type alias Model = 87 - { alfred : Maybe (Alfred Msg) 88 - , contextMenu : Maybe (ContextMenu Reply) 89 - , confirmation : Maybe String 86 + { confirmation : Maybe String 90 87 , currentTime : Time.Posix 91 88 , darkMode : Bool 92 - , debounce : Debouncer Msg Msg 93 89 , downloading : Maybe { notificationId : Int } 94 90 , focusedOnInput : Bool 95 91 , isDragging : Bool ··· 99 95 , isUpgrading : Bool 100 96 , lastFm : LastFm.Model 101 97 , navKey : Nav.Key 102 - , notifications : UI.Notifications.Model 103 98 , page : Page 104 99 , pressedKeys : List Keyboard.Key 105 100 , processAutomatically : Bool ··· 107 102 , viewport : Viewport 108 103 109 104 ----------------------------------------- 110 - -- Children 105 + -- Audio 106 + ----------------------------------------- 107 + , audioDuration : Float 108 + , audioHasStalled : Bool 109 + , audioIsLoading : Bool 110 + , audioIsPlaying : Bool 111 + , audioPosition : Float 112 + 113 + ----------------------------------------- 114 + -- Debouncing 115 + ----------------------------------------- 116 + , debounce : Debouncer Msg Msg 117 + 118 + ----------------------------------------- 119 + -- Instances 120 + ----------------------------------------- 121 + , alfred : Maybe (Alfred Msg) 122 + , contextMenu : Maybe (ContextMenu Reply) 123 + , notifications : UI.Notifications.Model 124 + 125 + ----------------------------------------- 126 + -- Progress 127 + ----------------------------------------- 128 + , progress : Dict String Float 129 + , rememberProgress : Bool 130 + 131 + ----------------------------------------- 132 + -- Children (TODO) 111 133 ----------------------------------------- 112 134 , authentication : Authentication.Model 113 135 , backdrop : Backdrop.Model ··· 116 138 , playlists : Playlists.Model 117 139 , sources : Sources.Model 118 140 , tracks : Tracks.Model 119 - 120 - ----------------------------------------- 121 - -- Pieces 122 - ----------------------------------------- 123 - , audio : Audio.Model 124 141 } 125 142 126 143 ··· 138 155 | GotAlfredInput String 139 156 | SelectAlfredItem Int 140 157 ----------------------------------------- 158 + -- Audio 159 + ----------------------------------------- 160 + | NoteProgress { trackId : String, progress : Float } 161 + | SetAudioDuration Float 162 + | SetAudioHasStalled Bool 163 + | SetAudioIsLoading Bool 164 + | SetAudioIsPlaying Bool 165 + | SetAudioPosition Float 166 + | Stop 167 + | TogglePlay 168 + ----------------------------------------- 141 169 -- Authentication 142 170 ----------------------------------------- 143 171 | AuthenticationBootFailure String 144 172 | MissingSecretKey Json.Decode.Value 145 173 | NotAuthenticated 146 174 | RemoteStorageWebfinger RemoteStorage.Attributes (Result Http.Error String) 147 - ----------------------------------------- 148 - -- Children (TODO) 149 - ----------------------------------------- 150 - | AuthenticationMsg Authentication.Msg 151 - | BackdropMsg Backdrop.Msg 152 - | PlaylistsMsg Playlists.Msg 153 - | QueueMsg Queue.Msg 154 - | SourcesMsg Sources.Msg 155 - | TracksMsg Tracks.Msg 156 175 ----------------------------------------- 157 176 -- Equalizer 158 177 ----------------------------------------- ··· 215 234 | SetCurrentTime Time.Posix 216 235 | SetIsOnline Bool 217 236 ----------------------------------------- 218 - -- TODO 237 + -- Children (TODO) 219 238 ----------------------------------------- 220 - | Audio Audio.Msg 239 + | AuthenticationMsg Authentication.Msg 240 + | BackdropMsg Backdrop.Msg 241 + | PlaylistsMsg Playlists.Msg 242 + | QueueMsg Queue.Msg 243 + | SourcesMsg Sources.Msg 244 + | TracksMsg Tracks.Msg 221 245 222 246 223 247 type alias Organizer model =
+2 -8
src/Applications/UI/User/State/Import.elm
··· 164 164 -- 165 165 , lastFm = { lastFmModel | sessionKey = Maybe.andThen .lastFm data.settings } 166 166 , processAutomatically = Maybe.unwrap True .processAutomatically data.settings 167 + , progress = data.progress 168 + , rememberProgress = Maybe.unwrap True .rememberProgress data.settings 167 169 } 168 - |> Lens.modify 169 - Audio.lens 170 - (\a -> 171 - { a 172 - | progress = data.progress 173 - , rememberProgress = Maybe.unwrap True .rememberProgress data.settings 174 - } 175 - ) 176 170 -- 177 171 , Cmd.batch 178 172 [ Cmd.map PlaylistsMsg playlistsCmd
+6 -6
src/Applications/UI/View.elm
··· 204 204 , hideDuplicateTracks = model.tracks.hideDuplicates 205 205 , lastFm = model.lastFm 206 206 , processAutomatically = model.processAutomatically 207 - , rememberProgress = model.audio.rememberProgress 207 + , rememberProgress = model.rememberProgress 208 208 } 209 209 |> Lazy.lazy2 Settings.view subPage 210 210 |> Html.map Reply ··· 227 227 model.queue.activeItem 228 228 model.queue.repeat 229 229 model.queue.shuffle 230 - { stalled = model.audio.hasStalled 231 - , loading = model.audio.isLoading 232 - , playing = model.audio.isPlaying 230 + { stalled = model.audioHasStalled 231 + , loading = model.audioIsLoading 232 + , playing = model.audioIsPlaying 233 233 } 234 - ( model.audio.position 235 - , model.audio.duration 234 + ( model.audioPosition 235 + , model.audioDuration 236 236 ) 237 237 ) 238 238 ]