From e32241e59ae93dced80d561350e9c45bf1ca264d Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Mon, 28 May 2001 18:53:48 +0000 Subject: - Renamed syndication.module to import.module. - Removed headline.module: it became obsolete. - Removed backend.class: it became obsolete. - Added export.module. For now, you can use: 1. http://drupal/export.php?headlines.rss 2. http://drupal/export.php?headlines.rdf - Renamed export to export.php. For now, you can use: 1. http://drupal/export.php?headlines.rss 2. http://drupal/export.php?headlines.rdf Renaming this file has main 3 advantages: 1. We no longer rely on .htaccess for being able to export. 2. It is more conform with the general naming conventions. 3. It removes a pseudo-hack with formatting the URI. - Made import.module export blocks with feeds. --- modules/aggregator/aggregator.module | 275 +++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 modules/aggregator/aggregator.module (limited to 'modules/aggregator/aggregator.module') diff --git a/modules/aggregator/aggregator.module b/modules/aggregator/aggregator.module new file mode 100644 index 000000000..a4b85041e --- /dev/null +++ b/modules/aggregator/aggregator.module @@ -0,0 +1,275 @@ + +

TODO - anyone?

+ $feed[uncache]"); + + // update feeds: + if ($feed[timestamp] + $feed[refresh] < time()) import_update($feed); + } +} + +function import_bundle($attribute, $limit = 100) { + if ($attribute) { + // compose query: + $keys = explode(",", $attribute); + foreach ($keys as $key) $where[] = "attribute 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 .= "
  • link) ."\">". check_output($item->title) ."
  • "; + } + + return "$output"; + } +} + +function import_view_bundle() { + $result = db_query("SELECT * FROM bundle ORDER BY title"); + while ($bundle = db_fetch_object($result)) { + $output .= "$bundle->title"; + } + 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->attribute, 10); + $blocks[$i][info] = "$bundle->title bundle"; + } + return $blocks; +} + +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("", $data, $data); + + foreach (explode("", $data[0]) as $item) { + $l = eregi("(.*)", $item, $link); + $t = eregi("(.*)", $item, $title); + $a = eregi("(.*)", $item, $author); + $d = eregi("(.*)", $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], attribute => $feed[attribute])); + } + } + + db_query("UPDATE feed SET timestamp = '". time() ."' WHERE fid = '". $feed[fid] ."'"); + } + else { + watchdog("error", "failed to syndicate from '$feed[title]'"); + } + } +} + +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]) ."', attribute = '". check_input($edit[attribute]) ."' 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, attribute, 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[attribute]) ."', '". 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", "attribute", $edit[attribute], 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]) ."', attribute = '". check_input($edit[attribute]) ."' 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, attribute) VALUES ('". check_input($edit[title]) ."', '". check_input($edit[attribute]) ."')"); + } + + 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, 64, "The fully-qualified URL of the feed."); + $form .= form_textfield("Attributes", "attribute", $edit[attribute], 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]) ."', attribute = '". check_input($edit[attribute]) ."', 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, attribute, refresh, uncache) VALUES ('". check_input($edit[title]) ."', '". check_input($edit[link]) ."', '". check_input($edit[attribute]) ."', '". check_input($edit[refresh]) ."', '". check_input($edit[uncache]) ."')"); + } +} + +function import_save_attributes($edit) { + foreach($edit as $iid => $value) { + db_query("UPDATE item SET attribute = '". 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 .= "

    Feed overview

    "; + $output .= "\n"; + $output .= " \n"; + while ($feed = db_fetch_object($result)) { + $output .= " \n"; + } + $output .= "
    titleattributesitemslast updatenext updateoperations
    ". check_output($feed->title) ."". check_output($feed->attribute) ."". format_plural($feed->items, "item", "items") ."". ($feed->timestamp ? format_interval(time() - $feed->timestamp) ." ago" : "never") ."". ($feed->timestamp ? format_interval($feed->timestamp + $feed->refresh - time()) ." left" : "never") ."fid\">edit feedfid\">update items
    \n"; + + $result = db_query("SELECT * FROM bundle ORDER BY title"); + + $output .= "

    Bundle overview

    "; + $output .= "\n"; + $output .= " \n"; + while ($bundle = db_fetch_object($result)) { + $output .= " \n"; + } + $output .= "
    titleattributesoperations
    ". check_output($bundle->title) ."". check_output($bundle->attribute) ."bid\">edit bundle
    \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 .= "
    \n"; + $output .= "\n"; + $output .= " \n"; + while ($item = db_fetch_object($result)) { + $output .= " \n"; + } + $output .= "
    timefeeditem
    ". format_date($item->timestamp, "custom", "m/d/y") ."
    ".format_date($item->timestamp, "custom", "H:i") ."
    fid\">". check_output($item->feed) ."link) ."\">". check_output($item->title) ."". ($item->description ? "
    ". check_output($item->description) ."" : "") ."
    iid]\" VALUE=\"". check_form($item->attribute) ."\" SIZE=\"50\">
    \n"; + $output .= "\n"; + $output .= "
    \n"; + + return $output; +} + +function import_admin() { + global $op, $id, $type, $edit; + + print "add new bundle | add new feed | available bundles | available items | overview | help
    "; + + 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 "update": + print 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(); + } +} + +?> -- cgit v1.2.3