mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Added some missing user command calls for copying, renaming and moving recordings
This commit is contained in:
parent
1b1465a677
commit
ad35c9c2d3
@ -1227,6 +1227,7 @@ Peter Bieringer <pb@bieringer.de>
|
|||||||
for reporting a problem with the backslash ('\') in parameters when executing
|
for reporting a problem with the backslash ('\') in parameters when executing
|
||||||
external commands
|
external commands
|
||||||
for making the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public
|
for making the functions cRecordingInfo::SetData() and cRecordingInfo::SetAux() public
|
||||||
|
for adding some missing user command calls for copying, renaming and moving recordings
|
||||||
|
|
||||||
Alexander Damhuis <ad@phonedation.de>
|
Alexander Damhuis <ad@phonedation.de>
|
||||||
for reporting problems when deleting a timer that is currently recording
|
for reporting problems when deleting a timer that is currently recording
|
||||||
|
2
HISTORY
2
HISTORY
@ -9603,3 +9603,5 @@ Video Disk Recorder Revision History
|
|||||||
is no info file (the change in version 1.7.28 broke the fallback to the old 'summary.vdr').
|
is no info file (the change in version 1.7.28 broke the fallback to the old 'summary.vdr').
|
||||||
- Now making sure a spawned timer only fully overlaps the given event (reported by
|
- Now making sure a spawned timer only fully overlaps the given event (reported by
|
||||||
Jürgen Schneider).
|
Jürgen Schneider).
|
||||||
|
- Added some missing user command calls for copying, renaming and moving recordings
|
||||||
|
(thanks to Peter Bieringer).
|
||||||
|
36
INSTALL
36
INSTALL
@ -264,11 +264,10 @@ Executing commands before and after a recording:
|
|||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
|
|
||||||
You can use the '-r' option to define a program or script that gets called
|
You can use the '-r' option to define a program or script that gets called
|
||||||
before and after a recording is performed, and after an editing process
|
at various stages of handling recordings.
|
||||||
has finished or a recording has been deleted.
|
|
||||||
|
|
||||||
The program will be called with two or three (in case of "editing" and "edited")
|
The program will be called with two or three string parameters.
|
||||||
string parameters. The first parameter is one of
|
The first parameter is one of
|
||||||
|
|
||||||
before if this is *before* a recording starts
|
before if this is *before* a recording starts
|
||||||
started if this is after a recording has *started*
|
started if this is after a recording has *started*
|
||||||
@ -276,13 +275,16 @@ string parameters. The first parameter is one of
|
|||||||
editing if this is before *editing* a recording
|
editing if this is before *editing* a recording
|
||||||
edited if this is after a recording has been *edited*
|
edited if this is after a recording has been *edited*
|
||||||
deleted if this is after a recording has been *deleted*
|
deleted if this is after a recording has been *deleted*
|
||||||
|
copying if this is before *copying* a recording
|
||||||
|
copied if this is after a recording has been *copied*
|
||||||
|
renamed if this is after a recording has been *renamed*
|
||||||
|
moved if this is after a recording has been *moved*
|
||||||
|
(note that a move across file system borders triggers a sequence
|
||||||
|
of "copying", "copied" and "deleted")
|
||||||
|
|
||||||
and the second parameter contains the full name of the recording's
|
and the second and third parameter (if present) contain the full name of the recording's
|
||||||
directory (which may not yet exists at that moment in the "before" case).
|
directory (which may not yet exists at that moment in the "before" case).
|
||||||
In the "editing" and "edited" case it will be the name of the edited version
|
See the example below for the exact meaning of these parameters.
|
||||||
(second parameter) and the name of the source version (third parameter).
|
|
||||||
In the "deleted" case the extension of the directory name is ".del"
|
|
||||||
instead of ".rec".
|
|
||||||
|
|
||||||
Within this program you can do anything you would like to do before and/or
|
Within this program you can do anything you would like to do before and/or
|
||||||
after a recording or after an editing process. However, the program must return
|
after a recording or after an editing process. However, the program must return
|
||||||
@ -315,6 +317,22 @@ case "$1" in
|
|||||||
deleted)
|
deleted)
|
||||||
echo "Deleted recording $2"
|
echo "Deleted recording $2"
|
||||||
;;
|
;;
|
||||||
|
copying)
|
||||||
|
echo "Destination recording $2"
|
||||||
|
echo "Source recording $3"
|
||||||
|
;;
|
||||||
|
copied)
|
||||||
|
echo "Destination recording $2"
|
||||||
|
echo "Source recording $3"
|
||||||
|
;;
|
||||||
|
renamed)
|
||||||
|
echo "New name of recording $2"
|
||||||
|
echo "Old name of recording $3"
|
||||||
|
;;
|
||||||
|
moved)
|
||||||
|
echo "New path of recording $2"
|
||||||
|
echo "Old path of recording $3"
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "ERROR: unknown state: $1"
|
echo "ERROR: unknown state: $1"
|
||||||
;;
|
;;
|
||||||
|
@ -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 5.4 2021/01/18 13:35:16 kls Exp $
|
* $Id: recording.c 5.5 2021/01/19 20:38:28 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "recording.h"
|
#include "recording.h"
|
||||||
@ -1924,6 +1924,7 @@ bool cRecordingsHandlerEntry::Active(cRecordings *Recordings)
|
|||||||
Recordings->AddByName(FileNameDst(), false);
|
Recordings->AddByName(FileNameDst(), false);
|
||||||
}
|
}
|
||||||
else if ((Usage() & (ruMove | ruCopy)) != 0) {
|
else if ((Usage() & (ruMove | ruCopy)) != 0) {
|
||||||
|
cRecordingUserCommand::InvokeCommand(RUC_COPYINGRECORDING, FileNameDst(), FileNameSrc());
|
||||||
copier = new cDirCopier(FileNameSrc(), FileNameDst());
|
copier = new cDirCopier(FileNameSrc(), FileNameDst());
|
||||||
copier->Start();
|
copier->Start();
|
||||||
}
|
}
|
||||||
@ -1932,11 +1933,15 @@ bool cRecordingsHandlerEntry::Active(cRecordings *Recordings)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// We're done:
|
// We're done:
|
||||||
|
if (!error && (usage & (ruMove | ruCopy)) != 0)
|
||||||
|
cRecordingUserCommand::InvokeCommand(RUC_COPIEDRECORDING, FileNameDst(), FileNameSrc());
|
||||||
if (!error && (usage & ruMove) != 0) {
|
if (!error && (usage & ruMove) != 0) {
|
||||||
cRecording Recording(FileNameSrc());
|
cRecording Recording(FileNameSrc());
|
||||||
if (Recording.Delete())
|
if (Recording.Delete()) {
|
||||||
|
cRecordingUserCommand::InvokeCommand(RUC_MOVEDRECORDING, FileNameDst(), FileNameSrc());
|
||||||
Recordings->DelByName(Recording.FileName());
|
Recordings->DelByName(Recording.FileName());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Recordings->SetModified(); // to trigger a state change
|
Recordings->SetModified(); // to trigger a state change
|
||||||
Recordings->TouchUpdate();
|
Recordings->TouchUpdate();
|
||||||
return false;
|
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: recording.h 5.2 2021/01/18 12:55:47 kls Exp $
|
* $Id: recording.h 5.3 2021/01/19 20:38:28 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __RECORDING_H
|
#ifndef __RECORDING_H
|
||||||
@ -421,6 +421,10 @@ public:
|
|||||||
#define RUC_EDITINGRECORDING "editing"
|
#define RUC_EDITINGRECORDING "editing"
|
||||||
#define RUC_EDITEDRECORDING "edited"
|
#define RUC_EDITEDRECORDING "edited"
|
||||||
#define RUC_DELETERECORDING "deleted"
|
#define RUC_DELETERECORDING "deleted"
|
||||||
|
#define RUC_RENAMEDRECORDING "renamed" // same directory, only the base name is changed
|
||||||
|
#define RUC_MOVEDRECORDING "moved" // different directory (and maybe base name), or "copy" to other filesystem + delete original (triggers copying->copied->deleted)
|
||||||
|
#define RUC_COPYINGRECORDING "copying"
|
||||||
|
#define RUC_COPIEDRECORDING "copied"
|
||||||
|
|
||||||
class cRecordingUserCommand {
|
class cRecordingUserCommand {
|
||||||
private:
|
private:
|
||||||
|
12
tools.c
12
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 5.2 2020/12/29 21:40:29 kls Exp $
|
* $Id: tools.c 5.3 2021/01/19 20:38:28 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
@ -200,6 +200,16 @@ int strcountchr(const char *s, char c)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cString strgetbefore(const char *s, char c, int n)
|
||||||
|
{
|
||||||
|
const char *p = strrchr(s, 0); // points to the terminating 0 of s
|
||||||
|
while (--p >= s) {
|
||||||
|
if (*p == c && --n == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return cString(s, p);
|
||||||
|
}
|
||||||
|
|
||||||
const char *strgetlast(const char *s, char c)
|
const char *strgetlast(const char *s, char c)
|
||||||
{
|
{
|
||||||
const char *p = strrchr(s, c);
|
const char *p = strrchr(s, c);
|
||||||
|
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 5.2 2021/01/01 15:26:27 kls Exp $
|
* $Id: tools.h 5.3 2021/01/19 20:38:28 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __TOOLS_H
|
#ifndef __TOOLS_H
|
||||||
@ -233,6 +233,7 @@ char *strreplace(char *s, char c1, char c2);
|
|||||||
char *strreplace(char *s, const char *s1, const char *s2); ///< re-allocates 's' and deletes the original string if necessary!
|
char *strreplace(char *s, const char *s1, const char *s2); ///< re-allocates 's' and deletes the original string if necessary!
|
||||||
const char *strchrn(const char *s, char c, size_t n); ///< returns a pointer to the n'th occurrence (counting from 1) of c in s, or NULL if no such character was found. If n is 0, s is returned.
|
const char *strchrn(const char *s, char c, size_t n); ///< returns a pointer to the n'th occurrence (counting from 1) of c in s, or NULL if no such character was found. If n is 0, s is returned.
|
||||||
int strcountchr(const char *s, char c); ///< returns the number of occurrences of 'c' in 's'.
|
int strcountchr(const char *s, char c); ///< returns the number of occurrences of 'c' in 's'.
|
||||||
|
cString strgetbefore(const char *s, char c, int n = 1); // returns the part of 's' before (and excluding) the n'th occurrence of 'c' from the right, or an empty string if there is no such 'c'.
|
||||||
const char *strgetlast(const char *s, char c); // returns the part of 's' after the last occurrence of 'c', or 's' if there is no 'c'.
|
const char *strgetlast(const char *s, char c); // returns the part of 's' after the last occurrence of 'c', or 's' if there is no 'c'.
|
||||||
inline char *strgetlast(char *s, char c) { return const_cast<char *>(strgetlast(static_cast<const char *>(s), c)); } // returns the part of 's' after the last occurrence of 'c', or 's' if there is no 'c'.
|
inline char *strgetlast(char *s, char c) { return const_cast<char *>(strgetlast(static_cast<const char *>(s), c)); } // returns the part of 's' after the last occurrence of 'c', or 's' if there is no 'c'.
|
||||||
inline char *skipspace(const char *s)
|
inline char *skipspace(const char *s)
|
||||||
|
@ -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 4.1 2015/08/11 13:39:59 kls Exp $
|
* $Id: videodir.c 5.1 2021/01/19 20:38:28 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "videodir.h"
|
#include "videodir.h"
|
||||||
@ -96,6 +96,11 @@ bool cVideoDirectory::Move(const char *FromName, const char *ToName)
|
|||||||
LOG_ERROR_STR(ToName);
|
LOG_ERROR_STR(ToName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// detect whether it's a real recording move inside same file system or a recording rename
|
||||||
|
if (strcmp(strgetbefore(FromName, '/', 2), strgetbefore(ToName, '/', 2)))
|
||||||
|
cRecordingUserCommand::InvokeCommand(RUC_MOVEDRECORDING, ToName, FromName);
|
||||||
|
else
|
||||||
|
cRecordingUserCommand::InvokeCommand(RUC_RENAMEDRECORDING, ToName, FromName);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return RecordingsHandler.Add(ruMove, FromName, ToName);
|
return RecordingsHandler.Add(ruMove, FromName, ToName);
|
||||||
|
Loading…
Reference in New Issue
Block a user