2011-12-13 11:40:42 +00:00
< ? php
class API extends Handler {
2013-04-11 16:06:07 +00:00
const API_LEVEL = 6 ;
2011-12-13 11:40:42 +00:00
const STATUS_OK = 0 ;
const STATUS_ERR = 1 ;
private $seq ;
function before ( $method ) {
if ( parent :: before ( $method )) {
2013-01-12 08:52:35 +00:00
header ( " Content-Type: text/json " );
2011-12-13 11:40:42 +00:00
if ( ! $_SESSION [ " uid " ] && $method != " login " && $method != " isloggedin " ) {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => 'NOT_LOGGED_IN' ));
return false ;
}
if ( $_SESSION [ " uid " ] && $method != " logout " && ! get_pref ( $this -> link , 'ENABLE_API_ACCESS' )) {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => 'API_DISABLED' ));
return false ;
}
$this -> seq = ( int ) $_REQUEST [ 'seq' ];
return true ;
}
return false ;
}
function wrap ( $status , $reply ) {
print json_encode ( array ( " seq " => $this -> seq ,
" status " => $status ,
" content " => $reply ));
}
function getVersion () {
$rv = array ( " version " => VERSION );
print $this -> wrap ( self :: STATUS_OK , $rv );
}
function getApiLevel () {
2011-12-13 12:51:49 +00:00
$rv = array ( " level " => self :: API_LEVEL );
2011-12-13 11:40:42 +00:00
print $this -> wrap ( self :: STATUS_OK , $rv );
}
function login () {
2013-03-28 04:46:20 +00:00
@ session_destroy ();
2013-03-28 04:06:21 +00:00
@ session_start ();
2013-03-22 05:14:55 +00:00
$login = db_escape_string ( $this -> link , $_REQUEST [ " user " ]);
2011-12-13 11:40:42 +00:00
$password = $_REQUEST [ " password " ];
$password_base64 = base64_decode ( $_REQUEST [ " password " ]);
if ( SINGLE_USER_MODE ) $login = " admin " ;
$result = db_query ( $this -> link , " SELECT id FROM ttrss_users WHERE login = ' $login ' " );
if ( db_num_rows ( $result ) != 0 ) {
$uid = db_fetch_result ( $result , 0 , " id " );
} else {
$uid = 0 ;
}
if ( ! $uid ) {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => " LOGIN_ERROR " ));
return ;
}
if ( get_pref ( $this -> link , " ENABLE_API_ACCESS " , $uid )) {
if ( authenticate_user ( $this -> link , $login , $password )) { // try login with normal password
2012-09-29 07:59:50 +00:00
print $this -> wrap ( self :: STATUS_OK , array ( " session_id " => session_id (),
" api_level " => self :: API_LEVEL ));
2011-12-13 11:40:42 +00:00
} else if ( authenticate_user ( $this -> link , $login , $password_base64 )) { // else try with base64_decoded password
2012-09-29 07:59:50 +00:00
print $this -> wrap ( self :: STATUS_OK , array ( " session_id " => session_id (),
" api_level " => self :: API_LEVEL ));
2011-12-13 11:40:42 +00:00
} else { // else we are not logged in
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => " LOGIN_ERROR " ));
}
} else {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => " API_DISABLED " ));
}
}
function logout () {
logout_user ();
print $this -> wrap ( self :: STATUS_OK , array ( " status " => " OK " ));
}
function isLoggedIn () {
print $this -> wrap ( self :: STATUS_OK , array ( " status " => $_SESSION [ " uid " ] != '' ));
}
function getUnread () {
2013-03-22 05:14:55 +00:00
$feed_id = db_escape_string ( $this -> link , $_REQUEST [ " feed_id " ]);
$is_cat = db_escape_string ( $this -> link , $_REQUEST [ " is_cat " ]);
2011-12-13 11:40:42 +00:00
if ( $feed_id ) {
print $this -> wrap ( self :: STATUS_OK , array ( " unread " => getFeedUnread ( $this -> link , $feed_id , $is_cat )));
} else {
print $this -> wrap ( self :: STATUS_OK , array ( " unread " => getGlobalUnread ( $this -> link )));
}
}
/* Method added for ttrss-reader for Android */
function getCounters () {
2013-02-01 09:09:43 +00:00
print $this -> wrap ( self :: STATUS_OK , getAllCounters ( $this -> link ));
2011-12-13 11:40:42 +00:00
}
2013-04-11 15:25:37 +00:00
function getFeedStats () {
$feeds = $this -> api_get_feed_stats ( $this -> link );
print $this -> wrap ( self :: STATUS_OK , $feeds );
}
2011-12-13 11:40:42 +00:00
function getFeeds () {
2013-03-22 05:14:55 +00:00
$cat_id = db_escape_string ( $this -> link , $_REQUEST [ " cat_id " ]);
2013-03-17 17:04:16 +00:00
$unread_only = sql_bool_to_bool ( $_REQUEST [ " unread_only " ]);
2013-03-22 05:14:55 +00:00
$limit = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " limit " ]);
$offset = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " offset " ]);
2013-03-17 17:04:16 +00:00
$include_nested = sql_bool_to_bool ( $_REQUEST [ " include_nested " ]);
2011-12-13 11:40:42 +00:00
2013-01-22 18:15:56 +00:00
$feeds = $this -> api_get_feeds ( $this -> link , $cat_id , $unread_only , $limit , $offset , $include_nested );
2011-12-13 11:40:42 +00:00
print $this -> wrap ( self :: STATUS_OK , $feeds );
}
function getCategories () {
2013-03-17 17:04:16 +00:00
$unread_only = sql_bool_to_bool ( $_REQUEST [ " unread_only " ]);
$enable_nested = sql_bool_to_bool ( $_REQUEST [ " enable_nested " ]);
2013-03-28 11:31:39 +00:00
$include_empty = sql_bool_to_bool ( $_REQUEST [ 'include_empty' ]);
2011-12-13 11:40:42 +00:00
// TODO do not return empty categories, return Uncategorized and standard virtual cats
2012-09-18 05:58:01 +00:00
if ( $enable_nested )
$nested_qpart = " parent_cat IS NULL " ;
else
$nested_qpart = " true " ;
2011-12-13 11:40:42 +00:00
$result = db_query ( $this -> link , " SELECT
2013-02-10 07:40:03 +00:00
id , title , order_id , ( SELECT COUNT ( id ) FROM
ttrss_feeds WHERE
2013-03-24 10:46:45 +00:00
ttrss_feed_categories . id IS NOT NULL AND cat_id = ttrss_feed_categories . id ) AS num_feeds ,
( SELECT COUNT ( id ) FROM
ttrss_feed_categories AS c2 WHERE
c2 . parent_cat = ttrss_feed_categories . id ) AS num_cats
2013-02-10 07:40:03 +00:00
FROM ttrss_feed_categories
2012-09-18 05:58:01 +00:00
WHERE $nested_qpart AND owner_uid = " .
2011-12-13 11:40:42 +00:00
$_SESSION [ " uid " ]);
$cats = array ();
while ( $line = db_fetch_assoc ( $result )) {
2013-03-28 11:28:37 +00:00
if ( $include_empty || $line [ " num_feeds " ] > 0 || $line [ " num_cats " ] > 0 ) {
2013-02-10 07:40:03 +00:00
$unread = getFeedUnread ( $this -> link , $line [ " id " ], true );
if ( $enable_nested )
$unread += getCategoryChildrenUnread ( $this -> link , $line [ " id " ]);
if ( $unread || ! $unread_only ) {
array_push ( $cats , array ( " id " => $line [ " id " ],
" title " => $line [ " title " ],
" unread " => $unread ,
" order_id " => ( int ) $line [ " order_id " ],
));
}
2011-12-13 11:40:42 +00:00
}
}
foreach ( array ( - 2 , - 1 , 0 ) as $cat_id ) {
2013-04-01 10:04:56 +00:00
if ( $include_empty || ! $this -> isCategoryEmpty ( $cat_id )) {
$unread = getFeedUnread ( $this -> link , $cat_id , true );
2011-12-13 11:40:42 +00:00
2013-04-01 10:04:56 +00:00
if ( $unread || ! $unread_only ) {
array_push ( $cats , array ( " id " => $cat_id ,
" title " => getCategoryTitle ( $this -> link , $cat_id ),
" unread " => $unread ));
}
2011-12-13 11:40:42 +00:00
}
}
print $this -> wrap ( self :: STATUS_OK , $cats );
}
function getHeadlines () {
2013-03-22 05:14:55 +00:00
$feed_id = db_escape_string ( $this -> link , $_REQUEST [ " feed_id " ]);
2011-12-15 09:13:46 +00:00
if ( $feed_id != " " ) {
2011-12-13 11:40:42 +00:00
2013-03-22 05:14:55 +00:00
$limit = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " limit " ]);
2012-02-06 10:32:30 +00:00
if ( ! $limit || $limit >= 60 ) $limit = 60 ;
2013-03-22 05:14:55 +00:00
$offset = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " skip " ]);
$filter = db_escape_string ( $this -> link , $_REQUEST [ " filter " ]);
2013-03-17 17:04:16 +00:00
$is_cat = sql_bool_to_bool ( $_REQUEST [ " is_cat " ]);
$show_excerpt = sql_bool_to_bool ( $_REQUEST [ " show_excerpt " ]);
$show_content = sql_bool_to_bool ( $_REQUEST [ " show_content " ]);
2011-12-13 11:40:42 +00:00
/* all_articles, unread, adaptive, marked, updated */
2013-03-22 05:14:55 +00:00
$view_mode = db_escape_string ( $this -> link , $_REQUEST [ " view_mode " ]);
2013-03-17 17:04:16 +00:00
$include_attachments = sql_bool_to_bool ( $_REQUEST [ " include_attachments " ]);
2013-03-22 05:14:55 +00:00
$since_id = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " since_id " ]);
2013-03-17 17:04:16 +00:00
$include_nested = sql_bool_to_bool ( $_REQUEST [ " include_nested " ]);
2012-10-29 12:01:41 +00:00
$sanitize_content = true ;
2013-04-02 05:34:32 +00:00
2013-04-02 01:21:36 +00:00
$override_order = false ;
switch ( $_REQUEST [ " order_by " ]) {
case " date_reverse " :
$override_order = " date_entered, updated " ;
break ;
case " feed_dates " :
$override_order = " updated DESC " ;
break ;
}
2013-04-02 05:34:32 +00:00
2012-01-19 10:07:59 +00:00
/* do not rely on params below */
2013-03-22 05:14:55 +00:00
$search = db_escape_string ( $this -> link , $_REQUEST [ " search " ]);
$search_mode = db_escape_string ( $this -> link , $_REQUEST [ " search_mode " ]);
2012-01-19 10:07:59 +00:00
2013-01-22 18:15:56 +00:00
$headlines = $this -> api_get_headlines ( $this -> link , $feed_id , $limit , $offset ,
2013-04-02 01:21:36 +00:00
$filter , $is_cat , $show_excerpt , $show_content , $view_mode , $override_order ,
2013-03-20 23:36:30 +00:00
$include_attachments , $since_id , $search , $search_mode ,
2012-10-29 12:01:41 +00:00
$include_nested , $sanitize_content );
2011-12-13 11:40:42 +00:00
print $this -> wrap ( self :: STATUS_OK , $headlines );
} else {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => 'INCORRECT_USAGE' ));
}
}
function updateArticle () {
2013-03-22 05:14:55 +00:00
$article_ids = array_filter ( explode ( " , " , db_escape_string ( $this -> link , $_REQUEST [ " article_ids " ])), is_numeric );
$mode = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " mode " ]);
$data = db_escape_string ( $this -> link , $_REQUEST [ " data " ]);
$field_raw = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " field " ]);
2011-12-13 11:40:42 +00:00
$field = " " ;
$set_to = " " ;
switch ( $field_raw ) {
case 0 :
$field = " marked " ;
2013-03-17 11:32:44 +00:00
$additional_fields = " ,last_marked = NOW() " ;
2011-12-13 11:40:42 +00:00
break ;
case 1 :
$field = " published " ;
2013-03-17 11:32:44 +00:00
$additional_fields = " ,last_published = NOW() " ;
2011-12-13 11:40:42 +00:00
break ;
case 2 :
$field = " unread " ;
2013-03-17 11:32:44 +00:00
$additional_fields = " ,last_read = NOW() " ;
2011-12-13 11:40:42 +00:00
break ;
case 3 :
$field = " note " ;
};
switch ( $mode ) {
case 1 :
$set_to = " true " ;
break ;
case 0 :
$set_to = " false " ;
break ;
case 2 :
$set_to = " NOT $field " ;
break ;
}
if ( $field == " note " ) $set_to = " ' $data ' " ;
if ( $field && $set_to && count ( $article_ids ) > 0 ) {
$article_ids = join ( " , " , $article_ids );
2013-03-17 11:32:44 +00:00
$result = db_query ( $this -> link , " UPDATE ttrss_user_entries SET $field = $set_to $additional_fields WHERE ref_id IN ( $article_ids ) AND owner_uid = " . $_SESSION [ " uid " ]);
2011-12-13 11:40:42 +00:00
$num_updated = db_affected_rows ( $this -> link , $result );
if ( $num_updated > 0 && $field == " unread " ) {
$result = db_query ( $this -> link , " SELECT DISTINCT feed_id FROM ttrss_user_entries
WHERE ref_id IN ( $article_ids ) " );
while ( $line = db_fetch_assoc ( $result )) {
ccache_update ( $this -> link , $line [ " feed_id " ], $_SESSION [ " uid " ]);
}
}
2013-03-17 11:32:44 +00:00
if ( $num_updated > 0 && $field == " published " ) {
if ( PUBSUBHUBBUB_HUB ) {
$rss_link = get_self_url_prefix () .
" /public.php?op=rss&id=-2&key= " .
get_feed_access_key ( $this -> link , - 2 , false );
$p = new Publisher ( PUBSUBHUBBUB_HUB );
$pubsub_result = $p -> publish_update ( $rss_link );
}
}
2011-12-13 11:40:42 +00:00
print $this -> wrap ( self :: STATUS_OK , array ( " status " => " OK " ,
" updated " => $num_updated ));
} else {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => 'INCORRECT_USAGE' ));
}
}
function getArticle () {
2013-03-22 05:14:55 +00:00
$article_id = join ( " , " , array_filter ( explode ( " , " , db_escape_string ( $this -> link , $_REQUEST [ " article_id " ])), is_numeric ));
2011-12-13 11:40:42 +00:00
2012-11-23 09:22:34 +00:00
$query = " SELECT id,title,link,content,cached_content,feed_id,comments,int_id,
2011-12-13 11:40:42 +00:00
marked , unread , published ,
" .SUBSTRING_FOR_DATE. " ( updated , 1 , 16 ) as updated ,
author
FROM ttrss_entries , ttrss_user_entries
WHERE id 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 " ],
2013-03-15 05:40:31 +00:00
" updated " => ( int ) strtotime ( $line [ " updated " ]),
2012-11-23 09:22:34 +00:00
" content " => $line [ " cached_content " ] != " " ? $line [ " cached_content " ] : $line [ " content " ],
2011-12-13 11:40:42 +00:00
" feed_id " => $line [ " feed_id " ],
" attachments " => $attachments
);
2013-04-02 19:02:52 +00:00
global $pluginhost ;
foreach ( $pluginhost -> get_hooks ( $pluginhost :: HOOK_RENDER_ARTICLE_API ) as $p ) {
$article = $p -> hook_render_article_api ( array ( " article " => $article ));
}
2011-12-13 11:40:42 +00:00
array_push ( $articles , $article );
}
}
print $this -> wrap ( self :: STATUS_OK , $articles );
}
function getConfig () {
$config = array (
" icons_dir " => ICONS_DIR ,
" icons_url " => ICONS_URL );
$config [ " daemon_is_running " ] = file_is_locked ( " update_daemon.lock " );
$result = db_query ( $this -> link , " SELECT COUNT(*) AS cf FROM
ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"] );
$num_feeds = db_fetch_result ( $result , 0 , " cf " );
$config [ " num_feeds " ] = ( int ) $num_feeds ;
print $this -> wrap ( self :: STATUS_OK , $config );
}
function updateFeed () {
2013-03-25 12:20:45 +00:00
require_once " include/rssfuncs.php " ;
$feed_id = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " feed_id " ]);
2011-12-13 11:40:42 +00:00
update_rss_feed ( $this -> link , $feed_id , true );
print $this -> wrap ( self :: STATUS_OK , array ( " status " => " OK " ));
}
function catchupFeed () {
2013-03-22 05:14:55 +00:00
$feed_id = db_escape_string ( $this -> link , $_REQUEST [ " feed_id " ]);
$is_cat = db_escape_string ( $this -> link , $_REQUEST [ " is_cat " ]);
2011-12-13 11:40:42 +00:00
catchup_feed ( $this -> link , $feed_id , $is_cat );
print $this -> wrap ( self :: STATUS_OK , array ( " status " => " OK " ));
}
function getPref () {
2013-03-22 05:14:55 +00:00
$pref_name = db_escape_string ( $this -> link , $_REQUEST [ " pref_name " ]);
2011-12-13 11:40:42 +00:00
print $this -> wrap ( self :: STATUS_OK , array ( " value " => get_pref ( $this -> link , $pref_name )));
}
2011-12-17 07:06:55 +00:00
function getLabels () {
2013-03-22 05:14:55 +00:00
//$article_ids = array_filter(explode(",", db_escape_string($this->link, $_REQUEST["article_ids"])), is_numeric);
2011-12-17 07:06:55 +00:00
$article_id = ( int ) $_REQUEST [ 'article_id' ];
$rv = array ();
$result = db_query ( $this -> link , " SELECT id, caption, fg_color, bg_color
FROM ttrss_labels2
WHERE owner_uid = '".$_SESSION[' uid ']."' ORDER BY caption " );
if ( $article_id )
$article_labels = get_article_labels ( $this -> link , $article_id );
else
$article_labels = array ();
while ( $line = db_fetch_assoc ( $result )) {
$checked = false ;
foreach ( $article_labels as $al ) {
if ( $al [ 0 ] == $line [ 'id' ]) {
$checked = true ;
break ;
}
}
array_push ( $rv , array (
" id " => ( int ) $line [ 'id' ],
" caption " => $line [ 'caption' ],
" fg_color " => $line [ 'fg_color' ],
" bg_color " => $line [ 'bg_color' ],
" checked " => $checked ));
}
print $this -> wrap ( self :: STATUS_OK , $rv );
}
2011-12-17 07:22:50 +00:00
function setArticleLabel () {
2013-03-22 05:14:55 +00:00
$article_ids = array_filter ( explode ( " , " , db_escape_string ( $this -> link , $_REQUEST [ " article_ids " ])), is_numeric );
$label_id = ( int ) db_escape_string ( $this -> link , $_REQUEST [ 'label_id' ]);
$assign = ( bool ) db_escape_string ( $this -> link , $_REQUEST [ 'assign' ]) == " true " ;
2011-12-17 07:22:50 +00:00
2013-03-22 05:14:55 +00:00
$label = db_escape_string ( $this -> link , label_find_caption ( $this -> link ,
2011-12-17 07:22:50 +00:00
$label_id , $_SESSION [ " uid " ]));
$num_updated = 0 ;
if ( $label ) {
foreach ( $article_ids as $id ) {
if ( $assign )
label_add_article ( $this -> link , $id , $label , $_SESSION [ " uid " ]);
else
label_remove_article ( $this -> link , $id , $label , $_SESSION [ " uid " ]);
++ $num_updated ;
}
}
print $this -> wrap ( self :: STATUS_OK , array ( " status " => " OK " ,
" updated " => $num_updated ));
}
2011-12-13 11:40:42 +00:00
function index () {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => 'UNKNOWN_METHOD' ));
}
2012-09-09 12:05:59 +00:00
function shareToPublished () {
2013-03-22 05:14:55 +00:00
$title = db_escape_string ( $this -> link , strip_tags ( $_REQUEST [ " title " ]));
$url = db_escape_string ( $this -> link , strip_tags ( $_REQUEST [ " url " ]));
$content = db_escape_string ( $this -> link , strip_tags ( $_REQUEST [ " content " ]));
2012-09-09 12:05:59 +00:00
2013-01-22 18:36:16 +00:00
if ( Article :: create_published_article ( $this -> link , $title , $url , $content , " " , $_SESSION [ " uid " ])) {
2012-09-09 12:05:59 +00:00
print $this -> wrap ( self :: STATUS_OK , array ( " status " => 'OK' ));
} else {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => 'Publishing failed' ));
}
}
2013-01-22 18:15:56 +00:00
2013-04-11 15:25:37 +00:00
static function api_get_feed_stats ( $link ) {
$feeds = array ();
$result = db_query ( $link , " SELECT ttrss_feeds.id, ttrss_feeds.title, " .
" MIN(ttrss_entries.id) AS first, MAX(ttrss_entries.id) AS last, " .
" COUNT(ttrss_entries.id) AS total " .
" FROM ttrss_entries, ttrss_user_entries, ttrss_feeds " .
" WHERE ttrss_user_entries.feed_id = ttrss_feeds.id " .
" AND ttrss_user_entries.ref_id = ttrss_entries.id " .
" AND ttrss_user_entries.owner_uid = " . $_SESSION [ " uid " ] .
" GROUP BY ttrss_feeds.title " );
while ( $line = db_fetch_assoc ( $result )) {
$unread = getFeedUnread ( $link , $line [ " id " ]);
$row = array (
" id " => ( int ) $line [ " id " ],
" title " => $line [ " title " ],
" first " => ( int ) $line [ " first " ],
" last " => ( int ) $line [ " last " ],
" total " => ( int ) $line [ " total " ],
" unread " => ( int ) $unread
);
array_push ( $feeds , $row );
}
return $feeds ;
}
2013-01-22 18:15:56 +00:00
static function api_get_feeds ( $link , $cat_id , $unread_only , $limit , $offset , $include_nested = false ) {
$feeds = array ();
/* Labels */
if ( $cat_id == - 4 || $cat_id == - 2 ) {
$counters = getLabelCounters ( $link , true );
foreach ( array_values ( $counters ) as $cv ) {
$unread = $cv [ " counter " ];
if ( $unread || ! $unread_only ) {
$row = array (
" id " => $cv [ " id " ],
" title " => $cv [ " description " ],
" unread " => $cv [ " counter " ],
" cat_id " => - 2 ,
);
array_push ( $feeds , $row );
}
}
}
/* Virtual feeds */
if ( $cat_id == - 4 || $cat_id == - 1 ) {
foreach ( array ( - 1 , - 2 , - 3 , - 4 , - 6 , 0 ) as $i ) {
$unread = getFeedUnread ( $link , $i );
if ( $unread || ! $unread_only ) {
$title = getFeedTitle ( $link , $i );
$row = array (
" id " => $i ,
" title " => $title ,
" unread " => $unread ,
" cat_id " => - 1 ,
);
array_push ( $feeds , $row );
}
}
}
/* Child cats */
if ( $include_nested && $cat_id ) {
$result = db_query ( $link , " SELECT
id , title FROM ttrss_feed_categories
WHERE parent_cat = '$cat_id' AND owner_uid = " . $_SESSION["uid"] .
" ORDER BY id, title " );
while ( $line = db_fetch_assoc ( $result )) {
$unread = getFeedUnread ( $link , $line [ " id " ], true ) +
getCategoryChildrenUnread ( $link , $line [ " id " ]);
if ( $unread || ! $unread_only ) {
$row = array (
" id " => $line [ " id " ],
" title " => $line [ " title " ],
" unread " => $unread ,
" is_cat " => true ,
);
array_push ( $feeds , $row );
}
}
}
/* Real feeds */
if ( $limit ) {
$limit_qpart = " LIMIT $limit OFFSET $offset " ;
} else {
$limit_qpart = " " ;
}
if ( $cat_id == - 4 || $cat_id == - 3 ) {
$result = db_query ( $link , " SELECT
id , feed_url , cat_id , title , order_id , " .
SUBSTRING_FOR_DATE . " (last_updated,1,19) AS last_updated
FROM ttrss_feeds WHERE owner_uid = " . $_SESSION["uid"] .
" ORDER BY cat_id, title " . $limit_qpart );
} else {
if ( $cat_id )
$cat_qpart = " cat_id = ' $cat_id ' " ;
else
$cat_qpart = " cat_id IS NULL " ;
$result = db_query ( $link , " SELECT
id , feed_url , cat_id , title , order_id , " .
SUBSTRING_FOR_DATE . " (last_updated,1,19) AS last_updated
FROM ttrss_feeds WHERE
$cat_qpart AND owner_uid = " . $_SESSION["uid"] .
" ORDER BY cat_id, title " . $limit_qpart );
}
while ( $line = db_fetch_assoc ( $result )) {
$unread = getFeedUnread ( $link , $line [ " id " ]);
$has_icon = feed_has_icon ( $line [ 'id' ]);
if ( $unread || ! $unread_only ) {
$row = array (
" feed_url " => $line [ " feed_url " ],
" title " => $line [ " title " ],
" id " => ( int ) $line [ " id " ],
" unread " => ( int ) $unread ,
" has_icon " => $has_icon ,
" cat_id " => ( int ) $line [ " cat_id " ],
2013-03-15 05:40:31 +00:00
" last_updated " => ( int ) strtotime ( $line [ " last_updated " ]),
2013-01-22 18:15:56 +00:00
" order_id " => ( int ) $line [ " order_id " ],
);
array_push ( $feeds , $row );
}
}
return $feeds ;
}
static function api_get_headlines ( $link , $feed_id , $limit , $offset ,
$filter , $is_cat , $show_excerpt , $show_content , $view_mode , $order ,
$include_attachments , $since_id ,
2013-03-20 23:36:30 +00:00
$search = " " , $search_mode = " " ,
2013-01-22 18:15:56 +00:00
$include_nested = false , $sanitize_content = true ) {
$qfh_ret = queryFeedHeadlines ( $link , $feed_id , $limit ,
2013-03-20 23:36:30 +00:00
$view_mode , $is_cat , $search , $search_mode ,
2013-01-22 18:15:56 +00:00
$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 " ]),
2013-03-15 05:40:31 +00:00
" updated " => ( int ) strtotime ( $line [ " updated " ]),
2013-01-22 18:15:56 +00:00
" 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 ,
2013-03-19 18:41:10 +00:00
$line [ " content_preview " ],
sql_bool_to_bool ( $line [ 'hide_images' ]),
false , $line [ " site_url " ]);
2013-01-22 18:15:56 +00:00
} 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 " ]);
2013-03-30 14:24:32 +00:00
$headline_row [ " author " ] = $line [ " author " ];
2013-03-21 14:19:23 +00:00
global $pluginhost ;
foreach ( $pluginhost -> get_hooks ( $pluginhost :: HOOK_RENDER_ARTICLE_API ) as $p ) {
2013-04-02 19:02:52 +00:00
$headline_row = $p -> hook_render_article_api ( array ( " headline " => $headline_row ));
2013-03-21 14:19:23 +00:00
}
2013-01-22 18:15:56 +00:00
array_push ( $headlines , $headline_row );
}
return $headlines ;
}
2013-03-24 10:28:43 +00:00
function unsubscribeFeed () {
$feed_id = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " feed_id " ]);
$result = db_query ( $this -> link , " SELECT id FROM ttrss_feeds WHERE
id = '$feed_id' AND owner_uid = " . $_SESSION["uid"] );
if ( db_num_rows ( $result ) != 0 ) {
Pref_Feeds :: remove_feed ( $this -> link , $feed_id , $_SESSION [ " uid " ]);
print $this -> wrap ( self :: STATUS_OK , array ( " status " => " OK " ));
} else {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => " FEED_NOT_FOUND " ));
}
}
function subscribeToFeed () {
$feed_url = db_escape_string ( $this -> link , $_REQUEST [ " feed_url " ]);
$category_id = ( int ) db_escape_string ( $this -> link , $_REQUEST [ " category_id " ]);
$login = db_escape_string ( $this -> link , $_REQUEST [ " login " ]);
$password = db_escape_string ( $this -> link , $_REQUEST [ " password " ]);
if ( $feed_url ) {
$rc = subscribe_to_feed ( $this -> link , $feed_url , $category_id ,
$login , $password , false );
print $this -> wrap ( self :: STATUS_OK , array ( " status " => $rc ));
} else {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " => 'INCORRECT_USAGE' ));
}
}
2013-03-28 07:04:15 +00:00
function getFeedTree () {
2013-03-28 11:31:39 +00:00
$include_empty = sql_bool_to_bool ( $_REQUEST [ 'include_empty' ]);
2013-03-28 11:28:37 +00:00
2013-03-28 07:04:15 +00:00
$pf = new Pref_Feeds ( $this -> link , $_REQUEST );
$_REQUEST [ 'mode' ] = 2 ;
2013-03-28 11:28:37 +00:00
$_REQUEST [ 'force_show_empty' ] = $include_empty ;
2013-03-28 07:04:15 +00:00
if ( $pf ){
$data = $pf -> makefeedtree ();
print $this -> wrap ( self :: STATUS_OK , array ( " categories " => $data ));
} else {
print $this -> wrap ( self :: STATUS_ERR , array ( " error " =>
'UNABLE_TO_INSTANTIATE_OBJECT' ));
}
}
2013-04-01 10:04:56 +00:00
2013-04-01 10:08:17 +00:00
// only works for labels or uncategorized for the time being
2013-04-01 10:04:56 +00:00
private function isCategoryEmpty ( $id ) {
if ( $id == - 2 ) {
$result = db_query ( $this -> link , " SELECT COUNT(*) AS count FROM ttrss_labels2
WHERE owner_uid = " . $_SESSION["uid"] );
return db_fetch_result ( $result , 0 , " count " ) == 0 ;
2013-04-01 10:08:17 +00:00
} else if ( $id == 0 ) {
$result = db_query ( $this -> link , " SELECT COUNT(*) AS count FROM ttrss_feeds
WHERE cat_id IS NULL AND owner_uid = " . $_SESSION["uid"] );
return db_fetch_result ( $result , 0 , " count " ) == 0 ;
2013-04-01 10:04:56 +00:00
}
return false ;
}
2011-12-13 11:40:42 +00:00
}
?>