diff --git a/bulkredditdownloader/site_downloaders/download_factory.py b/bulkredditdownloader/site_downloaders/download_factory.py index dfe2b2d..19a8507 100644 --- a/bulkredditdownloader/site_downloaders/download_factory.py +++ b/bulkredditdownloader/site_downloaders/download_factory.py @@ -10,25 +10,37 @@ from bulkredditdownloader.site_downloaders.direct import Direct from bulkredditdownloader.site_downloaders.erome import Erome from bulkredditdownloader.site_downloaders.gallery import Gallery from bulkredditdownloader.site_downloaders.gfycat import Gfycat +from bulkredditdownloader.site_downloaders.gif_delivery_network import GifDeliveryNetwork from bulkredditdownloader.site_downloaders.imgur import Imgur from bulkredditdownloader.site_downloaders.redgifs import Redgifs +from bulkredditdownloader.site_downloaders.self_post import SelfPost +from bulkredditdownloader.site_downloaders.vreddit import VReddit +from bulkredditdownloader.site_downloaders.youtube import Youtube class DownloadFactory: @staticmethod def pull_lever(url: str) -> Type[BaseDownloader]: - url_beginning = r'\s*(https?://(www.)?)' - if re.match(url_beginning + r'gfycat.com.*', url): - return Gfycat - elif re.match(url_beginning + r'erome.com.*', url): + url_beginning = r'\s*(https?://(www\.)?)' + if re.match(url_beginning + r'erome\.com.*', url): return Erome + elif re.match(url_beginning + r'reddit\.com/gallery/.*', url): + return Gallery + elif re.match(url_beginning + r'gfycat\.', url): + return Gfycat + elif re.match(url_beginning + r'gifdeliverynetwork', url): + return GifDeliveryNetwork elif re.match(url_beginning + r'imgur.*', url): return Imgur elif re.match(url_beginning + r'redgifs.com', url): return Redgifs - elif re.match(url_beginning + r'[vi].redd\.it.*', url): + elif re.match(url_beginning + r'reddit\.com/r/', url): + return SelfPost + elif re.match(url_beginning + r'v\.redd\.it', url): + return VReddit + elif re.match(url_beginning + r'youtube', url): + return Youtube + elif re.match(url_beginning + r'i\.redd\.it.*', url) or re.match(url_beginning + r'.*\..{3,4}$', url): return Direct - elif re.match(url_beginning + r'reddit.com/gallery/.*', url): - return Gallery else: raise NotADownloadableLinkError('No downloader module exists for url {}'.format(url)) diff --git a/bulkredditdownloader/tests/downloaders/test_download_factory.py b/bulkredditdownloader/tests/downloaders/test_download_factory.py index 613296a..654c468 100644 --- a/bulkredditdownloader/tests/downloaders/test_download_factory.py +++ b/bulkredditdownloader/tests/downloaders/test_download_factory.py @@ -1,25 +1,44 @@ #!/usr/bin/env python3 # coding=utf-8 +import praw import pytest +from bulkredditdownloader.errors import NotADownloadableLinkError from bulkredditdownloader.site_downloaders.base_downloader import BaseDownloader +from bulkredditdownloader.site_downloaders.direct import Direct from bulkredditdownloader.site_downloaders.download_factory import DownloadFactory from bulkredditdownloader.site_downloaders.erome import Erome +from bulkredditdownloader.site_downloaders.gallery import Gallery from bulkredditdownloader.site_downloaders.gfycat import Gfycat +from bulkredditdownloader.site_downloaders.gif_delivery_network import GifDeliveryNetwork from bulkredditdownloader.site_downloaders.imgur import Imgur from bulkredditdownloader.site_downloaders.redgifs import Redgifs +from bulkredditdownloader.site_downloaders.self_post import SelfPost +from bulkredditdownloader.site_downloaders.vreddit import VReddit +from bulkredditdownloader.site_downloaders.youtube import Youtube -@pytest.mark.parametrize('test_url', ('https://gfycat.com/joyfulpitifulirishterrier', - 'https://gfycat.com/blaringaridjellyfish-jensen-ackles-supernatural')) -def test_factory_gfycat(test_url: str): - result = DownloadFactory.pull_lever(test_url) - assert result is Gfycat +@pytest.mark.online +@pytest.mark.reddit +@pytest.mark.parametrize(('test_submission_id', 'expected_class'), ( + ('lu8l8g', VReddit), + ('lu29zn', SelfPost), + ('lu2ykk', Direct), # Imgur direct link + ('luh2pd', Direct), # Reddit direct link + ('lu93m7', Gallery), + ('luf1nu', Gfycat), +)) +def test_factory_lever_good(test_submission_id: str, expected_class: BaseDownloader, reddit_instance: praw.Reddit): + submission = reddit_instance.submission(id=test_submission_id) + result = DownloadFactory.pull_lever(submission.url) + assert result is expected_class -@pytest.mark.parametrize('test_url', ('https://www.erome.com/a/bbezvaBn', - 'https://www.erome.com/a/p14JFlnm')) -def test_factory_erome(test_url): - result = DownloadFactory.pull_lever(test_url) - assert result is Erome +@pytest.mark.parametrize('test_url', ( + 'random.com', + 'bad', +)) +def test_factory_lever_bad(test_url: str): + with pytest.raises(NotADownloadableLinkError): + DownloadFactory.pull_lever(test_url)