forked from blallo/rss-bridge
[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
This commit is contained in:
parent
f8c6400373
commit
df81fa62d1
1 changed files with 84 additions and 23 deletions
|
@ -17,8 +17,14 @@ class VkBridge extends BridgeAbstract
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
protected $videos = array();
|
||||||
protected $pageName;
|
protected $pageName;
|
||||||
|
|
||||||
|
protected function getAccessToken()
|
||||||
|
{
|
||||||
|
return 'c8071613517c155c6cfbd2a059b2718e9c37b89094c4766834969dda75f657a2c1cbb49bab4c5e649f1db';
|
||||||
|
}
|
||||||
|
|
||||||
public function getURI()
|
public function getURI()
|
||||||
{
|
{
|
||||||
if (!is_null($this->getInput('u'))) {
|
if (!is_null($this->getInput('u'))) {
|
||||||
|
@ -51,11 +57,20 @@ class VkBridge extends BridgeAbstract
|
||||||
$pageName = $pageName->plaintext;
|
$pageName = $pageName->plaintext;
|
||||||
$this->pageName = htmlspecialchars_decode($pageName);
|
$this->pageName = htmlspecialchars_decode($pageName);
|
||||||
}
|
}
|
||||||
|
foreach ($html->find('div.replies') as $comment_block) {
|
||||||
|
$comment_block->outertext = '';
|
||||||
|
}
|
||||||
|
$html->load($html->save());
|
||||||
|
|
||||||
$pinned_post_item = null;
|
$pinned_post_item = null;
|
||||||
$last_post_id = 0;
|
$last_post_id = 0;
|
||||||
|
|
||||||
foreach ($html->find('.post') as $post) {
|
foreach ($html->find('.post') as $post) {
|
||||||
|
|
||||||
|
defaultLinkTo($post, self::URI);
|
||||||
|
|
||||||
|
$post_videos = array();
|
||||||
|
|
||||||
$is_pinned_post = false;
|
$is_pinned_post = false;
|
||||||
if (strpos($post->getAttribute('class'), 'post_fixed') !== false) {
|
if (strpos($post->getAttribute('class'), 'post_fixed') !== false) {
|
||||||
$is_pinned_post = true;
|
$is_pinned_post = true;
|
||||||
|
@ -114,7 +129,7 @@ class VkBridge extends BridgeAbstract
|
||||||
}
|
}
|
||||||
$article_title = $article->find($article_title_selector, 0)->innertext;
|
$article_title = $article->find($article_title_selector, 0)->innertext;
|
||||||
$article_author = $article->find($article_author_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');
|
$article_img_element_style = $article->find($article_thumb_selector, 0)->getAttribute('style');
|
||||||
preg_match('/background-image: url\((.*)\)/', $article_img_element_style, $matches);
|
preg_match('/background-image: url\((.*)\)/', $article_img_element_style, $matches);
|
||||||
if (count($matches) > 0) {
|
if (count($matches) > 0) {
|
||||||
|
@ -126,20 +141,22 @@ class VkBridge extends BridgeAbstract
|
||||||
|
|
||||||
// get video on post
|
// get video on post
|
||||||
$video = $post->find('div.post_video_desc', 0);
|
$video = $post->find('div.post_video_desc', 0);
|
||||||
|
$main_video_link = '';
|
||||||
if (is_object($video)) {
|
if (is_object($video)) {
|
||||||
$video_title = $video->find('div.post_video_title', 0)->plaintext;
|
$video_title = $video->find('div.post_video_title', 0)->plaintext;
|
||||||
$video_link = self::URI . ltrim( $video->find('a.lnk', 0)->getAttribute('href'), '/' );
|
$video_link = $video->find('a.lnk', 0)->getAttribute('href');
|
||||||
$content_suffix .= "<br>Video: <a href='$video_link'>$video_title</a>";
|
$this->appendVideo($video_title, $video_link, $content_suffix, $post_videos);
|
||||||
$video->outertext = '';
|
$video->outertext = '';
|
||||||
|
$main_video_link = $video_link;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all other videos
|
// get all other videos
|
||||||
foreach($post->find('a.page_post_thumb_video') as $a) {
|
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);
|
$temp = explode(' ', $video_title, 2);
|
||||||
if (count($temp) > 1) $video_title = $temp[1];
|
if (count($temp) > 1) $video_title = $temp[1];
|
||||||
$video_link = self::URI . ltrim( $a->getAttribute('href'), '/' );
|
$video_link = $a->getAttribute('href');
|
||||||
$content_suffix .= "<br>Video: <a href='$video_link'>$video_title</a>";
|
if ($video_link != $main_video_link) $this->appendVideo($video_title, $video_link, $content_suffix, $post_videos);
|
||||||
$a->outertext = '';
|
$a->outertext = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,14 +172,14 @@ class VkBridge extends BridgeAbstract
|
||||||
foreach($post->find('.page_album_wrap') as $el) {
|
foreach($post->find('.page_album_wrap') as $el) {
|
||||||
$a = $el->find('.page_album_link', 0);
|
$a = $el->find('.page_album_link', 0);
|
||||||
$album_title = $a->find('.page_album_title_text', 0)->getAttribute('title');
|
$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 = '';
|
$el->outertext = '';
|
||||||
$content_suffix .= "<br>Album: <a href='$album_link'>$album_title</a>";
|
$content_suffix .= "<br>Album: <a href='$album_link'>$album_title</a>";
|
||||||
}
|
}
|
||||||
|
|
||||||
// get photo documents
|
// get photo documents
|
||||||
foreach($post->find('a.page_doc_photo_href') as $a) {
|
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_gif_label_element = $a->find('.page_gif_label', 0);
|
||||||
$doc_title_element = $a->find('.doc_label', 0);
|
$doc_title_element = $a->find('.doc_label', 0);
|
||||||
|
|
||||||
|
@ -188,7 +205,7 @@ class VkBridge extends BridgeAbstract
|
||||||
|
|
||||||
if (is_object($doc_title_element)) {
|
if (is_object($doc_title_element)) {
|
||||||
$doc_title = $doc_title_element->innertext;
|
$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>";
|
$content_suffix .= "<br>Doc: <a href='$doc_link'>$doc_title</a>";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -246,15 +263,11 @@ class VkBridge extends BridgeAbstract
|
||||||
$post_link = $post->find('a.post_link', 0)->getAttribute('href');
|
$post_link = $post->find('a.post_link', 0)->getAttribute('href');
|
||||||
preg_match('/wall-?\d+_(\d+)/', $post_link, $preg_match_result);
|
preg_match('/wall-?\d+_(\d+)/', $post_link, $preg_match_result);
|
||||||
$item['post_id'] = intval($preg_match_result[1]);
|
$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['uri'] = $post_link;
|
||||||
$item['timestamp'] = $this->getTime($post);
|
$item['timestamp'] = $this->getTime($post);
|
||||||
$item['title'] = $this->getTitle($item['content']);
|
$item['title'] = $this->getTitle($item['content']);
|
||||||
$item['author'] = $post_author;
|
$item['author'] = $post_author;
|
||||||
|
$item['videos'] = $post_videos;
|
||||||
if ($is_pinned_post) {
|
if ($is_pinned_post) {
|
||||||
// do not append it now
|
// do not append it now
|
||||||
$pinned_post_item = $item;
|
$pinned_post_item = $item;
|
||||||
|
@ -265,16 +278,18 @@ class VkBridge extends BridgeAbstract
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_null($pinned_post_item)) {
|
if (!is_null($pinned_post_item)) {
|
||||||
return;
|
if (count($this->items) == 0) {
|
||||||
} else if (count($this->items) == 0) {
|
$this->items[] = $pinned_post_item;
|
||||||
$this->items[] = $pinned_post_item;
|
} else if ($last_post_id < $pinned_post_item['post_id']) {
|
||||||
} else if ($last_post_id < $pinned_post_item['post_id']) {
|
$this->items[] = $pinned_post_item;
|
||||||
$this->items[] = $pinned_post_item;
|
usort($this->items, function ($item1, $item2) {
|
||||||
usort($this->items, function ($item1, $item2) {
|
return $item2['post_id'] - $item1['post_id'];
|
||||||
return $item2['post_id'] - $item1['post_id'];
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->getCleanVideoLinks();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getPhoto($a) {
|
private function getPhoto($a) {
|
||||||
|
@ -348,5 +363,51 @@ class VkBridge extends BridgeAbstract
|
||||||
return getContents($this->getURI(), $header);
|
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 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue