{-# 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)