about summary refs log tree commit diff
path: root/fead.patch
blob: 091533682ad7f8cce0755d90cc42f764392045b1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
commit 277deed03833377bae0ae68cf7db3f0d3d578ccd
Author: Ngô Ngọc Đức Huy <huyngo@disroot.org>
Date:   2023-08-30 11:01:00 +0700

    Add option to skip errors

diff --git a/src/fead.py b/src/fead.py
index 370b623..0b35119 100755
--- a/src/fead.py
+++ b/src/fead.py
@@ -185,11 +185,23 @@ async def fetch(raw_url):
                         response.getheaders(), response)
 
 
-async def fetch_all(urls):
+async def fetch_skip_error(url):
+    try:
+        return await fetch(url)
+    except Exception as e:
+        warn(f'fail to fetch {url}: {e}',
+             type('FailureWarning', (Warning,), {}))
+        return None
+
+
+async def fetch_all(urls, skip_error):
     """Fetch all given URLs asynchronously and return them parsed."""
-    tasks = gather(*map(fetch, urls))
+    if skip_error:
+        tasks = gather(*map(fetch_skip_error, urls))
+    else:
+        tasks = gather(*map(fetch, urls))
     try:
-        return await tasks
+        return filter(lambda t: t is not None, await tasks)
     except:
         tasks.cancel()  # structured concurrency
         raise
@@ -234,11 +246,15 @@ def main():
     parser.add_argument('-o', '--output', metavar='PATH',
                         type=FileType('w'), default=stdout,
                         help='output file (default to stdout)')
+    parser.add_argument('-s', '--skip-error', action='store_true',
+                        default=False,
+                        help="errors not causing failure but logged")
     args = parser.parse_args()
 
     template = args.template.read()
     args.template.close()
-    for ad in select(args.count, (ad for feed in run(fetch_all(args.feeds))
+    for ad in select(args.count, (ad for feed in run(fetch_all(args.feeds,
+                                                               args.skip_error))
                                   for ad in select(args.per_feed, feed))):
         args.output.write(template.format(**truncate(ad, args.len)._asdict()))
     args.output.close()