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 năm trước cách đây
mục cha
commit
3c4e12ceba
1 tập tin đã thay đổi với 98 bổ sung1 xóa
  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]);
+
+	}
+
 }