aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordequis <dx@dxzone.com.ar>2016-10-02 21:56:35 -0300
committerdequis <dx@dxzone.com.ar>2016-10-02 21:56:35 -0300
commit58d285a4eec4f921be9de3c51341ef3d8729a999 (patch)
treec20c52d714ebd75867de4828c81af982132686fa
parent82e55d202f8152c25b8daa48d1960eede3eee312 (diff)
twitter: fix quoted tweet expansion in extended tweets
The outermost entities object only contains the url of the compat tweet, the one linking to /i/web/status/[...] The inner entities object, inside the "extended_tweet", is the one that contains the quoted tweet url that we're supposed to replace. But expand_entities() assumed that the quoted_status object would be next to entities, which doesn't apply in the case of extended tweets. So now it gets an extra parameter to look for entities.
-rw-r--r--protocols/twitter/twitter_lib.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c
index ad019e1d..c66c1d89 100644
--- a/protocols/twitter/twitter_lib.c
+++ b/protocols/twitter/twitter_lib.c
@@ -586,7 +586,7 @@ static gboolean twitter_xt_get_users(json_value *node, struct twitter_xml_list *
#define TWITTER_TIME_FORMAT "%a %b %d %H:%M:%S +0000 %Y"
#endif
-static void expand_entities(char **text, const json_value *node);
+static void expand_entities(char **text, const json_value *node, const json_value *extended_node);
/**
* Function to fill a twitter_xml_status struct.
@@ -601,6 +601,7 @@ static struct twitter_xml_status *twitter_xt_get_status(const json_value *node)
struct twitter_xml_status *txs = {0};
const json_value *rt = NULL;
const json_value *text_value = NULL;
+ const json_value *extended_node = NULL;
if (node->type != json_object) {
return FALSE;
@@ -614,6 +615,7 @@ static struct twitter_xml_status *twitter_xt_get_status(const json_value *node)
text_value = v;
} else if (strcmp("extended_tweet", k) == 0 && v->type == json_object) {
text_value = json_o_get(v, "full_text");
+ extended_node = v;
} else if (strcmp("retweeted_status", k) == 0 && v->type == json_object) {
rt = v;
} else if (strcmp("created_at", k) == 0 && v->type == json_string) {
@@ -646,7 +648,7 @@ static struct twitter_xml_status *twitter_xt_get_status(const json_value *node)
} else if (text_value && text_value->type == json_string) {
txs->text = g_memdup(text_value->u.string.ptr, text_value->u.string.length + 1);
strip_html(txs->text);
- expand_entities(&txs->text, node);
+ expand_entities(&txs->text, node, extended_node);
}
if (txs->text && txs->user && txs->id) {
@@ -689,7 +691,7 @@ static struct twitter_xml_status *twitter_xt_get_dm(const json_value *node)
}
}
- expand_entities(&txs->text, node);
+ expand_entities(&txs->text, node, NULL);
if (txs->text && txs->user && txs->id) {
return txs;
@@ -699,9 +701,9 @@ static struct twitter_xml_status *twitter_xt_get_dm(const json_value *node)
return NULL;
}
-static void expand_entities(char **text, const json_value *node)
+static void expand_entities(char **text, const json_value *node, const json_value *extended_node)
{
- json_value *entities, *quoted;
+ json_value *entities, *extended_entities, *quoted;
char *quote_url = NULL, *quote_text = NULL;
if (!((entities = json_o_get(node, "entities")) && entities->type == json_object))
@@ -719,6 +721,13 @@ static void expand_entities(char **text, const json_value *node)
quoted = NULL;
}
+ if (extended_node) {
+ extended_entities = json_o_get(extended_node, "entities");
+ if (extended_entities && extended_entities->type == json_object) {
+ entities = extended_entities;
+ }
+ }
+
JSON_O_FOREACH(entities, k, v) {
int i;