Browse Source

[VkBridge] Video attachment fixes (#766)

* use defaultLinkTo
* remove duplicate video links
* remove line ending before "Reposted" label
* return newline before reposted string
* remove comments
* use video links that won't require login
* set title if video has no title
Eugene Molotov 5 years ago
parent
commit
df81fa62d1
1 changed files with 84 additions and 23 deletions
  1. 84 23
      bridges/VkBridge.php

+ 84 - 23
bridges/VkBridge.php

@@ -17,8 +17,14 @@ class VkBridge extends BridgeAbstract
 		)
 	);
 
+	protected $videos = array();
 	protected $pageName;
 
+	protected function getAccessToken()
+	{
+		return 'c8071613517c155c6cfbd2a059b2718e9c37b89094c4766834969dda75f657a2c1cbb49bab4c5e649f1db';
+	}
+
 	public function getURI()
 	{
 		if (!is_null($this->getInput('u'))) {
@@ -51,11 +57,20 @@ class VkBridge extends BridgeAbstract
 			$pageName = $pageName->plaintext;
 			$this->pageName = htmlspecialchars_decode($pageName);
 		}
+		foreach ($html->find('div.replies') as $comment_block) {
+			$comment_block->outertext = '';
+		}
+		$html->load($html->save());
+
 		$pinned_post_item = null;
 		$last_post_id = 0;
 
 		foreach ($html->find('.post') as $post) {
 
+			defaultLinkTo($post, self::URI);
+
+			$post_videos = array();
+
 			$is_pinned_post = false;
 			if (strpos($post->getAttribute('class'), 'post_fixed') !== false) {
 				$is_pinned_post = true;
@@ -114,7 +129,7 @@ class VkBridge extends BridgeAbstract
 				}
 				$article_title = $article->find($article_title_selector, 0)->innertext;
 				$article_author = $article->find($article_author_selector, 0)->innertext;
-				$article_link = self::URI . ltrim($article->getAttribute('href'), '/');
+				$article_link = $article->getAttribute('href');
 				$article_img_element_style = $article->find($article_thumb_selector, 0)->getAttribute('style');
 				preg_match('/background-image: url\((.*)\)/', $article_img_element_style, $matches);
 				if (count($matches) > 0) {
@@ -126,20 +141,22 @@ class VkBridge extends BridgeAbstract
 
 			// get video on post
 			$video = $post->find('div.post_video_desc', 0);
+			$main_video_link = '';
 			if (is_object($video)) {
 				$video_title = $video->find('div.post_video_title', 0)->plaintext;
-				$video_link = self::URI . ltrim( $video->find('a.lnk', 0)->getAttribute('href'), '/' );
-				$content_suffix .= "<br>Video: <a href='$video_link'>$video_title</a>";
+				$video_link = $video->find('a.lnk', 0)->getAttribute('href');
+				$this->appendVideo($video_title, $video_link, $content_suffix, $post_videos);
 				$video->outertext = '';
+				$main_video_link = $video_link;
 			}
 
 			// get all other videos
 			foreach($post->find('a.page_post_thumb_video') as $a) {
-				$video_title = $a->getAttribute('aria-label');
+				$video_title = htmlspecialchars_decode($a->getAttribute('aria-label'));
 				$temp = explode(' ', $video_title, 2);
 				if (count($temp) > 1) $video_title = $temp[1];
-				$video_link = self::URI . ltrim( $a->getAttribute('href'), '/' );
-				$content_suffix .= "<br>Video: <a href='$video_link'>$video_title</a>";
+				$video_link = $a->getAttribute('href');
+				if ($video_link != $main_video_link) $this->appendVideo($video_title, $video_link, $content_suffix, $post_videos);
 				$a->outertext = '';
 			}
 
@@ -155,14 +172,14 @@ class VkBridge extends BridgeAbstract
 			foreach($post->find('.page_album_wrap') as $el) {
 				$a = $el->find('.page_album_link', 0);
 				$album_title = $a->find('.page_album_title_text', 0)->getAttribute('title');
-				$album_link = self::URI . ltrim($a->getAttribute('href'), '/');
+				$album_link = $a->getAttribute('href');
 				$el->outertext = '';
 				$content_suffix .= "<br>Album: <a href='$album_link'>$album_title</a>";
 			}
 
 			// get photo documents
 			foreach($post->find('a.page_doc_photo_href') as $a) {
-				$doc_link = self::URI . ltrim($a->getAttribute('href'), '/');
+				$doc_link = $a->getAttribute('href');
 				$doc_gif_label_element = $a->find('.page_gif_label', 0);
 				$doc_title_element = $a->find('.doc_label', 0);
 
@@ -188,7 +205,7 @@ class VkBridge extends BridgeAbstract
 
 				if (is_object($doc_title_element)) {
 					$doc_title = $doc_title_element->innertext;
-					$doc_link = self::URI . ltrim($doc_title_element->getAttribute('href'), '/');
+					$doc_link = $doc_title_element->getAttribute('href');
 					$content_suffix .= "<br>Doc: <a href='$doc_link'>$doc_title</a>";
 
 				} else {
@@ -246,15 +263,11 @@ class VkBridge extends BridgeAbstract
 			$post_link = $post->find('a.post_link', 0)->getAttribute('href');
 			preg_match('/wall-?\d+_(\d+)/', $post_link, $preg_match_result);
 			$item['post_id'] = intval($preg_match_result[1]);
-			if (substr(self::URI, -1) == '/') {
-				$post_link = self::URI . ltrim($post_link, '/');
-			} else {
-				$post_link = self::URI . $post_link;
-			}
 			$item['uri'] = $post_link;
 			$item['timestamp'] = $this->getTime($post);
 			$item['title'] = $this->getTitle($item['content']);
 			$item['author'] = $post_author;
+			$item['videos'] = $post_videos;
 			if ($is_pinned_post) {
 				// do not append it now
 				$pinned_post_item = $item;
@@ -265,16 +278,18 @@ class VkBridge extends BridgeAbstract
 
 		}
 
-		if (is_null($pinned_post_item)) {
-			return;
-		} else if (count($this->items) == 0) {
-			$this->items[] = $pinned_post_item;
-		} else if ($last_post_id < $pinned_post_item['post_id']) {
-			$this->items[] = $pinned_post_item;
-			usort($this->items, function ($item1, $item2) {
-				return $item2['post_id'] - $item1['post_id'];
-			});
+		if (!is_null($pinned_post_item)) {
+			if (count($this->items) == 0) {
+				$this->items[] = $pinned_post_item;
+			} else if ($last_post_id < $pinned_post_item['post_id']) {
+				$this->items[] = $pinned_post_item;
+				usort($this->items, function ($item1, $item2) {
+					return $item2['post_id'] - $item1['post_id'];
+				});
+			}
 		}
+
+		$this->getCleanVideoLinks();
 	}
 
 	private function getPhoto($a) {
@@ -348,5 +363,51 @@ class VkBridge extends BridgeAbstract
 		return getContents($this->getURI(), $header);
 	}
 
+	protected function appendVideo($video_title, $video_link, &$content_suffix, array &$post_videos)
+	{
+		if (!$video_title) $video_title = '(empty)';
+
+		preg_match('/video([0-9-]+_[0-9]+)/', $video_link, $preg_match_result);
+
+		if (count($preg_match_result) > 1) {
+			$video_id = $preg_match_result[1];
+			$this->videos[ $video_id ] = array(
+				'url' => $video_link,
+				'title' => $video_title,
+			);
+			$post_videos[] = $video_id;
+		} else {
+			$content_suffix .= '<br>Video: <a href="'.htmlspecialchars($video_link).'">'.$video_title.'</a>';
+		}
+	}
+
+	protected function getCleanVideoLinks() {
+		$result = $this->api('video.get', array(
+			'videos' => implode(',', array_keys($this->videos)),
+			'count' => 200
+		));
+
+		if (isset($result['error'])) return;
+
+		foreach($result['response']['items'] as $item) {
+			$video_id = strval($item['owner_id']).'_'.strval($item['id']);
+			$this->videos[$video_id]['url'] = $item['player'];
+		}
 
+		foreach($this->items as &$item) {
+			foreach($item['videos'] as $video_id) {
+				$video_link = $this->videos[$video_id]['url'];
+				$video_title = $this->videos[$video_id]['title'];
+				$item['content'] .= '<br>Video: <a href="'.htmlspecialchars($video_link).'">'.$video_title.'</a>';
+			}
+			unset($item['videos']);
+		}
+	}
+
+	protected function api($method, array $params)
+	{
+		$params['v'] = '5.80';
+		$params['access_token'] = $this->getAccessToken();
+		return json_decode( getContents('https://api.vk.com/method/'.$method.'?'.http_build_query($params)), true );
+	}
 }