diff --git a/bridges/TwitterBridge.php b/bridges/TwitterBridge.php index fc7b78bdcca..20f90d74c59 100644 --- a/bridges/TwitterBridge.php +++ b/bridges/TwitterBridge.php @@ -66,6 +66,41 @@ class TwitterBridge extends BridgeAbstract { ) ); + public function detectParameters($url){ + $params = array(); + + // By keyword or hashtag (search) + $regex = '/^(https?:\/\/)?(www\.)?twitter\.com\/search.*(\?|&)q=([^\/&?\n]+)/'; + if(preg_match($regex, $url, $matches) > 0) { + $params['q'] = urldecode($matches[4]); + return $params; + } + + // By hashtag + $regex = '/^(https?:\/\/)?(www\.)?twitter\.com\/hashtag\/([^\/?\n]+)/'; + if(preg_match($regex, $url, $matches) > 0) { + $params['q'] = urldecode($matches[3]); + return $params; + } + + // By list + $regex = '/^(https?:\/\/)?(www\.)?twitter\.com\/([^\/?\n]+)\/lists\/([^\/?\n]+)/'; + if(preg_match($regex, $url, $matches) > 0) { + $params['user'] = urldecode($matches[3]); + $params['list'] = urldecode($matches[4]); + return $params; + } + + // By username + $regex = '/^(https?:\/\/)?(www\.)?twitter\.com\/([^\/?\n]+)/'; + if(preg_match($regex, $url, $matches) > 0) { + $params['u'] = urldecode($matches[3]); + return $params; + } + + return null; + } + public function getName(){ switch($this->queriedContext) { case 'By keyword or hashtag': diff --git a/index.php b/index.php index c093644aab1..772f49428e1 100644 --- a/index.php +++ b/index.php @@ -96,6 +96,42 @@ header('Content-Type: application/json'); echo json_encode($list, JSON_PRETTY_PRINT); + } elseif($action === 'detect') { + + $targetURL = $params['url'] + or returnClientError('You must specify a url!'); + + $format = $params['format'] + or returnClientError('You must specify a format!'); + + foreach(Bridge::listBridges() as $bridgeName) { + + if(!Bridge::isWhitelisted($bridgeName)) { + continue; + } + + $bridge = Bridge::create($bridgeName); + + if($bridge === false) { + continue; + } + + $bridgeParams = $bridge->detectParameters($targetURL); + + if(is_null($bridgeParams)) { + continue; + } + + $bridgeParams['bridge'] = $bridgeName; + $bridgeParams['format'] = $format; + + header('Location: ?action=display&' . http_build_query($bridgeParams), true, 301); + die(); + + } + + returnClientError('No bridge found for given URL: ' . $targetURL); + } elseif($action === 'display' && !empty($bridge)) { $format = $params['format'] diff --git a/lib/BridgeAbstract.php b/lib/BridgeAbstract.php index b02280e46ec..a2b15802422 100644 --- a/lib/BridgeAbstract.php +++ b/lib/BridgeAbstract.php @@ -278,4 +278,17 @@ public function getCacheTimeout(){ return static::CACHE_TIMEOUT; } + /** {@inheritdoc} */ + public function detectParameters($url){ + $regex = '/^(https?:\/\/)?(www\.)?(.+?)(\/)?$/'; + if(empty(static::PARAMETERS) + && preg_match($regex, $url, $urlMatches) > 0 + && preg_match($regex, static::URI, $bridgeUriMatches) > 0 + && $urlMatches[3] === $bridgeUriMatches[3]) { + return array(); + } else { + return null; + } + } + } diff --git a/lib/BridgeInterface.php b/lib/BridgeInterface.php index bc48fe04c7e..803bb3cdffd 100644 --- a/lib/BridgeInterface.php +++ b/lib/BridgeInterface.php @@ -114,4 +114,12 @@ public function getURI(); * @return int Cache timeout */ public function getCacheTimeout(); + + /** + * Returns parameters from given URL or null if URL is not applicable + * + * @param string $url URL to extract parameters from + * @return array|null List of bridge parameters or null if detection failed. + */ + public function detectParameters($url); }