Some tidying up of epg grabbers and added stubs for missing functions in epg.

This commit is contained in:
Adam Sutton 2012-05-28 16:43:42 +01:00
parent 3cd7ebe7e6
commit e4f4411777
6 changed files with 110 additions and 61 deletions

View file

@ -851,6 +851,16 @@ size_t epg_episode_number_format
return i; return i;
} }
int epg_episode_fuzzy_match
( epg_episode_t *episode, const char *uri, const char *title,
const char *summary, const char *description )
{
if ( !episode ) return 0;
if ( uri && episode->_.uri && !strcmp(episode->_.uri, uri) ) return 1;
// TODO: how to match title/summary/description
return 0;
}
htsmsg_t *epg_episode_serialize ( epg_episode_t *episode ) htsmsg_t *epg_episode_serialize ( epg_episode_t *episode )
{ {
htsmsg_t *m; htsmsg_t *m;
@ -1194,6 +1204,18 @@ int epg_channel_set_channel ( epg_channel_t *ec, channel_t *ch )
return save; return save;
} }
int epg_channel_set_icon ( epg_channel_t *channel, const char *icon )
{
int save = 0;
if ( !channel | !icon ) return 0;
if ( !channel->icon || strcmp(channel->icon, icon) ) {
if ( channel->icon ) free(channel->icon);
channel->icon = strdup(icon);
save = 1;
}
return save;
}
epg_broadcast_t *epg_channel_get_broadcast epg_broadcast_t *epg_channel_get_broadcast
( epg_channel_t *channel, time_t start, time_t stop, int create, int *save ) ( epg_channel_t *channel, time_t start, time_t stop, int create, int *save )
{ {

View file

@ -223,6 +223,11 @@ size_t epg_episode_number_format
const char *sep, const char *efmt, const char *sep, const char *efmt,
const char *cfmt ); const char *cfmt );
/* Matching */
int epg_episode_fuzzy_match
( epg_episode_t *ee, const char *uri, const char *title,
const char *summary, const char *description );
/* Serialization */ /* Serialization */
htsmsg_t *epg_episode_serialize ( epg_episode_t *b ); htsmsg_t *epg_episode_serialize ( epg_episode_t *b );
epg_episode_t *epg_episode_deserialize ( htsmsg_t *m, int create, int *save ); epg_episode_t *epg_episode_deserialize ( htsmsg_t *m, int create, int *save );

View file

@ -1,5 +1,19 @@
/* /*
* PyEPG grabber * Electronic Program Guide - pyepg 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 <http://www.gnu.org/licenses/>.
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE

View file

@ -1,12 +1,26 @@
/* /*
* PyEPG grabber module * Electronic Program Guide - pyepg 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 <http://www.gnu.org/licenses/>.
*/ */
#include "epggrab.h"
#ifndef EPGGRAB_PYEPG_H #ifndef EPGGRAB_PYEPG_H
#define EPGGRAB_PYEPG_H #define EPGGRAB_PYEPG_H
#include "epggrab.h"
epggrab_module_t* pyepg_init ( void ); epggrab_module_t* pyepg_init ( void );
#endif #endif

View file

