diff --git a/bridges/Arte7Bridge.php b/bridges/Arte7Bridge.php index 42b5afcc..1162d174 100644 --- a/bridges/Arte7Bridge.php +++ b/bridges/Arte7Bridge.php @@ -60,7 +60,7 @@ class Arte7Bridge extends BridgeAbstract { break; } - $url = 'https://api.arte.tv/api/opa/v3/videos?sort=broadcastBegin&limit=10&language=' + $url = 'https://api.arte.tv/api/opa/v3/videos?sort=-lastModified&limit=10&language=' . $lang . ($category != null ? '&category.code=' . $category : ''); diff --git a/bridges/PinterestBridge.php b/bridges/PinterestBridge.php index c5282ff5..7eeafc1a 100644 --- a/bridges/PinterestBridge.php +++ b/bridges/PinterestBridge.php @@ -15,12 +15,6 @@ class PinterestBridge extends FeedExpander { 'b' => array( 'name' => 'board', 'required' => true - ), - 'r' => array( - 'name' => 'Use custom RSS', - 'type' => 'checkbox', - 'required' => false, - 'title' => 'Uncheck to return data via custom filters (more data)' ) ), 'From search' => array( @@ -34,12 +28,8 @@ class PinterestBridge extends FeedExpander { public function collectData(){ switch($this->queriedContext) { case 'By username and board': - if($this->getInput('r')) { - $html = getSimpleHTMLDOMCached($this->getURI()); - $this->getUserResults($html); - } else { - $this->collectExpandableDatas($this->getURI() . '.rss'); - } + $this->collectExpandableDatas($this->getURI() . '.rss'); + $this->fixLowRes(); break; case 'From search': default: @@ -48,49 +38,17 @@ class PinterestBridge extends FeedExpander { } } - private function getUserResults($html){ - $json = json_decode($html->find('#jsInit1', 0)->innertext, true); - $results = $json['tree']['children'][0]['children'][0]['children'][0]['options']['props']['data']['board_feed']; - $username = $json['resourceDataCache'][0]['data']['owner']['username']; - $fullname = $json['resourceDataCache'][0]['data']['owner']['full_name']; - $avatar = $json['resourceDataCache'][0]['data']['owner']['image_small_url']; + private function fixLowRes() { - foreach($results as $result) { - $item = array(); + $newitems = []; + $pattern = '/https\:\/\/i\.pinimg\.com\/[a-zA-Z0-9]*x\//'; + foreach($this->items as $item) { - $item['uri'] = $result['link']; - - // Some use regular titles, others provide 'advanced' infos, a few - // provide even less info. Thus we attempt multiple options. - $item['title'] = trim($result['title']); - - if($item['title'] === "") - $item['title'] = trim($result['rich_summary']['display_name']); - - if($item['title'] === "") - $item['title'] = trim($result['description']); - - $item['timestamp'] = strtotime($result['created_at']); - $item['username'] = $username; - $item['fullname'] = $fullname; - $item['avatar'] = $avatar; - $item['author'] = $item['username'] . ' (' . $item['fullname'] . ')'; - $item['content'] = '

' - . $item['username'] - . '
' - . $item['fullname'] - . '



' - . $result['description'] - . '

'; - - $item['enclosures'] = array($result['images']['orig']['url']); - - $this->items[] = $item; + $item["content"] = preg_replace($pattern, 'https://i.pinimg.com/originals/', $item["content"]); + $newitems[] = $item; } + $this->items = $newitems; + } private function getSearchResults($html){ diff --git a/bridges/PlanetLibreBridge.php b/bridges/PlanetLibreBridge.php deleted file mode 100644 index 03a6024d..00000000 --- a/bridges/PlanetLibreBridge.php +++ /dev/null @@ -1,38 +0,0 @@ -find('div[class="post-text"]', 0)->innertext; - return $text; - } - - public function collectData(){ - $html = getSimpleHTMLDOM(self::URI) - or returnServerError('Could not request PlanetLibre.'); - $limit = 0; - foreach($html->find('div.post') as $element) { - if($limit < 5) { - $item = array(); - $item['title'] = $element->find('h1', 0)->plaintext; - $item['uri'] = $element->find('a', 0)->href; - $item['timestamp'] = strtotime( - str_replace( - '/', - '-', - $element->find('div[class="post-date"]', 0)->plaintext - ) - ); - - $item['content'] = $this->extractContent($item['uri']); - $this->items[] = $item; - $limit++; - } - } - } -} diff --git a/bridges/SteamBridge.php b/bridges/SteamBridge.php index b0f1033f..8d6e4f13 100644 --- a/bridges/SteamBridge.php +++ b/bridges/SteamBridge.php @@ -2,7 +2,7 @@ class SteamBridge extends BridgeAbstract { const NAME = 'Steam Bridge'; - const URI = 'https://steamcommunity.com/'; + const URI = 'https://store.steampowered.com/'; const CACHE_TIMEOUT = 3600; // 1h const DESCRIPTION = 'Returns games list'; const MAINTAINER = 'jacknumber'; @@ -68,62 +68,65 @@ class SteamBridge extends BridgeAbstract { $username = $this->getInput('username'); $params = array( - 'sort' => $this->getInput('sort'), - 'cc' => $this->getInput('currency') + 'cc' => $this->getInput('currency'), + 'sort' => $this->getInput('sort') ); - $url = self::URI . 'id/' . $username . '/wishlist?' . http_build_query($params); + $url = self::URI . 'wishlist/id/' . $username . '/?' . http_build_query($params); - $html = ''; - $html = getSimpleHTMLDOM($url) + $jsonDataRegex = '/var g_rg(?:WishlistData|AppInfo) = ([^;]*)/'; + $content = getContents($url) or returnServerError("Could not request Steam Wishlist. Tried:\n - $url"); - foreach($html->find('#wishlist_items .wishlistRow') as $element) { + preg_match_all($jsonDataRegex, $content, $matches, PREG_SET_ORDER, 0); - $gameTitle = $element->find('h4', 0)->plaintext; - $gameUri = $element->find('.storepage_btn_ctn a', 0)->href; - $gameImg = $element->find('.gameListRowLogo img', 0)->src; + $appList = json_decode($matches[0][1], true); + $fullAppList = json_decode($matches[1][1], true); + //var_dump($matches[1][1]); + //var_dump($fullAppList); + $sortedElementList = array_fill(0, count($appList), 0); + foreach($appList as $app) { - $discountBlock = $element->find('.discount_block', 0); + $sortedElementList[$app["priority"] - 1] = $app["appid"]; - if($element->find('.discount_block', 0)) { - $gameHasPromo = 1; - } else { + } - if($this->getInput('only_discount')) { - continue; - } + foreach($sortedElementList as $appId) { - $gameHasPromo = 0; - - } - - if($gameHasPromo) { - - $gamePromoValue = $discountBlock->find('.discount_pct', 0)->plaintext; - $gameOldPrice = $discountBlock->find('.discount_original_price', 0)->plaintext; - $gameNewPrice = $discountBlock->find('.discount_final_price', 0)->plaintext; - $gamePrice = $gameNewPrice; - - } else { - $gamePrice = $element->find('.gameListPriceData .price', 0)->plaintext; - } + $app = $fullAppList[$appId]; + $gameTitle = $app["name"]; + $gameUri = "http://store.steampowered.com/app/" . $appId . "/"; + $gameImg = $app["capsule"]; $item = array(); $item['uri'] = $gameUri; $item['title'] = $gameTitle; - $item['price'] = $gamePrice; - $item['hasPromo'] = $gameHasPromo; - if($gameHasPromo) { + if(count($app["subs"]) > 0) { + if($app["subs"][0]["discount_pct"] != 0) { - $item['promoValue'] = $gamePromoValue; - $item['oldPrice'] = $gameOldPrice; - $item['newPrice'] = $gameNewPrice; + $item['promoValue'] = $app["subs"][0]["discount_pct"]; + $item['oldPrice'] = $app["subs"][0]["price"] / 100 / ((100 - $gamePromoValue / 100)); + $item['newPrice'] = $app["subs"][0]["price"] / 100; + $item['price'] = $item['newPrice']; + + $item['hasPromo'] = true; + + } else { + + if($this->getInput('only_discount')) { + continue; + } + + $item['price'] = $app["subs"][0]["price"] / 100; + $item['hasPromo'] = false; + } } $this->items[] = $item; + } + } } diff --git a/bridges/VkBridge.php b/bridges/VkBridge.php index 85bf60c5..4eba9610 100644 --- a/bridges/VkBridge.php +++ b/bridges/VkBridge.php @@ -17,6 +17,8 @@ class VkBridge extends BridgeAbstract ) ); + protected $pageName; + public function getURI() { if (!is_null($this->getInput('u'))) { @@ -26,15 +28,24 @@ class VkBridge extends BridgeAbstract return parent::getURI(); } + public function getName() + { + if ($this->pageName) { + return $this->pageName; + } + + return parent::getName(); + } + public function collectData() { - $text_html = $this->getContents() or returnServerError('No results for group or user name "' . $this->getInput('u') . '".'); $text_html = iconv('windows-1251', 'utf-8', $text_html); $html = str_get_html($text_html); $pageName = $html->find('.page_name', 0)->plaintext; + $this->pageName = $pageName; foreach ($html->find('.post') as $post) { diff --git a/bridges/YoutubeBridge.php b/bridges/YoutubeBridge.php index 3d81daeb..321fb264 100644 --- a/bridges/YoutubeBridge.php +++ b/bridges/YoutubeBridge.php @@ -50,12 +50,28 @@ class YoutubeBridge extends BridgeAbstract { private function ytBridgeQueryVideoInfo($vid, &$author, &$desc, &$time){ $html = $this->ytGetSimpleHTMLDOM(self::URI . "watch?v=$vid"); - $author = $html->innertext; - $author = substr($author, strpos($author, '"author=') + 8); - $author = substr($author, 0, strpos($author, '\u0026')); - if(!is_null($html->find('div#watch-description-text', 0))) - $desc = $html->find('div#watch-description-text', 0)->innertext; + // Skip unavailable videos + if(!strpos($html->innertext, 'IS_UNAVAILABLE_PAGE')) { + return; + } + + foreach($html->find('script') as $script) { + $data = trim($script->innertext); + + if(strpos($data, '{') !== 0) + continue; // Wrong script + + $json = json_decode($data); + + if(!isset($json->itemListElement)) + continue; // Wrong script + + $author = $json->itemListElement[0]->item->name; + } + + if(!is_null($html->find('#watch-description-text', 0))) + $desc = $html->find('#watch-description-text', 0)->innertext; if(!is_null($html->find('meta[itemprop=datePublished]', 0))) $time = strtotime($html->find('meta[itemprop=datePublished]', 0)->getAttribute('content')); diff --git a/index.php b/index.php index 799980b5..851f0f92 100644 --- a/index.php +++ b/index.php @@ -70,6 +70,9 @@ if(!extension_loaded('openssl')) if(!extension_loaded('libxml')) die('"libxml" extension not loaded. Please check "php.ini"'); +if(!extension_loaded('mbstring')) + die('"mbstring" extension not loaded. Please check "php.ini"'); + // configuration checks if(ini_get('allow_url_fopen') !== "1") die('"allow_url_fopen" is not set to "1". Please check "php.ini');