<?php class RutubeBridge extends BridgeAbstract { const NAME = 'Rutube'; const URI = 'https://rutube.ru'; const MAINTAINER = 'em92'; const DESCRIPTION = 'Выводит ленту видео'; const PARAMETERS = [ 'По каналу' => [ 'c' => [ 'name' => 'ИД канала', 'exampleValue' => 1342940, // Мятежник Джек 'type' => 'number', 'required' => true ], ], 'По плейлисту' => [ 'p' => [ 'name' => 'ИД плейлиста', 'exampleValue' => 83641, // QRUSH 'type' => 'number', 'required' => true ], ], ]; protected $title; public function getURI() { if ($this->getInput('c')) { return self::URI . '/channel/' . strval($this->getInput('c')) . '/videos/'; } elseif ($this->getInput('p')) { return self::URI . '/plst/' . strval($this->getInput('p')) . '/'; } else { return parent::getURI(); } } public function getIcon() { return 'https://static.rutube.ru/static/favicon.ico'; } public function getName() { if (is_null($this->title)) { return parent::getName(); } else { return $this->title . ' - ' . parent::getName(); } } private function getJSONData($html) { $jsonDataRegex = '/window.reduxState = (.*);/'; preg_match($jsonDataRegex, $html, $matches) or returnServerError('Could not find reduxState'); return json_decode(str_replace('\x', '\\\x', $matches[1])); } public function collectData() { $link = $this->getURI(); $html = getContents($link); $reduxState = $this->getJSONData($html); $videos = []; if ($this->getInput('c')) { $videos = $reduxState->userChannel->videos->results; $this->title = $reduxState->userChannel->info->name; } elseif ($this->getInput('p')) { $videos = $reduxState->playlist->data->results; $this->title = $reduxState->playlist->title; } foreach ($videos as $video) { $item = new FeedItem(); $item->setTitle($video->title); $item->setURI($video->video_url); $content = '<a href="' . $item->getURI() . '">'; $content .= '<img src="' . $video->thumbnail_url . '" />'; $content .= '</a><br/>'; $content .= nl2br( // Converting links in plaintext // Copied from https://stackoverflow.com/a/12590772 preg_replace( '$(https?://[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', ' <a href="$1" target="_blank">$1</a> ', $video->description . ' ' ) ); $item->setTimestamp($video->created_ts); $item->setAuthor($video->author->name); $item->setContent($content); $this->items[] = $item; } } }