diff --git a/rtv/content.py b/rtv/content.py index 619c74e..ffb7667 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -103,6 +103,12 @@ class BaseContent(object): """ Parse through a submission and return a dict with data ready to be displayed through the terminal. + + Definitions: + permalink - Full URL to the submission comments. + url_full - Link that the submission points to. + url - URL that is displayed on the subreddit page, may be + "selfpost" or "x-post" or a link. """ is_selfpost = lambda s: s.startswith('http://www.reddit.com/r/') @@ -137,33 +143,32 @@ class SubmissionContent(BaseContent): list for repeat access. """ - def __init__(self, submission, loader, indent_size=2, - max_indent_level=8, order='hot'): + def __init__(self, submission, loader, indent_size=2, max_indent_level=8, + order=None): + + submission_data = self.strip_praw_submission(submission) + comments = self.flatten_comments(submission.comments) self.indent_size = indent_size self.max_indent_level = max_indent_level + self.name = submission_data['permalink'] + self.order = order self._loader = loader self._submission = submission - - self._submission_data = self.strip_praw_submission(self._submission) - self.name = self._submission_data['permalink']+' : '+order - comments = self.flatten_comments(self._submission.comments) + self._submission_data = submission_data self._comment_data = [self.strip_praw_comment(c) for c in comments] @classmethod - def from_url(cls, reddit, url, loader, order='hot', indent_size=2, - max_indent_level=8): + def from_url(cls, reddit, url, loader, indent_size=2, max_indent_level=8, + order=None): - # remove order specification at the end - url = url.split(' : ')[0] try: with loader(): submission = reddit.get_submission(url, comment_sort=order) except (praw.errors.APIException, praw.errors.NotFound): raise SubmissionError(url) - return cls(submission, loader, indent_size, max_indent_level, - order=order) + return cls(submission, loader, indent_size, max_indent_level, order) def get(self, index, n_cols=70): """ @@ -248,9 +253,10 @@ class SubredditContent(BaseContent): list for repeat access. """ - def __init__(self, name, submissions, loader, order='hot'): + def __init__(self, name, submissions, loader, order=None): self.name = name + self.order = order self._loader = loader self._submissions = submissions self._submission_data = [] @@ -268,30 +274,30 @@ class SubredditContent(BaseContent): raise SubredditError(name) @classmethod - def from_name(cls, reddit, name, loader, order='hot', query=None): + def from_name(cls, reddit, name, loader, order=None, query=None): - # replace the order - if name.count('/') == 3: - name = '/'.join(name.split('/')[:-1]+[order]) - - name = name.strip(' /') # Strip leading and trailing backslashes + # Strip leading and trailing backslashes + name = name.strip(' /') if name.startswith('r/'): name = name[2:] - # Grab the display order e.g. "python/new" + # 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, order = name.split('/') + name, name_order = name.split('/') + order = order or name_order + display_name = '/r/{}'.format(name) - display_name = '/r/{0:s}/{1:s}'.format(name, order) - - if order not in ['hot', 'top', 'rising', 'new', 'controversial']: + if order not in ['hot', 'top', 'rising', 'new', 'controversial', None]: raise SubredditError(name) if name == 'me': if not reddit.is_logged_in(): raise AccountError - else: + elif order: submissions = reddit.user.get_submitted(sort=order) + else: + submissions = reddit.user.get_submitted() elif query: if name == 'front': @@ -302,6 +308,7 @@ class SubredditContent(BaseContent): else: if name == 'front': dispatch = { + None: reddit.get_front_page, 'hot': reddit.get_front_page, 'top': reddit.get_top, 'rising': reddit.get_rising, @@ -311,6 +318,7 @@ class SubredditContent(BaseContent): else: subreddit = reddit.get_subreddit(name) dispatch = { + None: subreddit.get_hot, 'hot': subreddit.get_hot, 'top': subreddit.get_top, 'rising': subreddit.get_rising, diff --git a/rtv/page.py b/rtv/page.py index cc4d7b4..ef075d6 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -255,7 +255,7 @@ class BasePage(object): self._content_window = None self._subwindows = None - def refresh_content(self): + def refresh_content(self, order=None): raise NotImplementedError @staticmethod @@ -270,6 +270,26 @@ class BasePage(object): def help(self): show_help(self._content_window) + @BaseController.register('1') + def sort_content_hot(self): + self.refresh_content(order='hot') + + @BaseController.register('2') + def sort_content_top(self): + self.refresh_content(order='top') + + @BaseController.register('3') + def sort_content_rising(self): + self.refresh_content(order='rising') + + @BaseController.register('4') + def sort_content_new(self): + self.refresh_content(order='new') + + @BaseController.register('5') + def sort_content_controversial(self): + self.refresh_content(order='controversial') + @BaseController.register(curses.KEY_UP, 'k') def move_cursor_up(self): self._move_cursor(-1) @@ -488,8 +508,10 @@ class BasePage(object): attr = curses.A_REVERSE | curses.A_BOLD | Color.CYAN self._header_window.bkgd(' ', attr) - sub_name = self.content.name.replace('/r/front', 'Front Page ') + sub_name = self.content.name.replace('/r/front', 'Front Page') add_line(self._header_window, sub_name, 0, 0) + if self.content.order is not None: + add_line(self._header_window, ' [{}]'.format(self.content.order)) if self.reddit.user is not None: username = self.reddit.user.name diff --git a/rtv/submission.py b/rtv/submission.py index 5e7cab5..8731f0a 100644 --- a/rtv/submission.py +++ b/rtv/submission.py @@ -62,37 +62,14 @@ class SubmissionPage(BasePage): self.active = False @SubmissionController.register(curses.KEY_F5, 'r') - def refresh_content(self, order='hot'): + def refresh_content(self, order=None): "Re-download comments reset the page index" + order = order or self.content.order self.content = SubmissionContent.from_url( - self.reddit, - self.content.name, - self.loader, - order=order) - + self.reddit, self.content.name, self.loader, order=order) self.nav = Navigator(self.content.get, page_index=-1) - @SubmissionController.register('1') - def sort_content_hot(self): - self.refresh_content(order='hot') - - @SubmissionController.register('2') - def sort_content_top(self): - self.refresh_content(order='top') - - @SubmissionController.register('3') - def sort_content_rising(self): - self.refresh_content(order='rising') - - @SubmissionController.register('4') - def sort_content_new(self): - self.refresh_content(order='new') - - @SubmissionController.register('5') - def sort_content_controversial(self): - self.refresh_content(order='controversial') - @SubmissionController.register(curses.KEY_ENTER, 10, 'o') def open_link(self): "Open the current submission page with the webbrowser" diff --git a/rtv/subreddit.py b/rtv/subreddit.py index 201715a..d043b65 100644 --- a/rtv/subreddit.py +++ b/rtv/subreddit.py @@ -49,10 +49,17 @@ class SubredditPage(BasePage): self.controller.trigger(cmd) @SubredditController.register(curses.KEY_F5, 'r') - def refresh_content(self, name=None, order='hot'): + def refresh_content(self, name=None, order=None): "Re-download all submissions and reset the page index" name = name or self.content.name + order = order or self.content.order + + # Hack to allow an order specified in the name by prompt_subreddit() to + # override the current default + if order == 'ignore': + order = None + try: self.content = SubredditContent.from_name( self.reddit, name, self.loader, order=order) @@ -65,26 +72,6 @@ class SubredditPage(BasePage): else: self.nav = Navigator(self.content.get) - @SubredditController.register('1') - def refresh_content_hot(self): - self.refresh_content(order='hot') - - @SubredditController.register('2') - def refresh_content_top(self): - self.refresh_content(order='top') - - @SubredditController.register('3') - def refresh_content_rising(self): - self.refresh_content(order='rising') - - @SubredditController.register('4') - def refresh_content_new(self): - self.refresh_content(order='new') - - @SubredditController.register('5') - def refresh_content_controversial(self): - self.refresh_content(order='controversial') - @SubredditController.register('f') def search_subreddit(self, name=None): "Open a prompt to search the given subreddit" @@ -98,7 +85,7 @@ class SubredditPage(BasePage): try: self.content = SubredditContent.from_name( self.reddit, name, self.loader, query=query) - except IndexError: # if there are no submissions + except (IndexError, SubredditError): # if there are no submissions show_notification(self.stdscr, ['No results found']) else: self.nav = Navigator(self.content.get) @@ -109,7 +96,7 @@ class SubredditPage(BasePage): prompt = 'Enter Subreddit: /r/' name = prompt_input(self.stdscr, prompt) if name is not None: - self.refresh_content(name=name) + self.refresh_content(name=name, order='ignore') @SubredditController.register(curses.KEY_RIGHT, 'l') def open_submission(self):