Some updates to improve channel linking and its save/load support.
This commit is contained in:
parent
aba9000a62
commit
41267995e1
4 changed files with 59 additions and 39 deletions
|
@ -339,6 +339,7 @@ channel_rename(channel_t *ch, const char *newname)
|
|||
|
||||
RB_REMOVE(&channel_name_tree, ch, ch_name_link);
|
||||
channel_set_name(ch, newname);
|
||||
epg_mod_channel(ch);
|
||||
|
||||
LIST_FOREACH(t, &ch->ch_services, s_ch_link)
|
||||
t->s_config_save(t);
|
||||
|
|
76
src/epg.c
76
src/epg.c
|
@ -91,17 +91,10 @@ static int ptr_cmp ( void *a, void *b )
|
|||
return a - b;
|
||||
}
|
||||
|
||||
// TODO: wrong place?
|
||||
static int epg_channel_match ( epg_channel_t *ec, channel_t *ch )
|
||||
static int _epg_channel_match ( epg_channel_t *ec, channel_t *ch )
|
||||
{
|
||||
int ret = 0;
|
||||
if ( !strcmp(ec->ec_name, ch->ch_name) ) ret = 1;
|
||||
if ( ret ) {
|
||||
LIST_REMOVE(ec, ec_ulink);
|
||||
LIST_REMOVE(ch, ch_eulink);
|
||||
channel_set_epg_source(ch, ec);
|
||||
ec->ec_channel = ch;
|
||||
}
|
||||
if ( ec->ec_name && !strcmp(ec->ec_name, ch->ch_name) ) ret = 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -337,10 +330,13 @@ void epg_updated ( void )
|
|||
void epg_add_channel ( channel_t *ch )
|
||||
{
|
||||
epg_channel_t *ec;
|
||||
LIST_FOREACH(ec, &epg_unlinked_channels1, ec_ulink) {
|
||||
if ( epg_channel_match(ec, ch) ) break;
|
||||
}
|
||||
LIST_INSERT_HEAD(&epg_unlinked_channels2, ch, ch_eulink);
|
||||
LIST_FOREACH(ec, &epg_unlinked_channels1, ec_ulink) {
|
||||
if ( _epg_channel_match(ec, ch) ) {
|
||||
epg_channel_set_channel(ec, ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void epg_rem_channel ( channel_t *ch )
|
||||
|
@ -353,6 +349,11 @@ void epg_rem_channel ( channel_t *ch )
|
|||
}
|
||||
}
|
||||
|
||||
void epg_mod_channel ( channel_t *ch )
|
||||
{
|
||||
if ( !ch->ch_epg_channel ) epg_add_channel(ch);
|
||||
}
|
||||
|
||||
|
||||
/* **************************************************************************
|
||||
* Brand
|
||||
|
@ -1080,14 +1081,6 @@ epg_broadcast_t *epg_broadcast_deserialize
|
|||
* Channel
|
||||
* *************************************************************************/
|
||||
|
||||
static void _epg_channel_link ( epg_channel_t *ec )
|
||||
{
|
||||
channel_t *ch;
|
||||
LIST_FOREACH(ch, &epg_unlinked_channels2, ch_eulink) {
|
||||
if ( epg_channel_match(ec, ch) ) break;
|
||||
}
|
||||
}
|
||||
|
||||
epg_channel_t* epg_channel_find_by_uri
|
||||
( const char *id, int create, int *save )
|
||||
{
|
||||
|
@ -1132,16 +1125,42 @@ epg_channel_t *epg_channel_find_by_id ( uint32_t id )
|
|||
int epg_channel_set_name ( epg_channel_t *channel, const char *name )
|
||||
{
|
||||
int save = 0;
|
||||
channel_t *ch;
|
||||
if ( !channel || !name ) return 0;
|
||||
printf("channel %s set name %s\n", channel->ec_uri, name);
|
||||
if ( !channel->ec_name || strcmp(channel->ec_name, name) ) {
|
||||
channel->ec_name = strdup(name);
|
||||
_epg_channel_link(channel);
|
||||
// TODO: will this cope with an already linked channel?
|
||||
if ( !channel->ec_channel ) {
|
||||
LIST_FOREACH(ch, &epg_unlinked_channels2, ch_eulink) {
|
||||
if ( _epg_channel_match(channel, ch) ) {
|
||||
epg_channel_set_channel(channel, ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// TODO: should be try to override?
|
||||
save = 1;
|
||||
}
|
||||
return save;
|
||||
}
|
||||
|
||||
int epg_channel_set_channel ( epg_channel_t *ec, channel_t *ch )
|
||||
{
|
||||
int save = 0;
|
||||
if ( !ec || !ch ) return 0;
|
||||
if ( ec->ec_channel != ch ) {
|
||||
if (!ec->ec_channel) LIST_REMOVE(ec, ec_ulink);
|
||||
if (!ch->ch_epg_channel) LIST_REMOVE(ch, ch_eulink);
|
||||
// TODO: should it be possible to "change" it
|
||||
//if(ec->ec_channel)
|
||||
// channel_set_epg_source(ec->ec_channel, NULL)
|
||||
// LIST_INSERT_HEAD(&epg_unlinked_channels2, ec->ec_channel, ch_eulink);
|
||||
ec->ec_channel = ch;
|
||||
channel_set_epg_source(ch, ec);
|
||||
}
|
||||
return save;
|
||||
}
|
||||
|
||||
epg_broadcast_t *epg_channel_get_current_broadcast ( epg_channel_t *channel )
|
||||
{
|
||||
// TODO: its not really the head!
|
||||
|
@ -1155,6 +1174,8 @@ htsmsg_t *epg_channel_serialize ( epg_channel_t *channel )
|
|||
if (!channel || !channel->ec_uri) return NULL;
|
||||
m = htsmsg_create_map();
|
||||
htsmsg_add_str(m, "uri", channel->ec_uri);
|
||||
if (channel->ec_name)
|
||||
htsmsg_add_str(m, "name", channel->ec_name);
|
||||
if (channel->ec_channel)
|
||||
htsmsg_add_u32(m, "channel", channel->ec_channel->ch_id);
|
||||
// TODO: other data
|
||||
|
@ -1164,19 +1185,20 @@ htsmsg_t *epg_channel_serialize ( epg_channel_t *channel )
|
|||
epg_channel_t *epg_channel_deserialize ( htsmsg_t *m, int create, int *save )
|
||||
{
|
||||
epg_channel_t *ec;
|
||||
#if TODO_CHANNEL_LINK
|
||||
channel_t *ch;
|
||||
uint32_t u32;
|
||||
#endif
|
||||
const char *str;
|
||||
|
||||
if ( !(str = htsmsg_get_str(m, "uri")) ) return NULL;
|
||||
if ( !(ec = epg_channel_find_by_uri(str, create, save)) ) return NULL;
|
||||
|
||||
#if TODO_CHANNEL_LINK
|
||||
if ( (str = htsmsg_get_str(m, "name")) )
|
||||
*save |= epg_channel_set_name(ec, str);
|
||||
|
||||
if ( !htsmsg_get_u32(m, "channel", &u32) )
|
||||
if ( (ch = channel_find_by_identifier(u32)) )
|
||||
#endif
|
||||
epg_channel_set_channel(ec, ch);
|
||||
// TODO: this call needs updating
|
||||
|
||||
return ec;
|
||||
}
|
||||
|
@ -1205,7 +1227,7 @@ static void _eqr_add_channel
|
|||
// TODO: add other searching
|
||||
epg_broadcast_t *ebc;
|
||||
RB_FOREACH(ebc, &ec->ec_schedule, eb_slink) {
|
||||
if ( ebc->eb_episode ) _eqr_add(eqr, ebc);
|
||||
if ( ebc->eb_episode && ebc->eb_channel ) _eqr_add(eqr, ebc);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -289,6 +289,7 @@ epg_channel_t *epg_channel_find_by_id ( uint32_t id );
|
|||
/* Mutators */
|
||||
int epg_channel_set_name ( epg_channel_t *c, const char *n )
|
||||
__attribute__((warn_unused_result));
|
||||
int epg_channel_set_channel ( epg_channel_t *c, channel_t *ch );
|
||||
|
||||
/* Accessors */
|
||||
epg_broadcast_t *epg_channel_get_current_broadcast ( epg_channel_t *c );
|
||||
|
@ -341,6 +342,7 @@ void epg_updated ( void );
|
|||
*/
|
||||
void epg_add_channel ( channel_t *ch );
|
||||
void epg_rem_channel ( channel_t *ch );
|
||||
void epg_mod_channel ( channel_t *ch );
|
||||
|
||||
/*
|
||||
* Simple lookup
|
||||
|
|
|
@ -672,8 +672,7 @@ extjs_epg(http_connection_t *hc, const char *remain, void *opaque)
|
|||
epg_query_result_t eqr;
|
||||
epg_broadcast_t *e;
|
||||
epg_episode_t *ee = NULL;
|
||||
//epg_season_t *es = NULL;
|
||||
//epg_brand_t *eb = NULL;
|
||||
channel_t *ch;
|
||||
int start = 0, end, limit, i;
|
||||
const char *s;
|
||||
char buf[100];
|
||||
|
@ -709,21 +708,17 @@ extjs_epg(http_connection_t *hc, const char *remain, void *opaque)
|
|||
end = MIN(start + limit, eqr.eqr_entries);
|
||||
|
||||
for(i = start; i < end; i++) {
|
||||
|
||||
e = eqr.eqr_array[i];
|
||||
ee = e->eb_episode;
|
||||
ch = e->eb_channel->ec_channel;
|
||||
if (!ch||!ee) continue;
|
||||
|
||||
m = htsmsg_create_map();
|
||||
|
||||
if(e->eb_channel != NULL) {
|
||||
// TODO: this should probably be the real channel!
|
||||
htsmsg_add_str(m, "channel", e->eb_channel->ec_name);
|
||||
#if TODO_ADD_FULL_CHANNEL_INFO
|
||||
htsmsg_add_u32(m, "channelid", e->e_channel->ch_id);
|
||||
if(e->e_channel->ch_icon != NULL)
|
||||
htsmsg_add_str(m, "chicon", e->e_channel->ch_icon);
|
||||
#endif
|
||||
}
|
||||
htsmsg_add_str(m, "channel", ch->ch_name);
|
||||
htsmsg_add_u32(m, "channelid", ch->ch_id);
|
||||
if(ch->ch_icon != NULL)
|
||||
htsmsg_add_str(m, "chicon", ch->ch_icon);
|
||||
|
||||
if(ee->ee_title != NULL)
|
||||
htsmsg_add_str(m, "title", ee->ee_title);
|
||||
|
|
Loading…
Add table
Reference in a new issue