module Network.Delicious.RSS
( getHotlist
, getRecentBookmarks
, getTagBookmarks
, getTagsBookmarks
, getPopularBookmarks
, getTagPopularBookmarks
, getSiteAlerts
, getUserBookmarks
, getUserTagBookmarks
, getUserTaggedBookmarks
, getUserInfo
, getUserPublicTags
, getUserSubscriptions
, getUserInboxBookmarks
, getNetworkMemberBookmarks
, getNetworkMemberTaggedBookmarks
, getNetworkMembers
, getNetworkFans
, getURLBookmarks
) where
import Network.Delicious.Types
import Network.Delicious.Fetch
import Text.Feed.Query
import Text.Feed.Types
import Text.Feed.Import
import Data.Maybe
import Data.List ( intercalate )
import Data.ByteString ( pack )
import Data.Digest.OpenSSL.MD5
deli_base :: URLString
deli_base = "http://feeds.delicious.com/v2"
hotlist_url :: String
hotlist_url = deli_base ++ "/rss/"
recent_url :: String
recent_url = deli_base ++ "/rss/recent"
popular_url :: String
popular_url = deli_base ++ "/rss/popular"
user_url :: String
user_url = deli_base ++ "/rss/"
alert_url :: String
alert_url = deli_base ++ "/rss/alerts"
tag_url :: String
tag_url = deli_base ++ "/rss/tag/"
tags_url :: String
tags_url = deli_base ++ "/rss/tags/"
inbox_url :: String
inbox_url = deli_base ++ "/rss/inbox/"
network_url :: String
network_url = deli_base ++ "/rss/network/"
network_mem_url :: String
network_mem_url = deli_base ++ "/rss/networkmembers/"
network_fans_url :: String
network_fans_url = deli_base ++ "/rss/networkfans/"
b_url_url :: String
b_url_url = deli_base ++ "/rss/url/"
buildUrl :: (String -> URLString -> IO a) -> URLString -> DM a
buildUrl f u = do
mbc <- getCount
ua <- getUAgent
liftIO (f ua (case mbc of { Nothing -> u ; Just c -> u++"?count="++show c}))
performCall :: String -> URLString -> DM [Post]
performCall loc u = do
ls <- buildUrl readContentsURL u
case parseFeedString ls of
Nothing -> fail (loc ++ " invalid RSS feed")
Just f -> return (map toPost (feedItems f))
getHotlist :: DM [Post]
getHotlist = performCall "getHotlist" hotlist_url
getRecentBookmarks :: DM [Post]
getRecentBookmarks = performCall "getRecentBookmarks" recent_url
getTagBookmarks :: Tag -> DM [Post]
getTagBookmarks tg = performCall "getTagBookmarks" eff_url
where
eff_url = tag_url ++ tg
getTagsBookmarks :: [Tag] -> DM [Post]
getTagsBookmarks tgs = performCall "getTagsBookmarks" eff_url
where
eff_url = tag_url ++ intercalate "+" tgs
getPopularBookmarks :: DM [Post]
getPopularBookmarks = performCall "getPopularBookmarks" popular_url
getTagPopularBookmarks :: Tag -> DM [Post]
getTagPopularBookmarks tg = performCall "getTagPopularBookmarks" eff_url
where
eff_url = popular_url ++ '/':tg
getSiteAlerts :: DM [Post]
getSiteAlerts = performCall "getSiteAlerts" alert_url
getUserBookmarks :: String -> DM [Post]
getUserBookmarks u = performCall "getUserBookmarks" eff_url
where
eff_url = user_url ++ u
getUserTagBookmarks :: String -> Tag -> DM [Post]
getUserTagBookmarks u tg = performCall "getUserTagBookmarks" eff_url
where
eff_url = user_url ++ u ++ '/':tg
getUserTaggedBookmarks :: String -> [Tag] -> DM [Post]
getUserTaggedBookmarks u tgs = performCall "getUserTaggedBookmarks" eff_url
where
eff_url = user_url ++ u ++ '/':intercalate "+" tgs
getUserInfo :: String -> DM [Post]
getUserInfo u = performCall "getUserInfo" eff_url
where
eff_url = user_url ++ "userinfo/" ++ u
getUserPublicTags :: String -> DM [Post]
getUserPublicTags u = performCall "getUserPublicTags" eff_url
where
eff_url = tags_url ++ u
getUserSubscriptions :: String -> DM [Post]
getUserSubscriptions u = performCall "getUserSubscriptions" eff_url
where
eff_url = user_url ++ "subscriptions/" ++ u
getUserInboxBookmarks :: String -> String -> DM [Post]
getUserInboxBookmarks u key = performCall "getUserInboxBookmarks" eff_url
where
eff_url = inbox_url ++ u ++ "?private="++key
getNetworkMemberBookmarks :: String -> DM [Post]
getNetworkMemberBookmarks u = performCall "getNetworkMemberBookmarks" eff_url
where
eff_url = network_url ++ u
getNetworkMemberTaggedBookmarks :: String -> [Tag] -> DM [Post]
getNetworkMemberTaggedBookmarks u tgs =
performCall "getNetworkMemberTaggedBookmarks" eff_url
where
eff_url = network_url ++ u ++ '/':intercalate "+" tgs
getNetworkMembers :: String -> DM [Post]
getNetworkMembers u = performCall "getNetworkMembers" eff_url
where
eff_url = network_mem_url ++ u
getNetworkFans :: String -> DM [Post]
getNetworkFans u = performCall "getNetworkFans" eff_url
where
eff_url = network_fans_url ++ u
getURLBookmarks :: URLString -> DM [Post]
getURLBookmarks url = performCall "getURLBookmarks" eff_url
where
eff_url = b_url_url ++ hashUrl url
toPost :: Item -> Post
toPost i =
nullPost
{ postHref = fromMaybe "" (getItemLink i)
, postDesc = fromMaybe "" (getItemTitle i)
, postUser = fromMaybe "" (getItemAuthor i)
, postTags = getItemCategories i
, postStamp = fromMaybe "" (getItemPublishDateString i)
}
hashUrl :: URLString -> String
hashUrl s = md5sum (pack (map (fromIntegral.fromEnum) s))