Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
epggrab: allow updating channel name/number/icon Allow epg grabber to…
… update channel name, number, and/or icon if "Update Channel name", "Update channel number", and/or "Update channel icon" are set in "EPG Grabber" -> "General Config".
  • Loading branch information
bfennema authored and perexg committed Mar 22, 2015
1 parent ac3599b commit 5e7efab
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 34 deletions.
40 changes: 39 additions & 1 deletion src/channels.c
@@ -1,6 +1,6 @@
/*
* tvheadend, channel functions
* Copyright (C) 2007 Andreas Öman
* Copyright (C) 2007 Andreas Öman
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -587,6 +587,19 @@ channel_get_name ( channel_t *ch )
return blank;
}

int
channel_set_name ( channel_t *ch, const char *name )
{
int save = 0;
if (!ch || !name) return 0;
if (!ch->ch_name || strcmp(ch->ch_name, name) ) {
if (ch->ch_name) free(ch->ch_name);
ch->ch_name = strdup(name);
save = 1;
}
return save;
}

int64_t
channel_get_number ( channel_t *ch )
{
Expand All @@ -611,6 +624,19 @@ channel_get_number ( channel_t *ch )
return 0;
}

int
channel_set_number ( channel_t *ch, uint32_t major, uint32_t minor )
{
int save = 0;
int64_t chnum = (uint64_t)major * CHANNEL_SPLIT + (uint64_t)minor;
if (!ch || !chnum) return 0;
if (!ch->ch_number || ch->ch_number != chnum) {
ch->ch_number = chnum;
save = 1;
}
return save;
}

static int
check_file( const char *url )
{
Expand Down Expand Up @@ -738,6 +764,18 @@ channel_get_icon ( channel_t *ch )
return buf;
}

int channel_set_icon ( channel_t *ch, const char *icon )
{
int save = 0;
if (!ch || !icon) return 0;
if (!ch->ch_icon || strcmp(ch->ch_icon, icon) ) {
if (ch->ch_icon) free(ch->ch_icon);
ch->ch_icon = strdup(icon);
save = 1;
}
return save;
}

/* **************************************************************************
* Creation/Deletion
* *************************************************************************/
Expand Down
5 changes: 3 additions & 2 deletions src/channels.h
@@ -1,6 +1,6 @@
/*
* tvheadend, channel functions
* Copyright (C) 2007 Andreas Öman
* Copyright (C) 2007 Andreas Öman
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -190,14 +190,15 @@ int channel_tag_access(channel_tag_t *ct, struct access *a, int disabled);
void channel_save(channel_t *ch);

const char *channel_get_name ( channel_t *ch );
int channel_set_name ( channel_t *ch, const char *s );
int channel_set_name ( channel_t *ch, const char *name );

#define CHANNEL_SPLIT 1000000

static inline uint32_t channel_get_major ( int64_t chnum ) { return chnum / CHANNEL_SPLIT; }
static inline uint32_t channel_get_minor ( int64_t chnum ) { return chnum % CHANNEL_SPLIT; }

int64_t channel_get_number ( channel_t *ch );
int channel_set_number ( channel_t *ch, uint32_t major, uint32_t minor );

const char *channel_get_icon ( channel_t *ch );
int channel_set_icon ( channel_t *ch, const char *icon );
Expand Down
7 changes: 4 additions & 3 deletions src/epggrab.h
Expand Up @@ -83,8 +83,9 @@ typedef struct epggrab_channel

char *name; ///< Channel name
char *icon; ///< Channel icon
int number; ///< Channel number

int major; ///< Channel major number
int minor; ///< Channel minor number

LIST_HEAD(,epggrab_channel_link) channels; ///< Mapped channels
} epggrab_channel_t;

Expand All @@ -107,7 +108,7 @@ htsmsg_t* epggrab_channel_list ( int ota );
*/
int epggrab_channel_set_name ( epggrab_channel_t *ch, const char *name );
int epggrab_channel_set_icon ( epggrab_channel_t *ch, const char *icon );
int epggrab_channel_set_number ( epggrab_channel_t *ch, int number );
int epggrab_channel_set_number ( epggrab_channel_t *ch, int major, int minor );

/*
* Updated/link
Expand Down
46 changes: 24 additions & 22 deletions src/epggrab/channel.c
Expand Up @@ -59,6 +59,7 @@ epggrab_channel_link_delete
int
epggrab_channel_link ( epggrab_channel_t *ec, channel_t *ch )
{
int save = 0;
epggrab_channel_link_t *ecl;

/* No change */
Expand All @@ -80,14 +81,14 @@ epggrab_channel_link ( epggrab_channel_t *ec, channel_t *ch )
ecl->ecl_epggrab = ec;
LIST_INSERT_HEAD(&ec->channels, ecl, ecl_epg_link);
LIST_INSERT_HEAD(&ch->ch_epggrab, ecl, ecl_chn_link);
#if TODO_CHAN_UPDATE
if (ec->name && epggrab_channel_rename)
channel_rename(ch, ec->name);
if (ec->number>0 && epggrab_channel_renumber)
channel_set_number(ch, ec->number);
save |= channel_set_name(ch, ec->name);
if ((ec->major > 0 || ec->minor > 0) && epggrab_channel_renumber)
save |= channel_set_number(ch, ec->major, ec->minor);
if (ec->icon && epggrab_channel_reicon)
channel_set_icon(ch, ec->icon);
#endif
save |= channel_set_icon(ch, ec->icon);
if (save)
channel_save(ch);

