Allow subreddits and multireddits to fail individually
This commit is contained in:
@@ -14,6 +14,7 @@ from typing import Iterator
|
|||||||
|
|
||||||
import appdirs
|
import appdirs
|
||||||
import praw
|
import praw
|
||||||
|
import praw.exceptions
|
||||||
import praw.models
|
import praw.models
|
||||||
import prawcore
|
import prawcore
|
||||||
|
|
||||||
@@ -166,17 +167,26 @@ class RedditDownloader:
|
|||||||
|
|
||||||
def _get_subreddits(self) -> list[praw.models.ListingGenerator]:
|
def _get_subreddits(self) -> list[praw.models.ListingGenerator]:
|
||||||
if self.args.subreddit:
|
if self.args.subreddit:
|
||||||
subreddits = [self._sanitise_subreddit_name(subreddit) for subreddit in self.args.subreddit]
|
out = []
|
||||||
subreddits = [self.reddit_instance.subreddit(chosen_subreddit) for chosen_subreddit in subreddits]
|
sort_function = self._determine_sort_function()
|
||||||
|
for reddit in self.args.subreddit:
|
||||||
|
try:
|
||||||
|
reddit = self._sanitise_subreddit_name(reddit)
|
||||||
|
reddit = self.reddit_instance.subreddit(reddit)
|
||||||
if self.args.search:
|
if self.args.search:
|
||||||
return [
|
out.append(
|
||||||
reddit.search(
|
reddit.search(
|
||||||
self.args.search,
|
self.args.search,
|
||||||
sort=self.sort_filter.name.lower(),
|
sort=self.sort_filter.name.lower(),
|
||||||
limit=self.args.limit) for reddit in subreddits]
|
limit=self.args.limit))
|
||||||
|
logger.debug(
|
||||||
|
f'Added submissions from subreddit {reddit} with the search term "{self.args.search}"')
|
||||||
else:
|
else:
|
||||||
sort_function = self._determine_sort_function()
|
out.append(sort_function(reddit, limit=self.args.limit))
|
||||||
return [sort_function(reddit, limit=self.args.limit) for reddit in subreddits]
|
logger.debug(f'Added submissions from subreddit {reddit}')
|
||||||
|
except (errors.BulkDownloaderException, praw.exceptions.PRAWException) as e:
|
||||||
|
logger.error(f'Failed to get submissions for subreddit {reddit}: {e}')
|
||||||
|
return out
|
||||||
else:
|
else:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
@@ -211,18 +221,18 @@ class RedditDownloader:
|
|||||||
|
|
||||||
def _get_multireddits(self) -> list[Iterator]:
|
def _get_multireddits(self) -> list[Iterator]:
|
||||||
if self.args.multireddit:
|
if self.args.multireddit:
|
||||||
if self.authenticated:
|
out = []
|
||||||
if self.args.user:
|
|
||||||
sort_function = self._determine_sort_function()
|
sort_function = self._determine_sort_function()
|
||||||
multireddits = [self._sanitise_subreddit_name(multi) for multi in self.args.multireddit]
|
for multi in self.args.multireddit:
|
||||||
return [
|
try:
|
||||||
sort_function(self.reddit_instance.multireddit(
|
multi = self._sanitise_subreddit_name(multi)
|
||||||
self.args.user,
|
out.append(sort_function(
|
||||||
m_reddit_choice), limit=self.args.limit) for m_reddit_choice in multireddits]
|
self.reddit_instance.multireddit(self.args.user, multi),
|
||||||
else:
|
limit=self.args.limit))
|
||||||
raise errors.BulkDownloaderException('A user must be provided to download a multireddit')
|
logger.debug(f'Added submissions from multireddit {multi}')
|
||||||
else:
|
except (errors.BulkDownloaderException, praw.exceptions.PRAWException) as e:
|
||||||
raise errors.RedditAuthenticationError('Accessing multireddits requires authentication')
|
logger.error(f'Failed to get submissions for multireddit {multi}: {e}')
|
||||||
|
return out
|
||||||
else:
|
else:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|||||||
@@ -217,24 +217,6 @@ def test_get_multireddits_public(
|
|||||||
assert_all_results_are_submissions((limit * len(test_multireddits)) if limit else None, results)
|
assert_all_results_are_submissions((limit * len(test_multireddits)) if limit else None, results)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.online
|
|
||||||
@pytest.mark.reddit
|
|
||||||
def test_get_multireddits_no_user(downloader_mock: MagicMock, reddit_instance: praw.Reddit):
|
|
||||||
downloader_mock.args.multireddit = ['test']
|
|
||||||
with pytest.raises(BulkDownloaderException):
|
|
||||||
RedditDownloader._get_multireddits(downloader_mock)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.online
|
|
||||||
@pytest.mark.reddit
|
|
||||||
def test_get_multireddits_not_authenticated(downloader_mock: MagicMock, reddit_instance: praw.Reddit):
|
|
||||||
downloader_mock.args.multireddit = ['test']
|
|
||||||
downloader_mock.authenticated = False
|
|
||||||
downloader_mock.reddit_instance = reddit_instance
|
|
||||||
with pytest.raises(RedditAuthenticationError):
|
|
||||||
RedditDownloader._get_multireddits(downloader_mock)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.online
|
@pytest.mark.online
|
||||||
@pytest.mark.reddit
|
@pytest.mark.reddit
|
||||||
@pytest.mark.parametrize(('test_user', 'limit'), (
|
@pytest.mark.parametrize(('test_user', 'limit'), (
|
||||||
|
|||||||
Reference in New Issue
Block a user