diff options
| -rw-r--r-- | INSTALL | 42 | ||||
| -rw-r--r-- | dvbapi.c | 13 | ||||
| -rw-r--r-- | dvbapi.h | 3 | ||||
| -rw-r--r-- | menu.c | 24 | ||||
| -rw-r--r-- | menu.h | 6 | ||||
| -rw-r--r-- | recording.c | 16 | ||||
| -rw-r--r-- | recording.h | 14 | ||||
| -rw-r--r-- | vdr.c | 4 | 
8 files changed, 85 insertions, 37 deletions
| @@ -162,16 +162,44 @@ Executing commands before and after a recording:  ------------------------------------------------  You can use the '-r' option to define a program or script that gets called -before and after a recording is performed. +before and after a recording is performed, and after an editing process +has finished. -The program will be called with one integer parameter that is "1" if this -is *before* the recording, and "0" if this is *after* the recording. +The program will be called with two string parameters. The first parameter +is one of + +  before      if this is *before* a recording starts +  after       if this is *after* a recording has finished +  edited      if this is after a recording has been *edited* + +and the second parameter contains the full name of the recording's +directory (which may not yet exists at that moment in the "before" case). +In the "edited" case it will be the name of the edited version.  Within this program you can do anything you would like to do before and/or -after a recording. However, the program must return as soon as possible, -because otherwise it will block further execution of VDR. Be expecially careful -to make sure the program returns before the watchdog timeout you may have set -up with the '-w' option! +after a recording or after an editing process. However, the program must return +as soon as possible, because otherwise it will block further execution of VDR. +Be especially careful to make sure the program returns before the watchdog +timeout you may have set up with the '-w' option! If the operation you want to +perform will take longer, you will have to run it as a background job. + +An example script for use with the '-r' option could look like this: + +#!/bin/sh +case "$1" in +     before) +            echo "Before recording $2" +            ;; +     after) +            echo "After recording $2" +            ;; +     edited) +            echo "Edited recording $2" +            ;; +     *) +            echo "ERROR: unknown state: $1" +            ;; +     esac  Command line options:  --------------------- @@ -7,7 +7,7 @@   * DVD support initially written by Andreas Schultz <aschultz@warp10.net>   * based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si>   * - * $Id: dvbapi.c 1.128 2001/09/22 13:39:56 kls Exp $ + * $Id: dvbapi.c 1.129 2001/09/23 13:44:27 kls Exp $   */  //#define DVDDEBUG        1 @@ -2406,16 +2406,18 @@ void cCuttingBuffer::Action(void)  // --- cVideoCutter ---------------------------------------------------------- +char *cVideoCutter::editedVersionName = NULL;  cCuttingBuffer *cVideoCutter::cuttingBuffer = NULL;  bool cVideoCutter::Start(const char *FileName)  {    if (!cuttingBuffer) {       cRecording Recording(FileName); -     const char *EditedVersionName = Recording.PrefixFileName('%'); -     if (EditedVersionName && RemoveVideoFile(EditedVersionName) && MakeDirs(EditedVersionName, true)) { +     const char *evn = Recording.PrefixFileName('%'); +     if (evn && RemoveVideoFile(evn) && MakeDirs(evn, true)) { +        editedVersionName = strdup(evn);          Recording.WriteSummary(); -        cuttingBuffer = new cCuttingBuffer(FileName, EditedVersionName); +        cuttingBuffer = new cCuttingBuffer(FileName, editedVersionName);          return true;          }       } @@ -2434,6 +2436,9 @@ bool cVideoCutter::Active(void)       if (cuttingBuffer->Active())          return true;       Stop(); +     cRecordingUserCommand::InvokeCommand(RUC_EDITEDRECORDING, editedVersionName); +     delete editedVersionName; +     editedVersionName = NULL;       }    return false;  } @@ -4,7 +4,7 @@   * See the main source file 'vdr.c' for copyright information and   * how to reach the author.   * - * $Id: dvbapi.h 1.52 2001/09/22 13:40:30 kls Exp $ + * $Id: dvbapi.h 1.53 2001/09/23 11:01:46 kls Exp $   */  #ifndef __DVBAPI_H @@ -73,6 +73,7 @@ class cCuttingBuffer;  class cVideoCutter {  private: +  static char *editedVersionName;    static cCuttingBuffer *cuttingBuffer;  public:    static bool Start(const char *FileName); @@ -4,7 +4,7 @@   * See the main source file 'vdr.c' for copyright information and   * how to reach the author.   * - * $Id: menu.c 1.126 2001/09/22 14:17:27 kls Exp $ + * $Id: menu.c 1.127 2001/09/23 10:58:48 kls Exp $   */  #include "menu.h" @@ -2104,12 +2104,11 @@ eOSState cDisplayChannel::ProcessKey(eKeys Key)  // --- cRecordControl -------------------------------------------------------- -const char *cRecordControl::userCommand = NULL; -  cRecordControl::cRecordControl(cDvbApi *DvbApi, cTimer *Timer)  {    eventInfo = NULL;    instantId = NULL; +  fileName = NULL;    dvbApi = DvbApi;    if (!dvbApi) dvbApi = cDvbApi::PrimaryDvbApi;//XXX    timer = Timer; @@ -2130,8 +2129,9 @@ cRecordControl::cRecordControl(cDvbApi *DvbApi, cTimer *Timer)          Summary = eventInfo->GetExtendedDescription();          }       cRecording Recording(timer, Subtitle, Summary); -     InvokeUserCommand(true); -     if (dvbApi->StartRecord(Recording.FileName(), Channels.GetByNumber(timer->channel)->ca, timer->priority)) +     fileName = strdup(Recording.FileName()); +     cRecordingUserCommand::InvokeCommand(RUC_BEFORERECORDING, fileName); +     if (dvbApi->StartRecord(fileName, Channels.GetByNumber(timer->channel)->ca, timer->priority))          Recording.WriteSummary();       Interface->DisplayRecording(dvbApi->CardIndex(), true);       } @@ -2143,6 +2143,7 @@ cRecordControl::~cRecordControl()  {    Stop(true);    delete instantId; +  delete fileName;  }  bool cRecordControl::GetEventInfo(void) @@ -2173,17 +2174,6 @@ bool cRecordControl::GetEventInfo(void)    return false;  } -void cRecordControl::InvokeUserCommand(bool Before) -{ -  if (userCommand) { -     char *cmd; -     asprintf(&cmd, "%s %d", userCommand, Before); -     isyslog(LOG_INFO, "executing '%s'", cmd); -     system(cmd); -     delete cmd; -     } -} -  void cRecordControl::Stop(bool KeepInstant)  {    if (timer) { @@ -2198,7 +2188,7 @@ void cRecordControl::Stop(bool KeepInstant)          }       timer = NULL;       Interface->DisplayRecording(dvbApi->CardIndex(), false); -     InvokeUserCommand(false); +     cRecordingUserCommand::InvokeCommand(RUC_AFTERRECORDING, fileName);       }  } @@ -4,7 +4,7 @@   * See the main source file 'vdr.c' for copyright information and   * how to reach the author.   * - * $Id: menu.h 1.29 2001/09/22 14:02:37 kls Exp $ + * $Id: menu.h 1.30 2001/09/23 10:57:33 kls Exp $   */  #ifndef _MENU_H @@ -71,17 +71,15 @@ public:  class cRecordControl {  private: -  static const char *userCommand;    cDvbApi *dvbApi;    cTimer *timer;    const cEventInfo *eventInfo;    char *instantId; +  char *fileName;    bool GetEventInfo(void); -  void InvokeUserCommand(bool Before);  public:    cRecordControl(cDvbApi *DvbApi, cTimer *Timer = NULL);    virtual ~cRecordControl(); -  static void SetUserCommand(const char *UserCommand) { userCommand = UserCommand; }    bool Process(time_t t);    bool Uses(cDvbApi *DvbApi) { return DvbApi == dvbApi; }    void Stop(bool KeepInstant = false); diff --git a/recording.c b/recording.c index f6573781..df504074 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@   * See the main source file 'vdr.c' for copyright information and   * how to reach the author.   * - * $Id: recording.c 1.36 2001/09/02 15:09:28 kls Exp $ + * $Id: recording.c 1.37 2001/09/23 13:43:29 kls Exp $   */  #define _GNU_SOURCE @@ -513,3 +513,17 @@ cMark *cMarks::GetNext(int Position)    return NULL;  } +// --- cRecordingUserCommand ------------------------------------------------- + +const char *cRecordingUserCommand::command = NULL; + +void cRecordingUserCommand::InvokeCommand(const char *State, const char *RecordingFileName) +{ +  if (command) { +     char *cmd; +     asprintf(&cmd, "%s %s '%s'", command, State, RecordingFileName); +     isyslog(LOG_INFO, "executing '%s'", cmd); +     system(cmd); +     delete cmd; +     } +} diff --git a/recording.h b/recording.h index e1af3db3..d2391a90 100644 --- a/recording.h +++ b/recording.h @@ -4,7 +4,7 @@   * See the main source file 'vdr.c' for copyright information and   * how to reach the author.   * - * $Id: recording.h 1.16 2001/09/02 11:35:56 kls Exp $ + * $Id: recording.h 1.17 2001/09/23 13:43:58 kls Exp $   */  #ifndef __RECORDING_H @@ -83,4 +83,16 @@ public:    cMark *GetNext(int Position);    }; +#define RUC_BEFORERECORDING "before" +#define RUC_AFTERRECORDING  "after" +#define RUC_EDITEDRECORDING "edited" + +class cRecordingUserCommand { +private: +  static const char *command; +public: +  static void SetCommand(const char *Command) { command = Command; } +  static void InvokeCommand(const char *State, const char *RecordingFileName); +  }; +  #endif //__RECORDING_H @@ -22,7 +22,7 @@   *   * The project's page is at http://www.cadsoft.de/people/kls/vdr   * - * $Id: vdr.c 1.77 2001/09/23 10:11:07 kls Exp $ + * $Id: vdr.c 1.78 2001/09/23 10:59:29 kls Exp $   */  #define _GNU_SOURCE @@ -182,7 +182,7 @@ int main(int argc, char *argv[])                         return 2;                         }                      break; -          case 'r': cRecordControl::SetUserCommand(optarg); +          case 'r': cRecordingUserCommand::SetCommand(optarg);                      break;            case 's': Shutdown = optarg;                      break; | 
