Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
epggrab: EPG channel mapping - move to idnode interface, fixes #3188
  • Loading branch information
perexg committed Oct 22, 2015
1 parent cf03d9a commit 628a114
Show file tree
Hide file tree
Showing 18 changed files with 410 additions and 298 deletions.
22 changes: 11 additions & 11 deletions src/api/api_epggrab.c
Expand Up @@ -22,17 +22,14 @@
#include "api.h"
#include "epggrab.h"

static int
api_epggrab_channel_list
( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp )
static void
api_epggrab_channel_grid
( access_t *perm, idnode_set_t *ins, api_idnode_grid_conf_t *conf, htsmsg_t *args )
{
htsmsg_t *m;
pthread_mutex_lock(&global_lock);
m = epggrab_channel_list(0);
pthread_mutex_unlock(&global_lock);
*resp = htsmsg_create_map();
htsmsg_add_msg(*resp, "entries", m);
return 0;
epggrab_channel_t *ec;

TAILQ_FOREACH(ec, &epggrab_channel_entries, all_link)
idnode_set_add(ins, (idnode_t*)ec, &conf->filter, perm->aa_lang_ui);
}

static int
Expand Down Expand Up @@ -73,7 +70,10 @@ api_epggrab_ota_trigger
void api_epggrab_init ( void )
{
static api_hook_t ah[] = {
{ "epggrab/channel/list", ACCESS_ANONYMOUS, api_epggrab_channel_list, NULL },
{ "epggrab/channel/list", ACCESS_ANONYMOUS, api_idnode_load_by_class, (void*)&epggrab_channel_class },
{ "epggrab/channel/class", ACCESS_ADMIN, api_idnode_class, (void*)&epggrab_channel_class },
{ "epggrab/channel/grid", ACCESS_ADMIN, api_idnode_grid, api_epggrab_channel_grid },

{ "epggrab/module/list", ACCESS_ADMIN, api_epggrab_module_list, NULL },
{ "epggrab/config/load", ACCESS_ADMIN, api_idnode_load_simple, &epggrab_conf.idnode },
{ "epggrab/config/save", ACCESS_ADMIN, api_idnode_save_simple, &epggrab_conf.idnode },
Expand Down
42 changes: 5 additions & 37 deletions src/channels.c
Expand Up @@ -233,48 +233,16 @@ static const void *
channel_class_epggrab_get ( void *o )
{
channel_t *ch = o;
htsmsg_t *l = htsmsg_create_list();
epggrab_channel_link_t *ecl;
LIST_FOREACH(ecl, &ch->ch_epggrab, ecl_chn_link) {
if (!epggrab_channel_is_ota(ecl->ecl_epggrab))
htsmsg_add_str(l, NULL, epggrab_channel_get_id(ecl->ecl_epggrab));
}
return l;
return idnode_list_get2(&ch->ch_epggrab);
}

static int
channel_class_epggrab_set ( void *o, const void *v )
{
int save = 0;
channel_t *ch = o;
htsmsg_t *l = (htsmsg_t*)v;
htsmsg_field_t *f;
epggrab_channel_t *ec;
epggrab_channel_link_t *ecl, *n;

/* mark for deletion */
LIST_FOREACH(ecl, &ch->ch_epggrab, ecl_chn_link) {
if (!epggrab_channel_is_ota(ecl->ecl_epggrab))
ecl->ecl_mark = 1;
}

/* Link */
if (l) {
HTSMSG_FOREACH(f, l) {
if ((ec = epggrab_channel_find_by_id(htsmsg_field_get_str(f))))
save |= epggrab_channel_link(ec, ch);
}
}

/* Delete */
for (ecl = LIST_FIRST(&ch->ch_epggrab); ecl != NULL; ecl = n) {
n = LIST_NEXT(ecl, ecl_chn_link);
if (ecl->ecl_mark) {
epggrab_channel_link_delete(ecl, 1);
save = 1;
}
}
return save;
return idnode_list_set2(&ch->ch_id, &ch->ch_epggrab,
&epggrab_channel_class, (htsmsg_t *)v,
epggrab_channel_map);
}

static htsmsg_t *
Expand All @@ -283,7 +251,7 @@ channel_class_epggrab_list ( void *o, const char *lang )
htsmsg_t *e, *m = htsmsg_create_map();
htsmsg_add_str(m, "type", "api");
htsmsg_add_str(m, "uri", "epggrab/channel/list");
htsmsg_add_str(m, "event", "epggrabchannel");
htsmsg_add_str(m, "event", "epggrab_channel");
e = htsmsg_create_map();
htsmsg_add_bool(e, "enum", 1);
htsmsg_add_msg(m, "params", e);
Expand Down
4 changes: 2 additions & 2 deletions src/channels.h
Expand Up @@ -50,7 +50,7 @@ typedef struct channel
/* Channel info */
int ch_enabled;
int ch_autoname;
char *ch_name; // Note: do not access directly!
char *ch_name; /* Note: do not access directly! */
int64_t ch_number;
char *ch_icon;
idnode_list_head_t ch_ctms;
Expand All @@ -69,7 +69,7 @@ typedef struct channel
gtimer_t ch_epg_timer_current;

int ch_epgauto;
LIST_HEAD(,epggrab_channel_link) ch_epggrab;
idnode_list_head_t ch_epggrab; /* 1 = epggrab channel, 2 = channel */

/* DVR */
int ch_dvr_extra_time_pre;
Expand Down
37 changes: 36 additions & 1 deletion src/config.c
Expand Up @@ -32,6 +32,7 @@
#include "avahi.h"
#include "url.h"
#include "satip/server.h"
#include "channels.h"

#include <netinet/ip.h>

Expand Down Expand Up @@ -1346,6 +1347,39 @@ config_migrate_v22 ( void )
}
}

