aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bridges/StreamCzBridge.php84
1 files changed, 84 insertions, 0 deletions
diff --git a/bridges/StreamCzBridge.php b/bridges/StreamCzBridge.php
new file mode 100644
index 00000000..f3375613
--- /dev/null
+++ b/bridges/StreamCzBridge.php
@@ -0,0 +1,84 @@
+<?php
+
+class StreamCzBridge extends BridgeAbstract
+{
+ const NAME = 'Stream.cz Bridge';
+ const URI = 'https://www.stream.cz';
+ const CACHE_TIMEOUT = 3600;
+ const DESCRIPTION = 'Return newest videos';
+ const MAINTAINER = 'Stopka';
+
+ const PARAMETERS = [
+ [
+ 'url' => [
+ 'name' => 'url to the show',
+ 'required' => true,
+ 'exampleValue' => 'https://www.stream.cz/lajna'
+ ]
+ ]
+ ];
+
+ public function collectData()
+ {
+ $url = $this->getInput('url');
+
+ $validUrl = '/^(https:\/\/www.stream.cz\/[a-z0-9-]+)(\/[a-z0-9-]+-\d+)?$/';
+ if (!preg_match($validUrl, $url, $match)) {
+ returnServerError('Invalid url');
+ }
+
+ $fixedUrl = $match[1];
+
+ $html = getSimpleHTMLDOM($fixedUrl);
+
+ $this->feedUri = $fixedUrl;
+
+ $scriptElement = $html->find('body script', -1);
+ if (null === $scriptElement) {
+ returnServerError('Could not find metadata element on the page');
+ }
+ $json = extractFromDelimiters($scriptElement->innertext, 'data : ', 'logs : ');
+ if (false === $json) {
+ returnServerError('Could not extract metadata from the page');
+ }
+ $data = json_decode(trim($json, ",\t\n\r\0\x0B"), true);
+ if (false === $data) {
+ returnServerError('Could not parse metadata on the page');
+ }
+
+ $showData = $data['fetchable']['tag']['show']['data'];
+ if (!is_array($showData)) {
+ returnServerError('Show not found in metadata');
+ }
+ $this->feedName = $showData['name'];
+ $episodes = $showData['allEpisodesConnection']['edges'];
+ if (!is_array($episodes)) {
+ returnServerError('Episodes not found in metadata');
+ }
+ foreach ($episodes as $episode) {
+ if (!$episode['node']) {
+ continue;
+ }
+ $episodeUrl = $episode['node']['urlName'];
+ $imageUrlNode = reset($episode['node']['images']);
+ $item = [
+ 'title' => $episode['node']['name'],
+ 'uri' => "${fixedUrl}/${episodeUrl}",
+ 'content' => $imageUrlNode ? '<img src="' . $imageUrlNode['url'] . '" />' : '',
+ 'timestamp' => $episode['node']['publishTime']['timestamp']
+ ];
+
+ $this->items[] = $item;
+ }
+ }
+
+ public function getURI()
+ {
+ return $this->feedUri ?? parent::getURI();
+ }
+
+ public function getName()
+ {
+ return $this->feedName ?? parent::getName();
+ }
+}