Module: website Branch: master Commit: 3ec9ef1e73cffb14c0a4001d6400281fcddaecd2 URL: https://source.winehq.org/git/website.git/?a=commit;h=3ec9ef1e73cffb14c0a400...
Author: Jeremy Newman jnewman@codeweavers.com Date: Tue Jun 7 15:59:16 2022 -0500
rss feed updates
* add etag based on last modified * stream news items * use RSS 2.0 XML format
---
include/plugins/news.php | 72 +++++++++++++++++++++++++-------------- templates/global/xml/rss.template | 11 ++---- 2 files changed, 49 insertions(+), 34 deletions(-)
diff --git a/include/plugins/news.php b/include/plugins/news.php index e05dfeb6..f305f5b2 100644 --- a/include/plugins/news.php +++ b/include/plugins/news.php @@ -98,21 +98,52 @@ switch ($flag)
// RSS view case 'rss': - // get list of news items $news = get_files($config->news_xml_path."/".$config->lang, $feed); - $news = array_reverse ($news); + $news = array_reverse($news);
- // clear cache and output the rss file - $rss_rows = ""; - $c = 0; - foreach ($news as $key => $item) + // get last modified + $f = get_xml_tags($config->news_xml_path.'/'.$html->lang.'/'.$news[0], array('date')); + $last_modified = strtotime($f['date']); + + // if etag set in header, and matches timestamp, send 304 + if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified || trim($_SERVER['HTTP_IF_NONE_MATCH']) == $last_modified) + { + header("HTTP/1.1 304 Not Modified"); + exit(); + } + + // clear cache + $html->clear_buffer(); + + // headers + header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified)." GMT"); + header("Expires: ".gmdate("D, d M Y H:i:s", (time()+86400))." GMT"); + header("Etag: "{$last_modified}""); + header("Pragma: public"); + header("Cache-Control: public, max-age=86400"); + header("Content-Type: application/xml"); + header('Content-Disposition: inline; filename="winehq_news.xml";'); + + // rss header + $rss = array( + 'rss_title' => "{$config->site_name} News", + 'rss_link' => "{$config->base_url}news/rss/", + 'rss_img' => "https://media.codeweavers.com/pub/crossover/marketing/og/wine-hq-announcemen...", + 'rss_desc' => 'News and information about Wine', + 'rss_crt' => '(C) '.$config->site_name.' '.date("Y", time()), + 'atom_link' => "https://%7B$_SERVER%5B%27SERVER_NAME%27%5D%7D%7B$_SERVER%5B%27PHP_SELF%27%5D..." + ); + $rss_head = $html->template('global', 'xml/rss', $rss, 1); + list($rss_head, $rss_foot) = preg_split('/{$rss_rows}/', $rss_head, 2); + echo $rss_head; + + // rss rows + foreach ($news as $c => $item) { - $c++; - // limit to 10 most recent articles - if ($c > 10) - continue; + if ($c == 10) + break;
// get data from XML file if (file_exists($config->news_xml_path.'/'.$html->lang.'/'.$item)) @@ -139,25 +170,14 @@ switch ($flag) 'item_guid' => $config->base_url.'?news='.$item, 'item_date' => date("r", strtotime($vars['date'])) ); - $rss_rows .= $html->template('global', 'xml/rss_row', $rss_row, 1); - $html->set_last_modified($vars['date'], true); + echo $html->template('global', 'xml/rss_row', $rss_row, 1); } - unset($c); - $rss = array( - 'rss_date' => date("r", $top_date), - 'rss_title' => "{$config->site_name} News", - 'rss_link' => "{$config->base_url}news/rss/", - 'rss_img' => "https://media.codeweavers.com/pub/crossover/marketing/og/wine-hq-announcemen...", - 'rss_desc' => 'News and information about Wine', - 'rss_crt' => '(C) '.$config->site_name.' '.date("Y", time()), - 'rss_rows' => $rss_rows - ); - $html->http_header("application/xml"); - header('Content-Disposition: inline; filename="winehq_news.xml";'); - echo $html->template('global', 'xml/rss', $rss); + + // rss footer + echo $rss_foot; exit(); break; - // end rss + // end rss
// default view default: diff --git a/templates/global/xml/rss.template b/templates/global/xml/rss.template index 92c68a93..60329b89 100644 --- a/templates/global/xml/rss.template +++ b/templates/global/xml/rss.template @@ -1,7 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<?xml-stylesheet href="http://feeds.gawker.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?> -<?xml-stylesheet href="http://feeds.gawker.com/~d/styles/itemcontent.css" type="text/css" media="screen"?> -<rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"> +<rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom"> <channel> <title>{$rss_title}</title> <image> @@ -11,12 +9,9 @@ </image> <link>{$rss_link}</link> <description>{$rss_desc}</description> - <language>en</language> + <language>{$html_lang}</language> <copyright>{$rss_crt}</copyright> - <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="{$rss_link}" type="application/rss+xml" /> - feedburner:browserFriendlyThis is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly> - + <atom:link href="{$atom_link}" rel="self" type="application/rss+xml" /> {$rss_rows} - </channel> </rss>