First stab at adding proper brand based series linking (some aspects of season based exist, but generally I am ignoring this for now).

This commit is contained in:
Adam Sutton 2012-06-08 15:33:22 +01:00
parent 3dbefe4758
commit 86e1339d9f
2 changed files with 115 additions and 17 deletions

View file

@ -211,6 +211,9 @@ typedef struct dvr_autorec_entry {
struct dvr_entry_list dae_spawns;
epg_brand_t *dae_brand;
epg_season_t *dae_season;
} dvr_autorec_entry_t;
@ -308,7 +311,14 @@ void dvr_autorec_add(const char *dvr_config_name,
const char *tag, uint8_t content_type,
const char *creator, const char *comment);
void dvr_autorec_add_series_link(const char *dvr_config_name,
epg_broadcast_t *event,
const char *creator, const char *comment);
void dvr_autorec_check_event(epg_broadcast_t *e);
void dvr_autorec_check_brand(epg_brand_t *b);
void dvr_autorec_check_season(epg_season_t *s);
void autorec_destroy_by_channel(channel_t *ch);

View file

@ -67,13 +67,17 @@ autorec_cmp(dvr_autorec_entry_t *dae, epg_broadcast_t *e)
channel_tag_mapping_t *ctm;
if (!e->channel) return 0;
if (!e->episode) return 0;
if(dae->dae_enabled == 0 || dae->dae_weekdays == 0)
return 0;
if(dae->dae_channel == NULL &&
dae->dae_channel_tag == NULL &&
dae->dae_content_type == 0 &&
dae->dae_title == NULL)
(dae->dae_title == NULL ||
dae->dae_title[0] == '\0') &&
dae->dae_brand == NULL &&
dae->dae_season == NULL)
return 0; // Avoid super wildcard match
if(dae->dae_channel != NULL &&
@ -93,8 +97,13 @@ autorec_cmp(dvr_autorec_entry_t *dae, epg_broadcast_t *e)
dae->dae_content_type != e->e_content_type)
return 0;
#endif
if(dae->dae_brand)
if (!e->episode->brand || dae->dae_brand != e->episode->brand) return 0;
if(dae->dae_season)
if (!e->episode->season || dae->dae_season != e->episode->season) return 0;
if(dae->dae_title != NULL) {
if(dae->dae_title != NULL && dae->dae_title[0] != '\0') {
if(e->episode->title == NULL ||
regexec(&dae->dae_title_preg, e->episode->title, 0, NULL, 0))
return 0;
@ -183,6 +192,12 @@ autorec_entry_destroy(dvr_autorec_entry_t *dae)
if(dae->dae_channel_tag != NULL)
LIST_REMOVE(dae, dae_channel_tag_link);
if(dae->dae_brand)
dae->dae_brand->_.putref((epg_object_t*)dae->dae_brand);
if(dae->dae_season)
dae->dae_season->_.putref((epg_object_t*)dae->dae_season);
TAILQ_REMOVE(&autorec_entries, dae, dae_link);
free(dae);
}
@ -258,6 +273,11 @@ autorec_record_build(dvr_autorec_entry_t *dae)
htsmsg_add_str(e, "weekdays", str);
htsmsg_add_str(e, "pri", dvr_val2pri(dae->dae_pri));
if (dae->dae_brand)
htsmsg_add_str(e, "brand", dae->dae_brand->_.uri);
if (dae->dae_season)
htsmsg_add_str(e, "season", dae->dae_season->_.uri);
return e;
}
@ -386,6 +406,16 @@ autorec_record_update(void *opaque, const char *id, htsmsg_t *values,
if((s = htsmsg_get_str(values, "pri")) != NULL)
dae->dae_pri = dvr_pri2val(s);
if((s = htsmsg_get_str(values, "brand")) != NULL) {
dae->dae_brand = epg_brand_find_by_uri(s, 0, NULL);
if (dae->dae_brand)
dae->dae_brand->_.getref((epg_object_t*)dae->dae_brand);
}
if((s = htsmsg_get_str(values, "season")) != NULL) {
dae->dae_season = epg_season_find_by_uri(s, 0, NULL);
if (dae->dae_season)
dae->dae_season->_.getref((epg_object_t*)dae->dae_season);
}
dvr_autorec_changed(dae);
return autorec_record_build(dae);
@ -432,19 +462,15 @@ dvr_autorec_init(void)
dtable_load(autorec_dt);
}
/**
*
*/
void
dvr_autorec_add(const char *config_name,
const char *title, const char *channel,
static void
_dvr_autorec_add(const char *config_name,
const char *title, channel_t *ch,
const char *tag, uint8_t content_type,
epg_brand_t *brand, epg_season_t *season,
const char *creator, const char *comment)
{
dvr_autorec_entry_t *dae;
htsmsg_t *m;
channel_t *ch;
channel_tag_t *ct;
if((dae = autorec_entry_find(NULL, 1)) == NULL)
@ -454,7 +480,7 @@ dvr_autorec_add(const char *config_name,
tvh_str_set(&dae->dae_creator, creator);
tvh_str_set(&dae->dae_comment, comment);
if(channel != NULL && (ch = channel_find_by_name(channel, 0, 0)) != NULL) {
if(ch) {
LIST_INSERT_HEAD(&ch->ch_autorecs, dae, dae_channel_link);
dae->dae_channel = ch;
}
@ -473,6 +499,15 @@ dvr_autorec_add(const char *config_name,
dae->dae_enabled = 1;
dae->dae_content_type = content_type;
if(brand) {
dae->dae_brand = brand;
brand->_.getref((epg_object_t*)brand);
}
if(season) {
dae->dae_season = season;
season->_.getref((epg_object_t*)season);
}
m = autorec_record_build(dae);
hts_settings_save(m, "%s/%s", "autorec", dae->dae_id);
htsmsg_destroy(m);
@ -486,6 +521,35 @@ dvr_autorec_add(const char *config_name,
dvr_autorec_changed(dae);
}
void
dvr_autorec_add(const char *config_name,
const char *title, const char *channel,
const char *tag, uint8_t content_type,
const char *creator, const char *comment)
{
channel_t *ch = NULL;
if(channel != NULL) ch = channel_find_by_name(channel, 0, 0);
_dvr_autorec_add(config_name, title, ch, tag, content_type,
NULL, NULL, creator, comment);
}
/* TODO: configurable brand/series selection */
void dvr_autorec_add_series_link
( const char *dvr_config_name, epg_broadcast_t *event,
const char *creator, const char *comment )
{
if (!event || !event->episode) return;
_dvr_autorec_add(dvr_config_name, event->episode->title,
event->channel, NULL, 0,
event->episode->brand,
#ifdef TODO_SEASON_SUPPORT
event->episode->season,
#else
NULL,
#endif
creator, comment);
}
/**
*
@ -501,31 +565,55 @@ dvr_autorec_check_event(epg_broadcast_t *e)
existingde = dvr_entry_find_by_event_fuzzy(e);
if (existingde != NULL) {
tvhlog(LOG_DEBUG, "dvr", "Updating existing DVR entry for %s", e->episode->title);
// TODO: do we want to do this?
dvr_entry_update(existingde, e->episode->title, e->start, e->stop);
} else
dvr_entry_create_by_autorec(e, dae);
}
}
void dvr_autorec_check_brand(epg_brand_t *b)
{
#ifdef TODO_BRAND_UPDATED_SUPPORT
epg_objet
dvr_autorec_entry_t *dae;
TAILQ_FOREACH(dae, &autorec_entries, dae_link) {
if (dae->dae_brand == b) {
}
}
#endif
// Note: for the most part this will only be relevant should an episode
// to which a broadcast is linked suddenly get added to a new brand
// this is pretty damn unlikely!
}
void dvr_autorec_check_season(epg_season_t *s)
{
#ifdef TODO_SEASON_SUPPORT
TAILQ_FOREACH(dae, &autorec_entries, dae_link) {
if (dae->dae_season == s) {
}
}
#endif
}
/**
*
*/
static void
dvr_autorec_changed(dvr_autorec_entry_t *dae)
{
#if TODO_DVR_AUTOREC
channel_t *ch;
event_t *e;
epg_object_t *e;
dvr_autorec_purge_spawns(dae);
RB_FOREACH(ch, &channel_name_tree, ch_name_link) {
RB_FOREACH(e, &ch->ch_epg_events, e_channel_link) {
if(autorec_cmp(dae, e))
dvr_entry_create_by_autorec(e, dae);
RB_FOREACH(e, &ch->ch_epg_schedule, glink) {
if(autorec_cmp(dae, (epg_broadcast_t*)e))
dvr_entry_create_by_autorec((epg_broadcast_t*)e, dae);
}
}
#endif
}