{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE LambdaCase #-} {-# OPTIONS_GHC -fno-warn-unused-do-bind #-} import FetchHtml import PrsVid import Beaut import PlayVid import Search import Chkcfg import Video import Log import TestExist import GenStat import CrtInf import AskScene import Control.Applicative import Control.Concurrent import Control.Monad import System.Exit import System.Environment import Graphics.Vty import Graphics.Vty.Widgets.All main :: IO () main = do chkcfg c <- newCollection lst <- newList 3 diskrd <- readVid args <- getArgs let diskV = if null args then diskrd else dlnVid forM_ diskV $ \v -> addToList lst v =<< plainText (beaut v) lfg <- newFocusGroup addToFocusGroup lfg lst statBar <- plainText waitingBar setNormalAttribute statBar (black `on` green) ui <- centered =<< hFixed 80 =<< vBox lst statBar chgls <- addToCollection c ui lfg (dlg, dfcg) <- newAskScene dui <- centered =<< hFixed 50 (sceneWidget dlg) chgdl <- addToCollection c dui dfcg dfcg `onKeyPressed` tryExit lfg `onKeyPressed` tryExit -- four button in ask scene's action onScePlay dlg $ \_ -> do Just (_, (itm, _)) <- getSelected lst justPlay itm onSceDown dlg $ \_ -> do Just (_, (itm, _)) <- getSelected lst playVid itm onSceQuit dlg $ const exitSuccess onSceRemv dlg $ \_ -> do Just (_, (itm, _)) <- getSelected lst removeVid itm ifsfg <- newFocusGroup onKeyPressed ifsfg $ \_ key _ -> case key of KLeft -> chgls >> return True _ -> return False ifsfg `onKeyPressed` tryExit onKeyPressed lst $ \_ key _ -> case key of KRight -> do Just (_, (itm, _)) <- getSelected lst inf <- centered =<< plainText (crtInfPg itm) addToFocusGroup ifsfg inf join $ addToCollection c inf ifsfg return True _ -> return False schedule $ do forkIO $ do rd <- prsHtm <$> fetchHtml let vdlst = search rd args when (length vdlst < 1) $ error "no video or folder found!" Just (_, (oldItm, _)) <- getSelected lst clearList lst forM_ vdlst $ \v -> addToList lst v =<< plainText (beaut v) listFindFirst lst oldItm >>= \case Just ind -> setSelected lst ind Nothing -> return () onSelectionChange lst $ \sle -> case sle of SelectionOn _ itm _ -> if isFld itm then setFocusAttribute lst (black `on` magenta) else fex itm >>= \case True -> setFocusAttribute lst (black `on` red) False -> setFocusAttribute lst (black `on` cyan) _ -> return () onSelectionChange lst $ \sle -> case sle of SelectionOn _ itm _ -> setText statBar =<< genStat itm _ -> return () (null <$> getArgs) >>= \case True -> void . forkIO $ writeVid vdlst _ -> return () return () return () let openFld lnk = do ctnt <- (map (attcLink lnk) . prsHtm) <$> fetchFld lnk when (null ctnt) $ error "no video in the folder!" clearList lst forM_ ctnt $ \v -> addToList lst v =<< plainText (beaut v) return () -- User chose a folder or video ! onKeyPressed lst $ \_ key _ -> case key of KEnter -> do Just (_, (itm, _)) <- getSelected lst case itm of Folder _ lnk _ -> openFld lnk v -> fex v >>= \case True -> chgdl False -> playVid itm return True _ -> return False runUi c $ defaultContext {normalAttr = white `on` black, focusAttr = black `on` blue } where tryExit _ key _ = case key of KChar 'q' -> exitSuccess _ -> return False fex itm | isVid itm = downloaded $ vidName itm | otherwise = return False