std::vector<tagged_feedurl> newsblur_api::get_subscribed_urls() { std::vector<tagged_feedurl> result; json_object * response = query_api("/reader/feeds", NULL); json_object * feeds = json_object_object_get(response, "feeds"); json_object_iterator it = json_object_iter_begin(feeds); json_object_iterator itEnd = json_object_iter_end(feeds); while (!json_object_iter_equal(&it, &itEnd)) { const char * feed_id = json_object_iter_peek_name(&it); json_object * node; rsspp::feed current_feed; current_feed.rss_version = rsspp::NEWSBLUR_JSON; json_object * feed_json = json_object_iter_peek_value(&it); node = json_object_object_get(feed_json, "feed_title"); current_feed.title = json_object_get_string(node); node = json_object_object_get(feed_json, "feed_link"); current_feed.link = json_object_get_string(node); known_feeds[feed_id] = current_feed; std::vector<std::string> tags = std::vector<std::string>(); result.push_back(tagged_feedurl(std::string(feed_id), tags)); json_object_iter_next(&it); } return result; }
void ttrss_api::fetch_feeds_per_category(struct json_object * cat, std::vector<tagged_feedurl>& feeds) { const char * cat_name = NULL; struct json_object * cat_title_obj = NULL; int cat_id; if (cat) { struct json_object * cat_id_obj = json_object_object_get(cat, "id"); cat_id = json_object_get_int(cat_id_obj); // ignore special categories, for now if(cat_id < 0) return; cat_title_obj = json_object_object_get(cat, "title"); cat_name = json_object_get_string(cat_title_obj); LOG(LOG_DEBUG, "ttrss_api::fetch_feeds_per_category: id = %d title = %s", cat_id, cat_name); } else { // As uncategorized is a category itself (id = 0) and the default value // for a getFeeds is id = 0, the feeds in uncategorized will appear twice return; } std::map<std::string, std::string> args; if (cat) args["cat_id"] = utils::to_string<int>(cat_id); struct json_object * feed_list_obj = run_op("getFeeds", args); if (!feed_list_obj) return; struct array_list * feed_list = json_object_get_array(feed_list_obj); int feed_list_size = array_list_length(feed_list); for (int j=0;j<feed_list_size;j++) { struct json_object * feed = (struct json_object *)array_list_get_idx(feed_list, j); int feed_id = json_object_get_int(json_object_object_get(feed, "id")); const char * feed_title = json_object_get_string(json_object_object_get(feed, "title")); const char * feed_url = json_object_get_string(json_object_object_get(feed, "feed_url")); std::vector<std::string> tags; tags.push_back(std::string("~") + feed_title); if (cat_name) { tags.push_back(cat_name); } feeds.push_back(tagged_feedurl(utils::strprintf("%s#%d", feed_url, feed_id), tags)); // TODO: cache feed_id -> feed_url (or feed_url -> feed_id ?) } json_object_put(feed_list_obj); }
std::vector<tagged_feedurl> newsblur_api::get_subscribed_urls() { std::vector<tagged_feedurl> result; json_object * response = query_api("/reader/feeds/", NULL); json_object * feeds {}; json_object_object_get_ex(response, "feeds", &feeds); json_object_iterator it = json_object_iter_begin(feeds); json_object_iterator itEnd = json_object_iter_end(feeds); json_object * folders {}; json_object_object_get_ex(response, "folders", &folders); std::map<std::string, std::vector<std::string>> feeds_to_tags = mk_feeds_to_tags(folders); while (!json_object_iter_equal(&it, &itEnd)) { const char * feed_id = json_object_iter_peek_name(&it); json_object * node {}; rsspp::feed current_feed; current_feed.rss_version = rsspp::NEWSBLUR_JSON; json_object * feed_json = json_object_iter_peek_value(&it); json_object_object_get_ex(feed_json, "feed_title", &node); current_feed.title = json_object_get_string(node); json_object_object_get_ex(feed_json, "feed_link", &node); current_feed.link = json_object_get_string(node); known_feeds[feed_id] = current_feed; std::string std_feed_id(feed_id); std::vector<std::string> tags = feeds_to_tags[std_feed_id]; result.push_back(tagged_feedurl(std_feed_id, tags)); json_object_iter_next(&it); } return result; }