Skip to content

Commit 0bff781

Browse files
authored
Merge pull request #21 from Linusp/filter
optimize command `filter`
2 parents bc2235c + f74bded commit 0bff781

File tree

2 files changed

+32
-41
lines changed

2 files changed

+32
-41
lines changed

inoreader/main.py

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -270,15 +270,15 @@ def apply_action(articles, client, action, tags):
270270
elif action == 'broadcast':
271271
client.broadcast(articles)
272272
for article in articles:
273-
LOGGER.info("Boradcast article: {}", article.title)
273+
LOGGER.info("Boradcast article: %s", article.title)
274274
elif action == 'star':
275275
client.mark_as_starred(articles)
276276
for article in articles:
277-
LOGGER.info("Starred article: {}", article.title)
277+
LOGGER.info("Starred article: %s", article.title)
278278
elif action == 'unstar':
279279
client.remove_starred(articles)
280280
for article in articles:
281-
LOGGER.info("Unstarred article: {}", article.title)
281+
LOGGER.info("Unstarred article: %s", article.title)
282282

283283

284284
@main.command("filter")
@@ -287,65 +287,54 @@ def apply_action(articles, client, action, tags):
287287
def filter_articles(rules_file):
288288
"""Select articles and do something"""
289289
client = get_client()
290-
filters = []
291-
for rule in yaml.load(open(rules_file)):
292-
name = rule.get('name')
293-
folders = rule['folders']
294-
295-
fields = []
296-
# only 'title' or 'content' is supported now
297-
for field in rule.get('fields', ['title', 'content']):
298-
if field not in ('title', 'content'):
299-
continue
300-
fields.append(field)
290+
matched_articles = defaultdict(list)
291+
for rule in yaml.load(open(rules_file), Loader=yaml.Loader):
292+
fields = [
293+
field
294+
for field in rule.get('fields', ['title', 'content'])
295+
if field in ('title', 'content')
296+
]
301297
cur_filter = get_filter(rule['filter'])
302-
303298
actions = []
304299
# only 'mark_as_read', 'like', 'star', 'broadcast', 'tag' is supported now
305300
for action in rule.get('actions', [{'type': 'mark_as_read'}]):
306-
if action['type'] not in ('mark_as_read', 'like', 'star', 'broadcast', 'tag'):
301+
if action['type'] not in (
302+
'mark_as_read',
303+
'like',
304+
'star',
305+
'broadcast',
306+
'tag',
307+
'unstar',
308+
):
307309
continue
308310
actions.append(action)
309311

310-
filters.append(
311-
{
312-
'name': name,
313-
'folders': folders,
314-
'fields': fields,
315-
'filter': cur_filter,
316-
'actions': actions,
317-
}
318-
)
319-
320-
articles_by_foler = {} # folder -> articles
321-
matched_articles = defaultdict(list) # action -> articles
322-
for rule in filters:
323312
articles = []
324-
for folder in rule['folders']:
325-
if folder not in articles_by_foler:
326-
articles_by_foler[folder] = list(client.fetch_unread(folder=folder))
327-
328-
articles.extend(articles_by_foler[folder])
313+
if 'folders' in rule:
314+
for folder in rule['folders']:
315+
articles.extend(client.fetch_unread(folder=folder))
316+
else:
317+
for articles_info in rule.get('articles', []):
318+
articles.extend(client.fetch_articles(**articles_info))
329319

330320
# FIXME: deduplicate
331321
count = 0
332322
for article in articles:
333323
matched = False
334-
if 'title' in rule['fields'] and rule['filter'].validate(article.title):
324+
if 'title' in fields and cur_filter.validate(article.title):
335325
matched = True
336-
if 'content' in rule['fields'] and rule['filter'].validate(article.text):
326+
if 'content' in fields and cur_filter.validate(article.text):
337327
matched = True
338328

339329
if matched:
340-
for action in rule['actions']:
330+
for action in actions:
341331
matched_articles[action['type']].append((article, action))
342332

343333
count += 1
344334

345335
LOGGER.info(
346-
"matched %d articles in folder(s) %s with filter named '%s'",
336+
"matched %d articles with filter named '%s'",
347337
count,
348-
rule['folders'],
349338
rule['name'],
350339
)
351340

@@ -532,8 +521,10 @@ def fetch_starred(folder, tags, outfile, outdir, limit, save_image, out_format):
532521
continue
533522

534523
filename = re.sub(r'\s+', '_', title)
535-
filename = re.sub(r'[\[\]\(\)()]', '_', filename)
524+
filename = re.sub(r'[\[\]\(\)()::,,/|]', '_', filename)
536525
filename = re.sub(r'[“”\'"]', '', filename)
526+
filename = re.sub(r'-+', '-', filename)
527+
filename = filename[:50]
537528
if out_format == 'json':
538529
filename += '.json'
539530
elif out_format == 'markdown':

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from setuptools import setup, find_packages
55

66

7-
VERSION = '0.4.6'
7+
VERSION = '0.4.7'
88
REQS = [
99
'lxml',
1010
'requests',

0 commit comments

Comments
 (0)