Remove the conecpt of channel groups, it's too inflexible
This commit is contained in:
parent
860d58013b
commit
e7e4b9f710
21 changed files with 107 additions and 322 deletions
2
Makefile
2
Makefile
|
@ -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
|
||||
|
||||
|
|
23
autorec.c
23
autorec.c
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
2
avgen.c
2
avgen.c
|
@ -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));
|
||||
|
||||
|
|
282
channels.c
282
channels.c
|
@ -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);
|
||||
}
|
||||
|
|
14
channels.h
14
channels.h
|
@ -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
22
epg.c
|
@ -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
3
epg.h
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
18
htsp.c
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
3
main.c
|
@ -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
2
pvr.c
|
@ -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
4
rpc.c
|
@ -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
2
rtsp.c
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
27
tvhead.h
27
tvhead.h
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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>");
|
||||
|
|
Loading…
Add table
Reference in a new issue