Remove the conecpt of channel groups, it's too inflexible

This commit is contained in:
Andreas Öman 2008-08-25 20:37:19 +00:00
parent 860d58013b
commit e7e4b9f710
21 changed files with 107 additions and 322 deletions

View file

@ -21,7 +21,7 @@ SRCS += iptv_input.c iptv_output.c
SRCS += avgen.c file_input.c
SRCS += htsclient.c rtsp.c rtp.c xbmsp.c
SRCS += htsclient.c rtsp.c rtp.c
SRCS += v4l.c

View file

@ -64,10 +64,6 @@ autorec_cmp(autorec_t *ar, event_t *e)
ar->ar_channel != e->e_channel)
return 0;
if(ar->ar_channel_group != NULL &&
ar->ar_channel_group != e->e_channel->ch_group)
return 0;
if(ar->ar_ecg != NULL) {
if(e->e_content_type == NULL ||
ar->ar_ecg != e->e_content_type->ect_group)
@ -103,7 +99,7 @@ autorec_check_new_ar(autorec_t *ar)
event_t *e;
channel_t *ch;
LIST_FOREACH(ch, &channels, ch_global_link) {
RB_FOREACH(ch, &channel_tree, ch_global_link) {
e = ch->ch_epg_cur_event;
if(e == NULL)
continue;
@ -146,7 +142,7 @@ autorec_check_new_event(event_t *e)
*/
static autorec_t *
autorec_create0(const char *name, int prio, const char *title,
epg_content_group_t *ecg, channel_group_t *tcg,
epg_content_group_t *ecg,
channel_t *ch, int id, const char *creator)
{
autorec_t *ar = calloc(1, sizeof(autorec_t));
@ -162,9 +158,6 @@ autorec_create0(const char *name, int prio, const char *title,
ar->ar_rec_prio = prio;
ar->ar_ecg = ecg;
ar->ar_channel_group = tcg;
LIST_INSERT_HEAD(&tcg->tcg_autorecs, ar, ar_channel_group_link);
ar->ar_channel = ch;
LIST_INSERT_HEAD(&ch->ch_autorecs, ar, ar_channel_link);
@ -194,7 +187,6 @@ autorec_destroy(autorec_t *ar)
free((void *)ar->ar_creator);
free((void *)ar->ar_name);
LIST_REMOVE(ar, ar_channel_group_link);
LIST_REMOVE(ar, ar_channel_link);
TAILQ_REMOVE(&autorecs, ar, ar_link);
@ -207,13 +199,13 @@ autorec_destroy(autorec_t *ar)
*/
int
autorec_create(const char *name, int prio, const char *title,
epg_content_group_t *ecg, channel_group_t *tcg,
epg_content_group_t *ecg,
channel_t *ch, const char *creator)
{
autorec_t *ar;
ar_id_ceil++;
ar = autorec_create0(name, prio, title, ecg, tcg, ch, ar_id_ceil, creator);
ar = autorec_create0(name, prio, title, ecg, ch, ar_id_ceil, creator);
if(ar == NULL)
return -1;
@ -263,9 +255,6 @@ autorec_save_entry(autorec_t *ar)
if(ar->ar_ecg != NULL)
fprintf(fp, "event_content_group = %s\n", ar->ar_ecg->ecg_name);
if(ar->ar_channel_group != NULL)
fprintf(fp, "channel_group = %s\n", ar->ar_channel_group->tcg_name);
if(ar->ar_channel != NULL)
fprintf(fp, "channel = %s\n", ar->ar_channel->ch_name);
fclose(fp);
@ -317,9 +306,7 @@ autorec_load(void)
contentgroup ?
epg_content_group_find_by_name(contentgroup) : NULL,
chgroup ? channel_group_find(chgroup, 1) : NULL,
channel ? channel_find(channel, 1, NULL) : NULL,
channel ? channel_find(channel, 1) : NULL,
id, creator);
if(id > ar_id_ceil)

View file

@ -39,9 +39,6 @@ typedef struct autorec {
epg_content_group_t *ar_ecg;
channel_group_t *ar_channel_group;
LIST_ENTRY(autorec) ar_channel_group_link;
channel_t *ar_channel;
LIST_ENTRY(autorec) ar_channel_link;
@ -51,7 +48,7 @@ typedef struct autorec {
void autorec_init(void);
int autorec_create(const char *name, int prio, const char *title,
epg_content_group_t *ecg, channel_group_t *tcg,
epg_content_group_t *ecg,
channel_t *ch, const char *creator);
void autorec_check_new_event(event_t *e);

View file

@ -98,7 +98,7 @@ avgen_init(void)
if(avcodec_find_encoder(CODEC_ID_MP2) == NULL)
return;
ch = channel_find("Test PAL", 1, channel_group_find("Test channels", 1));
ch = channel_find("Test PAL", 1);
t = calloc(1, sizeof(th_transport_t));

View file

@ -30,6 +30,7 @@
#include <dirent.h>
#include <libhts/htscfg.h>
#include <libhts/htssettings.h>
#include "tvhead.h"
#include "v4l.h"
@ -41,127 +42,54 @@
#include "pvr.h"
#include "autorec.h"
struct channel_list channels;
int nchannels;
struct channel_tree channel_tree;
struct channel_group_queue all_channel_groups;
channel_group_t *defgroup;
/**
*
*/
static int
ch_number(const char *s1)
dictcmp(const char *a, const char *b)
{
while(*s1) {
if(*s1 >= '0' && *s1 <= '9') {
return strtol(s1, NULL, 10);
long int da, db;
while(1) {
switch((*a >= '0' && *a <= '9' ? 1 : 0)|(*b >= '0' && *b <= '9' ? 2 : 0)) {
case 0: /* 0: a is not a digit, nor is b */
if(*a != *b)
return *(const unsigned char *)a - *(const unsigned char *)b;
if(*a == 0)
return 0;
a++;
b++;
break;
case 1: /* 1: a is a digit, b is not */
case 2: /* 2: a is not a digit, b is */
return *(const unsigned char *)a - *(const unsigned char *)b;
case 3: /* both are digits, switch to integer compare */
da = strtol(a, (char **)&a, 10);
db = strtol(b, (char **)&b, 10);
if(da != db)
return da - db;
break;
}
s1++;
}
return INT32_MAX;
}
static int
chcmp(const char *s1, const char *s2)
{
int n1, n2;
n1 = ch_number(s1);
n2 = ch_number(s2);
if(n1 != n2) {
return n1 - n2;
}
return strcmp(s1, s2);
}
/**
*
*/
static int
channelcmp(channel_t *a, channel_t *b)
{
return chcmp(a->ch_name, b->ch_name);
}
/**
*
*/
channel_group_t *
channel_group_find(const char *name, int create)
static int
channelcmp(const channel_t *a, const channel_t *b)
{
channel_group_t *tcg;
TAILQ_FOREACH(tcg, &all_channel_groups, tcg_global_link) {
if(!strcmp(name, tcg->tcg_name))
return tcg;
}
if(!create)
return NULL;
tcg = calloc(1, sizeof(channel_group_t));
tcg->tcg_name = strdup(name);
tcg->tcg_tag = tag_get();
TAILQ_INIT(&tcg->tcg_channels);
TAILQ_INSERT_TAIL(&all_channel_groups, tcg, tcg_global_link);
channel_group_settings_write();
return tcg;
return dictcmp(a->ch_name, b->ch_name);
}
/**
*
*/
void
channel_set_group(channel_t *ch, channel_group_t *tcg)
{
if(ch->ch_group != NULL)
TAILQ_REMOVE(&ch->ch_group->tcg_channels, ch, ch_group_link);
ch->ch_group = tcg;
TAILQ_INSERT_SORTED(&tcg->tcg_channels, ch, ch_group_link, channelcmp);
channel_settings_write(ch);
}
/**
*
*/
void
channel_group_destroy(channel_group_t *tcg)
{
channel_t *ch;
if(defgroup == tcg)
return;
while((ch = TAILQ_FIRST(&tcg->tcg_channels)) != NULL) {
channel_set_group(ch, defgroup);
}
TAILQ_REMOVE(&all_channel_groups, tcg, tcg_global_link);
free((void *)tcg->tcg_name);
free(tcg);
channel_group_settings_write();
}
/**
*
*/
static void
channel_set_name(channel_t *ch, const char *name)
{
channel_t *x;
const char *n2;
int l, i;
char *cp, c;
@ -187,68 +115,38 @@ channel_set_name(channel_t *ch, const char *name)
free((void *)n2);
LIST_INSERT_SORTED(&channels, ch, ch_global_link, channelcmp);
x = RB_INSERT_SORTED(&channel_tree, ch, ch_global_link, channelcmp);
assert(x == NULL);
}
/**
*
*/
channel_t *
channel_find(const char *name, int create, channel_group_t *tcg)
channel_find(const char *name, int create)
{
channel_t *ch;
channel_t *ch, skel;
LIST_FOREACH(ch, &channels, ch_global_link)
if(!strcasecmp(name, ch->ch_name))
return ch;
skel.ch_name = name;
if((ch = RB_FIND(&channel_tree, &skel, ch_global_link, channelcmp)) != NULL)
return ch;
if(create == 0)
return NULL;
ch = calloc(1, sizeof(channel_t));
ch->ch_index = nchannels;
ch->ch_index = channel_tree.entries;
TAILQ_INIT(&ch->ch_epg_events);
channel_set_name(ch, name);
channel_set_group(ch, tcg ?: defgroup);
ch->ch_tag = tag_get();
nchannels++;
return ch;
}
/**
*
*/
static void
service_load(struct config_head *head)
{
const char *name, *v;
th_transport_t *t;
int r = 1;
if((name = config_get_str_sub(head, "channel", NULL)) == NULL)
return;
t = calloc(1, sizeof(th_transport_t));
if(0) {
#ifdef ENABLE_INPUT_IPTV
} else if((v = config_get_str_sub(head, "iptv", NULL)) != NULL) {
r = iptv_configure_transport(t, v, head, name);
#endif
#ifdef ENABLE_INPUT_V4L
} else if((v = config_get_str_sub(head, "v4lmux", NULL)) != NULL) {
r = v4l_configure_transport(t, v, name);
#endif
}
if(r)
free(t);
}
static struct strtab commercial_detect_tab[] = {
{ "none", COMMERCIAL_DETECT_NONE },
{ "ttp192", COMMERCIAL_DETECT_TTP192 },
@ -261,6 +159,7 @@ static struct strtab commercial_detect_tab[] = {
void
channels_load(void)
{
#if 0
struct config_head cl;
config_entry_t *ce;
char buf[PATH_MAX];
@ -268,7 +167,6 @@ channels_load(void)
struct dirent *d;
const char *name, *grp, *x;
channel_t *ch;
channel_group_t *tcg;
int v;
TAILQ_INIT(&all_channel_groups);
@ -338,6 +236,7 @@ channels_load(void)
service_load(&ce->ce_sub);
}
}
#endif
}
@ -350,7 +249,7 @@ channel_by_index(uint32_t index)
{
channel_t *ch;
LIST_FOREACH(ch, &channels, ch_global_link)
RB_FOREACH(ch, &channel_tree, ch_global_link)
if(ch->ch_index == index)
return ch;
@ -367,7 +266,7 @@ channel_by_tag(uint32_t tag)
{
channel_t *ch;
LIST_FOREACH(ch, &channels, ch_global_link)
RB_FOREACH(ch, &channel_tree, ch_global_link)
if(ch->ch_tag == tag)
return ch;
@ -376,72 +275,20 @@ channel_by_tag(uint32_t tag)
/**
*
*/
channel_group_t *
channel_group_by_tag(uint32_t tag)
{
channel_group_t *tcg;
TAILQ_FOREACH(tcg, &all_channel_groups, tcg_global_link) {
if(tcg->tcg_tag == tag)
return tcg;
if(tag == 0 && tcg->tcg_hidden == 0)
return tcg;
}
return NULL;
}
/**
* Write out a config file with all channel groups
*
* We do this to maintain order of groups
*/
void
channel_group_settings_write(void)
{
FILE *fp;
channel_group_t *tcg;
char buf[400];
snprintf(buf, sizeof(buf), "%s/channel-group-settings.cfg", settings_dir);
if((fp = settings_open_for_write(buf)) == NULL)
return;
TAILQ_FOREACH(tcg, &all_channel_groups, tcg_global_link) {
fprintf(fp, "channel-group {\n"
"\tname = %s\n", tcg->tcg_name);
fprintf(fp, "}\n");
}
fclose(fp);
}
/**
* Write out a config file for a channel
*/
void
channel_settings_write(channel_t *ch)
static void
channel_save(channel_t *ch)
{
FILE *fp;
char buf[400];
snprintf(buf, sizeof(buf), "%s/channels/%s", settings_dir, ch->ch_sname);
if((fp = settings_open_for_write(buf)) == NULL)
return;
fprintf(fp, "name = %s\n", ch->ch_name);
fprintf(fp, "channel-group = %s\n", ch->ch_group->tcg_name);
if(ch->ch_icon != NULL)
fprintf(fp, "icon = %s\n", ch->ch_icon);
fprintf(fp, "commercial-detect = %s\n",
val2str(ch->ch_commercial_detection, commercial_detect_tab) ?: "?");
fclose(fp);
htsmsg_t *m = htsmsg_create();
htsmsg_add_str(m, "icon", ch->ch_icon);
htsmsg_add_str(m, "commercial_detect",
val2str(ch->ch_commercial_detection,
commercial_detect_tab) ?: "?");
hts_settings_save(m, "channels/%s", ch->ch_name);
htsmsg_destroy(m);
}
/**
@ -452,10 +299,12 @@ channel_rename(channel_t *ch, const char *newname)
{
th_transport_t *t;
if(channel_find(newname, 0, NULL))
if(channel_find(newname, 0))
return -1;
LIST_REMOVE(ch, ch_global_link);
hts_settings_remove("channels/%s", ch->ch_name);
RB_REMOVE(&channel_tree, ch, ch_global_link);
channel_set_name(ch, newname);
LIST_FOREACH(t, &ch->ch_transports, tht_ch_link) {
@ -464,7 +313,7 @@ channel_rename(channel_t *ch, const char *newname)
t->tht_config_change(t);
}
channel_settings_write(ch);
channel_save(ch);
return 0;
}
@ -476,7 +325,6 @@ channel_delete(channel_t *ch)
{
th_transport_t *t;
th_subscription_t *s;
char buf[400];
pvr_destroy_by_channel(ch);
@ -494,17 +342,14 @@ channel_delete(channel_t *ch)
autorec_destroy_by_channel(ch);
snprintf(buf, sizeof(buf), "%s/channels/%s", settings_dir, ch->ch_sname);
unlink(buf);
hts_settings_remove("channels/%s", ch->ch_name);
free((void *)ch->ch_name);
free((void *)ch->ch_sname);
free(ch->ch_icon);
TAILQ_REMOVE(&ch->ch_group->tcg_channels, ch, ch_group_link);
LIST_REMOVE(ch, ch_global_link);
RB_REMOVE(&channel_tree, ch, ch_global_link);
free(ch);
}
@ -528,3 +373,14 @@ channel_merge(channel_t *dst, channel_t *src)
channel_delete(src);
}
/**
*
*/
void
channel_set_icon(channel_t *ch, const char *icon)
{
free(ch->ch_icon);
ch->ch_icon = icon ? strdup(icon) : NULL;
channel_save(ch);
}

View file

@ -31,20 +31,10 @@ int channel_get_channels(void);
void channel_unsubscribe(th_subscription_t *s);
channel_t *channel_find(const char *name, int create, channel_group_t *tcg);
channel_group_t *channel_group_find(const char *name, int create);
channel_group_t *channel_group_by_tag(uint32_t tag);
void channel_group_destroy(channel_group_t *tcg);
void channel_set_group(channel_t *ch, channel_group_t *tcg);
channel_t *channel_find(const char *name, int create);
void channel_set_teletext_rundown(channel_t *ch, int v);
void channel_group_settings_write(void);
void channel_settings_write(channel_t *ch);
int channel_rename(channel_t *ch, const char *newname);
@ -53,4 +43,6 @@ void channel_delete(channel_t *ch);
void channel_merge(channel_t *dst, channel_t *src);
void channel_set_icon(channel_t *ch, const char *icon);
#endif /* CHANNELS_H */

22
epg.c
View file

@ -413,7 +413,7 @@ epg_channel_maintain(void *aux, int64_t clk)
now = dispatch_clock;
LIST_FOREACH(ch, &channels, ch_global_link) {
RB_FOREACH(ch, &channel_tree, ch_global_link) {
/* Age out any old events */
@ -466,11 +466,8 @@ epg_transfer_events(channel_t *ch, struct event_queue *src,
event_t *e;
int cnt = 0;
if(strcmp(icon ?: "", ch->ch_icon ?: "")) {
free(ch->ch_icon);
ch->ch_icon = icon ? strdup(icon) : NULL;
channel_settings_write(ch);
}
if(strcmp(icon ?: "", ch->ch_icon ?: ""))
channel_set_icon(ch, icon);
TAILQ_FOREACH(e, src, e_channel_link) {
@ -551,9 +548,8 @@ epg_content_group_find_by_name(const char *name)
int
epg_search(struct event_list *h, const char *title,
epg_content_group_t *s_ecg,
channel_group_t *s_tcg, channel_t *s_ch)
channel_t *s_ch)
{
channel_group_t *dis;
channel_t *ch;
event_t *e;
int num = 0;
@ -563,21 +559,13 @@ epg_search(struct event_list *h, const char *title,
regcomp(&preg, title, REG_ICASE | REG_EXTENDED | REG_NOSUB))
return -1;
dis = channel_group_find("-disabled-", 1);
LIST_FOREACH(ch, &channels, ch_global_link) {
if(ch->ch_group == dis)
continue;
RB_FOREACH(ch, &channel_tree, ch_global_link) {
if(LIST_FIRST(&ch->ch_transports) == NULL)
continue;
if(s_ch != NULL && s_ch != ch)
continue;
if(s_tcg != NULL && s_tcg != ch->ch_group)
continue;
TAILQ_FOREACH(e, &ch->ch_epg_events, e_channel_link) {
if(e->e_start + e->e_duration < dispatch_clock)

3
epg.h
View file

@ -55,8 +55,7 @@ epg_content_type_t *epg_content_type_find_by_dvbcode(uint8_t dvbcode);
epg_content_group_t *epg_content_group_find_by_name(const char *name);
int epg_search(struct event_list *h, const char *title,
epg_content_group_t *s_ecg, channel_group_t *s_tcg,
channel_t *s_ch);
epg_content_group_t *s_ecg, channel_t *s_ch);
void epg_destroy_by_channel(channel_t *ch);

View file

@ -250,7 +250,7 @@ xmltv_resolve_by_events(xmltv_channel_t *xc)
if(ex == NULL)
break;
LIST_FOREACH(ch, &channels, ch_global_link) {
RB_FOREACH(ch, &channel_tree, ch_global_link) {
ec = epg_event_find_by_time0(&ch->ch_epg_events, now);
cnt = 0;
@ -289,14 +289,14 @@ xmltv_transfer_events(xmltv_grabber_t *xg)
continue;
if(xc->xc_channel != NULL) {
ch = channel_find(xc->xc_channel, 0, NULL);
ch = channel_find(xc->xc_channel, 0);
if(ch == NULL)
continue;
} else {
how = 0;
ch = channel_find(xc->xc_displayname, 0, NULL);
ch = channel_find(xc->xc_displayname, 0);
if(ch == NULL) {
ch = xmltv_resolve_by_events(xc);

View file

@ -159,7 +159,7 @@ file_input_init(void)
if((s = config_get_str_sub(&ce->ce_sub, "channel", NULL)) == NULL)
continue;
ch = channel_find(s, 1, channel_group_find("Streamed channels", 1));
ch = channel_find(s, 1);
t->tht_name = strdup(ch->ch_name);

View file

@ -248,9 +248,7 @@ cr_channels_list(client_t *c, char **argv, int argc)
{
channel_t *ch;
LIST_FOREACH(ch, &channels, ch_global_link) {
if(ch->ch_group == NULL)
continue;
RB_FOREACH(ch, &channel_tree, ch_global_link) {
cprintf(c, "channel = %d\n", ch->ch_index);
}
return 0;

18
htsp.c
View file

@ -79,7 +79,6 @@ htsp_build_channel_msg(channel_t *ch, const char *method)
event_t *e;
htsmsg_add_str(msg, "method", method);
htsmsg_add_str(msg, "channelGroupName", ch->ch_group->tcg_name);
htsmsg_add_str(msg, "channelName", ch->ch_name);
htsmsg_add_u32(msg, "channelTag", ch->ch_tag);
if(ch->ch_icon != NULL)
@ -101,25 +100,14 @@ static void
htsp_send_all_channels(htsp_t *htsp)
{
htsmsg_t *msg;
channel_group_t *tcg;
channel_t *ch;
TAILQ_FOREACH(tcg, &all_channel_groups, tcg_global_link) {
if(tcg->tcg_hidden)
RB_FOREACH(ch, &channel_tree, ch_global_link) {
if(LIST_FIRST(&ch->ch_transports) == NULL)
continue;
msg = htsmsg_create();
htsmsg_add_str(msg, "method", "channelGroupAdd");
htsmsg_add_str(msg, "channelGroupName", tcg->tcg_name);
msg = htsp_build_channel_msg(ch, "channelAdd");
htsp_send_msg(htsp, msg, 0);
TAILQ_FOREACH(ch, &tcg->tcg_channels, ch_group_link) {
if(LIST_FIRST(&ch->ch_transports) == NULL)
continue;
msg = htsp_build_channel_msg(ch, "channelAdd");
htsp_send_msg(htsp, msg, 0);
}
}
}

View file

@ -133,7 +133,7 @@ output_multicast_load(struct config_head *head)
if((name = config_get_str_sub(head, "channel", NULL)) == NULL)
return;
ch = channel_find(name, 1, NULL);
ch = channel_find(name, 1);
om = calloc(1, sizeof(output_multicast_t));

3
main.c
View file

@ -318,10 +318,11 @@ main(int argc, char **argv)
p = atoi(config_get_str("htsp-server-port", "9910"));
if(p)
htsp_start(p);
#if 0
p = atoi(config_get_str("xbmsp-server-port", "0"));
if(p)
xbmsp_start(p);
#endif
}
dispatcher();

2
pvr.c
View file

@ -438,7 +438,7 @@ pvr_database_load(void)
if(channel != NULL && start && stop && title && status) {
pvrr = calloc(1, sizeof(pvr_rec_t));
pvrr->pvrr_channel = channel_find(channel, 1, NULL);
pvrr->pvrr_channel = channel_find(channel, 1);
pvrr->pvrr_start = start;
pvrr->pvrr_stop = stop;
pvrr->pvrr_status = *status;

4
rpc.c
View file

@ -148,7 +148,7 @@ rpc_channels_list(rpc_session_t *ses, htsmsg_t *in, void *opaque)
out = htsmsg_create();
htsmsg_add_u32(out, "seq", ses->rs_seq);
LIST_FOREACH(ch, &channels, ch_global_link)
RB_FOREACH(ch, &channel_tree, ch_global_link)
htsmsg_add_msg(out, "channel", rpc_build_channel_msg(ch));
return out;
@ -174,7 +174,7 @@ rpc_event_info(rpc_session_t *ses, htsmsg_t *in, void *opaque)
if(htsmsg_get_u32(in, "tag", &u32) >= 0) {
e = epg_event_find_by_tag(u32);
} else if((s = htsmsg_get_str(in, "channel")) != NULL) {
if((ch = channel_find(s, 0, NULL)) == NULL) {
if((ch = channel_find(s, 0)) == NULL) {
errtxt = "Channel not found";
} else {
if(htsmsg_get_u32(in, "time", &u32) < 0) {

2
rtsp.c
View file

@ -104,7 +104,7 @@ rtsp_channel_by_url(char *url)
return NULL;
c++;
LIST_FOREACH(ch, &channels, ch_global_link)
RB_FOREACH(ch, &channel_tree, ch_global_link)
if(!strcasecmp(ch->ch_sname, c))
return ch;

View file

@ -93,7 +93,7 @@ sp_packet_input(void *opaque, th_muxstream_t *tms, th_pkt_t *pkt)
tvhlog(LOG_INFO, "serviceprobe", "Probed \"%s\" -- Ok", t->tht_svcname);
if(t->tht_ch == NULL && t->tht_svcname != NULL) {
ch = channel_find(t->tht_svcname, 1, NULL);
ch = channel_find(t->tht_svcname, 1);
transport_map_channel(t, ch);
t->tht_config_change(t);

View file

@ -558,7 +558,7 @@ transport_map_channel(th_transport_t *t, channel_t *ch)
if(ch == NULL) {
if(t->tht_chname == NULL)
return;
ch = channel_find(t->tht_chname, 1, NULL);
ch = channel_find(t->tht_chname, 1);
} else {
free(t->tht_chname);
t->tht_chname = strdup(ch->ch_name);

View file

@ -70,9 +70,8 @@ typedef struct dtimer {
*/
LIST_HEAD(th_subscription_list, th_subscription);
LIST_HEAD(channel_list, channel);
RB_HEAD(channel_tree, channel);
TAILQ_HEAD(channel_queue, channel);
TAILQ_HEAD(channel_group_queue, channel_group);
TAILQ_HEAD(th_dvb_adapter_queue, th_dvb_adapter);
LIST_HEAD(th_v4l_adapter_list, th_v4l_adapter);
LIST_HEAD(event_list, event);
@ -96,8 +95,7 @@ LIST_HEAD(autorec_list, autorec);
extern time_t dispatch_clock;
extern int startupcounter;
extern struct th_transport_list all_transports;
extern struct channel_list channels;
extern struct channel_group_queue all_channel_groups;
extern struct channel_tree channel_tree;
extern struct pvr_rec_list pvrr_global_list;
extern struct th_subscription_list subscriptions;
@ -774,32 +772,14 @@ typedef struct tt_decoder {
} tt_decoder_t;
/**
* Channel groups
*/
typedef struct channel_group {
TAILQ_ENTRY(channel_group) tcg_global_link;
const char *tcg_name;
struct channel_queue tcg_channels;
int tcg_tag;
int tcg_cant_delete_me;
int tcg_hidden;
struct autorec_list tcg_autorecs;
} channel_group_t;
/*
* Channel definition
*/
typedef struct channel {
LIST_ENTRY(channel) ch_global_link;
RB_ENTRY(channel) ch_global_link;
TAILQ_ENTRY(channel) ch_group_link;
channel_group_t *ch_group;
LIST_HEAD(, th_transport) ch_transports;
LIST_HEAD(, th_subscription) ch_subscriptions;
@ -943,7 +923,6 @@ extern const char *settings_dir;
FILE *settings_open_for_write(const char *name);
FILE *settings_open_for_read(const char *name);
extern const char *sys_warning;
extern channel_group_t *defgroup;
static inline unsigned int tvh_strhash(const char *s, unsigned int mod)
{

View file

@ -113,7 +113,7 @@ page_simple(http_connection_t *hc, http_reply_t *hr,
if(s != NULL) {
LIST_INIT(&events);
c = epg_search(&events, s, NULL, NULL, NULL);
c = epg_search(&events, s, NULL, NULL);
if(c == -1) {
htsbuf_qprintf(hq, "<b>Event title: Regular expression syntax error</b>");