@@ -2,6 +2,7 @@ module Main where
2
2
3
3
import Config as Conf
4
4
import Types as T
5
+ import Util
5
6
import Transforms
6
7
7
8
import Text.Feed.Import
@@ -13,9 +14,7 @@ import Text.Feed.Types as FT
13
14
import Text.Feed.Export (xmlFeed )
14
15
import Text.XML.Light.Output (showTopElement )
15
16
16
- import Network.URI
17
- import Network.HTTP (simpleHTTP ,getRequest ,getResponseBody )
18
- import Data.Maybe (fromMaybe ,maybe )
17
+ import Data.Maybe (fromMaybe ,maybe ,catMaybes )
19
18
import Data.Hashable (hash )
20
19
import System.Directory
21
20
import System.Environment
@@ -35,7 +34,7 @@ main = do
35
34
print $ " Using " ++ cfgLoc ++ " as config file."
36
35
config <- Conf. configure cfgLoc
37
36
feeds <- mapM fetchFeed (feeds config)
38
- feeds <- mapM (loadCache config . hashFeed) feeds
37
+ feeds <- mapM (loadCache config . hashFeed) (catMaybes feeds)
39
38
feeds <- mapM transform feeds
40
39
mapM_ (writeCache config) feeds
41
40
mapM_ (deleteCache config) feeds
@@ -45,22 +44,24 @@ main = do
45
44
46
45
return ()
47
46
48
- fetchFeed :: T. Feed -> IO T. Feed
47
+ fetchFeed :: T. Feed -> IO ( Maybe T. Feed)
49
48
fetchFeed feedcfg = do
50
- let url = feedurl feedcfg
51
- rsp <- simpleHTTP (getRequest url) -- >>= fmap (take 100) . getResponseBody
52
- feedText <- getResponseBody rsp
53
- -- print feedText
54
- let feed = fromMaybe (error " Can't get feed" ) (parseFeedString feedText)
49
+ rsp <- grabUrl $ feedurl feedcfg
50
+ case rsp of
51
+ Nothing -> do
52
+ print $ " Error fetching " ++ feedurl feedcfg
53
+ return Nothing
54
+ Just feedText -> do
55
+ let feed = fromMaybe (error " Can't get feed" ) (parseFeedString feedText)
55
56
56
- let items = Query. feedItems feed
57
- let title = getFeedTitle feed
57
+ let items = Query. feedItems feed
58
+ let title = getFeedTitle feed
58
59
59
- let author = fromMaybe " unknown" (getFeedAuthor feed)
60
+ let author = fromMaybe " unknown" (getFeedAuthor feed)
60
61
61
- print $ " Fetched " ++ show (length items) ++ " items from " ++ name feedcfg
62
+ print $ " Fetched " ++ show (length items) ++ " items from " ++ name feedcfg
62
63
63
- let articles = map (\ item ->
64
+ let articles = map (\ item ->
64
65
Article {title= fromMaybe " Unknown title" (getItemTitle item)
65
66
, body= maybe " nowt" fst3 (getItemEnclosure item)
66
67
, itemurl= fromMaybe " Unknown url" (getItemLink item)
@@ -69,11 +70,7 @@ fetchFeed feedcfg = do
69
70
, itemRec= item
70
71
, bodyhash= Nothing } ) items
71
72
72
- return ( feedcfg{ items= articles, feedRec= feed } )
73
-
74
- -- haskell doesn't have basic triple-or-above manip funcs, wtf?
75
- fst3 :: (a ,b ,c )-> a
76
- fst3 (a,b,c) = a
73
+ return ( Just $ feedcfg{ items= articles, feedRec= feed } )
77
74
78
75
-- any on disk should be loaded
79
76
-- this loads body into matching article, and marks that article as transformed
@@ -134,19 +131,22 @@ hashFeed feed = feed{items=map (\(a,h) -> a{bodyhash=Just h})
134
131
135
132
-- apply the transforms in order
136
133
-- also marks transformed
134
+ -- todo one day implement some sort of "error article" in case of error, so that feed consumer can see issue in feed
137
135
transform :: T. Feed -> IO T. Feed
138
136
transform feed = do
139
137
articles<- mapM (\ article ->
140
138
if transformed article
141
- then return article{transformed= True }
139
+ then return $ Just $ article{transformed= True }
142
140
else applyTransforms article
143
141
) (items feed)
144
142
145
- return $ updateFeedItems feed articles
143
+ return $ updateFeedItems feed (catMaybes articles)
146
144
147
- where applyTransforms :: Article -> IO Article
148
- applyTransforms article = foldM (\ acc f -> (f acc)) article
149
- (transforms feed)
145
+ where applyTransforms :: Article -> IO (Maybe Article )
146
+ applyTransforms article = foldM (\ acc f -> case acc of
147
+ Nothing -> return Nothing
148
+ Just art -> f art) (Just article)
149
+ (transforms feed)
150
150
-- write the resulting feed
151
151
serialiseFeed :: T. Config -> T. Feed -> IO ()
152
152
serialiseFeed cfg feed = do
0 commit comments