packages feed

pgdl-6.2: src/Main.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}

import FetchHtml
import PrsVid
import Beaut
import PlayVid
import Search
import Getconfig
import Chkcfg
import Video
import Log

import Graphics.Vty.Widgets.All
import qualified Data.Text as T
import System.FilePath
import System.Exit
import Graphics.Vty
import System.Environment
import System.Directory
import Control.Monad
import Control.Applicative
import System.IO
import Control.Concurrent

main = do
    chkcfg

    c <- newCollection

    lst <- newList 3 
    diskrd <- readVid
    diskV  <- search diskrd <$> getArgs
    forM_ diskV $ \v -> do
        addToList lst v =<< (plainText $ beaut v)
    lfg <- newFocusGroup
    addToFocusGroup lfg lst
    lui <- centered =<< hFixed 80 lst
    chgls <- addToCollection c lui lfg

    (dlg, dfcg) <- do
        wg <- plainText "redownload it?"
        newDialog wg "File Exists!"
    dui <- centered =<< hFixed 30 (dialogWidget dlg)
    chgdl <- addToCollection c dui dfcg

    setFocusGroupNextKey dfcg KRight []
    setFocusGroupPrevKey dfcg KLeft  []
    dfcg  `onKeyPressed` tryExit

    lfg   `onKeyPressed` tryExit
                                            
    dlg `onDialogCancel` const exitSuccess
    onDialogAccept dlg $ \_ ->  do
        Just (_, (itm, _)) <- getSelected lst
        playVid 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
            chgif <- addToCollection c inf ifsfg
            chgif
            return True
        _ -> return False

    schedule $ do
        forkIO $ do
            rd    <- prsVid <$> fetchHtml
            vdlst <- search rd <$> getArgs
            when (length vdlst < 1) $ error "empty list!"
            Just (_, (oldItm, _)) <- getSelected lst
            clearList lst
            forM_ vdlst $ \v -> do
                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 _ -> fex itm >>= \case 
                    True  -> setFocusAttribute lst (black `on` red) 
                    False -> setFocusAttribute lst (black `on` cyan)
                _                   -> return ()

            onKeyPressed lst $ \_ key _ -> case key of
                KEnter -> do
                    Just (_, (itm, _)) <- getSelected lst
                    fex itm >>= \case 
                        True  -> chgdl
                        False -> playVid itm
                    return True
                _      -> return False

            forkIO $ writeVid vdlst
            return ()
        return ()

    runUi c $ defaultContext {normalAttr = white `on` black, 
                              focusAttr  = black `on` cyan
                             }
    where fex itm = do
            locd <- fmap T.unpack getLocaldir
            doesFileExist $ locd </> (T.unpack . vidName $ itm)
          tryExit _ key _ = case key of
            KChar 'q' -> exitSuccess
            _         -> return False

crtInfPg :: Video -> T.Text
crtInfPg vid = T.unlines ["", "",
                          "File name: " `app` (spl . vidName) vid,
                          "File size: " `app` vidSize vid,
                          "File date: " `app` vidDate vid,
                          "File link: " `app` (spl . vidLink) vid
                         ]
    where app = T.append
          spl = T.intercalate "\n" . T.chunksOf 60