From df81fa62d1356d5cd6022f7e92f6156df4f2db79 Mon Sep 17 00:00:00 2001 From: Eugene Molotov Date: Thu, 9 Aug 2018 20:02:36 +0500 Subject: [PATCH] [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 --- bridges/VkBridge.php | 107 +++++++++++++++++++++++++++++++++---------- 1 file changed, 84 insertions(+), 23 deletions(-) diff --git a/bridges/VkBridge.php b/bridges/VkBridge.php index dc520147..05c146c9 100644 --- a/bridges/VkBridge.php +++ b/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 .= "
Video: $video_title"; + $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 .= "
Video: $video_title"; + $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 .= "
Album: $album_title"; } // 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 .= "
Doc: $doc_title"; } 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 .= '
Video: '.$video_title.''; + } + } + + 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'] .= '
Video: '.$video_title.''; + } + 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 ); + } }