Add some initial code to load/save grab module channel mappings.
This commit is contained in:
parent
c4e4c81f46
commit
ba9edf7287
3 changed files with 104 additions and 24 deletions
|
@ -1,6 +1,7 @@
|
|||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include "htsmsg.h"
|
||||
#include "settings.h"
|
||||
#include "tvheadend.h"
|
||||
|
@ -41,6 +42,8 @@ static void _epggrab_set_schedule ( int, epggrab_sched_t* );
|
|||
*/
|
||||
void epggrab_init ( void )
|
||||
{
|
||||
epggrab_module_t *m;
|
||||
|
||||
/* Defaults */
|
||||
epggrab_advanced = 0;
|
||||
epggrab_eit = 1; // on air grab enabled
|
||||
|
@ -48,11 +51,14 @@ void epggrab_init ( void )
|
|||
epggrab_module = NULL; // disabled
|
||||
|
||||
/* Initialise modules */
|
||||
LIST_INSERT_HEAD(&epggrab_modules, eit_init(), glink);
|
||||
m = eit_init();
|
||||
LIST_INSERT_HEAD(&epggrab_modules, m, glink);
|
||||
#if TODO_XMLTV_SUPPORT
|
||||
LIST_INSERT_HEAD(&epggrab_modules, xmltv_init(), glink);
|
||||
m = xmltv_init();
|
||||
LIST_INSERT_HEAD(&epggrab_modules, m, glink);
|
||||
#endif
|
||||
LIST_INSERT_HEAD(&epggrab_modules, pyepg_init(), glink);
|
||||
m = pyepg_init();
|
||||
LIST_INSERT_HEAD(&epggrab_modules, m, glink);
|
||||
|
||||
/* Start thread */
|
||||
pthread_t tid;
|
||||
|
@ -261,8 +267,43 @@ void epggrab_channel_mod ( channel_t *ch )
|
|||
}
|
||||
}
|
||||
|
||||
void epggrab_module_channels_load
|
||||
( const char *path, epggrab_channel_tree_t *tree )
|
||||
{
|
||||
uint32_t chid;
|
||||
htsmsg_t *m;
|
||||
htsmsg_field_t *f;
|
||||
epggrab_channel_t *ec;
|
||||
channel_t *ch;
|
||||
|
||||
if ((m = hts_settings_load(path))) {
|
||||
HTSMSG_FOREACH(f, m) {
|
||||
if ( !htsmsg_get_u32(m, f->hmf_name, &chid) ) {
|
||||
ch = channel_find_by_identifier(chid);
|
||||
if (ch) {
|
||||
ec = calloc(1, sizeof(epggrab_channel_t));
|
||||
ec->id = strdup(f->hmf_name);
|
||||
ec->channel = ch;
|
||||
assert(RB_INSERT_SORTED(tree, ec, glink, _ch_id_cmp) == NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void epggrab_module_channels_save
|
||||
( const char *path, epggrab_channel_tree_t *tree )
|
||||
{
|
||||
epggrab_channel_t *c;
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
RB_FOREACH(c, tree, glink) {
|
||||
if (c->channel) htsmsg_add_u32(m, c->id, c->channel->ch_id);
|
||||
}
|
||||
hts_settings_save(m, path);
|
||||
}
|
||||
|
||||
epggrab_channel_t *epggrab_module_channel_create
|
||||
( epggrab_channel_tree_t *tree, epggrab_channel_t *iskel )
|
||||
( epggrab_channel_tree_t *tree, epggrab_channel_t *iskel, int *save )
|
||||
{
|
||||
epggrab_channel_t *egc;
|
||||
static epggrab_channel_t *skel = NULL;
|
||||
|
@ -274,6 +315,7 @@ epggrab_channel_t *epggrab_module_channel_create
|
|||
skel->id = strdup(skel->id);
|
||||
skel->name = strdup(skel->name);
|
||||
skel->channel = _channel_find(skel);
|
||||
if ( skel->channel ) *save |= 1;
|
||||
egc = skel;
|
||||
skel = NULL;
|
||||
}
|
||||
|
@ -288,31 +330,37 @@ epggrab_channel_t *epggrab_module_channel_find
|
|||
return RB_FIND(tree, &skel, glink, _ch_id_cmp);
|
||||
}
|
||||
|
||||
void epggrab_module_channel_add ( epggrab_channel_tree_t *tree, channel_t *ch )
|
||||
int epggrab_module_channel_add ( epggrab_channel_tree_t *tree, channel_t *ch )
|
||||
{
|
||||
int save = 0;
|
||||
epggrab_channel_t *egc;
|
||||
RB_FOREACH(egc, tree, glink) {
|
||||
if (_channel_match(egc, ch) ) {
|
||||
save = 1;
|
||||
egc->channel = ch;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return save;
|
||||
}
|
||||
|
||||
void epggrab_module_channel_rem ( epggrab_channel_tree_t *tree, channel_t *ch )
|
||||
int epggrab_module_channel_rem ( epggrab_channel_tree_t *tree, channel_t *ch )
|
||||
{
|
||||
int save = 0;
|
||||
epggrab_channel_t *egc;
|
||||
RB_FOREACH(egc, tree, glink) {
|
||||
if (egc->channel == ch) {
|
||||
save = 1;
|
||||
egc->channel = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return save;
|
||||
}
|
||||
|
||||
void epggrab_module_channel_mod ( epggrab_channel_tree_t *tree, channel_t *ch )
|
||||
int epggrab_module_channel_mod ( epggrab_channel_tree_t *tree, channel_t *ch )
|
||||
{
|
||||
epggrab_module_channel_add(tree, ch);
|
||||
return epggrab_module_channel_add(tree, ch);
|
||||
}
|
||||
|
||||
/* **************************************************************************
|
||||
|
|
|
@ -117,11 +117,13 @@ void epggrab_channel_mod ( struct channel *ch );
|
|||
/*
|
||||
* Module specific channel handling
|
||||
*/
|
||||
void epggrab_module_channel_add ( epggrab_channel_tree_t *tree, struct channel *ch );
|
||||
void epggrab_module_channel_rem ( epggrab_channel_tree_t *tree, struct channel *ch );
|
||||
void epggrab_module_channel_mod ( epggrab_channel_tree_t *tree, struct channel *ch );
|
||||
void epggrab_module_channels_load ( const char *path, epggrab_channel_tree_t *tree );
|
||||
void epggrab_module_channels_save ( const char *path, epggrab_channel_tree_t *tree );
|
||||
int epggrab_module_channel_add ( epggrab_channel_tree_t *tree, struct channel *ch );
|
||||
int epggrab_module_channel_rem ( epggrab_channel_tree_t *tree, struct channel *ch );
|
||||
int epggrab_module_channel_mod ( epggrab_channel_tree_t *tree, struct channel *ch );
|
||||
|
||||
epggrab_channel_t *epggrab_module_channel_create ( epggrab_channel_tree_t *tree, epggrab_channel_t *ch );
|
||||
epggrab_channel_t *epggrab_module_channel_create ( epggrab_channel_tree_t *tree, epggrab_channel_t *ch, int *save );
|
||||
epggrab_channel_t *epggrab_module_channel_find ( epggrab_channel_tree_t *tree, const char *id );
|
||||
|
||||
#endif /* __EPGGRAB_H__ */
|
||||
|
|
|
@ -28,16 +28,31 @@
|
|||
#include "epggrab/pyepg.h"
|
||||
#include "channels.h"
|
||||
|
||||
epggrab_channel_tree_t _pyepg_channels;
|
||||
|
||||
/* **************************************************************************
|
||||
* Config/Load save
|
||||
* *************************************************************************/
|
||||
|
||||
static void _pyepg_load ( void )
|
||||
{
|
||||
epggrab_module_channels_load("epggrab/pyepg/channels", &_pyepg_channels);
|
||||
}
|
||||
|
||||
static void _pyepg_save ( void )
|
||||
{
|
||||
epggrab_module_channels_save("epggrab/pyepg/channels", &_pyepg_channels);
|
||||
}
|
||||
|
||||
/* **************************************************************************
|
||||
* Channels
|
||||
* *************************************************************************/
|
||||
|
||||
epggrab_channel_tree_t _pyepg_channels;
|
||||
|
||||
static channel_t *_pyepg_channel_create ( epggrab_channel_t *skel )
|
||||
static channel_t *_pyepg_channel_create ( epggrab_channel_t *skel, int *save )
|
||||
{
|
||||
epggrab_channel_t *ch
|
||||
= epggrab_module_channel_create(&_pyepg_channels, skel);
|
||||
= epggrab_module_channel_create(&_pyepg_channels, skel, save);
|
||||
if (ch) return ch->channel;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -52,17 +67,20 @@ static channel_t *_pyepg_channel_find ( const char *id )
|
|||
|
||||
static void _pyepg_channel_add ( channel_t *ch )
|
||||
{
|
||||
epggrab_module_channel_add(&_pyepg_channels, ch);
|
||||
if ( epggrab_module_channel_add(&_pyepg_channels, ch) )
|
||||
_pyepg_save();
|
||||
}
|
||||
|
||||
static void _pyepg_channel_rem ( channel_t *ch )
|
||||
{
|
||||
epggrab_module_channel_rem(&_pyepg_channels, ch);
|
||||
if ( epggrab_module_channel_rem(&_pyepg_channels, ch) )
|
||||
_pyepg_save();
|
||||
}
|
||||
|
||||
static void _pyepg_channel_mod ( channel_t *ch )
|
||||
{
|
||||
epggrab_module_channel_mod(&_pyepg_channels, ch);
|
||||
if ( epggrab_module_channel_mod(&_pyepg_channels, ch) )
|
||||
_pyepg_save();
|
||||
}
|
||||
|
||||
/* **************************************************************************
|
||||
|
@ -83,7 +101,7 @@ static int _pyepg_parse_time ( const char *str, time_t *out )
|
|||
|
||||
static int _pyepg_parse_channel ( htsmsg_t *data, epggrab_stats_t *stats )
|
||||
{
|
||||
int save = 0;
|
||||
int save = 0, save2 = 0;
|
||||
htsmsg_t *attr, *tags;
|
||||
const char *icon;
|
||||
channel_t *ch;
|
||||
|
@ -97,14 +115,23 @@ static int _pyepg_parse_channel ( htsmsg_t *data, epggrab_stats_t *stats )
|
|||
skel.name = (char*)htsmsg_xml_get_cdata_str(tags, "name");
|
||||
icon = htsmsg_xml_get_cdata_str(tags, "image");
|
||||
|
||||
ch = _pyepg_channel_create(&skel);
|
||||
ch = _pyepg_channel_create(&skel, &save2);
|
||||
stats->channels.total++;
|
||||
if (save2) {
|
||||
stats->channels.created++;
|
||||
save |= 1;
|
||||
}
|
||||
|
||||
/* Update values */
|
||||
if (ch) {
|
||||
// TODO: set the name
|
||||
//if (skel.name) save |= channel_rename(ch, skel.name);
|
||||
if (skel.name) {
|
||||
if(!ch->ch_name || strcmp(ch->ch_name, skel.name)) {
|
||||
save |= channel_rename(ch, skel.name);
|
||||
}
|
||||
}
|
||||
if (icon) channel_set_icon(ch, icon);
|
||||
}
|
||||
if (save) stats->channels.modified++;
|
||||
|
||||
return save;
|
||||
}
|
||||
|
@ -351,7 +378,7 @@ static int _pyepg_parse_schedule ( htsmsg_t *data, epggrab_stats_t *stats )
|
|||
|
||||
static int _pyepg_parse_epg ( htsmsg_t *data, epggrab_stats_t *stats )
|
||||
{
|
||||
int save = 0;
|
||||
int save = 0, chsave = 0;
|
||||
htsmsg_t *tags;
|
||||
htsmsg_field_t *f;
|
||||
|
||||
|
@ -359,7 +386,7 @@ static int _pyepg_parse_epg ( htsmsg_t *data, epggrab_stats_t *stats )
|
|||
|
||||
HTSMSG_FOREACH(f, tags) {
|
||||
if (strcmp(f->hmf_name, "channel") == 0 ) {
|
||||
save |= _pyepg_parse_channel(htsmsg_get_map_by_field(f), stats);
|
||||
chsave |= _pyepg_parse_channel(htsmsg_get_map_by_field(f), stats);
|
||||
} else if (strcmp(f->hmf_name, "brand") == 0 ) {
|
||||
save |= _pyepg_parse_brand(htsmsg_get_map_by_field(f), stats);
|
||||
} else if (strcmp(f->hmf_name, "series") == 0 ) {
|
||||
|
@ -370,6 +397,8 @@ static int _pyepg_parse_epg ( htsmsg_t *data, epggrab_stats_t *stats )
|
|||
save |= _pyepg_parse_schedule(htsmsg_get_map_by_field(f), stats);
|
||||
}
|
||||
}
|
||||
save |= chsave;
|
||||
if (chsave) _pyepg_save();
|
||||
|
||||
return save;
|
||||
}
|
||||
|
@ -460,6 +489,7 @@ epggrab_module_t* pyepg_init ( void )
|
|||
pyepg_module.ch_add = _pyepg_channel_add;
|
||||
pyepg_module.ch_rem = _pyepg_channel_rem;
|
||||
pyepg_module.ch_mod = _pyepg_channel_mod;
|
||||
_pyepg_load();
|
||||
return &pyepg_module;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue