diff --git a/bulkredditdownloader/site_downloaders/download_factory.py b/bulkredditdownloader/site_downloaders/download_factory.py new file mode 100644 index 0000000..64ebc1b --- /dev/null +++ b/bulkredditdownloader/site_downloaders/download_factory.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +# coding=utf-8 + +import re +from typing import Type + +from bulkredditdownloader.errors import NotADownloadableLinkError +from bulkredditdownloader.site_downloaders.base_downloader import BaseDownloader +from bulkredditdownloader.site_downloaders.direct import Direct +from bulkredditdownloader.site_downloaders.erome import Erome +from bulkredditdownloader.site_downloaders.gfycat import Gfycat +from bulkredditdownloader.site_downloaders.imgur import Imgur +from bulkredditdownloader.site_downloaders.redgifs import Redgifs + + +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): + return Erome + 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): + return Direct + 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 new file mode 100644 index 0000000..613296a --- /dev/null +++ b/bulkredditdownloader/tests/downloaders/test_download_factory.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +# coding=utf-8 + +import pytest + +from bulkredditdownloader.site_downloaders.base_downloader import BaseDownloader +from bulkredditdownloader.site_downloaders.download_factory import DownloadFactory +from bulkredditdownloader.site_downloaders.erome import Erome +from bulkredditdownloader.site_downloaders.gfycat import Gfycat +from bulkredditdownloader.site_downloaders.imgur import Imgur +from bulkredditdownloader.site_downloaders.redgifs import Redgifs + + +@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.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