vimeta-0.2.0.0: src/Vimeta/UI/Term/TV.hs
{-# LANGUAGE OverloadedStrings #-}
{-
This file is part of the vimeta package. It is subject to the license
terms in the LICENSE file found in the top-level directory of this
distribution and at git://pmade.com/vimeta/LICENSE. No part of the
vimeta package, including this file, may be copied, modified,
propagated, or distributed except according to the terms contained in
the LICENSE file.
-}
--------------------------------------------------------------------------------
-- | Search for a TV series by interacting with the user through the terminal.
module Vimeta.UI.Term.TV
( tvSearch
) where
--------------------------------------------------------------------------------
import Data.Monoid
import qualified Data.Text as Text
import Network.API.TheMovieDB
import System.Console.Byline
import Vimeta.Core hiding (ask)
import Vimeta.UI.Common.Util
import Vimeta.UI.Term.Common
--------------------------------------------------------------------------------
tvSearch :: Vimeta (Byline IO) TV
tvSearch = do
let prompt = "search (series name): "
mprompt = "Which is the correct TV series? "
sprompt = "a search term is required" <> fg red
eprompt = "please choose a TV series" <> fg red
name <- byline (askUntil prompt Nothing $ notEmpty sprompt)
series <- tmdb (searchTV name)
answer <- byline $ askWithMenuRepeatedly (mkMenu series) mprompt eprompt
case answer of
Match tv -> logID tv >> tmdb (fetchFullTVSeries (tvID tv))
_ -> die "you need to pick a valid TV series"
where
-- The menu.
mkMenu series = banner "Choose a TV series:" (menu series displayTV)
-- Function to display possible matches.
displayTV series =
mconcat [ text (tvName series)
, text (parens $ dayRange (tvFirstAirDate series) (tvLastAirDate series))
]
-- Log the TV ID.
logID tv = verbose $ "using TV ID: " <> Text.pack (show $ tvID tv)