pgdl-7.5: src/Main.hs
{-# 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
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
if null args || head args /= "-f"
then schedule $ do
forkIO $ do
rd <- prsVid <$> fetchHtml
let vdlst = search rd args
when (length vdlst < 1) $ error "no video 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 ()
vLstAction lst chgdl statBar
(null <$> getArgs) >>= \case
True -> void . forkIO $ writeVid vdlst
_ -> return ()
return ()
return ()
else schedule $ do
forkIO $ do
rd <- prsFld <$> fetchHtml
let fdlst = search rd (tail args)
when (length fdlst < 1) $ error "no folder found!"
clearList lst
forM_ fdlst $ \v -> addToList lst v =<< plainText (beaut v)
setFocusAttribute lst (black `on` cyan)
return ()
return ()
let openFld lnk = do
ctnt <- (map (attcLink lnk) . prsVid) <$> fetchFld lnk
when (null ctnt) $ error "no video in the folder!"
clearList lst
forM_ ctnt $ \v -> addToList lst v =<< plainText (beaut v)
vLstAction lst chgdl statBar
return ()
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 fex itm = downloaded $ vidName itm
tryExit _ key _ = case key of
KChar 'q' -> exitSuccess
_ -> return False
vLstAction lst chgdl statBar = do
onSelectionChange lst $ \sle -> case sle of
SelectionOn _ itm _ -> 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 ()
where fex itm = downloaded $ vidName itm