diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 4c2174aa..1ec73fb2 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -303,7 +303,7 @@ dvr_entry_t *dvr_entry_find_by_event_fuzzy(epg_broadcast_t *e); dvr_entry_t *dvr_entry_find_by_episode(epg_broadcast_t *e); -off_t dvr_get_filesize(dvr_entry_t *de); +int64_t dvr_get_filesize(dvr_entry_t *de); dvr_entry_t *dvr_entry_cancel(dvr_entry_t *de); diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 1b4edf2d..d975b1f5 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -68,6 +68,8 @@ dvr_entry_status(dvr_entry_t *de) } case DVR_COMPLETED: + if(dvr_get_filesize(de) == -1) + return "File Missing"; if(de->de_last_error) return streaming_code2txt(de->de_last_error); else @@ -97,7 +99,7 @@ dvr_entry_schedstatus(dvr_entry_t *de) else return "recording"; case DVR_COMPLETED: - if(de->de_last_error) + if(de->de_last_error || dvr_get_filesize(de) == -1) return "completedError"; else return "completed"; @@ -1375,16 +1377,16 @@ dvr_query_sort(dvr_query_result_t *dqr) /** * */ -off_t +int64_t dvr_get_filesize(dvr_entry_t *de) { struct stat st; if(de->de_filename == NULL) - return 0; + return -1; if(stat(de->de_filename, &st) != 0) - return 0; + return -1; return st.st_size; } diff --git a/src/htsp_server.c b/src/htsp_server.c index b59f35d9..5cb05edc 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -579,7 +579,9 @@ htsp_build_dvrentry(dvr_entry_t *de, const char *method) break; case DVR_COMPLETED: s = "completed"; - if(de->de_last_error) + if(dvr_get_filesize(de) == -1) + error = "File missing"; + else if(de->de_last_error) error = streaming_code2txt(de->de_last_error); break; case DVR_MISSED_TIME: diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 2b6fff45..76a12886 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -1348,7 +1348,7 @@ extjs_dvrlist(http_connection_t *hc, const char *remain, void *opaque, dvr_entry_t *de; int start = 0, end, limit, i; const char *s; - off_t fsize; + int64_t fsize = 0; char buf[100]; if((s = http_arg_get(&hc->hc_req_args, "start")) != NULL) @@ -1418,16 +1418,14 @@ extjs_dvrlist(http_connection_t *hc, const char *remain, void *opaque, if(de->de_sched_state == DVR_COMPLETED) { fsize = dvr_get_filesize(de); - if(fsize > 0) { - char url[100]; - htsmsg_add_s64(m, "filesize", fsize); - - snprintf(url, sizeof(url), "dvrfile/%d", de->de_id); - htsmsg_add_str(m, "url", url); + if (fsize > 0) { + char url[100]; + htsmsg_add_s64(m, "filesize", fsize); + snprintf(url, sizeof(url), "dvrfile/%d", de->de_id); + htsmsg_add_str(m, "url", url); } } - htsmsg_add_msg(array, NULL, m); } @@ -1446,7 +1444,7 @@ extjs_dvrlist(http_connection_t *hc, const char *remain, void *opaque, static int is_dvr_entry_finished(dvr_entry_t *entry) { dvr_entry_sched_state_t state = entry->de_sched_state; - return state == DVR_COMPLETED; + return state == DVR_COMPLETED && !entry->de_last_error && dvr_get_filesize(entry) != -1; } static int is_dvr_entry_upcoming(dvr_entry_t *entry) @@ -1458,8 +1456,11 @@ static int is_dvr_entry_upcoming(dvr_entry_t *entry) static int is_dvr_entry_failed(dvr_entry_t *entry) { - dvr_entry_sched_state_t state = entry->de_sched_state; - return state == DVR_MISSED_TIME || state == DVR_NOSTATE; + if (is_dvr_entry_finished(entry)) + return 0; + if (is_dvr_entry_upcoming(entry)) + return 0; + return 1; } static int diff --git a/src/webui/static/app/dvr.js b/src/webui/static/app/dvr.js index 215fdf66..02021eb3 100644 --- a/src/webui/static/app/dvr.js +++ b/src/webui/static/app/dvr.js @@ -182,6 +182,13 @@ tvheadend.dvrschedule = function(title, iconCls, dvrStore) { } } + function renderSize(value) + { + if (value == null) + return ''; + return parseInt(value / 1000000) + ' MB'; + } + function renderPri(value) { return tvheadend.dvrprio.getById(value).data.name; } @@ -201,11 +208,12 @@ tvheadend.dvrschedule = function(title, iconCls, dvrStore) { id : 'pri', header : "Priority", dataIndex : 'pri', - renderer : renderPri + renderer : renderPri, + hidden : iconCls != 'clock', }, { width : 100, id : 'start', - header : "Start", + header : iconCls == 'clock' ? "Start" : "Date/Time", dataIndex : 'start', renderer : renderDate }, { @@ -221,6 +229,13 @@ tvheadend.dvrschedule = function(title, iconCls, dvrStore) { header : "Duration", dataIndex : 'duration', renderer : renderDuration + }, { + width : 100, + id : 'filesize', + header : "Filesize", + dataIndex : 'filesize', + renderer : renderSize, + hidden : iconCls != 'television' }, { width : 250, id : 'channel', @@ -244,12 +259,14 @@ tvheadend.dvrschedule = function(title, iconCls, dvrStore) { return value; } }, - dataIndex : 'config_name' + dataIndex : 'config_name', + hidden: iconCls != 'clock' }, { width : 200, id : 'status', header : "Status", - dataIndex : 'status' + dataIndex : 'status', + hidden: iconCls != 'exclamation' } ]); function addEntry() { @@ -608,6 +625,8 @@ tvheadend.dvr = function() { name : 'status' }, { name : 'schedstate' + }, { + name : 'error' }, { name : 'creator' }, {