mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Implemented TITLE and EPISODE keywords
This commit is contained in:
parent
0b7e9057da
commit
deb9f88710
5
FORMATS
5
FORMATS
@ -72,6 +72,11 @@ Video Disk Recorder File Formats
|
||||
any ':' characters, these have to be replaced with '|'. If the name shall
|
||||
contain subdirectories, these have to be delimited by '~' (since the '/'
|
||||
character may be part of a regular programme name).
|
||||
The special keywords TITLE and EPISODE, if present, will be replaced
|
||||
with the title and episode information from the EPG data at the time of
|
||||
recording (if that data is available). If at the time of recording either
|
||||
of these cannot be determined, TITLE will default to the channel name, and
|
||||
EPISODE will default to a blank.
|
||||
- Summary (any newline characters in the summary have to be replaced with '|';
|
||||
the summary may contain ':' characters)
|
||||
|
||||
|
11
HISTORY
11
HISTORY
@ -931,7 +931,7 @@ Video Disk Recorder Revision History
|
||||
|
||||
- Fixed handling improperly formatted EIT data (thanks to Rolf Hakenes).
|
||||
|
||||
2002-02-02: Version 0.99pre5
|
||||
2002-02-03: Version 0.99pre5
|
||||
|
||||
- Updated channel settings for 'N24' (thanks to Andreas Gebel).
|
||||
- Fixed handling hierarchical recordings menu in case of directories starting
|
||||
@ -953,3 +953,12 @@ Video Disk Recorder Revision History
|
||||
- The new configuration file 'svdrphosts.conf' is now used to define which
|
||||
hosts may access the SVDRP port (by default only 'localhost' has access).
|
||||
See FORMATS for details.
|
||||
- The special keywords TITLE and EPISODE can now be used in timer file names
|
||||
(see MANUAL and FORMATS for details).
|
||||
- The new setup parameter NameInstantRecord can be used to define how an
|
||||
instant recording will be named (see MANUAL for details).
|
||||
- When looking for the EPG record of the timer that starts a recording, now
|
||||
that record is taken which covers the time calculated as
|
||||
'start + (Setup.MarginStart * 2) + 1)' in order to have a better chance of
|
||||
hitting the right record in case of an instant recording. Timers that start
|
||||
further in the future should always be programmed via the "Schedules" menu.
|
||||
|
8
MANUAL
8
MANUAL
@ -385,6 +385,14 @@ Video Disk Recorder User's Manual
|
||||
0 = instant recordings will not be marked
|
||||
1 = instant recordings will be marked.
|
||||
|
||||
NameInstantRecord = TITLE-EPISODE
|
||||
Defines how to name an instant recording. If the keywords
|
||||
TITLE and/or EPISODE are present, they will be replaced
|
||||
with the title and episode information from the EPG data
|
||||
at the time of recording (if that data is available).
|
||||
If this parameter is empty, the channel name will be used
|
||||
by default.
|
||||
|
||||
LnbSLOF = 11700 The switching frequency (in MHz) between low and high LOF
|
||||
LnbFrequLo = 9750 The LNB's low and high local oscillator frequencies (in MHz)
|
||||
LnbFrequHi = 10600 (these have no meaning for DVB-C receivers)
|
||||
|
26
config.c
26
config.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.c 1.81 2002/02/02 17:15:03 kls Exp $
|
||||
* $Id: config.c 1.82 2002/02/03 15:25:44 kls Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@ -340,7 +340,7 @@ cTimer::cTimer(bool Instant)
|
||||
*file = 0;
|
||||
summary = NULL;
|
||||
if (Instant && ch)
|
||||
snprintf(file, sizeof(file), "%s%s", Setup.MarkInstantRecord ? "@" : "", ch->name);
|
||||
snprintf(file, sizeof(file), "%s%s", Setup.MarkInstantRecord ? "@" : "", *Setup.NameInstantRecord ? Setup.NameInstantRecord : ch->name);
|
||||
}
|
||||
|
||||
cTimer::cTimer(const cEventInfo *EventInfo)
|
||||
@ -539,6 +539,13 @@ time_t cTimer::SetTime(time_t t, int SecondsFromMidnight)
|
||||
return mktime(&tm);
|
||||
}
|
||||
|
||||
char *cTimer::SetFile(const char *File)
|
||||
{
|
||||
if (!isempty(File))
|
||||
strn0cpy(file, File, sizeof(file));
|
||||
return file;
|
||||
}
|
||||
|
||||
bool cTimer::Matches(time_t t)
|
||||
{
|
||||
startTime = stopTime = 0;
|
||||
@ -840,6 +847,7 @@ cSetup::cSetup(void)
|
||||
ShowInfoOnChSwitch = 1;
|
||||
MenuScrollPage = 1;
|
||||
MarkInstantRecord = 1;
|
||||
strcpy(NameInstantRecord, "TITLE-EPISODE");
|
||||
LnbSLOF = 11700;
|
||||
LnbFrequLo = 9750;
|
||||
LnbFrequHi = 10600;
|
||||
@ -873,15 +881,18 @@ cSetup::cSetup(void)
|
||||
|
||||
bool cSetup::Parse(char *s)
|
||||
{
|
||||
const char *Delimiters = " \t\n=";
|
||||
char *Name = strtok(s, Delimiters);
|
||||
char *Value = strtok(NULL, Delimiters);
|
||||
if (Name && Value) {
|
||||
char *p = strchr(s, '=');
|
||||
if (p) {
|
||||
*p = 0;
|
||||
char *Name = compactspace(s);
|
||||
char *Value = compactspace(p + 1);
|
||||
if (*Name && *Value) {
|
||||
if (!strcasecmp(Name, "OSDLanguage")) OSDLanguage = atoi(Value);
|
||||
else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value);
|
||||
else if (!strcasecmp(Name, "ShowInfoOnChSwitch")) ShowInfoOnChSwitch = atoi(Value);
|
||||
else if (!strcasecmp(Name, "MenuScrollPage")) MenuScrollPage = atoi(Value);
|
||||
else if (!strcasecmp(Name, "MarkInstantRecord")) MarkInstantRecord = atoi(Value);
|
||||
else if (!strcasecmp(Name, "NameInstantRecord")) strn0cpy(NameInstantRecord, Value, MaxFileName);
|
||||
else if (!strcasecmp(Name, "LnbSLOF")) LnbSLOF = atoi(Value);
|
||||
else if (!strcasecmp(Name, "LnbFrequLo")) LnbFrequLo = atoi(Value);
|
||||
else if (!strcasecmp(Name, "LnbFrequHi")) LnbFrequHi = atoi(Value);
|
||||
@ -915,6 +926,7 @@ bool cSetup::Parse(char *s)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -930,6 +942,7 @@ bool cSetup::Load(const char *FileName)
|
||||
bool result = true;
|
||||
while (fgets(buffer, sizeof(buffer), f) > 0) {
|
||||
line++;
|
||||
stripspace(buffer);
|
||||
if (!isempty(buffer)) {
|
||||
if (*buffer != '#' && !Parse(buffer)) {
|
||||
esyslog(LOG_ERR, "error in %s, line %d\n", fileName, line);
|
||||
@ -959,6 +972,7 @@ bool cSetup::Save(const char *FileName)
|
||||
fprintf(f, "ShowInfoOnChSwitch = %d\n", ShowInfoOnChSwitch);
|
||||
fprintf(f, "MenuScrollPage = %d\n", MenuScrollPage);
|
||||
fprintf(f, "MarkInstantRecord = %d\n", MarkInstantRecord);
|
||||
fprintf(f, "NameInstantRecord = %s\n", NameInstantRecord);
|
||||
fprintf(f, "LnbSLOF = %d\n", LnbSLOF);
|
||||
fprintf(f, "LnbFrequLo = %d\n", LnbFrequLo);
|
||||
fprintf(f, "LnbFrequHi = %d\n", LnbFrequHi);
|
||||
|
9
config.h
9
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.h 1.92 2002/02/02 15:59:18 kls Exp $
|
||||
* $Id: config.h 1.93 2002/02/03 15:16:21 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
@ -19,7 +19,7 @@
|
||||
#include "eit.h"
|
||||
#include "tools.h"
|
||||
|
||||
#define VDRVERSION "0.99pre4"
|
||||
#define VDRVERSION "0.99pre5"
|
||||
|
||||
#define MAXPRIORITY 99
|
||||
#define MAXLIFETIME 99
|
||||
@ -66,6 +66,8 @@ enum eKeys { // "Up" and "Down" must be the first two keys!
|
||||
#define ISRAWKEY(k) ((k) != kNone && ((k) & k_Flags) == 0)
|
||||
#define NORMALKEY(k) (eKeys((k) & ~k_Repeat))
|
||||
|
||||
#define MaxFileName 256
|
||||
|
||||
struct tKey {
|
||||
eKeys type;
|
||||
char *name;
|
||||
@ -123,7 +125,6 @@ private:
|
||||
static char *buffer;
|
||||
static const char *ToText(cTimer *Timer);
|
||||
public:
|
||||
enum { MaxFileName = 256 };
|
||||
bool recording, pending;
|
||||
int active;
|
||||
int channel;
|
||||
@ -149,6 +150,7 @@ public:
|
||||
bool DayMatches(time_t t);
|
||||
time_t IncDay(time_t t, int Days);
|
||||
time_t SetTime(time_t t, int SecondsFromMidnight);
|
||||
char *SetFile(const char *File);
|
||||
bool Matches(time_t t = 0);
|
||||
time_t StartTime(void);
|
||||
time_t StopTime(void);
|
||||
@ -301,6 +303,7 @@ public:
|
||||
int ShowInfoOnChSwitch;
|
||||
int MenuScrollPage;
|
||||
int MarkInstantRecord;
|
||||
char NameInstantRecord[MaxFileName];
|
||||
int LnbSLOF;
|
||||
int LnbFrequLo;
|
||||
int LnbFrequHi;
|
||||
|
11
i18n.c
11
i18n.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: i18n.c 1.50 2002/01/27 15:52:32 kls Exp $
|
||||
* $Id: i18n.c 1.51 2002/02/03 14:34:33 kls Exp $
|
||||
*
|
||||
* Slovenian translations provided by Miha Setina <mihasetina@softhome.net>
|
||||
* Italian translations provided by Alberto Carraro <bertocar@tin.it>
|
||||
@ -776,6 +776,15 @@ const tPhrase Phrases[] = {
|
||||
"Enregistrement immédiat",
|
||||
"Markere direkteopptak",
|
||||
},
|
||||
{ "NameInstantRecord",
|
||||
"Direktaufz. benennen",
|
||||
"", // TODO
|
||||
"", // TODO
|
||||
"", // TODO
|
||||
"", // TODO
|
||||
"", // TODO
|
||||
"", // TODO
|
||||
},
|
||||
{ "LnbSLOF",
|
||||
"LnbSLOF",
|
||||
"LnbSLOF",
|
||||
|
11
menu.c
11
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 1.147 2002/02/01 15:08:44 kls Exp $
|
||||
* $Id: menu.c 1.148 2002/02/03 15:42:38 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -1829,6 +1829,7 @@ void cMenuSetup::Set(void)
|
||||
Add(new cMenuEditBoolItem(tr("ShowInfoOnChSwitch"), &data.ShowInfoOnChSwitch));
|
||||
Add(new cMenuEditBoolItem(tr("MenuScrollPage"), &data.MenuScrollPage));
|
||||
Add(new cMenuEditBoolItem(tr("MarkInstantRecord"), &data.MarkInstantRecord));
|
||||
Add(new cMenuEditStrItem( tr("NameInstantRecord"), data.NameInstantRecord, sizeof(data.NameInstantRecord), FileNameChars));
|
||||
Add(new cMenuEditIntItem( tr("LnbSLOF"), &data.LnbSLOF));
|
||||
Add(new cMenuEditIntItem( tr("LnbFrequLo"), &data.LnbFrequLo));
|
||||
Add(new cMenuEditIntItem( tr("LnbFrequHi"), &data.LnbFrequHi));
|
||||
@ -2309,14 +2310,16 @@ cRecordControl::cRecordControl(cDvbApi *DvbApi, cTimer *Timer)
|
||||
timer->SetPending(true);
|
||||
timer->SetRecording(true);
|
||||
if (Channels.SwitchTo(timer->channel, dvbApi)) {
|
||||
const char *Title = NULL;
|
||||
const char *Subtitle = NULL;
|
||||
const char *Summary = NULL;
|
||||
if (GetEventInfo()) {
|
||||
dsyslog(LOG_INFO, "Title: '%s' Subtitle: '%s'", eventInfo->GetTitle(), eventInfo->GetSubtitle());
|
||||
Title = eventInfo->GetTitle();
|
||||
Subtitle = eventInfo->GetSubtitle();
|
||||
Summary = eventInfo->GetExtendedDescription();
|
||||
dsyslog(LOG_INFO, "Title: '%s' Subtitle: '%s'", Title, Subtitle);
|
||||
}
|
||||
cRecording Recording(timer, Subtitle, Summary);
|
||||
cRecording Recording(timer, Title, Subtitle, Summary);
|
||||
fileName = strdup(Recording.FileName());
|
||||
cRecordingUserCommand::InvokeCommand(RUC_BEFORERECORDING, fileName);
|
||||
if (dvbApi->StartRecord(fileName, Channels.GetByNumber(timer->channel)->ca, timer->priority))
|
||||
@ -2337,7 +2340,7 @@ cRecordControl::~cRecordControl()
|
||||
bool cRecordControl::GetEventInfo(void)
|
||||
{
|
||||
cChannel *channel = Channels.GetByNumber(timer->channel);
|
||||
time_t Time = timer->StartTime() + (timer->StopTime() - timer->StartTime()) / 2;
|
||||
time_t Time = timer->StartTime() + ((Setup.MarginStart * 2) + 1) * 60;
|
||||
for (int seconds = 0; seconds <= MAXWAIT4EPGINFO; seconds++) {
|
||||
{
|
||||
cThreadLock ThreadLock;
|
||||
|
29
recording.c
29
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.48 2002/01/27 15:14:45 kls Exp $
|
||||
* $Id: recording.c 1.49 2002/02/03 15:46:42 kls Exp $
|
||||
*/
|
||||
|
||||
#include "recording.h"
|
||||
@ -41,6 +41,9 @@
|
||||
#define DISKCHECKDELTA 100 // seconds between checks for free disk space
|
||||
#define REMOVELATENCY 10 // seconds to wait until next check after removing a file
|
||||
|
||||
#define TIMERMACRO_TITLE "TITLE"
|
||||
#define TIMERMACRO_EPISODE "EPISODE"
|
||||
|
||||
void RemoveDeletedRecordings(void)
|
||||
{
|
||||
static time_t LastRemoveCheck = 0;
|
||||
@ -214,19 +217,33 @@ char *ExchangeChars(char *s, bool ToFileSystem)
|
||||
return s;
|
||||
}
|
||||
|
||||
cRecording::cRecording(cTimer *Timer, const char *Subtitle, const char *Summary)
|
||||
cRecording::cRecording(cTimer *Timer, const char *Title, const char *Subtitle, const char *Summary)
|
||||
{
|
||||
resume = RESUME_NOT_INITIALIZED;
|
||||
titleBuffer = NULL;
|
||||
sortBuffer = NULL;
|
||||
fileName = NULL;
|
||||
if (Timer->IsSingleEvent() || !Setup.UseSubtitle)
|
||||
name = strdup(Timer->file);
|
||||
else {
|
||||
name = NULL;
|
||||
// set up the actual name:
|
||||
if (isempty(Title))
|
||||
Title = Channels.GetChannelNameByNumber(Timer->channel);
|
||||
if (isempty(Subtitle))
|
||||
Subtitle = " ";
|
||||
asprintf(&name, "%s~%s", Timer->file, Subtitle);
|
||||
char *macroTITLE = strstr(Timer->file, TIMERMACRO_TITLE);
|
||||
char *macroEPISODE = strstr(Timer->file, TIMERMACRO_EPISODE);
|
||||
if (macroTITLE || macroEPISODE) {
|
||||
name = strdup(Timer->file);
|
||||
name = strreplace(name, TIMERMACRO_TITLE, Title);
|
||||
name = strreplace(name, TIMERMACRO_EPISODE, Subtitle);
|
||||
if (Timer->IsSingleEvent()) {
|
||||
Timer->SetFile(name); // this was an instant recording, so let's set the actual data
|
||||
Timers.Save();
|
||||
}
|
||||
}
|
||||
else if (Timer->IsSingleEvent() || !Setup.UseSubtitle)
|
||||
name = strdup(Timer->file);
|
||||
else
|
||||
asprintf(&name, "%s~%s", Timer->file, Subtitle);
|
||||
// substitute characters that would cause problems in file names:
|
||||
strreplace(name, '\n', ' ');
|
||||
start = Timer->StartTime();
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.h 1.21 2002/01/26 15:28:41 kls Exp $
|
||||
* $Id: recording.h 1.22 2002/02/03 11:59:49 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __RECORDING_H
|
||||
@ -43,7 +43,7 @@ public:
|
||||
time_t start;
|
||||
int priority;
|
||||
int lifetime;
|
||||
cRecording(cTimer *Timer, const char *Subtitle, const char *Summary);
|
||||
cRecording(cTimer *Timer, const char *Title, const char *Subtitle, const char *Summary);
|
||||
cRecording(const char *FileName);
|
||||
~cRecording();
|
||||
virtual bool operator< (const cListObject &ListObject);
|
||||
|
19
tools.c
19
tools.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.c 1.54 2002/02/02 13:03:40 kls Exp $
|
||||
* $Id: tools.c 1.55 2002/02/03 13:35:38 kls Exp $
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
@ -100,6 +100,23 @@ char *strreplace(char *s, char c1, char c2)
|
||||
return s;
|
||||
}
|
||||
|
||||
char *strreplace(char *s, const char *s1, const char *s2)
|
||||
{
|
||||
char *p = strstr(s, s1);
|
||||
if (p) {
|
||||
int of = p - s;
|
||||
int l = strlen(s);
|
||||
int l1 = strlen(s1);
|
||||
int l2 = strlen(s2);
|
||||
if (l2 > l1)
|
||||
s = (char *)realloc(s, strlen(s) + l2 - l1 + 1);
|
||||
if (l2 != l1)
|
||||
memmove(s + of + l2, s + of + l1, l - of - l1 + 1);
|
||||
strncpy(s + of, s2, l2);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
char *skipspace(const char *s)
|
||||
{
|
||||
while (*s && isspace(*s))
|
||||
|
3
tools.h
3
tools.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.h 1.40 2002/02/02 13:16:47 kls Exp $
|
||||
* $Id: tools.h 1.41 2002/02/03 12:36:25 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __TOOLS_H
|
||||
@ -47,6 +47,7 @@ char *readline(FILE *f);
|
||||
char *strcpyrealloc(char *dest, const char *src);
|
||||
char *strn0cpy(char *dest, const char *src, size_t n);
|
||||
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 *skipspace(const char *s);
|
||||
char *stripspace(char *s);
|
||||
char *compactspace(char *s);
|
||||
|
Loading…
Reference in New Issue
Block a user