packages feed

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"