aggregator.module 12.3 KB
Newer Older
1 2
<?php

Dries's avatar
 
Dries committed
3
function import_help() {
4 5 6 7 8
 ?>
  <P>TODO - anyone?</P>
 <?php
}

Dries's avatar
 
Dries committed
9
function import_cron() {
10 11 12
  $result = db_query("SELECT * FROM feed");
  while ($feed = db_fetch_array($result)) {
    // remove expired items:
Dries's avatar
 
Dries committed
13
    db_query("DELETE FROM item WHERE fid = '$feed[fid]' AND timestamp < ". (time() - $feed[uncache]));
14 15

    // update feeds:
Dries's avatar
 
Dries committed
16
    if ($feed[timestamp] + $feed[refresh] < time()) import_update($feed);
17 18 19
  }
}

Dries's avatar
 
Dries committed
20
function import_bundle($attribute, $limit = 100) {
Dries's avatar
 
Dries committed
21
  if ($attribute) {
22
    // compose query:
Dries's avatar
 
Dries committed
23
    $keys = explode(",", $attribute);
24 25
    foreach ($keys as $key) $where[] = "attribute LIKE '%". trim($key) ."%'";

Dries's avatar
 
Dries committed
26
    $result = db_query("SELECT * FROM item WHERE ". implode(" OR ", $where) ." ORDER BY timestamp DESC LIMIT $limit");
27 28 29 30 31

    while ($item = db_fetch_object($result)) {
      $output .= "<LI><A HREF=\"". check_output($item->link) ."\">". check_output($item->title) ."</A></LI>";
    }

Dries's avatar
 
Dries committed
32
    return "$output";
33 34 35
  }
}

Dries's avatar
 
Dries committed
36
function import_view_bundle() {
Dries's avatar
 
Dries committed
37
  $result = db_query("SELECT * FROM bundle ORDER BY title");
38
  while ($bundle = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
39
    $output .= "<B>$bundle->title</B><UL>". import_bundle($bundle->attribute) ."</UL>";
40 41 42 43
  }
  return $output;
}

Dries's avatar
 
Dries committed
44 45 46 47 48 49 50 51 52 53 54
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;
}

Dries's avatar
 
Dries committed
55 56 57 58 59
function import_remove($feed) {
  db_query("DELETE FROM item WHERE fid = '$feed[fid]'");
  return "feed '$feed[title]' reset.";
}

Dries's avatar
 
Dries committed
60
function import_update($feed) {
61 62 63 64 65 66 67 68 69 70 71 72

  // 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")) {

Dries's avatar
 
Dries committed
73 74 75
      eregi("<item([^s].*)</item>", $data, $data);

      // print "<PRE>". htmlentities($data[0]) ."</PRE>";
76 77 78

      foreach (explode("</item>", $data[0]) as $item) {
        $t = eregi("<title>(.*)</title>", $item, $title);
Dries's avatar
 
Dries committed
79
        $l = eregi("<link>(.*)</link>", $item, $link);
80 81 82 83
        $a = eregi("<author>(.*)</author>", $item, $author);
        $d = eregi("<description>(.*)</description>", $item, $description);

        if ($l || $t || $a || $d) {
Dries's avatar
 
Dries committed
84
          import_save_item(array(fid => $feed[fid], title => $title[0], link => $link[0], author => $author[0], description => $description[0], attribute => $feed[attribute]));
85 86 87 88 89 90 91 92 93
        }
      }

      db_query("UPDATE feed SET timestamp = '". time() ."' WHERE fid = '". $feed[fid] ."'");
    }
    else {
      watchdog("error", "failed to syndicate from '$feed[title]'");
    }
  }
Dries's avatar
 
Dries committed
94 95

  return "feed '$feed[title]' updated.";
96 97
}

Dries's avatar
 
Dries committed
98
function import_save_item($edit) {
99 100 101 102 103 104 105 106 107 108 109 110 111
  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() ."')");
    }
  }
}

Dries's avatar
 
Dries committed
112
function import_form_bundle($edit = array()) {
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
  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);
}

Dries's avatar
 
Dries committed
128
function import_save_bundle($edit) {
129 130 131 132 133 134 135 136 137
  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]) ."')");
  }
Dries's avatar
 
Dries committed
138 139

  module_rehash_blocks("import");
140 141
}

Dries's avatar
 
Dries committed
142
function import_form_feed($edit = array()) {
143 144 145 146 147
  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.");
Dries's avatar
 
Dries committed
148
  $form .= form_textfield("Link", "link", $edit[link], 50, 128, "The fully-qualified URL of the feed.");
149 150 151 152 153 154 155 156 157 158 159 160 161 162
  $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);
}

