Svdrp-renr-patch

From VDR Wiki
Revision as of 20:46, 21 July 2007 by Monroe (talk | contribs) (→‎Patch)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Description

The svdrp-renr patch allows the renaming of recordings via the SVDRP protocol.

With a patched version of VDRAdmin or actual VDRAdmin-AM, recordings can be easily renamed through the web interface.

This version is just a small part of the Liemikuutio patch, adapted to vdr 1.5.5.

Hardware requirements

Software requirements

  • vdr 1.5.5
  • patch

Applying the patch

If the patch is compressed you have to unpack it before

gunzip patch

Now you can install it with

cd $SOURCEDIR/VDR
patch -p 1 < /path/to/patch

Note, VDR has to be recompiled now, see VDR installation.

Problems

Patch

<diff> --- vdr-1.5.5-vanilla/recording.c 2007-06-17 15:10:12.000000000 +0200 +++ vdr-1.5.5-svdrp_renr/recording.c 2007-07-18 10:25:46.000000000 +0200 @@ -823,6 +823,44 @@

  resume = RESUME_NOT_INITIALIZED;
}

+bool cRecording::Rename(const char *newName, int *newPriority, int *newLifetime) +{ + bool result = false; + char *newFileName; + struct tm tm_r; + struct tm *t = localtime_r(&start, &tm_r); + char *localNewName = ExchangeChars(strdup(newName), true); + asprintf(&newFileName, NAMEFORMAT, VideoDirectory, localNewName, + t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, + *newPriority, *newLifetime); + free(localNewName); + if (strcmp(FileName(), newFileName)) { + if (access(newFileName, F_OK) == 0) { + isyslog("recording %s already exists", newFileName); + } + else { + isyslog("renaming recording %s to %s", FileName(), newFileName); + result = MakeDirs(newFileName, true); + if (result) + result = RenameVideoFile(FileName(), newFileName); + if (result) { + priority = *newPriority; + lifetime = *newLifetime; + free(fileName); + fileName = strdup(newFileName); + free(name); + name = strdup(newName); + free(sortBuffer); + sortBuffer = NULL; + free(titleBuffer); + titleBuffer = NULL; + } + } + } + free(newFileName); + return result; +} +

// --- cRecordings -----------------------------------------------------------

cRecordings Recordings;

--- vdr-1.5.5-vanilla/recording.h 2007-06-17 14:53:05.000000000 +0200 +++ vdr-1.5.5-svdrp_renr/recording.h 2007-07-18 09:20:22.000000000 +0200 @@ -100,6 +100,9 @@

  bool Remove(void);
       // Actually removes the file from the disk
       // Returns false in case of error

+ bool Rename(const char *newName, int *newPriority, int *newLifetime); + // Changes the file name + // Returns false in case of error

  };

class cRecordings : public cList<cRecording>, public cThread {

--- vdr-1.5.5-vanilla/svdrp.c 2007-06-23 15:14:59.000000000 +0200 +++ vdr-1.5.5-svdrp_renr/svdrp.c 2007-07-18 09:14:31.000000000 +0200 @@ -293,6 +293,8 @@

  "REMO [ on | off ]\n"
  "    Turns the remote control on or off. Without a parameter, the current\n"
  "    status of the remote control is reported.",

+ "RENR <number> <new name>\n" + " Rename recording. Number must be the Number as returned by LSTR command.",

  "SCAN\n"
  "    Forces an EPG scan. If this is a single DVB device system, the scan\n"
  "    will be done on the primary device unless it is currently recording.",

@@ -1415,6 +1417,38 @@

     Reply(250, "Remote control is %s", cRemote::Enabled() ? "enabled" : "disabled");
}

+void cSVDRP::CmdRENR(const char *Option) +{ + bool recordings = Recordings.Update(true); + if (recordings) { + if (*Option) { + char *tail; + int n = strtol(Option, &tail, 10); + cRecording *recording = Recordings.Get(n - 1); + if (recording && tail && tail != Option) { + int priority = recording->priority; + int lifetime = recording->lifetime; + char *oldName = strdup(recording->Name()); + tail = skipspace(tail); + if (recording->Rename(tail, &priority, &lifetime)) { + Reply(250, "Renamed \"%s\" to \"%s\"", oldName, recording->Name()); + Recordings.ChangeState(); + Recordings.TouchUpdate(); + } + else + Reply(501, "Renaming \"%s\" to \"%s\" failed", oldName, tail); + free(oldName); + } + else + Reply(501, "Recording not found or wrong syntax"); + } + else + Reply(501, "Missing Input settings"); + } + else + Reply(550, "No recordings available"); +} +

void cSVDRP::CmdSCAN(const char *Option)
{
  EITScanner.ForceScan();

@@ -1536,6 +1570,7 @@

  else if (CMD("PLUG"))  CmdPLUG(s);
  else if (CMD("PUTE"))  CmdPUTE(s);
  else if (CMD("REMO"))  CmdREMO(s);

+ else if (CMD("RENR")) CmdRENR(s);

  else if (CMD("SCAN"))  CmdSCAN(s);
  else if (CMD("STAT"))  CmdSTAT(s);
  else if (CMD("UPDT"))  CmdUPDT(s);

--- vdr-1.5.5-vanilla/svdrp.h 2007-04-30 14:28:28.000000000 +0200 +++ vdr-1.5.5-svdrp_renr/svdrp.h 2007-07-18 09:10:06.000000000 +0200 @@ -79,6 +79,7 @@

  void CmdPLUG(const char *Option);
  void CmdPUTE(const char *Option);
  void CmdREMO(const char *Option);

+ void CmdRENR(const char *Option);

  void CmdSCAN(const char *Option);
  void CmdSTAT(const char *Option);
  void CmdUPDT(const char *Option);

</diff>