static JSBool js_decodeEntety(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { const char *in; if (!JS_ConvertArguments(cx, argc, argv, "s", &in)) return JS_FALSE; char *out = strdup(in); html_entities_decode(out); *rval = STRING_TO_JSVAL(JS_NewString(cx, out, strlen(out))); return JS_TRUE; }
static ext_subtitles_t * load_timedtext(const char *url, buf_t *buf) { char errbuf[256]; htsmsg_field_t *f; htsmsg_t *xml = htsmsg_xml_deserialize_buf(buf, errbuf, sizeof(errbuf)); if(xml == NULL) { TRACE(TRACE_INFO, "Subtitles", "Unable to load timed text: %s", errbuf); return NULL; } htsmsg_t *transcript = htsmsg_get_map_multi(xml, "transcript", NULL); if(transcript == NULL) { htsmsg_release(xml); return NULL; } ext_subtitles_t *es = calloc(1, sizeof(ext_subtitles_t)); TAILQ_INIT(&es->es_entries); HTSMSG_FOREACH(f, transcript) { if(f->hmf_type == HMF_STR && f->hmf_childs != NULL) { htsmsg_t *n = f->hmf_childs; const char *str; int64_t start, end; if((str = htsmsg_get_str(n, "start")) == NULL) continue; start = my_str2double(str, NULL) * 1000000.0; if((str = htsmsg_get_str(n, "dur")) == NULL) continue; end = start + my_str2double(str, NULL) * 1000000.0; char *txt = strdup(f->hmf_str); html_entities_decode(txt); es_insert_text(es, txt, start, end, 0); free(txt); } } return es; }