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"]