diff options
author | lassulus <lass@lassul.us> | 2017-04-27 23:13:58 +0200 |
---|---|---|
committer | lassulus <lass@lassul.us> | 2017-04-30 19:55:39 +0200 |
commit | ca30ec09790c60c5bc904488fb5e17c36dad10aa (patch) | |
tree | 487c9d1e84cb27812ed2c91c16b3a67c5114d922 /news.hs |
"Boom!"
Diffstat (limited to 'news.hs')
-rw-r--r-- | news.hs | 78 |
1 files changed, 78 insertions, 0 deletions
@@ -0,0 +1,78 @@ +{-# LANGUAGE OverloadedStrings #-} +import Data.Monoid +import Prelude hiding (elem) +import Network.Wreq +import Control.Lens +import Text.Feed.Import +import qualified Text.Atom.Feed as Atom +import qualified Data.ByteString.Lazy.Char8 as LBS8 +import qualified Data.ByteString.Char8 as BS8 +import qualified Data.ByteString as BS +import Text.RSS.Syntax +import qualified Text.Feed.Types as Feed +import qualified Data.BloomFilter as Bloom +import qualified Data.BloomFilter.Easy as Bloom +import Control.Concurrent +import System.Environment +import System.IO +import Control.Exception + + +data Item = Item + { ni_title :: BS.ByteString + , ni_link :: BS.ByteString + } + deriving Show + + +atomEntryToItems :: Atom.Entry -> [Item] +atomEntryToItems entry = + map (Item title) links + where + title = BS8.pack $ Atom.txtToString (Atom.entryTitle entry) + links = map (BS8.pack . Atom.linkHref) (Atom.entryLinks entry) + +rssItemToItems :: RSSItem -> [Item] +rssItemToItems item = + map (Item title) links + where + title = maybe "untitled" BS8.pack (rssItemTitle item) + links = maybe [] ((:[]) . BS8.pack) (rssItemLink item) + + +main :: IO () +main = do + hSetBuffering stdout LineBuffering + [url, delayString] <- getArgs + let delay = read delayString :: Int + rec url delay (Bloom.easyList 0.000001 ([] :: [BS.ByteString])) + return () + where + rec url delay bloom = + ( do + r <- get url + let f = parseFeedString $ LBS8.unpack $ r ^. responseBody + items = + case f of + Just (Feed.RSSFeed rss) -> + concatMap rssItemToItems (rssItems (rssChannel rss)) + Just (Feed.AtomFeed atom) -> + concatMap atomEntryToItems (Atom.feedEntries atom) + _ -> [] + + bloom' = Bloom.insertList (map ni_link items) bloom + newLinkItems = filter (\item -> + let link = ni_link item in + link `Bloom.notElem` bloom + ) items + mapM_ print (map (\item -> + let title = ni_title item + link = ni_link item + in title <> " " <> link + ) newLinkItems) + threadDelay (delay * 10^6) + rec url delay bloom' + ) + `catch` \e -> putStrLn ("Caught " ++ show (e :: SomeException)) >> rec url delay bloom + + |