]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
List externally deleted recordings as "removed" with new function.
authorGlenn-1990 <g_christiaensen@msn.com>
Sun, 27 Nov 2016 19:50:01 +0000 (20:50 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 28 Nov 2016 09:04:45 +0000 (10:04 +0100)
src/api/api_dvr.c
src/dvr/dvr.h
src/dvr/dvr_db.c

index 510572eca0784cbca3b24726574ebdf063b36ea5..315682437abafd3a18431074d3972ec31c745f03 100644 (file)
@@ -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);
 }
 
index bd324b6de9ae970bf32b50b62764e074468acf55..15bae1cc4e485f3a471850b1b6eda2557e5a7a33 100644 (file)
 #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);
index 58029281dc2162817dc81a18c206c21209d91c58..41ec41983449b29ec5c3d7856c8af1bcda567d63 100644 (file)
@@ -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