From 0c1c1cfbd9881449f799a4ce5e1a3b8a141e77d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Tue, 30 Aug 2011 23:29:29 +0200 Subject: [PATCH] Try to avoid rescheduling DVR entries Patch by Chris Dekter Fixes #179 --- src/dvr/dvr.h | 2 ++ src/dvr/dvr_autorec.c | 11 +++++++++-- src/dvr/dvr_db.c | 18 +++++++++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index e8ebee9e..d2d6d476 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -258,6 +258,8 @@ dvr_entry_t *dvr_entry_find_by_id(int id); dvr_entry_t *dvr_entry_find_by_event(event_t *e); +dvr_entry_t *dvr_entry_find_by_event_fuzzy(event_t *e); + off_t dvr_get_filesize(dvr_entry_t *de); dvr_entry_t *dvr_entry_cancel(dvr_entry_t *de); diff --git a/src/dvr/dvr_autorec.c b/src/dvr/dvr_autorec.c index bd3e148b..60829d88 100644 --- a/src/dvr/dvr_autorec.c +++ b/src/dvr/dvr_autorec.c @@ -479,10 +479,17 @@ void dvr_autorec_check_event(event_t *e) { dvr_autorec_entry_t *dae; + dvr_entry_t *existingde; TAILQ_FOREACH(dae, &autorec_entries, dae_link) - if(autorec_cmp(dae, e)) - dvr_entry_create_by_autorec(e, dae); + if(autorec_cmp(dae, e)) { + existingde = dvr_entry_find_by_event_fuzzy(e); + if (existingde != NULL) { + tvhlog(LOG_DEBUG, "dvr", "Updating existing DVR entry for %s", e->e_title); + dvr_entry_update(existingde, e->e_title, e->e_start, e->e_stop); + } else + dvr_entry_create_by_autorec(e, dae); + } } /** diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index efbc6c17..6a31b2d4 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -625,7 +625,6 @@ dvr_entry_update(dvr_entry_t *de, const char* de_title, int de_start, int de_sto htsp_dvr_entry_update(de); dvr_entry_notify(de); - tvhlog(LOG_INFO, "dvr", "\"%s\" on \"%s\": Updated Timer", de->de_title, de->de_channel->ch_name); return de; @@ -721,6 +720,23 @@ dvr_entry_find_by_event(event_t *e) return NULL; } +/** + * Find event with same title starting and ending around same time + * on same channel + */ +dvr_entry_t * +dvr_entry_find_by_event_fuzzy(event_t *e) +{ + dvr_entry_t *de; + + LIST_FOREACH(de, &e->e_channel->ch_dvrs, de_channel_link) + if(strcmp(de->de_title, e->e_title) == 0) { + if ((abs(de->de_start - e->e_start) < 600) && (abs(de->de_stop - e->e_stop) < 600)) + return de; + } + return NULL; +} + /** * */