Your IP : 216.73.216.240
<?php
/**
* TsGrabber - Grabber RSS feeds
* @version 1.0.0
* @package TsGrabber
* @author Tsiba Oleksandr
* @email info@tsiba.net
* @copyright (C) 2012 tsiba.net - All rights reserved
* @license GNU/GPL: http://www.gnu.org/copyleft/gpl.html
*
**/
defined('_JEXEC') or die;
class plgSystemTsgrabber extends JPlugin
{
function onAfterInitialise()
{
//die('Plugin');
jimport('joomla.filesystem.file');
$filename = JPATH_SITE.DS.'process.php';
jimport('tsgrabber.settings');
$Settings = new TSSettings();
if(($Settings->block==0) || ($Settings->updatefeeds!='')){//Если не блокированна работа
/*
* 1. Ищем ленты не использующие глобальные настройки
* 1.1 Ленты с обновлением каждую загрузку
* 1.2 Ленты с обновлением в единицу времени
* 2. Среди лент использующих глобальные настройки
* 2.1 Обновление каждую загрузку
* 2.2 Обновление в единицу времени
*/
//1.0 Ленты с ручного обновления
if($Settings->updatefeeds!=''){
$feeds10 = unserialize($Settings->updatefeeds);
$Settings->updatefeeds = '';
$Settings->save();
}
/*if((time()-strtotime($Settings->lastupdate))<($Settings->minutes*60) && (count($feeds10)==0)){
return true;
}
*
*/
//1.1 Ленты с обновлением каждую загрузку
$db =& JFactory::getDBO();
$query = "SELECT `id` FROM `#__tsgrabber_feeds` WHERE (`update`='1') and (`block`='0') ORDER BY `id` ASC";
$db->setQuery($query);
$feeds11 = $db->loadObjectList();
//1.2 Ленты с обновлением в единицу времени
$db =& JFactory::getDBO();
$query = "SELECT `id`,`lastupdate`,`minutes` FROM `#__tsgrabber_feeds` WHERE (`update`='2') and (`block`='0') ORDER BY `id` ASC";
$db->setQuery($query);
$feeds = $db->loadObjectList();
if(count($feeds)>0)
foreach ($feeds as $feed){
if((time()-strtotime($feed->lastupdate))>($feed->minutes*60)){
$feeds12[]=$feed;
}
}
//2.1 Обновление каждую загрузку
$db =& JFactory::getDBO();
$query = "SELECT `id`,`lastupdate`,`minutes` FROM `#__tsgrabber_feeds` WHERE (`update`='3') and (`block`='0') ORDER BY `id` ASC";
$db->setQuery($query);
$feeds = $db->loadObjectList();
if($Settings->update==1){
if(count($feeds)>0)
foreach ($feeds as $feed){
$feeds21[]=$feed;
}
}
//2.2 Обновление в единицу времени
if($Settings->update==2){
if((time()-strtotime($Settings->lastupdate))>($Settings->minutes*60)){
if(count($feeds)>0)
foreach ($feeds as $feed){
$feeds22[]=$feed;
}
}
}
$feeds = null;
if(count($feeds10)>0)
foreach ($feeds10 as $feed){
$feeds[]=$feed;
}
if(count($feeds11)>0)
foreach ($feeds11 as $feed){
$id = $feed->id;
$feeds[]=$id;
}
if(count($feeds12)>0)
foreach ($feeds12 as $feed){
$id = $feed->id;
$feeds[]=$id;
}
if(count($feeds21)>0)
foreach ($feeds21 as $feed){
$id = $feed->id;
$feeds[]=$id;
}
if(count($feeds22)>0)
foreach ($feeds22 as $feed){
$id = $feed->id;
$feeds[]=$id;
}
if($this->Grabb($feeds)){
return true;
} else{
return false;
}
}
}
function Grabb($feeds){
/*
$RG = new RssGrabber;
$RG->parserss($url);
die();
*/
jimport('tsgrabber.feeds');
jimport('tsgrabber.settings');
if(count($feeds)>0){
$urls = array();
foreach ($feeds as $feed){
$Feed = new TSFeed($feed);
$urls[] = $Feed->url;
$Feed = NULL;
}
$Curl = new TSCurl();
$Curl->urls = $urls;
$titlefeeds = $Curl->GetContent(5120);
$FEEDS=array();
$ConentMD5 = array();
foreach($feeds as $feed){
$Feed = new TSFeed($feed);
$item = mb_strstr($titlefeeds[$Feed->url], '<item');
$title = mb_strstr($item, '<title>');
$title = mb_substr($title, 7, mb_strpos($title, '</title>')-7);
$title = $this->FText($title);
$pubDate = mb_strstr($item, '<pubDate>');
$pubDate = mb_substr($pubDate, 9, mb_strpos($pubDate, '</pubDate>')-9);
$pubDate = $this->FText($pubDate,true);
$db =& JFactory::getDBO();
$query = "SELECT `md5` FROM `#__tsgrabber_content` WHERE `id_feed`='".$Feed->id."'";
$db->setQuery($query);
$CMD5 = $db->loadResultArray();
if(!in_array(md5($title.$pubDate), $CMD5)){
$FEEDS[] = $Feed;
$ConentMD5[$Feed->id]=$CMD5;
$Feed = null;
}else{
$Feed->lastupdate = date('Y-m-d H:i:s', time());
$Feed->save();
$Feed = null;
}
$Feed = NULL;
}
}
if(count($FEEDS)>0){
foreach ($FEEDS as $feed){
$Feed = new TSFeed($feed);
$urls[] = $Feed->url;
$Feed = NULL;
}
$Curl = new TSCurl();
$Curl->urls = $urls;
$content = $Curl->GetContent(0);
foreach ($FEEDS as $feed){
$Feed = new TSFeed($feed->id);
if(($Feed->url!='') && ($Feed->menu!=0)&& ($Feed->category!=0)){
$rss = simplexml_load_string($content[$Feed->url]);
if(count($rss->channel->item)>0)
foreach ($rss->channel->item as $item) {
$item->title=$this->FText($item->title);
$item->pubDate=$this->FText($item->pubDate, true);
if((!in_array(md5($item->title.$item->pubDate), $ConentMD5[$Feed->id]))
&& ($item->title!='')){ //ДОБАВЛЯЕМ МАТЕРИАЛ
$current_cat = $Feed->category;
if($item->category!=''){
$current_cat = $this->GetCategoryId($item->category, $Feed->category, $Feed->id, $Feed->menu, $Feed->menutype, $Feed->user);
}
$alias = TSFeed::truncateText($this->convert($item->title), 15, '-', '');
$text = '';
if($Feed->link=='1'){
$text = $text.$item->description.'<br><a href="'.$item->link.'" target="_blank">'.$Feed->linktext.'</a>';
}else{
$text = $item->description;
}
$text = mysql_escape_string($text);
$db =& JFactory::getDBO();
$query = 'INSERT INTO `#__content`
(`id`, `asset_id`, `title`, `alias`, `title_alias`,
`introtext`, `fulltext`, `state`, `sectionid`, `mask`,
`catid`, `created`, `created_by`, `created_by_alias`,
`modified`, `modified_by`, `checked_out`, `checked_out_time`,
`publish_up`, `publish_down`, `images`, `urls`, `attribs`,
`version`, `parentid`, `ordering`, `metakey`, `metadesc`,
`access`, `hits`, `metadata`, `featured`, `language`, `xreference`)
VALUES (NULL, "0", "'.$item->title.'", "'.$alias.'", "", "'.$text.'",
"", "'.$Feed->public.'", "0", "0", "'.$current_cat.'", "'.$item->pubDate.'", "'.$Feed->user.'", "",
"0000-00-00 00:00:00", "0", "0", "0000-00-00 00:00:00",
"0000-00-00 00:00:00", "0000-00-00 00:00:00", "", "", "",
"1", "0", "0", "", "", "1", "0", "", "'.$Feed->featured.'", "*", "");';
$db->setQuery($query);
$db->query();
$id_content = $db->insertid();
$this->SaveContent($Feed->id, $id_content, $current_cat, $item->pubDate, md5($item->title.$item->pubDate));
if($Feed->featured=='1'){
$db =& JFactory::getDBO();
$query = "SELECT `ordering`
FROM `#__content_frontpage`
WHERE 1
ORDER BY `ordering` DESC
LIMIT 0 , 1";
$db->setQuery($query);
$orders = $db->loadObjectList();
$db =& JFactory::getDBO();
$query = "INSERT INTO `#__content_frontpage` (
`content_id` ,
`ordering`
)
VALUES (
'".$id_content."', '".($orders[0]->ordering+1)."'
);";
$db->setQuery($query);
$db->query();
}
}
$CountAll++;
}
}
$Feed->lastupdate = date('Y-m-d H:i:s', time());
$Feed->save();
$Feed = NULL;
}
}
$Settings = new TSSettings();
if($Settings->update=='1'){
$Settings->lastupdate = date('Y-m-d H:i:s', time());
}
if(($Settings->update=='2') && (time()-strtotime($Settings->lastupdate))>($Settings->minutes*60)){
$Settings->lastupdate = date('Y-m-d H:i:s', time());
}
$Settings->save();
$Settings = NULL;
return true;
}
function GetCategoryId($cat, $id, $feed, $menu, $menutype, $user){
$cats = explode(',', $cat);
foreach ($cats as $category){
$iscat = false;
$db =& JFactory::getDBO();
$query = "SELECT `id`, `title` FROM `#__categories` WHERE `parent_id`='".$id."'";
$db->setQuery($query);
$categories = $db->loadObjectList();
$category = $this->FText($category);
foreach ($categories as $cat){
$cat->title = $this->FText($cat->title);
$title = mb_strtoupper($cat->title);
if($title==mb_strtoupper(trim($category))){
$iscat = true;
return $cat->id;
}
}
}
$category = $cats[0];
if($iscat==false){
$query = "SELECT `rgt` FROM `#__categories` WHERE `parent_id`='".$id."' ORDER BY `rgt` DESC";
$db->setQuery($query);
$rgts = $db->loadObjectList();
$rgt = $rgts[0]->rgt; //Порядок показа
$query = "SELECT `rgt` FROM `#__categories` WHERE `id`='".$id."'";
$db->setQuery($query);
$rgts = $db->loadObjectList();
$rgt_main = $rgts[0]->rgt; //Порядок показа главной категории
if($rgt==''){
$rgt = $rgt_main-1;
}
$query = "SELECT `level`,`path`,`params`,`metadata` FROM `#__categories` WHERE `id`='$id'";
$db->setQuery($query);
$levels = $db->loadObjectList();
$level = $levels[0]->level+1; //Уровень
$path = $levels[0]->path; //Путь
$params= $levels[0]->params; //Параметры
$metadata= $levels[0]->metadata; //Параметры
//Создаем новую категорию
$category = $this->FText($category);
$alias = strtolower($this->convert($category));
$path = $path.'/'.$alias;
$query = "INSERT INTO `#__categories`
(`id`, `asset_id`, `parent_id`, `lft`, `rgt`, `level`,
`path`, `extension`, `title`, `alias`, `note`, `description`,
`published`, `checked_out`, `checked_out_time`, `access`,
`params`, `metadesc`, `metakey`, `metadata`, `created_user_id`,
`created_time`, `modified_user_id`, `modified_time`, `hits`,
`language`)
VALUES (NULL, '0', '".$id."', '".($rgt+1)."', '".($rgt+2)."', '".$level."', '".$path."', 'com_content',
'".$category."', '".$alias."', '', '', '1', '0', '0000-00-00 00:00:00',
'1', '".$params."', '', '', '".$metadata."', '".$user."', '".date('Y-m-d H:i:s', time())."', '0', '0000-00-00 00:00:00',
'0', '*');";
$db->setQuery($query);
$db->query();
$id_new = $db->insertid();
$query = "SELECT `lft` FROM `#__categories` WHERE `parent_id`='".$id."' ORDER BY `rgt` ASC";
$db->setQuery($query);
$lfts = $db->loadObjectList();
$lft = $lfts[0]->lft;
$query = "UPDATE `#__categories` SET `lft` = '".($lft-1)."', `rgt` = '".($rgt_main+2)."'
WHERE `id` ='".$id."' ";
$db->setQuery($query);
$db->query(); //Для главной категории
$query = "SELECT `asset_id` FROM `#__categories` WHERE `id`='".$id."'";
$db->setQuery($query);
$assests = $db->loadObjectList();
$asset_id = $assests[0]->asset_id;
$query = "SELECT `rgt`,`level`,`parent_id` FROM `#__assets` WHERE `id`='".$asset_id."'";
$db->setQuery($query);
$assests = $db->loadObjectList();
$assest_rgt = $assests[0]->rgt;
$assest_level = $assests[0]->level;
$assest_parent_id = $assests[0]->parent_id;
$query = "INSERT INTO `#__assets`
(`id`, `parent_id`, `lft`, `rgt`, `level`, `name`,
`title`, `rules`) VALUES (NULL, '".$asset_id."', '".$assest_rgt."',
'".($assest_rgt+1)."', '".($assest_level+1)."', 'com_content.category.".$id_new."', '".$category."', '{\"core.create\":[],\"core.delete\":[],\"core.edit\":[],\"core.edit.state\":[],\"core.edit.own\":[]}');";
$db->setQuery($query);
$db->query();
$id_assest = $db->insertid();
$query = "UPDATE `#__categories` SET
`asset_id` = '".$id_assest."'
WHERE `id` = '".$id_new."'";
$db->setQuery($query);
$db->query();
$this->SaveCategory($feed, $id_new);
//Меняем ордер для всего остального
$query = "SELECT `id` FROM `#__categories` WHERE (`rgt`>='".($rgt_main-1)."') and (`parent_id`<>'".$id."') and (`id`<>'".$id."') and (`id`<>'1') and (`extension`='com_content')";
$db->setQuery($query);
$cats = $db->loadObjectList();
foreach($cats as $cat){
$query = "UPDATE `#__categories` SET
`lft` = (`lft`+4), `rgt` = (`rgt`+4)
WHERE `id`='".$cat->id."'";
$db->setQuery($query);
$db->query();
}
//Меняем ордер для главное категории
$query = "SELECT `rgt` FROM `#__categories` WHERE 1 ORDER BY `rgt` DESC";
$db->setQuery($query);
$rgts_root = $db->loadObjectList();
$rgt_root = $rgts_root[0]->rgt; //Порядок показа
$query = "UPDATE `#__categories` SET `rgt` = '".($rgt_root+1)."'
WHERE `id` ='1' ";
$db->setQuery($query);
$db->query(); //Для коренной категории ROOT
//Меняем ордер для главное категории
$this->AddMenu($id_new, $category, $alias, $menu, $feed);
return $id_new;
}
}
function AddMenu($id_cat, $category, $alias, $id_menu, $feed){
$db =& JFactory::getDBO();
$query = "SELECT `path`,`level`,`component_id`,`rgt`,`params`,`menutype`,`link` FROM `#__menu` WHERE `id`='$id_menu'";
$db->setQuery($query);
$menu = $db->loadObjectList();
$level = $menu[0]->level+1; //Уровень
$path = $menu[0]->path; //Путь
$component_id = $menu[0]->component_id; //Компонент
$lft = $menu[0]->rgt; //Левый
$rgt = $menu[0]->rgt+1; //Правый
$params = $menu[0]->params; //Параметры
$menutype = $menu[0]->menutype; //Тип меню
$link_menu= $menu[0]->link; //Тип меню
if(strlen(stristr($link_menu,'index.php?option=com_content&view=archive'))>0)
$link = 'index.php?option=com_content&view=archive';
if(strlen(stristr($link_menu,'index.php?option=com_content&view=categories&id='))>0)
$link = 'index.php?option=com_content&view=categories&id='.$id_cat;
if(strlen(stristr($link_menu,'index.php?option=com_content&view=category&layout=blog&id='))>0)
$link = 'index.php?option=com_content&view=category&layout=blog&id='.$id_cat;
if(strlen(stristr($link_menu,'index.php?option=com_content&view=category&id='))>0)
$link = 'index.php?option=com_content&view=category&id='.$id_cat;
if(strlen(stristr($link_menu,'index.php?option=com_content&view=featured'))>0)
$link = 'index.php?option=com_content&view=featured';
$category = $this->FText($category);
$query = "INSERT INTO `#__menu`
(`id`, `menutype`, `title`, `alias`, `note`, `path`,
`link`, `type`, `published`, `parent_id`, `level`, `component_id`,
`ordering`, `checked_out`, `checked_out_time`,
`browserNav`, `access`, `img`, `template_style_id`,
`params`, `lft`, `rgt`, `home`, `language`, `client_id`)
VALUES (NULL, '".$menutype."', '".$category."', '".$alias."', '',
'".$path.'/'.$alias."', '".$link."',
'component', '1', '".$id_menu."', '".$level."', '".$component_id."', '0', '0', '0000-00-00 00:00:00',
'0', '1', '', '0', '".$params."', '".$lft."', '".$rgt."', '0', '*', '0');";
$db->setQuery($query);
$db->query();
$id_new = $db->insertid();
$this->SaveMenu($feed, $id_new, $id_cat);
return $id_new;
}
function FText($text, $date = false){
if($date){
return date("Y-m-d H:i:s",strtotime($text));
}
$text=str_replace('<![CDATA[', '', $text);
$text=str_replace(']]>', '', $text);
$text = strip_tags($text);
$text = str_replace(array('"','"'), '', $text);
$text = trim($text);
$first = mb_strtoupper(mb_substr($text, 0, 1));
$text = $first.mb_substr($text, 1, mb_strlen($text)-1);
return $text;
}
function SaveCategory($feed, $category){
$db =& JFactory::getDBO();
$query = "INSERT INTO `#__tsgrabber_categories` (
`id_feed` ,
`id_category`
)
VALUES (
'".$feed."', '".$category."'
);";
$db->setQuery($query);
$db->query();
}
function SaveMenu($feed, $menu, $cat){
$db =& JFactory::getDBO();
$query = "INSERT INTO `#__tsgrabber_menu` (
`id_feed` ,
`id_menu`,
`id_cat`
)
VALUES (
'".$feed."', '".$menu."', '".$cat."'
);";
$db->setQuery($query);
$db->query();
}
function SaveContent($feed, $content, $cat, $date, $md5){
$db =& JFactory::getDBO();
$query = "INSERT INTO `#__tsgrabber_content` (
`id_feed` ,
`id_content`,
`id_cat`,
`md5`,
`date`
)
VALUES (
'".$feed."', '".$content."' , '".$cat."','".$md5."', '".$date."'
);";
$db->setQuery($query);
$db->query();
}
function convert($string)
{
$converter = array(
'а' => 'a', 'б' => 'b', 'в' => 'v',
'г' => 'g', 'д' => 'd', 'е' => 'e',
'ё' => 'e', 'ж' => 'zh', 'з' => 'z',
'и' => 'i', 'й' => 'y', 'к' => 'k',
'л' => 'l', 'м' => 'm', 'н' => 'n',
'о' => 'o', 'п' => 'p', 'р' => 'r',
'с' => 's', 'т' => 't', 'у' => 'u',
'ф' => 'f', 'х' => 'h', 'ц' => 'c',
'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch',
'ь' => "", 'ы' => 'y', 'ъ' => "",
'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
'А' => 'A', 'Б' => 'B', 'В' => 'V',
'Г' => 'G', 'Д' => 'D', 'Е' => 'E',
'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z',
'И' => 'I', 'Й' => 'Y', 'К' => 'K',
'Л' => 'L', 'М' => 'M', 'Н' => 'N',
'О' => 'O', 'П' => 'P', 'Р' => 'R',
'С' => 'S', 'Т' => 'T', 'У' => 'U',
'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch',
'Ь' => "", 'Ы' => 'Y', 'Ъ' => "",
'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',
);
$string = strtr($string, $converter);
$string = str_replace(' ', '-', $string);
return $string;
}
}
class TSCurl {
public $urls = NULL;
public $result = array();
function GetContent($size = 0){
// инициализируем "контейнер" для отдельных соединений (мультикурл)
$cmh = curl_multi_init();
// массив заданий для мультикурла
$this->result = array();
// перебираем наши урлы
foreach ($this->urls as $url) {
// инициализируем отдельное соединение (поток)
$ch = curl_init($url);
// если будет редирект - перейти по нему
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// возвращать результат
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// не возвращать http-заголовок
curl_setopt($ch, CURLOPT_HEADER, 0);
// таймаут соединения
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 100);
// таймаут ожидания
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
// добавляем дескриптор потока в массив заданий
$this->result[$url] = $ch;
// добавляем дескриптор потока в мультикурл
curl_multi_add_handle($cmh, $ch);
}
// количество активных потоков
$active = null;
// запускаем выполнение потоков
do {
$mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
// выполняем, пока есть активные потоки
while ($active && ($mrc == CURLM_OK)) {
// если какой-либо поток готов к действиям
//if (curl_multi_select($cmh) != -1) {
// ждем, пока что-нибудь изменится
do {
$mrc = curl_multi_exec($cmh, $active);
// получаем информацию о потоке
$info = curl_multi_info_read($cmh);
// если поток завершился
if ($info['msg'] == CURLMSG_DONE) {
$ch = $info['handle'];
// ищем урл страницы по дескриптору потока в массиве заданий
$url = array_search($ch, $this->result);
// забираем содержимое
if($size==0){
$this->result[$url] = curl_multi_getcontent($ch);
}else{
$this->result[$url] = substr(curl_multi_getcontent($ch), 0, $size);
}
// удаляем поток из мультикурла
curl_multi_remove_handle($cmh, $ch);
// закрываем отдельное соединение (поток)
curl_close($ch);
}
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
//}
}
// закрываем мультикурл
curl_multi_close($cmh);
return $this->result;
}
}