hum-0.1.0.0: src/Hum/Rebuild.hs
-- |
module Hum.Rebuild where
import Hum.Types
import Control.Lens
import Brick.Widgets.List
import Network.MPD ( withMPD )
import qualified Network.MPD as MPD
import qualified Data.Vector as V
-- in which we have funcitons to rebuild the state when it changes.
songsOfArtist :: Maybe MPD.Value -> IO (V.Vector MPD.Song)
songsOfArtist martist = V.fromList . fromRight [] <$> withMPD
(MPD.find (MPD.AlbumArtist MPD.=? fromMaybe "" martist))
songsOfAlbum :: Maybe MPD.Value -> IO (V.Vector MPD.Song)
songsOfAlbum malbum = V.fromList . fromRight [] <$> withMPD
(MPD.find (MPD.Album MPD.=? fromMaybe "" malbum))
albumsOfArtist :: Maybe MPD.Value -> IO (V.Vector MPD.Value)
albumsOfArtist martist =
V.fromList . fromRight [] <$> withMPD (MPD.list MPD.Album martist)
rebuildLib :: MonadIO m => HState -> m HState
rebuildLib s = do
artistsVec <- liftIO (V.fromList . fromRight [] <$> withMPD
(MPD.list MPD.AlbumArtist Nothing))
let artists' = list ArtistsList artistsVec 1
albumsVec <- liftIO $ albumsOfArtist (snd <$> listSelectedElement artists')
let albums' = list AlbumsList albumsVec 1
songsVec <- liftIO $ songsOfAlbum (snd <$> listSelectedElement albums')
let songs' = list SongsList songsVec 1
pure $ s & libraryL . artistsL .~ artists'
& libraryL . albumsL .~ albums'
& libraryL . songsL .~ songs'
rebuildLibArtists :: MonadIO m => HState -> m HState
rebuildLibArtists s = do
let artists' = s ^. libraryL . artistsL
albumsVec <- liftIO $ albumsOfArtist (snd <$> listSelectedElement artists')
let albums' = list AlbumsList albumsVec 1
songsVec <- liftIO $ songsOfAlbum (snd <$> listSelectedElement albums')
let songs' = list SongsList songsVec 1
pure $ s & libraryL . artistsL .~ artists'
& libraryL . albumsL .~ albums'
& libraryL . songsL .~ songs'
rebuildLibAlbums :: MonadIO m => HState -> m HState
rebuildLibAlbums s = do
let albums' = s ^. libraryL . albumsL
songsVec <- liftIO $ songsOfAlbum (snd <$> listSelectedElement albums')
let songs' = list SongsList songsVec 1
pure $ s & libraryL . albumsL .~ albums' & libraryL . songsL .~ songs'
rebuildPl :: MonadIO m => HState -> m HState
rebuildPl s = do
plListVec <- liftIO $ V.fromList . fromRight [] <$> withMPD MPD.listPlaylists
let plList' = list PlaylistList plListVec 1
plSongsVec <- liftIO $ V.fromList . fromRight [] <$> withMPD
(MPD.listPlaylistInfo
(maybe "<no playlists>" snd (listSelectedElement plList'))
)
let plSongs' = (, False) <$> list PlaylistSongs plSongsVec 1
pure $ s & playlistsL . plListL .~ plList'
& playlistsL . plSongsL .~ plSongs'
rebuildPlList :: MonadIO m => HState -> m HState
rebuildPlList s = do
let plList' = s ^. playlistsL . plListL
plSongsVec <- liftIO
(V.fromList . fromRight [] <$> withMPD
(MPD.listPlaylistInfo
(maybe "<no playlists>" snd (listSelectedElement plList'))
)
)
let plSongs' = (, False) <$> list PlaylistSongs plSongsVec 1
pure $ s & playlistsL . plListL .~ plList'
& playlistsL . plSongsL .~ plSongs'
rebuildQueue :: MonadIO m => HState -> m HState
rebuildQueue s = do
queueVec <- liftIO $ V.fromList . fromRight [] <$> withMPD (MPD.playlistInfo Nothing)
let queue' = (, False) <$> list QueueList queueVec 1
pure $ s & queueL .~ queue'