liblastfm-0.6.0: example/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 j-pop anime anime-ost
- 坂本真綾
- 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 as Text -- text
import qualified Data.Text.IO as Text -- text
import Lastfm -- liblastfm
import qualified Lastfm.Tag as Tag -- liblastfm
import System.Environment (getArgs) -- base
{-# ANN module ("HLint: ignore Use camelCase" :: String) #-}
main :: IO ()
main = mapM_ Text.putStrLn =<< withConnection . getArtists . map Text.pack =<< getArgs
getArtists :: [Text] -> Connection -> IO [Text]
getArtists ts conn = 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 conn $
Tag.getTopArtists <*> tag t <* limit 100 <*> apiKey "29effec263316a1f8a97f753caaa83e0" <* json
gta :: Value -> Parser [Text]
gta o = parseJSON o >>= (.: "topartists") >>= (.: "artist") >>= mapM (.: "name")