Dries's avatar
 
Dries committed
163
function import_save_feed($edit) {
164 165 166 167 168 169 170 171 172 173 174 175 176
  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]) ."')");
  }
}

Dries's avatar
 
Dries committed
177
function import_save_attributes($edit) {
178 179 180 181 182 183
  foreach($edit as $iid => $value) {
    db_query("UPDATE item SET attribute = '". check_input($value) ."' WHERE iid = '". check_input($iid) ."'");
  }
  return "attributes has been saved";
}

Dries's avatar
 
Dries committed
184
function import_get_feed($fid) {
185 186 187
  return db_fetch_array(db_query("SELECT * FROM feed WHERE fid = '". check_input($fid) ."'"));
}

Dries's avatar
 
Dries committed
188
function import_get_bundle($bid) {
189 190 191
  return db_fetch_array(db_query("SELECT * FROM bundle WHERE bid = '". check_input($bid) ."'"));
}

Dries's avatar
 
Dries committed
192
function import_view_feed() {
193 194
  $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");

Dries's avatar
 
Dries committed
195
  $output .= "<H3>Feed overview</H3>";
196
  $output .= "<TABLE BORDER=\"1\" CELLSPADDING=\"2\" CELLSPACING=\"2\">\n";
Dries's avatar
 
Dries committed
197
  $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";
198
  while ($feed = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
199
    $output .= " <TR><TD>". check_output($feed->title) ."</TD><TD>". check_output($feed->attribute) ."</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";
200 201 202 203 204
  }
  $output .= "</TABLE>\n";

  $result = db_query("SELECT * FROM bundle ORDER BY title");

Dries's avatar
 
Dries committed
205
  $output .= "<H3>Bundle overview</H3>";
206 207 208
  $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)) {
Dries's avatar
 
Dries committed
209
    $output .= " <TR><TD>". check_output($bundle->title) ."</TD><TD>". check_output($bundle->attribute) ."</TD><TD><A HREF=\"admin.php?mod=import&type=bundle&op=edit&id=$bundle->bid\">edit bundle</A></TD></TR>\n";
210 211 212 213 214 215
  }
  $output .= "</TABLE>\n";

  return $output;
}

Dries's avatar
 
Dries committed
216
function import_view_item() {
217 218 219 220 221 222 223 224
  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)) {
Dries's avatar
 
Dries committed
225
    $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->attribute) ."\" SIZE=\"50\"></TD></TR>\n";
226 227 228 229 230 231 232 233
  }
  $output .= "</TABLE>\n";
  $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Save attributes\">\n";
  $output .= "</FORM>\n";

  return $output;
}

Dries's avatar
 
Dries committed
234
function import_admin() {
235 236
  global $op, $id, $type, $edit;

Dries's avatar
 
Dries committed
237
  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>";
238 239 240

  switch($op) {
    case "help":
Dries's avatar
 
Dries committed
241
      print import_help();
242 243 244
      break;
    case "add":
      if ($type == "bundle")
Dries's avatar
 
Dries committed
245
        print import_form_bundle();
246
      else
Dries's avatar
 
Dries committed
247
        print import_form_feed();
248 249 250
      break;
    case "edit":
      if ($type == "bundle")
Dries's avatar
 
Dries committed
251
        print import_form_bundle(import_get_bundle($id));
252
      else
Dries's avatar
 
Dries committed
253
        print import_form_feed(import_get_feed($id));
254
      break;
Dries's avatar
 
Dries committed
255 256 257 258
    case "remove":
      print status(import_remove(import_get_feed($id)));
      print import_view_feed();
      break;
259
    case "update":
Dries's avatar
 
Dries committed
260
      print status(import_update(import_get_feed($id)));
Dries's avatar
 
Dries committed
261
      print import_view_feed();
262 263
      break;
    case "Save attributes":
Dries's avatar
 
Dries committed
264 265
      print status(import_save_attributes($edit));
      print import_view_item();
266 267 268 269 270 271
      break;
    case "Delete":
      $edit[title] = 0;
      // fall through:
    case "Submit":
      if ($type == "bundle")
Dries's avatar
 
Dries committed
272
        print status(import_save_bundle($edit));
273
      else
Dries's avatar
 
Dries committed
274
        print status(import_save_feed($edit));
275 276 277
      // fall through:
    default:
      if ($type == "bundle")
Dries's avatar
 
Dries committed
278
        print import_view_bundle();
279
      else if ($type == "item")
Dries's avatar
 
Dries committed
280
        print import_view_item();
281
      else
Dries's avatar
 
Dries committed
282
        print import_view_feed();
283 284 285 286
  }
}

?>