/* Save */
if (ec->mod->ch_save) ec->mod->ch_save(ec->mod, ec);
Expand All @@ -111,13 +112,13 @@ int epggrab_channel_set_name ( epggrab_channel_t *ec, const char *name )
if (!ec->name || strcmp(ec->name, name)) {
if (ec->name) free(ec->name);
ec->name = strdup(name);
#if TODO_CHAN_UPDATE
if (epggrab_channel_rename) {
epggrab_channel_link_t *ecl;
LIST_FOREACH(ecl, &ec->channels, link)
channel_rename(ecl->channel, name);
LIST_FOREACH(ecl, &ec->channels, ecl_epg_link) {
if (channel_set_name(ecl->ecl_channel, name))
channel_save(ecl->ecl_channel);
}
}
#endif
save = 1;
}
return save;
Expand All @@ -131,32 +132,33 @@ int epggrab_channel_set_icon ( epggrab_channel_t *ec, const char *icon )
if (!ec->icon || strcmp(ec->icon, icon) ) {
if (ec->icon) free(ec->icon);
ec->icon = strdup(icon);
#if TODO_CHAN_UPDATE
if (epggrab_channel_reicon) {
epggrab_channel_link_t *ecl;
LIST_FOREACH(ecl, &ec->channels, link)
channel_set_icon(ecl->channel, icon);
LIST_FOREACH(ecl, &ec->channels, ecl_epg_link) {
if (channel_set_icon(ecl->ecl_channel, icon))
channel_save(ecl->ecl_channel);
}
}
#endif
save = 1;
}
return save;
}

/* Set channel number */
int epggrab_channel_set_number ( epggrab_channel_t *ec, int number )
int epggrab_channel_set_number ( epggrab_channel_t *ec, int major, int minor )
{
int save = 0;
if (!ec || (number <= 0)) return 0;
if (ec->number != number) {
ec->number = number;
#if TODO_CHAN_UPDATE
if (!ec || (major <= 0 && minor <= 0)) return 0;
if (ec->major != major || ec->minor != minor) {
ec->major = major;
ec->minor = minor;
if (epggrab_channel_renumber) {
epggrab_channel_link_t *ecl;
LIST_FOREACH(ecl, &ec->channels, link)
channel_set_number(ecl->channel, number);
LIST_FOREACH(ecl, &ec->channels, ecl_epg_link) {
if (channel_set_number(ecl->ecl_channel, major, minor))
channel_save(ecl->ecl_channel);
}
}
#endif
save = 1;
}
return save;
Expand Down
12 changes: 8 additions & 4 deletions src/epggrab/module.c
Expand Up @@ -163,8 +163,10 @@ void epggrab_module_ch_save ( void *_m, epggrab_channel_t *ch )
htsmsg_add_str(a, NULL, channel_get_uuid(ecl->ecl_channel));
}
if (a) htsmsg_add_msg(m, "channels", a);
if (ch->number)
htsmsg_add_u32(m, "number", ch->number);
if (ch->major)
htsmsg_add_u32(m, "major", ch->major);
if (ch->minor)
htsmsg_add_u32(m, "major", ch->minor);

hts_settings_save(m, "epggrab/%s/channels/%s", mod->id, ch->id);
htsmsg_destroy(m);
Expand Down Expand Up @@ -208,8 +210,10 @@ static void _epggrab_module_channel_load
egc->name = strdup(str);
if ((str = htsmsg_get_str(m, "icon")))
egc->icon = strdup(str);
if(!htsmsg_get_u32(m, "number", &u32))
egc->number = u32;
if(!htsmsg_get_u32(m, "major", &u32))
egc->major = u32;
if(!htsmsg_get_u32(m, "minor", &u32))
egc->minor = u32;
if ((a = htsmsg_get_list(m, "channels"))) {
HTSMSG_FOREACH(f, a) {
if ((str = htsmsg_field_get_str(f))) {
Expand Down
2 changes: 1 addition & 1 deletion src/epggrab/module/opentv.c
Expand Up @@ -498,7 +498,7 @@ opentv_desc_channels

if (!ecl)
epggrab_channel_link(ec, ch);
save |= epggrab_channel_set_number(ec, cnum);
save |= epggrab_channel_set_number(ec, cnum, 0);
}
i += 9;
}
Expand Down
2 changes: 1 addition & 1 deletion src/epggrab/module/pyepg.c
Expand Up @@ -94,7 +94,7 @@ static int _pyepg_parse_channel
if ((str = htsmsg_xml_get_cdata_str(tags, "image")))
save |= epggrab_channel_set_icon(ch, str);
if ((!htsmsg_xml_get_cdata_u32(tags, "number", &u32)))
save |= epggrab_channel_set_number(ch, u32);
save |= epggrab_channel_set_number(ch, u32, 0);

/* Update */
if (save) {
Expand Down

0 comments on commit 5e7efab

Please sign in to comment.