diff --git a/rtv/content.py b/rtv/content.py index aafcc18..1e5eb65 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -6,7 +6,7 @@ from datetime import datetime import six import praw -from praw.errors import InvalidSubreddit +from praw.errors import InvalidSubreddit, NotFound from kitchen.text.display import wrap from . import exceptions @@ -355,10 +355,13 @@ class SubredditContent(Content): list for repeat access. """ - def __init__(self, name, submissions, loader, order=None): + def __init__(self, name, submissions, loader, order=None, listing='r', + period=None): + self.listing = listing self.name = name self.order = order + self.period = period self._loader = loader self._submissions = submissions self._submission_data = [] @@ -373,52 +376,80 @@ class SubredditContent(Content): raise exceptions.SubredditError('No submissions') @classmethod - def from_name(cls, reddit, name, loader, order=None, query=None): + def from_name(cls, reddit, name, loader, order=None, query=None, + listing='r', period=None): # Strip leading and trailing backslashes - name = name.strip(' /') - if name.startswith('r/'): - name = name[2:] - - # If the order is not given explicitly, it will be searched for and - # stripped out of the subreddit name e.g. python/new. - if '/' in name: - name, name_order = name.split('/') + name = name.strip(' /').split('/') + if name[0] in ['r', 'u', 'user', 'domain']: + listing, *name = name + if len(name) > 1: + name, name_order = name order = order or name_order - display_name = '/r/{0}'.format(name) + else: + name = name[0] + listing = 'u' if name == 'me' else listing + display_name = '/{0}/{1}'.format(listing, name) - if order not in ['hot', 'top', 'rising', 'new', 'controversial', None]: + time = {t: '_from_' + t for t in ['all', 'day', 'hour', + 'month', 'week', 'year']} + time[None] = '' + + if period not in time.keys(): + raise exceptions.SubredditError('Unrecognized period "%s"' + % period) + + elif order not in ['hot', 'top', 'rising', 'new', + 'controversial', None]: raise exceptions.SubredditError('Unrecognized order "%s"' % order) - if name == 'me': - if not reddit.is_oauth_session(): - raise exceptions.AccountError('Not logged in') - elif order: - submissions = reddit.user.get_submitted(sort=order) - else: - submissions = reddit.user.get_submitted() + if query: + loc = None + if listing == 'r' and name != 'front': + loc = name - elif query: - if name == 'front': - submissions = reddit.search(query, subreddit=None, sort=order) - else: - submissions = reddit.search(query, subreddit=name, sort=order) + elif listing == 'domain': + query = 'site:{0} {1}'.format(name, query) - else: + elif listing in ['u', 'user']: + query = 'author:{0} {1}'.format(name, query) + + submissions = reddit.search(query, subreddit=loc, sort=order, + period=period) + + elif listing == 'domain': + submissions = reddit.get_domain_listing(name, + sort=(order or 'hot'), period=period) + + elif listing in ['u', 'user']: + if name == 'me': + if not reddit.is_oauth_session(): + raise exceptions.AccountError('Not logged in') + else: + submissions = reddit.user.get_submitted( \ + sort=(order or 'new')) + else: + redditor = reddit.get_redditor(name) + submissions = redditor.get_submitted(sort=(order or 'new'), + time=(period or 'all')) + + elif listing == 'r': if name == '': # Praw does not correctly handle empty strings # https://github.com/praw-dev/praw/issues/615 raise InvalidSubreddit() - if name == 'front': + elif name == 'front': dispatch = { None: reddit.get_front_page, 'hot': reddit.get_front_page, - 'top': reddit.get_top, + 'top': eval('reddit.get_top' + time[period]), 'rising': reddit.get_rising, 'new': reddit.get_new, - 'controversial': reddit.get_controversial, + 'controversial': eval('reddit.get_controversial' \ + + time[period]), } + else: subreddit = reddit.get_subreddit(name) # For special subreddits like /r/random we want to replace the @@ -427,14 +458,16 @@ class SubredditContent(Content): dispatch = { None: subreddit.get_hot, 'hot': subreddit.get_hot, - 'top': subreddit.get_top, + 'top': eval('subreddit.get_top' + time[period]), 'rising': subreddit.get_rising, 'new': subreddit.get_new, - 'controversial': subreddit.get_controversial, + 'controversial': eval('subreddit.get_controversial' \ + + time[period]), } submissions = dispatch[order](limit=None) - return cls(display_name, submissions, loader, order=order) + return cls(display_name, submissions, loader, order=order, + listing=listing, period=period) def get(self, index, n_cols=70): """