/* delete */
free(in->in_remove_args);
+ free(in->in_ctx_charset);
mpegts_network_delete(mn, delconf);
free(icon_url_sane);
iptv_auto_network_trigger(in);
}
+static htsmsg_t *
+iptv_auto_network_class_charset_list(void *o, const char *lang)
+{
+ htsmsg_t *m = htsmsg_create_map();
+ htsmsg_add_str(m, "type", "api");
+ htsmsg_add_str(m, "uri", "intlconv/charsets");
+ return m;
+}
+
const idclass_t iptv_auto_network_class = {
.ic_super = &iptv_network_class,
.ic_class = "iptv_auto_network",
.notify = iptv_auto_network_class_notify_url,
.opts = PO_MULTILINE
},
+ {
+ .type = PT_STR,
+ .id = "ctx_charset",
+ .name = N_("Contents character set"),
+ .off = offsetof(iptv_network_t, in_ctx_charset),
+ .list = iptv_auto_network_class_charset_list,
+ .notify = iptv_auto_network_class_notify_url,
+ },
{
.type = PT_S64,
.intsplit = CHANNEL_SPLIT,
#include "iptv_private.h"
#include "channels.h"
#include "download.h"
+#include "intlconv.h"
#include <fcntl.h>
#include <sys/stat.h>
return d;
}
+/*
+ *
+ */
+static int replace_string(char **s, const char *n, const char *charset_id)
+{
+ char *c;
+
+ if (charset_id && n) {
+ c = intlconv_to_utf8safestr(charset_id, n, strlen(n)*2);
+ } else
+ c = n ? strdup(n) : NULL;
+ if (strcmp(*s ?: "", n ?: "") == 0) {
+ free(c);
+ return 0;
+ }
+ free(*s);
+ *s = c;
+ return 1;
+}
+
/*
*
*/
static void
iptv_auto_network_process_m3u_item(iptv_network_t *in,
- const char *last_url,
+ const char *last_url, const char *charset_id,
const http_arg_list_t *remove_args,
const char *url, const char *name,
const char *logo, const char *epgid,
http_arg_t *ra1, *ra2, *ra2_next;
htsbuf_queue_t q;
size_t l = 0;
- char url2[512], name2[128], *n;
+ char url2[512], name2[128], *n, *x = NULL;
if (url == NULL ||
(strncmp(url, "file://", 7) &&
}
if (last_url) {
+ if (charset_id) {
+ x = intlconv_to_utf8safestr(charset_id, name, strlen(name)*2);
+ name = x;
+ }
snprintf(n = name2, sizeof(name2), "%s - %s", last_url, name);
} else {
n = (char *)name;
im->im_delete_flag = 0;
if (strcmp(im->mm_iptv_svcname ?: "", name ?: "")) {
free(im->mm_iptv_svcname);
- im->mm_iptv_svcname = name ? strdup(name) : NULL;
+ im->mm_iptv_svcname = strdup(name);
change = 1;
}
if (im->mm_iptv_chnum != chnum) {
im->mm_iptv_icon = logo ? strdup(logo) : NULL;
change = 1;
}
- if (strcmp(im->mm_iptv_epgid ?: "", epgid ?: "")) {
- free(im->mm_iptv_epgid);
- im->mm_iptv_epgid = epgid ? strdup(epgid) : NULL;
- change = 1;
- }
+ change |= replace_string(&im->mm_iptv_epgid, epgid, charset_id);
if (change)
idnode_notify_changed(&im->mm_id);
(*total)++;
}
end:
+ free(x);
urlreset(&u);
}
int64_t chnum)
{
char *url, *name = NULL, *logo = NULL, *epgid = NULL;
+ char *charset_id = intlconv_charset_id(in->in_ctx_charset, 0, 1);
int total = 0, count = 0;
while (*data && *data != '\n') data++;
url = data;
data = until_eol(data);
if (*url && *url > ' ')
- iptv_auto_network_process_m3u_item(in, last_url, remove_args,
- url, name, logo, epgid,
+ iptv_auto_network_process_m3u_item(in, last_url, charset_id,
+ remove_args, url, name,
+ logo, epgid,
chnum, &total, &count);
}
mm->mm_delete(mm, 1);
count++;
}
- tvhinfo("iptv", "removed %d mux(es) from network '%s'", count, in->mn_network_name);
+ if (count > 0)
+ tvhinfo("iptv", "removed %d mux(es) from network '%s'", count, in->mn_network_name);
} else {
LIST_FOREACH(mm, &in->mn_muxes, mm_network_link)
((iptv_mux_t *)mm)->im_delete_flag = 0;