Added support for multireddits.
This commit is contained in:
110
rtv/content.py
110
rtv/content.py
@@ -4,6 +4,7 @@ from contextlib import contextmanager
|
|||||||
|
|
||||||
import praw
|
import praw
|
||||||
import six
|
import six
|
||||||
|
import requests
|
||||||
|
|
||||||
from .errors import SubmissionURLError, SubredditNameError
|
from .errors import SubmissionURLError, SubredditNameError
|
||||||
|
|
||||||
@@ -68,22 +69,6 @@ def humanize_timestamp(utc_timestamp, verbose=False):
|
|||||||
years = months // 12
|
years = months // 12
|
||||||
return ('%d years ago' % years) if verbose else ('%dyr' % years)
|
return ('%d years ago' % years) if verbose else ('%dyr' % years)
|
||||||
|
|
||||||
def validate_backslashes(name):
|
|
||||||
"""
|
|
||||||
Makes sure backslashes in subreddit name work with for_name()
|
|
||||||
"""
|
|
||||||
|
|
||||||
if name[0] == '/':
|
|
||||||
raise SubredditNameError(name)
|
|
||||||
|
|
||||||
if name[-1] == '/':
|
|
||||||
name = name[:-1]
|
|
||||||
|
|
||||||
if name.count('/') > 1:
|
|
||||||
raise SubredditNameError(name)
|
|
||||||
|
|
||||||
return name
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def default_loader(self):
|
def default_loader(self):
|
||||||
yield
|
yield
|
||||||
@@ -318,7 +303,7 @@ class SubredditContent(BaseContent):
|
|||||||
list for repeat access.
|
list for repeat access.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name, submissions, loader=default_loader):
|
def __init__(self, name, submissions, loader):
|
||||||
|
|
||||||
self.name = name
|
self.name = name
|
||||||
self._loader = loader
|
self._loader = loader
|
||||||
@@ -326,62 +311,63 @@ class SubredditContent(BaseContent):
|
|||||||
self._submission_data = []
|
self._submission_data = []
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_name(cls, reddit, name, loader=default_loader, display_type = 'hot'):
|
def from_name(cls, reddit, name, loader, order='hot'):
|
||||||
|
|
||||||
if name == 'new':
|
name = name.strip(' /') # Strip leading and trailing backslashes
|
||||||
return cls('New', reddit.get_new(limit=None), loader)
|
if name.startswith('r/'):
|
||||||
|
name = name[2:]
|
||||||
if name == 'all':
|
|
||||||
sub = reddit.get_subreddit(name)
|
|
||||||
|
|
||||||
else:
|
|
||||||
|
|
||||||
name = validate_backslashes(name)
|
|
||||||
|
|
||||||
|
# Grab the display type e.g. "python/new"
|
||||||
if '/' in name:
|
if '/' in name:
|
||||||
name, display_type = name.split('/')
|
name, order = name.split('/')
|
||||||
|
|
||||||
if display_type not in ['new', 'top', 'hot', 'rising', 'controversial']:
|
if order == 'hot':
|
||||||
raise SubredditNameError(name)
|
display_name = '/r/{}'.format(name)
|
||||||
|
else:
|
||||||
|
display_name = '/r/{}/{}'.format(name, order)
|
||||||
|
|
||||||
if name == 'front':
|
if name == 'front':
|
||||||
|
if order == 'hot':
|
||||||
|
submissions = reddit.get_front_page(limit=None)
|
||||||
|
elif order == 'top':
|
||||||
|
submissions = reddit.get_top(limit=None)
|
||||||
|
elif order == 'rising':
|
||||||
|
submissions = reddit.get_rising(limit=None)
|
||||||
|
elif order == 'new':
|
||||||
|
submissions = reddit.get_new(limit=None)
|
||||||
|
elif order == 'controversial':
|
||||||
|
submissions = reddit.get_controversial(limit=None)
|
||||||
|
else:
|
||||||
|
raise SubredditNameError(display_name)
|
||||||
|
|
||||||
if display_type == 'new':
|
else:
|
||||||
return cls('New', reddit.get_new(limit=None), loader)
|
subreddit = reddit.get_subreddit(name)
|
||||||
|
if order == 'hot':
|
||||||
|
submissions = subreddit.get_hot(limit=None)
|
||||||
|
elif order == 'top':
|
||||||
|
submissions = subreddit.get_top(limit=None)
|
||||||
|
elif order == 'rising':
|
||||||
|
submissions = subreddit.get_rising(limit=None)
|
||||||
|
elif order == 'new':
|
||||||
|
submissions = subreddit.get_new(limit=None)
|
||||||
|
elif order == 'controversial':
|
||||||
|
submissions = subreddit.get_controversial(limit=None)
|
||||||
|
else:
|
||||||
|
raise SubredditNameError(display_name)
|
||||||
|
|
||||||
elif display_type == 'top':
|
|
||||||
return cls('Top', reddit.get_top(limit=None), loader)
|
|
||||||
|
|
||||||
elif display_type == 'hot':
|
|
||||||
return cls('Front Page', reddit.get_front_page(limit=None), loader)
|
|
||||||
|
|
||||||
elif display_type == 'rising':
|
|
||||||
return cls('Rising', reddit.get_rising(limit=None), loader)
|
|
||||||
|
|
||||||
elif display_type == 'controversial':
|
|
||||||
return cls('Controversial', reddit.get_controversial(limit=None), loader)
|
|
||||||
|
|
||||||
try:
|
|
||||||
with loader():
|
with loader():
|
||||||
sub = reddit.get_subreddit(name, fetch=True)
|
|
||||||
except praw.errors.ClientException:
|
|
||||||
raise SubredditNameError(name)
|
|
||||||
|
|
||||||
if display_type == 'new':
|
# Verify that content exists for the given submission generator.
|
||||||
return cls('/r/'+sub.display_name+'/new', sub.get_new(limit=None), loader)
|
# This is necessary because PRAW loads submissions lazily, and
|
||||||
|
# there is is no other way to check things like multireddits that
|
||||||
elif display_type == 'top':
|
# don't have a real corresponding subreddit object.
|
||||||
return cls('/r/'+sub.display_name+'/top', sub.get_top_from_all(limit=None), loader)
|
try:
|
||||||
|
content = cls(display_name, submissions, loader)
|
||||||
elif display_type == 'hot':
|
content.get(0)
|
||||||
return cls('/r/'+sub.display_name, sub.get_hot(limit=None), loader)
|
except:
|
||||||
|
raise SubredditNameError(display_name)
|
||||||
elif display_type == 'rising':
|
|
||||||
return cls('/r/'+sub.display_name+'/rising', sub.get_rising(limit=None), loader)
|
|
||||||
|
|
||||||
elif display_type == 'controversial':
|
|
||||||
return cls('/r/'+sub.display_name+'/controversial', sub.get_controversial(limit=None), loader)
|
|
||||||
|
|
||||||
|
return content
|
||||||
|
|
||||||
def get(self, index, n_cols=70):
|
def get(self, index, n_cols=70):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ def curses_session():
|
|||||||
# Hide blinking cursor
|
# Hide blinking cursor
|
||||||
curses.curs_set(0)
|
curses.curs_set(0)
|
||||||
|
|
||||||
hide_stderr()
|
# hide_stderr()
|
||||||
|
|
||||||
yield stdscr
|
yield stdscr
|
||||||
|
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -20,7 +20,7 @@ setup(
|
|||||||
license='MIT',
|
license='MIT',
|
||||||
keywords='reddit terminal praw curses',
|
keywords='reddit terminal praw curses',
|
||||||
packages=['rtv'],
|
packages=['rtv'],
|
||||||
install_requires=['praw', 'six'],
|
install_requires=['praw', 'six', 'requests'],
|
||||||
entry_points={'console_scripts': ['rtv=rtv.main:main']},
|
entry_points={'console_scripts': ['rtv=rtv.main:main']},
|
||||||
classifiers=[
|
classifiers=[
|
||||||
'Intended Audience :: End Users/Desktop',
|
'Intended Audience :: End Users/Desktop',
|
||||||
|
|||||||
Reference in New Issue
Block a user