<?php
require_once 'accesscheck.php';
if (!$GLOBALS['commandline']) {
	ob_end_flush();
	if (!MANUALLY_PROCESS_RSS) {
		print $GLOBALS['I18N']->get('This page can only be called from the commandline');
		return;
	}
} else {
	ob_end_clean();
	print ClineSignature();
	print $GLOBALS['I18N']->get('Getting and Parsing the RSS sources') . "\n";
	ob_start();
}

# @@@@ Not sure if this is 118nable.
function ProcessError($message) {
	print "$message";
	logEvent("Error: $message");
	finish("error", $message);
	exit;
}

function output($line) {
	if ($GLOBALS['commandline']) {
		ob_end_clean();
		print strip_tags($line) . "\n";
		ob_start();
	} else {
		print "$line<br/>\n";
	}
	flush();
}

register_shutdown_function('finish');

function finish($flag = "info", $message = 'finished') {
	global $nothingtodo, $failreport, $mailreport, $process_id;

	if ($flag == 'error') {
		$subject = $GLOBALS['I18N']->get('Rss Errors');
	} else {
		$subject = $GLOBALS['I18N']->get('Rss Results');
	}

	releaseLock($process_id);

	if (!TEST && !$nothingtodo) {
		if ($mailreport)
			sendReport($subject, $mailreport);
		if ($failreport)
			sendReport($GLOBALS['I18N']->get('Rss Failure report'), $failreport);
	}
}

# we don not want to timeout or abort
$abort = ignore_user_abort(1);
set_time_limit(600);

include 'onyxrss/onyx-rss.php';
error_reporting(0);
$nothingtodo = 1;
$mailreport = '';
$process_id = getPageLock();

$req = Sql_Query("select rssfeed,id from {$tables['list']} where rssfeed != \"\" order by listorder");
while ($feed = Sql_Fetch_Row($req)) {
	$nothingtodo = 0;
	output('<hr>' . $GLOBALS['I18N']->get('Parsing') . ' ' . $feed[0] . '..');
	flush();
	$report = $GLOBALS['I18N']->get('Parsing') . ' ' . $feed[0];
	$mailreport .= "\n$feed[0] ";
	$itemcount = 0;
	$newitemcount = 0;
	$rss = & new ONYX_RSS();
	$rss->setDebugMode(false);
	$rss->setCachePath($tmpdir);
	keepLock($process_id);

	$parseresult = $rss->parse($feed[0], "rss-cache" . $GLOBALS["database_name"] . $feed[1]);
	if ($parseresult) {
		$report .= ' ' . $GLOBALS['I18N']->get('ok') . "\n";
		$mailreport .= " 'ok ";
		output('..' . $GLOBALS['I18N']->get('ok') . '<br />');
	} else {
		$report .= ' ' . $GLOBALS['I18N']->get('failed') . "\n";
		output('..' . $GLOBALS['I18N']->get('failed') . '<br />');
		$mailreport .= ' ' . $GLOBALS['I18N']->get('failed') . "\n";
		$mailreport .= $rss->lasterror;
		$failreport .= "\n" . $feed[0] . ' ' . $GLOBALS['I18N']->get('failed') . "\n" . $rss->lasterror;
	}
	flush();
	if ($parseresult) {
		while ($item = $rss->getNextItem()) {
			set_time_limit(60);
			$alive = checkLock($process_id);
			if ($alive)
				keepLock($process_id);
			else
				ProcessError($GLOBALS['I18N']->get('Process Killed by other process'));
			$itemcount++;
			Sql_Query(sprintf('select * from %s where title = "%s" and link = "%s"', $tables["rssitem"], addslashes($item["title"]), addslashes($item["link"])));
			if (!Sql_Affected_Rows()) {
				$newitemcount++;
				Sql_Query(sprintf('insert into %s (title,link,source,list,added)
				        	values("%s","%s","%s",%d,now())', $tables["rssitem"], addslashes($item["title"]), addslashes($item['link']), addslashes($feed[0]), $feed[1]));
				$itemid = Sql_Insert_Id();
				foreach ($item as $key => $val) {
					if ($item != 'title' && $item != 'link') {
						Sql_Query(sprintf('insert into %s (itemid,tag,data)
						              values("%s","%s","%s")', $tables["rssitem_data"], $itemid, $key, addslashes($val)));
					}
				}
			}
		}
		output(sprintf('<br/>%d %s, %d %s', $itemcount, $GLOBALS['I18N']->get('items'), $newitemcount, $GLOBALS['I18N']->get('new items')));
		$report .= sprintf('%d items, %d new items' . "\n", $itemcount, $newitemcount);
		$mailreport .= sprintf('-> %d items, %d new items' . "\n", $itemcount, $newitemcount);
	}
	flush();
	Sql_Query(sprintf('insert into %s (listid,type,entered,info) values(%d,"retrieval",now(),"%s")', $tables["listrss"], $feed[1], $report));
	logEvent($report);
}
if ($nothingtodo) {
	print $GLOBALS['I18N']->get('Nothing to do');
}
?>
