vdr/videodir.h
Klaus Schmidinger 277d66bfe1 Version 2.1.2
VDR developer version 2.1.2 is now available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.2.tar.bz2

A 'diff' against the previous version is available at

       ftp://ftp.tvdr.de/vdr/Developer/vdr-2.1.1-2.1.2.diff

MD5 checksums:

4725e9cb26fea8fa3682dd30f5594a50  vdr-2.1.2.tar.bz2
869d9b298b432a505186328bcf0b53c6  vdr-2.1.1-2.1.2.diff

WARNING:
========

This is a *developer* version. Even though *I* use it in my productive
environment, I strongly recommend that you only use it under controlled
conditions and for testing and debugging.

From the HISTORY file:
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed displaying DVB subtitles (thanks to Rolf Ahrenberg for helping to debug and
  understand subtitle page refreshes):
  + Fixed handling DVB subtitle fill region codes for 2 and 8 bpp.
  + Fixed handling pages without an explicit END_OF_DISPLAY_SET_SEGMENT.
    The FINISHPAGE_HACK is no longer necessary.
  + Fixed handling "page refreshes". The data is now parsed and stored closer to the
    DVB standard specs, introducing "object refs" and "region refs".
  + The debug output now goes into an HTML file named dbg-log.htm and shows the actual
    bitmaps (dbg-nnn.jpg) used to display the subtitles. That way it is much easier to
    see what's actually going on.
  + Fixed handling subtitles encoded as a string of characters (the very first
    character was always skipped).
- Fixed wrong initialization of Setup.PositionerSwing (reported by Arthur Konovalov).
- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
- Fixed cleaning up old EPG events in case no epg data file is given (reported by
  Dave Pickles).
- Unified the internal sequence of actions when pressing the Blue and the Back key,
  respectively, during replay (reported by Thomas Maass).
- The Yellow button in the main menu no longer acts as "Pause" if "Pause key handling"
  is set to "do not pause live video" (suggested by Ulf Kiener).
- The code for distributing recordings over several video directories has been
  removed. VDR now by default assumes that the video directory is one big disk.
  If you absolutely need to use several separate disks to store recordings, you can
  write a plugin that uses the new cVideoDirectory API to implement the necessary
  functionality (see PLUGINS.html, section "The video directory"). You can copy the
  respective code from previous versions of videodir.c.
  IMPORTANT NOTE: If you write a plugin that implements a distributed video directory,
  =============== be sure to make cVideoDirectory::Rename() follow symbolic links!
                  This functionality was never implemented in VDR and it therefore
                  used a workaround in cutter.c. See the section marked with
                  // XXX this can be removed once RenameVideoFile() follows symlinks
                  in previous versions of cutter.c.
  + CloseVideoFile() is obsolete and has been removed.
  + The functions OpenVideoFile(), RenameVideoFile(), RemoveVideoFile(), VideoFileSpaceAvailable(),
    VideoDiskSpace(), RemoveEmptyVideoDirectories(), IsOnVideoDirectoryFileSystem() and
    PrefixVideoFileName() are now static members of cVideoDirectory and need to be called
    with the proper prefix.
  + The name of the video directory is now available through cVideoDirectory::Name().
- Added renaming and moving recordings and folders, editing a recording's priority and
  lifetime, and queueing cutting jobs (inspired by the "extrecmenu" plugin from Martin
  Prochnow).
  + The "Recording info" menu now has a new Blue button named "Edit", which opens a
    dialog in which several properties of the selected recording can be changed. It can
    be renamed or moved into another folder and its priority and lifetime can be
    modified (inspired by the "extrecmenu" plugin from Martin Prochnow).
    The new blue "Edit" button in the "Recordings" menu opens a dialog in which a folder
    can be renamed or moved. See MANUAL, section "Managing folders".
  + In the "Edit recording" menu the Yellow button ("Delete marks") allows you to delete
    all editing marks of the selected recording.
  + cCutter is no longer a static class. Cutting requests should now be invoked by
    calling RecordingsHandler.Add(ruCut, FileName). See the new cRecordingsHandler
    class in recording.h.
  + Cutting jobs are now placed in a queue (together with any move or copy jobs) and
    are processed one by one.
  + The new SVDRP command RENR can be used to rename a recording (suggested by Rolf
    Ahrenberg).
  + Note that in several places in the source code a "copy" operation is mentioned,
    however there is no user interface for this, yet.
