summaryrefslogtreecommitdiff
path: root/patches
diff options
context:
space:
mode:
Diffstat (limited to 'patches')
-rw-r--r--patches/pre-vdr-2.1.x--epghandler-segment-transfer.patch65
-rw-r--r--patches/vdr-1.7.27-to-epghandler-of-1.7.31.patch219
-rw-r--r--patches/vdr-1.7.28-epghandledexternally.diff118
-rw-r--r--patches/vdr-1.7.29-epgIsUpdate.diff52
-rw-r--r--patches/vdr-2.2.0-aux.patch79
-rw-r--r--patches/vdr-2.3.1.patch11
-rw-r--r--patches/vdr-2.3.2-aux.patch79
7 files changed, 158 insertions, 465 deletions
diff --git a/patches/pre-vdr-2.1.x--epghandler-segment-transfer.patch b/patches/pre-vdr-2.1.x--epghandler-segment-transfer.patch
deleted file mode 100644
index 8374a66..0000000
--- a/patches/pre-vdr-2.1.x--epghandler-segment-transfer.patch
+++ /dev/null
@@ -1,65 +0,0 @@
---- ../vdr-2.0.2.plain//eit.c 2012-12-04 12:10:10.000000000 +0100
-+++ eit.c 2013-05-22 16:49:37.635027462 +0200
-@@ -46,6 +46,8 @@
- return;
- }
-
-+ EpgHandlers.BeginSegmentTransfer(channel, OnlyRunningStatus);
-+
- bool handledExternally = EpgHandlers.HandledExternally(channel);
- cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true);
-
-@@ -310,6 +312,7 @@
- Schedules->SetModified(pSchedule);
- }
- Channels.Unlock();
-+ EpgHandlers.EndSegmentTransfer(Modified, OnlyRunningStatus);
- }
-
- // --- cTDT ------------------------------------------------------------------
---- ../vdr-2.0.2.plain//epg.c 2013-02-17 15:12:07.000000000 +0100
-+++ epg.c 2013-05-22 16:50:29.043029281 +0200
-@@ -1537,3 +1537,19 @@
- }
- Schedule->DropOutdated(SegmentStart, SegmentEnd, TableID, Version);
- }
-+
-+void cEpgHandlers::BeginSegmentTransfer(const cChannel *Channel, bool OnlyRunningStatus)
-+{
-+ for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
-+ if (eh->BeginSegmentTransfer(Channel, OnlyRunningStatus))
-+ return;
-+ }
-+}
-+
-+void cEpgHandlers::EndSegmentTransfer(bool Modified, bool OnlyRunningStatus)
-+{
-+ for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
-+ if (eh->EndSegmentTransfer(Modified, OnlyRunningStatus))
-+ return;
-+ }
-+}
---- ../vdr-2.0.2.plain//epg.h 2012-09-24 14:53:53.000000000 +0200
-+++ epg.h 2013-05-22 16:50:16.867028850 +0200
-@@ -273,6 +273,12 @@
- virtual bool DropOutdated(cSchedule *Schedule, time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version) { return false; }
- ///< Takes a look at all EPG events between SegmentStart and SegmentEnd and
- ///< drops outdated events.
-+ virtual bool BeginSegmentTransfer(const cChannel *Channel, bool OnlyRunningStatus) { return false; }
-+ ///< called directly after IgnoreChannel before any other handler method called
-+ ///< designed to give handlers the ossibility to prepare a transaction
-+ virtual bool EndSegmentTransfer(bool Modified, bool OnlyRunningStatus) { return false; }
-+ ///< called at last after the segment data is processed
-+ ///< at this oint handlers should close/commt/rollback their transactions
- };
-
- class cEpgHandlers : public cList<cEpgHandler> {
-@@ -295,6 +301,8 @@
- void HandleEvent(cEvent *Event);
- void SortSchedule(cSchedule *Schedule);
- void DropOutdated(cSchedule *Schedule, time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version);
-+ void BeginSegmentTransfer(const cChannel *Channel, bool OnlyRunningStatus);
-+ void EndSegmentTransfer(bool Modified, bool OnlyRunningStatus);
- };
-
- extern cEpgHandlers EpgHandlers;
diff --git a/patches/vdr-1.7.27-to-epghandler-of-1.7.31.patch b/patches/vdr-1.7.27-to-epghandler-of-1.7.31.patch
deleted file mode 100644
index 7be1802..0000000
--- a/patches/vdr-1.7.27-to-epghandler-of-1.7.31.patch
+++ /dev/null
@@ -1,219 +0,0 @@
---- /home/wendel/vdr-1.7.27.plain//eit.c 2012-03-14 11:11:15.000000000 +0100
-+++ eit.c 2012-10-01 09:38:51.526839349 +0200
-@@ -45,6 +45,7 @@
- return;
- }
-
-+ bool handledExternally = EpgHandlers.HandledExternally(channel);
- cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true);
-
- bool Empty = true;
-@@ -70,14 +71,18 @@
- cEvent *newEvent = NULL;
- cEvent *rEvent = NULL;
- cEvent *pEvent = (cEvent *)pSchedule->GetEvent(SiEitEvent.getEventId(), StartTime);
-- if (!pEvent) {
-+ if (!pEvent || handledExternally) {
- if (OnlyRunningStatus)
- continue;
-+ if (handledExternally)
-+ if (!EpgHandlers.IsUpdate(SiEitEvent.getEventId(), StartTime, Tid, getVersionNumber()))
-+ continue;
- // If we don't have that event yet, we create a new one.
- // Otherwise we copy the information into the existing event anyway, because the data might have changed.
- pEvent = newEvent = new cEvent(SiEitEvent.getEventId());
- newEvent->SetStartTime(StartTime);
- newEvent->SetDuration(Duration);
-+ if (!handledExternally)
- pSchedule->AddEvent(newEvent);
- }
- else {
-@@ -290,6 +295,9 @@
- channel->SetLinkChannels(LinkChannels);
- Modified = true;
- EpgHandlers.HandleEvent(pEvent);
-+
-+ if (handledExternally)
-+ delete pEvent;
- }
- if (Tid == 0x4E) {
- if (Empty && getSectionNumber() == 0)
---- /home/wendel/vdr-1.7.27.plain//epg.c 2012-03-10 14:14:27.000000000 +0100
-+++ epg.c 2012-10-01 09:41:35.010845128 +0200
-@@ -18,6 +18,7 @@
- #include "timers.h"
-
- #define RUNNINGSTATUSTIMEOUT 30 // seconds before the running status is considered unknown
-+#define EPGDATAWRITEDELTA 600 // seconds between writing the epg.data file
-
- // --- tComponent ------------------------------------------------------------
-
-@@ -1109,6 +1110,47 @@
- return false;
- }
-
-+// --- cEpgDataWriter ---------------------------------------------------------
-+
-+class cEpgDataWriter : public cThread {
-+private:
-+ cMutex mutex;
-+protected:
-+ virtual void Action(void);
-+public:
-+ cEpgDataWriter(void);
-+ void Perform(void);
-+ };
-+
-+cEpgDataWriter::cEpgDataWriter(void)
-+:cThread("epg data writer")
-+{
-+}
-+
-+void cEpgDataWriter::Action(void)
-+{
-+ SetPriority(19);
-+ SetIOPriority(7);
-+ Perform();
-+}
-+
-+void cEpgDataWriter::Perform(void)
-+{
-+ cMutexLock MutexLock(&mutex); // to make sure fore- and background calls don't cause parellel dumps!
-+ {
-+ cSchedulesLock SchedulesLock(true, 1000);
-+ cSchedules *s = (cSchedules *)cSchedules::Schedules(SchedulesLock);
-+ if (s) {
-+ time_t now = time(NULL);
-+ for (cSchedule *p = s->First(); p; p = s->Next(p))
-+ p->Cleanup(now);
-+ }
-+ }
-+ cSchedules::Dump();
-+}
-+
-+static cEpgDataWriter EpgDataWriter;
-+
- // --- cSchedulesLock --------------------------------------------------------
-
- cSchedulesLock::cSchedulesLock(bool WriteLock, int TimeoutMs)
-@@ -1152,28 +1194,13 @@
- if (Force)
- lastDump = 0;
- time_t now = time(NULL);
-- struct tm tm_r;
-- struct tm *ptm = localtime_r(&now, &tm_r);
-- if (now - lastCleanup > 3600) {
-- isyslog("cleaning up schedules data");
-- cSchedulesLock SchedulesLock(true, 1000);
-- cSchedules *s = (cSchedules *)Schedules(SchedulesLock);
-- if (s) {
-- for (cSchedule *p = s->First(); p; p = s->Next(p))
-- p->Cleanup(now);
-- }
-- lastCleanup = now;
-- if (ptm->tm_hour == 5)
-- ReportEpgBugFixStats(true);
-- }
-- if (epgDataFileName && now - lastDump > 600) {
-- cSafeFile f(epgDataFileName);
-- if (f.Open()) {
-- Dump(f);
-- f.Close();
-+ if (now - lastDump > EPGDATAWRITEDELTA) {
-+ if (epgDataFileName) {
-+ if (Force)
-+ EpgDataWriter.Perform();
-+ else if (!EpgDataWriter.Active())
-+ EpgDataWriter.Start();
- }
-- else
-- LOG_ERROR;
- lastDump = now;
- }
- }
-@@ -1207,8 +1234,23 @@
- cSchedulesLock SchedulesLock;
- cSchedules *s = (cSchedules *)Schedules(SchedulesLock);
- if (s) {
-+ cSafeFile *sf = NULL;
-+ if (!f) {
-+ sf = new cSafeFile(epgDataFileName);
-+ if (sf->Open())
-+ f = *sf;
-+ else {
-+ LOG_ERROR;
-+ delete sf;
-+ return false;
-+ }
-+ }
- for (cSchedule *p = s->First(); p; p = s->Next(p))
- p->Dump(f, Prefix, DumpMode, AtTime);
-+ if (sf) {
-+ sf->Close();
-+ delete sf;
-+ }
- return true;
- }
- return false;
-@@ -1329,6 +1371,24 @@
- return true;
- }
- return false;
-+}
-+
-+bool cEpgHandlers::HandledExternally(const cChannel *Channel)
-+{
-+ for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
-+ if (eh->HandledExternally(Channel))
-+ return true;
-+ }
-+ return false;
-+}
-+
-+bool cEpgHandlers::IsUpdate(tEventID EventID, time_t StartTime, uchar TableID, uchar Version)
-+{
-+ for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
-+ if (eh->IsUpdate(EventID, StartTime, TableID, Version))
-+ return true;
-+ }
-+ return false;
- }
-
- void cEpgHandlers::SetEventID(cEvent *Event, tEventID EventID)
---- /home/wendel/vdr-1.7.27.plain//epg.h 2012-03-10 14:50:10.000000000 +0100
-+++ epg.h 2012-10-01 09:43:28.162849134 +0200
-@@ -207,7 +207,7 @@
- static void Cleanup(bool Force = false);
- static void ResetVersions(void);
- static bool ClearAll(void);
-- static bool Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0);
-+ static bool Dump(FILE *f = NULL, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0);
- static bool Read(FILE *f = NULL);
- cSchedule *AddSchedule(tChannelID ChannelID);
- const cSchedule *GetSchedule(tChannelID ChannelID) const;
-@@ -244,6 +244,16 @@
- ///< EPG handlers are queried to see if any of them would like to do the
- ///< complete processing by itself. TableID and Version are from the
- ///< incoming section data.
-+ virtual bool HandledExternally(const cChannel *Channel) { return false; }
-+ ///< If any EPG handler returns true in this function, it is assumed that
-+ ///< the EPG for the given Channel is handled completely from some external
-+ ///< source. Incoming EIT data is processed as usual, but any new EPG event
-+ ///< will not be added to the respective schedule. It's up to the EPG
-+ ///< handler to take care of this.
-+ virtual bool IsUpdate(tEventID EventID, time_t StartTime, uchar TableID, uchar Version) { return false; }
-+ ///< VDR can't perform the update check (version, tid) for external handled events
-+ ///< therefore the handle have to take care. Otherwise the parsing of 'non' updates will
-+ ///< take a lot of resources
- virtual bool SetEventID(cEvent *Event, tEventID EventID) { return false; }
- virtual bool SetTitle(cEvent *Event, const char *Title) { return false; }
- virtual bool SetShortText(cEvent *Event, const char *ShortText) { return false; }
-@@ -269,6 +279,8 @@
- public:
- bool IgnoreChannel(const cChannel *Channel);
- bool HandleEitEvent(cSchedule *Schedule, const SI::EIT::Event *EitEvent, uchar TableID, uchar Version);
-+ bool HandledExternally(const cChannel *Channel);
-+ bool IsUpdate(tEventID EventID, time_t StartTime, uchar TableID, uchar Version);
- void SetEventID(cEvent *Event, tEventID EventID);
- void SetTitle(cEvent *Event, const char *Title);
- void SetShortText(cEvent *Event, const char *ShortText);
diff --git a/patches/vdr-1.7.28-epghandledexternally.diff b/patches/vdr-1.7.28-epghandledexternally.diff
deleted file mode 100644
index 52dfab6..0000000
--- a/patches/vdr-1.7.28-epghandledexternally.diff
+++ /dev/null
@@ -1,118 +0,0 @@
---- ./eit.c 2012/06/02 14:05:22 2.17
-+++ ./eit.c 2012/06/04 10:10:11
-@@ -45,6 +45,7 @@
- return;
- }
-
-+ bool handledExternally = EpgHandlers.HandledExternally(channel);
- cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true);
-
- bool Empty = true;
-@@ -70,7 +71,7 @@
- cEvent *newEvent = NULL;
- cEvent *rEvent = NULL;
- cEvent *pEvent = (cEvent *)pSchedule->GetEvent(SiEitEvent.getEventId(), StartTime);
-- if (!pEvent) {
-+ if (!pEvent || handledExternally) {
- if (OnlyRunningStatus)
- continue;
- // If we don't have that event yet, we create a new one.
-@@ -78,7 +79,8 @@
- pEvent = newEvent = new cEvent(SiEitEvent.getEventId());
- newEvent->SetStartTime(StartTime);
- newEvent->SetDuration(Duration);
-- pSchedule->AddEvent(newEvent);
-+ if (!handledExternally)
-+ pSchedule->AddEvent(newEvent);
- }
- else {
- // We have found an existing event, either through its event ID or its start time.
-@@ -290,11 +292,8 @@
- channel->SetLinkChannels(LinkChannels);
- Modified = true;
- EpgHandlers.HandleEvent(pEvent);
--
-- if (EpgHandlers.DeleteEvent(pEvent)) {
-- pSchedule->DelEvent(pEvent);
-- pEvent = NULL;
-- }
-+ if (handledExternally)
-+ delete pEvent;
- }
- if (Tid == 0x4E) {
- if (Empty && getSectionNumber() == 0)
---- ./epg.c 2012/06/02 14:08:12 2.14
-+++ ./epg.c 2012/06/04 10:06:22
-@@ -1331,6 +1331,15 @@
- return false;
- }
-
-+bool cEpgHandlers::HandledExternally(const cChannel *Channel)
-+{
-+ for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
-+ if (eh->HandledExternally(Channel))
-+ return true;
-+ }
-+ return false;
-+}
-+
- void cEpgHandlers::SetEventID(cEvent *Event, tEventID EventID)
- {
- for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
-@@ -1429,15 +1438,6 @@
- }
- }
-
--bool cEpgHandlers::DeleteEvent(const cEvent *Event)
--{
-- for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
-- if (eh->DeleteEvent(Event))
-- return true;
-- }
-- return false;
--}
--
- void cEpgHandlers::SortSchedule(cSchedule *Schedule)
- {
- for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
---- ./epg.h 2012/06/02 14:07:51 2.10
-+++ ./epg.h 2012/06/04 10:05:21
-@@ -244,6 +244,12 @@
- ///< EPG handlers are queried to see if any of them would like to do the
- ///< complete processing by itself. TableID and Version are from the
- ///< incoming section data.
-+ virtual bool HandledExternally(const cChannel *Channel) { return false; }
-+ ///< If any EPG handler returns true in this function, it is assumed that
-+ ///< the EPG for the given Channel is handled completely from some external
-+ ///< source. Incoming EIT data is processed as usual, but any new EPG event
-+ ///< will not be added to the respective schedule. It's up to the EPG
-+ ///< handler to take care of this.
- virtual bool SetEventID(cEvent *Event, tEventID EventID) { return false; }
- virtual bool SetTitle(cEvent *Event, const char *Title) { return false; }
- virtual bool SetShortText(cEvent *Event, const char *ShortText) { return false; }
-@@ -258,9 +264,6 @@
- virtual bool HandleEvent(cEvent *Event) { return false; }
- ///< After all modifications of the Event have been done, the EPG handler
- ///< can take a final look at it.
-- virtual bool DeleteEvent(const cEvent *Event) { return false; }
-- ///< After the complete processing of the Event is finished, an EPG handler
-- ///< can decide that this Event shall be deleted from its schedule.
- virtual bool SortSchedule(cSchedule *Schedule) { return false; }
- ///< Sorts the Schedule after the complete table has been processed.
- virtual bool DropOutdated(cSchedule *Schedule, time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version) { return false; }
-@@ -272,6 +275,7 @@
- public:
- bool IgnoreChannel(const cChannel *Channel);
- bool HandleEitEvent(cSchedule *Schedule, const SI::EIT::Event *EitEvent, uchar TableID, uchar Version);
-+ bool HandledExternally(const cChannel *Channel);
- void SetEventID(cEvent *Event, tEventID EventID);
- void SetTitle(cEvent *Event, const char *Title);
- void SetShortText(cEvent *Event, const char *ShortText);
-@@ -283,7 +287,6 @@
- void SetVps(cEvent *Event, time_t Vps);
- void FixEpgBugs(cEvent *Event);
- void HandleEvent(cEvent *Event);
-- bool DeleteEvent(const cEvent *Event);
- void SortSchedule(cSchedule *Schedule);
- void DropOutdated(cSchedule *Schedule, time_t SegmentStart, time_t SegmentEnd, uchar TableID, uchar Version);
- };
diff --git a/patches/vdr-1.7.29-epgIsUpdate.diff b/patches/vdr-1.7.29-epgIsUpdate.diff
deleted file mode 100644
index 61549ca..0000000
--- a/patches/vdr-1.7.29-epgIsUpdate.diff
+++ /dev/null
@@ -1,52 +0,0 @@
---- ../vdr-1.7.29.plain//eit.c 2012-06-04 12:26:10.000000000 +0200
-+++ eit.c 2012-07-30 10:19:34.841894485 +0200
-@@ -74,6 +74,9 @@
- if (!pEvent || handledExternally) {
- if (OnlyRunningStatus)
- continue;
-+ if (handledExternally)
-+ if (!EpgHandlers.IsUpdate(SiEitEvent.getEventId(), StartTime, Tid, getVersionNumber()))
-+ continue;
- // If we don't have that event yet, we create a new one.
- // Otherwise we copy the information into the existing event anyway, because the data might have changed.
- pEvent = newEvent = new cEvent(SiEitEvent.getEventId());
---- ../vdr-1.7.29.plain//epg.c 2012-06-04 12:26:10.000000000 +0200
-+++ epg.c 2012-07-30 10:21:51.153899306 +0200
-@@ -1340,6 +1340,15 @@
- return false;
- }
-
-+bool cEpgHandlers::IsUpdate(tEventID EventID, time_t StartTime, uchar TableID, uchar Version)
-+{
-+ for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
-+ if (eh->IsUpdate(EventID, StartTime, TableID, Version))
-+ return true;
-+ }
-+ return false;
-+}
-+
- void cEpgHandlers::SetEventID(cEvent *Event, tEventID EventID)
- {
- for (cEpgHandler *eh = First(); eh; eh = Next(eh)) {
---- ../vdr-1.7.29.plain//epg.h 2012-06-04 12:26:10.000000000 +0200
-+++ epg.h 2012-07-30 10:20:15.705895929 +0200
-@@ -250,6 +250,10 @@
- ///< source. Incoming EIT data is processed as usual, but any new EPG event
- ///< will not be added to the respective schedule. It's up to the EPG
- ///< handler to take care of this.
-+ virtual bool IsUpdate(tEventID EventID, time_t StartTime, uchar TableID, uchar Version) { return false; }
-+ ///< VDR can't perform the update check (version, tid) for external handled events
-+ ///< therefore the handle have to take care. Otherwise the parsing of 'non' updates will
-+ ///< take a lot of resources
- virtual bool SetEventID(cEvent *Event, tEventID EventID) { return false; }
- virtual bool SetTitle(cEvent *Event, const char *Title) { return false; }
- virtual bool SetShortText(cEvent *Event, const char *ShortText) { return false; }
-@@ -277,6 +281,7 @@
- bool IgnoreChannel(const cChannel *Channel);
- bool HandleEitEvent(cSchedule *Schedule, const SI::EIT::Event *EitEvent, uchar TableID, uchar Version);
- bool HandledExternally(const cChannel *Channel);
-+ bool IsUpdate(tEventID EventID, time_t StartTime, uchar TableID, uchar Version);
- void SetEventID(cEvent *Event, tEventID EventID);
- void SetTitle(cEvent *Event, const char *Title);
- void SetShortText(cEvent *Event, const char *ShortText);
-
diff --git a/patches/vdr-2.2.0-aux.patch b/patches/vdr-2.2.0-aux.patch
new file mode 100644
index 0000000..749fb49
--- /dev/null
+++ b/patches/vdr-2.2.0-aux.patch
@@ -0,0 +1,79 @@
+--- ../vdr-2.2.0.plain/epg.c 2013-12-28 12:33:08.000000000 +0100
++++ epg.c 2017-03-22 16:21:34.266665706 +0100
+@@ -122,6 +122,7 @@
+ shortText = NULL;
+ description = NULL;
+ components = NULL;
++ aux = NULL;
+ memset(contents, 0, sizeof(contents));
+ parentalRating = 0;
+ startTime = 0;
+@@ -135,6 +136,7 @@
+ free(title);
+ free(shortText);
+ free(description);
++ free(aux);
+ delete components;
+ }
+
+@@ -235,6 +237,12 @@
+ seen = time(NULL);
+ }
+
++void cEvent::SetAux(const char *Aux)
++{
++ free(aux);
++ aux = Aux ? strdup(Aux) : NULL;
++}
++
+ cString cEvent::ToDescr(void) const
+ {
+ char vpsbuf[64] = "";
+@@ -458,6 +466,11 @@
+ }
+ if (vps)
+ fprintf(f, "%sV %ld\n", Prefix, vps);
++ if (!isempty(aux)) {
++ strreplace(aux, '\n', '|');
++ fprintf(f, "%s@ %s\n", Prefix, aux);
++ strreplace(aux, '|', '\n');
++ }
+ if (!InfoOnly)
+ fprintf(f, "%se\n", Prefix);
+ }
+@@ -496,6 +509,9 @@
+ break;
+ case 'V': SetVps(atoi(t));
+ break;
++ case '@': strreplace(t, '|', '\n');
++ SetAux(t);
++ break;
+ default: esyslog("ERROR: unexpected tag while reading EPG data: %s", s);
+ return false;
+ }
+--- ../vdr-2.2.0.plain/epg.h 2013-08-23 12:50:05.000000000 +0200
++++ epg.h 2017-03-22 16:23:28.096287585 +0100
+@@ -87,6 +87,7 @@
+ int duration; // Duration of this event in seconds
+ time_t vps; // Video Programming Service timestamp (VPS, aka "Programme Identification Label", PIL)
+ time_t seen; // When this event was last seen in the data stream
++ char *aux;
+ public:
+ cEvent(tEventID EventID);
+ ~cEvent();
+@@ -109,6 +110,7 @@
+ time_t Vps(void) const { return vps; }
+ time_t Seen(void) const { return seen; }
+ bool SeenWithin(int Seconds) const { return time(NULL) - seen < Seconds; }
++ const char *Aux(void) const { return aux; }
+ bool HasTimer(void) const;
+ bool IsRunning(bool OrAboutToStart = false) const;
+ static const char *ContentToString(uchar Content);
+@@ -131,6 +133,7 @@
+ void SetDuration(int Duration);
+ void SetVps(time_t Vps);
+ void SetSeen(void);
++ void SetAux(const char *Aux);
+ cString ToDescr(void) const;
+ void Dump(FILE *f, const char *Prefix = "", bool InfoOnly = false) const;
+ bool Parse(char *s);
diff --git a/patches/vdr-2.3.1.patch b/patches/vdr-2.3.1.patch
deleted file mode 100644
index c37bb54..0000000
--- a/patches/vdr-2.3.1.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- ../vdr-2.3.2.plain/./epg.h 2015-08-09 13:25:04.000000000 +0200
-+++ ./epg.h 2017-02-08 14:42:26.304063928 +0100
-@@ -66,7 +66,7 @@
-
- class cSchedule;
-
--typedef u_int16_t tEventID;
-+typedef u_int32_t tEventID;
-
- class cEvent : public cListObject {
- friend class cSchedule;
diff --git a/patches/vdr-2.3.2-aux.patch b/patches/vdr-2.3.2-aux.patch
new file mode 100644
index 0000000..fd3fe26
--- /dev/null
+++ b/patches/vdr-2.3.2-aux.patch
@@ -0,0 +1,79 @@
+--- ../vdr-2.3.2.plain//epg.c 2015-09-10 12:58:19.000000000 +0200
++++ epg.c 2017-03-22 11:44:51.917258845 +0100
+@@ -124,6 +124,7 @@
+ shortText = NULL;
+ description = NULL;
+ components = NULL;
++ aux = NULL;
+ memset(contents, 0, sizeof(contents));
+ parentalRating = 0;
+ startTime = 0;
+@@ -137,6 +138,7 @@
+ free(title);
+ free(shortText);
+ free(description);
++ free(aux);
+ delete components;
+ }
+
+@@ -237,6 +239,12 @@
+ seen = time(NULL);
+ }
+
++void cEvent::SetAux(const char *Aux)
++{
++ free(aux);
++ aux = Aux ? strdup(Aux) : NULL;
++}
++
+ cString cEvent::ToDescr(void) const
+ {
+ char vpsbuf[64] = "";
+@@ -469,6 +477,11 @@
+ }
+ if (vps)
+ fprintf(f, "%sV %ld\n", Prefix, vps);
++ if (!isempty(aux)) {
++ strreplace(aux, '\n', '|');
++ fprintf(f, "%s@ %s\n", Prefix, aux);
++ strreplace(aux, '|', '\n');
++ }
+ if (!InfoOnly)
+ fprintf(f, "%se\n", Prefix);
+ }
+@@ -507,6 +520,9 @@
+ break;
+ case 'V': SetVps(atoi(t));
+ break;
++ case '@': strreplace(t, '|', '\n');
++ SetAux(t);
++ break;
+ default: esyslog("ERROR: unexpected tag while reading EPG data: %s", s);
+ return false;
+ }
+--- ../vdr-2.3.2.plain//epg.h 2015-08-09 13:25:04.000000000 +0200
++++ epg.h 2017-03-22 11:33:19.319728545 +0100
+@@ -89,6 +89,7 @@
+ int duration; // Duration of this event in seconds
+ time_t vps; // Video Programming Service timestamp (VPS, aka "Programme Identification Label", PIL)
+ time_t seen; // When this event was last seen in the data stream
++ char *aux;
+ public:
+ cEvent(tEventID EventID);
+ ~cEvent();
+@@ -111,6 +112,7 @@
+ time_t Vps(void) const { return vps; }
+ time_t Seen(void) const { return seen; }
+ bool SeenWithin(int Seconds) const { return time(NULL) - seen < Seconds; }
++ const char *Aux(void) const { return aux; }
+ void IncNumTimers(void) const;
+ void DecNumTimers(void) const;
+ bool HasTimer(void) const { return numTimers > 0; }
+@@ -135,6 +137,7 @@
+ void SetDuration(int Duration);
+ void SetVps(time_t Vps);
+ void SetSeen(void);
++ void SetAux(const char *Aux);
+ cString ToDescr(void) const;
+ void Dump(FILE *f, const char *Prefix = "", bool InfoOnly = false) const;
+ bool Parse(char *s);