2013-02-21 14:58:06 +00:00
< ? php
require_once " colors.php " ;
class Feeds extends Handler_Protected {
2019-08-30 07:16:38 +00:00
const NEVER_GROUP_FEEDS = [ - 6 , 0 ];
const NEVER_GROUP_BY_DATE = [ - 2 , - 1 , - 3 ];
2013-02-21 14:58:06 +00:00
2020-12-04 15:55:53 +00:00
private $params ;
private $viewfeed_timestamp ;
private $viewfeed_timestamp_last ;
2015-06-07 15:41:18 +00:00
function csrf_ignore ( $method ) {
2020-09-15 13:28:09 +00:00
$csrf_ignored = array ( " index " );
2013-02-21 14:58:06 +00:00
return array_search ( $method , $csrf_ignored ) !== false ;
}
private function format_headline_subtoolbar ( $feed_site_url , $feed_title ,
2013-03-20 23:36:30 +00:00
$feed_id , $is_cat , $search ,
2017-04-26 12:29:22 +00:00
$error , $feed_last_updated ) {
2013-02-21 14:58:06 +00:00
2021-02-05 20:41:32 +00:00
$cat_q = $is_cat ? " &is_cat= $is_cat " : " " ;
2013-02-21 14:58:06 +00:00
if ( $search ) {
2015-07-07 12:59:32 +00:00
$search_q = " &q= $search " ;
2013-02-21 14:58:06 +00:00
} else {
$search_q = " " ;
}
2018-12-04 19:24:31 +00:00
$reply = " " ;
2014-01-27 18:03:42 +00:00
2013-02-21 14:58:06 +00:00
$rss_link = htmlspecialchars ( get_self_url_prefix () .
2021-02-05 20:41:32 +00:00
" /public.php?op=rss&id= ${ feed_id}${cat_q}${search_q } " );
2013-02-21 14:58:06 +00:00
2018-12-04 19:24:31 +00:00
$reply .= " <span class='left'> " ;
$reply .= " <a href= \" # \"
2018-12-02 05:57:22 +00:00
title = \ " " . __ ( " Show as feed " ) . " \"
2021-02-11 19:04:39 +00:00
onclick = 'CommonDialogs.generatedFeed(\"$feed_id\", \"$is_cat\", \"$rss_link\")' >
2018-12-05 11:11:40 +00:00
< i class = 'icon-syndicate material-icons' > rss_feed </ i ></ a > " ;
2014-01-27 18:03:42 +00:00
2018-12-06 12:22:52 +00:00
$reply .= " <span id='feed_title'> " ;
2013-02-21 14:58:06 +00:00
if ( $feed_site_url ) {
2018-12-06 12:22:52 +00:00
$last_updated = T_sprintf ( " Last updated: %s " , $feed_last_updated );
2013-04-25 12:27:33 +00:00
2018-12-06 12:22:52 +00:00
$reply .= " <a title= \" $last_updated\ " target = '_blank' href = \ " $feed_site_url\ " > " .
2017-12-03 20:08:04 +00:00
truncate_string ( strip_tags ( $feed_title ), 30 ) . " </a> " ;
2013-02-21 14:58:06 +00:00
} else {
2017-12-03 20:08:04 +00:00
$reply .= strip_tags ( $feed_title );
2013-02-21 14:58:06 +00:00
}
2018-12-06 12:22:52 +00:00
if ( $error )
$reply .= " <i title= \" " . htmlspecialchars ( $error ) . " \" class='material-icons icon-error'>error</i> " ;
2019-12-12 04:37:28 +00:00
$reply .= " </span> " ;
$reply .= " <span id='feed_current_unread' style='display: none'></span> " ;
$reply .= " </span> " ;
2013-02-21 14:58:06 +00:00
2018-12-04 19:24:31 +00:00
$reply .= " <span class= \" right \" > " ;
2014-01-27 18:27:31 +00:00
$reply .= " <span id='selected_prompt'></span> " ;
2018-12-04 19:24:31 +00:00
$reply .= " " ;
2017-01-07 14:03:58 +00:00
2021-01-17 08:27:07 +00:00
$reply .= " <div dojoType='fox.form.DropDownButton' title=' " . __ ( 'Select articles' ) . " '>
< span > " .__( " Select ... " ). " </ span >
< div dojoType = 'dijit.Menu' style = 'display: none;' >
< div dojoType = 'dijit.MenuItem' onclick = 'Headlines.select(\"all\")' > " .__('All'). " </ div >
< div dojoType = 'dijit.MenuItem' onclick = 'Headlines.select(\"unread\")' > " .__('Unread'). " </ div >
< div dojoType = 'dijit.MenuItem' onclick = 'Headlines.select(\"invert\")' > " .__('Invert'). " </ div >
< div dojoType = 'dijit.MenuItem' onclick = 'Headlines.select(\"none\")' > " .__('None'). " </ div >
< div dojoType = 'dijit.MenuSeparator' ></ div >
< div dojoType = 'dijit.MenuItem' onclick = 'Headlines.selectionToggleUnread()' > " .__('Toggle unread'). " </ div >
< div dojoType = 'dijit.MenuItem' onclick = 'Headlines.selectionToggleMarked()' > " .__('Toggle starred'). " </ div >
< div dojoType = 'dijit.MenuItem' onclick = 'Headlines.selectionTogglePublished()' > " .__('Toggle published'). " </ div >
< div dojoType = 'dijit.MenuSeparator' ></ div >
< div dojoType = 'dijit.MenuItem' onclick = 'Headlines.catchupSelection()' > " .__('Mark as read'). " </ div >
< div dojoType = 'dijit.MenuItem' onclick = 'Article.selectionSetScore()' > " .__('Set score'). " </ div > " ;
2013-02-21 14:58:06 +00:00
2021-02-08 20:10:22 +00:00
// TODO: move to mail plugin
2013-04-18 08:27:34 +00:00
if ( PluginHost :: getInstance () -> get_plugin ( " mail " )) {
2021-01-17 08:27:07 +00:00
$reply .= " <div dojoType='dijit.MenuItem' value='Plugins.Mail.send()'> " . __ ( 'Forward by email' ) . " </div> " ;
2013-02-21 14:58:06 +00:00
}
2021-02-08 20:10:22 +00:00
// TODO: move to mailto plugin
2013-04-18 08:27:34 +00:00
if ( PluginHost :: getInstance () -> get_plugin ( " mailto " )) {
2021-01-17 08:27:07 +00:00
$reply .= " <div dojoType='dijit.MenuItem' value='Plugins.Mailto.send()'> " . __ ( 'Forward by email' ) . " </div> " ;
2013-03-19 14:32:49 +00:00
}
2021-02-08 20:10:22 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM ,
function ( $result ) use ( & $reply ) {
$reply .= $result ;
},
$feed_id , $is_cat );
2013-02-21 14:58:06 +00:00
2021-01-17 08:27:07 +00:00
if ( $feed_id == 0 && ! $is_cat ) {
$reply .= " <div dojoType='dijit.MenuSeparator'></div>
< div dojoType = 'dijit.MenuItem' class = 'text-error' onclick = 'Headlines.deleteSelection()' > " .__('Delete permanently'). " </ div > " ;
}
2013-02-21 14:58:06 +00:00
2021-01-17 08:27:07 +00:00
$reply .= " </div> " ; /* menu */
2013-02-21 14:58:06 +00:00
2021-01-17 08:27:07 +00:00
$reply .= " </div> " ; /* dropdown */
2013-02-21 14:58:06 +00:00
2021-02-08 20:10:22 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_HEADLINE_TOOLBAR_BUTTON ,
function ( $result ) use ( & $reply ) {
$reply .= $result ;
},
$feed_id , $is_cat );
2013-04-01 14:06:09 +00:00
2018-12-04 19:24:31 +00:00
$reply .= " </span> " ;
2014-01-27 18:03:42 +00:00
2013-02-21 14:58:06 +00:00
return $reply ;
}
private function format_headlines_list ( $feed , $method , $view_mode , $limit , $cat_view ,
2018-12-07 18:11:50 +00:00
$offset , $override_order = false , $include_children = false , $check_first_id = false ,
2018-12-09 10:35:37 +00:00
$skip_first_id_check = false , $order_by = false ) {
2013-02-21 14:58:06 +00:00
$disable_cache = false ;
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " init " );
2021-02-06 14:19:07 +00:00
$reply = [];
$rgba_cache = [];
$topmost_article_ids = [];
2013-02-21 14:58:06 +00:00
if ( ! $offset ) $offset = 0 ;
if ( $method == " undefined " ) $method = " " ;
$method_split = explode ( " : " , $method );
2016-01-26 08:45:47 +00:00
if ( $method == " ForceUpdate " && $feed > 0 && is_numeric ( $feed )) {
2018-11-03 12:08:43 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_feeds
2017-12-31 04:37:49 +00:00
SET last_updated = '1970-01-01' , last_update_started = '1970-01-01'
WHERE id = ? " );
$sth -> execute ([ $feed ]);
2013-02-21 14:58:06 +00:00
}
if ( $method_split [ 0 ] == " MarkAllReadGR " ) {
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
$this -> catchup_feed ( $method_split [ 1 ], false );
2013-02-21 14:58:06 +00:00
}
// FIXME: might break tag display?
if ( is_numeric ( $feed ) && $feed > 0 && ! $cat_view ) {
2017-12-01 17:15:25 +00:00
$sth = $this -> pdo -> prepare ( " SELECT id FROM ttrss_feeds WHERE id = ? LIMIT 1 " );
$sth -> execute ([ $feed ]);
2013-02-21 14:58:06 +00:00
2017-12-01 17:15:25 +00:00
if ( ! $sth -> fetch ()) {
2013-02-21 14:58:06 +00:00
$reply [ 'content' ] = " <div align='center'> " . __ ( 'Feed not found.' ) . " </div> " ;
}
}
2021-02-05 20:41:32 +00:00
$search = $_REQUEST [ " query " ] ? ? " " ;
$search_language = $_REQUEST [ " search_language " ] ? ? " " ; // PGSQL only
2013-02-21 14:58:06 +00:00
if ( $search ) {
$disable_cache = true ;
}
2021-02-06 14:19:07 +00:00
$qfh_ret = [];
2013-03-28 19:34:35 +00:00
if ( ! $cat_view && is_numeric ( $feed ) && $feed < PLUGIN_FEED_BASE_INDEX && $feed > LABEL_BASE_INDEX ) {
2013-04-18 08:27:34 +00:00
$handler = PluginHost :: getInstance () -> get_feed_handler (
2013-03-27 12:14:27 +00:00
PluginHost :: feed_to_pfeed_id ( $feed ));
if ( $handler ) {
$options = array (
" limit " => $limit ,
" view_mode " => $view_mode ,
" cat_view " => $cat_view ,
" search " => $search ,
" override_order " => $override_order ,
" offset " => $offset ,
" owner_uid " => $_SESSION [ " uid " ],
" filter " => false ,
" since_id " => 0 ,
2018-12-09 10:35:37 +00:00
" include_children " => $include_children ,
" order_by " => $order_by );
2013-03-27 12:14:27 +00:00
$qfh_ret = $handler -> get_headlines ( PluginHost :: feed_to_pfeed_id ( $feed ),
$options );
}
} else {
2015-07-11 22:29:36 +00:00
$params = array (
" feed " => $feed ,
" limit " => $limit ,
" view_mode " => $view_mode ,
" cat_view " => $cat_view ,
" search " => $search ,
2015-08-04 10:53:48 +00:00
" search_language " => $search_language ,
2015-07-11 22:29:36 +00:00
" override_order " => $override_order ,
" offset " => $offset ,
" include_children " => $include_children ,
2015-11-21 19:20:00 +00:00
" check_first_id " => $check_first_id ,
2018-12-09 10:35:37 +00:00
" skip_first_id_check " => $skip_first_id_check ,
" order_by " => $order_by
2015-07-11 22:29:36 +00:00
);
2017-05-04 12:13:02 +00:00
$qfh_ret = $this -> queryFeedHeadlines ( $params );
2013-03-27 12:14:27 +00:00
}
2013-02-21 14:58:06 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " db query " );
2019-08-30 07:16:38 +00:00
$vfeed_group_enabled = get_pref ( " VFEED_GROUP_BY_FEED " ) &&
2020-09-22 11:54:15 +00:00
! ( in_array ( $feed , self :: NEVER_GROUP_FEEDS ) && ! $cat_view );
2014-03-12 21:07:52 +00:00
2017-12-04 07:26:22 +00:00
$result = $qfh_ret [ 0 ]; // this could be either a PDO query result or a -1 if first id changed
2013-02-21 14:58:06 +00:00
$feed_title = $qfh_ret [ 1 ];
$feed_site_url = $qfh_ret [ 2 ];
$last_error = $qfh_ret [ 3 ];
2020-09-17 16:02:27 +00:00
$last_updated = strpos ( $qfh_ret [ 4 ], '1970-' ) === false ?
2020-09-23 10:04:26 +00:00
TimeHelper :: make_local_datetime ( $qfh_ret [ 4 ], false ) : __ ( " Never " );
2013-07-31 10:53:34 +00:00
$highlight_words = $qfh_ret [ 5 ];
2015-07-12 14:55:35 +00:00
$reply [ 'first_id' ] = $qfh_ret [ 6 ];
2019-01-16 18:33:59 +00:00
$reply [ 'is_vfeed' ] = $qfh_ret [ 7 ];
2019-04-30 11:39:08 +00:00
$query_error_override = $qfh_ret [ 8 ];
2017-03-31 08:21:35 +00:00
$reply [ 'search_query' ] = [ $search , $search_language ];
2018-12-07 18:11:50 +00:00
$reply [ 'vfeed_group_enabled' ] = $vfeed_group_enabled ;
2013-02-21 14:58:06 +00:00
$reply [ 'toolbar' ] = $this -> format_headline_subtoolbar ( $feed_site_url ,
$feed_title ,
2017-04-26 12:29:22 +00:00
$feed , $cat_view , $search ,
2013-04-25 12:27:33 +00:00
$last_error , $last_updated );
2013-02-21 14:58:06 +00:00
2021-02-06 14:19:07 +00:00
$reply [ 'content' ] = [];
2021-02-08 20:10:22 +00:00
if ( $offset == 0 )
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_HEADLINES_BEFORE ,
function ( $result ) use ( & $reply ) {
$reply [ 'content' ] .= $result ;
},
$feed , $cat_view , $qfh_ret );
2014-08-19 10:24:34 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " object header " );
2017-12-01 17:25:13 +00:00
$headlines_count = 0 ;
2021-02-06 14:19:07 +00:00
if ( $result instanceof PDOStatement ) {
2018-12-07 13:00:11 +00:00
while ( $line = $result -> fetch ( PDO :: FETCH_ASSOC )) {
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " article start: " . $line [ " id " ] . " " . $line [ " title " ]);
2017-12-01 17:25:13 +00:00
2017-12-04 07:26:22 +00:00
++ $headlines_count ;
2013-02-21 14:58:06 +00:00
2018-12-07 13:00:11 +00:00
if ( ! get_pref ( 'SHOW_CONTENT_PREVIEW' )) {
2018-12-09 01:24:48 +00:00
$line [ " content_preview " ] = " " ;
2018-12-07 13:00:11 +00:00
} else {
$line [ " content_preview " ] = " — " . truncate_string ( strip_tags ( $line [ " content " ]), 250 );
2013-02-21 14:58:06 +00:00
2021-02-08 20:10:22 +00:00
$max_excerpt_length = 250 ;
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_QUERY_HEADLINES ,
function ( $result ) use ( & $line ) {
$line = $result ;
},
$line , $max_excerpt_length );
2020-12-04 15:55:53 +00:00
}
$this -> mark_timestamp ( " hook_query_headlines " );
2013-02-21 14:58:06 +00:00
2017-12-04 07:26:22 +00:00
$id = $line [ " id " ];
2013-07-10 12:52:03 +00:00
2018-12-08 05:23:18 +00:00
// frontend doesn't expect pdo returning booleans as strings on mysql
if ( DB_TYPE == " mysql " ) {
foreach ([ " unread " , " marked " , " published " ] as $k ) {
$line [ $k ] = $line [ $k ] === " 1 " ;
}
}
2018-12-06 16:00:11 +00:00
// normalize archived feed
2018-12-07 13:00:11 +00:00
if ( $line [ 'feed_id' ] === null ) {
$line [ 'feed_id' ] = 0 ;
2018-12-06 16:00:11 +00:00
$line [ " feed_title " ] = __ ( " Archived articles " );
}
2018-12-07 15:24:56 +00:00
$feed_id = $line [ " feed_id " ];
2018-12-07 13:00:11 +00:00
$label_cache = $line [ " label_cache " ];
$labels = false ;
2017-12-04 07:39:50 +00:00
2017-12-04 07:26:22 +00:00
if ( $label_cache ) {
$label_cache = json_decode ( $label_cache , true );
2015-07-12 22:19:52 +00:00
2017-12-04 07:26:22 +00:00
if ( $label_cache ) {
2021-02-05 20:41:32 +00:00
if ( $label_cache [ " no-labels " ] ? ? false == 1 )
2017-12-04 07:26:22 +00:00
$labels = array ();
else
$labels = $label_cache ;
}
}
2013-07-10 12:52:03 +00:00
2017-12-04 07:26:22 +00:00
if ( ! is_array ( $labels )) $labels = Article :: get_article_labels ( $id );
2013-07-10 12:52:03 +00:00
2017-12-04 07:26:22 +00:00
$labels_str = " <span class= \" HLLCTR- $id\ " > " ;
$labels_str .= Article :: format_article_labels ( $labels );
$labels_str .= " </span> " ;
2013-07-10 12:52:03 +00:00
2018-12-07 13:00:11 +00:00
$line [ " labels " ] = $labels_str ;
2017-12-04 07:26:22 +00:00
if ( count ( $topmost_article_ids ) < 3 ) {
array_push ( $topmost_article_ids , $id );
}
2013-02-21 14:58:06 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " labels " );
2021-02-05 20:41:32 +00:00
$line [ " feed_title " ] = $line [ " feed_title " ] ? ? " " ;
2013-02-21 14:58:06 +00:00
2020-12-04 15:55:53 +00:00
$line [ " buttons_left " ] = " " ;
2021-02-08 20:10:22 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_ARTICLE_LEFT_BUTTON ,
function ( $result ) use ( & $line ) {
$line [ " buttons_left " ] .= $result ;
},
$line );
2020-12-04 15:55:53 +00:00
$line [ " buttons " ] = " " ;
2021-02-08 20:10:22 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_ARTICLE_BUTTON ,
function ( $result ) use ( & $line ) {
$line [ " buttons " ] .= $result ;
},
$line );
2018-12-07 15:24:56 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " pre-sanitize " );
2018-12-07 15:24:56 +00:00
2020-12-04 15:55:53 +00:00
$line [ " content " ] = Sanitizer :: sanitize ( $line [ " content " ],
$line [ 'hide_images' ], false , $line [ " site_url " ], $highlight_words , $line [ " id " ]);
2018-12-07 15:24:56 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " sanitize " );
2018-12-07 15:24:56 +00:00
2021-02-08 20:10:22 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_RENDER_ARTICLE_CDM ,
function ( $result , $plugin ) use ( & $line ) {
$line = $result ;
$this -> mark_timestamp ( " hook_render_cdm: " . get_class ( $plugin ));
},
$line );
2018-12-07 15:24:56 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " hook_render_cdm " );
2017-12-04 07:26:22 +00:00
2020-12-04 15:55:53 +00:00
$line [ 'content' ] = DiskCache :: rewriteUrls ( $line [ 'content' ]);
2018-12-07 15:24:56 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " disk_cache_rewrite " );
2018-12-07 15:38:27 +00:00
2020-12-04 15:55:53 +00:00
if ( $line [ 'note' ])
$line [ 'note' ] = Article :: format_article_note ( $id , $line [ 'note' ]);
else
$line [ 'note' ] = " " ;
2018-12-07 15:38:27 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " note " );
if ( ! get_pref ( " CDM_EXPANDED " )) {
$line [ " cdm_excerpt " ] = " <span class='collapse'>
< i class = 'material-icons' onclick = 'return Article.cdmUnsetActive(event)'
title = \ " " . __ ( " Collapse article " ) . " \" >remove_circle</i></span> " ;
if ( get_pref ( 'SHOW_CONTENT_PREVIEW' )) {
$line [ " cdm_excerpt " ] .= " <span class='excerpt'> " . $line [ " content_preview " ] . " </span> " ;
}
}
$this -> mark_timestamp ( " pre-enclosures " );
$line [ " enclosures " ] = Article :: format_article_enclosures ( $id , $line [ " always_display_enclosures " ],
$line [ " content " ], $line [ " hide_images " ]);
$this -> mark_timestamp ( " enclosures " );
2020-09-23 10:04:26 +00:00
$line [ " updated_long " ] = TimeHelper :: make_local_datetime ( $line [ " updated " ], true );
$line [ " updated " ] = TimeHelper :: make_local_datetime ( $line [ " updated " ], false , false , false , true );
2018-12-08 06:32:14 +00:00
2018-12-07 13:00:11 +00:00
$line [ 'imported' ] = T_sprintf ( " Imported at %s " ,
2020-12-04 15:55:53 +00:00
TimeHelper :: make_local_datetime ( $line [ " date_entered " ], false ));
$this -> mark_timestamp ( " local-datetime " );
2013-02-21 14:58:06 +00:00
2018-12-07 15:24:56 +00:00
if ( $line [ " tag_cache " ])
$tags = explode ( " , " , $line [ " tag_cache " ]);
else
$tags = false ;
2013-02-21 14:58:06 +00:00
2021-02-06 14:19:07 +00:00
$line [ " tags_str " ] = Article :: format_tags_string ( $tags );
2013-02-21 14:58:06 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " tags " );
2020-09-22 11:54:15 +00:00
if ( self :: feedHasIcon ( $feed_id )) {
2018-12-07 13:00:11 +00:00
$line [ 'feed_icon' ] = " <img class= \" icon \" src= \" " . ICONS_URL . " / $feed_id .ico \" alt= \" \" > " ;
2017-12-04 07:26:22 +00:00
} else {
2018-12-07 13:00:11 +00:00
$line [ 'feed_icon' ] = " <i class='icon-no-feed material-icons'>rss_feed</i> " ;
2017-12-04 07:26:22 +00:00
}
2013-02-21 14:58:06 +00:00
2018-12-07 15:24:56 +00:00
//setting feed headline background color, needs to change text color based on dark/light
2021-02-05 20:41:32 +00:00
$fav_color = $line [ 'favicon_avg_color' ] ? ? false ;
2013-02-21 14:58:06 +00:00
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " pre-color " );
2017-12-04 07:26:22 +00:00
require_once " colors.php " ;
2013-02-21 14:58:06 +00:00
2018-12-12 04:57:37 +00:00
if ( ! isset ( $rgba_cache [ $feed_id ])) {
if ( $fav_color && $fav_color != 'fail' ) {
$rgba_cache [ $feed_id ] = _color_unpack ( $fav_color );
} else {
$rgba_cache [ $feed_id ] = _color_unpack ( $this -> color_of ( $line [ 'feed_title' ]));
2017-12-04 07:26:22 +00:00
}
}
2013-02-21 14:58:06 +00:00
2018-12-12 04:57:37 +00:00
if ( isset ( $rgba_cache [ $feed_id ])) {
$line [ 'feed_bg_color' ] = 'rgba(' . implode ( " , " , $rgba_cache [ $feed_id ]) . ',0.3)' ;
2020-12-04 15:55:53 +00:00
}
$this -> mark_timestamp ( " color " );
2018-12-12 04:57:37 +00:00
2018-12-07 18:52:41 +00:00
/* we don't need those */
2020-12-04 15:55:53 +00:00
foreach ([ " date_entered " , " guid " , " last_published " , " last_marked " , " tag_cache " , " favicon_avg_color " ,
" uuid " , " label_cache " , " yyiw " ] as $k )
unset ( $line [ $k ]);
2018-12-07 18:52:41 +00:00
2018-12-07 13:00:11 +00:00
array_push ( $reply [ 'content' ], $line );
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " article end " );
2017-12-04 07:26:22 +00:00
}
2020-12-04 15:55:53 +00:00
}
$this -> mark_timestamp ( " end of articles " );
2013-02-21 14:58:06 +00:00
2017-12-01 17:25:13 +00:00
if ( ! $headlines_count ) {
2013-02-21 14:58:06 +00:00
2021-02-06 14:19:07 +00:00
if ( $result instanceof PDOStatement ) {
2013-02-21 14:58:06 +00:00
2019-04-30 11:39:08 +00:00
if ( $query_error_override ) {
$message = $query_error_override ;
} else {
switch ( $view_mode ) {
case " unread " :
$message = __ ( " No unread articles found to display. " );
break ;
case " updated " :
$message = __ ( " No updated articles found to display. " );
break ;
case " marked " :
$message = __ ( " No starred articles found to display. " );
break ;
default :
if ( $feed < LABEL_BASE_INDEX ) {
$message = __ ( " No articles found to display. You can assign articles to labels manually from article header context menu (applies to all selected articles) or use a filter. " );
} else {
$message = __ ( " No articles found to display. " );
}
}
2017-12-01 17:25:13 +00:00
}
2013-02-21 14:58:06 +00:00
2017-12-01 17:25:13 +00:00
if ( ! $offset && $message ) {
$reply [ 'content' ] = " <div class='whiteBox'> $message " ;
2013-02-21 14:58:06 +00:00
2019-03-08 07:11:57 +00:00
$reply [ 'content' ] .= " <p><span class= \" text-muted \" > " ;
2013-02-21 14:58:06 +00:00
2017-12-01 17:25:13 +00:00
$sth = $this -> pdo -> prepare ( " SELECT " . SUBSTRING_FOR_DATE . " (MAX(last_updated), 1, 19) AS last_updated FROM ttrss_feeds
WHERE owner_uid = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
$row = $sth -> fetch ();
2013-02-21 14:58:06 +00:00
2020-09-23 10:04:26 +00:00
$last_updated = TimeHelper :: make_local_datetime ( $row [ " last_updated " ], false );
2013-02-21 14:58:06 +00:00
2017-12-01 17:25:13 +00:00
$reply [ 'content' ] .= sprintf ( __ ( " Feeds last updated at %s " ), $last_updated );
2013-02-21 14:58:06 +00:00
2017-12-01 17:25:13 +00:00
$sth = $this -> pdo -> prepare ( " SELECT COUNT(id) AS num_errors
FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
$row = $sth -> fetch ();
2013-02-21 14:58:06 +00:00
2017-12-01 17:25:13 +00:00
$num_errors = $row [ " num_errors " ];
2013-02-21 14:58:06 +00:00
2017-12-01 17:25:13 +00:00
if ( $num_errors > 0 ) {
$reply [ 'content' ] .= " <br/> " ;
2019-03-08 07:11:57 +00:00
$reply [ 'content' ] .= " <a class= \" text-muted \" href= \" # \" onclick= \" CommonDialogs.showFeedsWithErrors() \" > " .
2017-12-01 17:25:13 +00:00
__ ( 'Some feeds have update errors (click for details)' ) . " </a> " ;
}
$reply [ 'content' ] .= " </span></p></div> " ;
2015-07-13 10:29:13 +00:00
2017-12-01 17:25:13 +00:00
}
} else if ( is_numeric ( $result ) && $result == - 1 ) {
$reply [ 'first_id_changed' ] = true ;
2013-02-21 14:58:06 +00:00
}
}
2020-12-04 15:55:53 +00:00
$this -> mark_timestamp ( " end " );
2018-12-07 18:11:50 +00:00
return array ( $topmost_article_ids , $headlines_count , $feed , $disable_cache , $reply );
2013-02-21 14:58:06 +00:00
}
function catchupAll () {
2017-12-01 16:42:02 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_user_entries SET
last_read = NOW (), unread = false WHERE unread = true AND owner_uid = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
2013-02-21 14:58:06 +00:00
}
function view () {
$reply = array ();
2017-12-01 17:26:51 +00:00
$feed = $_REQUEST [ " feed " ];
2021-02-05 20:41:32 +00:00
$method = $_REQUEST [ " m " ] ? ? " " ;
2017-12-01 17:26:51 +00:00
$view_mode = $_REQUEST [ " view_mode " ];
2013-04-02 11:32:47 +00:00
$limit = 30 ;
2021-02-05 20:41:32 +00:00
$cat_view = $_REQUEST [ " cat " ] == " true " ;
$next_unread_feed = $_REQUEST [ " nuf " ] ? ? 0 ;
$offset = $_REQUEST [ " skip " ] ? ? 0 ;
2017-12-01 17:26:51 +00:00
$order_by = $_REQUEST [ " order_by " ];
2021-02-05 20:41:32 +00:00
$check_first_id = $_REQUEST [ " fid " ] ? ? 0 ;
2013-02-21 14:58:06 +00:00
if ( is_numeric ( $feed )) $feed = ( int ) $feed ;
/* Feed - 5 is a special case : it is used to display auxiliary information
* when there ' s nothing to load - e . g . no stuff in fresh feed */
if ( $feed == - 5 ) {
2013-04-17 12:23:15 +00:00
print json_encode ( $this -> generate_dashboard_feed ());
2013-02-21 14:58:06 +00:00
return ;
}
2017-12-01 16:42:02 +00:00
$sth = false ;
2013-03-27 05:40:07 +00:00
if ( $feed < LABEL_BASE_INDEX ) {
2017-12-01 16:42:02 +00:00
2017-05-04 12:57:40 +00:00
$label_feed = Labels :: feed_to_label_id ( $feed );
2017-12-01 16:42:02 +00:00
$sth = $this -> pdo -> prepare ( " SELECT id FROM ttrss_labels2 WHERE
id = ? AND owner_uid = ? " );
$sth -> execute ([ $label_feed , $_SESSION [ 'uid' ]]);
2013-02-21 14:58:06 +00:00
} else if ( ! $cat_view && is_numeric ( $feed ) && $feed > 0 ) {
2017-12-01 16:42:02 +00:00
$sth = $this -> pdo -> prepare ( " SELECT id FROM ttrss_feeds WHERE
id = ? AND owner_uid = ? " );
$sth -> execute ([ $feed , $_SESSION [ 'uid' ]]);
2013-02-21 14:58:06 +00:00
} else if ( $cat_view && is_numeric ( $feed ) && $feed > 0 ) {
2017-12-01 16:42:02 +00:00
$sth = $this -> pdo -> prepare ( " SELECT id FROM ttrss_feed_categories WHERE
id = ? AND owner_uid = ? " );
$sth -> execute ([ $feed , $_SESSION [ 'uid' ]]);
2013-02-21 14:58:06 +00:00
}
2017-12-01 16:42:02 +00:00
if ( $sth && ! $sth -> fetch ()) {
2013-04-17 14:34:18 +00:00
print json_encode ( $this -> generate_error_feed ( __ ( " Feed not found. " )));
2013-02-21 14:58:06 +00:00
return ;
}
2013-04-17 14:34:18 +00:00
set_pref ( " _DEFAULT_VIEW_MODE " , $view_mode );
set_pref ( " _DEFAULT_VIEW_ORDER_BY " , $order_by );
2013-02-21 14:58:06 +00:00
2013-03-22 08:37:42 +00:00
/* bump login timestamp if needed */
if ( time () - $_SESSION [ " last_login_update " ] > 3600 ) {
2017-12-01 16:42:02 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_users SET last_login = NOW() WHERE id = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
2013-03-22 08:37:42 +00:00
$_SESSION [ " last_login_update " ] = time ();
}
2013-02-21 14:58:06 +00:00
if ( ! $cat_view && is_numeric ( $feed ) && $feed > 0 ) {
2017-12-01 16:42:02 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_feeds SET last_viewed = NOW()
WHERE id = ? AND owner_uid = ? " );
$sth -> execute ([ $feed , $_SESSION [ 'uid' ]]);
2013-02-21 14:58:06 +00:00
}
2018-12-07 18:22:51 +00:00
$reply [ 'headlines' ] = [];
2013-02-21 14:58:06 +00:00
2020-09-22 11:54:15 +00:00
list ( $override_order , $skip_first_id_check ) = self :: order_to_override_query ( $order_by );
2013-02-21 14:58:06 +00:00
$ret = $this -> format_headlines_list ( $feed , $method ,
2017-04-26 12:29:22 +00:00
$view_mode , $limit , $cat_view , $offset ,
2018-12-09 10:35:37 +00:00
$override_order , true , $check_first_id , $skip_first_id_check , $order_by );
2013-02-21 14:58:06 +00:00
$headlines_count = $ret [ 1 ];
$disable_cache = $ret [ 3 ];
2018-12-07 18:11:50 +00:00
$reply [ 'headlines' ] = $ret [ 4 ];
2015-07-12 09:01:34 +00:00
if ( ! $next_unread_feed )
$reply [ 'headlines' ][ 'id' ] = $feed ;
else
$reply [ 'headlines' ][ 'id' ] = $next_unread_feed ;
2021-02-05 20:41:32 +00:00
$reply [ 'headlines' ][ 'is_cat' ] = $cat_view ;
2013-02-21 14:58:06 +00:00
2018-12-07 18:22:51 +00:00
$reply [ 'headlines-info' ] = [ " count " => ( int ) $headlines_count ,
" disable_cache " => ( bool ) $disable_cache ];
2013-02-21 14:58:06 +00:00
2018-12-07 18:22:51 +00:00
// this is parsed by handleRpcJson() on first viewfeed() to set cdm expanded, etc
2020-09-22 06:04:33 +00:00
$reply [ 'runtime-info' ] = RPC :: make_runtime_info ();
2013-02-21 14:58:06 +00:00
2018-12-24 09:28:11 +00:00
$reply_json = json_encode ( $reply );
if ( ! $reply_json ) {
$reply_json = json_encode ([ " error " => [ " code " => 15 ,
" message " => json_last_error_msg ()]]);
}
print $reply_json ;
2013-02-21 14:58:06 +00:00
}
2013-04-17 12:23:15 +00:00
private function generate_dashboard_feed () {
2013-02-21 14:58:06 +00:00
$reply = array ();
$reply [ 'headlines' ][ 'id' ] = - 5 ;
$reply [ 'headlines' ][ 'is_cat' ] = false ;
$reply [ 'headlines' ][ 'toolbar' ] = '' ;
2015-07-13 19:01:29 +00:00
$reply [ 'headlines' ][ 'content' ] = " <div class='whiteBox'> " . __ ( 'No feed selected.' );
2015-07-13 15:43:54 +00:00
2019-03-08 07:11:57 +00:00
$reply [ 'headlines' ][ 'content' ] .= " <p><span class= \" text-muted \" > " ;
2013-02-21 14:58:06 +00:00
2017-12-01 16:42:02 +00:00
$sth = $this -> pdo -> prepare ( " SELECT " . SUBSTRING_FOR_DATE . " (MAX(last_updated), 1, 19) AS last_updated FROM ttrss_feeds
WHERE owner_uid = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
$row = $sth -> fetch ();
2013-02-21 14:58:06 +00:00
2020-09-23 10:04:26 +00:00
$last_updated = TimeHelper :: make_local_datetime ( $row [ " last_updated " ], false );
2013-02-21 14:58:06 +00:00
2015-07-13 19:01:29 +00:00
$reply [ 'headlines' ][ 'content' ] .= sprintf ( __ ( " Feeds last updated at %s " ), $last_updated );
2013-02-21 14:58:06 +00:00
2017-12-01 16:42:02 +00:00
$sth = $this -> pdo -> prepare ( " SELECT COUNT(id) AS num_errors
FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
$row = $sth -> fetch ();
2013-02-21 14:58:06 +00:00
2017-12-01 16:42:02 +00:00
$num_errors = $row [ " num_errors " ];
2013-02-21 14:58:06 +00:00
if ( $num_errors > 0 ) {
2015-07-13 19:01:29 +00:00
$reply [ 'headlines' ][ 'content' ] .= " <br/> " ;
2019-03-08 07:11:57 +00:00
$reply [ 'headlines' ][ 'content' ] .= " <a class= \" text-muted \" href= \" # \" onclick= \" CommonDialogs.showFeedsWithErrors() \" > " .
2013-02-21 14:58:06 +00:00
__ ( 'Some feeds have update errors (click for details)' ) . " </a> " ;
}
2015-07-13 19:01:29 +00:00
$reply [ 'headlines' ][ 'content' ] .= " </span></p> " ;
2013-02-21 14:58:06 +00:00
$reply [ 'headlines-info' ] = array ( " count " => 0 ,
" unread " => 0 ,
" disable_cache " => true );
return $reply ;
}
2013-04-17 14:34:18 +00:00
private function generate_error_feed ( $error ) {
2013-02-21 14:58:06 +00:00
$reply = array ();
2015-07-13 19:04:21 +00:00
$reply [ 'headlines' ][ 'id' ] = - 7 ;
2013-02-21 14:58:06 +00:00
$reply [ 'headlines' ][ 'is_cat' ] = false ;
$reply [ 'headlines' ][ 'toolbar' ] = '' ;
$reply [ 'headlines' ][ 'content' ] = " <div class='whiteBox'> " . $error . " </div> " ;
$reply [ 'headlines-info' ] = array ( " count " => 0 ,
" unread " => 0 ,
" disable_cache " => true );
return $reply ;
}
2013-04-01 07:14:27 +00:00
function quickAddFeed () {
2017-12-11 15:43:53 +00:00
print " <form onsubmit='return false'> " ;
2017-02-10 11:36:21 +00:00
print_hidden ( " op " , " rpc " );
print_hidden ( " method " , " addfeed " );
2013-04-01 07:14:27 +00:00
2017-01-28 09:45:49 +00:00
print " <div id='fadd_error_message' style='display : none' class='alert alert-danger'></div> " ;
2013-10-02 11:24:08 +00:00
print " <div id='fadd_multiple_notify' style='display : none'> " ;
print_notice ( " Provided URL is a HTML page referencing multiple feeds, please select required feed from the dropdown menu below. " );
print " <p></div> " ;
2019-02-22 07:48:56 +00:00
print " <section> " ;
2013-04-01 07:14:27 +00:00
2019-02-20 11:37:59 +00:00
print " <fieldset> " ;
2019-02-22 07:48:56 +00:00
print " <div style='float : right'><img style='display : none' id='feed_add_spinner' src='images/indicator_white.gif'></div> " ;
print " <input style='font-size : 16px; width : 500px;'
2013-04-01 07:14:27 +00:00
placeHolder = \ " " . __ ( " Feed or site URL " ) . " \"
2019-02-22 07:48:56 +00:00
dojoType = 'dijit.form.ValidationTextBox' required = '1' name = 'feed' id = 'feedDlg_feedUrl' > " ;
2013-04-01 07:14:27 +00:00
2019-02-20 11:37:59 +00:00
print " </fieldset> " ;
print " <fieldset> " ;
2013-04-01 07:14:27 +00:00
2013-04-17 14:34:18 +00:00
if ( get_pref ( 'ENABLE_FEED_CATS' )) {
2019-02-22 09:13:41 +00:00
print " <label class='inline'> " . __ ( 'Place in category:' ) . " </label> " ;
2019-04-13 20:36:15 +00:00
print_feed_cat_select ( " cat " , false , 'dojoType="fox.form.Select"' );
2013-04-01 07:14:27 +00:00
}
2019-02-20 11:37:59 +00:00
print " </fieldset> " ;
2019-02-22 07:48:56 +00:00
print " </section> " ;
2013-04-01 07:14:27 +00:00
print ' < div id = " feedDlg_feedsContainer " style = " display : none " >
2019-02-22 07:48:56 +00:00
< header > ' . __(' Available feeds ') . ' </ header >
< section >
2019-02-20 11:37:59 +00:00
< fieldset >
< select id = " feedDlg_feedContainerSelect "
2019-04-13 20:36:15 +00:00
dojoType = " fox.form.Select " size = " 3 " >
2019-02-20 11:37:59 +00:00
< script type = " dojo/method " event = " onChange " args = " value " >
dijit . byId ( " feedDlg_feedUrl " ) . attr ( " value " , value );
</ script >
</ select >
</ fieldset >
2019-02-22 07:48:56 +00:00
</ section >
</ div > ' ;
2013-04-01 07:14:27 +00:00
print " <div id='feedDlg_loginContainer' style='display : none'>
2019-02-22 07:48:56 +00:00
< section >
2019-02-20 11:37:59 +00:00
< fieldset >
< input dojoType = \ " dijit.form.TextBox \" name='login' \"
placeHolder = \ " " . __ ( " Login " ) . " \"
autocomplete = \ " new-password \"
style = \ " width : 10em; \" >
< input
placeHolder = \ " " . __ ( " Password " ) . " \"
dojoType = \ " dijit.form.TextBox \" type='password'
autocomplete = \ " new-password \"
style = \ " width : 10em; \" name='pass' \" >
</ fieldset >
2019-02-22 07:48:56 +00:00
</ section >
</ div > " ;
2013-04-01 07:14:27 +00:00
2019-02-22 07:48:56 +00:00
print " <section> " ;
print " <label>
< label class = 'checkbox' >< input type = 'checkbox' name = 'need_auth' dojoType = 'dijit.form.CheckBox' id = 'feedDlg_loginCheck'
2020-06-05 04:44:57 +00:00
onclick = 'App.displayIfChecked(this, \"feedDlg_loginContainer\")' >
2019-02-22 07:48:56 +00:00
" .__('This feed requires authentication.'). " </ label > " ;
print " </section> " ;
2013-04-01 07:14:27 +00:00
2019-02-22 07:48:56 +00:00
print " <footer> " ;
2020-06-05 04:44:57 +00:00
print " <button dojoType='dijit.form.Button' class='alt-primary' type='submit'
2021-02-12 07:35:13 +00:00
onclick = 'App.dialogOf(this).execute()' > " .__('Subscribe'). " </ button > " ;
2013-04-01 07:14:27 +00:00
2021-02-12 07:35:13 +00:00
print " <button dojoType='dijit.form.Button' onclick='App.dialogOf(this).hide()'> " .
__ ( 'Cancel' ) . " </button> " ;
2019-02-22 07:48:56 +00:00
print " </footer> " ;
2013-04-01 07:14:27 +00:00
2017-12-11 15:43:53 +00:00
print " </form> " ;
2013-04-01 07:14:27 +00:00
}
function search () {
2017-12-01 17:26:51 +00:00
$this -> params = explode ( " : " , $_REQUEST [ " param " ], 2 );
2013-04-01 07:14:27 +00:00
$active_feed_id = sprintf ( " %d " , $this -> params [ 0 ]);
$is_cat = $this -> params [ 1 ] != " false " ;
2021-02-12 06:56:27 +00:00
print " <form onsubmit='return false'> " ;
2017-12-11 15:14:45 +00:00
2019-02-22 07:48:56 +00:00
print " <section> " ;
2013-04-01 07:14:27 +00:00
2019-02-20 12:12:37 +00:00
print " <fieldset> " ;
2019-05-20 04:59:53 +00:00
print " <input dojoType='dijit.form.ValidationTextBox' id='search_query'
2019-02-22 07:48:56 +00:00
style = 'font-size : 16px; width : 540px;'
2019-02-21 10:22:31 +00:00
placeHolder = \ " " . T_sprintf ( " Search %s... " , $this -> getFeedTitle ( $active_feed_id , $is_cat )) . " \"
2019-05-20 04:59:53 +00:00
name = 'query' type = 'search' value = '' > " ;
2019-02-20 12:12:37 +00:00
print " </fieldset> " ;
2013-04-01 07:14:27 +00:00
2015-08-04 10:53:48 +00:00
if ( DB_TYPE == " pgsql " ) {
2019-02-20 12:12:37 +00:00
print " <fieldset> " ;
2019-02-22 09:13:41 +00:00
print " <label class='inline'> " . __ ( " Language: " ) . " </label> " ;
2019-04-10 10:03:26 +00:00
print_select ( " search_language " , get_pref ( 'DEFAULT_SEARCH_LANGUAGE' ), Pref_Feeds :: get_ts_languages (),
2019-04-13 20:36:15 +00:00
" dojoType='fox.form.Select' title= \" " . __ ( 'Used for word stemming' ) . " \" " );
2019-02-20 12:12:37 +00:00
print " </fieldset> " ;
2015-08-04 10:53:48 +00:00
}
2019-02-22 07:48:56 +00:00
print " </section> " ;
2013-04-01 07:14:27 +00:00
2019-02-22 07:48:56 +00:00
print " <footer> " ;
2013-04-01 07:14:27 +00:00
2014-04-15 04:18:33 +00:00
if ( count ( PluginHost :: getInstance () -> get_hooks ( PluginHost :: HOOK_SEARCH )) == 0 ) {
2019-02-21 13:21:16 +00:00
print " <button dojoType='dijit.form.Button' style='float : left' class='alt-info' onclick='window.open( \" https://tt-rss.org/wiki/SearchSyntax \" )'>
< i class = 'material-icons' > help </ i > " .__( " Search syntax " ). " </ button > " ;
2013-04-01 07:14:27 +00:00
}
2021-02-12 06:56:27 +00:00
print " <button dojoType='dijit.form.Button' class='alt-primary'
type = 'submit' onclick = 'App.dialogOf(this).execute()' > " .__('Search'). " </ button >
< button dojoType = 'dijit.form.Button' onclick = 'App.dialogOf(this).hide()' > " .__('Cancel'). " </ button > " ;
2019-02-22 07:48:56 +00:00
print " </footer> " ;
2017-12-11 15:14:45 +00:00
print " </form> " ;
2013-04-01 07:14:27 +00:00
}
2015-06-12 10:06:36 +00:00
function update_debugger () {
header ( " Content-type: text/html " );
2020-12-12 19:17:23 +00:00
$xdebug = isset ( $_REQUEST [ " xdebug " ]) ? ( int ) $_REQUEST [ " xdebug " ] : 1 ;
2018-11-30 05:34:29 +00:00
Debug :: set_enabled ( true );
2020-12-12 19:17:23 +00:00
Debug :: set_loglevel ( $xdebug );
2018-11-30 05:34:29 +00:00
2015-06-12 10:06:36 +00:00
$feed_id = ( int ) $_REQUEST [ " feed_id " ];
2021-02-06 07:31:06 +00:00
$do_update = ( $_REQUEST [ " action " ] ? ? " " ) == " do_update " ;
2020-09-15 13:12:53 +00:00
$csrf_token = $_POST [ " csrf_token " ];
2015-06-12 10:06:36 +00:00
2017-12-03 10:35:18 +00:00
$sth = $this -> pdo -> prepare ( " SELECT id FROM ttrss_feeds WHERE id = ? AND owner_uid = ? " );
$sth -> execute ([ $feed_id , $_SESSION [ 'uid' ]]);
if ( ! $sth -> fetch ()) {
print " Access denied. " ;
return ;
}
2015-06-12 10:06:36 +00:00
$refetch_checked = isset ( $_REQUEST [ " force_refetch " ]) ? " checked " : " " ;
$rehash_checked = isset ( $_REQUEST [ " force_rehash " ]) ? " checked " : " " ;
?>
2019-02-23 10:49:40 +00:00
<! DOCTYPE html >
2015-06-12 10:06:36 +00:00
< html >
< head >
< title > Feed Debugger </ title >
2020-01-19 07:56:49 +00:00
< style type = 'text/css' >
@ media ( prefers - color - scheme : dark ) {
body {
background : #222;
}
}
body . css_loading * {
display : none ;
}
</ style >
2019-02-19 18:00:15 +00:00
< ? php
echo javascript_tag ( " lib/prototype.js " );
2020-01-19 07:56:49 +00:00
echo javascript_tag ( " js/utility.js " );
2019-02-19 18:00:15 +00:00
echo javascript_tag ( " lib/dojo/dojo.js " );
echo javascript_tag ( " lib/dojo/tt-rss-layer.js " );
?>
2015-06-12 10:06:36 +00:00
</ head >
2020-01-19 07:56:49 +00:00
< body class = " flat ttrss_utility feed_debugger css_loading " >
2019-02-19 18:00:15 +00:00
< script type = " text/javascript " >
2020-12-12 19:17:23 +00:00
require ([ 'dojo/parser' , " dojo/ready " , 'dijit/form/Button' , 'dijit/form/CheckBox' , 'dijit/form/Select' , 'dijit/form/Form' ,
2019-02-19 18:00:15 +00:00
'dijit/form/Select' , 'dijit/form/TextBox' , 'dijit/form/ValidationTextBox' ], function ( parser , ready ){
ready ( function () {
parser . parse ();
});
});
</ script >
2019-02-19 16:46:09 +00:00
< div class = " container " >
2021-02-14 06:15:51 +00:00
< h1 > Feed Debugger : < ? = " $feed_id : " . $this -> getFeedTitle ( $feed_id ) ?> </h1>
2019-02-19 16:46:09 +00:00
< div class = " content " >
2020-09-15 13:12:53 +00:00
< form method = " post " action = " " >
2019-02-19 16:46:09 +00:00
< input type = " hidden " name = " op " value = " feeds " >
< input type = " hidden " name = " method " value = " update_debugger " >
2021-02-14 06:15:51 +00:00
< input type = " hidden " name = " csrf_token " value = " <?= $csrf_token ?> " >
2019-02-19 16:46:09 +00:00
< input type = " hidden " name = " action " value = " do_update " >
2021-02-14 06:15:51 +00:00
< input type = " hidden " name = " feed_id " value = " <?= $feed_id ?> " >
2019-02-19 16:46:09 +00:00
2020-12-12 19:17:23 +00:00
< fieldset >
< label >
< ? php print_select_hash ( " xdebug " , $xdebug ,
[ Debug :: $LOG_VERBOSE => " LOG_VERBOSE " , Debug :: $LOG_EXTENDED => " LOG_EXTENDED " ],
'dojoType="dijit.form.Select"' );
?> </label>
</ fieldset >
< fieldset >
2021-02-14 06:15:51 +00:00
< label class = " checkbox " >< input dojoType = " dijit.form.CheckBox " type = " checkbox " name = " force_refetch " value = " 1 " < ? = $refetch_checked ?> > Force refetch</label>
2019-02-19 18:00:15 +00:00
</ fieldset >
2019-02-19 18:24:00 +00:00
< fieldset class = " narrow " >
2021-02-14 06:15:51 +00:00
< label class = " checkbox " >< input dojoType = " dijit.form.CheckBox " type = " checkbox " name = " force_rehash " value = " 1 " < ? = $rehash_checked ?> > Force rehash</label>
2019-02-19 18:00:15 +00:00
</ fieldset >
< button type = " submit " dojoType = " dijit.form.Button " class = " alt-primary " > Continue </ button >
2019-02-19 16:46:09 +00:00
</ form >
< hr >
< pre >< ? php
if ( $do_update ) {
RSSUtils :: update_rss_feed ( $feed_id , true );
}
2013-04-01 07:14:27 +00:00
2019-02-19 16:46:09 +00:00
?> </pre>
</ div >
</ div >
2015-06-12 10:06:36 +00:00
</ body >
</ html >
< ? php
}
2017-05-04 11:26:44 +00:00
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
static function catchup_feed ( $feed , $cat_view , $owner_uid = false , $mode = 'all' , $search = false ) {
if ( ! $owner_uid ) $owner_uid = $_SESSION [ 'uid' ];
2017-12-01 16:42:02 +00:00
$pdo = Db :: pdo ();
2019-05-07 03:57:28 +00:00
if ( is_array ( $search ) && $search [ 0 ]) {
$search_qpart = " " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2021-02-08 19:46:01 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_SEARCH ,
function ( $result ) use ( & $search_qpart , & $search_words ) {
if ( ! empty ( $result )) {
list ( $search_qpart , $search_words ) = $result ;
return true ;
}
},
$search [ 0 ]);
2019-05-07 03:57:28 +00:00
// fall back in case of no plugins
2021-02-08 19:46:01 +00:00
if ( empty ( $search_qpart )) {
2020-09-25 07:03:42 +00:00
list ( $search_qpart , $search_words ) = self :: search_to_sql ( $search [ 0 ], $search [ 1 ], $owner_uid );
2019-05-07 03:57:28 +00:00
}
} else {
$search_qpart = " true " ;
}
// TODO: all this interval stuff needs some generic generator function
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
switch ( $mode ) {
case " 1day " :
if ( DB_TYPE == " pgsql " ) {
$date_qpart = " date_entered < NOW() - INTERVAL '1 day' " ;
} else {
$date_qpart = " date_entered < DATE_SUB(NOW(), INTERVAL 1 DAY) " ;
}
break ;
case " 1week " :
if ( DB_TYPE == " pgsql " ) {
$date_qpart = " date_entered < NOW() - INTERVAL '1 week' " ;
} else {
$date_qpart = " date_entered < DATE_SUB(NOW(), INTERVAL 1 WEEK) " ;
}
break ;
case " 2week " :
if ( DB_TYPE == " pgsql " ) {
$date_qpart = " date_entered < NOW() - INTERVAL '2 week' " ;
} else {
$date_qpart = " date_entered < DATE_SUB(NOW(), INTERVAL 2 WEEK) " ;
}
break ;
default :
$date_qpart = " true " ;
}
if ( is_numeric ( $feed )) {
if ( $cat_view ) {
if ( $feed >= 0 ) {
if ( $feed > 0 ) {
2020-09-22 11:54:15 +00:00
$children = self :: getChildCategories ( $feed , $owner_uid );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
array_push ( $children , $feed );
2017-12-17 13:24:13 +00:00
$children = array_map ( " intval " , $children );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
$children = join ( " , " , $children );
$cat_qpart = " cat_id IN ( $children ) " ;
} else {
$cat_qpart = " cat_id IS NULL " ;
}
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT DISTINCT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
2017-12-01 16:42:02 +00:00
AND owner_uid = ? AND unread = true AND feed_id IN
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
( SELECT id FROM ttrss_feeds WHERE $cat_qpart ) AND $date_qpart AND $search_qpart ) as tmp ) " );
2017-12-01 16:42:02 +00:00
$sth -> execute ([ $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else if ( $feed == - 2 ) {
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ( SELECT COUNT ( * )
FROM ttrss_user_labels2 , ttrss_entries WHERE article_id = ref_id AND id = ref_id AND $date_qpart AND $search_qpart ) > 0
2017-12-01 16:42:02 +00:00
AND unread = true AND owner_uid = ? " );
$sth -> execute ([ $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
} else if ( $feed > 0 ) {
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT DISTINCT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
2017-12-01 16:42:02 +00:00
AND owner_uid = ? AND unread = true AND feed_id = ? AND $date_qpart AND $search_qpart ) as tmp ) " );
$sth -> execute ([ $owner_uid , $feed ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else if ( $feed < 0 && $feed > LABEL_BASE_INDEX ) { // special, like starred
if ( $feed == - 1 ) {
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT DISTINCT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
2017-12-01 16:42:02 +00:00
AND owner_uid = ? AND unread = true AND marked = true AND $date_qpart AND $search_qpart ) as tmp ) " );
$sth -> execute ([ $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
if ( $feed == - 2 ) {
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT DISTINCT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
2017-12-01 16:42:02 +00:00
AND owner_uid = ? AND unread = true AND published = true AND $date_qpart AND $search_qpart ) as tmp ) " );
$sth -> execute ([ $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
if ( $feed == - 3 ) {
2017-12-01 16:42:02 +00:00
$intl = ( int ) get_pref ( " FRESH_ARTICLE_MAX_AGE " );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( DB_TYPE == " pgsql " ) {
$match_part = " date_entered > NOW() - INTERVAL ' $intl hour' " ;
} else {
$match_part = " date_entered > DATE_SUB(NOW(),
INTERVAL $intl HOUR ) " ;
}
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT DISTINCT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
2017-12-01 16:42:02 +00:00
AND owner_uid = ? AND score >= 0 AND unread = true AND $date_qpart AND $match_part AND $search_qpart ) as tmp ) " );
$sth -> execute ([ $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
if ( $feed == - 4 ) {
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT DISTINCT id FROM ttrss_entries , ttrss_user_entries WHERE ref_id = id
2017-12-01 16:42:02 +00:00
AND owner_uid = ? AND unread = true AND $date_qpart AND $search_qpart ) as tmp ) " );
$sth -> execute ([ $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
} else if ( $feed < LABEL_BASE_INDEX ) { // label
2017-05-04 12:57:40 +00:00
$label_id = Labels :: feed_to_label_id ( $feed );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT DISTINCT ttrss_entries . id FROM ttrss_entries , ttrss_user_entries , ttrss_user_labels2 WHERE ref_id = id
2017-12-01 16:42:02 +00:00
AND label_id = ? AND ref_id = article_id
AND owner_uid = ? AND unread = true AND $date_qpart AND $search_qpart ) as tmp ) " );
$sth -> execute ([ $label_id , $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
} else { // tag
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
SET unread = false , last_read = NOW () WHERE ref_id IN
( SELECT id FROM
( SELECT DISTINCT ttrss_entries . id FROM ttrss_entries , ttrss_user_entries , ttrss_tags WHERE ref_id = ttrss_entries . id
2017-12-01 16:42:02 +00:00
AND post_int_id = int_id AND tag_name = ?
AND ttrss_user_entries . owner_uid = ? AND unread = true AND $date_qpart AND $search_qpart ) as tmp ) " );
$sth -> execute ([ $feed , $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
}
static function getFeedArticles ( $feed , $is_cat = false , $unread_only = false ,
$owner_uid = false ) {
$n_feed = ( int ) $feed ;
$need_entries = false ;
2017-12-01 17:15:25 +00:00
$pdo = Db :: pdo ();
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
if ( $unread_only ) {
$unread_qpart = " unread = true " ;
} else {
$unread_qpart = " true " ;
}
2017-12-01 17:15:25 +00:00
$match_part = " " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( $is_cat ) {
2020-09-22 11:54:15 +00:00
return self :: getCategoryUnread ( $n_feed , $owner_uid );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else if ( $n_feed == - 6 ) {
return 0 ;
} else if ( $feed != " 0 " && $n_feed == 0 ) {
2017-12-01 17:15:25 +00:00
$sth = $pdo -> prepare ( " SELECT SUM((SELECT COUNT(int_id)
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
FROM ttrss_user_entries , ttrss_entries WHERE int_id = post_int_id
AND ref_id = id AND $unread_qpart )) AS count FROM ttrss_tags
2017-12-01 17:15:25 +00:00
WHERE owner_uid = ? AND tag_name = ? " );
$sth -> execute ([ $owner_uid , $feed ]);
$row = $sth -> fetch ();
return $row [ " count " ];
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else if ( $n_feed == - 1 ) {
$match_part = " marked = true " ;
} else if ( $n_feed == - 2 ) {
$match_part = " published = true " ;
} else if ( $n_feed == - 3 ) {
$match_part = " unread = true AND score >= 0 " ;
2017-12-01 17:15:25 +00:00
$intl = ( int ) get_pref ( " FRESH_ARTICLE_MAX_AGE " , $owner_uid );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( DB_TYPE == " pgsql " ) {
$match_part .= " AND date_entered > NOW() - INTERVAL ' $intl hour' " ;
} else {
$match_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) " ;
}
$need_entries = true ;
} else if ( $n_feed == - 4 ) {
$match_part = " true " ;
} else if ( $n_feed >= 0 ) {
if ( $n_feed != 0 ) {
2021-02-06 14:19:07 +00:00
$match_part = sprintf ( " feed_id = %d " , $n_feed );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else {
$match_part = " feed_id IS NULL " ;
}
} else if ( $feed < LABEL_BASE_INDEX ) {
2017-05-04 12:57:40 +00:00
$label_id = Labels :: feed_to_label_id ( $feed );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2020-09-22 11:54:15 +00:00
return self :: getLabelUnread ( $label_id , $owner_uid );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
if ( $match_part ) {
if ( $need_entries ) {
$from_qpart = " ttrss_user_entries,ttrss_entries " ;
$from_where = " ttrss_entries.id = ttrss_user_entries.ref_id AND " ;
} else {
$from_qpart = " ttrss_user_entries " ;
$from_where = " " ;
}
2017-12-01 17:15:25 +00:00
$sth = $pdo -> prepare ( " SELECT count(int_id) AS unread
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
FROM $from_qpart WHERE
2017-12-01 17:15:25 +00:00
$unread_qpart AND $from_where ( $match_part ) AND ttrss_user_entries . owner_uid = ? " );
$sth -> execute ([ $owner_uid ]);
$row = $sth -> fetch ();
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 17:15:25 +00:00
return $row [ " unread " ];
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else {
2017-12-01 17:15:25 +00:00
$sth = $pdo -> prepare ( " SELECT COUNT(post_int_id) AS unread
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
FROM ttrss_tags , ttrss_user_entries , ttrss_entries
2017-12-01 17:15:25 +00:00
WHERE tag_name = ? AND post_int_id = int_id AND ref_id = ttrss_entries . id
AND $unread_qpart AND ttrss_tags . owner_uid = , " );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 17:15:25 +00:00
$sth -> execute ([ $feed , $owner_uid ]);
$row = $sth -> fetch ();
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 17:15:25 +00:00
return $row [ " unread " ];
}
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
/**
* @ return array ( code => Status code , message => error message if available )
*
* 0 - OK , Feed already exists
* 1 - OK , Feed added
* 2 - Invalid URL
* 3 - URL content is HTML , no feeds available
* 4 - URL content is HTML which contains multiple feeds .
* Here you should call extractfeedurls in rpc - backend
* to get all possible feeds .
* 5 - Couldn ' t download the URL content .
* 6 - Content is an invalid XML .
*/
static function subscribe_to_feed ( $url , $cat_id = 0 ,
$auth_login = '' , $auth_pass = '' ) {
global $fetch_last_error ;
global $fetch_last_error_content ;
2019-05-16 07:07:22 +00:00
global $fetch_last_content_type ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 17:15:25 +00:00
$pdo = Db :: pdo ();
2020-09-22 06:04:33 +00:00
$url = UrlHelper :: validate ( $url );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2020-09-14 16:46:52 +00:00
if ( ! $url ) return array ( " code " => 2 );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2020-09-22 06:04:33 +00:00
$contents = @ UrlHelper :: fetch ( $url , false , $auth_login , $auth_pass );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2021-02-08 19:46:01 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_SUBSCRIBE_FEED ,
function ( $result ) use ( & $contents ) {
$contents = $result ;
},
$contents , $url , $auth_login , $auth_pass );
2018-11-03 12:08:43 +00:00
2021-02-08 19:46:01 +00:00
if ( empty ( $contents )) {
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( preg_match ( " /cloudflare \ .com/ " , $fetch_last_error_content )) {
$fetch_last_error .= " (feed behind Cloudflare) " ;
}
return array ( " code " => 5 , " message " => $fetch_last_error );
}
2020-09-22 11:54:15 +00:00
if ( mb_strpos ( $fetch_last_content_type , " html " ) !== false && self :: is_html ( $contents )) {
$feedUrls = self :: get_feeds_from_html ( $url , $contents );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( count ( $feedUrls ) == 0 ) {
return array ( " code " => 3 );
} else if ( count ( $feedUrls ) > 1 ) {
return array ( " code " => 4 , " feeds " => $feedUrls );
}
//use feed url as new URL
$url = key ( $feedUrls );
}
2017-12-03 20:08:04 +00:00
if ( ! $cat_id ) $cat_id = null ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 17:15:25 +00:00
$sth = $pdo -> prepare ( " SELECT id FROM ttrss_feeds
WHERE feed_url = ? AND owner_uid = ? " );
$sth -> execute ([ $url , $_SESSION [ 'uid' ]]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 17:15:25 +00:00
if ( $row = $sth -> fetch ()) {
return array ( " code " => 0 , " feed_id " => ( int ) $row [ " id " ]);
} else {
$sth = $pdo -> prepare (
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
" INSERT INTO ttrss_feeds
( owner_uid , feed_url , title , cat_id , auth_login , auth_pass , update_method , auth_pass_encrypted )
2017-12-01 17:15:25 +00:00
VALUES ( ? , ? , ? , ? , ? , ? , 0 , false ) " );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2018-01-05 03:50:37 +00:00
$sth -> execute ([ $_SESSION [ 'uid' ], $url , " [Unknown] " , $cat_id , ( string ) $auth_login , ( string ) $auth_pass ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 17:15:25 +00:00
$sth = $pdo -> prepare ( " SELECT id FROM ttrss_feeds WHERE feed_url = ?
AND owner_uid = ? " );
$sth -> execute ([ $url , $_SESSION [ 'uid' ]]);
$row = $sth -> fetch ();
$feed_id = $row [ " id " ];
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( $feed_id ) {
2017-05-05 15:10:07 +00:00
RSSUtils :: set_basic_feed_info ( $feed_id );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
return array ( " code " => 1 , " feed_id " => ( int ) $feed_id );
2017-12-01 17:15:25 +00:00
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
}
2017-12-03 19:35:12 +00:00
static function getIconFile ( $feed_id ) {
return ICONS_DIR . " / $feed_id .ico " ;
}
2017-12-03 19:49:57 +00:00
static function feedHasIcon ( $id ) {
return is_file ( ICONS_DIR . " / $id .ico " ) && filesize ( ICONS_DIR . " / $id .ico " ) > 0 ;
}
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
static function getFeedIcon ( $id ) {
switch ( $id ) {
case 0 :
2018-12-05 17:26:27 +00:00
return " archive " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
break ;
case - 1 :
2018-12-05 17:26:27 +00:00
return " star " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
break ;
case - 2 :
2018-12-05 17:26:27 +00:00
return " rss_feed " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
break ;
case - 3 :
2018-12-06 10:18:14 +00:00
return " whatshot " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
break ;
case - 4 :
2018-12-05 17:26:27 +00:00
return " inbox " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
break ;
case - 6 :
2018-12-05 19:48:14 +00:00
return " restore " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
break ;
default :
if ( $id < LABEL_BASE_INDEX ) {
2018-12-06 12:22:52 +00:00
return " label " ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else {
2017-12-03 19:35:12 +00:00
$icon = self :: getIconFile ( $id );
if ( $icon && file_exists ( $icon )) {
return ICONS_URL . " / " . basename ( $icon ) . " ? " . filemtime ( $icon );
}
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
break ;
}
return false ;
}
static function getFeedTitle ( $id , $cat = false ) {
2017-12-01 16:42:02 +00:00
$pdo = Db :: pdo ();
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( $cat ) {
2020-09-22 11:54:15 +00:00
return self :: getCategoryTitle ( $id );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else if ( $id == - 1 ) {
return __ ( " Starred articles " );
} else if ( $id == - 2 ) {
return __ ( " Published articles " );
} else if ( $id == - 3 ) {
return __ ( " Fresh articles " );
} else if ( $id == - 4 ) {
return __ ( " All articles " );
} else if ( $id === 0 || $id === " 0 " ) {
return __ ( " Archived articles " );
} else if ( $id == - 6 ) {
return __ ( " Recently read " );
} else if ( $id < LABEL_BASE_INDEX ) {
2017-12-01 16:42:02 +00:00
2017-05-04 12:57:40 +00:00
$label_id = Labels :: feed_to_label_id ( $id );
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " SELECT caption FROM ttrss_labels2 WHERE id = ? " );
$sth -> execute ([ $label_id ]);
if ( $row = $sth -> fetch ()) {
return $row [ " caption " ];
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else {
return " Unknown label ( $label_id ) " ;
}
} else if ( is_numeric ( $id ) && $id > 0 ) {
2017-12-01 16:42:02 +00:00
$sth = $pdo -> prepare ( " SELECT title FROM ttrss_feeds WHERE id = ? " );
$sth -> execute ([ $id ]);
if ( $row = $sth -> fetch ()) {
return $row [ " title " ];
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else {
return " Unknown feed ( $id ) " ;
}
2017-12-01 16:42:02 +00:00
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else {
return $id ;
}
}
2020-02-20 12:54:40 +00:00
// only real cats
static function getCategoryMarked ( $cat , $owner_uid = false ) {
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
$pdo = Db :: pdo ();
if ( $cat >= 0 ) {
$sth = $pdo -> prepare ( " SELECT SUM(CASE WHEN marked THEN 1 ELSE 0 END) AS marked
FROM ttrss_user_entries
WHERE feed_id IN ( SELECT id FROM ttrss_feeds
WHERE ( cat_id = : cat OR ( : cat IS NULL AND cat_id IS NULL ))
AND owner_uid = : uid )
AND owner_uid = : uid " );
$sth -> execute ([ " cat " => $cat ? $cat : null , " uid " => $owner_uid ]);
$row = $sth -> fetch ();
return $row [ " marked " ];
} else {
return 0 ;
}
}
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
static function getCategoryUnread ( $cat , $owner_uid = false ) {
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2017-12-01 17:15:25 +00:00
$pdo = Db :: pdo ();
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
if ( $cat >= 0 ) {
2020-01-25 06:57:28 +00:00
$sth = $pdo -> prepare ( " SELECT SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS unread
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
FROM ttrss_user_entries
2020-01-25 06:57:28 +00:00
WHERE feed_id IN ( SELECT id FROM ttrss_feeds
WHERE ( cat_id = : cat OR ( : cat IS NULL AND cat_id IS NULL ))
AND owner_uid = : uid )
AND owner_uid = : uid " );
$sth -> execute ([ " cat " => $cat ? $cat : null , " uid " => $owner_uid ]);
$row = $sth -> fetch ();
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2020-01-25 06:57:28 +00:00
return $row [ " unread " ];
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else if ( $cat == - 1 ) {
2020-01-24 12:54:01 +00:00
return 0 ;
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
} else if ( $cat == - 2 ) {
2020-06-05 04:44:57 +00:00
$sth = $pdo -> prepare ( " SELECT COUNT(DISTINCT article_id) AS unread
2020-01-25 09:53:10 +00:00
FROM ttrss_user_entries ue , ttrss_user_labels2 l
WHERE article_id = ref_id AND unread IS true AND ue . owner_uid = : uid " );
2020-01-25 06:57:28 +00:00
$sth -> execute ([ " uid " => $owner_uid ]);
2017-12-01 17:15:25 +00:00
$row = $sth -> fetch ();
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
2017-12-01 17:15:25 +00:00
return $row [ " unread " ];
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
}
// only accepts real cats (>= 0)
static function getCategoryChildrenUnread ( $cat , $owner_uid = false ) {
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2017-12-01 17:15:25 +00:00
$pdo = Db :: pdo ();
$sth = $pdo -> prepare ( " SELECT id FROM ttrss_feed_categories WHERE parent_cat = ?
AND owner_uid = ? " );
$sth -> execute ([ $cat , $owner_uid ]);
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
$unread = 0 ;
2017-12-01 17:15:25 +00:00
while ( $line = $sth -> fetch ()) {
2020-09-22 11:54:15 +00:00
$unread += self :: getCategoryUnread ( $line [ " id " ], $owner_uid );
$unread += self :: getCategoryChildrenUnread ( $line [ " id " ], $owner_uid );
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00
}
return $unread ;
}
2017-05-04 11:26:44 +00:00
2017-05-04 12:00:21 +00:00
static function getGlobalUnread ( $user_id = false ) {
2017-12-01 17:15:25 +00:00
if ( ! $user_id ) $user_id = $_SESSION [ " uid " ];
2017-05-04 12:00:21 +00:00
2017-12-01 17:15:25 +00:00
$pdo = Db :: pdo ();
2017-05-04 12:00:21 +00:00
2020-06-05 04:44:57 +00:00
$sth = $pdo -> prepare ( " SELECT SUM(CASE WHEN unread THEN 1 ELSE 0 END) AS count
FROM ttrss_user_entries ue
2020-01-24 11:25:31 +00:00
WHERE ue . owner_uid = ? " );
2017-12-01 17:15:25 +00:00
$sth -> execute ([ $user_id ]);
$row = $sth -> fetch ();
2017-05-04 12:00:21 +00:00
2020-01-24 11:25:31 +00:00
return $row [ " count " ];
2017-05-04 12:00:21 +00:00
}
static function getCategoryTitle ( $cat_id ) {
if ( $cat_id == - 1 ) {
return __ ( " Special " );
} else if ( $cat_id == - 2 ) {
return __ ( " Labels " );
} else {
2017-12-01 17:15:25 +00:00
$pdo = Db :: pdo ();
$sth = $pdo -> prepare ( " SELECT title FROM ttrss_feed_categories WHERE
id = ? " );
$sth -> execute ([ $cat_id ]);
2017-05-04 12:00:21 +00:00
2017-12-01 17:15:25 +00:00
if ( $row = $sth -> fetch ()) {
return $row [ " title " ];
2017-05-04 12:00:21 +00:00
} else {
return __ ( " Uncategorized " );
}
}
}
static function getLabelUnread ( $label_id , $owner_uid = false ) {
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
2017-12-01 17:15:25 +00:00
$pdo = Db :: pdo ();
$sth = $pdo -> prepare ( " SELECT COUNT(ref_id) AS unread FROM ttrss_user_entries, ttrss_user_labels2
WHERE owner_uid = ? AND unread = true AND label_id = ? AND article_id = ref_id " );
$sth -> execute ([ $owner_uid , $label_id ]);
2017-05-04 12:00:21 +00:00
2017-12-01 17:15:25 +00:00
if ( $row = $sth -> fetch ()) {
return $row [ " unread " ];
2017-05-04 12:00:21 +00:00
} else {
return 0 ;
}
}
2017-05-04 12:13:02 +00:00
static function queryFeedHeadlines ( $params ) {
2017-12-01 17:15:25 +00:00
$pdo = Db :: pdo ();
// WARNING: due to highly dynamic nature of this query its going to quote parameters
2020-12-03 11:42:01 +00:00
// right before adding them to SQL part
2017-12-01 17:15:25 +00:00
2017-05-04 12:13:02 +00:00
$feed = $params [ " feed " ];
$limit = isset ( $params [ " limit " ]) ? $params [ " limit " ] : 30 ;
$view_mode = $params [ " view_mode " ];
$cat_view = isset ( $params [ " cat_view " ]) ? $params [ " cat_view " ] : false ;
$search = isset ( $params [ " search " ]) ? $params [ " search " ] : false ;
$search_language = isset ( $params [ " search_language " ]) ? $params [ " search_language " ] : " " ;
$override_order = isset ( $params [ " override_order " ]) ? $params [ " override_order " ] : false ;
$offset = isset ( $params [ " offset " ]) ? $params [ " offset " ] : 0 ;
$owner_uid = isset ( $params [ " owner_uid " ]) ? $params [ " owner_uid " ] : $_SESSION [ " uid " ];
$since_id = isset ( $params [ " since_id " ]) ? $params [ " since_id " ] : 0 ;
$include_children = isset ( $params [ " include_children " ]) ? $params [ " include_children " ] : false ;
$ignore_vfeed_group = isset ( $params [ " ignore_vfeed_group " ]) ? $params [ " ignore_vfeed_group " ] : false ;
$override_strategy = isset ( $params [ " override_strategy " ]) ? $params [ " override_strategy " ] : false ;
$override_vfeed = isset ( $params [ " override_vfeed " ]) ? $params [ " override_vfeed " ] : false ;
$start_ts = isset ( $params [ " start_ts " ]) ? $params [ " start_ts " ] : false ;
$check_first_id = isset ( $params [ " check_first_id " ]) ? $params [ " check_first_id " ] : false ;
$skip_first_id_check = isset ( $params [ " skip_first_id_check " ]) ? $params [ " skip_first_id_check " ] : false ;
2019-08-30 07:16:38 +00:00
//$order_by = isset($params["order_by"]) ? $params["order_by"] : false;
2017-05-04 12:13:02 +00:00
$ext_tables_part = " " ;
2017-12-01 17:15:25 +00:00
$limit_query_part = " " ;
2019-04-30 11:39:08 +00:00
$query_error_override = " " ;
2017-05-04 12:13:02 +00:00
2019-04-30 11:39:08 +00:00
$search_words = [];
2017-05-04 12:13:02 +00:00
if ( $search ) {
2019-04-30 11:39:08 +00:00
$search_query_part = " " ;
2021-02-08 19:46:01 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_SEARCH ,
function ( $result ) use ( & $search_query_part , & $search_words ) {
if ( ! empty ( $result )) {
list ( $search_query_part , $search_words ) = $result ;
return true ;
}
},
$search );
2017-05-04 12:13:02 +00:00
// fall back in case of no plugins
if ( ! $search_query_part ) {
2020-09-25 07:03:42 +00:00
list ( $search_query_part , $search_words ) = self :: search_to_sql ( $search , $search_language , $owner_uid );
2017-05-04 12:13:02 +00:00
}
2019-04-29 18:15:49 +00:00
if ( DB_TYPE == " pgsql " ) {
2020-06-05 04:44:57 +00:00
$test_sth = $pdo -> prepare ( " select $search_query_part
2019-05-20 04:12:43 +00:00
FROM ttrss_entries , ttrss_user_entries WHERE id = ref_id limit 1 " );
2019-04-29 18:15:49 +00:00
try {
$test_sth -> execute ();
} catch ( PDOException $e ) {
// looks like tsquery syntax is invalid
$search_query_part = " false " ;
2019-04-30 11:39:08 +00:00
$query_error_override = T_sprintf ( " Incorrect search syntax: %s. " , implode ( " " , $search_words ));
2019-04-29 18:15:49 +00:00
}
}
2017-05-04 12:13:02 +00:00
$search_query_part .= " AND " ;
} else {
$search_query_part = " " ;
}
if ( $since_id ) {
2017-12-01 17:52:30 +00:00
$since_id_part = " ttrss_entries.id > " . $pdo -> quote ( $since_id ) . " AND " ;
2017-05-04 12:13:02 +00:00
} else {
$since_id_part = " " ;
}
$view_query_part = " " ;
if ( $view_mode == " adaptive " ) {
if ( $search ) {
$view_query_part = " " ;
} else if ( $feed != - 1 ) {
$unread = getFeedUnread ( $feed , $cat_view );
if ( $cat_view && $feed > 0 && $include_children )
2020-09-22 11:54:15 +00:00
$unread += self :: getCategoryChildrenUnread ( $feed );
2017-05-04 12:13:02 +00:00
if ( $unread > 0 ) {
$view_query_part = " unread = true AND " ;
}
}
}
if ( $view_mode == " marked " ) {
$view_query_part = " marked = true AND " ;
}
if ( $view_mode == " has_note " ) {
$view_query_part = " (note IS NOT NULL AND note != '') AND " ;
}
if ( $view_mode == " published " ) {
$view_query_part = " published = true AND " ;
}
if ( $view_mode == " unread " && $feed != - 6 ) {
$view_query_part = " unread = true AND " ;
}
if ( $limit > 0 ) {
2017-12-01 18:07:55 +00:00
$limit_query_part = " LIMIT " . ( int ) $limit ;
2017-05-04 12:13:02 +00:00
}
$allow_archived = false ;
$vfeed_query_part = " " ;
/* tags */
if ( ! is_numeric ( $feed )) {
$query_strategy_part = " true " ;
$vfeed_query_part = " (SELECT title FROM ttrss_feeds WHERE
id = feed_id ) as feed_title , " ;
} else if ( $feed > 0 ) {
if ( $cat_view ) {
if ( $feed > 0 ) {
if ( $include_children ) {
# sub-cats
2020-09-22 11:54:15 +00:00
$subcats = self :: getChildCategories ( $feed , $owner_uid );
2017-05-04 12:13:02 +00:00
array_push ( $subcats , $feed );
2017-12-17 13:24:13 +00:00
$subcats = array_map ( " intval " , $subcats );
2017-05-04 12:13:02 +00:00
$query_strategy_part = " cat_id IN ( " .
implode ( " , " , $subcats ) . " ) " ;
} else {
2021-02-08 20:10:22 +00:00
$query_strategy_part = " cat_id = " . $pdo -> quote (( string ) $feed );
2017-05-04 12:13:02 +00:00
}
} else {
$query_strategy_part = " cat_id IS NULL " ;
}
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
} else {
2021-02-08 20:10:22 +00:00
$query_strategy_part = " feed_id = " . $pdo -> quote (( string ) $feed );
2017-05-04 12:13:02 +00:00
}
} else if ( $feed == 0 && ! $cat_view ) { // archive virtual feed
$query_strategy_part = " feed_id IS NULL " ;
$allow_archived = true ;
} else if ( $feed == 0 && $cat_view ) { // uncategorized
$query_strategy_part = " cat_id IS NULL AND feed_id IS NOT NULL " ;
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
} else if ( $feed == - 1 ) { // starred virtual feed
$query_strategy_part = " marked = true " ;
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
$allow_archived = true ;
if ( ! $override_order ) {
$override_order = " last_marked DESC, date_entered DESC, updated DESC " ;
}
} else if ( $feed == - 2 ) { // published virtual feed OR labels category
if ( ! $cat_view ) {
$query_strategy_part = " published = true " ;
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
$allow_archived = true ;
if ( ! $override_order ) {
$override_order = " last_published DESC, date_entered DESC, updated DESC " ;
}
} else {
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
$ext_tables_part = " ttrss_labels2,ttrss_user_labels2, " ;
$query_strategy_part = " ttrss_labels2.id = ttrss_user_labels2.label_id AND
ttrss_user_labels2 . article_id = ref_id " ;
}
} else if ( $feed == - 6 ) { // recently read
$query_strategy_part = " unread = false AND last_read IS NOT NULL " ;
if ( DB_TYPE == " pgsql " ) {
$query_strategy_part .= " AND last_read > NOW() - INTERVAL '1 DAY' " ;
} else {
$query_strategy_part .= " AND last_read > DATE_SUB(NOW(), INTERVAL 1 DAY) " ;
}
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
$allow_archived = true ;
$ignore_vfeed_group = true ;
if ( ! $override_order ) $override_order = " last_read DESC " ;
} else if ( $feed == - 3 ) { // fresh virtual feed
$query_strategy_part = " unread = true AND score >= 0 " ;
2017-12-01 17:52:30 +00:00
$intl = ( int ) get_pref ( " FRESH_ARTICLE_MAX_AGE " , $owner_uid );
2017-05-04 12:13:02 +00:00
if ( DB_TYPE == " pgsql " ) {
$query_strategy_part .= " AND date_entered > NOW() - INTERVAL ' $intl hour' " ;
} else {
$query_strategy_part .= " AND date_entered > DATE_SUB(NOW(), INTERVAL $intl HOUR) " ;
}
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
} else if ( $feed == - 4 ) { // all articles virtual feed
$allow_archived = true ;
$query_strategy_part = " true " ;
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
} else if ( $feed <= LABEL_BASE_INDEX ) { // labels
2017-05-04 12:57:40 +00:00
$label_id = Labels :: feed_to_label_id ( $feed );
2017-05-04 12:13:02 +00:00
2017-12-01 17:52:30 +00:00
$query_strategy_part = " label_id = " . $pdo -> quote ( $label_id ) . " AND
2017-05-04 12:13:02 +00:00
ttrss_labels2 . id = ttrss_user_labels2 . label_id AND
ttrss_user_labels2 . article_id = ref_id " ;
$vfeed_query_part = " ttrss_feeds.title AS feed_title, " ;
$ext_tables_part = " ttrss_labels2,ttrss_user_labels2, " ;
$allow_archived = true ;
} else {
$query_strategy_part = " true " ;
}
$order_by = " score DESC, date_entered DESC, updated DESC " ;
if ( $override_order ) {
$order_by = $override_order ;
}
if ( $override_strategy ) {
$query_strategy_part = $override_strategy ;
}
if ( $override_vfeed ) {
$vfeed_query_part = $override_vfeed ;
}
2020-12-04 05:59:37 +00:00
$feed_title = " " ;
$feed_site_url = " " ;
$last_error = " " ;
$last_updated = " " ;
2017-05-04 12:13:02 +00:00
if ( $search ) {
$feed_title = T_sprintf ( " Search results: %s " , $search );
} else {
if ( $cat_view ) {
2020-09-22 11:54:15 +00:00
$feed_title = self :: getCategoryTitle ( $feed );
2017-05-04 12:13:02 +00:00
} else {
if ( is_numeric ( $feed ) && $feed > 0 ) {
2017-12-01 17:15:25 +00:00
$ssth = $pdo -> prepare ( " SELECT title,site_url,last_error,last_updated
FROM ttrss_feeds WHERE id = ? AND owner_uid = ? " );
$ssth -> execute ([ $feed , $owner_uid ]);
$row = $ssth -> fetch ();
$feed_title = $row [ " title " ];
$feed_site_url = $row [ " site_url " ];
$last_error = $row [ " last_error " ];
$last_updated = $row [ " last_updated " ];
2017-05-04 12:13:02 +00:00
} else {
2020-09-22 11:54:15 +00:00
$feed_title = self :: getFeedTitle ( $feed );
2017-05-04 12:13:02 +00:00
}
}
}
$content_query_part = " content, " ;
if ( $limit_query_part ) {
2017-12-01 18:07:55 +00:00
$offset_query_part = " OFFSET " . ( int ) $offset ;
2017-05-04 12:13:02 +00:00
} else {
$offset_query_part = " " ;
}
2019-06-18 10:10:32 +00:00
if ( $start_ts ) {
$start_ts_formatted = date ( " Y/m/d H:i:s " , strtotime ( $start_ts ));
$start_ts_query_part = " date_entered >= ' $start_ts_formatted ' AND " ;
} else {
$start_ts_query_part = " " ;
}
2020-12-04 05:59:37 +00:00
$first_id = 0 ;
2017-05-04 12:13:02 +00:00
if ( is_numeric ( $feed )) {
// proper override_order applied above
if ( $vfeed_query_part && ! $ignore_vfeed_group && get_pref ( 'VFEED_GROUP_BY_FEED' , $owner_uid )) {
2019-08-30 07:16:38 +00:00
2020-09-22 11:54:15 +00:00
if ( ! ( in_array ( $feed , self :: NEVER_GROUP_BY_DATE ) && ! $cat_view )) {
2019-08-30 07:16:38 +00:00
$yyiw_desc = $order_by == " date_reverse " ? " " : " desc " ;
$yyiw_order_qpart = " yyiw $yyiw_desc , " ;
} else {
$yyiw_order_qpart = " " ;
}
2018-12-09 10:35:37 +00:00
2017-05-04 12:13:02 +00:00
if ( ! $override_order ) {
2019-08-30 07:16:38 +00:00
$order_by = " $yyiw_order_qpart ttrss_feeds.title, $order_by " ;
2017-05-04 12:13:02 +00:00
} else {
2019-08-30 07:16:38 +00:00
$order_by = " $yyiw_order_qpart ttrss_feeds.title, $override_order " ;
2017-05-04 12:13:02 +00:00
}
}
if ( ! $allow_archived ) {
$from_qpart = " ${ ext_tables_part } ttrss_entries LEFT JOIN ttrss_user_entries ON (ref_id = ttrss_entries.id),ttrss_feeds " ;
$feed_check_qpart = " ttrss_user_entries.feed_id = ttrss_feeds.id AND " ;
} else {
$from_qpart = " ${ ext_tables_part } ttrss_entries LEFT JOIN ttrss_user_entries ON (ref_id = ttrss_entries.id)
LEFT JOIN ttrss_feeds ON ( feed_id = ttrss_feeds . id ) " ;
2020-12-04 05:59:37 +00:00
$feed_check_qpart = " " ;
2017-05-04 12:13:02 +00:00
}
if ( $vfeed_query_part ) $vfeed_query_part .= " favicon_avg_color, " ;
$first_id_query_strategy_part = $query_strategy_part ;
if ( $feed == - 3 )
$first_id_query_strategy_part = " true " ;
if ( DB_TYPE == " pgsql " ) {
$sanity_interval_qpart = " date_entered >= NOW() - INTERVAL '1 hour' AND " ;
2018-12-09 17:28:15 +00:00
$yyiw_qpart = " to_char(date_entered, 'IYYY-IW') AS yyiw " ;
2020-12-07 13:59:48 +00:00
$distinct_columns = str_replace ( " desc " , " " , strtolower ( $order_by ));
$distinct_qpart = " DISTINCT ON (id, $distinct_columns ) " ;
2017-05-04 12:13:02 +00:00
} else {
$sanity_interval_qpart = " date_entered >= DATE_SUB(NOW(), INTERVAL 1 hour) AND " ;
2018-12-09 17:38:02 +00:00
$yyiw_qpart = " date_format(date_entered, '%Y-%u') AS yyiw " ;
2020-12-07 13:59:48 +00:00
$distinct_qpart = " DISTINCT " ; //fallback
2017-05-04 12:13:02 +00:00
}
if ( ! $search && ! $skip_first_id_check ) {
// if previous topmost article id changed that means our current pagination is no longer valid
2020-12-08 13:59:58 +00:00
$query = " SELECT
2020-12-07 13:59:48 +00:00
ttrss_entries . id ,
2017-05-04 12:13:02 +00:00
date_entered ,
2020-12-07 13:59:48 +00:00
$yyiw_qpart ,
2017-05-04 12:13:02 +00:00
guid ,
ttrss_entries . title ,
2020-12-07 13:59:48 +00:00
ttrss_feeds . title ,
2017-05-04 12:13:02 +00:00
updated ,
score ,
marked ,
published ,
last_marked ,
last_published ,
last_read
FROM
$from_qpart
WHERE
$feed_check_qpart
2017-12-01 17:52:30 +00:00
ttrss_user_entries . owner_uid = " . $pdo->quote ( $owner_uid ). " AND
2017-05-04 12:13:02 +00:00
$search_query_part
$start_ts_query_part
$since_id_part
$sanity_interval_qpart
$first_id_query_strategy_part ORDER BY $order_by LIMIT 1 " ;
2021-02-05 20:41:32 +00:00
if ( ! empty ( $_REQUEST [ " debug " ])) {
2020-12-07 13:59:48 +00:00
print " \n *** FIRST ID QUERY *** \n $query\n " ;
}
2017-05-04 12:13:02 +00:00
2017-12-01 17:25:13 +00:00
$res = $pdo -> query ( $query );
2017-12-01 17:15:25 +00:00
2021-02-08 20:10:22 +00:00
if ( ! empty ( $res ) && $row = $res -> fetch ()) {
2017-12-01 17:25:13 +00:00
$first_id = ( int ) $row [ " id " ];
2017-05-04 12:13:02 +00:00
if ( $offset > 0 && $first_id && $check_first_id && $first_id != $check_first_id ) {
2019-04-30 11:39:08 +00:00
return array ( - 1 , $feed_title , $feed_site_url , $last_error , $last_updated , $search_words , $first_id , $vfeed_query_part != " " , $query_error_override );
2017-05-04 12:13:02 +00:00
}
}
}
2020-12-07 13:59:48 +00:00
$query = " SELECT $distinct_qpart
ttrss_entries . id AS id ,
2017-05-04 12:13:02 +00:00
date_entered ,
2020-12-04 05:44:43 +00:00
$yyiw_qpart ,
2017-05-04 12:13:02 +00:00
guid ,
2020-12-07 13:59:48 +00:00
ttrss_entries . title ,
2017-05-04 12:13:02 +00:00
updated ,
label_cache ,
tag_cache ,
always_display_enclosures ,
site_url ,
note ,
num_comments ,
comments ,
int_id ,
uuid ,
lang ,
hide_images ,
2021-01-17 11:55:11 +00:00
unread , feed_id , marked , published , link , last_read ,
2017-05-04 12:13:02 +00:00
last_marked , last_published ,
$vfeed_query_part
$content_query_part
author , score
FROM
$from_qpart
WHERE
$feed_check_qpart
2017-12-01 17:52:30 +00:00
ttrss_user_entries . owner_uid = " . $pdo->quote ( $owner_uid ). " AND
2017-05-04 12:13:02 +00:00
$search_query_part
$start_ts_query_part
$view_query_part
$since_id_part
$query_strategy_part ORDER BY $order_by
$limit_query_part $offset_query_part " ;
2017-12-17 13:24:13 +00:00
//if ($_REQUEST["debug"]) print $query;
2017-05-04 12:13:02 +00:00
2021-02-05 20:41:32 +00:00
if ( ! empty ( $_REQUEST [ " debug " ])) {
2020-12-07 13:59:48 +00:00
print " \n *** HEADLINES QUERY *** \n $query\n " ;
}
2017-12-01 17:25:13 +00:00
$res = $pdo -> query ( $query );
2017-05-04 12:13:02 +00:00
} else {
// browsing by tag
2020-12-08 13:59:58 +00:00
if ( DB_TYPE == " pgsql " ) {
$distinct_columns = str_replace ( " desc " , " " , strtolower ( $order_by ));
$distinct_qpart = " DISTINCT ON (id, $distinct_columns ) " ;
} else {
$distinct_qpart = " DISTINCT " ; //fallback
}
2020-12-07 13:59:48 +00:00
$query = " SELECT $distinct_qpart
2017-05-04 12:13:02 +00:00
date_entered ,
guid ,
note ,
ttrss_entries . id as id ,
title ,
updated ,
unread ,
feed_id ,
marked ,
2018-12-25 13:12:58 +00:00
published ,
2017-05-04 12:13:02 +00:00
num_comments ,
comments ,
int_id ,
tag_cache ,
label_cache ,
link ,
lang ,
uuid ,
last_read ,
( SELECT hide_images FROM ttrss_feeds WHERE id = feed_id ) AS hide_images ,
last_marked , last_published ,
$since_id_part
$vfeed_query_part
$content_query_part
author , score
FROM ttrss_entries , ttrss_user_entries , ttrss_tags
WHERE
ref_id = ttrss_entries . id AND
2017-12-01 17:52:30 +00:00
ttrss_user_entries . owner_uid = " . $pdo->quote ( $owner_uid ). " AND
2017-05-04 12:13:02 +00:00
post_int_id = int_id AND
2017-12-01 17:52:30 +00:00
tag_name = " . $pdo->quote ( $feed ). " AND
2017-05-04 12:13:02 +00:00
$view_query_part
$search_query_part
2019-06-18 10:10:32 +00:00
$start_ts_query_part
2017-05-04 12:13:02 +00:00
$query_strategy_part ORDER BY $order_by
$limit_query_part $offset_query_part " ;
2020-12-04 15:55:53 +00:00
//if ($_REQUEST["debug"]) print $query;
2017-05-04 12:13:02 +00:00
2021-02-05 20:41:32 +00:00
if ( ! empty ( $_REQUEST [ " debug " ])) {
2020-12-08 13:59:58 +00:00
print " \n *** TAGS QUERY *** \n $query\n " ;
}
2017-12-01 17:25:13 +00:00
$res = $pdo -> query ( $query );
2017-05-04 12:13:02 +00:00
}
2019-04-30 11:39:08 +00:00
return array ( $res , $feed_title , $feed_site_url , $last_error , $last_updated , $search_words , $first_id , $vfeed_query_part != " " , $query_error_override );
2017-05-04 12:13:02 +00:00
}
static function getParentCategories ( $cat , $owner_uid ) {
$rv = array ();
2017-12-01 17:25:13 +00:00
$pdo = Db :: pdo ();
$sth = $pdo -> prepare ( " SELECT parent_cat FROM ttrss_feed_categories
WHERE id = ? AND parent_cat IS NOT NULL AND owner_uid = ? " );
$sth -> execute ([ $cat , $owner_uid ]);
2017-05-04 12:13:02 +00:00
2017-12-01 17:25:13 +00:00
while ( $line = $sth -> fetch ()) {
2017-05-04 12:13:02 +00:00
array_push ( $rv , $line [ " parent_cat " ]);
2020-09-22 11:54:15 +00:00
$rv = array_merge ( $rv , self :: getParentCategories ( $line [ " parent_cat " ], $owner_uid ));
2017-05-04 12:13:02 +00:00
}
return $rv ;
}
static function getChildCategories ( $cat , $owner_uid ) {
$rv = array ();
2017-12-01 17:25:13 +00:00
$pdo = Db :: pdo ();
$sth = $pdo -> prepare ( " SELECT id FROM ttrss_feed_categories
WHERE parent_cat = ? AND owner_uid = ? " );
$sth -> execute ([ $cat , $owner_uid ]);
2017-05-04 12:13:02 +00:00
2017-12-01 17:25:13 +00:00
while ( $line = $sth -> fetch ()) {
2017-05-04 12:13:02 +00:00
array_push ( $rv , $line [ " id " ]);
2020-09-22 11:54:15 +00:00
$rv = array_merge ( $rv , self :: getChildCategories ( $line [ " id " ], $owner_uid ));
2017-05-04 12:13:02 +00:00
}
return $rv ;
}
2017-05-04 12:36:36 +00:00
static function getFeedCategory ( $feed ) {
2017-12-01 17:25:13 +00:00
$pdo = Db :: pdo ();
2017-05-04 12:36:36 +00:00
2017-12-01 17:25:13 +00:00
$sth = $pdo -> prepare ( " SELECT cat_id FROM ttrss_feeds
WHERE id = ? " );
$sth -> execute ([ $feed ]);
if ( $row = $sth -> fetch ()) {
return $row [ " cat_id " ];
2017-05-04 12:36:36 +00:00
} else {
return false ;
}
}
2018-12-12 04:57:37 +00:00
function color_of ( $name ) {
$colormap = [ " #1cd7d7 " , " #d91111 " , " #1212d7 " , " #8e16e5 " , " #7b7b7b " ,
" #39f110 " , " #0bbea6 " , " #ec0e0e " , " #1534f2 " , " #b9e416 " ,
" #479af2 " , " #f36b14 " , " #10c7e9 " , " #1e8fe7 " , " #e22727 " ];
$sum = 0 ;
for ( $i = 0 ; $i < strlen ( $name ); $i ++ ) {
2019-12-06 04:27:22 +00:00
$sum += ord ( $name [ $i ]);
2018-12-12 04:57:37 +00:00
}
$sum %= count ( $colormap );
return $colormap [ $sum ];
}
2017-05-04 12:36:36 +00:00
2019-06-20 04:51:48 +00:00
static function get_feeds_from_html ( $url , $content ) {
2020-09-22 06:04:33 +00:00
$url = UrlHelper :: validate ( $url );
2019-06-20 04:51:48 +00:00
$baseUrl = substr ( $url , 0 , strrpos ( $url , '/' ) + 1 );
$feedUrls = [];
$doc = new DOMDocument ();
2020-10-01 10:20:07 +00:00
if ( @ $doc -> loadHTML ( $content )) {
2019-06-20 04:51:48 +00:00
$xpath = new DOMXPath ( $doc );
$entries = $xpath -> query ( '/html/head/link[@rel="alternate" and ' .
'(contains(@type,"rss") or contains(@type,"atom"))]|/html/head/link[@rel="feed"]' );
foreach ( $entries as $entry ) {
if ( $entry -> hasAttribute ( 'href' )) {
$title = $entry -> getAttribute ( 'title' );
if ( $title == '' ) {
$title = $entry -> getAttribute ( 'type' );
}
$feedUrl = rewrite_relative_url (
$baseUrl , $entry -> getAttribute ( 'href' )
);
$feedUrls [ $feedUrl ] = $title ;
}
}
}
return $feedUrls ;
}
static function is_html ( $content ) {
return preg_match ( " /<html|DOCTYPE html/i " , substr ( $content , 0 , 8192 )) !== 0 ;
}
2019-06-20 05:14:06 +00:00
static function add_feed_category ( $feed_cat , $parent_cat_id = false , $order_id = 0 ) {
if ( ! $feed_cat ) return false ;
$feed_cat = mb_substr ( $feed_cat , 0 , 250 );
if ( ! $parent_cat_id ) $parent_cat_id = null ;
$pdo = Db :: pdo ();
$tr_in_progress = false ;
try {
$pdo -> beginTransaction ();
} catch ( Exception $e ) {
$tr_in_progress = true ;
}
$sth = $pdo -> prepare ( " SELECT id FROM ttrss_feed_categories
WHERE ( parent_cat = : parent OR ( : parent IS NULL AND parent_cat IS NULL ))
AND title = : title AND owner_uid = : uid " );
$sth -> execute ([ ':parent' => $parent_cat_id , ':title' => $feed_cat , ':uid' => $_SESSION [ 'uid' ]]);
if ( ! $sth -> fetch ()) {
$sth = $pdo -> prepare ( " INSERT INTO ttrss_feed_categories (owner_uid,title,parent_cat,order_id)
VALUES ( ? , ? , ? , ? ) " );
$sth -> execute ([ $_SESSION [ 'uid' ], $feed_cat , $parent_cat_id , ( int ) $order_id ]);
if ( ! $tr_in_progress ) $pdo -> commit ();
return true ;
}
$pdo -> commit ();
return false ;
}
static function get_feed_access_key ( $feed_id , $is_cat , $owner_uid = false ) {
if ( ! $owner_uid ) $owner_uid = $_SESSION [ " uid " ];
$is_cat = bool_to_sql_bool ( $is_cat );
$pdo = Db :: pdo ();
$sth = $pdo -> prepare ( " SELECT access_key FROM ttrss_access_keys
WHERE feed_id = ? AND is_cat = ?
AND owner_uid = ? " );
$sth -> execute ([ $feed_id , $is_cat , $owner_uid ]);
if ( $row = $sth -> fetch ()) {
return $row [ " access_key " ];
} else {
$key = uniqid_short ();
$sth = $pdo -> prepare ( " INSERT INTO ttrss_access_keys
( access_key , feed_id , is_cat , owner_uid )
VALUES ( ? , ? , ? , ? ) " );
$sth -> execute ([ $key , $feed_id , $is_cat , $owner_uid ]);
return $key ;
}
}
2019-06-20 05:40:02 +00:00
/**
* Purge a feed old posts .
*
* @ param mixed $feed_id The id of the purged feed .
* @ param mixed $purge_interval Olderness of purged posts .
* @ access public
2020-12-15 05:50:01 +00:00
* @ return mixed
2019-06-20 05:40:02 +00:00
*/
static function purge_feed ( $feed_id , $purge_interval ) {
2020-09-22 11:54:15 +00:00
if ( ! $purge_interval ) $purge_interval = self :: feed_purge_interval ( $feed_id );
2019-06-20 05:40:02 +00:00
$pdo = Db :: pdo ();
2020-12-15 05:50:01 +00:00
$owner_uid = false ;
$rows_deleted = 0 ;
2019-06-20 05:40:02 +00:00
$sth = $pdo -> prepare ( " SELECT owner_uid FROM ttrss_feeds WHERE id = ? " );
$sth -> execute ([ $feed_id ]);
if ( $row = $sth -> fetch ()) {
$owner_uid = $row [ " owner_uid " ];
2020-12-15 05:50:01 +00:00
if ( FORCE_ARTICLE_PURGE != 0 ) {
2020-12-20 20:11:26 +00:00
Debug :: log ( " purge_feed: FORCE_ARTICLE_PURGE is set, overriding interval to " . FORCE_ARTICLE_PURGE , Debug :: $LOG_VERBOSE );
2020-12-15 05:50:01 +00:00
$purge_unread = true ;
$purge_interval = FORCE_ARTICLE_PURGE ;
} else {
$purge_unread = get_pref ( " PURGE_UNREAD_ARTICLES " , $owner_uid , false );
}
2019-06-20 05:40:02 +00:00
2020-12-15 05:50:01 +00:00
$purge_interval = ( int ) $purge_interval ;
2019-06-20 05:40:02 +00:00
2020-12-20 20:11:26 +00:00
Debug :: log ( " purge_feed: interval $purge_interval days for feed $feed_id , owner: $owner_uid , purge unread: $purge_unread " , Debug :: $LOG_VERBOSE );
2019-06-20 05:40:02 +00:00
2020-12-15 05:50:01 +00:00
if ( $purge_interval <= 0 ) {
2020-12-20 20:11:26 +00:00
Debug :: log ( " purge_feed: purging disabled for this feed, nothing to do. " , Debug :: $LOG_VERBOSE );
2020-12-15 05:50:01 +00:00
return ;
}
2019-06-20 05:40:02 +00:00
2020-12-15 05:50:01 +00:00
if ( ! $purge_unread )
$query_limit = " unread = false AND " ;
else
$query_limit = " " ;
2019-06-20 05:40:02 +00:00
2020-12-15 05:50:01 +00:00
if ( DB_TYPE == " pgsql " ) {
$sth = $pdo -> prepare ( " DELETE FROM ttrss_user_entries
USING ttrss_entries
WHERE ttrss_entries . id = ref_id AND
marked = false AND
feed_id = ? AND
$query_limit
ttrss_entries . date_updated < NOW () - INTERVAL '$purge_interval days' " );
$sth -> execute ([ $feed_id ]);
2019-06-20 05:40:02 +00:00
2020-12-15 05:50:01 +00:00
} else {
$sth = $pdo -> prepare ( " DELETE FROM ttrss_user_entries
USING ttrss_user_entries , ttrss_entries
WHERE ttrss_entries . id = ref_id AND
marked = false AND
feed_id = ? AND
$query_limit
ttrss_entries . date_updated < DATE_SUB ( NOW (), INTERVAL $purge_interval DAY ) " );
$sth -> execute ([ $feed_id ]);
2019-06-20 05:40:02 +00:00
2020-12-15 05:50:01 +00:00
}
2019-06-20 05:40:02 +00:00
2020-12-15 05:50:01 +00:00
$rows_deleted = $sth -> rowCount ();
2019-06-20 05:40:02 +00:00
2020-12-20 20:11:26 +00:00
Debug :: log ( " purge_feed: deleted $rows_deleted articles. " , Debug :: $LOG_VERBOSE );
2019-06-20 05:40:02 +00:00
2020-12-15 05:50:01 +00:00
} else {
2020-12-20 20:11:26 +00:00
Debug :: log ( " purge_feed: owner of $feed_id not found " , Debug :: $LOG_VERBOSE );
2020-12-15 05:50:01 +00:00
}
return $rows_deleted ;
2019-06-20 05:40:02 +00:00
}
static function feed_purge_interval ( $feed_id ) {
2020-09-17 06:18:03 +00:00
$pdo = Db :: pdo ();
2019-06-20 05:40:02 +00:00
$sth = $pdo -> prepare ( " SELECT purge_interval, owner_uid FROM ttrss_feeds
WHERE id = ? " );
$sth -> execute ([ $feed_id ]);
if ( $row = $sth -> fetch ()) {
$purge_interval = $row [ " purge_interval " ];
$owner_uid = $row [ " owner_uid " ];
2020-12-15 05:50:01 +00:00
if ( $purge_interval == 0 )
$purge_interval = get_pref ( 'PURGE_OLD_DAYS' , $owner_uid , false );
2019-06-20 05:40:02 +00:00
return $purge_interval ;
} else {
return - 1 ;
}
}
2020-09-25 07:03:42 +00:00
static function search_to_sql ( $search , $search_language , $owner_uid ) {
2019-06-20 05:40:02 +00:00
$keywords = str_getcsv ( trim ( $search ), " " );
$query_keywords = array ();
$search_words = array ();
$search_query_leftover = array ();
$pdo = Db :: pdo ();
if ( $search_language )
$search_language = $pdo -> quote ( mb_strtolower ( $search_language ));
else
2020-09-25 07:03:42 +00:00
$search_language = $pdo -> quote ( mb_strtolower ( get_pref ( 'DEFAULT_SEARCH_LANGUAGE' , $owner_uid )));
2019-06-20 05:40:02 +00:00
foreach ( $keywords as $k ) {
if ( strpos ( $k , " - " ) === 0 ) {
$k = substr ( $k , 1 );
$not = " NOT " ;
} else {
$not = " " ;
}
$commandpair = explode ( " : " , mb_strtolower ( $k ), 2 );
switch ( $commandpair [ 0 ]) {
case " title " :
if ( $commandpair [ 1 ]) {
array_push ( $query_keywords , " ( $not (LOWER(ttrss_entries.title) LIKE " .
$pdo -> quote ( '%' . mb_strtolower ( $commandpair [ 1 ]) . '%' ) . " )) " );
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( " . $pdo->quote ( " % $k % " ). " )) " );
array_push ( $search_words , $k );
}
break ;
case " author " :
if ( $commandpair [ 1 ]) {
array_push ( $query_keywords , " ( $not (LOWER(author) LIKE " .
$pdo -> quote ( '%' . mb_strtolower ( $commandpair [ 1 ]) . '%' ) . " )) " );
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( " . $pdo->quote ( " % $k % " ). " )) " );
array_push ( $search_words , $k );
}
break ;
case " note " :
if ( $commandpair [ 1 ]) {
if ( $commandpair [ 1 ] == " true " )
array_push ( $query_keywords , " ( $not (note IS NOT NULL AND note != '')) " );
else if ( $commandpair [ 1 ] == " false " )
array_push ( $query_keywords , " ( $not (note IS NULL OR note = '')) " );
else
array_push ( $query_keywords , " ( $not (LOWER(note) LIKE " .
$pdo -> quote ( '%' . mb_strtolower ( $commandpair [ 1 ]) . '%' ) . " )) " );
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER( " . $pdo -> quote ( " % $k % " ) . " )
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( " . $pdo->quote ( " % $k % " ). " )) " );
if ( ! $not ) array_push ( $search_words , $k );
}
break ;
case " star " :
if ( $commandpair [ 1 ]) {
if ( $commandpair [ 1 ] == " true " )
array_push ( $query_keywords , " ( $not (marked = true)) " );
else
array_push ( $query_keywords , " ( $not (marked = false)) " );
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER( " . $pdo -> quote ( " % $k % " ) . " )
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( " . $pdo->quote ( " % $k % " ). " )) " );
if ( ! $not ) array_push ( $search_words , $k );
}
break ;
case " pub " :
if ( $commandpair [ 1 ]) {
if ( $commandpair [ 1 ] == " true " )
array_push ( $query_keywords , " ( $not (published = true)) " );
else
array_push ( $query_keywords , " ( $not (published = false)) " );
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER('% $k %')
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( " . $pdo->quote ( " % $k % " ). " )) " );
if ( ! $not ) array_push ( $search_words , $k );
}
break ;
2020-04-04 11:34:08 +00:00
case " label " :
if ( $commandpair [ 1 ]) {
$label_id = Labels :: find_id ( $commandpair [ 1 ], $_SESSION [ " uid " ]);
if ( $label_id ) {
2020-06-05 04:44:57 +00:00
array_push ( $query_keywords , " ( $not
2020-04-04 11:34:08 +00:00
( ttrss_entries . id IN (
2020-06-05 04:44:57 +00:00
SELECT article_id FROM ttrss_user_labels2 WHERE
2020-04-04 11:34:08 +00:00
label_id = " . $pdo->quote ( $label_id ). " ))) " );
} else {
array_push ( $query_keywords , " (false) " );
}
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER( " . $pdo -> quote ( " % $k % " ) . " )
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( " . $pdo->quote ( " % $k % " ). " )) " );
if ( ! $not ) array_push ( $search_words , $k );
}
break ;
2019-06-20 05:40:02 +00:00
case " unread " :
if ( $commandpair [ 1 ]) {
if ( $commandpair [ 1 ] == " true " )
array_push ( $query_keywords , " ( $not (unread = true)) " );
else
array_push ( $query_keywords , " ( $not (unread = false)) " );
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER( " . $pdo -> quote ( " % $k % " ) . " )
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( " . $pdo->quote ( " % $k % " ). " )) " );
if ( ! $not ) array_push ( $search_words , $k );
}
break ;
default :
if ( strpos ( $k , " @ " ) === 0 ) {
$user_tz_string = get_pref ( 'USER_TIMEZONE' , $_SESSION [ 'uid' ]);
$orig_ts = strtotime ( substr ( $k , 1 ));
2020-09-23 10:04:26 +00:00
$k = date ( " Y-m-d " , TimeHelper :: convert_timestamp ( $orig_ts , $user_tz_string , 'UTC' ));
2019-06-20 05:40:02 +00:00
//$k = date("Y-m-d", strtotime(substr($k, 1)));
array_push ( $query_keywords , " ( " . SUBSTRING_FOR_DATE . " (updated,1,LENGTH(' $k ')) $not = ' $k ') " );
} else {
if ( DB_TYPE == " pgsql " ) {
$k = mb_strtolower ( $k );
array_push ( $search_query_leftover , $not ? " ! $k " : $k );
} else {
array_push ( $query_keywords , " (UPPER(ttrss_entries.title) $not LIKE UPPER( " . $pdo -> quote ( " % $k % " ) . " )
OR UPPER ( ttrss_entries . content ) $not LIKE UPPER ( " . $pdo->quote ( " % $k % " ). " )) " );
}
if ( ! $not ) array_push ( $search_words , $k );
}
}
}
if ( count ( $search_query_leftover ) > 0 ) {
if ( DB_TYPE == " pgsql " ) {
// if there's no joiners consider this a "simple" search and
// concatenate everything with &, otherwise don't try to mess with tsquery syntax
if ( preg_match ( " /[&|]/ " , implode ( " " , $search_query_leftover ))) {
$tsquery = $pdo -> quote ( implode ( " " , $search_query_leftover ));
} else {
$tsquery = $pdo -> quote ( implode ( " & " , $search_query_leftover ));
}
array_push ( $query_keywords ,
" (tsvector_combined @@ to_tsquery( $search_language , $tsquery )) " );
}
}
2020-04-04 11:34:08 +00:00
if ( count ( $query_keywords ) > 0 )
$search_query_part = implode ( " AND " , $query_keywords );
else
$search_query_part = " false " ;
2019-06-20 05:40:02 +00:00
return array ( $search_query_part , $search_words );
}
2020-08-13 08:52:32 +00:00
static function order_to_override_query ( $order ) {
$query = " " ;
$skip_first_id = false ;
2021-02-08 19:46:01 +00:00
PluginHost :: getInstance () -> chain_hooks_callback ( PluginHost :: HOOK_HEADLINES_CUSTOM_SORT_OVERRIDE ,
function ( $result ) use ( & $query , & $skip_first_id ) {
list ( $query , $skip_first_id ) = $result ;
},
$order );
2020-09-11 04:48:22 +00:00
2021-02-08 19:46:01 +00:00
if ( $query ) return [ $query , $skip_first_id ];
2020-09-11 04:48:22 +00:00
2020-08-13 08:52:32 +00:00
switch ( $order ) {
case " title " :
$query = " ttrss_entries.title, date_entered, updated " ;
break ;
case " date_reverse " :
$query = " updated " ;
$skip_first_id = true ;
break ;
case " feed_dates " :
$query = " updated DESC " ;
break ;
}
return [ $query , $skip_first_id ];
}
2020-12-04 15:55:53 +00:00
function mark_timestamp ( $label ) {
2021-02-05 20:41:32 +00:00
if ( empty ( $_REQUEST [ 'timestamps' ]))
2020-12-04 15:55:53 +00:00
return ;
if ( ! $this -> viewfeed_timestamp ) $this -> viewfeed_timestamp = hrtime ( true );
if ( ! $this -> viewfeed_timestamp_last ) $this -> viewfeed_timestamp_last = hrtime ( true );
$timestamp = hrtime ( true );
printf ( " [%4d ms, %4d abs] %s \n " ,
( $timestamp - $this -> viewfeed_timestamp_last ) / 1e6 ,
( $timestamp - $this -> viewfeed_timestamp ) / 1e6 ,
$label );
$this -> viewfeed_timestamp_last = $timestamp ;
}
2013-02-21 14:58:06 +00:00
}
move the following to Feeds:
+ static function catchup_feed($feed, $cat_view, $owner_uid = false, $mode = 'all', $search = false) {
+ static function getFeedArticles($feed, $is_cat = false, $unread_only = false,
+ static function subscribe_to_feed($url, $cat_id = 0,
+ static function getFeedIcon($id) {
+ static function getFeedTitle($id, $cat = false) {
+ static function getCategoryUnread($cat, $owner_uid = false) {
+ static function getCategoryChildrenUnread($cat, $owner_uid = false) {
2017-05-04 11:50:56 +00:00