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
  }
}

?>