Add support for genre mapping in opentv. Fixes #14.
This commit is contained in:
parent
dfc5c30c3c
commit
689d381fc7
3 changed files with 342 additions and 1 deletions
258
data/epggrab/opentv/genre/skyuk
Normal file
258
data/epggrab/opentv/genre/skyuk
Normal 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
|
||||
]
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"name": "Sky UK",
|
||||
"dict": "skyeng",
|
||||
"genre": "skyuk",
|
||||
"nid": 2,
|
||||
"tsid": 2004,
|
||||
"sid": 4152,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue