2 * Copyright (C) 2010-2013 jeanfi@gmail.com
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 #include <json/json.h>
29 static char *session_id;
30 static char *session_url;
32 static struct json_object *create_op(const char *op)
34 struct json_object *j;
36 j = json_object_new_object();
37 json_object_object_add(j, "op", json_object_new_string(op));
39 if (session_id && strcmp(op, "login"))
40 json_object_object_add(j,
42 json_object_new_string(session_id));
47 void ttrss_login(const char *url, const char *user, const char *password)
49 struct json_object *content, *rp, *error, *sid, *rq;
55 tmp = url_normalize(url);
56 session_url = malloc(strlen(tmp) + strlen("/api/") + 1);
57 strcpy(session_url, tmp);
58 strcat(session_url, "/api/");
62 rq = create_op("login");
63 json_object_object_add(rq, "user", json_object_new_string(user));
64 json_object_object_add(rq,
66 json_object_new_string(password));
68 rp = post_json_object(session_url, rq);
71 content = json_object_object_get(rp, "content");
73 fprintf(stderr, "Login failed: no content");
77 error = json_object_object_get(content, "error");
79 fprintf(stderr, "Login failed");
83 sid = json_object_object_get(content, "session_id");
90 session_id = strdup(json_object_get_string(sid));
92 printf("Session id: %s\n", session_id);
97 struct feed **ttrss_get_feeds()
99 struct json_object *rp, *rq, *content, *jfeed, *j;
101 struct feed **feeds, *feed;
103 rq = create_op("getFeeds");
105 rp = post_json_object(session_url, rq);
108 content = json_object_object_get(rp, "content");
111 n = json_object_array_length(content);
113 feeds = malloc((n+1) * sizeof(struct feed *));
114 for (i = 0; i < n; i++) {
115 jfeed = json_object_array_get_idx(content, i);
117 feed = malloc(sizeof(struct feed));
119 j = json_object_object_get(jfeed, "title");
120 feed->title = strdup(json_object_get_string(j));
122 j = json_object_object_get(jfeed, "feed_url");
123 feed->url = strdup(json_object_get_string(j));
125 j = json_object_object_get(jfeed, "id");
126 feed->id = json_object_get_int(j);
128 feed->headlines = ttrss_get_headlines(feed->id);
142 struct headline **ttrss_get_headlines(int feed_id)
144 struct json_object *rp, *rq, *content, *jheadline, *j;
146 struct headline **headlines, *h;
148 rq = create_op("getHeadlines");
149 json_object_object_add(rq, "feed_id", json_object_new_int(feed_id));
150 json_object_object_add(rq, "show_excerpt", json_object_new_boolean(1));
151 json_object_object_add(rq, "show_content", json_object_new_boolean(1));
153 rp = post_json_object(session_url, rq);
157 content = json_object_object_get(rp, "content");
160 n = json_object_array_length(content);
161 headlines = malloc((n+1)*sizeof(struct headline *));
162 for (i = 0; i < n; i++) {
163 jheadline = json_object_array_get_idx(content, i);
165 h = malloc(sizeof(struct headline));
167 j = json_object_object_get(jheadline, "title");
168 h->title = strdup(json_object_get_string(j));
170 j = json_object_object_get(jheadline, "excerpt");
171 h->excerpt = strdup(json_object_get_string(j));
173 j = json_object_object_get(jheadline, "content");
174 h->content = strdup(json_object_get_string(j));
176 j = json_object_object_get(jheadline, "unread");
177 h->unread = json_object_get_boolean(j);