packages feed

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'