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) != -1;
+ return state == DVR_COMPLETED && !entry->de_last_error && dvr_get_filesize(entry, 0) != -1;
}
static int is_dvr_entry_upcoming(dvr_entry_t *entry)
#include "lang_str.h"
#include "tvhvfs.h"
+#define DVR_FILESIZE_UPDATE (1<<0)
+#define DVR_FILESIZE_TOTAL (1<<1)
+
typedef struct dvr_vfs {
LIST_ENTRY(dvr_vfs) link;
tvh_fsid_t fsid;
const char *dvr_get_filename(dvr_entry_t *de);
-int64_t dvr_get_filesize(dvr_entry_t *de);
+int64_t dvr_get_filesize(dvr_entry_t *de, int flags);
int64_t dvr_entry_claenup(dvr_entry_t *de, int64_t requiredBytes);
void dvr_vfs_refresh_entry(dvr_entry_t *de);
void dvr_vfs_remove_entry(dvr_entry_t *de);
+int64_t dvr_vfs_update_filename(const char *filename, htsmsg_t *fdata);
void dvr_disk_space_boot(void);
void dvr_disk_space_init(void);
de_prev = NULL;
LIST_FOREACH(de, &dae->dae_spawns, de_autorec_link) {
if (de->de_sched_state != DVR_COMPLETED) continue;
- if (dvr_get_filesize(de) < 0) continue;
+ if (dvr_get_filesize(de, 0) < 0) continue;
if (de_prev && de_prev->de_start > de->de_start)
de_prev = de;
count++;
default:
break;
}
- if(dvr_get_filesize(de) == -1)
+ if(dvr_get_filesize(de, 0) == -1)
return N_("File missing");
if(de->de_last_error)
return streaming_code2txt(de->de_last_error);
break;
case DVR_COMPLETED:
s = "completed";
- if(de->de_last_error || dvr_get_filesize(de) == -1)
+ if(de->de_last_error || dvr_get_filesize(de, 0) == -1)
s = "completedError";
rerecord = de->de_dont_rerecord ? 0 : dvr_entry_get_rerecord_errors(de);
if(rerecord && (de->de_errors || de->de_data_errors > rerecord))
if (de->de_sched_state == DVR_COMPLETED &&
de->de_errors == 0 &&
de->de_data_errors < de->de_parent->de_data_errors) {
- fsize1 = dvr_get_filesize(de);
- fsize2 = dvr_get_filesize(de2);
+ fsize1 = dvr_get_filesize(de, DVR_FILESIZE_TOTAL);
+ fsize2 = dvr_get_filesize(de2, DVR_FILESIZE_TOTAL);
if (fsize1 / 5 < fsize2 / 6) {
goto not_so_good;
} else {
dvr_entry_cancel_delete(de2, 1);
}
} else if (de->de_sched_state == DVR_COMPLETED) {
- if(dvr_get_filesize(de) == -1) {
+ if(dvr_get_filesize(de, 0) == -1) {
delete_me:
dvr_entry_cancel_delete(de, 0);
dvr_entry_rerecord(de2);
dvr_entry_t *de = (dvr_entry_t *)o;
if (de->de_sched_state == DVR_COMPLETED ||
de->de_sched_state == DVR_RECORDING) {
- size = dvr_get_filesize(de);
+ size = dvr_get_filesize(de, DVR_FILESIZE_UPDATE);
if (size < 0)
size = 0;
} else
*
*/
int64_t
-dvr_get_filesize(dvr_entry_t *de)
+dvr_get_filesize(dvr_entry_t *de, int flags)
{
+ htsmsg_field_t *f;
+ htsmsg_t *m;
const char *filename;
- struct stat st;
+ int first = 1;
+ int64_t res = 0, size;
- filename = dvr_get_filename(de);
-
- if(filename == NULL)
+ if (de->de_files == NULL)
return -1;
- if(stat(filename, &st) != 0)
- return -1;
+ HTSMSG_FOREACH(f, de->de_files)
+ if ((m = htsmsg_field_get_map(f)) != NULL) {
+ filename = htsmsg_get_str(m, "filename");
+ if (flags & DVR_FILESIZE_UPDATE)
+ size = dvr_vfs_update_filename(filename, m);
+ else
+ size = htsmsg_get_s64_or_default(m, "size", -1);
+ if (filename && size >= 0) {
+ res = (flags & DVR_FILESIZE_TOTAL) ? (res + size) : size;
+ first = 0;
+ }
+ }
- return st.st_size;
+ return first ? -1 : res;
}
/**
m = htsmsg_create_map();
htsmsg_add_str(m, "filename", path);
htsmsg_add_msg(de->de_files, NULL, m);
- dvr_vfs_refresh_entry(de);
return 0;
}
return -1;
}
+ dvr_vfs_refresh_entry(de);
+
ss_copy = streaming_start_copy(ss);
if(muxer_init(muxer, ss_copy, lang_str_get(de->de_title, NULL))) {
HTSMSG_FOREACH(f, de->de_files)
if ((m = htsmsg_field_get_map(f)) != NULL) {
filename = htsmsg_get_str(m, "filename");
- vfs = dvr_vfs_find(vfs, htsmsg_get_s64(m, "fsid", 0));
+ vfs = dvr_vfs_find(vfs, htsmsg_get_s64_or_default(m, "fsid", 0));
if (vfs) {
- size = htsmsg_get_s64(m, "size", 0);
+ size = htsmsg_get_s64_or_default(m, "size", 0);
vfs->used_size = size <= vfs->used_size ? vfs->used_size - size : 0;
}
if(statvfs(filename, &vst) < 0 || stat(filename, &st) < 0) {
tvhlog(LOG_ERR, "dvr", "unable to stat file '%s'", filename);
- htsmsg_delete_field(m, "fsid");
- htsmsg_delete_field(m, "size");
- continue;
+ goto rem;
}
vfs = dvr_vfs_find(vfs, tvh_fsid(vst.f_fsid));
- if (vfs && st.st_size > 0) {
+ if (vfs && st.st_size >= 0) {
htsmsg_set_s64(m, "fsid", tvh_fsid(vst.f_fsid));
htsmsg_set_s64(m, "size", st.st_size);
vfs->used_size += st.st_size;
+ } else {
+rem:
+ htsmsg_delete_field(m, "fsid");
+ htsmsg_delete_field(m, "size");
}
}
}
lock_assert(&global_lock);
HTSMSG_FOREACH(f, de->de_files)
if ((m = htsmsg_field_get_map(f)) != NULL) {
- vfs = dvr_vfs_find(vfs, htsmsg_get_s64(m, "fsid", 0));
+ vfs = dvr_vfs_find(vfs, htsmsg_get_s64_or_default(m, "fsid", 0));
if (vfs) {
- size = htsmsg_get_s64(m, "size", 0);
+ size = htsmsg_get_s64_or_default(m, "size", 0);
vfs->used_size = size <= vfs->used_size ? vfs->used_size - size : 0;
}
htsmsg_delete_field(m, "fsid");
}
}
+/*
+ *
+ */
+int64_t
+dvr_vfs_update_filename(const char *filename, htsmsg_t *fdata)
+{
+ dvr_vfs_t *vfs;
+ struct stat st;
+ int64_t size;
+
+ if (filename == NULL || fdata == NULL)
+ return -1;
+ vfs = dvr_vfs_find(NULL, htsmsg_get_s64_or_default(fdata, "fsid", 0));
+ if (vfs) {
+ size = htsmsg_get_s64_or_default(fdata, "size", 0);
+ vfs->used_size = size <= vfs->used_size ? vfs->used_size - size : 0;
+ if (stat(filename, &st) >= 0 && st.st_size >= 0) {
+ htsmsg_set_s64(fdata, "size", st.st_size);
+ return st.st_size;
+ }
+ }
+ htsmsg_delete_field(fdata, "fsid");
+ htsmsg_delete_field(fdata, "size");
+ return -1;
+}
+
/**
* Cleanup old recordings for this config until the dvr_cleanup_threshold is reached
* Only "Keep until space needed" recordings are deleted, starting with the oldest one
if (dvr_entry_get_removal_days(de) != DVR_RET_SPACE) // only remove the allowed ones
continue;
- if (dvr_get_filename(de) == NULL || dvr_get_filesize(de) <= 0)
+ if (dvr_get_filename(de) == NULL || dvr_get_filesize(de, DVR_FILESIZE_TOTAL) <= 0)
continue;
if(statvfs(dvr_get_filename(de), &diskdata) == -1)
}
if (oldest) {
- fileSize = dvr_get_filesize(oldest);
+ fileSize = dvr_get_filesize(oldest, DVR_FILESIZE_TOTAL);
availBytes += fileSize;
clearedBytes += fileSize;
usedBytes -= fileSize;
break;
case DVR_RECORDING:
s = "recording";
- fsize = dvr_get_filesize(de);
+ fsize = dvr_get_filesize(de, DVR_FILESIZE_UPDATE);
if (de->de_rec_state == DVR_RS_ERROR ||
(de->de_rec_state == DVR_RS_PENDING && de->de_last_error != SM_CODE_OK))
{
break;
case DVR_COMPLETED:
s = "completed";
- fsize = dvr_get_filesize(de);
+ fsize = dvr_get_filesize(de, DVR_FILESIZE_UPDATE);
if (fsize < 0)
error = "File missing";
else if(de->de_last_error)
htsbuf_append_str(hq, "#EXTM3U\n");
LIST_FOREACH(de, &dvrentries, de_global_link) {
- fsize = dvr_get_filesize(de);
+ fsize = dvr_get_filesize(de, 0);
if(!fsize)
continue;
hostpath = http_get_hostpath(hc);
durration = dvr_entry_get_stop_time(de) - dvr_entry_get_start_time(de, 0);
- fsize = dvr_get_filesize(de);
+ fsize = dvr_get_filesize(de, 0);
if(fsize) {
bandwidth = ((8*fsize) / (durration*1024.0));