diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 0db0c7b1..5f28421c 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -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); diff --git a/src/dvr/dvr_autorec.c b/src/dvr/dvr_autorec.c index 48a12167..c6a7e100 100644 --- a/src/dvr/dvr_autorec.c +++ b/src/dvr/dvr_autorec.c @@ -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 }