function generate_content(&$title) { global $serendipity; $number = $this->get_config('number'); $displaydate = $this->get_config('displaydate', 'true'); $dateformat = $this->get_config('dateformat'); $sidebartitle = $title = $this->get_config('sidebartitle', $this->title); $rssuri = $this->get_config('rssuri'); $target = $this->get_config('target'); $cachetime = $this->get_config('cachetime'); $feedtype = $this->get_config('feedtype', 'rss'); $markup = $this->get_config('markup', 'false'); $bulletimg = $this->get_config('bulletimg'); $charset = $this->get_config('charset', 'native'); if (!$number || !is_numeric($number) || $number < 1) { $showAll = true; } else { $showAll = false; } if (!$dateformat || strlen($dateformat) < 1) { $dateformat = '%A, %B %e. %Y'; } if (!$cachetime || !is_numeric($cachetime)) { $cachetime = 10800; // 3 hours in seconds } $smarty = serendipity_db_bool($this->get_config('smarty')); if ($this->get_config('template') != 'plugin_remoterss.tpl') { $smarty = true; } if (trim($rssuri)) { $feedcache = $serendipity['serendipityPath'] . 'templates_c/remoterss_cache_' . md5(preg_replace('@[^a-z0-9]*@i', '', $rssuri) . $this->get_config('template')) . '.dat'; if (!file_exists($feedcache) || filesize($feedcache) == 0 || filemtime($feedcache) < time() - $cachetime) { $this->debug('Cachefile does not existing.'); if (!$this->urlcheck($rssuri)) { $this->debug('URLCheck failed'); echo '<!-- No valid URL! -->'; } elseif ($feedtype == 'rss') { $this->debug('URLCheck succeeded. Touching ' . $feedcache); // Touching the feedcache file will prevent loops of death when the RSS target is the same URI than our blog. @touch($feedcache); require_once S9Y_PEAR_PATH . 'Onyx/RSS.php'; $c = new Onyx_RSS($charset); $this->debug('Running Onyx Parser'); $c->parse($rssuri); $this->encoding = $c->rss['encoding']; $use_rss_link = serendipity_db_bool($this->get_config('use_rss_link')); $rss_elements = explode(',', $this->get_config('show_rss_element')); $escape_rss = serendipity_db_bool($this->get_config('escape_rss')); $i = 0; $content = ''; $smarty_items = array(); while (($showAll || $i < $number) && ($item = $c->getNextItem())) { if (empty($item['title'])) { continue; } $content .= '<div class="rss_item">'; if ($use_rss_link) { $content .= '<div class="rss_link"><a href="' . serendipity_specialchars($this->decode($item['link'])) . '" ' . (!empty($target) ? 'target="' . $target . '"' : '') . '>'; } if (!empty($bulletimg)) { $content .= '<img src="' . $bulletimg . '" border="0" alt="*" /> '; } $is_first = true; foreach ($rss_elements as $rss_element) { $rss_element = trim($rss_element); if (!$is_first) { $content .= '<span class="rss_' . preg_replace('@[^a-z0-9]@imsU', '', $rss_element) . '">'; } if ($escape_rss) { $content .= $this->decode($item[$rss_element]); } else { $content .= serendipity_specialchars($this->decode($item[$rss_element])); } if ($smarty) { $item['display_elements'][preg_replace('@[^a-z0-9]@imsU', '', $rss_element)] = $this->decode($item[$rss_element]); } if (!$is_first) { $content .= '</span>'; } if ($is_first && $use_rss_link) { $content .= '</a></div>'; // end of first linked element } $is_first = false; } if ($is_first && $use_rss_link) { // No XML element has been configured. $content .= '</a></div>'; } $content .= "<br />\n"; $item['timestamp'] = @strtotime(isset($item['pubdate']) ? $item['pubdate'] : $item['dc:date']); if (!($item['timestamp'] == -1) and $displaydate == 'true') { $content .= '<div class="serendipitySideBarDate">' . serendipity_specialchars(serendipity_formatTime($dateformat, $item['timestamp'], false)) . '</div>'; } if ($smarty) { $smarty_items['items'][$i] = $item; $smarty_items['items'][$i]['css_class'] = preg_replace('@[^a-z0-9]@imsU', '', $rss_element); foreach ($item as $key => $val) { $smarty_items['items'][$i]['decoded_' . str_replace(':', '_', $key)] = $this->decode($key); } } $content .= '</div>'; // end of rss_item ++$i; } if ($smarty) { $smarty_items['use_rss_link'] = $use_rss_link; $smarty_items['bulletimg'] = $bulletimg; $smarty_items['escape_rss'] = $escape_rss; $smarty_items['displaydate'] = $displaydate; $smarty_items['dateformat'] = $dateformat; $smarty_items['target'] = $target; $serendipity['smarty']->assign_by_ref('remoterss_items', $smarty_items); $tpl = $this->get_config('template'); if (empty($tpl)) { $tpl = 'plugin_remoterss.tpl'; } // Template specifics go here switch ($tpl) { case 'plugin_remoterss_nasaiotd.tpl': $smarty_items['nasa_image'] = $c->getData('image'); break; } $content = $this->parseTemplate($tpl); } $this->debug('Caching Feed (' . strlen($content) . ' bytes)'); $fp = @fopen($feedcache, 'w'); if (trim($content) != '' && $fp) { fwrite($fp, $content); fclose($fp); $this->debug('Feed cache written'); } else { $this->debug('Could not write (empty?) cache.'); echo '<!-- Cache failed to ' . $feedcache . ' in ' . getcwd() . ' --><br />'; if (trim($content) == '') { $this->debug('Getting old feedcache'); $content = @file_get_contents($feedcache); } } $this->debug('RSS Plugin finished.'); } elseif ($feedtype == 'atom') { $this->debug('URLCheck succeeded. Touching ' . $feedcache); // Touching the feedcache file will prevent loops of death when the RSS target is the same URI than our blog. @touch($feedcache); require_once S9Y_PEAR_PATH . '/simplepie/simplepie.inc'; $this->debug('Running simplepie Parser'); $simplefeed = new SimplePie(); $simplefeed->cache = false; $simplefeed->set_feed_url($rssuri); $success = $simplefeed->init(); $simplefeed->set_output_encoding($charset); $simplefeed->handle_content_type(); $this->encoding = $charset; $use_rss_link = serendipity_db_bool($this->get_config('use_rss_link')); $rss_elements = explode(',', $this->get_config('show_rss_element')); $escape_rss = serendipity_db_bool($this->get_config('escape_rss')); $i = 0; $content = ''; $smarty_items = array(); foreach ($simplefeed->get_items() as $simpleitem) { // map SimplePie items to s9y items $item['title'] = $simpleitem->get_title(); $item['link'] = $simpleitem->get_permalink(); $item['pubdate'] = $simpleitem->get_date('U'); $item['date'] = $simpleitem->get_date('U'); $item['description'] = $simpleitem->get_description(); $item['content'] = $simpleitem->get_content(); $item['author'] = $simpleitem->get_author(); if (!$showAll && $i > $number) { break; } if (empty($item['title'])) { continue; } $content .= '<div class="rss_item">'; if ($use_rss_link) { $content .= '<div class="rss_link"><a href="' . serendipity_specialchars($this->decode($item['link'])) . '" ' . (!empty($target) ? 'target="' . $target . '"' : '') . '>'; } if (!empty($bulletimg)) { $content .= '<img src="' . $bulletimg . '" border="0" alt="*" /> '; } $is_first = true; foreach ($rss_elements as $rss_element) { $rss_element = trim($rss_element); if (!$is_first) { $content .= '<span class="rss_' . preg_replace('@[^a-z0-9]@imsU', '', $rss_element) . '">'; } if ($escape_rss) { $content .= $this->decode($item[$rss_element]); } else { $content .= serendipity_specialchars($this->decode($item[$rss_element])); } if ($smarty) { $item['display_elements'][preg_replace('@[^a-z0-9]@imsU', '', $rss_element)] = $this->decode($item[$rss_element]); } if (!$is_first) { $content .= '</span>'; } if ($is_first && $use_rss_link) { $content .= '</a></div>'; // end of first linked element } $is_first = false; } if ($is_first && $use_rss_link) { // No XML element has been configured. $content .= '</a></div>'; } $content .= "<br />\n"; $item['timestamp'] = @strtotime(isset($item['pubdate']) ? $item['pubdate'] : $item['dc:date']); if (!($item['timestamp'] == -1) and $displaydate == 'true') { $content .= '<div class="serendipitySideBarDate">' . serendipity_specialchars(serendipity_formatTime($dateformat, $item['timestamp'], false)) . '</div>'; } if ($smarty) { $smarty_items['items'][$i] = $item; $smarty_items['items'][$i]['css_class'] = preg_replace('@[^a-z0-9]@imsU', '', $rss_element); foreach ($item as $key => $val) { $smarty_items['items'][$i]['decoded_' . str_replace(':', '_', $key)] = $this->decode($key); } } $content .= '</div>'; // end of rss_item ++$i; } if ($smarty) { $smarty_items['use_rss_link'] = $use_rss_link; $smarty_items['bulletimg'] = $bulletimg; $smarty_items['escape_rss'] = $escape_rss; $smarty_items['displaydate'] = $displaydate; $smarty_items['dateformat'] = $dateformat; $smarty_items['target'] = $target; $serendipity['smarty']->assign_by_ref('remoterss_items', $smarty_items); $tpl = $this->get_config('template'); if (empty($tpl)) { $tpl = 'plugin_remoterss.tpl'; } // Template specifics go here switch ($tpl) { case 'plugin_remoterss_nasaiotd.tpl': $smarty_items['nasa_image'] = $c->getData('image'); break; } $content = $this->parseTemplate($tpl); } $this->debug('Caching Feed (' . strlen($content) . ' bytes)'); $fp = @fopen($feedcache, 'w'); if (trim($content) != '' && $fp) { fwrite($fp, $content); fclose($fp); $this->debug('Feed cache written'); } else { $this->debug('Could not write (empty?) cache.'); echo '<!-- Cache failed to ' . $feedcache . ' in ' . getcwd() . ' --><br />'; if (trim($content) == '') { $this->debug('Getting old feedcache'); $content = @file_get_contents($feedcache); } } $this->debug('RSS Plugin (Atom) finished.'); } elseif ($feedtype == 'opml') { // Touching the feedcache file will prevent loops of death when the RSS target is the same URI than our blog. @touch($feedcache); $opml = new s9y_remoterss_OPML(); $opmltree = $opml->parseOPML($rssuri); if (OPMLDEBUG == 1) { echo "\n<pre>\n"; print_r($opmltree); echo "\n</pre>\n"; } if ($opmltree['tag'] === 'opml') { $head = $opml->getOPMLHead($opmltree); $ownerName = $opml->getOPMLTag($head, 'ownerName'); $blogrolling = $ownerName != false ? $ownerName['value'] == 'Blogroll Owner' ? true : false : false; $i = 0; $content = ''; while (($showAll || $i < $number) && ($item = $opml->getOPMLOutlineAttr($opmltree, $i))) { if (!empty($item['url'])) { $url = $this->decode($item['url']); } elseif (!empty($item['htmlUrl'])) { $url = $this->decode($item['htmlUrl']); } elseif (!empty($item['xmlUrl'])) { $url = $this->decode($item['xmlUrl']); } elseif (!empty($item['urlHTTP'])) { $url = $this->decode($item['urlHTTP']); } else { $url = ''; } if (!empty($item['text'])) { $text = serendipity_specialchars($this->decode($item['text'])); } elseif (!empty($item['title'])) { $text = serendipity_specialchars($this->decode($item['title'])); } elseif (!empty($item['description'])) { $text = serendipity_specialchars($this->decode($item['description'])); } else { $text = ''; } if ($blogrolling === true && (!empty($text) || !empty($url))) { $content .= '• <a href="' . serendipity_specialchars($url) . '" ' . (!empty($target) ? 'target="' . $target . '"' : '') . ' title="' . $text . '">' . $text . "</a>"; if (isset($item['isRecent'])) { $content .= ' <span style="color: Red; ">*</span>'; } $content .= "<br />"; } elseif (isset($item['type']) && $item['type'] == 'url' || !empty($url)) { $content .= '• <a href="' . serendipity_specialchars($url) . '" ' . (!empty($target) ? 'target="' . $target . '"' : '') . ' title="' . $text . '">' . $text . "</a>"; $content .= "<br />"; } ++$i; } /* Pretend to be a html_nugget so we can apply markup events. */ if ($markup == 'true') { $entry = array('html_nugget' => $content); serendipity_plugin_api::hook_event('frontend_display', $entry); $content = $entry['html_nugget']; } $fp = @fopen($feedcache, 'w'); if (trim($content) != '' && $fp) { fwrite($fp, $content); fclose($fp); } else { echo '<!-- Cache failed to ' . $feedcache . ' in ' . getcwd() . ' --><br />'; if (trim($content) == '') { $content = @file_get_contents($feedcache); } } } else { echo '<!-- Not a valid OPML feed -->'; } } else { echo '<!-- no valid feedtype -->'; } } else { $this->debug('Got feed from cache ' . $feedcache); $content = file_get_contents($feedcache); } echo $content; } else { echo PLUGIN_REMOTERSS_NOURI; } }
return true; } function generate_content(&$title) { global $serendipity; $title = $this->get_config('sidebarTitle'); $deliciousID = $this->get_config('deliciousID'); $moreLink = $this->get_config('moreLink'); if (empty($deliciousID)) { return false; } if ($this->get_config('displayNumber') < 30 && $this->get_config('displayNumber') >= 1) { $displayNumber = $this->get_config('displayNumber'); } else { $displayNumber = 30; } if ($this->get_config('cacheTime') > 0) { $cacheTime = $this->get_config('cacheTime') * 3600; } else { $cacheTime = 3600 + 1; } $gDeliciousURL = 'http://del.icio.us/'; $gDeliciousCacheLoc = $serendipity['serendipityPath'] . '/templates_c/delicious_'; // safe write location... need to have local abilit $parsedCache = $gDeliciousCacheLoc . md5($deliciousID) . '.cache'; if (!is_file($parsedCache) || mktime() - filectime($parsedCache) > $cacheTime) { if (!is_dir($gDeliciousCacheLoc) && !mkdir($gDeliciousCacheLoc, 0775)) { print 'Try to chmod go+rwx - permissions are wrong.'; } require_once 'Onyx/RSS.php'; $deliciousFeed = new Onyx_RSS(); //$deliciousFeed->setCachePath($gDeliciousCacheLoc); //$deliciousFeed->setExpiryTime($cacheTime); //$deliciousFeed->parse($gDeliciousURL .'rss/' . $deliciousID, md5($deliciousID) . '.dat'); $deliciousFeed->parse($gDeliciousURL . 'rss/' . $deliciousID); if ($deliciousFeed->numItems() >= 1) { $fileHandle = @fopen($parsedCache, 'w'); if ($fileHandle) { $deliciousContent = '<ul class="plainList">'; for ($i = 0; ($item = $deliciousFeed->getNextItem()) && $i < $displayNumber; $i++) { $deliciousContent .= '<li>' . '<a href="' . delicious_clean_htmlspecialchars($item['link']) . '" title="' . $item['description'] . '" rel="external">' . delicious_clean_htmlspecialchars($item['title']) . '</a></li>'; } $deliciousContent .= '</ul>'; fwrite($fileHandle, $deliciousContent); fclose($fileHandle); print $deliciousContent; } else { print '<p>A del.icio.us error occured! <br />' . 'Error Message: unable to make a delicious cache file: ' . $parsedCache . '!</p>'; } } elseif (is_file($parsedCache)) { print file_get_contents($parsedCache); } else { print '<p>A del.icio.us error occured! <br />' . 'Error Message: rss failed</p>'; } } else { print file_get_contents($parsedCache); } if (serendipity_db_bool($moreLink)) { print '<p><a href="' . $gDeliciousURL . $deliciousID . '/">' . $this->get_config('morelink_text') . '</a></p>';
function fetchFeeds($opt = null) { global $serendipity; set_time_limit(360); ignore_user_abort(true); $_SESSION['serendipityRightPublish'] = true; $serendipity['noautodiscovery'] = true; $this->setupDB(); $feeds = $this->getFeeds($opt); $engine = $this->get_config('engine', 'onyx'); if ($engine == 'onyx') { require_once (defined('S9Y_PEAR_PATH') ? S9Y_PEAR_PATH : S9Y_INCLUDE_PATH . 'bundled-libs/') . 'Onyx/RSS.php'; } elseif ($engine == 'magpierss') { // CLSC: NEW "MagpieRSS" include require_once dirname(__FILE__) . '/magpierss/rss_fetch.inc'; } elseif ($engine == 'simplepie') { //hwa: NEW "SimplePie" include require_once dirname(__FILE__) . '/simplepie/simplepie.inc'; } $cache_authors = array(); $cache_entries = array(); $cache_md5 = array(); $sql_cache_authors = serendipity_db_Query("SELECT authorid, realname\n FROM {$serendipity['dbPrefix']}authors"); if (is_array($sql_cache_authors)) { foreach ($sql_cache_authors as $idx => $author) { $cache_authors[$author['realname']] = $author['authorid']; } } if ($this->debug) { printf("DEBUG: cache_authors['realname'] = authorid has %d entries\n", count($cache_authors)); } if ($opt['store_seperate']) { $sql_cache_entries = serendipity_db_query("SELECT e.feedid, e.id, e.entrydate, e.entrytitle\n FROM {$serendipity['dbPrefix']}aggregator_feedlist AS e"); if (is_array($sql_cache_entries)) { foreach ($sql_cache_entries as $idx => $entry) { $cache_entries[$entry['entrytitle']][$entry['feedid']][$entry['entrydate']] = $entry['id']; } } } else { $sql_cache_entries = serendipity_db_query("SELECT e.id, e.timestamp, e.authorid, e.title, ep.value\n FROM {$serendipity['dbPrefix']}entries AS e,\n {$serendipity['dbPrefix']}entryproperties AS ep\n WHERE e.id = ep.entryid\n AND ep.property = 'ep_aggregator_feed'"); if (is_array($sql_cache_entries)) { foreach ($sql_cache_entries as $idx => $entry) { $cache_entries[$entry['title']][$entry['authorid']][$entry['timestamp']] = $entry['id']; } } } if ($this->debug) { printf("DEBUG: cache_entries['title']['authorid']['timestamp'] = entryid has %d entries.\n", count($cache_entries)); } $sql_cache_md5 = serendipity_db_query("SELECT entryid, md5, timestamp\n FROM {$serendipity['dbPrefix']}aggregator_md5"); if (is_array($sql_cache_md5)) { foreach ($sql_cache_md5 as $idx => $entry) { $cache_md5[$entry['md5']]['entryid'] = $entry['entryid']; $cache_md5[$entry['md5']]['timestamp'] = $entry['timestamp']; } } if ($this->debug) { printf("DEBUG: cache_md5['md5'] = entryid has %d entries.\n", count($cache_md5)); } foreach ($feeds as $feed) { if (!$opt['store_seperate']) { printf("Read %s.\n", $feed['feedurl']); } flush(); $feed_authorid = $cache_authors[$feed['feedname']]; if (empty($feed_authorid)) { $feed_authorid = 0; } if ($this->debug) { printf("DEBUG: Current authorid = %d\n", $feed_authorid); } $stack = array(); if ($engine == 'onyx') { if (empty($feed['charset'])) { $this->checkCharset($feed); } # test multiple likely charsets $charsets = array($feed['charset'], "ISO-8859-1", "utf-8"); $retry = false; foreach ($charsets as $ch) { if ($retry) { printf("DEBUG: Retry with charset %s instead of %s\n", $ch, $feed['charset']); } $retry = true; $c = new Onyx_RSS($ch); # does it parse? if so, all is fine... if ($c->parse($feed['feedurl'])) { break; } } while ($item = $c->getNextItem()) { /* Okay this is where things get tricky. Everybody * encodes their information differently. For now I'm going to focus on * s9y weblogs. */ $fake_timestamp = false; $date = $this->parseDate($item['pubdate']); if ($this->debug) { printf("DEBUG: pubDate %s = %s\n", $item['pubdate'], $date); } if ($date == -1) { // Fallback to try for dc:date $date = $this->parseDate($item['dc:date']); if ($this->debug) { printf("DEBUG: falling back to dc:date % s= %s\n", $item['dc:date'], $date); } } if ($date == -1) { // Couldn't figure out the date string. Set it to "now" and hope that the md5hash will get it. $date = time(); $fake_timestamp = true; if ($this->debug) { printf("DEBUG: falling back to time() = %s\n", $date); } } if (empty($item['title'])) { if ($this->debug) { printf("DEBUG: skip item: title was empty for %s\n", print_r($item, true)); } continue; } $this->decode($c->rss['encoding'], $item); $item['date'] = $date; $stack[] = $item; } } elseif ($engine == 'magpierss') { // ---------------------------------------------------------- // CLSC: New MagpieRSS code start // ---------------------------------------------------------- $rss = fetch_rss($feed['feedurl']); foreach ($rss->items as $item) { $fake_timestamp = false; $date = $item['pubdate']; if ($this->debug) { printf("DEBUG: pubdate = %s\n", $item['pubdate'], $date); } // ---------------------------------------------------------- // CLSC: Try a few different types of timestamp fields // So that we might get lucky even with non-standard feeds // ---------------------------------------------------------- if ($date == "") { // CLSC: magpie syntax for nested fields $date = $item['dc']['date']; if ($this->debug) { printf("DEBUG: falling back to [dc][date] = %s\n", $item['dc:date'], $date); } } if ($date == "") { $date = $item['modified']; if ($this->debug) { printf("DEBUG: falling back to modified = %s\n", $item['modified'], $date); } } if ($date == "") { $date = $item['PubDate']; if ($this->debug) { printf("DEBUG: falling back PubDate = %s\n", $item['PubDate'], $date); } } if ($date == "") { $date = $item['created']; if ($this->debug) { printf("DEBUG: falling back to created = %s\n", $item['created'], $date); } } if ($date == "") { // CLSC: not proper magpie syntax but still catches some $date = $item['dc:date']; if ($this->debug) { printf("DEBUG: falling back to dc:date = %s\n", $item['dc:date'], $date); } } if ($date == "") { $date = $item['updated']; if ($this->debug) { printf("DEBUG: falling back to updated = %s\n", $item['updated'], $date); } } if ($date == "") { $date = $item['published']; if ($this->debug) { printf("DEBUG: falling back to published = %s\n", $item['published'], $date); } } if ($date == "") { // ---------------------------------------------------------- // CLSC: If none of the above managed to identify a date: // Set date to "now" and hope that the md5hash will get it. // ---------------------------------------------------------- $date = time(); $fake_timestamp = true; if ($this->debug) { printf("DEBUG: falling back to time() = %s\n", $date); } } // CLSC: if date is set to "now" parseDate can't parse it. if ($fake_timestamp != true) { $date = $this->parseDate($date); } if ($item['title'] == "") { if ($this->debug) { printf("DEBUG: skip item: title was empty for %s\n", print_r($item, true)); } continue; } $item['date'] = $date; $stack[] = $item; // ---------------------------------------------------------- // CLSC: New MagpieRSS code end // ---------------------------------------------------------- } } elseif ($engine == 'simplepie') { // hwa: new SimplePie code ; lifted from the SimplePie demo $simplefeed = new SimplePie(); $simplefeed->cache = false; $simplefeed->set_feed_url($feed['feedurl']); // Initialize the whole SimplePie object. Read the feed, process it, parse it, cache it, and // all that other good stuff. The feed's information will not be available to SimplePie before // this is called. $success = $simplefeed->init(); // We'll make sure that the right content type and character encoding gets set automatically. // This function will grab the proper character encoding, as well as set the content type to text/html. $simplefeed->set_output_encoding(LANG_CHARSET); $simplefeed->handle_content_type(); $item['new_feedicon'] = $simplefeed->get_favicon(); // error handling if ($simplefeed->error()) { if (!$opt['store_seperate']) { printf('<p><b>ERROR:</b> ' . (function_exists('serendipity_specialchars') ? serendipity_specialchars($simplefeed->error()) : htmlspecialchars($simplefeed->error(), ENT_COMPAT, LANG_CHARSET)) . "</p>\r\n"); } } if ($success) { foreach ($simplefeed->get_items() as $simpleitem) { // map SimplePie items to s9y items $item['title'] = $simpleitem->get_title(); $item['date'] = $simpleitem->get_date('U'); $item['pubdate'] = $simpleitem->get_date('U'); $item['description'] = $simpleitem->get_description(); $item['content'] = $simpleitem->get_content(); $item['link'] = $simpleitem->get_permalink(); $item['author'] = $simpleitem->get_author(); //if ($this->debug) { // printf("DEBUG: SimplePie item: author: $item['author'], title: $item['title'], date: $item['date']\n"); //} $stack[] = $item; } } else { if (!$opt['store_seperate']) { printf('<p><b>ERROR:</b> ' . print_r($success, true) . "</p>\r\n"); } } } while (list($key, $item) = each($stack)) { if ($opt['store_seperate']) { $ep_id = $cache_entries[$item['title']][$feed['feedid']][$item['date']]; if ($this->debug) { printf("DEBUG: lookup cache_entries[%s][%s][%s] finds %s.\n", $item['title'], $feed['feedid'], $item['date'], empty($ep_id) ? "nothing" : $ep_id); } } else { $ep_id = $cache_entries[$item['title']][$feed_authorid][$item['date']]; if ($this->debug) { printf("DEBUG: lookup cache_entries[%s][%s][%s] finds %s.\n", $item['title'], $feed_authorid, $item['date'], empty($ep_id) ? "nothing" : $ep_id); } } if (!empty($ep_id) and serendipity_db_bool($this->get_config('ignore_updates'))) { if ($this->debug) { printf("DEBUG: entry %s is known and ignore_updates is set.\n", $ep_id); } continue; } # NOTE: If $ep_id is NULL or EMPTY, it means that an entry with this title does not # yet exist. Later on we check if a similar entry with the body exists and skip # updates in this case. Else it means that the new entry needs to be inserted # as a new one. # The entry is probably new? $entry = array('id' => $ep_id, 'title' => $item['title'], 'timestamp' => $item['date'], 'extended' => '', 'isdraft' => serendipity_db_bool($this->get_config('publishflag')) ? 'false' : 'true', 'allow_comments' => serendipity_db_bool($this->get_config('allow_comments')) ? 'true' : 'false', 'categories' => $feed['categoryids'], 'author' => $feed['feedname'], 'authorid' => $feed_authorid); // ---------------------------------------------------------- // CLSC: Added a few flavours if ($item['content:encoded']) { $entry['body'] = $item['content:encoded']; } elseif ($item['description']) { $entry['body'] = $item['description']; } elseif ($item['content']['encoded']) { $entry['body'] = $item['content']['encoded']; } elseif ($item['atom_content']) { $entry['body'] = $item['atom_content']; } elseif ($item['content']) { $entry['body'] = $item['content']; } $md5hash = md5($feed_authorid . $item['title'] . $entry['body']); # Check 1: Have we seen this MD5? if ($this->debug) { printf("DEBUG: lookup cache_md5[%s] finds %s.\n", $md5hash, empty($cache_md5[$md5hash]) ? "nothing" : $cache_md5[$md5hash]['entryid']); } # If we have this md5, title and body for this article # are unchanged. We do not need to do anything. if (isset($cache_md5[$md5hash])) { continue; } # Check 2 (conditional: expire enabled?): # Is this article too old? if ($this->get_config('expire') > 0) { $expire = time() - 86400 * $this->get_config('expire'); if ($item['date'] < $expire) { if ($this->debug) { printf("DEBUG: '%s' is too old (%s < %s).\n", $item['title'], $item['date'], $expire); } continue; } } # Check 3: Does this article match our expressions? if (!empty($feed['match_expression'])) { $expressions = explode("~", $feed['match_expression']); $match = 0; foreach ($expressions as $expression) { $expression = ltrim(rtrim($expression)); if (preg_match("~{$expression}~imsU", $entry['title'] . $entry['body'])) { $match = 1; } } if ($match == 0) { continue; } } $feed['articleurl'] = $item['link']; if ($item['author']) { $feed['author'] = $item['author']; } elseif ($item['dc:creator']) { $feed['author'] = $item['dc:creator']; } // Store as property // Plugins might need this. $serendipity['POST']['properties'] = array('fake' => 'fake'); $markups = explode('^', $this->get_config('markup')); if (is_array($markups)) { foreach ($markups as $markup) { $serendipity['POST']['properties']['disable_markups'][] = $markup; } } if ($opt['store_seperate']) { if ($entry['id'] > 0) { serendipity_db_query("UPDATE {$serendipity['dbPrefix']}aggregator_feedlist \n SET feedid = '" . $feed['feedid'] . "',\n categoryid = '" . $feed['categoryids'][0] . "',\n entrydate = '" . serendipity_db_escape_string($entry['timestamp']) . "',\n entrytitle = '" . serendipity_db_escape_string($entry['title']) . "',\n entrybody = '" . serendipity_db_escape_string($entry['body']) . "',\n entryurl = '" . serendipity_db_escape_string($item['link']) . "'\n WHERE id = " . $entry['id']); $entryid = $entry['id']; } else { serendipity_db_query("INSERT INTO {$serendipity['dbPrefix']}aggregator_feedlist (\n feedid,\n categoryid,\n entrydate,\n entrytitle,\n entrybody,\n entryurl\n ) VALUES (\n '" . $feed['feedid'] . "',\n '" . $feed['categoryids'][0] . "',\n '" . serendipity_db_escape_string($entry['timestamp']) . "',\n '" . serendipity_db_escape_string($entry['title']) . "',\n '" . serendipity_db_escape_string($entry['body']) . "',\n '" . serendipity_db_escape_string($item['link']) . "'\n )"); $entryid = serendipity_db_insert_id(); } $this->feedupdate_finish($feed, $entryid); } else { $entryid = serendipity_updertEntry($entry); $this->insertProperties($entryid, $feed, $md5hash); } if (!$opt['store_seperate']) { printf(" Save '%s' as %s.\n", $item['title'], $entryid); } } if (!$opt['store_seperate']) { printf("Finish feed.\n"); } } if (!$opt['store_seperate']) { printf("Finish planetarium.\n"); } }
function import() { global $serendipity; if (serendipity_db_bool($this->data['wpxrss'])) { return $this->import_wpxrss(); } $c = new Onyx_RSS($this->data['charset']); $c->parse($this->data['url']); $this->data['encoding'] = $c->rss['encoding']; $serendipity['noautodiscovery'] = 1; while ($item = $c->getNextItem()) { $entry = array(); if ($this->buildEntry($item, $entry)) { serendipity_updertEntry($entry); } } return true; }
function readRssRemote($url) { $this->log("Fetchig remote rss from: " . $url); require_once (defined('S9Y_PEAR_PATH') ? S9Y_PEAR_PATH : S9Y_INCLUDE_PATH . 'bundled-libs/') . 'HTTP/Request.php'; $req = new HTTP_Request($url, array('allowRedirects' => true, 'maxRedirects' => 3)); if (PEAR::isError($req->sendRequest()) || $req->getResponseCode() != '200') { $this->log("Error reading {$url}"); return; } # Fetch html content: $data = $req->getResponseBody(); $this->log("Have data!"); // Check if page defines a RSS link $matches = array(); if (preg_match('@<link[^>]*? type="application/rss\\+xml"[^>]*? href="([^"]*?)"@Usi', $data, $matches)) { $this->log("rss link found, matches: " . print_r($matches[1], TRUE)); $rssUrl = $matches[1]; } else { $this->log("rss link not found"); return; } // Now fetch the RSS feed: require_once (defined('S9Y_PEAR_PATH') ? S9Y_PEAR_PATH : S9Y_INCLUDE_PATH . 'bundled-libs/') . 'Onyx/RSS.php'; # test multiple likely charsets $charsets = array("utf-8", "ISO-8859-1"); $retry = false; foreach ($charsets as $ch) { if ($retry) { $this->log("Retrying charset {$ch}"); } $retry = true; $rss = new Onyx_RSS($ch); # does it parse? if so, all is fine... if ($rss->parse($rssUrl)) { break; } } $articles = array(); $itemCount = 0; $maxItems = $announcerssmax = $this->get_config('announcerssmax', 3); // Iterate the items while ($item = $rss->getNextItem()) { if ($itemCount >= $maxItems) { break; } $article = array(); $article['title'] = $item['title']; $hash = $this->hashString($item['title'] . $item['link']); $article['url'] = $hash . "\n" . $item['title'] . "\n" . $item['link']; $article['nohashUrl'] = $item['link']; $articles[] = $article; $itemCount++; } $result['articles'] = $articles; $result['url'] = $url; return $result; }
function event_hook($event, &$bag, &$eventData, $addData = null) { global $serendipity; $hooks =& $bag->get('event_hooks'); if (isset($hooks[$event])) { switch ($event) { case 'backend_frontpage_display': $number = $this->get_config('number'); $title = $this->get_config('title'); $rssuri = $this->get_config('rssuri'); $target = $this->get_config('target'); $cachetime = $this->get_config('cachetime'); echo '<h3>' . $title . '</h3>'; if (!$number || !is_numeric($number) || $number < 1) { $showAll = true; } else { $showAll = false; } if (!$target || strlen($target) < 1) { $target = '_blank'; } if (!$cachetime || !is_numeric($cachetime)) { $cachetime = 10800; // 3 hours in seconds } if (trim($rssuri)) { $feedcache = $serendipity['serendipityPath'] . 'archives/remoterss_cache_' . preg_replace('@[^a-z0-9]*@i', '', $rssuri) . '.dat'; if (!file_exists($feedcache) || filesize($feedcache) == 0 || filemtime($feedcache) < time() - $cachetime) { require_once 'bundled-libs/Onyx/RSS.php'; $c = new Onyx_RSS(); $c->parse($rssuri); $i = 0; $content = '<ul>'; while (($showAll || $i < $number) && ($item = $c->getNextItem())) { if (empty($item['title'])) { continue; } $content .= '<li><a href="' . $this->decode($item['link']) . '" target="' . $target . '">'; $content .= $this->decode($item['title']) . '</a></li>'; ++$i; } $content .= '</ul>'; $fp = @fopen($feedcache, 'w'); if ($fp) { fwrite($fp, $content); fclose($fp); } else { echo '<!-- Cache failed to ' . $feedcache . ' in ' . getcwd() . ' -->'; } } else { $content = file_get_contents($feedcache); } echo $content; } else { echo PLUGIN_REMOTERSS_NOURI; } break; default: return false; break; } } else { return false; } }