From: Glenn-1990 Date: Sun, 27 Nov 2016 19:50:01 +0000 (+0100) Subject: List externally deleted recordings as "removed" with new function. X-Git-Tag: v4.2.1~200 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=04ff649a4c13229ebcaa9828fa04339a49842dd5;p=thirdparty%2Ftvheadend.git List externally deleted recordings as "removed" with new function. --- diff --git a/src/api/api_dvr.c b/src/api/api_dvr.c index 510572eca..315682437 100644 --- a/src/api/api_dvr.c +++ b/src/api/api_dvr.c @@ -65,37 +65,6 @@ api_dvr_config_create return 0; } -static int is_dvr_entry_finished(dvr_entry_t *entry) -{ - dvr_entry_sched_state_t state = entry->de_sched_state; - return state == DVR_COMPLETED && !entry->de_last_error && - dvr_get_filesize(entry, 0) != -1 && !entry->de_file_removed && - entry->de_data_errors < DVR_MAX_DATA_ERRORS; -} - -static int is_dvr_entry_removed(dvr_entry_t *entry) -{ - dvr_entry_sched_state_t state = entry->de_sched_state; - return ((state == DVR_COMPLETED || state == DVR_MISSED_TIME) && entry->de_file_removed); -} - -static int is_dvr_entry_upcoming(dvr_entry_t *entry) -{ - dvr_entry_sched_state_t state = entry->de_sched_state; - return state == DVR_RECORDING || state == DVR_SCHEDULED || state == DVR_NOSTATE; -} - -static int is_dvr_entry_failed(dvr_entry_t *entry) -{ - if (is_dvr_entry_finished(entry)) - return 0; - if (is_dvr_entry_upcoming(entry)) - return 0; - if (is_dvr_entry_removed(entry)) - return 0; - return 1; -} - static void api_dvr_entry_grid ( access_t *perm, idnode_set_t *ins, api_idnode_grid_conf_t *conf, htsmsg_t *args ) @@ -113,7 +82,7 @@ api_dvr_entry_grid_upcoming dvr_entry_t *de; LIST_FOREACH(de, &dvrentries, de_global_link) - if (is_dvr_entry_upcoming(de)) + if (dvr_entry_is_upcoming(de)) idnode_set_add(ins, (idnode_t*)de, &conf->filter, perm->aa_lang_ui); } @@ -124,7 +93,7 @@ api_dvr_entry_grid_finished dvr_entry_t *de; LIST_FOREACH(de, &dvrentries, de_global_link) - if (is_dvr_entry_finished(de)) + if (dvr_entry_is_finished(de, DVR_FINISHED_SUCCESS)) idnode_set_add(ins, (idnode_t*)de, &conf->filter, perm->aa_lang_ui); } @@ -135,7 +104,7 @@ api_dvr_entry_grid_failed dvr_entry_t *de; LIST_FOREACH(de, &dvrentries, de_global_link) - if (is_dvr_entry_failed(de)) + if (dvr_entry_is_finished(de, DVR_FINISHED_FAILED)) idnode_set_add(ins, (idnode_t*)de, &conf->filter, perm->aa_lang_ui); } @@ -146,7 +115,7 @@ api_dvr_entry_grid_removed dvr_entry_t *de; LIST_FOREACH(de, &dvrentries, de_global_link) - if (is_dvr_entry_removed(de)) + if (dvr_entry_is_finished(de, DVR_FINISHED_REMOVED)) idnode_set_add(ins, (idnode_t*)de, &conf->filter, perm->aa_lang_ui); } diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index bd324b6de..15bae1cc4 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -33,6 +33,11 @@ #define DVR_FILESIZE_UPDATE (1<<0) #define DVR_FILESIZE_TOTAL (1<<1) +#define DVR_FINISHED_ALL (1<<0) +#define DVR_FINISHED_SUCCESS (1<<1) +#define DVR_FINISHED_REMOVED (1<<2) +#define DVR_FINISHED_FAILED (1<<3) + typedef struct dvr_vfs { LIST_ENTRY(dvr_vfs) link; tvh_fsid_t fsid; @@ -605,6 +610,8 @@ htsmsg_t *dvr_entry_class_duration_list(void *o, const char *not_set, int max, i htsmsg_t *dvr_entry_class_retention_list ( void *o, const char *lang ); htsmsg_t *dvr_entry_class_removal_list ( void *o, const char *lang ); +int dvr_entry_is_upcoming(dvr_entry_t *entry); +int dvr_entry_is_finished(dvr_entry_t *entry, int flags); int dvr_entry_verify(dvr_entry_t *de, access_t *a, int readonly); void dvr_entry_changed_notify(dvr_entry_t *de); diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 58029281d..41ec41983 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -124,6 +124,33 @@ dvr_entry_trace_time2_(const char *file, int line, va_end(args); } +int dvr_entry_is_upcoming(dvr_entry_t *entry) +{ + dvr_entry_sched_state_t state = entry->de_sched_state; + return state == DVR_RECORDING || state == DVR_SCHEDULED || state == DVR_NOSTATE; +} + +int dvr_entry_is_finished(dvr_entry_t *entry, int flags) +{ + if (dvr_entry_is_upcoming(entry)) + return 0; + if (!flags || (flags & DVR_FINISHED_ALL)) + return 1; + + int removed = entry->de_file_removed || /* Removed by tvheadend */ + (entry->de_sched_state != DVR_MISSED_TIME && dvr_get_filesize(entry, 0) == -1); /* Removed externally? */ + int success = entry->de_sched_state == DVR_COMPLETED && + !entry->de_last_error && entry->de_data_errors < DVR_MAX_DATA_ERRORS; + + if ((flags & DVR_FINISHED_REMOVED) && removed) + return 1; + if ((flags & DVR_FINISHED_SUCCESS) && success && !removed) + return 1; + if ((flags & DVR_FINISHED_FAILED) && !success && !removed) + return 1; + return 0; +} + /* * */ @@ -131,8 +158,7 @@ int dvr_entry_verify(dvr_entry_t *de, access_t *a, int readonly) { if (access_verify2(a, ACCESS_FAILED_RECORDER) && - (de->de_sched_state == DVR_COMPLETED && - de->de_last_error != SM_CODE_OK)) + dvr_entry_is_finished(de, DVR_FINISHED_FAILED)) return -1; if (readonly && !access_verify2(a, ACCESS_ALL_RECORDER)) @@ -1306,8 +1332,7 @@ static dvr_entry_t *_dvr_duplicate_event(dvr_entry_t *de) continue; // only successful earlier recordings qualify as master - if ((de2->de_sched_state == DVR_COMPLETED || de2->de_sched_state == DVR_RECORDING) && - de2->de_last_error != SM_CODE_OK) + if (dvr_entry_is_finished(de2, DVR_FINISHED_FAILED)) continue; // if titles are not defined or do not match, don't dedup @@ -1338,8 +1363,7 @@ static dvr_entry_t *_dvr_duplicate_event(dvr_entry_t *de) continue; // only successful earlier recordings qualify as master - if ((de2->de_sched_state == DVR_COMPLETED || de2->de_sched_state == DVR_RECORDING) && - de2->de_last_error != SM_CODE_OK) + if (dvr_entry_is_finished(de2, DVR_FINISHED_FAILED)) continue; // if titles are not defined or do not match, don't dedup