- Changed some variable names in positioner.c to match the names used in the page with
  the explanation on vdr-portal.de.
- Updated the Italian OSD texts (thanks to Diego Pierotto).
- Fixed writing group separators to channels.conf that contain a comma (reported by
  Eike Edener).
- Now also checking the source (in addition to the transponder) when setting the
  system time from the TDT, which avoids problems in case devices are tuned to the
  same transponder on different sources, and these broadcast different time data
  (reported by Torsten Lang).
- Changed cRecorder::Action() to use cTimeMs instead of time() to avoid problems with
  unjustified "video data stream broken" errors in case the system time is changed
  while a recording is active (reported by Torsten Lang).
- Revised the section on "Learning the remote control keys" in the INSTALL file to
  avoid the impression that there actually is a default remote.conf file, and to
  not use any alphabetic keys for special functions, so that they remain available
  for textual input.
- The function cRecordings::MBperMinute() now only takes into account recordings with
  less than 5 seconds per megabyte, in an attempt to filter out radio recordings
  (thanks to Harald Koenig). The result of this function was way off any realistic
  value in case there are many radio recordings in the video directory.
- Added maximum signal strength value for TechniSat SkyStar 2 DVB-S rev 2.3P (thanks
  to Guido Cordaro).
- Fixed an inconsistent behavior between opening the Recordings menu manually via the
  main menu and by pressing the Recordings key. In the latter case it automatically
  opened all sub folders to position the cursor to the last replayed recording, which
  is unexpected at this point (reported by Helmut Auer). You can still navigate to
  the last replayed recording (if any) by pressing Ok repeatedly in the Recordings
  menu.
2013-10-19 19:27:37 +02:00

125 lines
6.7 KiB
C++

