themoviedb-1.2.1: example/Main.hs
{-
This file is part of the Haskell package themoviedb. 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/themoviedb/LICENSE. No
part of themoviedb package, including this file, may be copied,
modified, propagated, or distributed except according to the terms
contained in the LICENSE file.
-}
module Main (main) where
import qualified Data.Text as T
import Data.Time (defaultTimeLocale, formatTime)
import Network.API.TheMovieDB
import Text.Printf (printf)
-- | Simple banner style printing of a 'Movie'.
printMovieHeader :: Movie -> IO ()
printMovieHeader m =
printf "%8d: %s (%s)\n" (movieID m) (T.unpack $ movieTitle m) year
where
year = case movieReleaseDate m of
Just d -> formatTime defaultTimeLocale "%Y" d
Nothing -> "----"
-- | Simple banner style printing of a 'TV'.
printTVHeader :: TV -> IO ()
printTVHeader t =
printf "%8d: %s (%s)\n" (tvID t) (T.unpack $ tvName t) year
where
year = case tvFirstAirDate t of
Just d -> formatTime defaultTimeLocale "%Y" d
Nothing -> "----"
-- | Print more detailed information for a 'Movie'.
printMovieDetails :: Movie -> IO ()
printMovieDetails m =
do
putStrLn $ "Popularity: " ++ show (moviePopularity m)
putStrLn $ strJoin $ map genreName (movieGenres m)
putStrLn "-- "
putStrLn $ T.unpack (movieOverview m)
where
strJoin = T.unpack . T.intercalate ", "
-- | Print information about a season.
printSeason :: Season -> IO ()
printSeason s =
do
putStrLn $ "Season " ++ show (seasonNumber s) ++ " " ++ year
mapM_ (putStrLn . episode) $ seasonEpisodes s
where
episode e =
"\tE" ++ show (episodeNumber e) ++ " "
++ T.unpack (episodeName e)
year = case seasonAirDate s of
Just d -> formatTime defaultTimeLocale "%Y" d
Nothing -> "----"
-- | Search for movies with a query string.
searchAndListMovies :: Text -> TheMovieDB ()
searchAndListMovies query = do
movies <- searchMovies query
liftIO $ mapM_ printMovieHeader movies
-- | Find a specific movie given its ID.
fetchAndPrintMovie :: ItemID -> TheMovieDB ()
fetchAndPrintMovie mid = do
cfg <- config
movie <- fetchMovie mid
liftIO $ do
printMovieHeader movie
mapM_ (putStrLn . T.unpack) (moviePosterURLs cfg movie)
printMovieDetails movie
-- | Search for TV series using a query string.
searchAndListTV :: Text -> TheMovieDB ()
searchAndListTV query = do
tvs <- searchTV query
liftIO $ mapM_ printTVHeader tvs
-- | Find a specific TV series given its ID.
fetchAndPrintTV :: ItemID -> TheMovieDB ()
fetchAndPrintTV tid = do
tv <- fetchTV tid
liftIO $ printTVHeader tv
liftIO $ mapM_ printSeason (tvSeasons tv)
fetchAndPrintSeason :: ItemID -> Int -> TheMovieDB ()
fetchAndPrintSeason t s = do
season <- fetchTVSeason t s
liftIO $ printSeason season
fetchAndPrintFullTV :: ItemID -> TheMovieDB ()
fetchAndPrintFullTV t = do
tv <- fetchFullTVSeries t
liftIO $ printTVHeader tv
liftIO $ mapM_ printSeason (tvSeasons tv)
-- | Low budget command line parsing and dispatch.
main :: IO ()
main = do
args <- getArgs
lang <- lookupEnv "TMDB_LANG"
let key = maybe T.empty T.pack (listToMaybe args)
settings = Settings key (toText <$> lang)
result <- runTheMovieDB settings $
case args of
[_, "search", query] -> searchAndListMovies (T.pack query)
[_, "fetch", mid] -> itemID fetchAndPrintMovie mid
[_, "tsearch", query] -> searchAndListTV (T.pack query)
[_, "tfetch", tid] -> itemID fetchAndPrintTV tid
[_, "season", t, s] -> itemID (\t -> itemID (fetchAndPrintSeason t) s) t
[_, "tfull", t] -> itemID fetchAndPrintFullTV t
_ -> liftIO (putStrLn usage >> exitFailure)
case result of
Left err -> print err >> exitFailure
Right _ -> exitSuccess
where
itemID :: MonadIO m => (ItemID -> m a) -> String -> m a
itemID f str =
case readMaybe str of
Nothing -> die ("invalid ID: " <> str)
Just n -> f n
usage =
"Usage: tmdb key {search|fetch|tsearch|tfetch|season|tfull}\n\n"
++ "Description:\n"
++ " search: search TheMovieDB\n"
++ " fetch: fetch info about one movie\n"
++ " tsearch: search for TV series\n"
++ " tfetch: fetch TV series by ID\n"
++ " season: fetch one season by TV ID and season num\n"
++ " tfull: pull everything about TV series by ID\n"
++ "Examples:\n"
++ " tmdb KEY search \"back to the future\"\n"
++ " tmdb KEY fetch 105\n"
++ " tmdb KEY tsearch Firefly\n"
++ " tmdb KEY tfetch 1437\n"
++ " tmdb KEY season 1437 1\n"
++ " tmdb KEY tfull 1437\n"