Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
List externally deleted recordings as "removed" with new function.
  • Loading branch information
Glenn-1990 authored and perexg committed Nov 28, 2016
1 parent a6675c3 commit 04ff649
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 41 deletions.
39 changes: 4 additions & 35 deletions src/api/api_dvr.c
Expand Up @@ -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 )
Expand All @@ -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);
}

Expand All @@ -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);
}

Expand All @@ -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);
}

Expand All @@ -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);
}

Expand Down
7 changes: 7 additions & 0 deletions src/dvr/dvr.h
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
36 changes: 30 additions & 6 deletions src/dvr/dvr_db.c
Expand Up @@ -124,15 +124,41 @@ 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;
}

/*
*
*/
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))
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 04ff649

Please sign in to comment.