summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--coreengine/definitions.h23
-rw-r--r--coreengine/viewdisplayreplay.c49
-rw-r--r--coreengine/viewdisplayreplay.h5
-rw-r--r--coreengine/viewelement.c2
-rw-r--r--coreengine/viewelementsdisplayreplay.c68
-rw-r--r--coreengine/viewelementsdisplayreplay.h30
-rw-r--r--displayreplay.c2
-rw-r--r--dtd/displayreplay.dtd17
-rw-r--r--skins/estuary4vdr/globals.xml21
-rw-r--r--skins/estuary4vdr/xmlfiles/displayreplay.xml55
-rw-r--r--skinskeleton/xmlfiles/displayreplay.xml13
11 files changed, 248 insertions, 37 deletions
diff --git a/coreengine/definitions.h b/coreengine/definitions.h
index 943bea8..678c54f 100644
--- a/coreengine/definitions.h
+++ b/coreengine/definitions.h
@@ -129,6 +129,7 @@ enum class eVeDisplayReplay {
recinfo,
currenttime,
totaltime,
+ timeshifttimes,
endtime,
progressbar,
cutmarks,
@@ -1522,6 +1523,11 @@ enum class eDRCurrentTimeST {
count
};
+enum class eDRCurrentTimeIT {
+ timeshift = 0,
+ count
+};
+
enum class eDRTotalTimeST {
rectotal = 0,
timeshifttotal,
@@ -1533,11 +1539,28 @@ enum class eDRTotalTimeIT {
count
};
+enum class eDRTimeshiftTimesST {
+ recstart = 0,
+ playbacktime,
+ timeshiftrest,
+ count
+};
+
+enum class eDRTimeshiftTimesIT {
+ timeshift = 0,
+ count
+};
+
enum class eDREndTimeST {
recend = 0,
count
};
+enum class eDREndTimeIT {
+ timeshift = 0,
+ count
+};
+
enum class eDRProgressbarIT {
current = 0,
total,
diff --git a/coreengine/viewdisplayreplay.c b/coreengine/viewdisplayreplay.c
index 30b7c36..c3aeb00 100644
--- a/coreengine/viewdisplayreplay.c
+++ b/coreengine/viewdisplayreplay.c
@@ -6,6 +6,7 @@
cViewReplay::cViewReplay(void) {
veCustomTokens = NULL;
+ veTimeshiftTimes = NULL;
veEndTime = NULL;
veMessage = NULL;
veScraperContent = NULL;
@@ -45,6 +46,7 @@ void cViewReplay::SetViewElements(void) {
viewElementNames.insert(pair<string, int>("rectitle", (int)eVeDisplayReplay::rectitle));
viewElementNames.insert(pair<string, int>("recinfo", (int)eVeDisplayReplay::recinfo));
viewElementNames.insert(pair<string, int>("currenttime", (int)eVeDisplayReplay::currenttime));
+ viewElementNames.insert(pair<string, int>("timeshifttimes", (int)eVeDisplayReplay::timeshifttimes));
viewElementNames.insert(pair<string, int>("endtime", (int)eVeDisplayReplay::endtime));
viewElementNames.insert(pair<string, int>("totaltime", (int)eVeDisplayReplay::totaltime));
viewElementNames.insert(pair<string, int>("progressbar", (int)eVeDisplayReplay::progressbar));
@@ -92,6 +94,10 @@ void cViewReplay::SetViewElementObjects(void) {
{
veTotalTime = dynamic_cast<cVeDrTotalTime*>(viewElements[i]);
}
+ else if (dynamic_cast<cVeDrTimeshiftTimes*>(viewElements[i]))
+ {
+ veTimeshiftTimes = dynamic_cast<cVeDrTimeshiftTimes*>(viewElements[i]);
+ }
else if (dynamic_cast<cVeDrEndTime*>(viewElements[i]))
{
veEndTime = dynamic_cast<cVeDrEndTime*>(viewElements[i]);
@@ -153,8 +159,11 @@ void cViewReplay::ClearVariables(void) {
timeShiftFramesTotal = -1;
timeShiftLength = -1;
timeShiftDuration = "";
+ timeshiftrest = "";
if (veCustomTokens)
veCustomTokens->Reset();
+ if (veTimeshiftTimes)
+ veTimeshiftTimes->Set(cString(""), cString(""), cString(""));
if (veEndTime)
veEndTime->Set(cString(""));
if (veCutMarks)
@@ -200,17 +209,20 @@ void cViewReplay::SetTimeShiftValues(int current, int total) {
if (!Schedule)
return;
// Get event at actual recording position
- const cEvent *eventEnde = Schedule->GetEventAround(time(NULL));
+ const cEvent *eventEnde = Schedule->GetEventAround(time(0));
if (!eventEnde)
return;
- double fps = recording->FramesPerSecond();
+ // End of live program
time_t liveEventStop = eventEnde->EndTime();
+ // Begin of timeshift recording
time_t recordingStart = time(0) - recording->LengthInSeconds();
- timeShiftFramesTotal = (liveEventStop - recordingStart) * fps;
+ // actual timeshiftlength
timeShiftLength = liveEventStop - recordingStart;
- // Get event at actual replay position
- int secondsafter = (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total));
- const cEvent *eventReplay = Schedule->GetEventAround(time(NULL) - secondsafter);
+ // timeshiftlength until end of live program
+ timeShiftFramesTotal = total * ((double)timeShiftLength / (double)recording->LengthInSeconds());
+ // Get event at actual replay position (add 30sec for a better match)
+ int timeShiftSecondsAfter = (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total)) + 30;
+ const cEvent *eventReplay = Schedule->GetEventAround(time(0) - timeShiftSecondsAfter);
// Display title at replay position
if (eventReplay && eventReplay != lastEvent && veRecTitle) {
veRecTitle->Set(recording, eventReplay, true);
@@ -220,6 +232,9 @@ void cViewReplay::SetTimeShiftValues(int current, int total) {
int mins = (timeShiftLength / 60) % 60;
int hours = (timeShiftLength / 3600) % 24;
timeShiftDuration = cString::sprintf("%d:%02d", hours, mins);
+ mins = (timeShiftSecondsAfter / 60) % 60;
+ hours = (timeShiftSecondsAfter / 3600) % 24;
+ timeshiftrest = cString::sprintf("%d:%02d", hours, mins);
}
void cViewReplay::SetRecording(const cRecording *recording) {
@@ -249,16 +264,30 @@ void cViewReplay::SetTitle(const char *title) {
void cViewReplay::SetCurrent(const char *current) {
if (veCurrentTime)
- veCurrentTime->Set(current);
+ veCurrentTime->Set(current, timeShiftActive);
Render((int)eVeDisplayReplay::currenttime);
}
void cViewReplay::SetTotal(const char *total) {
if (veTotalTime)
- veTotalTime->Set(total, timeShiftActive, *timeShiftDuration);
+ veTotalTime->Set(total, *timeShiftDuration, timeShiftActive);
Render((int)eVeDisplayReplay::totaltime);
}
+void cViewReplay::SetTimeshiftTimes(int current, int total) {
+ if (!veTimeshiftTimes || reclength == 0)
+ return;
+ time_t recordingStart = 0;
+ time_t playbackTime = 0;
+ if (timeShiftActive) {
+ recordingStart = time(0) - recording->LengthInSeconds();
+ playbackTime = time(0) - (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total));
+ } else
+ recordingStart = recording->Start();
+ veTimeshiftTimes->Set(TimeString(recordingStart), TimeString(playbackTime), timeshiftrest, timeShiftActive);
+ Render((int)eVeDisplayReplay::timeshifttimes);
+}
+
void cViewReplay::SetEndTime(int current, int total) {
if (!veEndTime || reclength == 0)
return;
@@ -270,12 +299,12 @@ void cViewReplay::SetEndTime(int current, int total) {
}
double rest = (double)(totalLength - current) / (double)totalLength;
time_t end = time(0) + rest * recordingLength;
- veEndTime->Set(TimeString(end));
+ veEndTime->Set(TimeString(end), timeShiftActive);
Render((int)eVeDisplayReplay::endtime);
}
void cViewReplay::SetProgressbar(int current, int total) {
- SetTimeShiftValues(current, total);
+// SetTimeShiftValues(current, total);
if (veProgressbar)
veProgressbar->Set(current, total, timeShiftActive, timeShiftFramesTotal);
Render((int)eVeDisplayReplay::progressbar);
diff --git a/coreengine/viewdisplayreplay.h b/coreengine/viewdisplayreplay.h
index 310c6e9..5746ac2 100644
--- a/coreengine/viewdisplayreplay.h
+++ b/coreengine/viewdisplayreplay.h
@@ -12,6 +12,7 @@ private:
cVeDrScraperContent *veScraperContent;
cVeDrCurrentTime *veCurrentTime;
cVeDrTotalTime *veTotalTime;
+ cVeDrTimeshiftTimes *veTimeshiftTimes;
cVeDrEndTime *veEndTime;
cVeDrProgressBar *veProgressbar;
cVeDrCutMarks *veCutMarks;
@@ -31,11 +32,11 @@ private:
bool timeShiftActive;
int timeShiftFramesTotal;
int timeShiftLength;
+ cString timeshiftrest;
cString timeShiftDuration;
bool timersLoaded;
cGlobalTimers globalTimers;
void GetGlobalTimers(void);
- void SetTimeShiftValues(int current, int total);
void SetViewElements(void);
void ClearVariables(void);
void SetViewElementObjects(void);
@@ -47,9 +48,11 @@ public:
void SetModeOnly(bool modeOnly) { this->modeOnly = modeOnly; };
void SetRecordingLength(int length) { reclength = length; };
void SetRecording(const cRecording *recording);
+ void SetTimeShiftValues(int current, int total);
void SetTitle(const char *title);
void SetCurrent(const char *current);
void SetTotal(const char *total);
+ void SetTimeshiftTimes(int current, int total);
void SetEndTime(int current, int total);
void SetProgressbar(int current, int total);
void SetMarks(const cMarks *marks, int current, int total);
diff --git a/coreengine/viewelement.c b/coreengine/viewelement.c
index a30608f..abd5562 100644
--- a/coreengine/viewelement.c
+++ b/coreengine/viewelement.c
@@ -169,6 +169,8 @@ cViewElement *cViewElement::CreateViewElement(const char *name, const char *view
e = new cVeDrCurrentTime();
else if (!strcmp(name, "totaltime"))
e = new cVeDrTotalTime();
+ else if (!strcmp(name, "timeshifttimes"))
+ e = new cVeDrTimeshiftTimes();
else if (!strcmp(name, "endtime"))
e = new cVeDrEndTime();
else if (!strcmp(name, "progressbar") && !strcmp(viewname, "displayreplay"))
diff --git a/coreengine/viewelementsdisplayreplay.c b/coreengine/viewelementsdisplayreplay.c
index 64df8a8..4116153 100644
--- a/coreengine/viewelementsdisplayreplay.c
+++ b/coreengine/viewelementsdisplayreplay.c
@@ -10,6 +10,7 @@ cVeDrRecTitle::cVeDrRecTitle(void) {
recording = NULL;
event = NULL;
title = NULL;
+ timeshiftActive = false;
}
cVeDrRecTitle::~cVeDrRecTitle(void) {
@@ -163,6 +164,7 @@ bool cVeDrRecInfo::Parse(bool force) {
cVeDrCurrentTime::cVeDrCurrentTime(void) {
changed = true;
current = NULL;
+ timeshiftActive = false;
}
cVeDrCurrentTime::~cVeDrCurrentTime(void) {
@@ -172,14 +174,16 @@ cVeDrCurrentTime::~cVeDrCurrentTime(void) {
void cVeDrCurrentTime::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineStringToken("{reccurrent}", (int)eDRCurrentTimeST::reccurrent);
+ tokenContainer->DefineIntToken("{timeshift}", (int)eDRCurrentTimeIT::timeshift);
InheritTokenContainer();
}
-void cVeDrCurrentTime::Set(const char *current) {
+void cVeDrCurrentTime::Set(const char *current, bool timeshiftActive) {
if (!current)
return;
free(this->current);
this->current = strdup(current);
+ this->timeshiftActive = timeshiftActive;
changed = true;
}
@@ -188,6 +192,7 @@ bool cVeDrCurrentTime::Parse(bool force) {
return false;
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDRCurrentTimeST::reccurrent, current);
+ tokenContainer->AddIntToken((int)eDRCurrentTimeIT::timeshift, timeshiftActive);
SetDirty();
changed = false;
return true;
@@ -199,8 +204,8 @@ bool cVeDrCurrentTime::Parse(bool force) {
cVeDrTotalTime::cVeDrTotalTime(void) {
changed = true;
total = NULL;
- timeshiftActive = false;
timeshiftDuration = NULL;
+ timeshiftActive = false;
}
cVeDrTotalTime::~cVeDrTotalTime(void) {
@@ -216,7 +221,7 @@ void cVeDrTotalTime::SetTokenContainer(void) {
InheritTokenContainer();
}
-void cVeDrTotalTime::Set(const char *total, bool timeshiftActive, const char *timeshiftDuration) {
+void cVeDrTotalTime::Set(const char *total, const char *timeshiftDuration, bool timeshiftActive) {
if (!total)
return;
free(this->total);
@@ -242,10 +247,58 @@ bool cVeDrTotalTime::Parse(bool force) {
}
/******************************************************************
+* cVeDrTimeshiftTimes
+******************************************************************/
+cVeDrTimeshiftTimes::cVeDrTimeshiftTimes(void) {
+ changed = true;
+ start = "";
+ playbacktime = "";
+ timeshiftrest = "";
+ timeshiftActive = false;
+}
+
+cVeDrTimeshiftTimes::~cVeDrTimeshiftTimes(void) {
+}
+
+void cVeDrTimeshiftTimes::SetTokenContainer(void) {
+ tokenContainer = new skindesignerapi::cTokenContainer();
+ tokenContainer->DefineStringToken("{recstart}", (int)eDRTimeshiftTimesST::recstart);
+ tokenContainer->DefineStringToken("{playbacktime}", (int)eDRTimeshiftTimesST::playbacktime);
+ tokenContainer->DefineStringToken("{timeshiftrest}", (int)eDRTimeshiftTimesST::timeshiftrest);
+ tokenContainer->DefineIntToken("{timeshift}", (int)eDRTimeshiftTimesIT::timeshift);
+ InheritTokenContainer();
+}
+
+void cVeDrTimeshiftTimes::Set(cString start, cString playbacktime, cString timeshiftrest, bool timeshiftActive) {
+ this->timeshiftActive = timeshiftActive;
+ if (strcmp(*this->start, *start) || strcmp(*this->playbacktime, *playbacktime) || strcmp(*this->timeshiftrest, *timeshiftrest)) {
+ this->start = start;
+ this->playbacktime = playbacktime;
+ this->timeshiftrest = timeshiftrest;
+ changed = true;
+ }
+}
+
+bool cVeDrTimeshiftTimes::Parse(bool force) {
+ if (!cViewElement::Parse(force) || !changed)
+ return false;
+ tokenContainer->Clear();
+ tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::recstart, *start);
+ tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::playbacktime, *playbacktime);
+ tokenContainer->AddStringToken((int)eDRTimeshiftTimesST::timeshiftrest, *timeshiftrest);
+ tokenContainer->AddIntToken((int)eDRTimeshiftTimesIT::timeshift, timeshiftActive);
+ SetDirty();
+ changed = false;
+ return true;
+}
+
+/******************************************************************
* cVeDrEndTime
******************************************************************/
cVeDrEndTime::cVeDrEndTime(void) {
+ changed = true;
end = "";
+ timeshiftActive = false;
}
cVeDrEndTime::~cVeDrEndTime(void) {
@@ -254,10 +307,12 @@ cVeDrEndTime::~cVeDrEndTime(void) {
void cVeDrEndTime::SetTokenContainer(void) {
tokenContainer = new skindesignerapi::cTokenContainer();
tokenContainer->DefineStringToken("{recend}", (int)eDREndTimeST::recend);
+ tokenContainer->DefineIntToken("{timeshift}", (int)eDREndTimeIT::timeshift);
InheritTokenContainer();
}
-void cVeDrEndTime::Set(cString end) {
+void cVeDrEndTime::Set(cString end, bool timeshiftActive) {
+ this->timeshiftActive = timeshiftActive;
if (strcmp(*this->end, *end)) {
this->end = end;
changed = true;
@@ -269,6 +324,7 @@ bool cVeDrEndTime::Parse(bool force) {
return false;
tokenContainer->Clear();
tokenContainer->AddStringToken((int)eDREndTimeST::recend, *end);
+ tokenContainer->AddIntToken((int)eDREndTimeIT::timeshift, timeshiftActive);
SetDirty();
changed = false;
return true;
@@ -280,8 +336,8 @@ bool cVeDrEndTime::Parse(bool force) {
cVeDrProgressBar::cVeDrProgressBar(void) {
current = -1;
total = -1;
- timeshiftActive = false;
timeshiftTotal = -1;
+ timeshiftActive = false;
changed = true;
}
@@ -304,6 +360,7 @@ void cVeDrProgressBar::Set(int current, int total, bool timeshiftActive, int tim
this->total = total;
this->timeshiftActive = timeshiftActive;
this->timeshiftTotal = timeshiftTotal;
+
changed = true;
}
@@ -327,6 +384,7 @@ bool cVeDrProgressBar::Parse(bool force) {
cVeDrCutMarks::cVeDrCutMarks(void) {
cutmarksIndex = -1;
lastMarks = NULL;
+ timeshiftActive = false;
Reset();
}
diff --git a/coreengine/viewelementsdisplayreplay.h b/coreengine/viewelementsdisplayreplay.h
index f6d28e5..0cc4be6 100644
--- a/coreengine/viewelementsdisplayreplay.h
+++ b/coreengine/viewelementsdisplayreplay.h
@@ -43,11 +43,12 @@ class cVeDrCurrentTime : public cViewElement {
private:
bool changed;
char *current;
+ bool timeshiftActive;
public:
cVeDrCurrentTime(void);
virtual ~cVeDrCurrentTime(void);
void SetTokenContainer(void);
- void Set(const char *current);
+ void Set(const char *current, bool timeshiftActive = false);
bool Parse(bool forced = false);
};
@@ -64,7 +65,25 @@ public:
cVeDrTotalTime(void);
virtual ~cVeDrTotalTime(void);
void SetTokenContainer(void);
- void Set(const char *total, bool timeshiftActive, const char *timeshiftDuration);
+ void Set(const char *total, const char *timeshiftDuration = NULL, bool timeshiftActive = false);
+ bool Parse(bool forced = false);
+};
+
+/******************************************************************
+* cVeDrTimeshiftTimes
+******************************************************************/
+class cVeDrTimeshiftTimes : public cViewElement {
+private:
+ cString start;
+ cString playbacktime;
+ cString timeshiftrest;
+ bool changed;
+ bool timeshiftActive;
+public:
+ cVeDrTimeshiftTimes(void);
+ virtual ~cVeDrTimeshiftTimes(void);
+ void SetTokenContainer(void);
+ void Set(cString start, cString playbacktime, cString timeshiftrest, bool timeshiftActive = false);
bool Parse(bool forced = false);
};
@@ -74,12 +93,13 @@ public:
class cVeDrEndTime : public cViewElement {
private:
cString end;
+ bool timeshiftActive;
bool changed;
public:
cVeDrEndTime(void);
virtual ~cVeDrEndTime(void);
void SetTokenContainer(void);
- void Set(cString end);
+ void Set(cString end, bool timeshiftActive = false);
bool Parse(bool forced = false);
};
@@ -97,7 +117,7 @@ public:
cVeDrProgressBar(void);
virtual ~cVeDrProgressBar(void);
void SetTokenContainer(void);
- void Set(int current, int total, bool timeshiftActive, int timeshiftTotal);
+ void Set(int current, int total, bool timeshiftActive = false, int timeshiftTotal = 0);
bool Parse(bool forced = false);
};
@@ -121,7 +141,7 @@ public:
cVeDrCutMarks(void);
virtual ~cVeDrCutMarks(void);
void SetTokenContainer(void);
- void Set(const cMarks *marks, int current, int total, bool timeshiftActive, int timeshiftTotal);
+ void Set(const cMarks *marks, int current, int total, bool timeshiftActive = false, int timeshiftTotal = 0);
void Reset(void);
bool Parse(bool forced = false);
};
diff --git a/displayreplay.c b/displayreplay.c
index 2a8b646..1cec745 100644
--- a/displayreplay.c
+++ b/displayreplay.c
@@ -53,8 +53,10 @@ void cSDDisplayReplay::SetMode(bool Play, bool Forward, int Speed) {
void cSDDisplayReplay::SetProgress(int Current, int Total) {
if (ok) {
+ view->SetTimeShiftValues(Current, Total);
view->SetProgressbar(Current, Total);
view->SetMarks(marks, Current, Total);
+ view->SetTimeshiftTimes(Current, Total);
view->SetEndTime(Current, Total);
view->DelayOnPause();
}
diff --git a/dtd/displayreplay.dtd b/dtd/displayreplay.dtd
index d3e2859..c226c12 100644
--- a/dtd/displayreplay.dtd
+++ b/dtd/displayreplay.dtd
@@ -4,7 +4,7 @@
<!ELEMENT displayreplay (background | backgroundmodeonly |datetime | time |
scrapercontent | currentweather | rectitle | recinfo | currenttime |
- totaltime | endtime | progressbar | cutmarks | controlicons |
+ totaltime | timeshifttimes | endtime | progressbar | cutmarks | controlicons |
controliconsmodeonly | progressmodeonly | jump | message | onpause |
onpausemodeonly | customtokens)*>
<!ATTLIST displayreplay
@@ -153,6 +153,19 @@
condition CDATA #IMPLIED
>
+<!ELEMENT timeshifttimes (areacontainer|area|areascroll)*>
+<!ATTLIST timeshifttimes
+ delay CDATA #IMPLIED
+ fadetime CDATA #IMPLIED
+ shifttime CDATA #IMPLIED
+ shifttype CDATA #IMPLIED
+ shiftmode CDATA #IMPLIED
+ startx CDATA #IMPLIED
+ starty CDATA #IMPLIED
+ debug CDATA #IMPLIED
+ condition CDATA #IMPLIED
+>
+
<!ELEMENT endtime (areacontainer|area|areascroll)*>
<!ATTLIST endtime
delay CDATA #IMPLIED
@@ -289,4 +302,4 @@
condition CDATA #IMPLIED
>
-%functions; \ No newline at end of file
+%functions;
diff --git a/skins/estuary4vdr/globals.xml b/skins/estuary4vdr/globals.xml
index eb5fa60..6a77984 100644
--- a/skins/estuary4vdr/globals.xml
+++ b/skins/estuary4vdr/globals.xml
@@ -242,6 +242,27 @@
<trans lang="hu_HU">Időzítő kereső</trans>
<trans lang="it_IT">Cerca timer</trans>
</token>
+ <token name="tr(start)">
+ <trans lang="en_EN">start</trans>
+ <trans lang="de_DE">Beginn</trans>
+ <trans lang="fi_FI">Alkaa</trans>
+ <trans lang="hu_HU">Rajt</trans>
+ <trans lang="it_IT">Inizio</trans>
+ </token>
+ <token name="tr(rest)">
+ <trans lang="en_EN">rest</trans>
+ <trans lang="de_DE">Rest</trans>
+ <trans lang="fi_FI">Loput</trans>
+ <trans lang="hu_HU">Maradék</trans>
+ <trans lang="it_IT">Riposo</trans>
+ </token>
+ <token name="tr(playback)">
+ <trans lang="en_EN">playback</trans>
+ <trans lang="de_DE">Wiedergabe</trans>
+ <trans lang="fi_FI">Toisto</trans>
+ <trans lang="hu_HU">Lejátszás</trans>
+ <trans lang="it_IT">Riproduzione</trans>
+ </token>
<token name="tr(end)">
<trans lang="en_EN">end</trans>
<trans lang="de_DE">Ende</trans>
diff --git a/skins/estuary4vdr/xmlfiles/displayreplay.xml b/skins/estuary4vdr/xmlfiles/displayreplay.xml
index 0e8b33a..3295d0d 100644
--- a/skins/estuary4vdr/xmlfiles/displayreplay.xml
+++ b/skins/estuary4vdr/xmlfiles/displayreplay.xml
@@ -16,15 +16,15 @@
</backgroundmodeonly>
<datetime>
- <area x="75%" y="75%" width="13%" height="6%" layer="2">
+ <area x="85%" y="75%" width="14%" height="6%" layer="2">
<drawtext align="right" y="0" fontsize="{areaheight}*{replaydatetimesize}/100" font="{regular}" color="{fontdefault}" text="{daynameshort} {day}.{monthnameshort}" />
</area>
</datetime>
<time>
- <area x="89%" y="75%" width="11%" height="6%" layer="2">
- <drawtext name="clock" x="0" y="0" fontsize="{areaheight}*{replaydatetimesize}/100" font="{regular}" color="{fontdefault}" text="{hour}:{printf('%02d', min)}" />
- <drawtext name="clocksec" x="{posx(clock)} + {width(clock)}" y="{height(clock)} - {height(clocksec)} - 1" fontsize="{areaheight}*{replaydatetimesize}*0.8/100" font="{regular}" color="{fontdefault}" text=":{printf('%02d', sec)}" />
+ <area x="80%" y="80%" width="19%" height="5%" layer="2">
+ <drawtext name="clocksec" align="right" y="{height(clock)} - {height(clocksec)} - 1" fontsize="{areaheight}*{replaydatetimesize}*0.8/100" font="{regular}" color="{fontdefault}" text=":{printf('%02d', sec)}" />
+ <drawtext name="clock" x="{posx(clocksec)} - {width(clock)}" y="0" fontsize="{areaheight}*{replaydatetimesize}/100" font="{regular}" color="{fontdefault}" text="{hour}:{printf('%02d', min)}" />
</area>
</time>
@@ -38,7 +38,7 @@
</scrapercontent>
<rectitle>
- <area condition="{timeshift}" x="12%" y="75%" width="63%" height="6%" layer="2">
+ <area condition="{timeshift}" x="12%" y="75%" width="73%" height="6%" layer="2">
<drawtext name="eventtime" align="right" y="0" fontsize="{areaheight}*{replaytitlesize}/100" font="{bold}" color="{fontactive}" text= "{eventstart} - {eventstop}" />
<drawtext name="title" x="0" y="0" width="{areawidth} - {width(eventtime)} - 2" fontsize="{areaheight}*{replaytitlesize}/100" font="{regular}" color="{fontdefault}" text="{rectitle}" />
<drawtext condition="isset{title} ++ isset{recsubtitle}" x="{width(title)}" y="0" width="{areawidth} - {width(title)} - {width(eventtime)} - 2" fontsize="{areaheight}*{replaytitlesize}/100" font="{regular}" color="{fontdefault}" text=" - {recsubtitle}" />
@@ -73,29 +73,46 @@
</recinfo>
<currenttime>
- <area x="12%" y="86%" width="15%" height="5%" layer="2">
+ <area condition="not{timeshift}" x="12%" y="87%" width="15%" height="5%" layer="2">
<drawtext x="0" y="0" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" font="{regular}" color="{fontdefault}" text="{reccurrent}" />
</area>
+ <area condition="{timeshift}" x="12%" y="90%" width="15%" height="5%" layer="2">
+ <drawtext x="0" y="0" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" font="{regular}" color="{fontdefault}" text="({reccurrent})" />
+ </area>
</currenttime>
<totaltime>
- <area x="80%" y="86%" width="19%" height="5%" layer="2">
- <drawtext condition="not{timeshift}" align="right" y="0" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" font="{regular}" color="{fontdefault}" text="{rectotal}" />
- <drawtext condition="{timeshift}" align="right" y="0" font="{regular}" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" color="{fontdefault}" text="{timeshifttotal} ({rectotal})" />
+ <area condition="not{timeshift}" x="80%" y="87%" width="19%" height="5%" layer="2">
+ <drawtext align="right" y="0" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" font="{regular}" color="{fontdefault}" text="{rectotal}" />
+ </area>
+ <area condition="{timeshift}" x="80%" y="90%" width="19%" height="5%" layer="2">
+ <drawtext align="right" y="0" font="{regular}" fontsize="{areaheight}*{replaycurrenttotaltimesize}/100" color="{fontdefault}" text="{timeshifttotal} ({rectotal})" />
</area>
</totaltime>
+ <timeshifttimes>
+ <area condition="{timeshift}" x="12%" y="81%" width="19%" height="5%" layer="2">
+ <drawtext align="left" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="{tr(start)}: {recstart}" />
+ </area>
+ <area condition="{timeshift}" x="40%" y="81%" width="20%" height="5%" layer="2">
+ <drawtext name="rest" align="center" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="TS {tr(rest)}: -{timeshiftrest}" />
+ </area>
+ <area condition="{timeshift}" x="12%" y="87%" width="19%" height="5%" layer="2">
+ <drawtext align="left" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="{tr(playback)}: {playbacktime}" />
+ </area>
+ </timeshifttimes>
+
<endtime>
- <area x="80%" y="90%" width="19%" height="5%" layer="2">
+ <area condition="{timeshift}" x="80%" y="87%" width="19%" height="5%" layer="2">
<drawtext align="right" y="0" fontsize="{areaheight}*{replayendtimesize}/100" font="{regular}" color="{fontdefault}" text="{tr(end)}: {recend}" />
</area>
</endtime>
<progressbar>
- <area background="true" x="12%" y="83%" width="87%" height="3%" layer="2">
+ <area background="true" x="12%" y="84%" width="87%" height="3%" layer="2">
<fill color="{progressbarback}" />
</area>
- <area x="12%" y="83%" width="87%" height="3%" layer="3">
+ <area x="12%" y="84%" width="87%" height="3%" layer="3">
<drawrectangle condition="not{timeshift}" x="0" y="0" width="{areawidth}*{current}/{total}" height="100%" color="{progressbar}" />
<drawrectangle condition="{timeshift}" x="0" y="{areaheight}*0.2" width="{total}/{timeshifttotal}*{areawidth}" height="{areaheight}*0.6" color="{progressbartimeshift}" />
<drawrectangle condition="{timeshift}" x="0" y="0" width="{current}/{timeshifttotal}*{areawidth}" height="{areaheight}" color="{progressbar}" />
@@ -103,7 +120,7 @@
</progressbar>
<cutmarks>
- <area condition="not{timeshift}" x="12%" y="83%" width="87%" height="3%" layer="4">
+ <area condition="not{timeshift}" x="12%" y="84%" width="87%" height="3%" layer="4">
<loop name="marks" x="0" y="0" orientation="absolute">
<!-- draw mark -->
<drawrectangle x="{marks[position]}/{marks[total]}*{areawidth}-2" y="0" width="4" height="100%" color="{cutmark}" />
@@ -115,6 +132,18 @@
<drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="30%" width="{marks[endposition]}/{marks[total]}*{areawidth} - {marks[position]}/{marks[total]}*{areawidth}" height="40%" color="{cutmark}" />
</loop>
</area>
+ <area condition="{timeshift}" x="12%" y="84%" width="87%" height="3%" layer="4">
+ <loop name="marks" x="0" y="0" orientation="absolute">
+ <!-- draw mark -->
+ <drawrectangle x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}-2" y="0" width="4" height="100%" color="{cutmark}" />
+ <drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}" y="0" width="5" height="2" color="{cutmark}" />
+ <drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}" y="{areaheight}-2" width="5" height="2" color="{cutmark}" />
+ <drawrectangle condition="not{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}-5" y="0" width="5" height="2" color="{cutmark}" />
+ <drawrectangle condition="not{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}-5" y="{areaheight}-2" width="5" height="2" color="{cutmark}" />
+ <!-- draw bar to next mark if mark is startmark-->
+ <drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[timeshifttotal]}*{areawidth}" y="30%" width="{marks[endposition]}/{marks[timeshifttotal]}*{areawidth} - {marks[position]}/{marks[timeshifttotal]}*{areawidth}" height="40%" color="{cutmark}" />
+ </loop>
+ </area>
</cutmarks>
<controlicons>
diff --git a/skinskeleton/xmlfiles/displayreplay.xml b/skinskeleton/xmlfiles/displayreplay.xml
index ed548ba..7e2a1aa 100644
--- a/skinskeleton/xmlfiles/displayreplay.xml
+++ b/skinskeleton/xmlfiles/displayreplay.xml
@@ -76,7 +76,8 @@
</recinfo>
<!-- Available Variables currenttime:
- {reccurrent} Current Time in hh:mm:ss
+ {reccurrent} Current Time in hh:mm:ss
+ {timeshift} true if a timeshifted recording is displayed
-->
<currenttime>
</currenttime>
@@ -89,8 +90,18 @@
<totaltime>
</totaltime>
+ <!-- Available Variables timeshifttimes:
+ {recstart} Start Time in hh:mm
+ {playbacktime} actual replaying time in timeshift mode in hh:mm
+ {timeshiftrest} Rest of unseen timeshift buffer in hh:mm
+ {timeshift} true if a timeshifted recording is displayed
+ -->
+ <timeshifttimes>
+ </timeshifttimes>
+
<!-- Available Variables endtime:
{recend} End Time in hh:mm
+ {timeshift} true if a timeshifted recording is displayed
-->
<endtime>
</endtime>