From a006b14e4be3d0bfed49819f9afc5886370ce778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Schmidts?= Date: Mon, 8 May 2017 02:01:49 +0200 Subject: [PATCH] adding instagram integration --- src/lib/conf_handling.py | 2 ++ src/lib/integrations/__init__.py | 2 ++ src/lib/integrations/rss_bridge.py | 44 ++++++++++++++++++++++++++++++ src/tests/libs/rss_bridge.py | 43 +++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 src/lib/integrations/rss_bridge.py create mode 100644 src/tests/libs/rss_bridge.py diff --git a/src/lib/conf_handling.py b/src/lib/conf_handling.py index a5cb8fcac..cb39828a1 100644 --- a/src/lib/conf_handling.py +++ b/src/lib/conf_handling.py @@ -52,6 +52,8 @@ {'prefix': 'PLUGINS', 'options': [ {'key': 'READABILITY_KEY', 'default': '', 'ask': 'Enter your Mercury key key if you have one'}, + {'key': 'RSS_BRIDGE', 'default': '', 'ask': 'Enter the url of the ' + 'rss bridge you want to use if you do'}, ]}, {'prefix': 'AUTH', 'options': [ {'key': 'ALLOW_SIGNUP', 'default': True, 'type': bool, diff --git a/src/lib/integrations/__init__.py b/src/lib/integrations/__init__.py index 6853564d8..3464b0d63 100644 --- a/src/lib/integrations/__init__.py +++ b/src/lib/integrations/__init__.py @@ -3,12 +3,14 @@ from lib.integrations.reddit import RedditIntegration from lib.integrations.youtube import YoutubeIntegration from lib.integrations.koreus import KoreusIntegration +from lib.integrations.rss_bridge import InstagramIntegration add_integration(MercuryIntegration()) add_integration(RedditIntegration()) add_integration(YoutubeIntegration()) add_integration(KoreusIntegration()) +add_integration(InstagramIntegration()) __all__ = ['dispatch'] diff --git a/src/lib/integrations/rss_bridge.py b/src/lib/integrations/rss_bridge.py new file mode 100644 index 000000000..f4125d469 --- /dev/null +++ b/src/lib/integrations/rss_bridge.py @@ -0,0 +1,44 @@ +import re +from bootstrap import conf +from urllib.parse import urlencode, urlsplit, urlunsplit, SplitResult +from lib.integrations.abstract import AbstractIntegration + + +class RssBridgeAbstractIntegration(AbstractIntegration): + bridge_type = None + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.split = urlsplit(conf.PLUGINS_RSS_BRIDGE) \ + if conf.PLUGINS_RSS_BRIDGE else None + + def get_u(self, feed): + raise NotImplementedError() + + def match_feed_creation(self, feed): + return bool(self.split and not feed.get('link') and self.get_u(feed)) + + def feed_creation(self, feed): + query = {'action': 'display', 'format': 'AtomFormat', + 'bridge': self.bridge_type, 'u': self.get_u(feed)} + + feed['link'] = urlunsplit(SplitResult(scheme=self.split.scheme, + netloc=self.split.netloc, + path=self.split.path or '/', + query=urlencode(query), fragment='')) + return True + + +class RegexRssBridgeAbstractIntegration(RssBridgeAbstractIntegration): + regex = None + + def get_u(self, feed): + split = self.regex.split(feed.get('site_link', ''), 1) + if len(split) > 1: + return split[2] + return False + + +class InstagramIntegration(RegexRssBridgeAbstractIntegration): + regex = re.compile('^https?://(www.)?instagram.com/([^ \t\n\r\f\v/]+)') + bridge_type = 'InstagramBridge' diff --git a/src/tests/libs/rss_bridge.py b/src/tests/libs/rss_bridge.py new file mode 100644 index 000000000..cf603a0cc --- /dev/null +++ b/src/tests/libs/rss_bridge.py @@ -0,0 +1,43 @@ +import unittest + +from bootstrap import conf +from urllib.parse import urlsplit, parse_qs +from lib.integrations.abstract import _INTEGRATION_MAPPING +from lib.integrations.rss_bridge import InstagramIntegration +from lib.integrations import dispatch + + +class InstagramIntegrationTest(unittest.TestCase): + site_links = ('http://instagram.com/jaesivsm', + 'http://instagram.com/jaesivsm/', + 'https://instagram.com/jaesivsm', + 'https://instagram.com/jaesivsm/', + 'http://www.instagram.com/jaesivsm/', + 'https://www.instagram.com/jaesivsm/') + link = 'https://bridge.leslibres.org/?action=display' \ + '&bridge=InstagramBridge&format=AtomFormat&u=jaesivsm' + + def setUp(self): + conf.PLUGINS_RSS_BRIDGE = 'https://bridge.leslibres.org/' + self.inte = InstagramIntegration() + for inte, prio in _INTEGRATION_MAPPING: + if isinstance(inte, InstagramIntegration): + inte.split = urlsplit(conf.PLUGINS_RSS_BRIDGE) + + def test_match_feed_creation(self): + self.assertFalse(self.inte.match_feed_creation({})) + for sl in self.site_links: + self.assertTrue(self.inte.match_feed_creation({'site_link': sl}), + "%s did not match" % sl) + + def test_feed_creation(self): + original = urlsplit(self.link) + qs = parse_qs(original.query) + for sl in self.site_links: + feed = {'site_link': sl} + self.assertTrue(dispatch('feed_creation', feed)) + processed = urlsplit(feed['link']) + self.assertEqual(processed.scheme, original.scheme) + self.assertEqual(processed.netloc, original.netloc) + self.assertEqual(processed.path, original.path) + self.assertEqual(parse_qs(processed.query), qs)