about summary refs log tree commit diff
path: root/fead.patch
diff options
context:
space:
mode:
Diffstat (limited to 'fead.patch')
-rw-r--r--fead.patch54
1 files changed, 54 insertions, 0 deletions
diff --git a/fead.patch b/fead.patch
new file mode 100644
index 0000000..0915336
--- /dev/null
+++ b/fead.patch
@@ -0,0 +1,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()