/*
* v21 -> v23 : epggrab xmltv channels
*/
static void
config_migrate_v23 ( void )
{
htsmsg_t *c, *m, *n;
htsmsg_field_t *f;
uint32_t maj, min;
int64_t num;
tvh_uuid_t u;

if ((c = hts_settings_load_r(1, "epggrab/xmltv/channels")) != NULL) {
HTSMSG_FOREACH(f, c) {
m = htsmsg_field_get_map(f);
n = htsmsg_copy(m);
htsmsg_add_str(n, "id", f->hmf_name);
maj = htsmsg_get_u32_or_default(m, "major", 0);
min = htsmsg_get_u32_or_default(m, "minor", 0);
num = (maj * CHANNEL_SPLIT) + min;
if (num > 0)
htsmsg_add_s64(n, "lcn", num);
htsmsg_delete_field(n, "major");
htsmsg_delete_field(n, "minor");
uuid_init_hex(&u, NULL);
hts_settings_remove("epggrab/xmltv/channels/%s", f->hmf_name);
hts_settings_save(n, "epggrab/xmltv/channels/%s", u.hex);
htsmsg_destroy(n);
}
htsmsg_destroy(c);
}
}



/*
Expand Down Expand Up @@ -1466,7 +1500,8 @@ static const config_migrate_t config_migrate_table[] = {
config_migrate_v19,
config_migrate_v20,
config_migrate_v21,
config_migrate_v22
config_migrate_v22,
config_migrate_v23
};

/*
Expand Down
7 changes: 5 additions & 2 deletions src/epggrab.c
Expand Up @@ -355,6 +355,8 @@ void epggrab_init ( void )
pthread_mutex_init(&epggrab_mutex, NULL);
pthread_cond_init(&epggrab_cond, NULL);

epggrab_channel_init();

/* Initialise modules */
#if ENABLE_MPEGTS
eit_init();
Expand Down Expand Up @@ -395,12 +397,12 @@ void epggrab_done ( void )
pthread_mutex_unlock(&global_lock);
if (mod->done)
mod->done(mod);
pthread_mutex_lock(&global_lock);
epggrab_channel_flush(mod->channels, 0);
free((void *)mod->id);
free((void *)mod->name);
free(mod);
pthread_mutex_lock(&global_lock);
}
pthread_mutex_unlock(&global_lock);
epggrab_ota_shutdown();
eit_done();
opentv_done();
Expand All @@ -413,4 +415,5 @@ void epggrab_done ( void )
free(epggrab_conf.ota_cron);
epggrab_conf.ota_cron = NULL;
epggrab_channel_done();
pthread_mutex_unlock(&global_lock);
}
39 changes: 17 additions & 22 deletions src/epggrab.h
Expand Up @@ -39,6 +39,7 @@ LIST_HEAD(epggrab_module_list, epggrab_module);
typedef struct epggrab_module_list epggrab_module_list_t;

