static function api_get_headlines($feed_id, $limit, $offset, $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $order, $include_attachments, $since_id, $search = "", $include_nested = false, $sanitize_content = true, $force_update = false, $excerpt_length = 100, $check_first_id = false) { if ($force_update && $feed_id > 0 && is_numeric($feed_id)) { // Update the feed if required with some basic flood control $result = db_query("SELECT cache_images," . SUBSTRING_FOR_DATE . "(last_updated,1,19) AS last_updated\n\t\t\t\t\t\tFROM ttrss_feeds WHERE id = '{$feed_id}'"); if (db_num_rows($result) != 0) { $last_updated = strtotime(db_fetch_result($result, 0, "last_updated")); $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images")); if (!$cache_images && time() - $last_updated > 120) { include "rssfuncs.php"; update_rss_feed($feed_id, true, true); } else { db_query("UPDATE ttrss_feeds SET last_updated = '1970-01-01', last_update_started = '1970-01-01'\n\t\t\t\t\t\t\tWHERE id = '{$feed_id}'"); } } } /*$qfh_ret = queryFeedHeadlines($feed_id, $limit, $view_mode, $is_cat, $search, false, $order, $offset, 0, false, $since_id, $include_nested);*/ //function queryFeedHeadlines($feed, $limit, // $view_mode, $cat_view, $search, $search_mode, // $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false, // $ignore_vfeed_group = false, $override_strategy = false, $override_vfeed = false, $start_ts = false, $check_top_id = false) { $params = array("feed" => $feed_id, "limit" => $limit, "view_mode" => $view_mode, "cat_view" => $is_cat, "search" => $search, "override_order" => $order, "offset" => $offset, "since_id" => $since_id, "include_children" => $include_nested, "check_first_id" => $check_first_id, "api_request" => true); $qfh_ret = queryFeedHeadlines($params); $result = $qfh_ret[0]; $feed_title = $qfh_ret[1]; $first_id = $qfh_ret[6]; $headlines = array(); $headlines_header = array('id' => $feed_id, 'first_id' => $first_id, 'is_cat' => $is_cat); if (!is_numeric($result)) { while ($line = db_fetch_assoc($result)) { $line["content_preview"] = truncate_string(strip_tags($line["content"]), $excerpt_length); foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_QUERY_HEADLINES) as $p) { $line = $p->hook_query_headlines($line, $excerpt_length, true); } $is_updated = $line["last_read"] == "" && ($line["unread"] != "t" && $line["unread"] != "1"); $tags = explode(",", $line["tag_cache"]); $label_cache = $line["label_cache"]; $labels = false; if ($label_cache) { $label_cache = json_decode($label_cache, true); if ($label_cache) { if ($label_cache["no-labels"] == 1) { $labels = array(); } else { $labels = $label_cache; } } } if (!is_array($labels)) { $labels = get_article_labels($line["id"]); } //if (!$tags) $tags = get_article_tags($line["id"]); //if (!$labels) $labels = get_article_labels($line["id"]); $headline_row = array("id" => (int) $line["id"], "unread" => sql_bool_to_bool($line["unread"]), "marked" => sql_bool_to_bool($line["marked"]), "published" => sql_bool_to_bool($line["published"]), "updated" => (int) strtotime($line["updated"]), "is_updated" => $is_updated, "title" => $line["title"], "link" => $line["link"], "feed_id" => $line["feed_id"], "tags" => $tags); if ($include_attachments) { $headline_row['attachments'] = get_article_enclosures($line['id']); } if ($show_excerpt) { $headline_row["excerpt"] = $line["content_preview"]; } if ($show_content) { if ($sanitize_content) { $headline_row["content"] = sanitize($line["content"], sql_bool_to_bool($line['hide_images']), false, $line["site_url"], false, $line["id"]); } else { $headline_row["content"] = $line["content"]; } } // unify label output to ease parsing if ($labels["no-labels"] == 1) { $labels = array(); } $headline_row["labels"] = $labels; $headline_row["feed_title"] = $line["feed_title"] ? $line["feed_title"] : $feed_title; $headline_row["comments_count"] = (int) $line["num_comments"]; $headline_row["comments_link"] = $line["comments"]; $headline_row["always_display_attachments"] = sql_bool_to_bool($line["always_display_enclosures"]); $headline_row["author"] = $line["author"]; $headline_row["score"] = (int) $line["score"]; $headline_row["note"] = $line["note"]; $headline_row["lang"] = $line["lang"]; foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_API) as $p) { $headline_row = $p->hook_render_article_api(array("headline" => $headline_row)); } array_push($headlines, $headline_row); } } else { if (is_numeric($result) && $result == -1) { $headlines_header['first_id_changed'] = true; } } return array($headlines, $headlines_header); }
function outputArticleXML($link, $id, $feed_id, $mark_as_read = true, $zoom_mode = false) { /* we can figure out feed_id from article id anyway, why do we * pass feed_id here? let's ignore the argument :( */ $result = db_query($link, "SELECT feed_id FROM ttrss_user_entries\n\t\t\tWHERE ref_id = '{$id}'"); $feed_id = (int) db_fetch_result($result, 0, "feed_id"); if (!$zoom_mode) { print "<article id='{$id}'><![CDATA["; } $result = db_query($link, "SELECT rtl_content, always_display_enclosures FROM ttrss_feeds\n\t\t\tWHERE id = '{$feed_id}' AND owner_uid = " . $_SESSION["uid"]); if (db_num_rows($result) == 1) { $rtl_content = sql_bool_to_bool(db_fetch_result($result, 0, "rtl_content")); $always_display_enclosures = sql_bool_to_bool(db_fetch_result($result, 0, "always_display_enclosures")); } else { $rtl_content = false; $always_display_enclosures = false; } if ($rtl_content) { $rtl_tag = "dir=\"RTL\""; $rtl_class = "RTL"; } else { $rtl_tag = ""; $rtl_class = ""; } if ($mark_as_read) { $result = db_query($link, "UPDATE ttrss_user_entries \n\t\t\t\tSET unread = false,last_read = NOW() \n\t\t\t\tWHERE ref_id = '{$id}' AND owner_uid = " . $_SESSION["uid"]); ccache_update($link, $feed_id, $_SESSION["uid"]); } $result = db_query($link, "SELECT title,link,content,feed_id,comments,int_id,\n\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,16) as updated,\n\t\t\t(SELECT icon_url FROM ttrss_feeds WHERE id = feed_id) as icon_url,\n\t\t\tnum_comments,\n\t\t\tauthor,\n\t\t\torig_feed_id,\n\t\t\tnote\n\t\t\tFROM ttrss_entries,ttrss_user_entries\n\t\t\tWHERE\tid = '{$id}' AND ref_id = id AND owner_uid = " . $_SESSION["uid"]); if ($result) { $line = db_fetch_assoc($result); if ($line["icon_url"]) { $feed_icon = "<img class=\"feedIcon\" src=\"" . $line["icon_url"] . "\">"; } else { $feed_icon = " "; } $num_comments = $line["num_comments"]; $entry_comments = ""; if ($num_comments > 0) { if ($line["comments"]) { $comments_url = $line["comments"]; } else { $comments_url = $line["link"]; } $entry_comments = "<a target='_blank' href=\"{$comments_url}\">{$num_comments} comments</a>"; } else { if ($line["comments"] && $line["link"] != $line["comments"]) { $entry_comments = "<a target='_blank' href=\"" . $line["comments"] . "\">comments</a>"; } } if ($zoom_mode) { header("Content-Type: text/html"); print "<html><head>\n\t\t\t\t\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n\t\t\t\t\t\t<title>Tiny Tiny RSS - " . $line["title"] . "</title>\n\t\t\t\t\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"tt-rss.css\">\n\t\t\t\t\t</head><body>"; } print "<div class=\"postReply\">"; print "<div class=\"postHeader\" onmouseover=\"enable_resize(true)\" \n\t\t\t\tonmouseout=\"enable_resize(false)\">"; $entry_author = $line["author"]; if ($entry_author) { $entry_author = __(" - ") . $entry_author; } $parsed_updated = date(get_pref($link, 'LONG_DATE_FORMAT'), strtotime($line["updated"])); print "<div class=\"postDate{$rtl_class}\">{$parsed_updated}</div>"; if ($line["link"]) { print "<div clear='both'><a target='_blank' href=\"" . $line["link"] . "\">" . $line["title"] . "</a><span class='author'>{$entry_author}</span></div>"; } else { print "<div clear='both'>" . $line["title"] . "{$entry_author}</div>"; } $tags_str = format_tags_string(get_article_tags($link, $id), $id); if (!$entry_comments) { $entry_comments = " "; } # placeholder print "<div style='float : right'>\n\t\t\t\t<img src='" . theme_image($link, 'images/tag.png') . "' \n\t\t\t\tclass='tagsPic' alt='Tags' title='Tags'> "; if (!$zoom_mode) { print "<span id=\"ATSTR-{$id}\">{$tags_str}</span>\n\t\t\t\t\t<a title=\"" . __('Edit tags for this article') . "\" \n\t\t\t\t\thref=\"javascript:editArticleTags({$id}, {$feed_id})\">(+)</a>"; print "<img src=\"" . theme_image($link, 'images/art-zoom.png') . "\" \n\t\t\t\t\t\tclass='tagsPic' style=\"cursor : pointer\" style=\"cursor : pointer\"\n\t\t\t\t\t\tonclick=\"zoomToArticle({$id})\"\n\t\t\t\t\t\talt='Zoom' title='" . __('Show article summary in new window') . "'>"; $note_escaped = htmlspecialchars($line['note'], ENT_QUOTES); print "<img src=\"" . theme_image($link, 'images/art-pub-note.png') . "\" \n\t\t\t\t\t\tclass='tagsPic' style=\"cursor : pointer\" style=\"cursor : pointer\"\n\t\t\t\t\t\tonclick=\"publishWithNote({$id}, '{$note_escaped}')\"\n\t\t\t\t\t\talt='PubNote' title='" . __('Publish article with a note') . "'>"; } else { $tags_str = strip_tags($tags_str); print "<span id=\"ATSTR-{$id}\">{$tags_str}</span>"; } print "</div>"; print "<div clear='both'>{$entry_comments}</div>"; if ($line["orig_feed_id"]) { $tmp_result = db_query($link, "SELECT * FROM ttrss_archived_feeds\n\t\t\t\t\tWHERE id = " . $line["orig_feed_id"]); if (db_num_rows($tmp_result) != 0) { print "<div clear='both'>"; print __("Originally from:"); print " "; $tmp_line = db_fetch_assoc($tmp_result); print "<a target='_blank' \n\t\t\t\t\t\thref=' " . htmlspecialchars($tmp_line['site_url']) . "'>" . $tmp_line['title'] . "</a>"; print " "; print "<a target='_blank' href='" . htmlspecialchars($tmp_line['feed_url']) . "'>"; print "<img title='" . __('Feed URL') . "'class='tinyFeedIcon' src='images/pub_set.gif'></a>"; print "</div>"; } } print "</div>"; print "<div class=\"postIcon\">" . $feed_icon . "</div>"; print "<div class=\"postContent\">"; $article_content = sanitize_rss($link, $line["content"]); print "<div id=\"POSTNOTE-{$id}\">"; if ($line['note']) { print format_article_note($id, $line['note']); } print "</div>"; print $article_content; // $result = db_query($link, "SELECT * FROM ttrss_enclosures WHERE // post_id = '$id' AND content_url != ''"); $result = get_article_enclosures($link, $id); // if (db_num_rows($result) > 0) { if (count($result) > 0) { $entries_html = array(); $entries = array(); //while ($line = db_fetch_assoc($result)) { foreach ($result as $line) { $url = $line["content_url"]; $ctype = $line["content_type"]; if (!$ctype) { $ctype = __("unknown type"); } $filename = substr($url, strrpos($url, "/") + 1); $entry = format_inline_player($link, $url, $ctype); $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" . $filename . " (" . $ctype . ")" . "</a>"; array_push($entries_html, $entry); $entry = array(); $entry["type"] = $ctype; $entry["filename"] = $filename; $entry["url"] = $url; array_push($entries, $entry); } print "<div class=\"postEnclosures\">"; if (!get_pref($link, "STRIP_IMAGES")) { if ($always_display_enclosures || !preg_match("/<img/i", $article_content)) { foreach ($entries as $entry) { if (preg_match("/image/", $entry["type"]) || preg_match("/\\.(jpg|png|gif|bmp)/i", $entry["filename"])) { print "<p><img\n\t\t\t\t\t\t\t\t\talt=\"" . htmlspecialchars($entry["filename"]) . "\"\n\t\t\t\t\t\t\t\t\tsrc=\"" . htmlspecialchars($entry["url"]) . "\"/></p>"; } } } } if (db_num_rows($result) == 1) { print __("Attachment:") . " "; } else { print __("Attachments:") . " "; } print join(", ", $entries_html); print "</div>"; } print "</div>"; print "</div>"; } if (!$zoom_mode) { print "]]></article>"; } else { print "\n\t\t\t\t<div style=\"text-align : center\">\n\t\t\t\t<button onclick=\"return window.close()\">" . __("Close this window") . "</button></div>"; print "</body></html>"; } }
function format_article_enclosures($link, $id, $always_display_enclosures, $article_content) { $result = get_article_enclosures($link, $id); $rv = ''; if (count($result) > 0) { $entries_html = array(); $entries = array(); $entries_inline = array(); foreach ($result as $line) { $url = $line["content_url"]; $ctype = $line["content_type"]; if (!$ctype) { $ctype = __("unknown type"); } $filename = substr($url, strrpos($url, "/") + 1); $player = format_inline_player($link, $url, $ctype); if ($player) { array_push($entries_inline, $player); } # $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" . # $filename . " (" . $ctype . ")" . "</a>"; $entry = "<div onclick=\"window.open('" . htmlspecialchars($url) . "')\"\n\t\t\t\t\tdojoType=\"dijit.MenuItem\">{$filename} ({$ctype})</div>"; array_push($entries_html, $entry); $entry = array(); $entry["type"] = $ctype; $entry["filename"] = $filename; $entry["url"] = $url; array_push($entries, $entry); } if (!get_pref($link, "STRIP_IMAGES")) { if ($always_display_enclosures || !preg_match("/<img/i", $article_content)) { foreach ($entries as $entry) { if (preg_match("/image/", $entry["type"]) || preg_match("/\\.(jpg|png|gif|bmp)/i", $entry["filename"])) { $rv .= "<p><img\n\t\t\t\t\t\t\t\talt=\"" . htmlspecialchars($entry["filename"]) . "\"\n\t\t\t\t\t\t\t\tsrc=\"" . htmlspecialchars($entry["url"]) . "\"/></p>"; } } } } if (count($entries_inline) > 0) { $rv .= "<hr clear='both'/>"; foreach ($entries_inline as $entry) { $rv .= $entry; } $rv .= "<hr clear='both'/>"; } $rv .= "<br/><div dojoType=\"dijit.form.DropDownButton\">" . "<span>" . __('Attachments') . "</span>"; $rv .= "<div dojoType=\"dijit.Menu\" style=\"display: none;\">"; foreach ($entries_html as $entry) { $rv .= $entry; } $rv .= "</div></div>"; } return $rv; }
private function generate_syndicated_feed($owner_uid, $feed, $is_cat, $limit, $offset, $search, $search_mode, $match_on, $view_mode = false, $format = 'atom') { require_once "lib/MiniTemplator.class.php"; $note_style = "background-color : #fff7d5;\n\t\t\tborder-width : 1px; " . "padding : 5px; border-style : dashed; border-color : #e7d796;" . "margin-bottom : 1em; color : #9a8c59;"; if (!$limit) { $limit = 100; } if (get_pref($this->link, "SORT_HEADLINES_BY_FEED_DATE", $owner_uid)) { $date_sort_field = "updated"; } else { $date_sort_field = "date_entered"; } if ($feed == -2) { $date_sort_field = "last_read"; } $qfh_ret = queryFeedHeadlines($this->link, $feed, $limit, $view_mode, $is_cat, $search, $search_mode, $match_on, "{$date_sort_field} DESC", $offset, $owner_uid, false, 0, false, true); $result = $qfh_ret[0]; $feed_title = htmlspecialchars($qfh_ret[1]); $feed_site_url = $qfh_ret[2]; $last_error = $qfh_ret[3]; $feed_self_url = get_self_url_prefix() . "/public.php?op=rss&id=-2&key=" . get_feed_access_key($this->link, -2, false, $owner_uid); if (!$feed_site_url) { $feed_site_url = get_self_url_prefix(); } if ($format == 'atom') { $tpl = new MiniTemplator(); $tpl->readTemplateFromFile("templates/generated_feed.txt"); $tpl->setVariable('FEED_TITLE', $feed_title, true); $tpl->setVariable('VERSION', VERSION, true); $tpl->setVariable('FEED_URL', htmlspecialchars($feed_self_url), true); if (PUBSUBHUBBUB_HUB && $feed == -2) { $tpl->setVariable('HUB_URL', htmlspecialchars(PUBSUBHUBBUB_HUB), true); $tpl->addBlock('feed_hub'); } $tpl->setVariable('SELF_URL', htmlspecialchars(get_self_url_prefix()), true); while ($line = db_fetch_assoc($result)) { $tpl->setVariable('ARTICLE_ID', htmlspecialchars($line['link']), true); $tpl->setVariable('ARTICLE_LINK', htmlspecialchars($line['link']), true); $tpl->setVariable('ARTICLE_TITLE', htmlspecialchars($line['title']), true); $tpl->setVariable('ARTICLE_EXCERPT', truncate_string(strip_tags($line["content_preview"]), 100, '...'), true); $content = sanitize($this->link, $line["content_preview"], false, $owner_uid); if ($line['note']) { $content = "<div style=\"{$note_style}\">Article note: " . $line['note'] . "</div>" . $content; } $tpl->setVariable('ARTICLE_CONTENT', $content, true); $tpl->setVariable('ARTICLE_UPDATED_ATOM', date('c', strtotime($line["updated"])), true); $tpl->setVariable('ARTICLE_UPDATED_RFC822', date(DATE_RFC822, strtotime($line["updated"])), true); $tpl->setVariable('ARTICLE_AUTHOR', htmlspecialchars($line['author']), true); $tags = get_article_tags($this->link, $line["id"], $owner_uid); foreach ($tags as $tag) { $tpl->setVariable('ARTICLE_CATEGORY', htmlspecialchars($tag), true); $tpl->addBlock('category'); } $enclosures = get_article_enclosures($this->link, $line["id"]); foreach ($enclosures as $e) { $type = htmlspecialchars($e['content_type']); $url = htmlspecialchars($e['content_url']); $length = $e['duration']; $tpl->setVariable('ARTICLE_ENCLOSURE_URL', $url, true); $tpl->setVariable('ARTICLE_ENCLOSURE_TYPE', $type, true); $tpl->setVariable('ARTICLE_ENCLOSURE_LENGTH', $length, true); $tpl->addBlock('enclosure'); } $tpl->addBlock('entry'); } $tmp = ""; $tpl->addBlock('feed'); $tpl->generateOutputToString($tmp); if (@(!$_REQUEST["noxml"])) { header("Content-Type: text/xml; charset=utf-8"); } else { header("Content-Type: text/plain; charset=utf-8"); } print $tmp; } else { if ($format == 'json') { $feed = array(); $feed['title'] = $feed_title; $feed['version'] = VERSION; $feed['feed_url'] = $feed_self_url; if (PUBSUBHUBBUB_HUB && $feed == -2) { $feed['hub_url'] = PUBSUBHUBBUB_HUB; } $feed['self_url'] = get_self_url_prefix(); $feed['articles'] = array(); while ($line = db_fetch_assoc($result)) { $article = array(); $article['id'] = $line['link']; $article['link'] = $line['link']; $article['title'] = $line['title']; $article['excerpt'] = truncate_string(strip_tags($line["content_preview"]), 100, '...'); $article['content'] = sanitize($this->link, $line["content_preview"], false, $owner_uid); $article['updated'] = date('c', strtotime($line["updated"])); if ($line['note']) { $article['note'] = $line['note']; } if ($article['author']) { $article['author'] = $line['author']; } $tags = get_article_tags($this->link, $line["id"], $owner_uid); if (count($tags) > 0) { $article['tags'] = array(); foreach ($tags as $tag) { array_push($article['tags'], $tag); } } $enclosures = get_article_enclosures($this->link, $line["id"]); if (count($enclosures) > 0) { $article['enclosures'] = array(); foreach ($enclosures as $e) { $type = $e['content_type']; $url = $e['content_url']; $length = $e['duration']; array_push($article['enclosures'], array("url" => $url, "type" => $type, "length" => $length)); } } array_push($feed['articles'], $article); } header("Content-Type: text/json; charset=utf-8"); print json_encode($feed); } else { header("Content-Type: text/plain; charset=utf-8"); print json_encode(array("error" => array("message" => "Unknown format"))); } } }
private function generate_syndicated_feed($owner_uid, $feed, $is_cat, $limit, $offset, $search, $search_mode, $view_mode = false, $format = 'atom', $order = false, $orig_guid = false) { require_once "lib/MiniTemplator.class.php"; $note_style = "background-color : #fff7d5;\n\t\t\tborder-width : 1px; " . "padding : 5px; border-style : dashed; border-color : #e7d796;" . "margin-bottom : 1em; color : #9a8c59;"; if (!$limit) { $limit = 60; } $date_sort_field = "date_entered DESC, updated DESC"; if ($feed == -2) { $date_sort_field = "last_published DESC"; } else { if ($feed == -1) { $date_sort_field = "last_marked DESC"; } } switch ($order) { case "title": $date_sort_field = "ttrss_entries.title"; break; case "date_reverse": $date_sort_field = "date_entered, updated"; break; case "feed_dates": $date_sort_field = "updated DESC"; break; } $qfh_ret = queryFeedHeadlines($feed, 1, $view_mode, $is_cat, $search, $search_mode, $date_sort_field, $offset, $owner_uid, false, 0, false, true); $result = $qfh_ret[0]; if ($this->dbh->num_rows($result) != 0) { $ts = strtotime($this->dbh->fetch_result($result, 0, "date_entered")); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $ts) { header('HTTP/1.0 304 Not Modified'); return; } $last_modified = gmdate("D, d M Y H:i:s", $ts) . " GMT"; header("Last-Modified: {$last_modified}", true); } $qfh_ret = queryFeedHeadlines($feed, $limit, $view_mode, $is_cat, $search, $search_mode, $date_sort_field, $offset, $owner_uid, false, 0, false, true); $result = $qfh_ret[0]; $feed_title = htmlspecialchars($qfh_ret[1]); $feed_site_url = $qfh_ret[2]; $last_error = $qfh_ret[3]; $feed_self_url = get_self_url_prefix() . "/public.php?op=rss&id={$feed}&key=" . get_feed_access_key($feed, false, $owner_uid); if (!$feed_site_url) { $feed_site_url = get_self_url_prefix(); } if ($format == 'atom') { $tpl = new MiniTemplator(); $tpl->readTemplateFromFile("templates/generated_feed.txt"); $tpl->setVariable('FEED_TITLE', $feed_title, true); $tpl->setVariable('VERSION', VERSION, true); $tpl->setVariable('FEED_URL', htmlspecialchars($feed_self_url), true); if (PUBSUBHUBBUB_HUB && $feed == -2) { $tpl->setVariable('HUB_URL', htmlspecialchars(PUBSUBHUBBUB_HUB), true); $tpl->addBlock('feed_hub'); } $tpl->setVariable('SELF_URL', htmlspecialchars(get_self_url_prefix()), true); $line["content_preview"] = truncate_string(strip_tags($line["content_preview"]), 100, '...'); while ($line = $this->dbh->fetch_assoc($result)) { foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_QUERY_HEADLINES) as $p) { $line = $p->hook_query_headlines($line); } $tpl->setVariable('ARTICLE_ID', htmlspecialchars($orig_guid ? $line['link'] : get_self_url_prefix() . "/public.php?url=" . urlencode($line['link'])), true); $tpl->setVariable('ARTICLE_LINK', htmlspecialchars($line['link']), true); $tpl->setVariable('ARTICLE_TITLE', htmlspecialchars($line['title']), true); $tpl->setVariable('ARTICLE_EXCERPT', $line["content_preview"], true); $content = sanitize($line["content"], false, $owner_uid); if ($line['note']) { $content = "<div style=\"{$note_style}\">Article note: " . $line['note'] . "</div>" . $content; $tpl->setVariable('ARTICLE_NOTE', htmlspecialchars($line['note']), true); } $tpl->setVariable('ARTICLE_CONTENT', $content, true); $tpl->setVariable('ARTICLE_UPDATED_ATOM', date('c', strtotime($line["updated"])), true); $tpl->setVariable('ARTICLE_UPDATED_RFC822', date(DATE_RFC822, strtotime($line["updated"])), true); $tpl->setVariable('ARTICLE_AUTHOR', htmlspecialchars($line['author']), true); $tpl->setVariable('ARTICLE_SOURCE_LINK', htmlspecialchars($line['site_url']), true); $tpl->setVariable('ARTICLE_SOURCE_TITLE', htmlspecialchars($line['feed_title']), true); $tags = get_article_tags($line["id"], $owner_uid); foreach ($tags as $tag) { $tpl->setVariable('ARTICLE_CATEGORY', htmlspecialchars($tag), true); $tpl->addBlock('category'); } $enclosures = get_article_enclosures($line["id"]); foreach ($enclosures as $e) { $type = htmlspecialchars($e['content_type']); $url = htmlspecialchars($e['content_url']); $length = $e['duration']; $tpl->setVariable('ARTICLE_ENCLOSURE_URL', $url, true); $tpl->setVariable('ARTICLE_ENCLOSURE_TYPE', $type, true); $tpl->setVariable('ARTICLE_ENCLOSURE_LENGTH', $length, true); $tpl->addBlock('enclosure'); } $tpl->addBlock('entry'); } $tmp = ""; $tpl->addBlock('feed'); $tpl->generateOutputToString($tmp); if (@(!$_REQUEST["noxml"])) { header("Content-Type: text/xml; charset=utf-8"); } else { header("Content-Type: text/plain; charset=utf-8"); } print $tmp; } else { if ($format == 'json') { $feed = array(); $feed['title'] = $feed_title; $feed['version'] = VERSION; $feed['feed_url'] = $feed_self_url; if (PUBSUBHUBBUB_HUB && $feed == -2) { $feed['hub_url'] = PUBSUBHUBBUB_HUB; } $feed['self_url'] = get_self_url_prefix(); $feed['articles'] = array(); while ($line = $this->dbh->fetch_assoc($result)) { $line["content_preview"] = truncate_string(strip_tags($line["content_preview"]), 100, '...'); foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_QUERY_HEADLINES) as $p) { $line = $p->hook_query_headlines($line, 100); } $article = array(); $article['id'] = $line['link']; $article['link'] = $line['link']; $article['title'] = $line['title']; $article['excerpt'] = $line["content_preview"]; $article['content'] = sanitize($line["content"], false, $owner_uid); $article['updated'] = date('c', strtotime($line["updated"])); if ($line['note']) { $article['note'] = $line['note']; } if ($article['author']) { $article['author'] = $line['author']; } $tags = get_article_tags($line["id"], $owner_uid); if (count($tags) > 0) { $article['tags'] = array(); foreach ($tags as $tag) { array_push($article['tags'], $tag); } } $enclosures = get_article_enclosures($line["id"]); if (count($enclosures) > 0) { $article['enclosures'] = array(); foreach ($enclosures as $e) { $type = $e['content_type']; $url = $e['content_url']; $length = $e['duration']; array_push($article['enclosures'], array("url" => $url, "type" => $type, "length" => $length)); } } array_push($feed['articles'], $article); } header("Content-Type: text/json; charset=utf-8"); print json_encode($feed); } else { header("Content-Type: text/plain; charset=utf-8"); print json_encode(array("error" => array("message" => "Unknown format"))); } } }
function getArticle() { $article_id = join(",", array_filter(explode(",", db_escape_string($_REQUEST["article_id"])), is_numeric)); $query = "SELECT id,title,link,content,cached_content,feed_id,comments,int_id,\n\t\t\tmarked,unread,published,\n\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,16) as updated,\n\t\t\tauthor\n\t\t\tFROM ttrss_entries,ttrss_user_entries\n\t\t\tWHERE\tid IN ({$article_id}) AND ref_id = id AND owner_uid = " . $_SESSION["uid"]; $result = db_query($this->link, $query); $articles = array(); if (db_num_rows($result) != 0) { while ($line = db_fetch_assoc($result)) { $attachments = get_article_enclosures($this->link, $line['id']); $article = array("id" => $line["id"], "title" => $line["title"], "link" => $line["link"], "labels" => get_article_labels($this->link, $line['id']), "unread" => sql_bool_to_bool($line["unread"]), "marked" => sql_bool_to_bool($line["marked"]), "published" => sql_bool_to_bool($line["published"]), "comments" => $line["comments"], "author" => $line["author"], "updated" => strtotime($line["updated"]), "content" => $line["cached_content"] != "" ? $line["cached_content"] : $line["content"], "feed_id" => $line["feed_id"], "attachments" => $attachments); array_push($articles, $article); } } print $this->wrap(self::STATUS_OK, $articles); }
function format_article_enclosures($id, $always_display_enclosures, $article_content, $hide_images = false) { $result = get_article_enclosures($id); $rv = ''; if (count($result) > 0) { $entries_html = array(); $entries = array(); $entries_inline = array(); foreach ($result as $line) { $url = $line["content_url"]; $ctype = $line["content_type"]; if (!$ctype) { $ctype = __("unknown type"); } $filename = substr($url, strrpos($url, "/") + 1); $player = format_inline_player($url, $ctype); if ($player) { array_push($entries_inline, $player); } # $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" . # $filename . " (" . $ctype . ")" . "</a>"; $entry = "<div onclick=\"window.open('" . htmlspecialchars($url) . "')\"\n\t\t\t\t\tdojoType=\"dijit.MenuItem\">{$filename} ({$ctype})</div>"; array_push($entries_html, $entry); $entry = array(); $entry["type"] = $ctype; $entry["filename"] = $filename; $entry["url"] = $url; array_push($entries, $entry); } if ($_SESSION['uid'] && !get_pref("STRIP_IMAGES") && !$_SESSION["bw_limit"]) { if ($always_display_enclosures || !preg_match("/<img/i", $article_content)) { foreach ($entries as $entry) { if (preg_match("/image/", $entry["type"]) || preg_match("/\\.(jpg|png|gif|bmp)/i", $entry["filename"])) { if (!$hide_images) { $rv .= "<p><img\n\t\t\t\t\t\t\t\t\talt=\"" . htmlspecialchars($entry["filename"]) . "\"\n\t\t\t\t\t\t\t\t\tsrc=\"" . htmlspecialchars($entry["url"]) . "\"/></p>"; } else { $rv .= "<p><a target=\"_blank\"\n\t\t\t\t\t\t\t\t\thref=\"" . htmlspecialchars($entry["url"]) . "\"\n\t\t\t\t\t\t\t\t\t>" . htmlspecialchars($entry["url"]) . "</a></p>"; } } } } } if (count($entries_inline) > 0) { $rv .= "<hr clear='both'/>"; foreach ($entries_inline as $entry) { $rv .= $entry; } $rv .= "<hr clear='both'/>"; } $rv .= "<select class=\"attachments\" onchange=\"openSelectedAttachment(this)\">" . "<option value=''>" . __('Attachments') . "</option>"; foreach ($entries as $entry) { $rv .= "<option value=\"" . htmlspecialchars($entry["url"]) . "\">" . htmlspecialchars($entry["filename"]) . "</option>"; } $rv .= "</select>"; } return $rv; }
function format_article_enclosures($link, $id, $always_display_enclosures, $article_content) { $result = get_article_enclosures($link, $id); $rv = ''; if (count($result) > 0) { $entries_html = array(); $entries = array(); foreach ($result as $line) { $url = $line["content_url"]; $ctype = $line["content_type"]; if (!$ctype) { $ctype = __("unknown type"); } # $filename = substr($url, strrpos($url, "/")+1); $entry = format_inline_player($link, $url, $ctype); # $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" . # $filename . " (" . $ctype . ")" . "</a>"; array_push($entries_html, $entry); $entry = array(); $entry["type"] = $ctype; $entry["filename"] = $filename; $entry["url"] = $url; array_push($entries, $entry); } $rv .= "<div class=\"postEnclosures\">"; if (!get_pref($link, "STRIP_IMAGES")) { if ($always_display_enclosures || !preg_match("/<img/i", $article_content)) { foreach ($entries as $entry) { if (preg_match("/image/", $entry["type"]) || preg_match("/\\.(jpg|png|gif|bmp)/i", $entry["filename"])) { $rv .= "<p><img\n\t\t\t\t\t\t\t\talt=\"" . htmlspecialchars($entry["filename"]) . "\"\n\t\t\t\t\t\t\t\tsrc=\"" . htmlspecialchars($entry["url"]) . "\"/></p>"; } } } } if (count($entries) == 1) { $rv .= __("Attachment:") . " "; } else { $rv .= __("Attachments:") . " "; } $rv .= join(", ", $entries_html); $rv .= "</div>"; } return $rv; }
function format_article_enclosures($id, $always_display_enclosures, $article_content, $hide_images = false) { $result = get_article_enclosures($id); $rv = ''; foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_FORMAT_ENCLOSURES) as $plugin) { $retval = $plugin->hook_format_enclosures($rv, $result, $id, $always_display_enclosures, $article_content, $hide_images); if (is_array($retval)) { $rv = $retval[0]; $result = $retval[1]; } else { $rv = $retval; } } if ($rv === '' && !empty($result)) { $entries_html = array(); $entries = array(); $entries_inline = array(); foreach ($result as $line) { $url = $line["content_url"]; $ctype = $line["content_type"]; $title = $line["title"]; $width = $line["width"]; $height = $line["height"]; if (!$ctype) { $ctype = __("unknown type"); } $filename = substr($url, strrpos($url, "/") + 1); $player = format_inline_player($url, $ctype); if ($player) { array_push($entries_inline, $player); } # $entry .= " <a target=\"_blank\" href=\"" . htmlspecialchars($url) . "\">" . # $filename . " (" . $ctype . ")" . "</a>"; $entry = "<div onclick=\"window.open('" . htmlspecialchars($url) . "')\"\n\t\t\t\t\tdojoType=\"dijit.MenuItem\">{$filename} ({$ctype})</div>"; array_push($entries_html, $entry); $entry = array(); $entry["type"] = $ctype; $entry["filename"] = $filename; $entry["url"] = $url; $entry["title"] = $title; $entry["width"] = $width; $entry["height"] = $height; array_push($entries, $entry); } if ($_SESSION['uid'] && !get_pref("STRIP_IMAGES") && !$_SESSION["bw_limit"]) { if ($always_display_enclosures || !preg_match("/<img/i", $article_content)) { foreach ($entries as $entry) { if (preg_match("/image/", $entry["type"]) || preg_match("/\\.(jpg|png|gif|bmp)/i", $entry["filename"])) { if (!$hide_images) { $encsize = ''; if ($entry['height'] > 0) { $encsize .= ' height="' . intval($entry['width']) . '"'; } if ($entry['width'] > 0) { $encsize .= ' width="' . intval($entry['height']) . '"'; } $rv .= "<p><img\n\t\t\t\t\t\t\t\t\talt=\"" . htmlspecialchars($entry["filename"]) . "\"\n\t\t\t\t\t\t\t\t\tsrc=\"" . htmlspecialchars($entry["url"]) . "\"\n\t\t\t\t\t\t\t\t\t" . $encsize . " /></p>"; } else { $rv .= "<p><a target=\"_blank\"\n\t\t\t\t\t\t\t\t\thref=\"" . htmlspecialchars($entry["url"]) . "\"\n\t\t\t\t\t\t\t\t\t>" . htmlspecialchars($entry["url"]) . "</a></p>"; } if ($entry['title']) { $rv .= "<div class=\"enclosure_title\">{$entry['title']}</div>"; } } } } } if (count($entries_inline) > 0) { $rv .= "<hr clear='both'/>"; foreach ($entries_inline as $entry) { $rv .= $entry; } $rv .= "<hr clear='both'/>"; } $rv .= "<select class=\"attachments\" onchange=\"openSelectedAttachment(this)\">" . "<option value=''>" . __('Attachments') . "</option>"; foreach ($entries as $entry) { if ($entry["title"]) { $title = "— " . truncate_string($entry["title"], 30); } else { $title = ""; } $rv .= "<option value=\"" . htmlspecialchars($entry["url"]) . "\">" . htmlspecialchars($entry["filename"]) . "{$title}</option>"; } $rv .= "</select>"; } return $rv; }
function getItems() { // items from specific groups, feeds $items = array(); $item_limit = 50; $where = " owner_uid = '" . db_escape_string($_SESSION["uid"]) . "' AND ref_id = id "; if (isset($_REQUEST["feed_ids"]) || isset($_REQUEST["group_ids"])) { $feed_ids = array(); if (isset($_REQUEST["feed_ids"])) { $feed_ids = explode(",", $_REQUEST["feed_ids"]); } if (isset($_REQUEST["group_ids"])) { $group_ids = explode(",", $_REQUEST["group_ids"]); $num_group_ids = sizeof($group_ids); $groups_query = " AND cat_id IN ("; foreach ($group_ids as $group_id) { if (is_numeric($group_id)) { $groups_query .= db_escape_string(intval($group_id)) . ","; } else { $num_group_ids--; } } if ($num_group_ids <= 0) { $groups_query = " AND cat_id IN ('') "; } else { $groups_query = trim($groups_query, ",") . ")"; } $feeds_in_group_result = $this->dbh->query("SELECT id" . "FROM ttrss_feeds" . "WHERE owner_uid = '" . db_escape_string($_SESSION["uid"]) . "' " . $groups_query); $group_feed_ids = array(); while ($line = $this->dbh->fetch_assoc($feeds_in_group_result)) { array_push($group_feed_ids, $line["id"]); } $feed_ids = array_unique(array_merge($feed_ids, $group_feed_ids)); } $query = " feed_id IN ("; $num_feed_ids = sizeof($feed_ids); foreach ($feed_ids as $feed_id) { if (is_numeric($feed_id)) { $query .= db_escape_string(intval($feed_id)) . ","; } else { $num_feed_ids--; } } if ($num_feed_ids <= 0) { $query = " feed_id IN ('') "; } else { $query = trim($query, ",") . ")"; } if (!empty($where)) { $where .= " AND "; } $where .= $query; } if (isset($_REQUEST["max_id"])) { // use the max_id argument to request the previous $item_limit items if (is_numeric($_REQUEST["max_id"])) { $max_id = $_REQUEST["max_id"] > 0 ? intval($_REQUEST["max_id"]) : 0; if ($max_id) { if (!empty($where)) { $where .= " AND "; } $where .= "id < " . db_escape_string($max_id) . " "; } else { if (empty($where)) { $where .= "1"; } } $where .= " ORDER BY id DESC"; } } else { if (isset($_REQUEST["with_ids"])) { if (!empty($where)) { $where .= " AND "; } // group_ids & feed_ids don't make sense with this query but just in case $item_ids = explode(",", $_REQUEST["with_ids"]); $query = "id IN ("; $num_ids = sizeof($item_ids); foreach ($item_ids as $item_id) { if (is_numeric($item_id)) { $query .= db_escape_string(intval($item_id)) . ","; } else { $num_ids--; } } if ($num_ids <= 0) { $query = "id IN ('') "; } else { $query = trim($query, ",") . ") "; } $where .= $query; } else { if (is_numeric($_REQUEST["since_id"])) { // use the since_id argument to request the next $item_limit items $since_id = isset($_GET["since_id"]) ? intval($_GET["since_id"]) : 0; if ($since_id) { if (!empty($where)) { $where .= " AND "; } if ($this->ID_HACK_FOR_MRREADER) { $where .= "id > " . db_escape_string($since_id * 1000) . " "; // NASTY hack for Mr. Reader 2.0 on iOS and TinyTiny RSS Fever } else { $where .= "id > " . db_escape_string($since_id) . " "; } } else { if (empty($where)) { $where .= "1"; } } $where .= " ORDER BY id ASC"; } } } $where .= " LIMIT " . $item_limit; // id, feed_id, title, author, html, url, is_saved, is_read, created_on_time $result = $this->dbh->query("SELECT ref_id, feed_id, title, link, content, id, marked, unread, author, updated\n\t\t\t\t\t\t\t\t\t FROM ttrss_entries, ttrss_user_entries\n\t\t\t\t\t\t\t\t\t WHERE " . $where); while ($line = $this->dbh->fetch_assoc($result)) { $line_content = $this->my_sanitize($line["content"], $line["link"]); if (ADD_ATTACHED_FILES) { $enclosures = get_article_enclosures($line["id"]); if (count($enclosures) > 0) { $line_content .= '<ul type="lower-greek">'; foreach ($enclosures as $enclosure) { if (!empty($enclosure['content_url'])) { $enc_type = ''; if (!empty($enclosure['content_type'])) { $enc_type = ', ' . $enclosure['content_type']; } $enc_size = ''; if (!empty($enclosure['duration'])) { $enc_size = ' , ' . $this->formatBytes($enclosure['duration']); } $line_content .= '<li><a href="' . $enclosure['content_url'] . '" target="_blank">' . basename($enclosure['content_url']) . $enc_type . $enc_size . '</a>' . '</li>'; } } $line_content .= '</ul>'; } } array_push($items, array("id" => intval($line["id"]), "feed_id" => intval($line["feed_id"]), "title" => $line["title"], "author" => $line["author"], "html" => $line_content, "url" => $line["link"], "is_saved" => sql_bool_to_bool($line["marked"]) ? 1 : 0, "is_read" => !sql_bool_to_bool($line["unread"]) ? 1 : 0, "created_on_time" => strtotime($line["updated"]))); } return $items; }
static function api_get_headlines($link, $feed_id, $limit, $offset, $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $order, $include_attachments, $since_id, $search = "", $search_mode = "", $match_on = "", $include_nested = false, $sanitize_content = true) { $qfh_ret = queryFeedHeadlines($link, $feed_id, $limit, $view_mode, $is_cat, $search, $search_mode, $match_on, $order, $offset, 0, false, $since_id, $include_nested); $result = $qfh_ret[0]; $feed_title = $qfh_ret[1]; $headlines = array(); while ($line = db_fetch_assoc($result)) { $is_updated = $line["last_read"] == "" && ($line["unread"] != "t" && $line["unread"] != "1"); $tags = explode(",", $line["tag_cache"]); $labels = json_decode($line["label_cache"], true); //if (!$tags) $tags = get_article_tags($link, $line["id"]); //if (!$labels) $labels = get_article_labels($link, $line["id"]); $headline_row = array("id" => (int) $line["id"], "unread" => sql_bool_to_bool($line["unread"]), "marked" => sql_bool_to_bool($line["marked"]), "published" => sql_bool_to_bool($line["published"]), "updated" => (int) strtotime($line["updated"]), "is_updated" => $is_updated, "title" => $line["title"], "link" => $line["link"], "feed_id" => $line["feed_id"], "tags" => $tags); if ($include_attachments) { $headline_row['attachments'] = get_article_enclosures($link, $line['id']); } if ($show_excerpt) { $excerpt = truncate_string(strip_tags($line["content_preview"]), 100); $headline_row["excerpt"] = $excerpt; } if ($show_content) { if ($line["cached_content"] != "") { $line["content_preview"] =& $line["cached_content"]; } if ($sanitize_content) { $headline_row["content"] = sanitize($link, $line["content_preview"], false, false, $line["site_url"]); } else { $headline_row["content"] = $line["content_preview"]; } } // unify label output to ease parsing if ($labels["no-labels"] == 1) { $labels = array(); } $headline_row["labels"] = $labels; $headline_row["feed_title"] = $line["feed_title"]; $headline_row["comments_count"] = (int) $line["num_comments"]; $headline_row["comments_link"] = $line["comments"]; $headline_row["always_display_attachments"] = sql_bool_to_bool($line["always_display_enclosures"]); array_push($headlines, $headline_row); } return $headlines; }
private function generate_syndicated_feed($owner_uid, $feed, $is_cat, $limit, $search, $search_mode, $match_on, $view_mode = false) { require_once "lib/MiniTemplator.class.php"; $note_style = "background-color : #fff7d5;\n\t\t\tborder-width : 1px; " . "padding : 5px; border-style : dashed; border-color : #e7d796;" . "margin-bottom : 1em; color : #9a8c59;"; if (!$limit) { $limit = 30; } if (get_pref($this->link, "SORT_HEADLINES_BY_FEED_DATE", $owner_uid)) { $date_sort_field = "updated"; } else { $date_sort_field = "date_entered"; } $qfh_ret = queryFeedHeadlines($this->link, $feed, $limit, $view_mode, $is_cat, $search, $search_mode, $match_on, "{$date_sort_field} DESC", 0, $owner_uid); $result = $qfh_ret[0]; $feed_title = htmlspecialchars($qfh_ret[1]); $feed_site_url = $qfh_ret[2]; $last_error = $qfh_ret[3]; $feed_self_url = get_self_url_prefix() . "/public.php?op=rss&id=-2&key=" . get_feed_access_key($this->link, -2, false, $owner_uid); if (!$feed_site_url) { $feed_site_url = get_self_url_prefix(); } $tpl = new MiniTemplator(); $tpl->readTemplateFromFile("templates/generated_feed.txt"); $tpl->setVariable('FEED_TITLE', $feed_title, true); $tpl->setVariable('VERSION', VERSION, true); $tpl->setVariable('FEED_URL', htmlspecialchars($feed_self_url), true); if (PUBSUBHUBBUB_HUB && $feed == -2) { $tpl->setVariable('HUB_URL', htmlspecialchars(PUBSUBHUBBUB_HUB), true); $tpl->addBlock('feed_hub'); } $tpl->setVariable('SELF_URL', htmlspecialchars(get_self_url_prefix()), true); while ($line = db_fetch_assoc($result)) { $tpl->setVariable('ARTICLE_ID', htmlspecialchars($line['link']), true); $tpl->setVariable('ARTICLE_LINK', htmlspecialchars($line['link']), true); $tpl->setVariable('ARTICLE_TITLE', htmlspecialchars($line['title']), true); $tpl->setVariable('ARTICLE_EXCERPT', truncate_string(strip_tags($line["content_preview"]), 100, '...'), true); $content = sanitize($this->link, $line["content_preview"], false, $owner_uid); if ($line['note']) { $content = "<div style=\"{$note_style}\">Article note: " . $line['note'] . "</div>" . $content; } $tpl->setVariable('ARTICLE_CONTENT', $content, true); $tpl->setVariable('ARTICLE_UPDATED_ATOM', date('c', strtotime($line["updated"])), true); $tpl->setVariable('ARTICLE_UPDATED_RFC822', date(DATE_RFC822, strtotime($line["updated"])), true); $tpl->setVariable('ARTICLE_AUTHOR', htmlspecialchars($line['author']), true); $tags = get_article_tags($this->link, $line["id"], $owner_uid); foreach ($tags as $tag) { $tpl->setVariable('ARTICLE_CATEGORY', htmlspecialchars($tag), true); $tpl->addBlock('category'); } $enclosures = get_article_enclosures($this->link, $line["id"]); foreach ($enclosures as $e) { $type = htmlspecialchars($e['content_type']); $url = htmlspecialchars($e['content_url']); $length = $e['duration']; $tpl->setVariable('ARTICLE_ENCLOSURE_URL', $url, true); $tpl->setVariable('ARTICLE_ENCLOSURE_TYPE', $type, true); $tpl->setVariable('ARTICLE_ENCLOSURE_LENGTH', $length, true); $tpl->addBlock('enclosure'); } $tpl->addBlock('entry'); } $tmp = ""; $tpl->addBlock('feed'); $tpl->generateOutputToString($tmp); print $tmp; }
ccache_update($link, $line["feed_id"], $_SESSION["uid"]); } } print api_wrap_reply(API_STATUS_OK, $seq, array("status" => "OK", "updated" => $num_updated)); } else { print api_wrap_reply(API_STATUS_ERR, $seq, array("error" => 'INCORRECT_USAGE')); } break; case "getArticle": $article_id = join(",", array_filter(explode(",", db_escape_string($_REQUEST["article_id"])), is_numeric)); $query = "SELECT id,title,link,content,feed_id,comments,int_id,\n\t\t\t\tmarked,unread,published,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(updated,1,16) as updated,\n\t\t\t\tauthor\n\t\t\t\tFROM ttrss_entries,ttrss_user_entries\n\t\t\t\tWHERE\tid IN ({$article_id}) AND ref_id = id AND owner_uid = " . $_SESSION["uid"]; $result = db_query($link, $query); $articles = array(); if (db_num_rows($result) != 0) { while ($line = db_fetch_assoc($result)) { $attachments = get_article_enclosures($link, $line['id']); $article = array("id" => $line["id"], "title" => $line["title"], "link" => $line["link"], "labels" => get_article_labels($link, $line['id']), "unread" => sql_bool_to_bool($line["unread"]), "marked" => sql_bool_to_bool($line["marked"]), "published" => sql_bool_to_bool($line["published"]), "comments" => $line["comments"], "author" => $line["author"], "updated" => strtotime($line["updated"]), "content" => $line["content"], "feed_id" => $line["feed_id"], "attachments" => $attachments); array_push($articles, $article); } } print api_wrap_reply(API_STATUS_OK, $seq, $articles); break; case "getConfig": $config = array("icons_dir" => ICONS_DIR, "icons_url" => ICONS_URL); $config["daemon_is_running"] = file_is_locked("update_daemon.lock"); $result = db_query($link, "SELECT COUNT(*) AS cf FROM\n\t\t\t\tttrss_feeds WHERE owner_uid = " . $_SESSION["uid"]); $num_feeds = db_fetch_result($result, 0, "cf"); $config["num_feeds"] = (int) $num_feeds; print api_wrap_reply(API_STATUS_OK, $seq, $config); break; case "updateFeed":
static function api_get_headlines($feed_id, $limit, $offset, $filter, $is_cat, $show_excerpt, $show_content, $view_mode, $order, $include_attachments, $since_id, $search = "", $search_mode = "", $include_nested = false, $sanitize_content = true) { $qfh_ret = queryFeedHeadlines($feed_id, $limit, $view_mode, $is_cat, $search, $search_mode, $order, $offset, 0, false, $since_id, $include_nested); $result = $qfh_ret[0]; $feed_title = $qfh_ret[1]; $headlines = array(); while ($line = db_fetch_assoc($result)) { $line["content_preview"] = truncate_string(strip_tags($line["content"]), 100); foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_QUERY_HEADLINES) as $p) { $line = $p->hook_query_headlines($line, 100, true); } $is_updated = $line["last_read"] == "" && ($line["unread"] != "t" && $line["unread"] != "1"); $tags = explode(",", $line["tag_cache"]); $labels = json_decode($line["label_cache"], true); //if (!$tags) $tags = get_article_tags($line["id"]); //if (!$labels) $labels = get_article_labels($line["id"]); $headline_row = array("id" => (int) $line["id"], "unread" => sql_bool_to_bool($line["unread"]), "marked" => sql_bool_to_bool($line["marked"]), "published" => sql_bool_to_bool($line["published"]), "updated" => (int) strtotime($line["updated"]), "is_updated" => $is_updated, "title" => $line["title"], "link" => $line["link"], "feed_id" => $line["feed_id"], "tags" => $tags); if ($include_attachments) { $headline_row['attachments'] = get_article_enclosures($line['id']); } if ($show_excerpt) { $headline_row["excerpt"] = $line["content_preview"]; } if ($show_content) { if ($sanitize_content) { $headline_row["content"] = sanitize($line["content"], sql_bool_to_bool($line['hide_images']), false, $line["site_url"], false, $line["id"]); } else { $headline_row["content"] = $line["content"]; } } // unify label output to ease parsing if ($labels["no-labels"] == 1) { $labels = array(); } $headline_row["labels"] = $labels; $headline_row["feed_title"] = $line["feed_title"] ? $line["feed_title"] : $feed_title; $headline_row["comments_count"] = (int) $line["num_comments"]; $headline_row["comments_link"] = $line["comments"]; $headline_row["always_display_attachments"] = sql_bool_to_bool($line["always_display_enclosures"]); $headline_row["author"] = $line["author"]; $headline_row["score"] = (int) $line["score"]; $headline_row["note"] = $line["note"]; $headline_row["lang"] = $line["lang"]; foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_RENDER_ARTICLE_API) as $p) { $headline_row = $p->hook_render_article_api(array("headline" => $headline_row)); } array_push($headlines, $headline_row); } return $headlines; }