Add --random flag for 'rss' command

This commit is contained in:
ssdaniel24 2024-12-07 11:38:53 +00:00 committed by GitHub
parent 941d3121eb
commit 993cb2355c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 5 deletions

View File

@ -36,6 +36,7 @@ import json
import time import time
import types import types
import string import string
import random
import socket import socket
import threading import threading
import feedparser import feedparser
@ -170,6 +171,9 @@ def sort_feed_items(items, order):
"""Return feed items, sorted according to sortFeedItems.""" """Return feed items, sorted according to sortFeedItems."""
if order == 'asInFeed': if order == 'asInFeed':
return items return items
elif order == 'random':
random.shuffle(items)
return items
(key, reverse) = _sort_arguments(order) (key, reverse) = _sort_arguments(order)
try: try:
sitems = sorted(items, key=key, reverse=reverse) sitems = sorted(items, key=key, reverse=reverse)
@ -695,11 +699,12 @@ class RSS(callbacks.Plugin):
channels = wrap(channels, ['feedName']) channels = wrap(channels, ['feedName'])
@internationalizeDocstring @internationalizeDocstring
def rss(self, irc, msg, args, url, n): def rss(self, irc, msg, args, optlist, url, n):
"""<name|url> [<number of headlines>] """[--random] <name|url> [<number of headlines>]
Gets the title components of the given RSS feed. Gets the title components of the given RSS feed.
If <number of headlines> is given, return only that many headlines. If <number of headlines> is given, return only that many headlines.
Use --random flag for random sorting of entries.
""" """
self.log.debug('Fetching %u', url) self.log.debug('Fetching %u', url)
try: try:
@ -719,17 +724,22 @@ class RSS(callbacks.Plugin):
s += str(feed.last_exception) s += str(feed.last_exception)
irc.error(s) irc.error(s)
return return
n = n or self.registryValue('defaultNumberOfHeadlines', channel, irc.network)
entries = list(filter(lambda e:self.should_send_entry(irc.network, channel, e), entries = list(filter(lambda e:self.should_send_entry(irc.network, channel, e),
feed.entries)) feed.entries))
entries = sort_feed_items(entries, 'newestFirst') order = 'newestFirst'
if 'random' in (k for k,v in optlist):
order = 'random'
entries = sort_feed_items(entries, order)
n = n or self.registryValue('defaultNumberOfHeadlines', channel, irc.network)
entries = entries[:n] entries = entries[:n]
entries = sort_feed_items(entries, self.registryValue('sortFeedItems')) entries = sort_feed_items(entries, self.registryValue('sortFeedItems'))
headlines = map(lambda e:self.format_entry(irc.network, channel, feed, e, False), headlines = map(lambda e:self.format_entry(irc.network, channel, feed, e, False),
entries) entries)
sep = self.registryValue('headlineSeparator', channel, irc.network) sep = self.registryValue('headlineSeparator', channel, irc.network)
irc.replies(headlines, joiner=sep) irc.replies(headlines, joiner=sep)
rss = wrap(rss, [first('url', 'feedName'), additional('int')]) rss = wrap(rss, [getopts({ 'random': '', }),
first('url', 'feedName'),
additional('int')])
@internationalizeDocstring @internationalizeDocstring
def info(self, irc, msg, args, url): def info(self, irc, msg, args, url):

View File

@ -571,6 +571,12 @@ class RSSTestCase(ChannelPluginTestCase):
m = self.assertNotError('rss %s 2' % url) m = self.assertNotError('rss %s 2' % url)
self.assertEqual(m.args[1].count(' | '), 1) self.assertEqual(m.args[1].count(' | '), 1)
def testRssRandom(self):
timeFastForward(1.1)
self.assertNotError('rss --random %s' % url)
m = self.assertNotError('rss --random %s 2' % url)
self.assertEqual(m.args[1].count(' | '), 1)
def testRssAdd(self): def testRssAdd(self):
timeFastForward(1.1) timeFastForward(1.1)
self.assertNotError('rss add advogato %s' % url) self.assertNotError('rss add advogato %s' % url)