struct mpegts_mux;
struct channel;

/* **************************************************************************
* Grabber Stats
Expand Down Expand Up @@ -71,37 +72,34 @@ typedef struct epggrab_stats
RB_HEAD(epggrab_channel_tree, epggrab_channel);
typedef struct epggrab_channel_tree epggrab_channel_tree_t;

TAILQ_HEAD(epggrab_channel_queue, epggrab_channel);

/*
* Grab channel
*/
typedef struct epggrab_channel
{
RB_ENTRY(epggrab_channel) link; ///< Global link
idnode_t idnode;
TAILQ_ENTRY(epggrab_channel) all_link; ///< Global link
RB_ENTRY(epggrab_channel) link; ///< Global tree link
epggrab_channel_tree_t *tree; ///< Member of this tree
epggrab_module_t *mod; ///< Linked module

int enabled; ///< Enabled/disabled
char *id; ///< Grabber's ID

char *name; ///< Channel name
char *icon; ///< Channel icon
int major; ///< Channel major number
int minor; ///< Channel minor number
char *comment; ///< Channel comment (EPG)
int64_t lcn; ///< Channel number (split)

LIST_HEAD(,epggrab_channel_link) channels; ///< Mapped channels
idnode_list_head_t channels; ///< Mapped channels (1 = epggrab channel, 2 = channel)
} epggrab_channel_t;

typedef struct epggrab_channel_link
{
int ecl_mark;
struct channel *ecl_channel;
struct epggrab_channel *ecl_epggrab;
LIST_ENTRY(epggrab_channel_link) ecl_chn_link;
LIST_ENTRY(epggrab_channel_link) ecl_epg_link;
} epggrab_channel_link_t;

/*
* Access functions
*/
htsmsg_t* epggrab_channel_list ( int ota );
htsmsg_t *epggrab_channel_list ( int ota );

/*
* Mutators
Expand All @@ -114,8 +112,9 @@ int epggrab_channel_set_number ( epggrab_channel_t *ch, int major, int minor )
* Updated/link
*/
void epggrab_channel_updated ( epggrab_channel_t *ch );
void epggrab_channel_link_delete ( epggrab_channel_link_t *ecl, int delconf );
int epggrab_channel_link ( epggrab_channel_t *ec, struct channel *ch );
void epggrab_channel_link_delete ( epggrab_channel_t *ec, struct channel *ch, int delconf );
int epggrab_channel_link ( epggrab_channel_t *ec, struct channel *ch, void *origin );
int epggrab_channel_map ( idnode_t *ec, idnode_t *ch, void *origin );

/* ID */
const char *epggrab_channel_get_id ( epggrab_channel_t *ch );
Expand Down Expand Up @@ -155,12 +154,6 @@ struct epggrab_module

/* Free */
void (*done) ( void *m );

/* Channel listings */
void (*ch_add) ( void *m, struct channel *ch );
void (*ch_rem) ( void *m, struct channel *ch );
void (*ch_mod) ( void *m, struct channel *ch );
void (*ch_save) ( void *m, epggrab_channel_t *ch );
};

/*
Expand Down Expand Up @@ -278,6 +271,8 @@ extern const idclass_t epggrab_class_mod;
extern const idclass_t epggrab_class_mod_int;
extern const idclass_t epggrab_class_mod_ext;
extern const idclass_t epggrab_class_mod_ota;
extern const idclass_t epggrab_channel_class;
extern struct epggrab_channel_queue epggrab_channel_entries;

/*
* Access the Module list
Expand Down

0 comments on commit 628a114

Please sign in to comment.