mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Implemented storing timer id in .timer
This commit is contained in:
parent
78831a72d5
commit
3090d8146f
6
HISTORY
6
HISTORY
@ -9162,7 +9162,7 @@ Video Disk Recorder Revision History
|
|||||||
a subdirectory.
|
a subdirectory.
|
||||||
- SVDRP peering can now be limited to the default SVDRP host (see MANUAL for details).
|
- SVDRP peering can now be limited to the default SVDRP host (see MANUAL for details).
|
||||||
|
|
||||||
2018-02-12: Version 2.3.9
|
2018-02-13: Version 2.3.9
|
||||||
|
|
||||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
||||||
@ -9271,3 +9271,7 @@ Video Disk Recorder Revision History
|
|||||||
jumping to the proper offset.
|
jumping to the proper offset.
|
||||||
- Fixed getting the info of a newly edited recording (reported by Matthias Senzel).
|
- Fixed getting the info of a newly edited recording (reported by Matthias Senzel).
|
||||||
- Improved calculating signal strength and quality (thanks to Helmut Binder).
|
- Improved calculating signal strength and quality (thanks to Helmut Binder).
|
||||||
|
- While a timer is recording, the file '.timer' in the recording directory now contains
|
||||||
|
the full id of the timer that is currently recording into this directory. This is used
|
||||||
|
to determine whether a timer is still recording on a remote VDR when deleting a recording
|
||||||
|
from the Recordings menu.
|
||||||
|
71
menu.c
71
menu.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: menu.c 4.60 2018/02/10 12:45:36 kls Exp $
|
* $Id: menu.c 4.61 2018/02/13 09:25:43 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -3111,6 +3111,56 @@ eOSState cMenuRecordings::Rewind(void)
|
|||||||
return osContinue;
|
return osContinue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool TimerStillRecording(const char *FileName)
|
||||||
|
{
|
||||||
|
if (cRecordControl *rc = cRecordControls::GetRecordControl(FileName)) {
|
||||||
|
// local timer
|
||||||
|
if (Interface->Confirm(tr("Timer still recording - really delete?"))) {
|
||||||
|
LOCK_TIMERS_WRITE;
|
||||||
|
if (cTimer *Timer = rc->Timer()) {
|
||||||
|
Timer->Skip();
|
||||||
|
cRecordControls::Process(Timers, time(NULL));
|
||||||
|
if (Timer->IsSingleEvent()) {
|
||||||
|
Timers->Del(Timer);
|
||||||
|
isyslog("deleted timer %s", *Timer->ToDescr());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return true; // user didn't confirm deletion
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// remote timer
|
||||||
|
cString TimerId = GetRecordingTimerId(FileName);
|
||||||
|
if (*TimerId) {
|
||||||
|
int Id;
|
||||||
|
char *RemoteBuf = NULL;
|
||||||
|
cString Remote;
|
||||||
|
if (2 == sscanf(TimerId, "%d@%m[^ \n]", &Id, &RemoteBuf)) {
|
||||||
|
Remote = RemoteBuf;
|
||||||
|
free(RemoteBuf);
|
||||||
|
if (Interface->Confirm(tr("Timer still recording - really delete?"))) {
|
||||||
|
LOCK_TIMERS_WRITE;
|
||||||
|
if (cTimer *Timer = Timers->GetById(Id, Remote)) {
|
||||||
|
Timer->Skip();
|
||||||
|
if (Timer->IsSingleEvent()) {
|
||||||
|
if (HandleRemoteModifications(NULL, Timer))
|
||||||
|
Timers->Del(Timer);
|
||||||
|
else
|
||||||
|
return true; // error while deleting remote timer
|
||||||
|
}
|
||||||
|
else if (!HandleRemoteModifications(Timer))
|
||||||
|
return true; // error while modifying remote timer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return true; // user didn't confirm deletion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
eOSState cMenuRecordings::Delete(void)
|
eOSState cMenuRecordings::Delete(void)
|
||||||
{
|
{
|
||||||
if (HasSubMenu() || Count() == 0)
|
if (HasSubMenu() || Count() == 0)
|
||||||
@ -3118,21 +3168,8 @@ eOSState cMenuRecordings::Delete(void)
|
|||||||
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
|
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
|
||||||
if (ri && !ri->IsDirectory()) {
|
if (ri && !ri->IsDirectory()) {
|
||||||
if (Interface->Confirm(tr("Delete recording?"))) {
|
if (Interface->Confirm(tr("Delete recording?"))) {
|
||||||
if (cRecordControl *rc = cRecordControls::GetRecordControl(ri->Recording()->FileName())) {
|
if (TimerStillRecording(ri->Recording()->FileName()))
|
||||||
if (Interface->Confirm(tr("Timer still recording - really delete?"))) {
|
return osContinue;
|
||||||
if (cTimer *Timer = rc->Timer()) {
|
|
||||||
LOCK_TIMERS_WRITE;
|
|
||||||
Timer->Skip();
|
|
||||||
cRecordControls::Process(Timers, time(NULL));
|
|
||||||
if (Timer->IsSingleEvent()) {
|
|
||||||
Timers->Del(Timer);
|
|
||||||
isyslog("deleted timer %s", *Timer->ToDescr());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return osContinue;
|
|
||||||
}
|
|
||||||
cString FileName;
|
cString FileName;
|
||||||
{
|
{
|
||||||
LOCK_RECORDINGS_READ;
|
LOCK_RECORDINGS_READ;
|
||||||
@ -5198,6 +5235,7 @@ cRecordControl::cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer,
|
|||||||
SchedulesStateKey.Remove();
|
SchedulesStateKey.Remove();
|
||||||
LOCK_RECORDINGS_WRITE;
|
LOCK_RECORDINGS_WRITE;
|
||||||
Recordings->AddByName(fileName);
|
Recordings->AddByName(fileName);
|
||||||
|
SetRecordingTimerId(fileName, cString::sprintf("%d@%s", Timer->Id(), Setup.SVDRPHostName));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -5250,6 +5288,7 @@ void cRecordControl::Stop(bool ExecuteUserCommand)
|
|||||||
DELETENULL(recorder);
|
DELETENULL(recorder);
|
||||||
timer->SetRecording(false);
|
timer->SetRecording(false);
|
||||||
timer = NULL;
|
timer = NULL;
|
||||||
|
SetRecordingTimerId(fileName, NULL);
|
||||||
cStatus::MsgRecording(device, NULL, fileName, false);
|
cStatus::MsgRecording(device, NULL, fileName, false);
|
||||||
if (ExecuteUserCommand)
|
if (ExecuteUserCommand)
|
||||||
cRecordingUserCommand::InvokeCommand(RUC_AFTERRECORDING, fileName);
|
cRecordingUserCommand::InvokeCommand(RUC_AFTERRECORDING, fileName);
|
||||||
|
40
recording.c
40
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 4.19 2018/02/10 13:24:04 kls Exp $
|
* $Id: recording.c 4.20 2018/02/13 08:44:19 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "recording.h"
|
#include "recording.h"
|
||||||
@ -57,6 +57,7 @@
|
|||||||
#define MARKSFILESUFFIX "/marks"
|
#define MARKSFILESUFFIX "/marks"
|
||||||
|
|
||||||
#define SORTMODEFILE ".sort"
|
#define SORTMODEFILE ".sort"
|
||||||
|
#define TIMERRECFILE ".timer"
|
||||||
|
|
||||||
#define MINDISKSPACE 1024 // MB
|
#define MINDISKSPACE 1024 // MB
|
||||||
|
|
||||||
@ -117,7 +118,7 @@ void cRemoveDeletedRecordingsThread::Action(void)
|
|||||||
r = DeletedRecordings->Next(r);
|
r = DeletedRecordings->Next(r);
|
||||||
}
|
}
|
||||||
if (deleted) {
|
if (deleted) {
|
||||||
const char *IgnoreFiles[] = { SORTMODEFILE, NULL };
|
const char *IgnoreFiles[] = { SORTMODEFILE, TIMERRECFILE, NULL };
|
||||||
cVideoDirectory::RemoveEmptyVideoDirectories(IgnoreFiles);
|
cVideoDirectory::RemoveEmptyVideoDirectories(IgnoreFiles);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3122,3 +3123,38 @@ void IncRecordingsSortMode(const char *Directory)
|
|||||||
RecordingsSortMode = eRecordingsSortMode(0);
|
RecordingsSortMode = eRecordingsSortMode(0);
|
||||||
SetRecordingsSortMode(Directory, RecordingsSortMode);
|
SetRecordingsSortMode(Directory, RecordingsSortMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- Recording Timer Indicator ---------------------------------------------
|
||||||
|
|
||||||
|
void SetRecordingTimerId(const char *Directory, const char *TimerId)
|
||||||
|
{
|
||||||
|
cString FileName = AddDirectory(Directory, TIMERRECFILE);
|
||||||
|
if (TimerId) {
|
||||||
|
dsyslog("writing timer id '%s' to %s", TimerId, *FileName);
|
||||||
|
if (FILE *f = fopen(FileName, "w")) {
|
||||||
|
fprintf(f, "%s\n", TimerId);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOG_ERROR_STR(*FileName);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dsyslog("removing %s", *FileName);
|
||||||
|
unlink(FileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cString GetRecordingTimerId(const char *Directory)
|
||||||
|
{
|
||||||
|
cString FileName = AddDirectory(Directory, TIMERRECFILE);
|
||||||
|
const char *Id = NULL;
|
||||||
|
if (FILE *f = fopen(FileName, "r")) {
|
||||||
|
char buf[HOST_NAME_MAX + 10]; // +10 for numeric timer id and '@'
|
||||||
|
if (fgets(buf, sizeof(buf), f)) {
|
||||||
|
stripspace(buf);
|
||||||
|
Id = buf;
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
return Id;
|
||||||
|
}
|
||||||
|
@ -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.h 4.7 2017/12/11 12:56:57 kls Exp $
|
* $Id: recording.h 4.8 2018/02/13 08:44:19 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __RECORDING_H
|
#ifndef __RECORDING_H
|
||||||
@ -535,4 +535,7 @@ void GetRecordingsSortMode(const char *Directory);
|
|||||||
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode);
|
void SetRecordingsSortMode(const char *Directory, eRecordingsSortMode SortMode);
|
||||||
void IncRecordingsSortMode(const char *Directory);
|
void IncRecordingsSortMode(const char *Directory);
|
||||||
|
|
||||||
|
void SetRecordingTimerId(const char *Directory, const char *TimerId);
|
||||||
|
cString GetRecordingTimerId(const char *Directory);
|
||||||
|
|
||||||
#endif //__RECORDING_H
|
#endif //__RECORDING_H
|
||||||
|
6
svdrp.c
6
svdrp.c
@ -10,7 +10,7 @@
|
|||||||
* and interact with the Video Disk Recorder - or write a full featured
|
* and interact with the Video Disk Recorder - or write a full featured
|
||||||
* graphical interface that sits on top of an SVDRP connection.
|
* graphical interface that sits on top of an SVDRP connection.
|
||||||
*
|
*
|
||||||
* $Id: svdrp.c 4.24 2018/02/05 14:52:27 kls Exp $
|
* $Id: svdrp.c 4.25 2018/02/13 09:23:11 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "svdrp.h"
|
#include "svdrp.h"
|
||||||
@ -1334,8 +1334,10 @@ void cSVDRPServer::CmdDELT(const char *Option)
|
|||||||
LOCK_TIMERS_WRITE;
|
LOCK_TIMERS_WRITE;
|
||||||
Timers->SetExplicitModify();
|
Timers->SetExplicitModify();
|
||||||
if (cTimer *Timer = Timers->GetById(strtol(Option, NULL, 10))) {
|
if (cTimer *Timer = Timers->GetById(strtol(Option, NULL, 10))) {
|
||||||
if (Timer->Recording())
|
if (Timer->Recording()) {
|
||||||
Timer->Skip();
|
Timer->Skip();
|
||||||
|
cRecordControls::Process(Timers, time(NULL));
|
||||||
|
}
|
||||||
Timers->Del(Timer);
|
Timers->Del(Timer);
|
||||||
Timers->SetModified();
|
Timers->SetModified();
|
||||||
isyslog("SVDRP < %s deleted timer %s", *connection, *Timer->ToDescr());
|
isyslog("SVDRP < %s deleted timer %s", *connection, *Timer->ToDescr());
|
||||||
|
11
vdr.5
11
vdr.5
@ -8,7 +8,7 @@
|
|||||||
.\" License as specified in the file COPYING that comes with the
|
.\" License as specified in the file COPYING that comes with the
|
||||||
.\" vdr distribution.
|
.\" vdr distribution.
|
||||||
.\"
|
.\"
|
||||||
.\" $Id: vdr.5 4.5 2018/02/03 13:56:27 kls Exp $
|
.\" $Id: vdr.5 4.6 2018/02/13 09:33:41 kls Exp $
|
||||||
.\"
|
.\"
|
||||||
.TH vdr 5 "19 Feb 2015" "2.2" "Video Disk Recorder Files"
|
.TH vdr 5 "19 Feb 2015" "2.2" "Video Disk Recorder Files"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
@ -821,6 +821,15 @@ closer).
|
|||||||
\fBCURRENT RESTRICTIONS:\fR
|
\fBCURRENT RESTRICTIONS:\fR
|
||||||
|
|
||||||
-\ the comment is currently not used by VDR
|
-\ the comment is currently not used by VDR
|
||||||
|
.SS RECORDING TIMER
|
||||||
|
The file \fI.timer\fR (if present in a recording directory) contains
|
||||||
|
the full id of the timer that is currently recording into this directory.
|
||||||
|
Timer ids are of the form
|
||||||
|
|
||||||
|
\fBid@hostname\fR
|
||||||
|
|
||||||
|
where \fBid\fR is the timer's numerical id on the VDR with the name \fBhostname\fR.
|
||||||
|
This file is created when the timer starts recording, and is deleted when it ends.
|
||||||
.SS EPG DATA
|
.SS EPG DATA
|
||||||
The file \fIepg.data\fR contains the EPG data in an easily parsable format.
|
The file \fIepg.data\fR contains the EPG data in an easily parsable format.
|
||||||
The first character of each line defines what kind of data this line contains.
|
The first character of each line defines what kind of data this line contains.
|
||||||
|
Loading…
Reference in New Issue
Block a user