From 9c964b7069dd08e8aea012b1465130e9492f7fb1 Mon Sep 17 00:00:00 2001 From: woorst Date: Wed, 29 Jun 2016 00:15:03 -0500 Subject: [PATCH] Can browse through list of subscribed multireddits --- rtv/content.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ rtv/rtv.cfg | 1 + rtv/subreddit.py | 22 +++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/rtv/content.py b/rtv/content.py index 5c84bc4..978efd2 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -189,6 +189,20 @@ class Content(object): data['title'] = subscription.title return data + @staticmethod + def strip_praw_multireddit(multireddit): + """ + Parse through a multireddits and return a dict with data ready to be + displayed through the terminal. + """ + + data = {} + data['object'] = multireddit + data['type'] = 'Multireddit' + data['name'] = multireddit.path + data['title'] = multireddit.description_md + return data + @staticmethod def humanize_timestamp(utc_timestamp, verbose=False): """ @@ -560,3 +574,52 @@ class SubscriptionContent(Content): data['offset'] = 0 return data + + +class MultiredditContent(Content): + + def __init__(self, multireddits, loader): + + self.name = "Multireddits" + self.order = None + self._loader = loader + self._multireddits = multireddits + self._multireddit_data = [] + + try: + self.get(0) + except IndexError: + raise exceptions.SubscriptionError('No multireddits') + + @classmethod + def from_user(cls, reddit, multireddits, loader): + multireddits = (m for m in multireddits) + return cls(multireddits, loader) + + def get(self, index, n_cols=70): + """ + Grab the `i`th subscription, with the title field formatted to fit + inside of a window of width `n_cols` + """ + + if index < 0: + raise IndexError + + while index >= len(self._multireddit_data): + try: + with self._loader('Loading multireddits'): + multireddit = next(self._multireddits) + if self._loader.exception: + raise IndexError + except StopIteration: + raise IndexError + else: + data = self.strip_praw_multireddit(multireddit) + self._multireddit_data.append(data) + + data = self._multireddit_data[index] + data['split_title'] = self.wrap_text(data['title'], width=n_cols) + data['n_rows'] = len(data['split_title']) + 1 + data['offset'] = 0 + + return data diff --git a/rtv/rtv.cfg b/rtv/rtv.cfg index b7ad320..f5fcb0e 100644 --- a/rtv/rtv.cfg +++ b/rtv/rtv.cfg @@ -120,6 +120,7 @@ SUBREDDIT_POST = c SUBREDDIT_OPEN = l, SUBREDDIT_OPEN_IN_BROWSER = o, , , SUBREDDIT_OPEN_SUBSCRIPTIONS = s +MULTIREDDIT_OPEN_SUBSCRIPTIONS = S ; Subscription page SUBSCRIPTION_SELECT = l, , , diff --git a/rtv/subreddit.py b/rtv/subreddit.py index 85b8a3a..eea3cb0 100644 --- a/rtv/subreddit.py +++ b/rtv/subreddit.py @@ -9,6 +9,7 @@ from .content import SubredditContent from .page import Page, PageController, logged_in from .objects import Navigator, Color, Command from .submission import SubmissionPage +from .multireddits import MultiredditPage from .subscription import SubscriptionPage from .exceptions import TemporaryFileError @@ -168,6 +169,27 @@ class SubredditPage(Page): self.refresh_content(order='ignore', name=page.subreddit_data['name']) + @SubredditController.register(Command('MULTIREDDIT_OPEN_SUBSCRIPTIONS')) + @logged_in + def open_multireddit_subscriptions(self): + "Open user multireddit subscriptions page" + + with self.term.loader('Loading multireddits'): + page = MultiredditPage( + self.reddit, self.reddit.get_my_multireddits(), + self.term, self.config) + if self.term.loader.exception: + return + + page.loop() + + # When the user has chosen a subreddit in the subscriptions list, + # refresh content with the selected subreddit + if page.multireddit_data is not None: + self.refresh_content(order='ignore', + name=page.multireddit_data['name']) + + def _draw_item(self, win, data, inverted): n_rows, n_cols = win.getmaxyx()