Add support for genre mapping in opentv. Fixes #14.

This commit is contained in:
Adam Sutton 2012-07-02 12:35:38 +01:00
parent dfc5c30c3c
commit 689d381fc7
3 changed files with 342 additions and 1 deletions

View file

@ -0,0 +1,258 @@
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
166,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
80,
85,
80,
80,
84,
81,
84,
80,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
16,
18,
20,
17,
16,
49,
19,
21,
16,
51,
165,
144,
123,
167,
161,
16,
112,
160,
160,
34,
16,
36,
160,
163,
117,
102,
101,
0,
0,
0,
0,
0,
96,
98,
99,
96,
100,
101,
97,
96,
96,
96,
96,
96,
96,
0,
0,
0,
96,
0,
0,
0,
0,
96,
96,
96,
96,
96,
96,
0,
0,
0,
0,
0,
32,
32,
32,
32,
131,
144,
32,
128,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
32,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
16,
18,
16,
16,
20,
16,
16,
16,
19,
17,
19,
22,
16,
16,
18,
23,
19,
24,
18,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
64,
69,
70,
69,
69,
64,
69,
64,
67,
64,
69,
71,
74,
69,
74,
73,
64,
68,
75,
64,
64,
64,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
]

View file

@ -1,6 +1,7 @@
{
"name": "Sky UK",
"dict": "skyeng",
"genre": "skyuk",
"nid": 2,
"tsid": 2004,
"sid": 4152,

View file

@ -119,6 +119,13 @@ typedef struct opentv_dict
RB_ENTRY(opentv_dict) h_link;
} opentv_dict_t;
typedef struct opentv_genre
{
char *id;
uint8_t map[256];
RB_ENTRY(opentv_genre) h_link;
} opentv_genre_t;
/* Provider configuration */
typedef struct opentv_module_t
{
@ -131,13 +138,14 @@ typedef struct opentv_module_t
int *title;
int *summary;
opentv_dict_t *dict;
opentv_genre_t *genre;
} opentv_module_t;
/*
* Dictionary list
*/
RB_HEAD(, opentv_dict) _opentv_dicts;
RB_HEAD(, opentv_dict) _opentv_dicts;
static int _dict_cmp ( void *a, void *b )
{
@ -151,6 +159,23 @@ static opentv_dict_t *_opentv_dict_find ( const char *id )
return RB_FIND(&_opentv_dicts, &skel, h_link, _dict_cmp);
}
/*
* Genre mapping list
*/
RB_HEAD(, opentv_genre) _opentv_genres;
static int _genre_cmp ( void *a, void *b )
{
return strcmp(((opentv_genre_t*)a)->id, ((opentv_genre_t*)b)->id);
}
static opentv_genre_t *_opentv_genre_find ( const char *id )
{
opentv_genre_t skel;
skel.id = (char*)id;
return RB_FIND(&_opentv_genres, &skel, h_link, _genre_cmp);
}
/* ************************************************************************
* EPG Object wrappers
* ***********************************************************************/
@ -258,6 +283,8 @@ static int _opentv_parse_event_record
ev->stop = (((int)buf[4] << 9) | (buf[5] << 1))
+ ev->start;
ev->cat = buf[6];
if (prov->genre)
ev->cat = prov->genre->map[ev->cat];
if (!ev->title)
ev->title = _opentv_parse_string(prov, buf+9, rlen-7);
break;
@ -720,6 +747,44 @@ static int* _pid_list_to_array ( htsmsg_t *m )
return ret;
}
static int _opentv_genre_load_one ( const char *id, htsmsg_t *m )
{
htsmsg_field_t *f;
opentv_genre_t *genre = calloc(1, sizeof(opentv_genre_t));
genre->id = (char*)id;
if (RB_INSERT_SORTED(&_opentv_genres, genre, h_link, _genre_cmp)) {
tvhlog(LOG_DEBUG, "opentv", "ignore duplicate genre map %s", id);
free(genre);
return 0;
} else {
genre->id = strdup(id);
int i = 0;
HTSMSG_FOREACH(f, m) {
genre->map[i] = (uint8_t)f->hmf_s64;
if (++i == 256) break;
}
}
return 1;
}
static void _opentv_genre_load ( htsmsg_t *m )
{
int r;
htsmsg_t *e;
htsmsg_field_t *f;
HTSMSG_FOREACH(f, m) {
if ((e = htsmsg_get_list(m, f->hmf_name))) {
if ((r = _opentv_genre_load_one(f->hmf_name, e))) {
if (r > 0)
tvhlog(LOG_INFO, "opentv", "genre map %s loaded", f->hmf_name);
else
tvhlog(LOG_WARNING, "opentv", "genre map %s failed", f->hmf_name);
}
}
}
htsmsg_destroy(m);
}
static int _opentv_dict_load_one ( const char *id, htsmsg_t *m )
{
opentv_dict_t *dict = calloc(1, sizeof(opentv_dict_t));
@ -766,6 +831,7 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
uint32_t tsid, sid, nid;
const char *str, *name;
opentv_dict_t *dict;
opentv_genre_t *genre;
opentv_module_t *mod;
/* Check config */
@ -779,6 +845,14 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
if (htsmsg_get_u32(m, "tsid", &tsid)) return -1;
if (htsmsg_get_u32(m, "sid", &sid)) return -1;
/* Genre map (optional) */
str = htsmsg_get_str(m, "genre");
if (str)
genre = _opentv_genre_find(str);
else
genre = NULL;
/* Exists (we expect some duplicates due to config layout) */
sprintf(ibuf, "opentv-%s", id);
if (epggrab_module_find_by_id(ibuf)) return 0;
@ -793,6 +867,7 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
/* Add provider details */
mod->dict = dict;
mod->genre = genre;
mod->nid = nid;
mod->tsid = tsid;
mod->sid = sid;
@ -839,6 +914,13 @@ void opentv_init ( void )
_opentv_dict_load(m);
tvhlog(LOG_INFO, "opentv", "dictonaries loaded");
/* Load genres */
if ((m = hts_settings_load("epggrab/opentv/genre")))
_opentv_genre_load(m);
if ((m = hts_settings_load("%s/data/epggrab/opentv/genre", dr)))
_opentv_genre_load(m);
tvhlog(LOG_INFO, "opentv", "genre maps loaded");
/* Load providers */
if ((m = hts_settings_load("epggrab/opentv/prov")))
_opentv_prov_load(m);