rpms/vdr/devel vdr-1.4.7-hlcutter-0.2.0-finnish.patch, NONE, 1.1 vdr-1.4.7-hlcutter-0.2.0.diff, NONE, 1.1 vdr-runvdr.sh, 1.2, 1.3 vdr.spec, 1.17, 1.18 vdr.sysconfig, 1.3, 1.4

Ville Skytta (scop) fedora-extras-commits at redhat.com
Sun Jan 20 22:07:51 UTC 2008


Author: scop

Update of /cvs/pkgs/rpms/vdr/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv11745

Modified Files:
	vdr-runvdr.sh vdr.spec vdr.sysconfig 
Added Files:
	vdr-1.4.7-hlcutter-0.2.0-finnish.patch 
	vdr-1.4.7-hlcutter-0.2.0.diff 
Log Message:
* Sat Jan 12 2008 Ville Skyttä <ville.skytta at iki.fi> - 1.4.7-7
- Include Udo Richter's hard link cutter patch v0.2.0 (see README-HLCUTTER).
- Add some plugins to the default plugin order list in sysconfig.
- Minor runvdr cleanups.


vdr-1.4.7-hlcutter-0.2.0-finnish.patch:

--- NEW FILE vdr-1.4.7-hlcutter-0.2.0-finnish.patch ---
--- i18n.c~	2007-02-25 14:08:26.000000000 +0200
+++ i18n.c	2008-01-12 20:52:25.000000000 +0200
@@ -4294,6 +4294,28 @@
     "Max. video filstørrelse (MB)",
     "Maximální velikost nahrávky (MB)",
   },
+  { "Setup.Recording$Max. recording size (GB)",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "Suurin tallennekoko (Gt)",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+  },
   { "Setup.Recording$Split edited files",
     "Editierte Dateien aufteilen",
     "Razdeli urejene datoteke",
@@ -4316,6 +4338,28 @@
     "Opdel redigerede filer",
     "Dìlit editované soubory",
   },
