source: trunk/feed.php @ 1550

Last change on this file since 1550 was 1550, checked in by rvelices, 18 years ago

corrected links in RSS feed

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | PhpWebGallery - a PHP based picture gallery                           |
4// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
5// | Copyright (C) 2003-2006 PhpWebGallery Team - http://phpwebgallery.net |
6// +-----------------------------------------------------------------------+
7// | branch        : BSF (Best So Far)
8// | file          : $RCSfile$
9// | last update   : $Date: 2006-09-19 04:43:10 +0000 (Tue, 19 Sep 2006) $
10// | last modifier : $Author: rvelices $
11// | revision      : $Revision: 1550 $
12// +-----------------------------------------------------------------------+
13// | This program is free software; you can redistribute it and/or modify  |
14// | it under the terms of the GNU General Public License as published by  |
15// | the Free Software Foundation                                          |
16// |                                                                       |
17// | This program is distributed in the hope that it will be useful, but   |
18// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
19// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
20// | General Public License for more details.                              |
21// |                                                                       |
22// | You should have received a copy of the GNU General Public License     |
23// | along with this program; if not, write to the Free Software           |
24// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
25// | USA.                                                                  |
26// +-----------------------------------------------------------------------+
27
28define('PHPWG_ROOT_PATH','./');
29include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
30include_once(PHPWG_ROOT_PATH.'include/functions_notification.inc.php');
31
32// +-----------------------------------------------------------------------+
33// |                               functions                               |
34// +-----------------------------------------------------------------------+
35
36/**
37 * explodes a MySQL datetime format (2005-07-14 23:01:37) in fields "year",
38 * "month", "day", "hour", "minute", "second".
39 *
40 * @param string mysql datetime format
41 * @return array
42 */
43function explode_mysqldt($mysqldt)
44{
45  $date = array();
46  list($date['year'],
47       $date['month'],
48       $date['day'],
49       $date['hour'],
50       $date['minute'],
51       $date['second'])
52    = preg_split('/[-: ]/', $mysqldt);
53
54  return $date;
55}
56
57/**
58 * creates a Unix timestamp (number of seconds since 1970-01-01 00:00:00
59 * GMT) from a MySQL datetime format (2005-07-14 23:01:37)
60 *
61 * @param string mysql datetime format
62 * @return int timestamp
63 */
64function mysqldt_to_ts($mysqldt)
65{
66  $date = explode_mysqldt($mysqldt);
67  return mktime($date['hour'], $date['minute'], $date['second'],
68                $date['month'], $date['day'], $date['year']);
69}
70
71/**
72 * creates an ISO 8601 format date (2003-01-20T18:05:41+04:00) from Unix
73 * timestamp (number of seconds since 1970-01-01 00:00:00 GMT)
74 *
75 * function copied from Dotclear project http://dotclear.net
76 *
77 * @param int timestamp
78 * @return string ISO 8601 date format
79 */
80function ts_to_iso8601($ts)
81{
82  $tz = date('O',$ts);
83  $tz = substr($tz, 0, -2).':'.substr($tz, -2);
84  return date('Y-m-d\\TH:i:s',$ts).$tz;
85}
86
87// +-----------------------------------------------------------------------+
88// |                            initialization                             |
89// +-----------------------------------------------------------------------+
90
91// clean $user array (include/user.inc.php has been executed)
92$user = array();
93
94// echo '<pre>'.generate_key(50).'</pre>';
95if (isset($_GET['feed'])
96    and preg_match('/^[A-Za-z0-9]{50}$/', $_GET['feed']))
97{
98  $query = '
99SELECT uf.user_id AS id,
100       ui.status,
101       uf.last_check,
102       u.'.$conf['user_fields']['username'].' AS username
103  FROM '.USER_FEED_TABLE.' AS uf
104    INNER JOIN '.USER_INFOS_TABLE.' AS ui
105      ON ui.user_id = uf.user_id
106    INNER JOIN '.USERS_TABLE.' AS u
107      ON u.'.$conf['user_fields']['id'].' = uf.user_id
108  WHERE uf.id = \''.$_GET['feed'].'\'
109;';
110  $user = mysql_fetch_array(pwg_query($query));
111}
112
113if ( empty($user) )
114{
115  page_not_found('Unknown/missing feed identifier');
116}
117
118$user['forbidden_categories'] = calculate_permissions($user['id'],
119                                                      $user['status']);
120if ('' == $user['forbidden_categories'])
121{
122  $user['forbidden_categories'] = '0';
123}
124
125list($dbnow) = mysql_fetch_row(pwg_query('SELECT NOW();'));
126
127include_once(PHPWG_ROOT_PATH.'include/feedcreator.class.php');
128
129$base_url = 'http://'.$_SERVER["HTTP_HOST"].cookie_path();
130if ( strrpos($base_url, '/') !== strlen($base_url)-1 )
131{
132  $base_url .= '/';
133}
134$page['root_path']=$base_url;
135
136$rss = new UniversalFeedCreator();
137
138$rss->title = $conf['gallery_title'];
139$rss->title.= ' (as '.$user['username'].')';
140
141$rss->link = $conf['gallery_url'];
142
143// +-----------------------------------------------------------------------+
144// |                            Feed creation                              |
145// +-----------------------------------------------------------------------+
146
147$news = news($user['last_check'], $dbnow, true, true);
148
149if (count($news) > 0)
150{
151  $item = new FeedItem();
152  $item->title = sprintf(l10n('New on %s'), $dbnow);
153  $item->link = $conf['gallery_url'];
154
155  // content creation
156  $item->description = '<ul>';
157  foreach ($news as $line)
158  {
159    $item->description.= '<li>'.$line.'</li>';
160  }
161  $item->description.= '</ul>';
162  $item->descriptionHtmlSyndicated = true;
163
164  $item->date = ts_to_iso8601(mysqldt_to_ts($dbnow));
165  $item->author = 'PhpWebGallery notifier';
166  $item->guid= sprintf('%s', $dbnow);;
167
168  $rss->addItem($item);
169
170  $query = '
171UPDATE '.USER_FEED_TABLE.'
172  SET last_check = \''.$dbnow.'\'
173  WHERE id = \''.$_GET['feed'].'\'
174;';
175  pwg_query($query);
176}
177
178
179// build items for new images/albums
180$query = '
181SELECT date_available,
182      COUNT(DISTINCT id) nb_images,
183      COUNT(DISTINCT category_id) nb_cats
184  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
185  WHERE category_id NOT IN ('.$user['forbidden_categories'].')
186  GROUP BY date_available
187  ORDER BY date_available DESC
188  LIMIT 0,5
189;';
190$result = pwg_query($query);
191$dates = array();
192while ($row = mysql_fetch_array($result))
193{
194  array_push($dates, $row);
195}
196
197foreach($dates as  $date_detail)
198{ // for each recent post date we create a feed item
199  $date = $date_detail['date_available'];
200  $exploded_date = explode_mysqldt($date);
201  $item = new FeedItem();
202  $item->title = sprintf(l10n('%d new elements'), $date_detail['nb_images']);
203  $item->title .= ' ('.$lang['month'][(int)$exploded_date['month']].' '.$exploded_date['day'].')';
204  $item->link = make_index_url(
205        array(
206          'chronology_field' => 'posted',
207          'chronology_style'=> 'monthly',
208          'chronology_view' => 'calendar',
209          'chronology_date' => explode('-', substr($date,0,10) )
210        )
211      );
212
213  $item->description .=
214    '<a href="'.make_index_url().'">'.$conf['gallery_title'].'</a><br/> ';
215
216  $item->description .=
217        '<li>'
218        .sprintf(l10n('%d new elements'), $date_detail['nb_images'])
219        .' ('
220        .'<a href="'.make_index_url(array('section'=>'recent_pics')).'">'
221          .l10n('recent_pics_cat').'</a>'
222        .')'
223        .'</li>';
224
225  // get some thumbnails ...
226  $query = '
227SELECT DISTINCT id, path, name, tn_ext
228  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
229  WHERE category_id NOT IN ('.$user['forbidden_categories'].')
230    AND date_available="'.$date.'"
231    AND tn_ext IS NOT NULL
232  LIMIT 0,6
233;';
234  $result = pwg_query($query);
235  while ($row = mysql_fetch_array($result))
236  {
237    $tn_src = get_thumbnail_src($row['path'], @$row['tn_ext']);
238    $item->description .= '<img src="'.$tn_src.'"/>';
239  }
240  $item->description .= '...<br/>';
241
242
243  $item->description .=
244        '<li>'
245        .sprintf(l10n('%d categories updated'), $date_detail['nb_cats'])
246        .'</li>';
247  // get some categories ...
248  $query = '
249SELECT DISTINCT c.uppercats, COUNT(DISTINCT i.id) img_count
250  FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON i.id=image_id
251    INNER JOIN '.CATEGORIES_TABLE.' c ON c.id=category_id
252  WHERE category_id NOT IN ('.$user['forbidden_categories'].')
253    AND date_available="'.$date.'"
254  GROUP BY category_id
255  ORDER BY img_count DESC
256  LIMIT 0,6
257;';
258  $result = pwg_query($query);
259  $item->description .= '<ul>';
260  while ($row = mysql_fetch_array($result))
261  {
262    $item->description .=
263          '<li>'
264          .get_cat_display_name_cache($row['uppercats'])
265          .' ('.sprintf(l10n('%d new elements'), $row['img_count']).')'
266          .'</li>';
267  }
268  $item->description .= '</ul>';
269
270  $item->descriptionHtmlSyndicated = true;
271
272  $item->date = ts_to_iso8601(mysqldt_to_ts($date));
273  $item->author = 'PhpWebGallery notifier';
274  $item->guid= sprintf('%s', 'pics-'.$date);;
275
276  $rss->addItem($item);
277}
278
279// send XML feed
280echo $rss->saveFeed('RSS2.0', '', true);
281?>
Note: See TracBrowser for help on using the repository browser.