297 lines
12 KiB
Plaintext
297 lines
12 KiB
Plaintext
<?php
|
|
|
|
function import_help() {
|
|
?>
|
|
<P>TODO - anyone?</P>
|
|
<?php
|
|
}
|
|
|
|
function import_perm() {
|
|
return array("add and edit news feeds");
|
|
}
|
|
|
|
function import_cron() {
|
|
$result = db_query("SELECT * FROM feed");
|
|
while ($feed = db_fetch_array($result)) {
|
|
// remove expired items:
|
|
db_query("DELETE FROM item WHERE fid = '$feed[fid]' AND timestamp < ". (time() - $feed[uncache]));
|
|
|
|
// update feeds:
|
|
if ($feed[timestamp] + $feed[refresh] < time()) import_update($feed);
|
|
}
|
|
}
|
|
|
|
function import_bundle($attributes, $limit = 100) {
|
|
if ($attributes) {
|
|
// compose query:
|
|
$keys = explode(",", $attributes);
|
|
foreach ($keys as $key) $where[] = "attributes LIKE '%". trim($key) ."%'";
|
|
|
|
$result = db_query("SELECT * FROM item WHERE ". implode(" OR ", $where) ." ORDER BY timestamp DESC LIMIT $limit");
|
|
|
|
while ($item = db_fetch_object($result)) {
|
|
$output .= "<LI><A HREF=\"". check_output($item->link) ."\">". check_output($item->title) ."</A></LI>";
|
|
}
|
|
|
|
return "$output";
|
|
}
|
|
}
|
|
|
|
function import_view_bundle() {
|
|
$result = db_query("SELECT * FROM bundle ORDER BY title");
|
|
while ($bundle = db_fetch_object($result)) {
|
|
$output .= "<B>$bundle->title</B><UL>". import_bundle($bundle->attributes) ."</UL>";
|
|
}
|
|
return $output;
|
|
}
|
|
|
|
function import_block() {
|
|
$result = db_query("SELECT * FROM bundle ORDER BY title");
|
|
while ($bundle = db_fetch_object($result)) {
|
|
$i++;
|
|
$blocks[$i][subject] = $bundle->title;
|
|
$blocks[$i][content] = import_bundle($bundle->attributes, 10);
|
|
$blocks[$i][info] = "$bundle->title bundle";
|
|
}
|
|
return $blocks;
|
|
}
|
|
|
|
function import_remove($feed) {
|
|
db_query("DELETE FROM item WHERE fid = '$feed[fid]'");
|
|
return "feed '$feed[title]' reset.";
|
|
}
|
|
|
|
function import_update($feed) {
|
|
|
|
// open socket:
|
|
$url = parse_url($feed[link]);
|
|
$fp = fsockopen($url[host], ($url[port] ? $url[port] : 80), $errno, $errstr, 15);
|
|
|
|
if ($fp) {
|
|
// fetch data:
|
|
fputs($fp, "GET $url[path]?$url[query] HTTP/1.0\nUser-Agent: ". variable_get(site_name, "drupal") ."\nHost: $url[host]\nAccept: */*\n\n");
|
|
while(!feof($fp)) $data .= fgets($fp, 128);
|
|
|
|
if (strstr($data, "200 OK")) {
|
|
|
|
eregi("<item([^s].*)</item>", $data, $data);
|
|
|
|
// print "<PRE>". htmlentities($data[0]) ."</PRE>";
|
|
|
|
foreach (explode("</item>", $data[0]) as $item) {
|
|
$t = eregi("<title>(.*)</title>", $item, $title);
|
|
$l = eregi("<link>(.*)</link>", $item, $link);
|
|
$a = eregi("<author>(.*)</author>", $item, $author);
|
|
$d = eregi("<description>(.*)</description>", $item, $description);
|
|
|
|
if ($l || $t || $a || $d) {
|
|
import_save_item(array(fid => $feed[fid], title => $title[0], link => $link[0], author => $author[0], description => $description[0], attributes => $feed[attributes]));
|
|
}
|
|
}
|
|
|
|
db_query("UPDATE feed SET timestamp = '". time() ."' WHERE fid = '". $feed[fid] ."'");
|
|
}
|
|
else {
|
|
watchdog("error", "failed to syndicate from '$feed[title]'");
|
|
}
|
|
}
|
|
|
|
return "feed '$feed[title]' updated.";
|
|
}
|
|
|
|
function import_save_item($edit) {
|
|
if ($edit[iid] && $edit[title]) {
|
|
db_query("UPDATE item SET title = '". check_input($edit[title]) ."', link = '". check_input($edit[link]) ."', author = '". check_input($edit[author]) ."', description = '". check_input($edit[description]) ."', attributes = '". check_input($edit[attributes]) ."' WHERE iid = '$edit[iid]'");
|
|
}
|
|
else if ($edit[iid]) {
|
|
db_query("DELETE FROM item WHERE iid = '". check_input($edit[iid]) ."'");
|
|
}
|
|
else {
|
|
if (!db_fetch_object(db_query("SELECT iid FROM item WHERE link = '". check_input($edit[link]) ."'"))) {
|
|
db_query("INSERT INTO item (fid, title, link, author, description, attributes, timestamp) VALUES ('". check_input($edit[fid]) ."', '". check_input($edit[title]) ."', '". check_input($edit[link]) ."', '". check_input($edit[author]) ."', '". check_input($edit[description]) ."', '". check_input($edit[attributes]) ."', '". time() ."')");
|
|
}
|
|
}
|
|
}
|
|
|
|
function import_form_bundle($edit = array()) {
|
|
global $REQUEST_URI;
|
|
|
|
$form .= form_textfield("Title", "title", $edit[title], 50, 64, "The name of the bundle.");
|
|
$form .= form_textfield("Attributes", "attributes", $edit[attributes], 50, 128, "A comma-seperated list of keywords describing the bundle.");
|
|
|
|
$form .= form_submit("Submit");
|
|
|
|
if ($edit[bid]) {
|
|
$form .= form_submit(t("Delete"));
|
|
$form .= form_hidden("bid", $edit[bid]);
|
|
}
|
|
|
|
return form($REQUEST_URI, $form);
|
|
}
|
|
|
|
function import_save_bundle($edit) {
|
|
if ($edit[bid] && $edit[title]) {
|
|
db_query("UPDATE bundle SET title = '". check_input($edit[title]) ."', attributes = '". check_input($edit[attributes]) ."' WHERE bid = '". check_input($edit[bid]) ."'");
|
|
}
|
|
else if ($edit[bid]) {
|
|
db_query("DELETE FROM bundle WHERE bid = '". check_input($edit[bid]) ."'");
|
|
}
|
|
else {
|
|
db_query("INSERT INTO bundle (title, attributes) VALUES ('". check_input($edit[title]) ."', '". check_input($edit[attributes]) ."')");
|
|
}
|
|
|
|
module_rehash_blocks("import");
|
|
}
|
|
|
|
function import_form_feed($edit = array()) {
|
|
global $REQUEST_URI;
|
|
|
|
$period = array(900 => format_interval(900), 1800 => format_interval(1800), 3600 => format_interval(3600), 7200 => format_interval(7200), 10800 => format_interval(10800), 21600 => format_interval(21600), 32400 => format_interval(32400), 43200 => format_interval(43200), 64800 => format_interval(64800), 86400 => format_interval(86400), 172800 => format_interval(172800), 259200 => format_interval(259200), 604800 => format_interval(604800), 1209600 => format_interval(1209600), 2419200 => format_interval(2419200));
|
|
|
|
$form .= form_textfield("Title", "title", $edit[title], 50, 64, "The name of the feed; typically the name of the website you syndicate content from.");
|
|
$form .= form_textfield("Link", "link", $edit[link], 50, 128, "The fully-qualified URL of the feed.");
|
|
$form .= form_textfield("Attributes", "attributes", $edit[attributes], 50, 128, "A comma-seperated list of keywords describing the feed.");
|
|
$form .= form_select("Update interval", "refresh", $edit[refresh], $period, "The refresh interval indicating how often you want to update this feed. Requires crontab.");
|
|
$form .= form_select("Expiration time", "uncache", $edit[uncache], $period, "The time cached items should be kept. Older items will be automatically discarded. Requires crontab.");
|
|
|
|
$form .= form_submit("Submit");
|
|
|
|
if ($edit[fid]) {
|
|
$form .= form_submit(t("Delete"));
|
|
$form .= form_hidden("fid", $edit[fid]);
|
|
}
|
|
|
|
return form($REQUEST_URI, $form);
|
|
}
|
|
|
|
function import_save_feed($edit) {
|
|
if ($edit[fid] && $edit[title]) {
|
|
db_query("UPDATE feed SET title = '". check_input($edit[title]) ."', link = '". check_input($edit[link]) ."', attributes = '". check_input($edit[attributes]) ."', refresh = '". check_input($edit[refresh]) ."', uncache = '". check_input($edit[uncache]) ."' WHERE fid = '". check_input($edit[fid]) ."'");
|
|
db_query("DELETE FROM item WHERE fid = '". check_input($edit[fid]) ."'");
|
|
}
|
|
else if ($edit[fid]) {
|
|
db_query("DELETE FROM feed WHERE fid = '". check_input($edit[fid]) ."'");
|
|
db_query("DELETE FROM item WHERE fid = '". check_input($edit[fid]) ."'");
|
|
}
|
|
else {
|
|
db_query("INSERT INTO feed (title, link, attributes, refresh, uncache) VALUES ('". check_input($edit[title]) ."', '". check_input($edit[link]) ."', '". check_input($edit[attributes]) ."', '". check_input($edit[refresh]) ."', '". check_input($edit[uncache]) ."')");
|
|
}
|
|
}
|
|
|
|
function import_save_attributes($edit) {
|
|
foreach($edit as $iid => $value) {
|
|
db_query("UPDATE item SET attributes = '". check_input($value) ."' WHERE iid = '". check_input($iid) ."'");
|
|
}
|
|
return "attributes has been saved";
|
|
}
|
|
|
|
function import_get_feed($fid) {
|
|
return db_fetch_array(db_query("SELECT * FROM feed WHERE fid = '". check_input($fid) ."'"));
|
|
}
|
|
|
|
function import_get_bundle($bid) {
|
|
return db_fetch_array(db_query("SELECT * FROM bundle WHERE bid = '". check_input($bid) ."'"));
|
|
}
|
|
|
|
function import_view_feed() {
|
|
$result = db_query("SELECT f.*, COUNT(i.iid) AS items FROM feed f LEFT JOIN item i ON f.fid = i.fid GROUP BY f.fid ORDER BY f.title");
|
|
|
|
$output .= "<H3>Feed overview</H3>";
|
|
$output .= "<TABLE BORDER=\"1\" CELLSPADDING=\"2\" CELLSPACING=\"2\">\n";
|
|
$output .= " <TR><TH>title</TH><TH>attributes</TH><TH>items</TH><TH>last update</TH><TH>next update</TH><TH COLSPAN=\"3\">operations</TH></TR>\n";
|
|
while ($feed = db_fetch_object($result)) {
|
|
$output .= " <TR><TD>". check_output($feed->title) ."</TD><TD>". check_output($feed->attributes) ."</TD><TD>". format_plural($feed->items, "item", "items") ."</TD><TD>". ($feed->timestamp ? format_interval(time() - $feed->timestamp) ." ago" : "never") ."</TD><TD>". ($feed->timestamp ? format_interval($feed->timestamp + $feed->refresh - time()) ." left" : "never") ."</TD><TD><A HREF=\"admin.php?mod=import&type=feed&op=edit&id=$feed->fid\">edit feed</A></TD><TD><A HREF=\"admin.php?mod=import&type=feed&op=remove&id=$feed->fid\">remove items</A></TD><TD><A HREF=\"admin.php?mod=import&type=feed&op=update&id=$feed->fid\">update items</A></TD></TR>\n";
|
|
}
|
|
$output .= "</TABLE>\n";
|
|
|
|
$result = db_query("SELECT * FROM bundle ORDER BY title");
|
|
|
|
$output .= "<H3>Bundle overview</H3>";
|
|
$output .= "<TABLE BORDER=\"1\" CELLSPADDING=\"2\" CELLSPACING=\"2\">\n";
|
|
$output .= " <TR><TH>title</TH><TH>attributes</TH><TH>operations</TH></TR>\n";
|
|
while ($bundle = db_fetch_object($result)) {
|
|
$output .= " <TR><TD>". check_output($bundle->title) ."</TD><TD>". check_output($bundle->attributes) ."</TD><TD><A HREF=\"admin.php?mod=import&type=bundle&op=edit&id=$bundle->bid\">edit bundle</A></TD></TR>\n";
|
|
}
|
|
$output .= "</TABLE>\n";
|
|
|
|
return $output;
|
|
}
|
|
|
|
function import_view_item() {
|
|
global $REQUEST_URI;
|
|
|
|
$result = db_query("SELECT i.*, f.title AS feed FROM item i LEFT JOIN feed f ON i.fid = f.fid ORDER BY i.timestamp DESC LIMIT 50");
|
|
|
|
$output .= "<FORM ACTION=\"$REQUEST_URI\" METHOD=\"post\">\n";
|
|
$output .= "<TABLE BORDER=\"1\" CELLSPADDING=\"2\" CELLSPACING=\"2\">\n";
|
|
$output .= " <TR><TH>time</TH><TH>feed</TH><TH>item</TH></TR>\n";
|
|
while ($item = db_fetch_object($result)) {
|
|
$output .= " <TR><TD VALIGN=\"top\" NOWRAP>". format_date($item->timestamp, "custom", "m/d/y") ."<BR>".format_date($item->timestamp, "custom", "H:i") ."</TD><TD ALIGN=\"center\" VALIGN=\"top\" NOWRAP><A HREF=\"admin.php?mod=import&type=feed&op=edit&id=$item->fid\">". check_output($item->feed) ."</A></TD><TD><A HREF=\"". check_output($item->link) ."\">". check_output($item->title) ."</A>". ($item->description ? "<BR><SMALL><I>". check_output($item->description) ."</I></SMALL>" : "") ."<BR><INPUT TYPE=\"text\" NAME=\"edit[$item->iid]\" VALUE=\"". check_form($item->attributes) ."\" SIZE=\"50\"></TD></TR>\n";
|
|
}
|
|
$output .= "</TABLE>\n";
|
|
$output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Save attributes\">\n";
|
|
$output .= "</FORM>\n";
|
|
|
|
return $output;
|
|
}
|
|
|
|
function import_admin() {
|
|
global $user, $op, $id, $type, $edit;
|
|
|
|
if (user_access($user, "add and edit news feeds")) {
|
|
|
|
print "<SMALL><A HREF=\"admin.php?mod=import&type=bundle&op=add\">add new bundle</A> | <A HREF=\"admin.php?mod=import&type=feed&op=add\">add new feed</A> | <A HREF=\"admin.php?mod=import&type=bundle&op=view\">available bundles</A> | <A HREF=\"admin.php?mod=import&type=item&op=view\">available items</A> | <A HREF=\"admin.php?mod=import&op=view\">overview</A> | <A HREF=\"admin.php?mod=import&op=help\">help</A></SMALL><HR>";
|
|
|
|
switch($op) {
|
|
case "help":
|
|
print import_help();
|
|
break;
|
|
case "add":
|
|
if ($type == "bundle")
|
|
print import_form_bundle();
|
|
else
|
|
print import_form_feed();
|
|
break;
|
|
case "edit":
|
|
if ($type == "bundle")
|
|
print import_form_bundle(import_get_bundle($id));
|
|
else
|
|
print import_form_feed(import_get_feed($id));
|
|
break;
|
|
case "remove":
|
|
print status(import_remove(import_get_feed($id)));
|
|
print import_view_feed();
|
|
break;
|
|
case "update":
|
|
print status(import_update(import_get_feed($id)));
|
|
print import_view_feed();
|
|
break;
|
|
case "Save attributes":
|
|
print status(import_save_attributes($edit));
|
|
print import_view_item();
|
|
break;
|
|
case "Delete":
|
|
$edit[title] = 0;
|
|
// fall through:
|
|
case "Submit":
|
|
if ($type == "bundle")
|
|
print status(import_save_bundle($edit));
|
|
else
|
|
print status(import_save_feed($edit));
|
|
// fall through:
|
|
default:
|
|
if ($type == "bundle")
|
|
print import_view_bundle();
|
|
else if ($type == "item")
|
|
print import_view_item();
|
|
else
|
|
print import_view_feed();
|
|
}
|
|
}
|
|
else {
|
|
print message_access();
|
|
}
|
|
}
|
|
|
|
?>
|