module Network.Google.Picasa (
UserId
, defaultUser
, AlbumId
, listAlbums
, listPhotos
) where
import Control.Monad (liftM)
import Data.Maybe (mapMaybe)
import Network.Google (AccessToken, ProjectId, doRequest, makeRequest)
import Network.HTTP.Conduit (Request)
import Text.XML.Light (Element(elContent), QName(..), filterChildrenName, findChild, strContent)
picasaHost :: String
picasaHost = "picasaweb.google.com"
picasaApi :: (String, String)
picasaApi = ("Gdata-version", "2")
type UserId = String
defaultUser :: UserId
defaultUser = "default"
type AlbumId = String
listAlbums ::
AccessToken
-> UserId
-> IO Element
listAlbums accessToken userId =
doRequest $ picasaFeedRequest accessToken userId Nothing
extractAlbumIds ::
Element
-> [AlbumId]
extractAlbumIds root =
let
idQname = QName {qName = "id", qURI = Just "http://schemas.google.com/photos/2007", qPrefix = Just "gphoto"}
entries :: [Element]
entries = filterChildrenName ((== "entry") . qName) root
extractAlbumId :: Element -> Maybe String
extractAlbumId = liftM strContent . findChild idQname
in
mapMaybe extractAlbumId entries
listPhotos ::
AccessToken
-> UserId
-> [AlbumId]
-> IO Element
listPhotos accessToken userId albumIds =
do
albumIds' <-
if null albumIds
then liftM extractAlbumIds $ listAlbums accessToken userId
else return albumIds
results <- mapM (listAlbumPhotos accessToken userId) albumIds'
let
root = head results
return $ root {elContent = concatMap elContent results}
listAlbumPhotos ::
AccessToken
-> UserId
-> AlbumId
-> IO Element
listAlbumPhotos accessToken userId albumId =
doRequest $ picasaFeedRequest accessToken userId (Just albumId)
picasaFeedRequest ::
AccessToken
-> UserId
-> Maybe AlbumId
-> Request m
picasaFeedRequest accessToken userId albumId =
makeRequest accessToken picasaApi "GET"
(
picasaHost
, "/data/feed/api/user/" ++ userId ++ maybe "" ("/albumid/" ++) albumId
)