ZDNetBridge.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <?php
  2. class ZDNetBridge extends BridgeAbstract {
  3. public function loadMetadatas() {
  4. $this->maintainer = 'ORelio';
  5. $this->name = $this->getName();
  6. $this->uri = $this->getURI();
  7. $this->description = 'Technology News, Analysis, Comments and Product Reviews for IT Professionals.';
  8. $this->update = '2016-07-20';
  9. $this->parameters[] =
  10. // http://www.zdnet.com/zdnet.opml
  11. '[
  12. {
  13. "name" : "Feed",
  14. "type" : "list",
  15. "identifier" : "feed",
  16. "values" :
  17. [
  18. { "name" : "---- Select ----", "value" : "" },
  19. { "name" : "", "value" : "" },
  20. { "name" : "Subscribe to ZDNet RSS Feeds", "value" : "" },
  21. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;All Blogs", "value" : "blog" },
  22. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Just News", "value" : "news" },
  23. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;All Reviews", "value" : "topic/reviews" },
  24. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Latest Downloads", "value" : "downloads!recent" },
  25. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Latest Articles", "value" : "/" },
  26. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Latest Australia Articles", "value" : "au" },
  27. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Latest UK Articles", "value" : "uk" },
  28. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Latest US Articles", "value" : "us" },
  29. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Latest Asia Articles", "value" : "as" },
  30. { "name" : "", "value" : "" },
  31. { "name" : "Keep up with ZDNet Blogs RSS:", "value" : "" },
  32. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Transforming the Datacenter", "value" : "blog/transforming-datacenter" },
  33. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;SMB India", "value" : "blog/smb-india" },
  34. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Indonesia BizTech", "value" : "blog/indonesia-biztech" },
  35. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Hong Kong Techie", "value" : "blog/hong-kong-techie" },
  36. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Tech Taiwan", "value" : "blog/tech-taiwan" },
  37. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Startup India", "value" : "blog/startup-india" },
  38. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Starting Up Asia", "value" : "blog/starting-up-asia" },
  39. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Next-Gen Partner", "value" : "blog/partner" },
  40. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Post-PC Developments", "value" : "blog/post-pc" },
  41. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Benelux", "value" : "blog/benelux" },
  42. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Heat Sink", "value" : "blog/heat-sink" },
  43. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Italy&#039;s got tech", "value" : "blog/italy" },
  44. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;African Enterprise", "value" : "blog/african-enterprise" },
  45. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;New Tech for Old India", "value" : "blog/new-india" },
  46. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Estonia Uncovered", "value" : "blog/estonia" },
  47. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;IT Iberia", "value" : "blog/iberia" },
  48. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Brazil Tech", "value" : "blog/brazil" },
  49. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;500 words into the future", "value" : "blog/500-words-into-the-future" },
  50. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;ÜberTech", "value" : "blog/ubertech" },
  51. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;All About Microsoft", "value" : "blog/microsoft" },
  52. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Back office", "value" : "blog/back-office" },
  53. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Barker Bites Back", "value" : "blog/barker-bites-back" },
  54. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Between the Lines", "value" : "blog/btl" },
  55. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Big on Data", "value" : "blog/big-data" },
  56. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;bootstrappr", "value" : "blog/bootstrappr" },
  57. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;By The Way", "value" : "blog/by-the-way" },
  58. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Central European Processing", "value" : "blog/central-europe" },
  59. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Cloud Builders", "value" : "blog/cloud-builders" },
  60. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Communication Breakdown", "value" : "blog/communication-breakdown" },
  61. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Collaboration 2.0", "value" : "blog/collaboration" },
  62. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Constellation Research", "value" : "blog/constellation" },
  63. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Consumerization: BYOD", "value" : "blog/consumerization" },
  64. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;DIY-IT", "value" : "blog/diy-it" },
  65. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Enterprise Web 2.0", "value" : "blog/hinchcliffe" },
  66. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Five Nines: The Next Gen Datacenter", "value" : "blog/datacenter" },
  67. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Forrester Research", "value" : "blog/forrester" },
  68. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Full Duplex", "value" : "blog/full-duplex" },
  69. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Gen Why?", "value" : "blog/gen-why" },
  70. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Hardware 2.0", "value" : "blog/hardware" },
  71. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Identity Matters", "value" : "blog/identity" },
  72. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;iGeneration", "value" : "blog/igeneration" },
  73. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Internet of Everything", "value" : "blog/cisco" },
  74. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Beyond IT Failure", "value" : "blog/projectfailures" },
  75. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Jamie&#039;s Mostly Linux Stuff", "value" : "blog/jamies-mostly-linux-stuff" },
  76. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Jack&#039;s Blog", "value" : "blog/jacks-blog" },
  77. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Laptops &amp; Desktops", "value" : "blog/computers" },
  78. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Linux and Open Source", "value" : "blog/open-source" },
  79. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;London Calling", "value" : "blog/london" },
  80. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Mapping Babel", "value" : "blog/mapping-babel" },
  81. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Mixed Signals", "value" : "blog/mixed-signals" },
  82. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Mobile India", "value" : "blog/mobile-india" },
  83. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Mobile News", "value" : "blog/mobile-news" },
  84. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Networking", "value" : "blog/networking" },
  85. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Norse Code", "value" : "blog/norse-code" },
  86. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Null Pointer", "value" : "blog/null-pointer" },
  87. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The Full Tilt", "value" : "blog/the-full-tilt" },
  88. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Pinoy Post", "value" : "blog/pinoy-post" },
  89. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Practically Tech", "value" : "blog/practically-tech" },
  90. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Product Central", "value" : "blog/product-central" },
  91. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Pulp Tech", "value" : "blog/violetblue" },
  92. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Qubits and Pieces", "value" : "blog/qubits-and-pieces" },
  93. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Securify This!", "value" : "blog/securify-this" },
  94. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Service Oriented", "value" : "blog/service-oriented" },
  95. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Small Talk", "value" : "blog/small-talk" },
  96. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Small Business Matters", "value" : "blog/small-business-matters" },
  97. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Smartphones and Cell Phones", "value" : "blog/cell-phones" },
  98. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Social Business", "value" : "blog/feeds" },
  99. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Social CRM: The Conversation", "value" : "blog/crm" },
  100. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Software &amp; Services Safari", "value" : "blog/sommer" },
  101. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Storage Bits", "value" : "blog/storage" },
  102. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Stacking up Open Clouds", "value" : "blog/apac-redhat" },
  103. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Techie Isles", "value" : "blog/techie-isles" },
  104. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Technolatte", "value" : "blog/technolatte" },
  105. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Tech Podium", "value" : "blog/tech-podium" },
  106. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Tel Aviv Tech", "value" : "blog/tel-aviv" },
  107. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Tech Broiler", "value" : "blog/perlow" },
  108. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The SANMAN", "value" : "blog/the-sanman" },
  109. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The open source revolution", "value" : "blog/the-open-source-revolution" },
  110. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The German View", "value" : "blog/german" },
  111. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The Ed Bott Report", "value" : "blog/bott" },
  112. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The Mobile Gadgeteer", "value" : "blog/mobile-gadgeteer" },
  113. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The Apple Core", "value" : "blog/apple" },
  114. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Tom Foremski: IMHO", "value" : "blog/foremski" },
  115. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Twisted Wire", "value" : "blog/twisted-wire" },
  116. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Vive la tech", "value" : "blog/france" },
  117. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Virtually Speaking", "value" : "blog/virtualization" },
  118. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;View from China", "value" : "blog/china" },
  119. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Web design &amp; Free Software", "value" : "blog/web-design-and-free-software" },
  120. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;ZDNet Government", "value" : "blog/government" },
  121. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;ZDNet UK Book Reviews", "value" : "blog/zdnet-uk-book-reviews" },
  122. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;ZDNet UK First Take", "value" : "blog/zdnet-uk-first-take" },
  123. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Zero Day", "value" : "blog/security" },
  124. { "name" : "", "value" : "" },
  125. { "name" : "ZDNet Hot Topics RSS:", "value" : "" },
  126. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Apple", "value" : "topic/apple" },
  127. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Collaboration", "value" : "topic/collaboration" },
  128. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Enterprise Software", "value" : "topic/enterprise-software" },
  129. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Google", "value" : "topic/google" },
  130. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Great debate", "value" : "topic/great-debate" },
  131. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Hardware", "value" : "topic/hardware" },
  132. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;IBM", "value" : "topic/ibm" },
  133. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;iOS", "value" : "topic/ios" },
  134. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;iPhone", "value" : "topic/iphone" },
  135. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;iPad", "value" : "topic/ipad" },
  136. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;IT Priorities", "value" : "topic/it-priorities" },
  137. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Laptops", "value" : "topic/laptops" },
  138. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Legal", "value" : "topic/legal" },
  139. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Linux", "value" : "topic/linux" },
  140. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Microsoft", "value" : "topic/microsoft" },
  141. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Mobile OS", "value" : "topic/mobile-os" },
  142. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Mobility", "value" : "topic/mobility" },
  143. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Networking", "value" : "topic/networking" },
  144. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Oracle", "value" : "topic/oracle" },
  145. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Processors", "value" : "topic/processors" },
  146. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Samsung", "value" : "topic/samsung" },
  147. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Security", "value" : "topic/security" },
  148. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Small business: going big on mobility", "value" : "topic/small-business-going-big-on-mobility" },
  149. { "name" : "", "value" : "" },
  150. { "name" : "Product Blogs:", "value" : "" },
  151. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Digital Cameras &amp; Camcorders", "value" : "blog/digitalcameras" },
  152. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Home Theater", "value" : "blog/home-theater" },
  153. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Laptops and Desktops", "value" : "blog/computers" },
  154. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The Mobile Gadgeteer", "value" : "blog/mobile-gadgeteer" },
  155. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;Smartphones and Cell Phones", "value" : "blog/cell-phones" },
  156. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;The ToyBox", "value" : "blog/gadgetreviews" },
  157. { "name" : "", "value" : "" },
  158. { "name" : "Vertical Blogs:", "value" : "" },
  159. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;ZDNet Education", "value" : "blog/education" },
  160. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;ZDNet Healthcare", "value" : "blog/healthcare" },
  161. { "name" : "&nbsp;&nbsp;&nbsp;&nbsp;ZDNet Government", "value" : "blog/government" }
  162. ]
  163. }
  164. ]';
  165. }
  166. public function collectData(array $param) {
  167. function StripCDATA($string) {
  168. $string = str_replace('<![CDATA[', '', $string);
  169. $string = str_replace(']]>', '', $string);
  170. return trim($string);
  171. }
  172. function ExtractFromDelimiters($string, $start, $end) {
  173. if (strpos($string, $start) !== false) {
  174. $section_retrieved = substr($string, strpos($string, $start) + strlen($start));
  175. $section_retrieved = substr($section_retrieved, 0, strpos($section_retrieved, $end));
  176. return $section_retrieved;
  177. } return false;
  178. }
  179. function StripWithDelimiters($string, $start, $end) {
  180. while (strpos($string, $start) !== false) {
  181. $section_to_remove = substr($string, strpos($string, $start));
  182. $section_to_remove = substr($section_to_remove, 0, strpos($section_to_remove, $end) + strlen($end));
  183. $string = str_replace($section_to_remove, '', $string);
  184. } return $string;
  185. }
  186. function StripRecursiveHTMLSection($string, $tag_name, $tag_start) {
  187. $open_tag = '<'.$tag_name;
  188. $close_tag = '</'.$tag_name.'>';
  189. $close_tag_length = strlen($close_tag);
  190. if (strpos($tag_start, $open_tag) === 0) {
  191. while (strpos($string, $tag_start) !== false) {
  192. $max_recursion = 100;
  193. $section_to_remove = null;
  194. $section_start = strpos($string, $tag_start);
  195. $search_offset = $section_start;
  196. do {
  197. $max_recursion--;
  198. $section_end = strpos($string, $close_tag, $search_offset);
  199. $search_offset = $section_end + $close_tag_length;
  200. $section_to_remove = substr($string, $section_start, $section_end - $section_start + $close_tag_length);
  201. $open_tag_count = substr_count($section_to_remove, $open_tag);
  202. $close_tag_count = substr_count($section_to_remove, $close_tag);
  203. } while ($open_tag_count > $close_tag_count && $max_recursion > 0);
  204. $string = str_replace($section_to_remove, '', $string);
  205. }
  206. }
  207. return $string;
  208. }
  209. $baseUri = $this->getURI();
  210. $feed = $param['feed'];
  211. if (empty($feed))
  212. $this->returnError('Please select a feed to display.', 400);
  213. if (strpos($feed, 'downloads!') !== false) {
  214. $feed = str_replace('downloads!', '', $feed);
  215. $baseUri = str_replace('www.', 'downloads.', $baseUri);
  216. }
  217. if ($feed !== preg_replace('/[^a-zA-Z0-9-\/]+/', '', $feed) || substr_count($feed, '/') > 1 || strlen($feed > 64))
  218. $this->returnError('Invalid "feed" parameter.', 400);
  219. $url = $baseUri.trim($feed, '/').'/rss.xml';
  220. $html = $this->file_get_html($url) or $this->returnError('Could not request ZDNet: '.$url, 500);
  221. $limit = 0;
  222. foreach ($html->find('item') as $element) {
  223. if ($limit < 10) {
  224. $article_url = preg_replace('/([^#]+)#ftag=.*/', '$1', StripCDATA(ExtractFromDelimiters($element->innertext, '<link>', '</link>')));
  225. $article_author = StripCDATA(ExtractFromDelimiters($element->innertext, 'role="author">', '<'));
  226. $article_title = StripCDATA($element->find('title', 0)->plaintext);
  227. $article_subtitle = StripCDATA($element->find('description', 0)->plaintext);
  228. $article_timestamp = strtotime(StripCDATA($element->find('pubDate', 0)->plaintext));
  229. $article = $this->file_get_html($article_url) or $this->returnError('Could not request ZDNet: '.$article_url, 500);
  230. if (!empty($article_author))
  231. $author = $article_author;
  232. else {
  233. $author = $article->find('meta[name=author]', 0);
  234. if (is_object($author))
  235. $author = $author->content;
  236. else $author = 'ZDNet';
  237. }
  238. $thumbnail = $article->find('meta[itemprop=image]', 0);
  239. if (is_object($thumbnail))
  240. $thumbnail = $thumbnail->content;
  241. else $thumbnail = '';
  242. $contents = $article->find('article', 0)->innertext;
  243. foreach (array(
  244. '<div class="shareBar"',
  245. '<div class="shortcodeGalleryWrapper"',
  246. '<div class="relatedContent',
  247. '<div class="downloadNow',
  248. '<div data-shortcode',
  249. '<div id="sharethrough',
  250. '<div id="inpage-video'
  251. ) as $div_start) {
  252. $contents = StripRecursiveHTMLSection($contents , 'div', $div_start);
  253. }
  254. $contents = StripWithDelimiters($contents, '<script', '</script>');
  255. $contents = StripWithDelimiters($contents, '<meta itemprop="image"', '>');
  256. $contents = trim(StripWithDelimiters($contents, '<section class="sharethrough-top', '</section>'));
  257. $content_img = strpos($contents, '<img'); //Look for first image
  258. if (($content_img !== false && $content_img < 512) || $thumbnail == '')
  259. $content_img = ''; //Image already present on article beginning or no thumbnail
  260. else $content_img = '<p><img src="'.$thumbnail.'" /></p>'; //Include thumbnail
  261. $contents = $content_img
  262. .'<p><b>'.$article_subtitle.'</b></p>'
  263. .$contents;
  264. if ($thumbnail == '')
  265. $thumbnail = 'http://zdnet1.cbsistatic.com/fly/bundles/zdnetcss/images/logos/logo-192x192.png';
  266. $item = new \Item();
  267. $item->author = $author;
  268. $item->uri = $article_url;
  269. $item->title = $article_title;
  270. $item->thumbnailUri = $thumbnail;
  271. $item->timestamp = $article_timestamp;
  272. $item->content = $contents;
  273. $this->items[] = $item;
  274. $limit++;
  275. }
  276. }
  277. }
  278. public function getName() {
  279. return 'ZDNet Bridge';
  280. }
  281. public function getURI() {
  282. return 'http://www.zdnet.com/';
  283. }
  284. public function getCacheDuration() {
  285. return 3600; //1 hour
  286. }
  287. }