Hallo zusammen,
da sich der Autor der repeating-epg-Patches geweigert hat, den Patch für 1.3.4 anzupassen, habe ich das selbst erledigt. Bei mir funktioniert das einwandfrei. Leider habe ich vom Programmieren nur sehr wenig Schimmer und noch dazu ist das mein erstes Diff, das ich erstellt habe, aber ich hoffe der funktioniert auch für euch.
Der Patch basiert auf dem repeating-epg-0.4.1.
Salaam
ps.: Vieleicht kann einer der MODs den Patch in den Downloadbereich stellen
Diff
diff -urN vdr-1.3.4.ori/epg.c vdr-1.3.4/epg.c
--- vdr-1.3.4.ori/epg.c 2004-02-21 13:56:34.000000000 +0100
+++ vdr-1.3.4/epg.c 2004-02-21 14:05:37.000000000 +0100
@@ -731,4 +731,33 @@
}
return NULL;
}
+/* by Steiner */
+const cEvent * cSchedule::GetEventByTitle(const char *p2, const cEvent *Start) const
+{
+ if(!p2) return NULL;
+
+ const cEvent *pe = NULL;
+ cEvent *p1=events.First();
+// first we have to search for the Start item
+ if(Start) {
+ cEvent *p;
+ for (p = events.First(); p && p!=Start; p = events.Next(p));
+ if(p)
+ p1=events.Next(p);
+ }
+
+ time_t tNow=time(NULL);
+ for (cEvent *p = p1; p; p = events.Next(p)) {
+ if(!p) {
+ break;
+ }
+ if (tNow < (p->StartTime() + p->Duration())) {
+ if(p->Title() && !strcasecmp(p2, p->Title())) {
+ pe=p;
+ break;
+ }
+ }
+ }
+ return pe;
+}
diff -urN vdr-1.3.4.ori/epg.h vdr-1.3.4/epg.h
--- vdr-1.3.4.ori/epg.h 2004-02-21 13:56:34.000000000 +0100
+++ vdr-1.3.4/epg.h 2004-02-21 13:59:39.000000000 +0100
@@ -96,6 +96,7 @@
const cEvent *GetEventAround(time_t Time) const;
const cEvent *GetPreviousEvent(cEvent *Event) const; //:EW
const cEvent *GetEventNumber(int n) const { return events.Get(n); }
+ const cEvent *GetEventByTitle(const char *p2, const cEvent *Start=NULL) const;
int NumEvents(void) const { return events.Count(); }
void Dump(FILE *f, const char *Prefix = "") const;
static bool Read(FILE *f, cSchedules *Schedules);
diff -urN vdr-1.3.4.ori/i18n.c vdr-1.3.4/i18n.c
--- vdr-1.3.4.ori/i18n.c 2004-02-21 13:56:35.000000000 +0100
+++ vdr-1.3.4/i18n.c 2004-02-21 13:57:09.000000000 +0100
@@ -4226,6 +4226,74 @@
"Pausa d'emissió en directe...",
"ÀÕÖØÜ ÞâÛÞÖÕÝÝÞÓÞ ßàÞáÜÞâàÐ...",
},
+ { "additional starting times",
+ "zusätzliche Startzeiten",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ },
+ { "by Channel",
+ "nach Programm",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ },
+ { "by Time",
+ "nach Beginn",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ },
+ { "Search",
+ "Suchen",
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ "",// TODO
+ },
{ "This plugin has no setup parameters!",
"Dieses Plugin hat keine Setup-Parameter!",
"Ta plugin nima nastavitvenih parametrov!",
diff -urN vdr-1.3.4.ori/menu.c vdr-1.3.4/menu.c
--- vdr-1.3.4.ori/menu.c 2004-02-21 13:56:35.000000000 +0100
+++ vdr-1.3.4/menu.c 2004-02-21 14:35:22.000000000 +0100
@@ -1189,6 +1189,28 @@
return state;
}
+// --- cMenuWhatsOnEPG -------------------------------------------------------
+
+class cMenuWhatsOnEPG : public cOsdMenu {
+private:
+ bool BuildList(void);
+ virtual eOSState ProcessKey(eKeys Key);
+ eOSState Search(void);
+ eOSState Summary(void);
+ eOSState Record(void);
+ void SetHelpKeys(void);
+ eOSState Switch(void);
+
+ static const cEvent *scheduleEvent;
+ static int currentChannel;
+public:
+ char *m_pSearchString;
+ bool m_bSort;
+public:
+ cMenuWhatsOnEPG(const char *p2);
+ ~cMenuWhatsOnEPG() {free(m_pSearchString);}
+ };
+
// --- cMenuWhatsOnItem ------------------------------------------------------
class cMenuWhatsOnItem : public cOsdItem {
@@ -1373,6 +1395,15 @@
case kOk: if (Count())
return AddSubMenu(new cMenuEvent(((cMenuWhatsOnItem *)Get(Current()))->event, true));
break;
+ case k0: if (Count()) {
+ cMenuWhatsOnItem *mi = (cMenuWhatsOnItem *)Get(Current());
+ if (mi) {
+ if (mi->event) {
+ return AddSubMenu(new cMenuWhatsOnEPG(mi->event->Title()));
+ }
+ }
+ }
+ break;
default: break;
}
}
@@ -1527,6 +1558,9 @@
case kOk: if (Count())
return AddSubMenu(new cMenuEvent(((cMenuScheduleItem *)Get(Current()))->event, otherChannel));
break;
+ case k0: if (Count())
+ return AddSubMenu(new cMenuWhatsOnEPG(((cMenuScheduleItem *)Get(Current()))->event->Title()));
+ break;
default: break;
}
}
@@ -4525,3 +4559,147 @@
return osContinue;
}
+// --- cMenuWhatsOnEPGItem ------------------------------------------------------
+class cMenuWhatsOnEPGItem : public cOsdItem {
+public:
+ const cEvent *event;
+ cMenuWhatsOnEPGItem(const cEvent *Event);
+};
+
+cMenuWhatsOnEPGItem::cMenuWhatsOnEPGItem(const cEvent *Event)
+{
+ event = Event;
+ char *buffer = NULL;
+ cChannel *channel = Channels.GetByNumber(event->ChannelNumber());
+ if(event->ShortText())
+ asprintf(&buffer, "%.*s\t%.*s\t%.*s\t%s~%s", 10, channel ? channel->Name() : "???",
+ 5, event->GetDateString(), 5, event->GetTimeString(), event->Title(), event->ShortText());
+ else
+ asprintf(&buffer, "%.*s\t%.*s\t%.*s\t%s", 10, channel ? channel->Name() : "???",
+ 5, event->GetDateString(), 5, event->GetTimeString(), event->Title());
+ SetText(buffer, false);
+}
+
+// --- cMenuWhatsOnEPG -------------------------------------------------------
+
+const cEvent *cMenuWhatsOnEPG::scheduleEvent = NULL;
+int cMenuWhatsOnEPG::currentChannel = 0;
+
+cMenuWhatsOnEPG::cMenuWhatsOnEPG(const char *p2)
+:cOsdMenu(tr("additional starting times"), 12, 6, 6)
+{
+ asprintf(&m_pSearchString, "%s", p2);
+
+ m_bSort = true;
+
+ BuildList();
+}
+
+bool cMenuWhatsOnEPG::BuildList(void)
+{
+ cSchedulesLock schedulesLock;
+ const cSchedules *schedules = cSchedules::Schedules(schedulesLock);
+ if(!schedules) {
+ esyslog("cMenuWhatsOnEPG::BuildList scheduler is empty!");
+ return false;
+ }
+ const cSchedule *Schedule = schedules->First();
+ const cEvent **pArray = NULL;
+ const cEvent *pPrevEvent = NULL;
+ int num = 0;
+
+ Clear();
+ while (Schedule) {
+ pArray = (const cEvent **)realloc(pArray, (num + 1) * sizeof(cEvent *));
+ pPrevEvent = NULL;
+ do {
+ pArray[num] = Schedule->GetEventByTitle(m_pSearchString, pPrevEvent);
+ pPrevEvent = pArray[num];
+ if (pArray[num]) {
+ cChannel *channel = Channels.GetByChannelID(pArray[num]->ChannelID(), true);
+ if (channel) {
+ pArray[num]->SetChannelNumber(channel->Number());
+ num++;
+ pArray = (const cEvent **)realloc(pArray, (num + 1) * sizeof(cEvent *));
+ }
+ }
+ } while(pPrevEvent);
+ Schedule = (const cSchedule *)schedules->Next(Schedule);
+ }
+
+ qsort(pArray, num, sizeof(cEvent *), m_bSort? CompareEventTime: CompareEventChannel);
+
+ for (int a = 0; a < num; a++)
+ Add(new cMenuWhatsOnEPGItem(pArray[a]));
+
+ delete pArray;
+
+// SetHelp(tr("Record"), m_bSort? tr("by Channel"):tr("by Time"), tr("Button$Schedule"), CanSwitch ? tr("Switch"): NULL);
+ SetHelp(tr("Record"), m_bSort? tr("by Channel"):tr("by Time"), NULL, NULL);
+ Display();
+ return true;
+}
+
+eOSState cMenuWhatsOnEPG::Record(void)
+{
+ cMenuWhatsOnEPGItem *item = (cMenuWhatsOnEPGItem *)Get(Current());
+ if (item) {
+ cTimer *timer = new cTimer(item->event);
+ cTimer *t = Timers.GetTimer(timer);
+ if (t) {
+ delete timer;
+ timer = t;
+ }
+ return AddSubMenu(new cMenuEditTimer(timer, !t));
+ }
+ return osContinue;
+}
+
+eOSState cMenuWhatsOnEPG::Search(void)
+{
+ return osContinue;
+}
+
+
+eOSState cMenuWhatsOnEPG::Switch(void)
+{
+ cMenuWhatsOnItem *item = (cMenuWhatsOnItem *)Get(Current());
+ if (item) {
+ cChannel *channel = Channels.GetByChannelID(item->event->ChannelID(), true);
+ if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true))
+ return osEnd;
+ }
+ Interface->Error(tr("Can't switch channel!"));
+ return osContinue;
+}
+
+eOSState cMenuWhatsOnEPG::ProcessKey(eKeys Key)
+{
+ eOSState state = osContinue;
+
+ switch (Key) {
+ case kRecord:
+ case kRed: return Record();
+ case k0: state=osBack; break;
+ case kGreen: {
+ m_bSort=!m_bSort;
+ BuildList();
+ }
+ break;
+ case kYellow: break; //return Switch();
+ case kBlue: break; //return Search();
+ case kOk: if(HasSubMenu()) {
+ state = cOsdMenu::ProcessKey(Key);
+ break;
+ }
+ if (Count())
+ return AddSubMenu(new cMenuEvent(((cMenuWhatsOnEPGItem *)Get(Current()))->event, 0));
+ break;
+ default:
+ state = cOsdMenu::ProcessKey(Key);
+ }
+ return state;
+}
+
Alles anzeigen