Browse Source

[GooglePlusPostBridge] Add images to enclosures

Images are collected for each post and added to enclosures. Images or
animtions from lh3.googleusercontent.com are specifically handled in
order to return the animated version of the gif and the original sized
image (this is normally taken care of by JS in the browser).
logmanoriginal 5 years ago
parent
commit
3c4e12ceba
1 changed files with 98 additions and 1 deletions
  1. 98 1
      bridges/GooglePlusPostBridge.php

+ 98 - 1
bridges/GooglePlusPostBridge.php

@@ -4,7 +4,7 @@ class GooglePlusPostBridge extends BridgeAbstract{
 	protected $_title;
 	protected $_url;
 
-	const MAINTAINER = 'Grummfy';
+	const MAINTAINER = 'Grummfy, logmanoriginal';
 	const NAME = 'Google Plus Post Bridge';
 	const URI = 'https://plus.google.com/';
 	const CACHE_TIMEOUT = 600; //10min
@@ -97,6 +97,20 @@ class GooglePlusPostBridge extends BridgeAbstract{
 			$item['content'] .= '<div style="margin-top: -1.5em">' .  $content . '</div>';
 			$item['content'] = trim(strip_tags($item['content'], '<a><p><div><img>'));
 
+			$media = $post->find('[jsname="MTOxpb"]', 0);
+
+			if($media) {
+
+				$item['enclosures'] = array();
+
+				foreach($media->find('img') as $img) {
+
+					$item['enclosures'][] = $this->fixImage($img)->src;
+
+				}
+
+			}
+
 			$this->items[] = $item;
 		}
 	}
@@ -108,4 +122,87 @@ class GooglePlusPostBridge extends BridgeAbstract{
 	public function getURI(){
 		return $this->_url ?: parent::getURI();
 	}
+
+	private function fixImage($img) {
+
+		// There are certain images like .gif which link to a static picture and
+		// get replaced dynamically via JS in the browser. If we want the "real"
+		// image we need to account for that.
+
+		$urlparts = parse_url($img->src);
+
+		if(array_key_exists('host', $urlparts)) {
+
+			// For some reason some URIs don't contain the scheme, assume https
+			if(!array_key_exists('scheme', $urlparts)) {
+				$urlparts['scheme'] = 'https';
+			}
+
+			$pathelements = explode('/', $urlparts['path']);
+
+			switch($urlparts['host']) {
+
+				case 'lh3.googleusercontent.com':
+
+					if(pathinfo(end($pathelements), PATHINFO_EXTENSION)) {
+
+						// The second to last element of the path specifies the
+						// image format. The URL is still valid if we remove it.
+						unset($pathelements[count($pathelements) - 2]);
+
+					} elseif(strrpos(end($pathelements), '=') !== false) {
+
+						// Some images go throug a proxy. For those images they
+						// add size information after an equal sign.
+						// Example: '=w530-h298-n'. Again this can safely be
+						// removed to get the original image.
+						$pathelements[count($pathelements) - 1] = substr(
+							end($pathelements),
+							0,
+							strrpos(end($pathelements), '=')
+						);
+
+					}
+
+					break;
+
+			}
+
+			$urlparts['path'] = implode('/', $pathelements);
+
+		}
+
+		echo $img->src . '<br>';
+
+		$img->src = $this->build_url($urlparts);
+
+		echo $img->src . '<br><br>';
+
+		return $img;
+
+	}
+
+	/**
+	 * From: https://gist.github.com/Ellrion/f51ba0d40ae1d62eeae44fd1adf7b704
+	 * slightly adjusted to work with PHP < 7.0
+	 * @param array $parts
+	 * @return string
+	 */
+	private function build_url(array $parts)
+	{
+
+		$scheme   = isset($parts['scheme']) ? ($parts['scheme'] . '://') : '';
+		$host     = isset($parts['host']) ? $parts['host'] : '';
+		$port     = isset($parts['port']) ? (':' . $parts['port']) : '';
+		$user     = isset($parts['user']) ? $parts['user'] : '';
+		$pass     = isset($parts['pass']) ? (':' . $parts['pass']) : '';
+		$pass     = ($user || $pass) ? ($pass . '@') : '';
+		$path     = isset($parts['path']) ? $parts['path'] : '';
+		$query    = isset($parts['query']) ? ('?' . $parts['query']) : '';
+		$fragment = isset($parts['fragment']) ? ('#' . $parts['fragment']) : '';
+
+		return implode('', [$scheme, $user, $pass, $host, $port, $path, $query, $fragment]);
+
+	}
+
 }