@ -1,6 +1,6 @@
/* /*
* Electronic Program Guide - xmltv interface * Electronic Program Guide - xmltv grabber
* Copyright (C) 2007 Andreas Öman * Copyright (C) 2012 Adam Sutton
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -43,7 +43,9 @@
* Hash the description to get a URI for episode * Hash the description to get a URI for episode
* *
* Note: converts to an ASCII format * Note: converts to an ASCII format
* TODO: move somewhere else
*/ */
#if 0
static const char *_xmltv_hash ( const char *str ) static const char *_xmltv_hash ( const char *str )
{ {
size_t i; size_t i;
@ -56,6 +58,7 @@ static const char *_xmltv_hash ( const char *str )
ret[MD5_DIGEST_LENGTH*2] = '\0'; ret[MD5_DIGEST_LENGTH*2] = '\0';
return ret; return ret;
} }
#endif
/** /**
* *
@ -88,9 +91,7 @@ _xmltv_str2time(const char *str)
} }
} }
#if TODO_XMLTV_EP_NUMBERING #if 0
/** /**
* This is probably the most obscure formating there is. From xmltv.dtd: * This is probably the most obscure formating there is. From xmltv.dtd:
* *
@ -180,36 +181,29 @@ xmltv_ns_get_parse_num(const char *s, int *ap, int *bp)
static void static void
parse_xmltv_ns_episode(const char *s, epg_episode_t *ee) parse_xmltv_ns_episode
(const char *s, int *season, int *episode, int *part)
{ {
int season; s = xmltv_ns_get_parse_num(s, season, NULL);
int episode; s = xmltv_ns_get_parse_num(s, episode, NULL);
int part; xmltv_ns_get_parse_num(s, part, NULL);
s = xmltv_ns_get_parse_num(s, &season, NULL); *season += 1;
s = xmltv_ns_get_parse_num(s, &episode, NULL); *episode += 1;
xmltv_ns_get_parse_num(s, &part, NULL); *part += 1;
if(season != -1)
ee->ee_season = season + 1;
if(episode != -1)
ee->ee_episode = episode + 1;
if(part != -1)
ee->ee_part = part + 1;
} }
/** /**
* *
*/ */
static void static void
get_episode_info(htsmsg_t *tags, epg_episode_t *ee) get_episode_info
(htsmsg_t *tags, const char **screen, int *season, int *episode, int *part)
{ {
htsmsg_field_t *f; htsmsg_field_t *f;
htsmsg_t *c, *a; htsmsg_t *c, *a;
const char *sys, *cdata; const char *sys, *cdata;
memset(ee, 0, sizeof(epg_episode_t));
HTSMSG_FOREACH(f, tags) { HTSMSG_FOREACH(f, tags) {
if((c = htsmsg_get_map_by_field(f)) == NULL || if((c = htsmsg_get_map_by_field(f)) == NULL ||
strcmp(f->hmf_name, "episode-num") || strcmp(f->hmf_name, "episode-num") ||
@ -218,10 +212,9 @@ get_episode_info(htsmsg_t *tags, epg_episode_t *ee)
(sys = htsmsg_get_str(a, "system")) == NULL) (sys = htsmsg_get_str(a, "system")) == NULL)
continue; continue;
if(!strcmp(sys, "onscreen")) if(!strcmp(sys, "onscreen")) *screen = cdata;
tvh_str_set(&ee->ee_onscreen, cdata);
else if(!strcmp(sys, "xmltv_ns")) else if(!strcmp(sys, "xmltv_ns"))
parse_xmltv_ns_episode(cdata, ee); parse_xmltv_ns_episode(cdata, season, episode, part);
} }
} }
@ -234,20 +227,37 @@ static int
_xmltv_parse_programme_tags(epg_channel_t *xc, htsmsg_t *tags, _xmltv_parse_programme_tags(epg_channel_t *xc, htsmsg_t *tags,
time_t start, time_t stop, epggrab_stats_t *stats) time_t start, time_t stop, epggrab_stats_t *stats)
{ {
#if TODO_XMLTV
int save = 0, save2 = 0; int save = 0, save2 = 0;
epg_broadcast_t *ebc;
epg_episode_t *ee; epg_episode_t *ee;
epg_broadcast_t *ebc;
int sn = 0, en = 0, pn = 0;
const char *onscreen = NULL;
const char *uri = NULL; const char *uri = NULL;
const char *title = htsmsg_xml_get_cdata_str(tags, "title"); const char *title = htsmsg_xml_get_cdata_str(tags, "title");
const char *desc = htsmsg_xml_get_cdata_str(tags, "desc"); const char *desc = htsmsg_xml_get_cdata_str(tags, "desc");
#if TODO_EPG_GENRE
const char *category = htsmsg_xml_get_cdata_str(tags, "category"); const char *category = htsmsg_xml_get_cdata_str(tags, "category");
#endif get_episode_info(tags, &onscreen, &sn, &en, &pn);
/* Create/Find broadcast */
ebc = epg_broadcast_find_by_time(xc, start, stop, 1, &save2);
if ( ebc != NULL ) {
stats->broadcasts.total++;
if (save2) stats->broadcasts.created++;
save2 |= epg_broadcast_set_episode(ebc, ee);
if (save2) stats->broadcasts.modified++;
}
// TODO:
// do we attempt to make an episode URI from info?
// OR
// do we first try to find the broadcast and do a fuzzy check on params?
// OR
// do we do something else?
/* Generate a URI */ /* Generate a URI */
if ( desc ) if ( desc )
uri = _xmltv_hash(desc); uri = _xmltv_hash(desc);
// TODO: what to do otherwise?
if ( !uri ) return 0; if ( !uri ) return 0;
/* Find episode */ /* Find episode */
@ -256,24 +266,17 @@ _xmltv_parse_programme_tags(epg_channel_t *xc, htsmsg_t *tags,
if (save) stats->episodes.created++; if (save) stats->episodes.created++;
if (title) save |= epg_episode_set_title(ee, title); if (title) save |= epg_episode_set_title(ee, title);
if (desc) save |= epg_episode_set_description(ee, desc); if (desc) save |= epg_episode_set_description(ee, desc);
#if TODO_EPG_GENRE if (category) save |= epg_episode_set_genre_str(ee, category);
if (category) save |= epg_episode_set_genre(ee, category); if (onscreen) save |= epg_episode_set_onscreen(ee, onscreen);
#endif if (pn) save |= epg_episode_set_part(ee, pn, 0);
#if TODO_XMLTV_EP_NUMBERING if (en) save |= epg_episode_set_number(ee, en);
_get_episode_info(tags, &episode); // TODO: how can we handle season number?
#endif
if (save) stats->episodes.modified++; if (save) stats->episodes.modified++;
/* Create broadcast */
ebc = epg_broadcast_find_by_time(xc, start, stop, 1, &save2);
if ( ebc != NULL ) {
stats->broadcasts.total++;
if (save2) stats->broadcasts.created++;
save2 |= epg_broadcast_set_episode(ebc, ee);
if (save2) stats->broadcasts.modified++;
}
return save | save2; return save | save2;
#endif
return 0;
} }
@ -313,8 +316,8 @@ static int
_xmltv_parse_channel(htsmsg_t *body, epggrab_stats_t *stats) _xmltv_parse_channel(htsmsg_t *body, epggrab_stats_t *stats)
{ {
int save =0; int save =0;
htsmsg_t *attribs, *tags;/*, *subtag;*/ htsmsg_t *attribs, *tags, *subtag;
const char *id, *name; /*,icon;*/ const char *id, *name, *icon;
epg_channel_t *xc; epg_channel_t *xc;
if(body == NULL) return 0; if(body == NULL) return 0;
@ -330,20 +333,11 @@ _xmltv_parse_channel(htsmsg_t *body, epggrab_stats_t *stats)
save |= epg_channel_set_name(xc, name); save |= epg_channel_set_name(xc, name);
} }
#if TODO_EPG_CHANNEL_META
if((subtag = htsmsg_get_map(tags, "icon")) != NULL && if((subtag = htsmsg_get_map(tags, "icon")) != NULL &&
(attribs = htsmsg_get_map(subtag, "attrib")) != NULL && (attribs = htsmsg_get_map(subtag, "attrib")) != NULL &&
(icon = htsmsg_get_str(attribs, "src")) != NULL) { (icon = htsmsg_get_str(attribs, "src")) != NULL) {
save |= epg_channel_set_icon(xc, icon);
if(xc->xc_icon == NULL || strcmp(xc->xc_icon, icon)) {
tvh_str_set(&xc->xc_icon, icon);
LIST_FOREACH(ch, &xc->xc_channels, ch_xc_link)
channel_set_icon(ch, icon);
save = 1;
}
} }
#endif
if (save) stats->channels.modified++; if (save) stats->channels.modified++;
return save; return save;
} }

View file

@ -1,6 +1,6 @@
/* /*
* Electronic Program Guide - xmltv interface * Electronic Program Guide - xmltv grabber
* Copyright (C) 2007 Andreas Öman * Copyright (C) 2012 Adam Sutton
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by