From eaf50adda987c0782daea8cd5a6c506b6db91db6 Mon Sep 17 00:00:00 2001 From: lsces Date: Wed, 25 Mar 2026 10:19:05 +0000 Subject: Tidy RSSLib to correct file name for bitweaver autoloader --- admin/admin_rssmodules.php | 5 +- includes/classes/RSSLib.php | 331 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 334 insertions(+), 2 deletions(-) create mode 100644 includes/classes/RSSLib.php diff --git a/admin/admin_rssmodules.php b/admin/admin_rssmodules.php index 6e5819d..36ca937 100644 --- a/admin/admin_rssmodules.php +++ b/admin/admin_rssmodules.php @@ -8,10 +8,11 @@ // Initialization require_once( '../../kernel/includes/setup_inc.php' ); -include_once( RSS_PKG_PATH.'rss_lib.php' ); + +use Bitweaver\Rss\RSSLib; if( !isset( $rsslib ) ) { - $rsslib = new RssLib(); + $rsslib = new RSSLib(); } $gBitSystem->verifyPermission( 'p_admin' ); diff --git a/includes/classes/RSSLib.php b/includes/classes/RSSLib.php new file mode 100644 index 0000000..3267ee4 --- /dev/null +++ b/includes/classes/RSSLib.php @@ -0,0 +1,331 @@ +mDb->convertSortmode($sort_mode); + $query_cant = "select count(*) from `".BIT_DB_PREFIX."rss_modules` $mid"; + $result = $this->mDb->query($query,$bindvars,$max_records,$offset); + $cant = $this->mDb->getOne($query_cant,$bindvars); + $ret = []; + + while ($res = $result->fetchRow()) { + $res["minutes"] = $res["refresh"] / 60; + + $ret[] = $res; + } + + $retval = []; + $retval["data"] = $ret; + $retval["cant"] = $cant; + return $retval; + } + + public function replace_rss_module($rss_id, $name, $description, $url, $refresh, $show_title, $show_pub_date) { + $ret = FALSE; + if( is_numeric( $rss_id ) ) { + //if($this->rss_module_name_exists($name)) return false; // TODO: Check the name + $refresh = 60 * $refresh; + + if ($rss_id) { + $query = "update `".BIT_DB_PREFIX."rss_modules` set `name`=?,`description`=?,`refresh`=?,`url`=?,`show_title`=?,`show_pub_date`=? where `rss_id`=?"; + $bindvars= [ $name, $description, $refresh, $url, $show_title, $show_pub_date, $rss_id ]; + } else { + // was: replace into, no clue why. + $query = "insert into `".BIT_DB_PREFIX."rss_modules`(`name`,`description`,`url`,`refresh`,`content`,`last_updated`,`show_title`,`show_pub_date`) + values(?,?,?,?,?,?,?,?)"; + $bindvars= [ $name, $description, $url, $refresh, '', 1000000, $show_title, $show_pub_date ]; + } + + $result = $this->mDb->query($query,$bindvars); + $ret = true; + } + return $ret; + } + + public function remove_rss_module($rss_id) { + $ret = FALSE; + if( is_numeric( $rss_id ) ) { + $query = "delete from `".BIT_DB_PREFIX."rss_modules` where `rss_id`=?"; + + $result = $this->mDb->query($query,array($rss_id)); + $ret = true; + } + return $ret; + } + + public function get_rss_module($rss_id) { + $ret = FALSE; + if( is_numeric( $rss_id ) ) { + $query = "select * from `".BIT_DB_PREFIX."rss_modules` where `rss_id`=?"; + + $result = $this->mDb->query($query,array($rss_id)); + + if (!$result->numRows()) + return false; + + $ret = $result->fetchRow(); + } + return $ret; + } + + public function startElementHandler($parser, $name, $attribs) { + if ($this->flag) { + $this->buffer .= '<' . $name . '>'; + } + + if ($name == 'item' || $name == 'items') { + $this->flag = 1; + } + } + + public function endElementHandler($parser, $name) { + if ($name == 'item' || $name == 'items') { + $this->flag = 0; + } + + if ($this->flag) { + $this->buffer .= ''; + } + } + + public function characterDataHandler($parser, $data) { + if ($this->flag) { + $this->buffer .= $data; + } + } + + public function refresh_rss_module($rss_id) { + $info = $this->get_rss_module($rss_id); + + if ($info) { + global $gBitSystem; + $data = $this->rss_iconv( KernelTools::bit_http_request($info['url'])); + $now = $gBitSystem->getUTCTime(); + $query = "update `".BIT_DB_PREFIX."rss_modules` set `content`=?, `last_updated`=? where `rss_id`=?"; + $result = $this->mDb->query($query,array((string)$data,(int) $now, (int) $rss_id)); + return $data; + } else { + return false; + } + } + + public function rss_module_name_exists($name) { + $query = "select `name` from `".BIT_DB_PREFIX."rss_modules` where `name`=?"; + + $result = $this->mDb->query($query,array($name)); + return $result->numRows(); + } + + public function get_rss_module_id($name) { + $query = "select `rss_id` from `".BIT_DB_PREFIX."rss_modules` where `name`=?"; + + $id = $this->mDb->getOne($query,array($name)); + return $id; + } + + public function get_rss_show_title($rss_id) { + $ret = FALSE; + if( is_numeric( $rss_id ) ) { + $query = "select `show_title` from `".BIT_DB_PREFIX."rss_modules` where `rss_id`=?"; + + $ret = $this->mDb->getOne($query,array($rss_id)); + } + return $ret; + } + + public function get_rss_show_pub_date($rss_id) { + $ret = FALSE; + if( is_numeric( $rss_id ) ) { + $query = "select `show_pub_date` from `".BIT_DB_PREFIX."rss_modules` where `rss_id`=?"; + + $show_pub_date = $this->mDb->getOne($query,array($rss_id)); + $ret = $show_pub_date; + } + return $ret; + } + + public function rss_iconv($xmlstr, $tencod = "UTF-8") { + if (preg_match("/<\?xml.*encoding=\"(.*)\".*\?>/", $xmlstr, $xml_head)) { + $sencod = strtoupper($xml_head[1]); + + switch ($sencod) { + case "ISO-8859-1": + // Use utf8_encode a more standard function + $xmlstr = mb_convert_encoding($xmlstr, "UTF-8", mb_detect_encoding($xmlstr)); + + break; + + case "UTF-8": + case "US-ASCII": + // UTF-8 and US-ASCII don't need convertion + break; + + default: + // Not supported encoding, we must use iconv() or recode() + if (function_exists('iconv')) { + // We have iconv use it + $new_xmlstr = @iconv($sencod, $tencod, $xmlstr); + + if ($new_xmlstr === FALSE) { + // in_encod -> out_encod not supported, may be misspelled encoding + $sencod = strtr($sencod, array( + "-" => "", + "_" => "", + " " => "" + )); + + $new_xmlstr = @iconv($sencod, $tencod, $xmlstr); + + if ($new_xmlstr === FALSE) { + // in_encod -> out_encod not supported, leave it + $tencod = $sencod; + + break; + } + } + + $xmlstr = $new_xmlstr; + // Fix an iconv bug, a few garbage chars beyound xml... + $xmlstr = preg_replace("/(.*<\/rdf:RDF>).*/s", "\$1", $xmlstr); + } elseif (function_exists('recode_string')) { + // I don't have recode support could somebody test it? + $xmlstr = @recode_string("$sencod..$tencod", $xmlstr); + } else { + // This PHP intallation don't have any EncodConvFunc... + // somebody could create bit_iconv(...)? + } + } + + // Replace header, put the new encoding + $xmlstr = preg_replace("/(<\?xml.*)encoding=\".*\"(.*\?>)/", "\$1 encoding=\"$tencod\"\$2", $xmlstr); + } + + return $xmlstr; + } + + public function get_short_desc( $text ){ + // first we can remove unwanted stuff like images and lists or whatever - this is rough + $pattern = array( + "!]*>!is", + //"!!is", + ); + $text = preg_replace( $pattern, "", $text ); + + $text = substr($text, 0, 1000); + + // now we strip remaining tags and xs whitespace + $text = trim( preg_replace( "!\s+!s", " ", strip_tags( $text ))); + + // finally we try to extract sentences as well as we can + // to add more characters to split sentences by add them after the last \? - you might want to add : or ; + preg_match_all( "#([\.!\?\s\)]*)(.*?[a-zA-Z][2]\s*[\.\!\?]+\)?)#s", $text, $matches ); + + return $matches[2]; + } + + public function get_short_descs( $items, $length=1 ){ + $shortdescs = Array(); + + if ( !empty($items) ){ + foreach ($items as $item){ + //we try to trim each story to given number of sentences + $sentences = $this->get_short_desc( $item->get_description() ); + + $shortdesc = NULL; + for ($n = 0; $n < $length; $n++){ + $space = ($n > 0)?" ":NULL; + $shortdesc .= $space; + $shortdesc .= ( !empty( $sentences[$n] ) && $sentences[$n] != NULL ) ? $sentences[$n] : NULL; + } + + $shortdescs[] = $shortdesc; + } + } + + return $shortdescs; + } + + public function parse_feeds( $pParamHash ){ + //set path to rss feed cache + $cache_path = TEMP_PKG_PATH.'rss/simplepie'; + + //we do this earlier instead of later because if we can't cache the source we shouldn't be pulling the rss feed. + if( !is_dir( $cache_path ) && !KernelTools::mkdir_p( $cache_path ) ) { + \Bitweaver\bit_error_log( 'Can not create the cache directory: '.$cache_path ); + + return FALSE; + }else{ + //load up parser SimplePie + require_once( UTIL_PKG_INCLUDE_PATH.'simplepie/simplepie.php' ); + + $ids = ( !is_array( $pParamHash['id'] ) ) ? explode( ",", $pParamHash['id'] ) : $pParamHash['id']; + + $urls = []; + + foreach ($ids as $id){ + if( @BitBase::verifyId( $id ) ) { + $feedHash = $this->get_rss_module( $id ); + $urls[] = $feedHash['url']; + }else{ + //todo assign this as an error + //$repl = 'rss can not be found, id must be a number'; + } + } + $feed = new SimplePie(); + + //Instead of only passing in one feed url, we'll pass in an array of multiple feeds + $feed->set_feed_url( $urls ); + + $feed->set_cache_location( $cache_path ); + + //set cache time + $cache_time = !empty($pParamHash['cache_time'])?$pParamHash['cache_time']:1; + $feed->set_cache_duration( $cache_time ); + + //not sure - we may want to eventually use this + //$feed->set_stupidly_fast(TRUE); + + // Initialize the feed object + $feed->init(); + + // This will work if all of the feeds accept the same settings. + $feed->handle_content_type(); + + $items = $feed->get_items(); + + return $items; + } + } +} -- cgit v1.3