From fdf36d2b818061f2d3266f2d632d42e8943b304b Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Mon, 28 May 2012 16:43:14 +0100 Subject: [PATCH] Started work on re-introducing EIT data. --- Makefile | 3 +- src/dvb/dvb_tables.c | 76 ++++++++++------------------------ src/epggrab/eit.c | 98 ++++++++++++++++++++++++++++++++++++++++++++ src/epggrab/eit.h | 31 ++++++++++++++ 4 files changed, 153 insertions(+), 55 deletions(-) create mode 100644 src/epggrab/eit.c create mode 100644 src/epggrab/eit.h diff --git a/Makefile b/Makefile index 37088972..882dbe94 100644 --- a/Makefile +++ b/Makefile @@ -74,7 +74,8 @@ SRCS = src/main.c \ src/avc.c \ SRCS += src/epggrab/pyepg.c\ - src/epggrab/xmltv.c + src/epggrab/xmltv.c\ + src/epggrab/eit.c diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index da08b54e..4852add6 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -41,6 +41,7 @@ #include "psi.h" #include "notify.h" #include "cwc.h" +#include "epggrab/eit.h" static void dvb_table_add_pmt(th_dvb_mux_instance_t *tdmi, int pmt_pid); @@ -325,7 +326,6 @@ tdt_add(th_dvb_mux_instance_t *tdmi, struct dmx_sct_filter_params *fparams, /** * DVB Descriptor; Short Event */ -#if TODO static int dvb_desc_short_event(uint8_t *ptr, int len, char *title, size_t titlelen, @@ -409,7 +409,6 @@ dvb_desc_extended_event(uint8_t *ptr, int len, return 0; } -#endif /** @@ -448,7 +447,6 @@ static int dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, uint8_t tableid, void *opaque) { -#ifdef TODO_EIT_GRABBER service_t *t; channel_t *ch; th_dvb_adapter_t *tda = tdmi->tdmi_adapter; @@ -459,6 +457,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, uint16_t event_id; time_t start_time, stop_time; + int ok; int duration; int dllen; uint8_t dtag, dlen; @@ -509,6 +508,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, return 0; while(len >= 12) { + ok = 1; event_id = ptr[0] << 8 | ptr[1]; start_time = dvb_convert_date(&ptr[2]); duration = bcdtoint(ptr[7] & 0xff) * 3600 + @@ -519,25 +519,9 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, len -= 12; ptr += 12; - if(dllen > len) - break; + if(dllen > len) break; stop_time = start_time + duration; - if(stop_time < dispatch_clock) { - /* Already come to pass, skip over it */ - len -= dllen; - ptr += dllen; - continue; - } - - if((e = epg_event_create(ch, start_time, start_time + duration, - event_id, NULL)) == NULL) { - len -= dllen; - ptr += dllen; - continue; - } - int changed = 0; - *title = 0; *desc = 0; while(dllen > 0) { @@ -546,46 +530,29 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, len -= 2; ptr += 2; dllen -= 2; - if(dlen > len) - break; + if(dlen > len) break; switch(dtag) { case DVB_DESC_SHORT_EVENT: - if(!dvb_desc_short_event(ptr, dlen, - title, sizeof(title), - desc, sizeof(desc), - t->s_dvb_default_charset)) { - changed |= epg_event_set_title(e, title); - changed |= epg_event_set_desc(e, desc); - } - break; + if(dvb_desc_short_event(ptr, dlen, + title, sizeof(title), + desc, sizeof(desc), + t->s_dvb_default_charset)) ok = 0; + break; case DVB_DESC_CONTENT: - if(dlen >= 2) { - /* We only support one content type per event atm. */ - changed |= epg_event_set_content_type(e, (*ptr) >> 4); - } - break; +#ifdef TODO_GENRE_SUPPORT + if(dlen >= 2) { + genre = (*ptr) >> 4; + } +#endif + break; case DVB_DESC_EXT_EVENT: - if(!dvb_desc_extended_event(ptr, dlen, + if(dvb_desc_extended_event(ptr, dlen, extdesc, sizeof(extdesc), extitem, sizeof(extitem), exttext, sizeof(exttext), - t->s_dvb_default_charset)) { - - char language[4]; - memcpy(language, &ptr[1], 3); - language[3] = '\0'; - int desc_number = (ptr[0] & 0xF0) >> 4; - //int desc_last = (ptr[0] & 0x0F); - - if (strlen(extdesc)) - changed |= epg_event_set_ext_desc(e, desc_number, extdesc); - if (strlen(extitem)) - changed |= epg_event_set_ext_item(e, desc_number, extitem); - if (strlen(exttext)) - changed |= epg_event_set_ext_text(e, desc_number, exttext); - } + t->s_dvb_default_charset)) ok = 0; break; default: break; @@ -594,10 +561,11 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, len -= dlen; ptr += dlen; dllen -= dlen; } - if(changed) - epg_event_updated(e); + /* Pass to EIT handler */ + if (ok) + eit_callback(ch, event_id, start_time, stop_time, + title, desc, extitem, extdesc, exttext); } -#endif return 0; } diff --git a/src/epggrab/eit.c b/src/epggrab/eit.c new file mode 100644 index 00000000..be0763ec --- /dev/null +++ b/src/epggrab/eit.c @@ -0,0 +1,98 @@ +/* + * Electronic Program Guide - eit grabber + * Copyright (C) 2012 Adam Sutton + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "tvheadend.h" +#include "channels.h" +#include "epg.h" +#include "epggrab/eit.h" + +/* ************************************************************************ + * Module Setup + * ***********************************************************************/ + +static epggrab_module_t eit_module; + +static const char* _eit_name ( void ) +{ + return "eit"; +} + +static void _eit_episode_uri ( char *uri, const char *title, const char *summary ) +{ + +} + +// called from dvb_tables.c +void eit_callback ( channel_t *ch, int id, time_t start, time_t stop, + const char *title, const char *desc, + const char *extitem, const char *extdesc, + const char *exttext ) { + int save = 0; + epg_broadcast_t *ebc; + epg_episode_t *ee; + const char *summary = NULL; + const char *description = NULL; + char uri[1024]; + + /* Disabled? */ +//if (epggrab_eit_disabled) return; + + /* Channel */ + if (!ch->ch_epg_channel) { + // TODO: create?? + return; + } + + /* Find broadcast */ + ebc = epg_channel_get_broadcast(ch->ch_epg_channel, start, stop, 1, &save); + if (!ebc) return; + + /* Create episode URI */ + _eit_episode_uri(uri, title, summary); + + /* Create/Replace episode */ + if ( !ebc->episode || + !epg_episode_fuzzy_match(ebc->episode, uri, title, summary, description) ) { + + /* Create episode */ + ee = epg_episode_find_by_uri(uri, 1, &save); + + /* Set fields */ + if (title) + save |= epg_episode_set_title(ee, title); + if (summary) + save |= epg_episode_set_summary(ee, summary); + if (description) + save |= epg_episode_set_description(ee, description); + + /* Update */ + save |= epg_broadcast_set_episode(ebc, ee); + } +} + +epggrab_module_t* eit_init ( void ) +{ + // Note: the EIT grabber is very different to the others, in that + // its asynchronous based on DVB data stream + eit_module.enable = NULL; + eit_module.disable = NULL; + eit_module.grab = NULL; + eit_module.parse = NULL; + eit_module.name = _eit_name; + return &eit_module; +} diff --git a/src/epggrab/eit.h b/src/epggrab/eit.h new file mode 100644 index 00000000..1fc44528 --- /dev/null +++ b/src/epggrab/eit.h @@ -0,0 +1,31 @@ +/* + * Electronic Program Guide - eit grabber + * Copyright (C) 2012 Adam Sutton + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef EPGGRAB_EIT_H +#define EPGGRAB_EIT_H + +#include "epggrab.h" + +epggrab_module_t *eit_init ( void ); + +void eit_callback ( channel_t *ch, int id, time_t start, time_t stop, + const char *title, const char *desc, + const char *extitem, const char *extdesc, + const char *exttext ); + +#endif