+  { "Setup.Recording$Hard Link Cutter",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "Käytä kovalinkkejä muokkauksessa",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+  },
   { "Setup.Replay$Multi speed mode",
     "Mehrstufiger Vor-/Rücklauf",
     "Re¾im z veè hitrostmi",

vdr-1.4.7-hlcutter-0.2.0.diff:

--- NEW FILE vdr-1.4.7-hlcutter-0.2.0.diff ---
Index: menu.c
===================================================================
--- menu.c	(Revision 1000)
+++ menu.c	(Arbeitskopie)
@@ -2571,2 +2571,4 @@
   Add(new cMenuEditIntItem( tr("Setup.Recording$Max. video file size (MB)"), &data.MaxVideoFileSize, MINVIDEOFILESIZE, MAXVIDEOFILESIZE));
+  Add(new cMenuEditIntItem( tr("Setup.Recording$Max. recording size (GB)"),  &data.MaxRecordingSize, MINRECORDINGSIZE, MAXRECORDINGSIZE));
   Add(new cMenuEditBoolItem(tr("Setup.Recording$Split edited files"),        &data.SplitEditedFiles));
+  Add(new cMenuEditBoolItem(tr("Setup.Recording$Hard Link Cutter"),          &data.HardLinkCutter));
Index: cutter.c
===================================================================
--- cutter.c	(Revision 1000)
+++ cutter.c	(Arbeitskopie)
@@ -71,6 +71,7 @@
      Mark = fromMarks.Next(Mark);
      int FileSize = 0;
      int CurrentFileNumber = 0;
+     bool SkipThisSourceFile = false;
      int LastIFrame = 0;
      toMarks.Add(0);
      toMarks.Save();
@@ -88,12 +89,92 @@
 
            // Read one frame:
 
-           if (fromIndex->Get(Index++, &FileNumber, &FileOffset, &PictureType, &Length)) {
-              if (FileNumber != CurrentFileNumber) {
-                 fromFile = fromFileName->SetOffset(FileNumber, FileOffset);
-                 fromFile->SetReadAhead(MEGABYTE(20));
-                 CurrentFileNumber = FileNumber;
-                 }
+           if (!fromIndex->Get(Index++, &FileNumber, &FileOffset, &PictureType, &Length)) {
+              // Error, unless we're past last cut-in and there's no cut-out
+              if (Mark || LastMark)
+                 error = "index";
+              break;
+              }
+
+           if (FileNumber != CurrentFileNumber) {
+              fromFile = fromFileName->SetOffset(FileNumber, FileOffset);
+              fromFile->SetReadAhead(MEGABYTE(20));
+              CurrentFileNumber = FileNumber;
+              if (SkipThisSourceFile) {
+                 // At end of fast forward: Always skip to next file
+                 toFile = toFileName->NextFile();
+                 if (!toFile) {
+                    error = "toFile 4";
+                    break;
+                    }
+                 FileSize = 0;
+                 SkipThisSourceFile = false;
+                 }                 
+              
+
+              if (Setup.HardLinkCutter && FileOffset == 0) {
+                 // We are at the beginning of a new source file.
+                 // Do we need to copy the whole file?
+
+                 // if !Mark && LastMark, then we're past the last cut-out and continue to next I-frame
+                 // if !Mark && !LastMark, then there's just a cut-in, but no cut-out
+                 // if Mark, then we're between a cut-in and a cut-out
+                 
+                 uchar MarkFileNumber;
+                 int MarkFileOffset;
+                 // Get file number of next cut mark
+                 if (!Mark && !LastMark
+                     || Mark
+                        && fromIndex->Get(Mark->position, &MarkFileNumber, &MarkFileOffset)
+                        && (MarkFileNumber != CurrentFileNumber)) {
+                    // The current source file will be copied completely.
+                    // Start new output file unless we did that already
+                    if (FileSize != 0) {
+                       toFile = toFileName->NextFile();
+                       if (!toFile) {
+                          error = "toFile 3";
+                          break;
+                          }
+                       FileSize = 0;
+                       }
+
+                    // Safety check that file has zero size
+                    struct stat buf;
+                    if (stat(toFileName->Name(), &buf) == 0) {
+                       if (buf.st_size != 0) {
+                          esyslog("cCuttingThread: File %s exists and has nonzero size", toFileName->Name());
+                          error = "nonzero file exist";
+                          break;
+                          }
+                       }
+                    else if (errno != ENOENT) {
+                       esyslog("cCuttingThread: stat failed on %s", toFileName->Name());
+                       error = "stat";
+                       break;
+                       }
+
+                    // Clean the existing 0-byte file
+                    toFileName->Close();
+                    cString ActualToFileName(ReadLink(toFileName->Name()), true);
+                    unlink(ActualToFileName);
+                    unlink(toFileName->Name());
+
+                    // Try to create a hard link
+                    if (HardLinkVideoFile(fromFileName->Name(), toFileName->Name())) {
+                       // Success. Skip all data transfer for this file
+                       SkipThisSourceFile = true;
+                       cutIn = false;
+                       toFile = NULL; // was deleted by toFileName->Close()
+                       } 
+                    else {
+                       // Fallback: Re-open the file if necessary
+                       toFile = toFileName->Open();
+                       }
+                    }
+                 } 
+              }
+
+           if (!SkipThisSourceFile) {
               if (fromFile) {
                  int len = ReadFrame(fromFile, buffer,  Length, sizeof(buffer));
                  if (len < 0) {
@@ -110,15 +191,12 @@
                  break;
                  }
               }
-           else
-              break;
-
            // Write one frame:
 
            if (PictureType == I_FRAME) { // every file shall start with an I_FRAME
               if (LastMark) // edited version shall end before next I-frame
                  break;
-              if (FileSize > MEGABYTE(Setup.MaxVideoFileSize)) {
+              if (!SkipThisSourceFile && FileSize > toFileName->MaxFileSize()) {
                  toFile = toFileName->NextFile();
                  if (!toFile) {
                     error = "toFile 1";
@@ -128,12 +206,12 @@
                  }
               LastIFrame = 0;
 
-              if (cutIn) {
+              if (!SkipThisSourceFile && cutIn) {
                  cRemux::SetBrokenLink(buffer, Length);
                  cutIn = false;
                  }
               }
-           if (toFile->Write(buffer, Length) < 0) {
+           if (!SkipThisSourceFile && toFile->Write(buffer, Length) < 0) {
               error = "safe_write";
               break;
               }
@@ -168,7 +246,7 @@
                     }
                  }
               else
-                 LastMark = true;
+                 LastMark = true; // After last cut-out: Write on until next I-frame, then exit
               }
            }
      Recordings.TouchUpdate();
Index: README-HLCUTTER
===================================================================
--- README-HLCUTTER	(Revision 0)
+++ README-HLCUTTER	(Revision 0)
@@ -0,0 +1,117 @@
+
+                    VDR-HLCUTTER README
+
+
+Written by:           Udo Richter
+Available at:         http://www.udo-richter.de/vdr/patches.html#hlcutter
+                      http://www.udo-richter.de/vdr/patches.en.html#hlcutter
+Contact:              udo_richter at gmx.de
+
+
+
+About
+-----
+
+The hard link cutter patch changes the recording editing algorithms of VDR to
+use filesystem hard links to 'copy' recording files whenever possible to speed
+up editing recordings noticeably.
+
+The patch has matured to be quite stable, at least I'm using it without issues.
+Nevertheless the patch is still in development and should be used with caution. 
+The patch is EXPERIMENTAL for multiple /videoxx folders. The safety checks 
+should prevent data loss, but you should always carefully check the results.
+
+While editing a recording, the patch searches for any 00x.vdr files that dont
+contain editing marks and would normally be copied 1:1 unmodified to the edited
+recording. In this case the current target 00x.vdr file will be aborted, and 
+the cutter process attempts to duplicate the source file as a hard link, so 
+that both files share the same disk space. If this succeeds, the editing 
+process fast-forwards through the duplicated file and continues normally 
+beginning with the next source file. If hard linking fails, the cutter process
+continues with plain old copying. (but does not take up the aborted last file.)
+
+After editing, the un-edited recording can be deleted as usual, the hard linked
+copies will continue to exist as the only remaining copy.
+
+To be effective, the default 'Max. video file size (MB)' should be lowered. 
+The patch lowers the smallest possible file size to 1mb. Since VDR only 
+supports up to 255 files, this would limit the recording size to 255Mb or
+10 minutes, in other words: This setting is insane!
+
+To make sure that the 255 file limit will not be reached, the patch also 
+introduces "Max. recording size (GB)" with a default of 100Gb (66 hours), and 
+increases the file size to 2000Mb early enough, so that 100Gb-recordings will
+fit into the 255 files.
+
+Picking the right parameters can be tricky. The smaller the file size, the 
+faster the editing process works. However, with a small file size, long 
+recordings will fall back to 2000Mb files soon, that are slow on editing again.
+
+Here are some examples:
+
+Max file size:      100Gb   100Gb   100Gb   100Gb   100Gb   100Gb   100Gb
+Max recording size: 1Mb     10Mb    20Mb    30Mb    40Mb    50Mb    100Mb
+
+Small files:        1-203   1-204   1-205   1-206   1-207   1-209   1-214
+  GBytes:           0.2     2.0     4.0     6.0     8.1     10.2    20.9
+  Hours:            0.13    1.3     2.65    4       5.4     6.8     13.9
+
+Big (2000mb) files: 204-255 204-255 206-255 207-255 208-255 210-255 215-255
+  GBytes:           101.5   99.6    97.7    95.7    93.8    89.8    80.1
+  Hours:            67      66      65      63      62      60      53
+
+A recording limit of 100Gb keeps plenty of reserve without blocking too much
+file numbers. And with a file size of 30-40Mb, recordings of 4-5 hours fit into
+small files completely. (depends on bit rate of course)
+
+
+
+The patch must be enabled in Setup-> Recordings-> Hard Link Cutter. When 
+disabled, the cutter process behaves identical to VDR's default cutter.
+
+There's a //#define HARDLINK_TEST_ONLY in the videodir.c file that enables a
+test-mode that hard-links 00x.vdr_ files only, and continues the classic 
+editing. The resulting 00x.vdr and 00x.vdr_ files should be identical. If you 
+delete the un-edited recording, dont forget to delete the *.vdr_ files too, 
+they will now eat real disk space.
+
+Note: 'du' displays the disk space of hard links only on first appearance, and
+usually you will see a noticeably smaller size on the edited recording.
+
+
+History
+-------
+
+Version 0.2.0
+  New: Support for multiple /videoXX recording folders, using advanced searching
+       for matching file systems where a hard link can be created.
+       Also supports deep mounted file systems.
+  Fix: Do not fail if last mark is a cut-in. (Again.)
+
+Version 0.1.4
+  New: Dynamic increase of file size before running out of xxx.vdr files
+  Fix: Last edit mark is not a cut-out
+  Fix: Write error if link-copied file is smaller than allowed file size
+  Fix: Broken index/marks if cut-in is at the start of a new file
+  Fix: Clear dangeling pointer to free'd cUnbufferedFile, 
+       thx to Matthias Schwarzott
+
+Version 0.1.0
+  Initial release
+
+
+
+
+Future plans
+------------
+
+Since original and edited copy share disk space, free space is wrong if one of
+them is moved to *.del. Free space should only count files with hard link 
+count = 1. This still goes wrong if all copies get deleted.
+
+
+For more safety, the hard-linked files may be made read-only, as modifications
+to one copy will affect the other copy too. (except deleting, of course)
+
+
+SetBrokenLink may get lost on rare cases, this needs some more thoughts.
Index: recorder.c
===================================================================
--- recorder.c	(Revision 1000)
+++ recorder.c	(Arbeitskopie)
@@ -82,7 +82,7 @@
 bool cFileWriter::NextFile(void)
 {
   if (recordFile && pictureType == I_FRAME) { // every file shall start with an I_FRAME
-     if (fileSize > MEGABYTE(Setup.MaxVideoFileSize) || RunningLowOnDiskSpace()) {
+     if (fileSize > fileName->MaxFileSize() || RunningLowOnDiskSpace()) {
         recordFile = fileName->NextFile();
         fileSize = 0;
         }
Index: config.c
===================================================================
--- config.c	(Revision 1000)
+++ config.c	(Arbeitskopie)
@@ -264,7 +264,9 @@
   OSDMessageTime = 1;
   UseSmallFont = 1;
   MaxVideoFileSize = MAXVIDEOFILESIZE;
+  MaxRecordingSize = DEFAULTRECORDINGSIZE;
   SplitEditedFiles = 0;
+  HardLinkCutter = 0;
   MinEventTimeout = 30;
   MinUserInactivity = 300;
   MultiSpeedMode = 0;
@@ -425,7 +427,9 @@
   else if (!strcasecmp(Name, "OSDMessageTime"))      OSDMessageTime     = atoi(Value);
   else if (!strcasecmp(Name, "UseSmallFont"))        UseSmallFont       = atoi(Value);
   else if (!strcasecmp(Name, "MaxVideoFileSize"))    MaxVideoFileSize   = atoi(Value);
+  else if (!strcasecmp(Name, "MaxRecordingSize"))    MaxRecordingSize   = atoi(Value);
   else if (!strcasecmp(Name, "SplitEditedFiles"))    SplitEditedFiles   = atoi(Value);
+  else if (!strcasecmp(Name, "HardLinkCutter"))      HardLinkCutter     = atoi(Value);
   else if (!strcasecmp(Name, "MinEventTimeout"))     MinEventTimeout    = atoi(Value);
   else if (!strcasecmp(Name, "MinUserInactivity"))   MinUserInactivity  = atoi(Value);
   else if (!strcasecmp(Name, "MultiSpeedMode"))      MultiSpeedMode     = atoi(Value);
@@ -493,7 +497,9 @@
   Store("OSDMessageTime",     OSDMessageTime);
   Store("UseSmallFont",       UseSmallFont);
   Store("MaxVideoFileSize",   MaxVideoFileSize);
+  Store("MaxRecordingSize",   MaxRecordingSize);
   Store("SplitEditedFiles",   SplitEditedFiles);
+  Store("HardLinkCutter",     HardLinkCutter);
   Store("MinEventTimeout",    MinEventTimeout);
   Store("MinUserInactivity",  MinUserInactivity);
   Store("MultiSpeedMode",     MultiSpeedMode);
Index: config.h
===================================================================
--- config.h	(Revision 1000)
+++ config.h	(Arbeitskopie)
@@ -242,7 +242,9 @@
   int OSDMessageTime;
   int UseSmallFont;
   int MaxVideoFileSize;
+  int MaxRecordingSize;
   int SplitEditedFiles;
+  int HardLinkCutter;
   int MinEventTimeout, MinUserInactivity;
   int MultiSpeedMode;
   int ShowReplayMode;
Index: recording.c
===================================================================
--- recording.c	(Revision 1000)
+++ recording.c	(Arbeitskopie)
@@ -1489,6 +1489,16 @@
   return NULL;
 }
 
+int cFileName::MaxFileSize() {
+  const int smallFiles = (255 * MAXVIDEOFILESIZE - 1024 * Setup.MaxRecordingSize)
+                          / max(MAXVIDEOFILESIZE - Setup.MaxVideoFileSize, 1);
+
+  if (fileNumber <= smallFiles)
+     return MEGABYTE(Setup.MaxVideoFileSize);
+  
+  return MEGABYTE(MAXVIDEOFILESIZE);
+}
+
 cUnbufferedFile *cFileName::NextFile(void)
 {
   return SetOffset(fileNumber + 1);
Index: recording.h
===================================================================
--- recording.h	(Revision 1000)
+++ recording.h	(Arbeitskopie)
@@ -187,8 +187,16 @@
 // may be slightly higher because we stop recording only before the next
 // 'I' frame, to have a complete Group Of Pictures):
 #define MAXVIDEOFILESIZE 2000 // MB
-#define MINVIDEOFILESIZE  100 // MB
+#define MINVIDEOFILESIZE    1 // MB
 
+#define MINRECORDINGSIZE      25 // GB
+#define MAXRECORDINGSIZE     500 // GB
+#define DEFAULTRECORDINGSIZE 100 // GB
+// Dynamic recording size:
+// Keep recording file size at Setup.MaxVideoFileSize for as long as possible,
+// but switch to MAXVIDEOFILESIZE early enough, so that Setup.MaxRecordingSize
+// will be reached, before recording to file 255.vdr
+
 class cIndexFile {
 private:
   struct tIndex { int offset; uchar type; uchar number; short reserved; };
@@ -228,6 +236,8 @@
   cUnbufferedFile *Open(void);
   void Close(void);
   cUnbufferedFile *SetOffset(int Number, int Offset = 0);
+  int MaxFileSize();
+      // Dynamic file size for this file
   cUnbufferedFile *NextFile(void);
   };
 
Index: videodir.c
===================================================================
--- videodir.c	(Revision 1000)
+++ videodir.c	(Arbeitskopie)
@@ -19,6 +19,9 @@
 #include "recording.h"
 #include "tools.h"
 
+
+//#define HARDLINK_TEST_ONLY
+
 const char *VideoDirectory = VIDEODIR;
 
 class cVideoDirectory {
@@ -168,6 +171,120 @@
   return RemoveFileOrDir(FileName, true);
 }
 
+static bool StatNearestDir(const char *FileName, struct stat *Stat)
+{
+  cString Name(FileName);
+  char *p;
+  while ((p = strrchr((const char*)Name + 1, '/')) != NULL) {
+        *p = 0; // truncate at last '/'
+        if (stat(Name, Stat) == 0) {
+           isyslog("StatNearestDir: Stating %s", (const char*)Name);
+           return true;
+           }
+        }
+  return false;
+}
+
+bool HardLinkVideoFile(const char *OldName, const char *NewName)
+{
+  // Incoming name must be in base video directory:
+  if (strstr(OldName, VideoDirectory) != OldName) {
+     esyslog("ERROR: %s not in %s", OldName, VideoDirectory);
+     return false;
+     }
+  if (strstr(NewName, VideoDirectory) != NewName) {
+     esyslog("ERROR: %s not in %s", NewName, VideoDirectory);
+     return false;
+     }
+
+  const char *ActualNewName = NewName;
+  cString ActualOldName(ReadLink(OldName), true);
+
+  // Some safety checks:
+  struct stat StatOldName;
+  if (lstat(ActualOldName, &StatOldName) == 0) {
+     if (S_ISLNK(StatOldName.st_mode)) {
+        esyslog("HardLinkVideoFile: Failed to resolve symbolic link %s", (const char*)ActualOldName);
+        return false;
+        }
+     }
+  else {
+     esyslog("HardLinkVideoFile: lstat failed on %s", (const char*)ActualOldName);
+     return false;
+     }
+  isyslog("HardLinkVideoFile: %s is on %i", (const char*)ActualOldName, (int)StatOldName.st_dev);
+
+  // Find the video directory where ActualOldName is located
+
+  cVideoDirectory Dir;
+  struct stat StatDir;
+  if (!StatNearestDir(NewName, &StatDir)) {
+     esyslog("HardLinkVideoFile: stat failed on %s", NewName);
+     return false;
+     }
+  
+  isyslog("HardLinkVideoFile: %s is on %i", NewName, (int)StatDir.st_dev);
+  if (StatDir.st_dev != StatOldName.st_dev) {
+     // Not yet found.
+     
+     if (!Dir.IsDistributed()) {
+        esyslog("HardLinkVideoFile: No matching video folder to hard link %s", (const char*)ActualOldName);
+        return false;
+        }
+
+     // Search in video01 and upwards
+     bool found = false;
+     while (Dir.Next()) {
+           Dir.Store();
+           const char *TmpNewName = Dir.Adjust(NewName);
+           if (StatNearestDir(TmpNewName, &StatDir) && StatDir.st_dev == StatOldName.st_dev) {
+              isyslog("HardLinkVideoFile: %s is on %i (match)", TmpNewName, (int)StatDir.st_dev);
+              ActualNewName = TmpNewName;
+              found = true;
+              break;
+              }
+           isyslog("HardLinkVideoFile: %s is on %i", TmpNewName, (int)StatDir.st_dev);
+           }
+     if (ActualNewName == NewName) {
+        esyslog("HardLinkVideoFile: No matching video folder to hard link %s", (const char*)ActualOldName);
+        return false;
+        }
+
+     // Looking good, we have a match. Create necessary folders.
+     if (!MakeDirs(ActualNewName, false))
+        return false;
+     // There's no guarantee that the directory of ActualNewName 
+     // is on the same device as the dir that StatNearestDir found.
+     // But worst case is that the link fails.
+     }
+
+#ifdef HARDLINK_TEST_ONLY
+  // Do the hard link to *.vdr_ for testing only
+  char *name = NULL;
+  asprintf(&name, "%s_",ActualNewName);
+  link(ActualOldName, name); 
+  free(name);
+  return false;
+#endif // HARDLINK_TEST_ONLY
+  
+  // Try creating the hard link
+  if (link(ActualOldName, ActualNewName) != 0) {
+     // Failed to hard link. Maybe not allowed on file system.
+     LOG_ERROR_STR(ActualNewName);
+     isyslog("HardLinkVideoFile: failed to hard link from %s to %s", (const char*)ActualOldName, ActualNewName);
+     return false;
+     }
+  
+  if (ActualNewName != NewName) {
+     // video01 and up. Do the remaining symlink
+     if (symlink(ActualNewName, NewName) < 0) {
+        LOG_ERROR_STR(NewName);
+        return false;
+        }
+     }
+  return true;
+}
+
 bool VideoFileSpaceAvailable(int SizeMB)
 {
   cVideoDirectory Dir;
Index: videodir.h
===================================================================
--- videodir.h	(Revision 1000)
+++ videodir.h	(Arbeitskopie)
@@ -19,6 +19,7 @@
 int CloseVideoFile(cUnbufferedFile *File);
 bool RenameVideoFile(const char *OldName, const char *NewName);
 bool RemoveVideoFile(const char *FileName);
+bool HardLinkVideoFile(const char *OldName, const char *NewName);
 bool VideoFileSpaceAvailable(int SizeMB);
 int VideoDiskSpace(int *FreeMB = NULL, int *UsedMB = NULL); // returns the used disk space in percent
 cString PrefixVideoFileName(const char *FileName, char Prefix);


Index: vdr-runvdr.sh
===================================================================
RCS file: /cvs/pkgs/rpms/vdr/devel/vdr-runvdr.sh,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- vdr-runvdr.sh	17 Dec 2006 20:55:06 -0000	1.2
+++ vdr-runvdr.sh	20 Jan 2008 22:07:12 -0000	1.3
@@ -4,6 +4,8 @@
 #
 # runvdr [VDROPTION]...
 
+shopt -s nullglob
+
 VDR=/usr/sbin/vdr
 PLUGINDIR=/usr/lib/vdr
 PLUGINVER=VDR_PLUGIN_VERSION
@@ -43,7 +45,7 @@
     fi
     # Add the rest available.
     for file in $PLUGINDIR/libvdr-*.so$libsuf ; do
-        plugin=`basename $file | sed -e 's/^libvdr-\(.*\)\.so.*$/\1/'`
+        plugin=$(basename $file | sed -e 's/^libvdr-\(.*\)\.so.*$/\1/')
         if [ -n "$VDR_PLUGIN_ORDER" ] ; then
             for p in $VDR_PLUGIN_ORDER ; do
                 if [ "$plugin" = "$p" ] ; then
@@ -52,9 +54,7 @@
                 fi
             done
         fi
-        if [ -e "$file" ] ; then
-            plugconf "$plugin"
-        fi
+        plugconf "$plugin"
     done
 }
 


Index: vdr.spec
===================================================================
RCS file: /cvs/pkgs/rpms/vdr/devel/vdr.spec,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- vdr.spec	16 Oct 2007 21:10:49 -0000	1.17
+++ vdr.spec	20 Jan 2008 22:07:12 -0000	1.18
@@ -19,7 +19,7 @@
 
 Name:           vdr
 Version:        1.4.7
-Release:        6%{?dist}
+Release:        7%{?dist}
 Summary:        Video Disk Recorder
 
 Group:          Applications/Multimedia
@@ -50,6 +50,10 @@
 Patch5:         %{name}-1.4.6-1-syncearly.patch
 Patch6:         http://www.saunalahti.fi/~rahrenbe/vdr/patches/vdr-1.4.7-subtitles-0.5.0-and-ttxtsubs-0.0.5.diff.gz
 Patch7:         %{name}-1.4.7-recmenu-play.patch
+# Patch8: http://www.udo-richter.de/vdr/files/vdr-1.4.7-hlcutter-0.2.0.diff
+# edited so that it applies on top of the liemikuutio patch (menu.c)
+Patch8:         %{name}-1.4.7-hlcutter-0.2.0.diff
+Patch9:         %{name}-1.4.7-hlcutter-0.2.0-finnish.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 BuildRequires:  libjpeg-devel
@@ -139,6 +143,8 @@
 %patch5 -p0
 %patch6 -p1
 %patch7 -p0
+%patch8 -p0
+%patch9 -p0
 
 # Fix up paths
 sed -i \
@@ -443,6 +449,11 @@
 %endif
 
 %changelog
+* Sat Jan 12 2008 Ville Skyttä <ville.skytta at iki.fi> - 1.4.7-7
+- Include Udo Richter's hard link cutter patch v0.2.0 (see README-HLCUTTER).
+- Add some plugins to the default plugin order list in sysconfig.
+- Minor runvdr cleanups.
+
 * Wed Oct 17 2007 Ville Skyttä <ville.skytta at iki.fi> - 1.4.7-6
 - Add patch to start playback from recordings menu with the play button.
 


Index: vdr.sysconfig
===================================================================
RCS file: /cvs/pkgs/rpms/vdr/devel/vdr.sysconfig,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- vdr.sysconfig	28 Jan 2007 11:11:18 -0000	1.3
+++ vdr.sysconfig	20 Jan 2008 22:07:12 -0000	1.4
@@ -25,7 +25,10 @@
 ttxtsubs
 osdpip
 femon
+recstatus
 sudoku
+weather
+weatherng
 dvd
 externalplayer
 mplayer




More information about the fedora-extras-commits mailing list