/*
* videodir.h: Functions to maintain the video directory
*
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: videodir.h 3.2 2013/10/11 09:37:48 kls Exp $
*/
#ifndef __VIDEODIR_H
#define __VIDEODIR_H
#include <stdlib.h>
#include "tools.h"
class cVideoDirectory {
private:
static cString name;
static cVideoDirectory *current;
static cVideoDirectory *Current(void);
public:
cVideoDirectory(void);
virtual ~cVideoDirectory();
virtual int FreeMB(int *UsedMB = NULL);
///< Returns the total amount (in MB) of free disk space for recording.
///< If UsedMB is given, it returns the amount of disk space in use by
///< existing recordings (or anything else) on that disk.
virtual bool Register(const char *FileName);
///< By default VDR assumes that the video directory consists of one large
///< volume, on which it can store its recordings. A derived cVideoDirectory
///< may, for instance, use several separate disks to store recordings.
///< The given FileName is the full path name (including the video directory) of
///< a recording file ('*.ts') that is about to be opened for writing. If the actual
///< file shall be put on an other disk, the derived cVideoDirectory should
///< create a symbolic link from the given FileName to the other location.
///< Returns true if the operation was successful.
///< The default implementation just checks whether the incoming file name really
///< is under the video directory.
virtual bool Rename(const char *OldName, const char *NewName);
///< Renames the directory OldName to NewName.
///< OldName and NewName are full path names that begin with the name of the
///< video directory and end with '*.rec' or '*.del'. Only the base name (the
///< rightmost component) of the two names may be different.
///< Returns true if the operation was successful.
///< The default implementation just calls the system's rename() function.
virtual bool Move(const char *FromName, const char *ToName);
///< Moves the directory FromName to the location ToName. FromName is the full
///< path name of a recording's '*.rec' directory. ToName has the same '*.rec'
///< part as FromName, but a different directory path above it.
///< Returns true if the operation was successful.
///< The default implementation just calls the system's rename() function.
virtual bool Remove(const char *Name);
///< Removes the directory with the given Name and everything it contains.
///< Name is a full path name that begins with the name of the video directory.
///< Returns true if the operation was successful.
///< The default implementation calls RemoveFileOrDir().
virtual void Cleanup(const char *IgnoreFiles[] = NULL);
///< Recursively removes all empty directories under the video directory.
///< If IgnoreFiles is given, the file names in this (NULL terminated) array
///< are ignored when checking whether a directory is empty. These are
///< typically "dot files", like e.g. ".sort".
///< The default implementation calls RemoveEmptyDirectories().
virtual bool Contains(const char *Name);
///< Checks whether the directory Name is on the same file system as the
///< video directory. Name is the full path name of a recording's '*.rec'
///< directory. This function is usually called when an ongoing recording
///< is about to run out of disk space, and an existing (old) recording needs
///< to be deleted. It shall make sure that deleting this old recording will
///< actually free up space in the video directory, and not on some other
///< device that just happens to be mounted.
///< The default implementation calls EntriesOnSameFileSystem().
static const char *Name(void);
static void SetName(const char *Name);
static void Destroy(void);
static cUnbufferedFile *OpenVideoFile(const char *FileName, int Flags);
static bool RenameVideoFile(const char *OldName, const char *NewName);
static bool MoveVideoFile(const char *FromName, const char *ToName);
static bool RemoveVideoFile(const char *FileName);
static bool VideoFileSpaceAvailable(int SizeMB);
static int VideoDiskSpace(int *FreeMB = NULL, int *UsedMB = NULL); // returns the used disk space in percent
static cString PrefixVideoFileName(const char *FileName, char Prefix);
static void RemoveEmptyVideoDirectories(const char *IgnoreFiles[] = NULL);
static bool IsOnVideoDirectoryFileSystem(const char *FileName);
};
class cVideoDiskUsage {
private:
static int state;
static time_t lastChecked;
static int usedPercent;
static int freeMB;
static int freeMinutes;
public:
static bool HasChanged(int &State);
///< Returns true if the usage of the video disk space has changed since the last
///< call to this function with the given State variable. The caller should
///< initialize State to -1, and it will be set to the current internal state
///< value of the video disk usage checker upon return. Future calls with the same
///< State variable can then quickly check for changes.
static void ForceCheck(void) { lastChecked = 0; }
///< To avoid unnecessary load, the video disk usage is only actually checked
///< every DISKSPACECHEK seconds. Calling ForceCheck() makes sure that the next call
///< to HasChanged() will check the disk usage immediately. This is useful in case
///< some files have been deleted and the result shall be displayed instantly.
static cString String(void);
///< Returns a localized string of the form "Disk nn% - hh:mm free".
///< This function is mainly for use in skins that want to retain the display of the
///< free disk space in the menu title, as was the case until VDR version 1.7.27.
///< An implicit call to HasChanged() is done in this function, to make sure the
///< returned value is up to date.
static int UsedPercent(void) { return usedPercent; }
///< Returns the used space of the video disk in percent.
///< The caller should call HasChanged() first, to make sure the value is up to date.
static int FreeMB(void) { return freeMB; }
///< Returns the amount of free space on the video disk in MB.
///< The caller should call HasChanged() first, to make sure the value is up to date.
static int FreeMinutes(void) { return freeMinutes; }
///< Returns the number of minutes that can still be recorded on the video disk.
///< This is an estimate and depends on the data rate of the existing recordings.
///< There is no guarantee that this value will actually be met.
///< The caller should call HasChanged() first, to make sure the value is up to date.
};
#endif //__VIDEODIR_H