mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Avoiding multiple EPG entries for the same event
This commit is contained in:
parent
d64416b922
commit
fee4982077
2
HISTORY
2
HISTORY
@ -845,3 +845,5 @@ Video Disk Recorder Revision History
|
|||||||
- Changed the tuning code to use FrontendInfo to detect the type of DVB card.
|
- Changed the tuning code to use FrontendInfo to detect the type of DVB card.
|
||||||
- Removed the recursion stuff from cThread (cMutex already does this).
|
- Removed the recursion stuff from cThread (cMutex already does this).
|
||||||
- Fixed handling the repeat function in the channel display.
|
- Fixed handling the repeat function in the channel display.
|
||||||
|
- Avoiding multiple EPG entries for the same event (thanks to Rolf Hakenes
|
||||||
|
for some valuable information on how to do this).
|
||||||
|
37
eit.c
37
eit.c
@ -16,7 +16,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: eit.c 1.28 2001/10/19 13:13:25 kls Exp $
|
* $Id: eit.c 1.29 2001/10/28 13:51:22 kls Exp $
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
@ -189,6 +189,7 @@ cEventInfo::cEventInfo(unsigned short serviceid, unsigned short eventid)
|
|||||||
bIsPresent = bIsFollowing = false;
|
bIsPresent = bIsFollowing = false;
|
||||||
lDuration = 0;
|
lDuration = 0;
|
||||||
tTime = 0;
|
tTime = 0;
|
||||||
|
uTableID = 0;
|
||||||
uEventID = eventid;
|
uEventID = eventid;
|
||||||
uServiceID = serviceid;
|
uServiceID = serviceid;
|
||||||
nChannelNumber = 0;
|
nChannelNumber = 0;
|
||||||
@ -231,6 +232,12 @@ bool cEventInfo::IsFollowing() const
|
|||||||
{
|
{
|
||||||
return bIsFollowing;
|
return bIsFollowing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cEventInfo::SetTableID(unsigned char tableid)
|
||||||
|
{
|
||||||
|
uTableID = tableid;
|
||||||
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
void cEventInfo::SetFollowing(bool foll)
|
void cEventInfo::SetFollowing(bool foll)
|
||||||
{
|
{
|
||||||
@ -246,6 +253,12 @@ const char * cEventInfo::GetDate() const
|
|||||||
|
|
||||||
return szDate;
|
return szDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const unsigned char cEventInfo::GetTableID(void) const
|
||||||
|
{
|
||||||
|
return uTableID;
|
||||||
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
const char * cEventInfo::GetTimeString() const
|
const char * cEventInfo::GetTimeString() const
|
||||||
{
|
{
|
||||||
@ -545,21 +558,26 @@ unsigned short cSchedule::GetServiceID() const
|
|||||||
return uServiceID;
|
return uServiceID;
|
||||||
}
|
}
|
||||||
/** */
|
/** */
|
||||||
const cEventInfo * cSchedule::GetEvent(unsigned short uEventID) const
|
const cEventInfo * cSchedule::GetEvent(unsigned short uEventID, time_t tTime) const
|
||||||
{
|
{
|
||||||
|
// Returns either the event info with the given uEventID or, if that one can't
|
||||||
|
// be found, the one with the given tTime (or NULL if neither can be found)
|
||||||
cEventInfo *pe = Events.First();
|
cEventInfo *pe = Events.First();
|
||||||
|
cEventInfo *pt = NULL;
|
||||||
while (pe != NULL)
|
while (pe != NULL)
|
||||||
{
|
{
|
||||||
if (pe->GetEventID() == uEventID)
|
if (pe->GetEventID() == uEventID)
|
||||||
return pe;
|
return pe;
|
||||||
|
if (tTime > 0 && pe->GetTime() == tTime) // 'tTime < 0' is apparently used with NVOD channels
|
||||||
|
pt = pe;
|
||||||
|
|
||||||
pe = Events.Next(pe);
|
pe = Events.Next(pe);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return pt;
|
||||||
}
|
}
|
||||||
/** */
|
/** */
|
||||||
const cEventInfo * cSchedule::GetEvent(time_t tTime) const
|
const cEventInfo * cSchedule::GetEventAround(time_t tTime) const
|
||||||
{
|
{
|
||||||
cEventInfo *pe = Events.First();
|
cEventInfo *pe = Events.First();
|
||||||
while (pe != NULL)
|
while (pe != NULL)
|
||||||
@ -759,7 +777,7 @@ int cEIT::ProcessEIT(unsigned char *buffer)
|
|||||||
if (!rEvent)
|
if (!rEvent)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pEvent = (cEventInfo *)pSchedule->GetEvent((unsigned short)VdrProgramInfo->EventID);
|
pEvent = (cEventInfo *)pSchedule->GetEvent((unsigned short)VdrProgramInfo->EventID, VdrProgramInfo->StartTime);
|
||||||
if (!pEvent) {
|
if (!pEvent) {
|
||||||
// If we don't have that event ID yet, we create a new one.
|
// If we don't have that event ID yet, we create a new one.
|
||||||
// Otherwise we copy the information into the existing event anyway, because the data might have changed.
|
// Otherwise we copy the information into the existing event anyway, because the data might have changed.
|
||||||
@ -767,6 +785,14 @@ int cEIT::ProcessEIT(unsigned char *buffer)
|
|||||||
pEvent = (cEventInfo *)pSchedule->GetEvent((unsigned short)VdrProgramInfo->EventID);
|
pEvent = (cEventInfo *)pSchedule->GetEvent((unsigned short)VdrProgramInfo->EventID);
|
||||||
if (!pEvent)
|
if (!pEvent)
|
||||||
break;
|
break;
|
||||||
|
pEvent->SetTableID(tid);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// We have found an existing event, either through its event ID or its start time.
|
||||||
|
// If the new event comes from a table that belongs to an "other TS" and the existing
|
||||||
|
// one comes from a "actual TS" table, lets skip it.
|
||||||
|
if ((tid == 0x4F || tid == 0x60) && (pEvent->GetTableID() == 0x4E || pEvent->GetTableID() == 0x50))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (rEvent) {
|
if (rEvent) {
|
||||||
pEvent->SetTitle(rEvent->GetTitle());
|
pEvent->SetTitle(rEvent->GetTitle());
|
||||||
@ -774,6 +800,7 @@ int cEIT::ProcessEIT(unsigned char *buffer)
|
|||||||
pEvent->SetExtendedDescription(rEvent->GetExtendedDescription());
|
pEvent->SetExtendedDescription(rEvent->GetExtendedDescription());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
pEvent->SetTableID(tid);
|
||||||
pEvent->SetTitle(VdrProgramInfo->ShortName);
|
pEvent->SetTitle(VdrProgramInfo->ShortName);
|
||||||
pEvent->SetSubtitle(VdrProgramInfo->ShortText);
|
pEvent->SetSubtitle(VdrProgramInfo->ShortText);
|
||||||
pEvent->SetExtendedDescription(VdrProgramInfo->ExtendedName);
|
pEvent->SetExtendedDescription(VdrProgramInfo->ExtendedName);
|
||||||
|
9
eit.h
9
eit.h
@ -16,7 +16,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: eit.h 1.11 2001/09/22 11:43:21 kls Exp $
|
* $Id: eit.h 1.12 2001/10/28 12:33:10 kls Exp $
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifndef __EIT_H
|
#ifndef __EIT_H
|
||||||
@ -29,6 +29,7 @@ class cEventInfo : public cListObject {
|
|||||||
friend class cSchedule;
|
friend class cSchedule;
|
||||||
friend class cEIT;
|
friend class cEIT;
|
||||||
private:
|
private:
|
||||||
|
unsigned char uTableID; // Table ID this event came from
|
||||||
unsigned short uServiceID; // Service ID of program for that event
|
unsigned short uServiceID; // Service ID of program for that event
|
||||||
bool bIsFollowing; // true if this is the next event on this channel
|
bool bIsFollowing; // true if this is the next event on this channel
|
||||||
bool bIsPresent; // true if this is the present event running
|
bool bIsPresent; // true if this is the present event running
|
||||||
@ -40,6 +41,7 @@ private:
|
|||||||
time_t tTime; // Start time
|
time_t tTime; // Start time
|
||||||
int nChannelNumber; // the actual channel number from VDR's channel list (used in cMenuSchedule for sorting by channel number)
|
int nChannelNumber; // the actual channel number from VDR's channel list (used in cMenuSchedule for sorting by channel number)
|
||||||
protected:
|
protected:
|
||||||
|
void SetTableID(unsigned char tableid);
|
||||||
void SetFollowing(bool foll);
|
void SetFollowing(bool foll);
|
||||||
void SetPresent(bool pres);
|
void SetPresent(bool pres);
|
||||||
void SetTitle(const char *string);
|
void SetTitle(const char *string);
|
||||||
@ -52,6 +54,7 @@ protected:
|
|||||||
cEventInfo(unsigned short serviceid, unsigned short eventid);
|
cEventInfo(unsigned short serviceid, unsigned short eventid);
|
||||||
public:
|
public:
|
||||||
~cEventInfo();
|
~cEventInfo();
|
||||||
|
const unsigned char GetTableID(void) const;
|
||||||
const char *GetTimeString(void) const;
|
const char *GetTimeString(void) const;
|
||||||
const char *GetEndTimeString(void) const;
|
const char *GetEndTimeString(void) const;
|
||||||
const char *GetDate(void) const;
|
const char *GetDate(void) const;
|
||||||
@ -90,8 +93,8 @@ public:
|
|||||||
const cEventInfo *GetPresentEvent(void) const;
|
const cEventInfo *GetPresentEvent(void) const;
|
||||||
const cEventInfo *GetFollowingEvent(void) const;
|
const cEventInfo *GetFollowingEvent(void) const;
|
||||||
unsigned short GetServiceID(void) const;
|
unsigned short GetServiceID(void) const;
|
||||||
const cEventInfo *GetEvent(unsigned short uEventID) const;
|
const cEventInfo *GetEvent(unsigned short uEventID, time_t tTime = 0) const;
|
||||||
const cEventInfo *GetEvent(time_t tTime) const;
|
const cEventInfo *GetEventAround(time_t tTime) const;
|
||||||
const cEventInfo *GetEventNumber(int n) const { return Events.Get(n); }
|
const cEventInfo *GetEventNumber(int n) const { return Events.Get(n); }
|
||||||
int NumEvents(void) const { return Events.Count(); }
|
int NumEvents(void) const { return Events.Count(); }
|
||||||
void Dump(FILE *f, const char *Prefix = "") const;
|
void Dump(FILE *f, const char *Prefix = "") const;
|
||||||
|
4
menu.c
4
menu.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: menu.c 1.135 2001/10/28 10:04:50 kls Exp $
|
* $Id: menu.c 1.136 2001/10/28 12:00:16 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -2170,7 +2170,7 @@ bool cRecordControl::GetEventInfo(void)
|
|||||||
if (Schedules) {
|
if (Schedules) {
|
||||||
const cSchedule *Schedule = Schedules->GetSchedule(channel->pnr);
|
const cSchedule *Schedule = Schedules->GetSchedule(channel->pnr);
|
||||||
if (Schedule) {
|
if (Schedule) {
|
||||||
eventInfo = Schedule->GetEvent(Time);
|
eventInfo = Schedule->GetEventAround(Time);
|
||||||
if (eventInfo) {
|
if (eventInfo) {
|
||||||
if (seconds > 0)
|
if (seconds > 0)
|
||||||
dsyslog(LOG_INFO, "got EPG info after %d seconds", seconds);
|
dsyslog(LOG_INFO, "got EPG info after %d seconds", seconds);
|
||||||
|
Loading…
Reference in New Issue
Block a user