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 )
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);
}
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);
}
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);
}
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);
}
#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;
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);
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;
+}
+
/*
*
*/
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))
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
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