mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Fixed handling recordings on other file systems than the video directory
This commit is contained in:
parent
47d6f9d187
commit
741400fa66
9
HISTORY
9
HISTORY
@ -5579,7 +5579,7 @@ Video Disk Recorder Revision History
|
|||||||
is not available, in order to allow staying on an encrypted channel that takes
|
is not available, in order to allow staying on an encrypted channel that takes
|
||||||
a while for the CAM to start decrypting.
|
a while for the CAM to start decrypting.
|
||||||
|
|
||||||
2008-02-10: Version 1.5.15
|
2008-02-16: Version 1.5.15
|
||||||
|
|
||||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||||
- Added option -i to the pictures plugin's pic2mpg to ignore unknown file types.
|
- Added option -i to the pictures plugin's pic2mpg to ignore unknown file types.
|
||||||
@ -5624,3 +5624,10 @@ Video Disk Recorder Revision History
|
|||||||
stopped immediately (thanks to Mikko Matilainen for reporting a possible crash
|
stopped immediately (thanks to Mikko Matilainen for reporting a possible crash
|
||||||
if the Info key is pressed after deleting the currently replayed recording).
|
if the Info key is pressed after deleting the currently replayed recording).
|
||||||
- Updated the Russian OSD texts (thanks to Oleg Roitburd).
|
- Updated the Russian OSD texts (thanks to Oleg Roitburd).
|
||||||
|
- When determining the amount of free disk space, any deleted (but not yet removed)
|
||||||
|
recordings on different file systems (that are mounted under the video directory)
|
||||||
|
are no longer taken into account.
|
||||||
|
- When running out of disk space during a recording, only such deleted or old
|
||||||
|
recordings are removed, that actually are on the video directory file system(s).
|
||||||
|
This prevents VDR from accidentally deleting recordings on other file systems,
|
||||||
|
which would not add any free space to the video directory.
|
||||||
|
13
UPDATE-1.6.0
13
UPDATE-1.6.0
@ -63,9 +63,18 @@ Channels:
|
|||||||
parameter to 0 turns off the automatic channel switching, and the user will
|
parameter to 0 turns off the automatic channel switching, and the user will
|
||||||
have to confirm the entry by pressing the "Ok" key.
|
have to confirm the entry by pressing the "Ok" key.
|
||||||
|
|
||||||
Recording:
|
Recordings:
|
||||||
|
|
||||||
- The info.vdr file now also stores the name of the channel.
|
- The info.vdr file now also stores the name of the channel.
|
||||||
|
- When deleting the recording that is currently replayed, the replay is now
|
||||||
|
stopped immediately.
|
||||||
|
- When determining the amount of free disk space, any deleted (but not yet removed)
|
||||||
|
recordings on different file systems (that are mounted under the video directory)
|
||||||
|
are no longer taken into account.
|
||||||
|
- When running out of disk space during a recording, only such deleted or old
|
||||||
|
recordings are removed, that actually are on the video directory file system(s).
|
||||||
|
This prevents VDR from accidentally deleting recordings on other file systems,
|
||||||
|
which would not add any free space to the video directory.
|
||||||
|
|
||||||
SVDRP:
|
SVDRP:
|
||||||
|
|
||||||
@ -128,3 +137,5 @@ Misc:
|
|||||||
menu.
|
menu.
|
||||||
- Changed the message "Upcoming VPS recording!" to "Upcoming recording!" because
|
- Changed the message "Upcoming VPS recording!" to "Upcoming recording!" because
|
||||||
it applies to non-VPS recordings as well.
|
it applies to non-VPS recordings as well.
|
||||||
|
- Limiting the length of the recording name in timers in case VDR is run with
|
||||||
|
--vfat, in order to avoid names that are too long for Windows.
|
||||||
|
46
recording.c
46
recording.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: recording.c 1.160 2008/02/15 15:50:06 kls Exp $
|
* $Id: recording.c 1.161 2008/02/16 13:31:39 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "recording.h"
|
#include "recording.h"
|
||||||
@ -144,10 +144,12 @@ void AssertFreeDiskSpace(int Priority, bool Force)
|
|||||||
cThreadLock DeletedRecordingsLock(&DeletedRecordings);
|
cThreadLock DeletedRecordingsLock(&DeletedRecordings);
|
||||||
if (DeletedRecordings.Count()) {
|
if (DeletedRecordings.Count()) {
|
||||||
cRecording *r = DeletedRecordings.First();
|
cRecording *r = DeletedRecordings.First();
|
||||||
cRecording *r0 = r;
|
cRecording *r0 = NULL;
|
||||||
while (r) {
|
while (r) {
|
||||||
if (r->start < r0->start)
|
if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only remove recordings that will actually increase the free video disk space
|
||||||
r0 = r;
|
if (!r0 || r->start < r0->start)
|
||||||
|
r0 = r;
|
||||||
|
}
|
||||||
r = DeletedRecordings.Next(r);
|
r = DeletedRecordings.Next(r);
|
||||||
}
|
}
|
||||||
if (r0 && r0->Remove()) {
|
if (r0 && r0->Remove()) {
|
||||||
@ -156,11 +158,13 @@ void AssertFreeDiskSpace(int Priority, bool Force)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// DeletedRecordings was empty, so to be absolutely sure there are no
|
else {
|
||||||
// deleted recordings we need to double check:
|
// DeletedRecordings was empty, so to be absolutely sure there are no
|
||||||
DeletedRecordings.Update(true);
|
// deleted recordings we need to double check:
|
||||||
if (DeletedRecordings.Count())
|
DeletedRecordings.Update(true);
|
||||||
return; // the next call will actually remove it
|
if (DeletedRecordings.Count())
|
||||||
|
return; // the next call will actually remove it
|
||||||
|
}
|
||||||
// No "deleted" files to remove, so let's see if we can delete a recording:
|
// No "deleted" files to remove, so let's see if we can delete a recording:
|
||||||
isyslog("...no deleted recording found, trying to delete an old recording...");
|
isyslog("...no deleted recording found, trying to delete an old recording...");
|
||||||
cThreadLock RecordingsLock(&Recordings);
|
cThreadLock RecordingsLock(&Recordings);
|
||||||
@ -168,15 +172,17 @@ void AssertFreeDiskSpace(int Priority, bool Force)
|
|||||||
cRecording *r = Recordings.First();
|
cRecording *r = Recordings.First();
|
||||||
cRecording *r0 = NULL;
|
cRecording *r0 = NULL;
|
||||||
while (r) {
|
while (r) {
|
||||||
if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
|
if (IsOnVideoDirectoryFileSystem(r->FileName())) { // only delete recordings that will actually increase the free video disk space
|
||||||
if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority
|
if (!r->IsEdited() && r->lifetime < MAXLIFETIME) { // edited recordings and recordings with MAXLIFETIME live forever
|
||||||
(r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired
|
if ((r->lifetime == 0 && Priority > r->priority) || // the recording has no guaranteed lifetime and the new recording has higher priority
|
||||||
if (r0) {
|
(r->lifetime > 0 && (time(NULL) - r->start) / SECSINDAY >= r->lifetime)) { // the recording's guaranteed lifetime has expired
|
||||||
if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start))
|
if (r0) {
|
||||||
r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
|
if (r->priority < r0->priority || (r->priority == r0->priority && r->start < r0->start))
|
||||||
|
r0 = r; // in any case we delete the one with the lowest priority (or the older one in case of equal priorities)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
r0 = r;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
r0 = r;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
r = Recordings.Next(r);
|
r = Recordings.Next(r);
|
||||||
@ -1035,7 +1041,7 @@ int cRecordings::TotalFileSizeMB(void)
|
|||||||
int size = 0;
|
int size = 0;
|
||||||
LOCK_THREAD;
|
LOCK_THREAD;
|
||||||
for (cRecording *recording = First(); recording; recording = Next(recording)) {
|
for (cRecording *recording = First(); recording; recording = Next(recording)) {
|
||||||
if (recording->fileSizeMB > 0)
|
if (recording->fileSizeMB > 0 && IsOnVideoDirectoryFileSystem(recording->FileName()))
|
||||||
size += recording->fileSizeMB;
|
size += recording->fileSizeMB;
|
||||||
}
|
}
|
||||||
return size;
|
return size;
|
||||||
@ -1401,10 +1407,6 @@ bool cIndexFile::IsStillRecording()
|
|||||||
|
|
||||||
// --- cFileName -------------------------------------------------------------
|
// --- cFileName -------------------------------------------------------------
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "videodir.h"
|
|
||||||
|
|
||||||
#define MAXFILESPERRECORDING 255
|
#define MAXFILESPERRECORDING 255
|
||||||
#define RECORDFILESUFFIX "/%03d.vdr"
|
#define RECORDFILESUFFIX "/%03d.vdr"
|
||||||
#define RECORDFILESUFFIXLEN 20 // some additional bytes for safety...
|
#define RECORDFILESUFFIXLEN 20 // some additional bytes for safety...
|
||||||
|
17
tools.c
17
tools.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: tools.c 1.142 2008/02/15 14:45:05 kls Exp $
|
* $Id: tools.c 1.143 2008/02/16 13:38:22 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
@ -277,6 +277,21 @@ cString itoa(int n)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EntriesOnSameFileSystem(const char *File1, const char *File2)
|
||||||
|
{
|
||||||
|
struct statfs statFs;
|
||||||
|
if (statfs(File1, &statFs) == 0) {
|
||||||
|
fsid_t fsid1 = statFs.f_fsid;
|
||||||
|
if (statfs(File2, &statFs) == 0)
|
||||||
|
return memcmp(&statFs.f_fsid, &fsid1, sizeof(fsid1)) == 0;
|
||||||
|
else
|
||||||
|
LOG_ERROR_STR(File2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_ERROR_STR(File1);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int FreeDiskSpaceMB(const char *Directory, int *UsedMB)
|
int FreeDiskSpaceMB(const char *Directory, int *UsedMB)
|
||||||
{
|
{
|
||||||
if (UsedMB)
|
if (UsedMB)
|
||||||
|
3
tools.h
3
tools.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: tools.h 1.111 2008/02/15 14:10:11 kls Exp $
|
* $Id: tools.h 1.112 2008/02/16 13:00:16 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __TOOLS_H
|
#ifndef __TOOLS_H
|
||||||
@ -193,6 +193,7 @@ int numdigits(int n);
|
|||||||
bool isnumber(const char *s);
|
bool isnumber(const char *s);
|
||||||
cString itoa(int n);
|
cString itoa(int n);
|
||||||
cString AddDirectory(const char *DirName, const char *FileName);
|
cString AddDirectory(const char *DirName, const char *FileName);
|
||||||
|
bool EntriesOnSameFileSystem(const char *File1, const char *File2);
|
||||||
int FreeDiskSpaceMB(const char *Directory, int *UsedMB = NULL);
|
int FreeDiskSpaceMB(const char *Directory, int *UsedMB = NULL);
|
||||||
bool DirectoryOk(const char *DirName, bool LogErrors = false);
|
bool DirectoryOk(const char *DirName, bool LogErrors = false);
|
||||||
bool MakeDirs(const char *FileName, bool IsDirectory = false);
|
bool MakeDirs(const char *FileName, bool IsDirectory = false);
|
||||||
|
11
videodir.c
11
videodir.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: videodir.c 1.14 2005/12/18 10:33:20 kls Exp $
|
* $Id: videodir.c 1.15 2008/02/16 13:00:03 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "videodir.h"
|
#include "videodir.h"
|
||||||
@ -232,3 +232,12 @@ void RemoveEmptyVideoDirectories(void)
|
|||||||
} while (Dir.Next());
|
} while (Dir.Next());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsOnVideoDirectoryFileSystem(const char *FileName)
|
||||||
|
{
|
||||||
|
cVideoDirectory Dir;
|
||||||
|
do {
|
||||||
|
if (EntriesOnSameFileSystem(Dir.Name(), FileName))
|
||||||
|
return true;
|
||||||
|
} while (Dir.Next());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: videodir.h 1.6 2005/10/31 11:50:23 kls Exp $
|
* $Id: videodir.h 1.7 2008/02/16 12:53:11 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __VIDEODIR_H
|
#ifndef __VIDEODIR_H
|
||||||
@ -23,5 +23,6 @@ bool VideoFileSpaceAvailable(int SizeMB);
|
|||||||
int VideoDiskSpace(int *FreeMB = NULL, int *UsedMB = NULL); // returns the used disk space in percent
|
int VideoDiskSpace(int *FreeMB = NULL, int *UsedMB = NULL); // returns the used disk space in percent
|
||||||
cString PrefixVideoFileName(const char *FileName, char Prefix);
|
cString PrefixVideoFileName(const char *FileName, char Prefix);
|
||||||
void RemoveEmptyVideoDirectories(void);
|
void RemoveEmptyVideoDirectories(void);
|
||||||
|
bool IsOnVideoDirectoryFileSystem(const char *FileName);
|
||||||
|
|
||||||
#endif //__VIDEODIR_H
|
#endif //__VIDEODIR_H
|
||||||
|
Loading…
Reference in New Issue
Block a user