module Flickr.Places
( find
, findByLatLon
, getChildrenWithPhotosPublic
, getInfo
, getInfoByUrl
, getPlaceTypes
, placesForBoundingBox
, placesForContacts
, placesForTags
, placesForUser
, resolvePlaceId
, resolvePlaceURL
, tagsForPlace
) where
import Flickr.Monad
import Flickr.Types
import Flickr.Types.Import
import Data.List ( intercalate )
find :: String -> FM (PlaceQuery, [Place])
find q =
flickTranslate toPlaces $
flickrCall "flickr.places.find"
[("query", q)]
findByLatLon :: Latitude -> Longitude -> Maybe Accuracy -> FM (PlaceQuery, [Place])
findByLatLon la lon acc =
flickTranslate toPlaces $
flickCall "flickr.places.findByLatLon"
(mbArg "accuracy" (fmap show acc) $
[("lat", la),("lon", lon)])
getChildrenWithPhotosPublic :: Either PlaceID WhereOnEarthID
-> FM (PlaceQuery, [Place])
getChildrenWithPhotosPublic pw =
flickTranslate toPlaces $
flickrCall "flickr.places.getChildrenWithPhotosPublic"
(eiArg "place_id" "woe_id" pw [])
getInfoByUrl :: URLString -> FM LocationPlace
getInfoByUrl url =
flickTranslate toLocationPlace $
flickrCall "flickr.places.getInfoByUrl"
[ ("url", url) ]
getInfo :: Either PlaceID WhereOnEarthID -> FM LocationPlace
getInfo pw =
flickTranslate toLocationPlace $
flickrCall "flickr.places.getInfo"
(eiArg "place_id" "woe_id" pw [])
getPlaceTypes :: FM [PlaceType]
getPlaceTypes =
flickTranslate toPlaceTypes $
flickrCall "flickr.places.getPlaceTypes" []
placesForBoundingBox :: BoundingBox
-> Maybe PlaceTypeName
-> Maybe PlaceTypeId
-> FM [Place]
placesForBoundingBox bbox pn pid =
flickTranslate toPlacesList $
flickCall "flickr.places.placesForBoundingBox"
(mbArg "place_type" pn $
mbArg "place_type_id" pid $
[("bbox", intercalate "," $ map show $
[ bboxMinLongitude bbox
, bboxMinLatitude bbox
, bboxMaxLongitude bbox
, bboxMaxLatitude bbox
])])
placesForContacts :: Either PlaceTypeName WhereOnEarthID
-> Maybe PlaceTypeId
-> Maybe Threshold
-> Maybe String
-> FM [Place]
placesForContacts eiPW pid th contacts = withReadPerm $
flickTranslate toPlacesList $
flickCall "flickr.places.placesForContacts"
(mbArg "woe_id" woe_id $
mbArg "place_type" pnm $
mbArg "place_type_id" pid $
mbArg "threshold" (fmap show th) $
mbArg "contacts" contacts $
[])
where
pnm = either Just (const Nothing) eiPW
woe_id = either (const Nothing) Just eiPW
placesForUser :: Either PlaceID WhereOnEarthID
-> Either PlaceTypeName PlaceTypeId
-> Maybe Threshold
-> DateDetails
-> FM [Place]
placesForUser eiPW eiPP th mbDates = withReadPerm $
flickTranslate toPlacesList $
flickCall "flickr.places.placesForUser"
(mbArg "place_id" place_id $
mbArg "woe_id" woe_id $
mbArg "place_type_id" ptid $
mbArg "place_type" pt $
mbArg "threshold" (fmap show th) $
mbArg "min_taken_date" (dateMinTaken mbDates) $
mbArg "max_taken_date" (dateMaxTaken mbDates) $
mbArg "min_upload_date" (dateMinUpload mbDates) $
mbArg "max_upload_date" (dateMaxUpload mbDates)
[])
where
place_id = either Just (const Nothing) eiPW
woe_id = either (const Nothing) Just eiPW
ptid = either Just (const Nothing) eiPP
pt = either (const Nothing) Just eiPP
placesForTags :: Either PlaceTypeName WhereOnEarthID
-> Maybe PlaceID
-> Maybe Threshold
-> Maybe [Tag]
-> Maybe TagMode
-> Maybe [MachineTag]
-> Maybe TagMode
-> DateDetails
-> FM [Place]
placesForTags eiPW pid th tags tag_mode mt mt_mode mbDates = withReadPerm $
flickTranslate toPlacesList $
flickCall "flickr.places.placesForTags"
(mbArg "woe_id" woe_id $
mbArg "place_type" pnm $
mbArg "place_type_id" pid $
mbArg "threshold" (fmap show th) $
mbArg "tags" (fmap (intercalate ",") tags) $
mbArg "tag_mode" tag_mode $
mbArg "machine_tags" (fmap (intercalate ",") $ fmap (map fromMT) mt) $
mbArg "machine_tag_mode" mt_mode $
mbArg "min_taken_date" (dateMinTaken mbDates) $
mbArg "max_taken_date" (dateMaxTaken mbDates) $
mbArg "min_upload_date" (dateMinUpload mbDates) $
mbArg "max_upload_date" (dateMaxUpload mbDates)
[])
where
pnm = either Just (const Nothing) eiPW
woe_id = either (const Nothing) Just eiPW
fromMT :: MachineTag -> [Char]
fromMT mt =
case mTagValue mt of
"" -> case (mTagNamespace mt, mTagPredicate mt) of
("","") -> ""
(xs,"") -> xs ++ ":"
("",xs) -> "*:" ++ xs
(as,bs) -> as ++ ':':bs
t -> toS (mTagNamespace mt) ++ ':':toS (mTagPredicate mt) ++ '=':t
where
toS "" = "*"
toS x = x
resolvePlaceId :: PlaceID -> FM LocationPlace
resolvePlaceId pid =
flickTranslate toLocationPlace $
flickrCall "flickr.places.resolvePlaceId"
[("place_id", pid)]
resolvePlaceURL :: URLString -> FM LocationPlace
resolvePlaceURL purl =
flickTranslate toLocationPlace $
flickrCall "flickr.places.resolvePlaceURL"
[("url", purl)]
tagsForPlace :: Either PlaceID WhereOnEarthID -> DateDetails -> FM [TagInfo]
tagsForPlace loc mbDates =
flickTranslate toTagInfoList $
flickrCall "flickr.places.tagsForPlace"
(mbArg "woe_id" mbw $
mbArg "place_id" mbp $
mbArg "min_taken_date" (dateMinTaken mbDates) $
mbArg "max_taken_date" (dateMaxTaken mbDates) $
mbArg "min_upload_date" (dateMinUpload mbDates) $
mbArg "max_upload_date" (dateMaxUpload mbDates)
[])
where
mbp = either (const Nothing) Just loc
mbw = either Just (const Nothing) loc