]>
git.wh0rd.org - tt-rss.git/blob - classes/api.php
1a52c9257edb6d0fccc7764fecd6dac7d3dc0595
3 class API
extends Handler
{
12 function before ( $method ) {
13 if ( parent
:: before ( $method )) {
14 header ( "Content-Type: text/json" );
16 if (! $_SESSION [ "uid" ] && $method != "login" && $method != "isloggedin" ) {
17 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => 'NOT_LOGGED_IN' ));
21 if ( $_SESSION [ "uid" ] && $method != "logout" && ! get_pref ( 'ENABLE_API_ACCESS' )) {
22 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => 'API_DISABLED' ));
26 $this -> seq
= ( int ) $_REQUEST [ 'seq' ];
33 function wrap ( $status , $reply ) {
34 print json_encode ( array ( "seq" => $this -> seq
,
36 "content" => $reply ));
39 function getVersion () {
40 $rv = array ( "version" => VERSION
);
41 $this -> wrap ( self
:: STATUS_OK
, $rv );
44 function getApiLevel () {
45 $rv = array ( "level" => self
:: API_LEVEL
);
46 $this -> wrap ( self
:: STATUS_OK
, $rv );
53 $login = $this -> dbh
-> escape_string ( $_REQUEST [ "user" ]);
54 $password = $_REQUEST [ "password" ];
55 $password_base64 = base64_decode ( $_REQUEST [ "password" ]);
57 if ( SINGLE_USER_MODE
) $login = "admin" ;
59 $result = $this -> dbh
-> query ( "SELECT id FROM ttrss_users WHERE login = ' $login '" );
61 if ( $this -> dbh
-> num_rows ( $result ) != 0 ) {
62 $uid = $this -> dbh
-> fetch_result ( $result , 0 , "id" );
68 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => "LOGIN_ERROR" ));
72 if ( get_pref ( "ENABLE_API_ACCESS" , $uid )) {
73 if ( authenticate_user ( $login , $password )) { // try login with normal password
74 $this -> wrap ( self
:: STATUS_OK
, array ( "session_id" => session_id (),
75 "api_level" => self
:: API_LEVEL
));
76 } else if ( authenticate_user ( $login , $password_base64 )) { // else try with base64_decoded password
77 $this -> wrap ( self
:: STATUS_OK
, array ( "session_id" => session_id (),
78 "api_level" => self
:: API_LEVEL
));
79 } else { // else we are not logged in
80 user_error ( "Failed login attempt for $login from { $_SERVER ['REMOTE_ADDR']}" , E_USER_WARNING
);
81 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => "LOGIN_ERROR" ));
84 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => "API_DISABLED" ));
91 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => "OK" ));
94 function isLoggedIn () {
95 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => $_SESSION [ "uid" ] != '' ));
98 function getUnread () {
99 $feed_id = $this -> dbh
-> escape_string ( $_REQUEST [ "feed_id" ]);
100 $is_cat = $this -> dbh
-> escape_string ( $_REQUEST [ "is_cat" ]);
103 $this -> wrap ( self
:: STATUS_OK
, array ( "unread" => getFeedUnread ( $feed_id , $is_cat )));
105 $this -> wrap ( self
:: STATUS_OK
, array ( "unread" => getGlobalUnread ()));
109 /* Method added for ttrss-reader for Android */
110 function getCounters () {
111 $this -> wrap ( self
:: STATUS_OK
, getAllCounters ());
114 function getFeeds () {
115 $cat_id = $this -> dbh
-> escape_string ( $_REQUEST [ "cat_id" ]);
116 $unread_only = sql_bool_to_bool ( $_REQUEST [ "unread_only" ]);
117 $limit = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "limit" ]);
118 $offset = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "offset" ]);
119 $include_nested = sql_bool_to_bool ( $_REQUEST [ "include_nested" ]);
121 $feeds = $this -> api_get_feeds ( $cat_id , $unread_only , $limit , $offset , $include_nested );
123 $this -> wrap ( self
:: STATUS_OK
, $feeds );
126 function getCategories () {
127 $unread_only = sql_bool_to_bool ( $_REQUEST [ "unread_only" ]);
128 $enable_nested = sql_bool_to_bool ( $_REQUEST [ "enable_nested" ]);
129 $include_empty = sql_bool_to_bool ( $_REQUEST [ 'include_empty' ]);
131 // TODO do not return empty categories, return Uncategorized and standard virtual cats
134 $nested_qpart = "parent_cat IS NULL" ;
136 $nested_qpart = "true" ;
138 $result = $this -> dbh
-> query ( "SELECT
139 id, title, order_id, (SELECT COUNT(id) FROM
141 ttrss_feed_categories.id IS NOT NULL AND cat_id = ttrss_feed_categories.id) AS num_feeds,
142 (SELECT COUNT(id) FROM
143 ttrss_feed_categories AS c2 WHERE
144 c2.parent_cat = ttrss_feed_categories.id) AS num_cats
145 FROM ttrss_feed_categories
146 WHERE $nested_qpart AND owner_uid = " .
151 while ( $line = $this -> dbh
-> fetch_assoc ( $result )) {
152 if ( $include_empty ||
$line [ "num_feeds" ] > 0 ||
$line [ "num_cats" ] > 0 ) {
153 $unread = getFeedUnread ( $line [ "id" ], true );
156 $unread +
= getCategoryChildrenUnread ( $line [ "id" ]);
158 if ( $unread ||
! $unread_only ) {
159 array_push ( $cats , array ( "id" => $line [ "id" ],
160 "title" => $line [ "title" ],
162 "order_id" => ( int ) $line [ "order_id" ],
168 foreach ( array (- 2 ,- 1 , 0 ) as $cat_id ) {
169 if ( $include_empty ||
! $this -> isCategoryEmpty ( $cat_id )) {
170 $unread = getFeedUnread ( $cat_id , true );
172 if ( $unread ||
! $unread_only ) {
173 array_push ( $cats , array ( "id" => $cat_id ,
174 "title" => getCategoryTitle ( $cat_id ),
175 "unread" => $unread ));
180 $this -> wrap ( self
:: STATUS_OK
, $cats );
183 function getHeadlines () {
184 $feed_id = $this -> dbh
-> escape_string ( $_REQUEST [ "feed_id" ]);
185 if ( $feed_id != "" ) {
187 $limit = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "limit" ]);
189 if (! $limit ||
$limit >= 200 ) $limit = 200 ;
191 $offset = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "skip" ]);
192 $filter = $this -> dbh
-> escape_string ( $_REQUEST [ "filter" ]);
193 $is_cat = sql_bool_to_bool ( $_REQUEST [ "is_cat" ]);
194 $show_excerpt = sql_bool_to_bool ( $_REQUEST [ "show_excerpt" ]);
195 $show_content = sql_bool_to_bool ( $_REQUEST [ "show_content" ]);
196 /* all_articles, unread, adaptive, marked, updated */
197 $view_mode = $this -> dbh
-> escape_string ( $_REQUEST [ "view_mode" ]);
198 $include_attachments = sql_bool_to_bool ( $_REQUEST [ "include_attachments" ]);
199 $since_id = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "since_id" ]);
200 $include_nested = sql_bool_to_bool ( $_REQUEST [ "include_nested" ]);
201 $sanitize_content = ! isset ( $_REQUEST [ "sanitize" ]) ||
202 sql_bool_to_bool ( $_REQUEST [ "sanitize" ]);
203 $force_update = sql_bool_to_bool ( $_REQUEST [ "force_update" ]);
204 $has_sandbox = sql_bool_to_bool ( $_REQUEST [ "has_sandbox" ]);
205 $excerpt_length = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "excerpt_length" ]);
207 $_SESSION [ 'hasSandbox' ] = $has_sandbox ;
209 $override_order = false ;
210 switch ( $_REQUEST [ "order_by" ]) {
212 $override_order = "ttrss_entries.title" ;
215 $override_order = "score DESC, date_entered, updated" ;
218 $override_order = "updated DESC" ;
222 /* do not rely on params below */
224 $search = $this -> dbh
-> escape_string ( $_REQUEST [ "search" ]);
226 $headlines = $this -> api_get_headlines ( $feed_id , $limit , $offset ,
227 $filter , $is_cat , $show_excerpt , $show_content , $view_mode , $override_order ,
228 $include_attachments , $since_id , $search ,
229 $include_nested , $sanitize_content , $force_update , $excerpt_length );
231 $this -> wrap ( self
:: STATUS_OK
, $headlines );
233 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => 'INCORRECT_USAGE' ));
237 function updateArticle () {
238 $article_ids = array_filter ( explode ( "," , $this -> dbh
-> escape_string ( $_REQUEST [ "article_ids" ])), is_numeric
);
239 $mode = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "mode" ]);
240 $data = $this -> dbh
-> escape_string ( $_REQUEST [ "data" ]);
241 $field_raw = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "field" ]);
246 switch ( $field_raw ) {
249 $additional_fields = ",last_marked = NOW()" ;
252 $field = "published" ;
253 $additional_fields = ",last_published = NOW()" ;
257 $additional_fields = ",last_read = NOW()" ;
271 $set_to = "NOT $field " ;
275 if ( $field == "note" ) $set_to = "' $data '" ;
277 if ( $field && $set_to && count ( $article_ids ) > 0 ) {
279 $article_ids = join ( ", " , $article_ids );
281 $result = $this -> dbh
-> query ( "UPDATE ttrss_user_entries SET $field = $set_to $additional_fields WHERE ref_id IN ( $article_ids ) AND owner_uid = " . $_SESSION [ "uid" ]);
283 $num_updated = $this -> dbh
-> affected_rows ( $result );
285 if ( $num_updated > 0 && $field == "unread" ) {
286 $result = $this -> dbh
-> query ( "SELECT DISTINCT feed_id FROM ttrss_user_entries
287 WHERE ref_id IN ( $article_ids )" );
289 while ( $line = $this -> dbh
-> fetch_assoc ( $result )) {
290 ccache_update ( $line [ "feed_id" ], $_SESSION [ "uid" ]);
294 if ( $num_updated > 0 && $field == "published" ) {
295 if ( PUBSUBHUBBUB_HUB
) {
296 $rss_link = get_self_url_prefix () .
297 "/public.php?op=rss&id=-2&key=" .
298 get_feed_access_key (- 2 , false );
300 $p = new Publisher ( PUBSUBHUBBUB_HUB
);
301 $pubsub_result = $p -> publish_update ( $rss_link );
305 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => "OK" ,
306 "updated" => $num_updated ));
309 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => 'INCORRECT_USAGE' ));
314 function getArticle () {
316 $article_id = join ( "," , array_filter ( explode ( "," , $this -> dbh
-> escape_string ( $_REQUEST [ "article_id" ])), is_numeric
));
320 $query = "SELECT id,title,link,content,feed_id,comments,int_id,
321 marked,unread,published,score,note,lang,
322 " . SUBSTRING_FOR_DATE
. "(updated,1,16) as updated,
323 author,(SELECT title FROM ttrss_feeds WHERE id = feed_id) AS feed_title
324 FROM ttrss_entries,ttrss_user_entries
325 WHERE id IN ( $article_id ) AND ref_id = id AND owner_uid = " .
328 $result = $this -> dbh
-> query ( $query );
332 if ( $this -> dbh
-> num_rows ( $result ) != 0 ) {
334 while ( $line = $this -> dbh
-> fetch_assoc ( $result )) {
336 $attachments = get_article_enclosures ( $line [ 'id' ]);
340 "title" => $line [ "title" ],
341 "link" => $line [ "link" ],
342 "labels" => get_article_labels ( $line [ 'id' ]),
343 "unread" => sql_bool_to_bool ( $line [ "unread" ]),
344 "marked" => sql_bool_to_bool ( $line [ "marked" ]),
345 "published" => sql_bool_to_bool ( $line [ "published" ]),
346 "comments" => $line [ "comments" ],
347 "author" => $line [ "author" ],
348 "updated" => ( int ) strtotime ( $line [ "updated" ]),
349 "content" => $line [ "content" ],
350 "feed_id" => $line [ "feed_id" ],
351 "attachments" => $attachments ,
352 "score" => ( int ) $line [ "score" ],
353 "feed_title" => $line [ "feed_title" ],
354 "note" => $line [ "note" ],
355 "lang" => $line [ "lang" ]
358 foreach ( PluginHost
:: getInstance ()-> get_hooks ( PluginHost
:: HOOK_RENDER_ARTICLE_API
) as $p ) {
359 $article = $p -> hook_render_article_api ( array ( "article" => $article ));
363 array_push ( $articles , $article );
368 $this -> wrap ( self
:: STATUS_OK
, $articles );
370 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => 'INCORRECT_USAGE' ));
374 function getConfig () {
376 "icons_dir" => ICONS_DIR
,
377 "icons_url" => ICONS_URL
);
379 $config [ "daemon_is_running" ] = file_is_locked ( "update_daemon.lock" );
381 $result = $this -> dbh
-> query ( "SELECT COUNT(*) AS cf FROM
382 ttrss_feeds WHERE owner_uid = " . $_SESSION [ "uid" ]);
384 $num_feeds = $this -> dbh
-> fetch_result ( $result , 0 , "cf" );
386 $config [ "num_feeds" ] = ( int ) $num_feeds ;
388 $this -> wrap ( self
:: STATUS_OK
, $config );
391 function updateFeed () {
392 require_once "include/rssfuncs.php" ;
394 $feed_id = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "feed_id" ]);
396 update_rss_feed ( $feed_id , true );
398 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => "OK" ));
401 function catchupFeed () {
402 $feed_id = $this -> dbh
-> escape_string ( $_REQUEST [ "feed_id" ]);
403 $is_cat = $this -> dbh
-> escape_string ( $_REQUEST [ "is_cat" ]);
405 catchup_feed ( $feed_id , $is_cat );
407 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => "OK" ));
411 $pref_name = $this -> dbh
-> escape_string ( $_REQUEST [ "pref_name" ]);
413 $this -> wrap ( self
:: STATUS_OK
, array ( "value" => get_pref ( $pref_name )));
416 function getLabels () {
417 //$article_ids = array_filter(explode(",", $this->dbh->escape_string($_REQUEST["article_ids"])), is_numeric);
419 $article_id = ( int ) $_REQUEST [ 'article_id' ];
423 $result = $this -> dbh
-> query ( "SELECT id, caption, fg_color, bg_color
425 WHERE owner_uid = '" . $_SESSION [ 'uid' ]. "' ORDER BY caption" );
428 $article_labels = get_article_labels ( $article_id );
430 $article_labels = array ();
432 while ( $line = $this -> dbh
-> fetch_assoc ( $result )) {
435 foreach ( $article_labels as $al ) {
436 if ( feed_to_label_id ( $al [ 0 ]) == $line [ 'id' ]) {
442 array_push ( $rv , array (
443 "id" => ( int ) label_to_feed_id ( $line [ 'id' ]),
444 "caption" => $line [ 'caption' ],
445 "fg_color" => $line [ 'fg_color' ],
446 "bg_color" => $line [ 'bg_color' ],
447 "checked" => $checked ));
450 $this -> wrap ( self
:: STATUS_OK
, $rv );
453 function setArticleLabel () {
455 $article_ids = array_filter ( explode ( "," , $this -> dbh
-> escape_string ( $_REQUEST [ "article_ids" ])), is_numeric
);
456 $label_id = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ 'label_id' ]);
457 $assign = ( bool ) $this -> dbh
-> escape_string ( $_REQUEST [ 'assign' ]) == "true" ;
459 $label = $this -> dbh
-> escape_string ( label_find_caption (
460 feed_to_label_id ( $label_id ), $_SESSION [ "uid" ]));
466 foreach ( $article_ids as $id ) {
469 label_add_article ( $id , $label , $_SESSION [ "uid" ]);
471 label_remove_article ( $id , $label , $_SESSION [ "uid" ]);
478 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => "OK" ,
479 "updated" => $num_updated ));
483 function index ( $method ) {
484 $plugin = PluginHost
:: getInstance ()-> get_api_method ( strtolower ( $method ));
486 if ( $plugin && method_exists ( $plugin , $method )) {
487 $reply = $plugin -> $method ();
489 $this -> wrap ( $reply [ 0 ], $reply [ 1 ]);
492 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => 'UNKNOWN_METHOD' , "method" => $method ));
496 function shareToPublished () {
497 $title = $this -> dbh
-> escape_string ( strip_tags ( $_REQUEST [ "title" ]));
498 $url = $this -> dbh
-> escape_string ( strip_tags ( $_REQUEST [ "url" ]));
499 $content = $this -> dbh
-> escape_string ( strip_tags ( $_REQUEST [ "content" ]));
501 if ( Article
:: create_published_article ( $title , $url , $content , "" , $_SESSION [ "uid" ])) {
502 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => 'OK' ));
504 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => 'Publishing failed' ));
508 static function api_get_feeds ( $cat_id , $unread_only , $limit , $offset , $include_nested = false ) {
514 if ( $cat_id == - 4 ||
$cat_id == - 2 ) {
515 $counters = getLabelCounters ( true );
517 foreach ( array_values ( $counters ) as $cv ) {
519 $unread = $cv [ "counter" ];
521 if ( $unread ||
! $unread_only ) {
524 "id" => ( int ) $cv [ "id" ],
525 "title" => $cv [ "description" ],
526 "unread" => $cv [ "counter" ],
530 array_push ( $feeds , $row );
537 if ( $cat_id == - 4 ||
$cat_id == - 1 ) {
538 foreach ( array (- 1 , - 2 , - 3 , - 4 , - 6 , 0 ) as $i ) {
539 $unread = getFeedUnread ( $i );
541 if ( $unread ||
! $unread_only ) {
542 $title = getFeedTitle ( $i );
550 array_push ( $feeds , $row );
558 if ( $include_nested && $cat_id ) {
559 $result = db_query ( "SELECT
560 id, title FROM ttrss_feed_categories
561 WHERE parent_cat = ' $cat_id ' AND owner_uid = " . $_SESSION [ "uid" ] .
562 " ORDER BY id, title" );
564 while ( $line = db_fetch_assoc ( $result )) {
565 $unread = getFeedUnread ( $line [ "id" ], true ) +
566 getCategoryChildrenUnread ( $line [ "id" ]);
568 if ( $unread ||
! $unread_only ) {
570 "id" => ( int ) $line [ "id" ],
571 "title" => $line [ "title" ],
575 array_push ( $feeds , $row );
583 $limit_qpart = "LIMIT $limit OFFSET $offset " ;
588 if ( $cat_id == - 4 ||
$cat_id == - 3 ) {
589 $result = db_query ( "SELECT
590 id, feed_url, cat_id, title, order_id, " .
591 SUBSTRING_FOR_DATE
. "(last_updated,1,19) AS last_updated
592 FROM ttrss_feeds WHERE owner_uid = " . $_SESSION [ "uid" ] .
593 " ORDER BY cat_id, title " . $limit_qpart );
597 $cat_qpart = "cat_id = ' $cat_id '" ;
599 $cat_qpart = "cat_id IS NULL" ;
601 $result = db_query ( "SELECT
602 id, feed_url, cat_id, title, order_id, " .
603 SUBSTRING_FOR_DATE
. "(last_updated,1,19) AS last_updated
604 FROM ttrss_feeds WHERE
605 $cat_qpart AND owner_uid = " . $_SESSION [ "uid" ] .
606 " ORDER BY cat_id, title " . $limit_qpart );
609 while ( $line = db_fetch_assoc ( $result )) {
611 $unread = getFeedUnread ( $line [ "id" ]);
613 $has_icon = feed_has_icon ( $line [ 'id' ]);
615 if ( $unread ||
! $unread_only ) {
618 "feed_url" => $line [ "feed_url" ],
619 "title" => $line [ "title" ],
620 "id" => ( int ) $line [ "id" ],
621 "unread" => ( int ) $unread ,
622 "has_icon" => $has_icon ,
623 "cat_id" => ( int ) $line [ "cat_id" ],
624 "last_updated" => ( int ) strtotime ( $line [ "last_updated" ]),
625 "order_id" => ( int ) $line [ "order_id" ],
628 array_push ( $feeds , $row );
635 static function api_get_headlines ( $feed_id , $limit , $offset ,
636 $filter , $is_cat , $show_excerpt , $show_content , $view_mode , $order ,
637 $include_attachments , $since_id ,
638 $search = "" , $include_nested = false , $sanitize_content = true , $force_update = false , $excerpt_length = 100 ) {
640 if ( $force_update && $feed_id > 0 && is_numeric ( $feed_id )) {
641 // Update the feed if required with some basic flood control
644 "SELECT cache_images," . SUBSTRING_FOR_DATE
. "(last_updated,1,19) AS last_updated
645 FROM ttrss_feeds WHERE id = ' $feed_id '" );
647 if ( db_num_rows ( $result ) != 0 ) {
648 $last_updated = strtotime ( db_fetch_result ( $result , 0 , "last_updated" ));
649 $cache_images = sql_bool_to_bool ( db_fetch_result ( $result , 0 , "cache_images" ));
651 if (! $cache_images && time () - $last_updated > 120 ) {
652 include "rssfuncs.php" ;
653 update_rss_feed ( $feed_id , true , true );
655 db_query ( "UPDATE ttrss_feeds SET last_updated = '1970-01-01', last_update_started = '1970-01-01'
656 WHERE id = ' $feed_id '" );
661 /*$qfh_ret = queryFeedHeadlines($feed_id, $limit,
662 $view_mode, $is_cat, $search, false,
663 $order, $offset, 0, false, $since_id, $include_nested);*/
665 //function queryFeedHeadlines($feed, $limit,
666 // $view_mode, $cat_view, $search, $search_mode,
667 // $override_order = false, $offset = 0, $owner_uid = 0, $filter = false, $since_id = 0, $include_children = false,
668 // $ignore_vfeed_group = false, $override_strategy = false, $override_vfeed = false, $start_ts = false, $check_top_id = false) {
673 "view_mode" => $view_mode ,
674 "cat_view" => $is_cat ,
676 "override_order" => $order ,
678 "since_id" => $since_id ,
679 "include_children" => $include_nested ,
682 $qfh_ret = queryFeedHeadlines ( $params );
684 $result = $qfh_ret [ 0 ];
685 $feed_title = $qfh_ret [ 1 ];
687 $headlines = array ();
689 while ( $line = db_fetch_assoc ( $result )) {
690 $line [ "content_preview" ] = truncate_string ( strip_tags ( $line [ "content" ]), $excerpt_length );
691 foreach ( PluginHost
:: getInstance ()-> get_hooks ( PluginHost
:: HOOK_QUERY_HEADLINES
) as $p ) {
692 $line = $p -> hook_query_headlines ( $line , $excerpt_length , true );
695 $is_updated = ( $line [ "last_read" ] == "" &&
696 ( $line [ "unread" ] != "t" && $line [ "unread" ] != "1" ));
698 $tags = explode ( "," , $line [ "tag_cache" ]);
700 $label_cache = $line [ "label_cache" ];
704 $label_cache = json_decode ( $label_cache , true );
707 if ( $label_cache [ "no-labels" ] == 1 )
710 $labels = $label_cache ;
714 if (! is_array ( $labels )) $labels = get_article_labels ( $line [ "id" ]);
716 //if (!$tags) $tags = get_article_tags($line["id"]);
717 //if (!$labels) $labels = get_article_labels($line["id"]);
719 $headline_row = array (
720 "id" => ( int ) $line [ "id" ],
721 "unread" => sql_bool_to_bool ( $line [ "unread" ]),
722 "marked" => sql_bool_to_bool ( $line [ "marked" ]),
723 "published" => sql_bool_to_bool ( $line [ "published" ]),
724 "updated" => ( int ) strtotime ( $line [ "updated" ]),
725 "is_updated" => $is_updated ,
726 "title" => $line [ "title" ],
727 "link" => $line [ "link" ],
728 "feed_id" => $line [ "feed_id" ],
732 if ( $include_attachments )
733 $headline_row [ 'attachments' ] = get_article_enclosures (
737 $headline_row [ "excerpt" ] = $line [ "content_preview" ];
741 if ( $sanitize_content ) {
742 $headline_row [ "content" ] = sanitize (
744 sql_bool_to_bool ( $line [ 'hide_images' ]),
745 false , $line [ "site_url" ], false , $line [ "id" ]);
747 $headline_row [ "content" ] = $line [ "content" ];
751 // unify label output to ease parsing
752 if ( $labels [ "no-labels" ] == 1 ) $labels = array ();
754 $headline_row [ "labels" ] = $labels ;
756 $headline_row [ "feed_title" ] = $line [ "feed_title" ] ?
$line [ "feed_title" ] :
759 $headline_row [ "comments_count" ] = ( int ) $line [ "num_comments" ];
760 $headline_row [ "comments_link" ] = $line [ "comments" ];
762 $headline_row [ "always_display_attachments" ] = sql_bool_to_bool ( $line [ "always_display_enclosures" ]);
764 $headline_row [ "author" ] = $line [ "author" ];
766 $headline_row [ "score" ] = ( int ) $line [ "score" ];
767 $headline_row [ "note" ] = $line [ "note" ];
768 $headline_row [ "lang" ] = $line [ "lang" ];
770 foreach ( PluginHost
:: getInstance ()-> get_hooks ( PluginHost
:: HOOK_RENDER_ARTICLE_API
) as $p ) {
771 $headline_row = $p -> hook_render_article_api ( array ( "headline" => $headline_row ));
774 array_push ( $headlines , $headline_row );
780 function unsubscribeFeed () {
781 $feed_id = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "feed_id" ]);
783 $result = $this -> dbh
-> query ( "SELECT id FROM ttrss_feeds WHERE
784 id = ' $feed_id ' AND owner_uid = " . $_SESSION [ "uid" ]);
786 if ( $this -> dbh
-> num_rows ( $result ) != 0 ) {
787 Pref_Feeds
:: remove_feed ( $feed_id , $_SESSION [ "uid" ]);
788 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => "OK" ));
790 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => "FEED_NOT_FOUND" ));
794 function subscribeToFeed () {
795 $feed_url = $this -> dbh
-> escape_string ( $_REQUEST [ "feed_url" ]);
796 $category_id = ( int ) $this -> dbh
-> escape_string ( $_REQUEST [ "category_id" ]);
797 $login = $this -> dbh
-> escape_string ( $_REQUEST [ "login" ]);
798 $password = $this -> dbh
-> escape_string ( $_REQUEST [ "password" ]);
801 $rc = subscribe_to_feed ( $feed_url , $category_id , $login , $password );
803 $this -> wrap ( self
:: STATUS_OK
, array ( "status" => $rc ));
805 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" => 'INCORRECT_USAGE' ));
809 function getFeedTree () {
810 $include_empty = sql_bool_to_bool ( $_REQUEST [ 'include_empty' ]);
812 $pf = new Pref_Feeds ( $_REQUEST );
814 $_REQUEST [ 'mode' ] = 2 ;
815 $_REQUEST [ 'force_show_empty' ] = $include_empty ;
818 $data = $pf -> makefeedtree ();
819 $this -> wrap ( self
:: STATUS_OK
, array ( "categories" => $data ));
821 $this -> wrap ( self
:: STATUS_ERR
, array ( "error" =>
822 'UNABLE_TO_INSTANTIATE_OBJECT' ));
827 // only works for labels or uncategorized for the time being
828 private function isCategoryEmpty ( $id ) {
831 $result = $this -> dbh
-> query ( "SELECT COUNT(*) AS count FROM ttrss_labels2
832 WHERE owner_uid = " . $_SESSION [ "uid" ]);
834 return $this -> dbh
-> fetch_result ( $result , 0 , "count" ) == 0 ;
836 } else if ( $id == 0 ) {
837 $result = $this -> dbh
-> query ( "SELECT COUNT(*) AS count FROM ttrss_feeds
838 WHERE cat_id IS NULL AND owner_uid = " . $_SESSION [ "uid" ]);
840 return $this -> dbh
-> fetch_result ( $result , 0 , "count" ) == 0 ;