packages feed

liblastfm-0.4.0.0: examples/multitag-search.hs

{-# LANGUAGE OverloadedStrings #-}
{- This example shows how to do multitag search even
 - if it's not provided by Lastfm API
 -
 - Sample output:
 -
 - $> ./examples/multitag-search.hs
 - 坂本真綾
 - KOTOKO
 - Lisa
 - 茅原実里
 -}
import           Data.Aeson.Types          -- aeson
import           Data.List (intersect)     -- base
import           Data.Maybe                -- base
import           Data.Text (Text)          -- text
import qualified Data.Text.IO as Text      -- text
import           Network.Lastfm            -- liblastfm
import qualified Network.Lastfm.Tag as Tag -- liblastfm

{-# ANN module ("HLint: ignore Use camelCase" :: String) #-}


main :: IO ()
main = mapM_ Text.putStrLn =<< get_artists multitags


get_artists :: [Text] -> IO [Text]
get_artists ts = do
  names <- mapM request ts
  case catMaybes names of
    [] -> return []
    ns -> return (foldl1 intersect ns)
 where
  request = fmap (either (const Nothing) (parseMaybe gta)) . query

  query t = lastfm $ Tag.getTopArtists <*> tag t <* limit 100 <*> apiKey "29effec263316a1f8a97f753caaa83e0" <* json

gta :: Value -> Parser [Text]
gta o = parseJSON o >>= (.: "topartists") >>= (.: "artist") >>= mapM (.: "name")

multitags :: [Text]
multitags = ["j-pop", "anime", "anime-ost"]