diff options
-rw-r--r-- | HISTORY | 2 | ||||
-rw-r--r-- | HISTORY.DE | 2 | ||||
-rw-r--r-- | epgsearchext.c | 1 | ||||
-rw-r--r-- | epgsearchservices.h | 4 | ||||
-rw-r--r-- | menu_dirselect.c | 54 | ||||
-rw-r--r-- | menu_dirselect.h | 2 | ||||
-rw-r--r-- | searchtimer_thread.c | 9 | ||||
-rw-r--r-- | services.c | 14 | ||||
-rw-r--r-- | services.h | 18 |
9 files changed, 78 insertions, 28 deletions
@@ -17,6 +17,8 @@ new: - Two events with both empty episode names are now handled different within the feature 'Avoid repeats'. This will result in more recordings, but ensures not to miss one only because of a buggy EPG. +- searchtimers: if a timers filename results in an empty string or contains + "!^invalid^!" it will be skipped for programming now. fixes: - fixed a crash when pressing 'Ok' in an empty timers done menu - fixed a crash when using the progressbar and events with 0 duration exist, thanks @@ -18,6 +18,8 @@ neu: - Zwei Episoden mit leerem Untertitel innerhalb 'Vermeide Wiederholung' werden jetzt als unterschiedlich gewertet. Damit ergeben sich mehr Aufnahmen, aber es wird verhindert, dass man eine Folge nur wegen eines fehlerhaften EPGs verpasst. +- Suchtimer: Falls der Datei-Eintrag eines Timers leer ist oder "!^invalid^!" enthält, + wird er für die Programmierung übersprungen. fixes: - Absturz beim Drücken von 'Ok' in leerem Menü erledigter Timer behoben - Absturz bei Verwendung des Fortschrittsbalkens in Verbindung mit Sendungen diff --git a/epgsearchext.c b/epgsearchext.c index 7efd744..8564be7 100644 --- a/epgsearchext.c +++ b/epgsearchext.c @@ -119,6 +119,7 @@ cSearchExt::cSearchExt(void) useAsSearchTimerTil = 0; ignoreMissingEPGCats = 0; unmuteSoundOnSwitch = 0; + skipRunningEvents = false; } cSearchExt::~cSearchExt(void) diff --git a/epgsearchservices.h b/epgsearchservices.h index b31d5c8..4e26fb4 100644 --- a/epgsearchservices.h +++ b/epgsearchservices.h @@ -28,7 +28,7 @@ The project's page is at http://winni.vdr-developer.org/epgsearch #include <vdr/tools.h> #include "epgsearchext.h" -class cEpgsearchServiceHandler: public cServiceHandler_v1_1 +class cEpgsearchServiceHandler: public cServiceHandler_v1_2 { virtual std::list<std::string> TranslateResults(cSearchResults* pCompleteSearchResults); public: @@ -46,6 +46,8 @@ class cEpgsearchServiceHandler: public cServiceHandler_v1_1 virtual bool WriteSetupValue(const std::string& entry, const std::string& value); virtual std::list<std::string> TimerConflictList(bool relOnly=false); virtual bool IsConflictCheckAdvised(); + virtual std::set<std::string> ShortDirectoryList(); + virtual std::string Evaluate(const std::string& expr, const cEvent* event); }; #endif diff --git a/menu_dirselect.c b/menu_dirselect.c index 3da5d65..8a590f9 100644 --- a/menu_dirselect.c +++ b/menu_dirselect.c @@ -123,7 +123,7 @@ void cMenuDirSelect::AddDistinct(const char* szText) Add(new cMenuDirItem(hk(szText))); } -void cMenuDirSelect::CreateDirSet() +void cMenuDirSelect::CreateDirSet(bool extraDirs) { directorySet.clear(); @@ -172,30 +172,34 @@ void cMenuDirSelect::CreateDirSet() } free(dir); } - cMutexLock SearchExtsLock(&SearchExts); - cSearchExt *searchExt = SearchExts.First(); - // add distinct directories from existing search timers - while (searchExt) - { - if (strlen(searchExt->directory) > 0) - directorySet.insert(searchExt->directory); - searchExt = SearchExts.Next(searchExt); - } - // add distinct directories from epgsearchdirs.conf - DirExts.Load(AddDirectory(CONFIGDIR, "epgsearchdirs.conf"), true); - cDirExt* DirExt = DirExts.First(); - while (DirExt) - { - directorySet.insert(DirExt->Name()); - DirExt = DirExts.Next(DirExt); - } - // add distinct directories from conf.d files - DirExt = ConfDDirExts.First(); - while (DirExt) - { - directorySet.insert(DirExt->Name()); - DirExt = ConfDDirExts.Next(DirExt); - } + + if (extraDirs) + { + cMutexLock SearchExtsLock(&SearchExts); + cSearchExt *searchExt = SearchExts.First(); + // add distinct directories from existing search timers + while (searchExt) + { + if (strlen(searchExt->directory) > 0) + directorySet.insert(searchExt->directory); + searchExt = SearchExts.Next(searchExt); + } + // add distinct directories from epgsearchdirs.conf + DirExts.Load(AddDirectory(CONFIGDIR, "epgsearchdirs.conf"), true); + cDirExt* DirExt = DirExts.First(); + while (DirExt) + { + directorySet.insert(DirExt->Name()); + DirExt = DirExts.Next(DirExt); + } + // add distinct directories from conf.d files + DirExt = ConfDDirExts.First(); + while (DirExt) + { + directorySet.insert(DirExt->Name()); + DirExt = ConfDDirExts.Next(DirExt); + } + } } diff --git a/menu_dirselect.h b/menu_dirselect.h index 6aeb79f..2d6d116 100644 --- a/menu_dirselect.h +++ b/menu_dirselect.h @@ -67,7 +67,7 @@ private: int Level(const char* szDir); void ReplaceDirVars(); - static void CreateDirSet(); + static void CreateDirSet(bool extraDirs=true); }; #endif diff --git a/searchtimer_thread.c b/searchtimer_thread.c index d890bbd..eb20218 100644 --- a/searchtimer_thread.c +++ b/searchtimer_thread.c @@ -264,6 +264,15 @@ void cSearchTimerThread::Action(void) if ((file = searchExt->BuildFile(pEvent)) != NULL) { while(strstr(file, "!^pipe^!")) file = strreplace(file, "!^pipe^!", "|"); // revert the translation of '|' in BuildFile + if (strstr(file, "!^invalid^!") || strlen(file) == 0) + { + LogFile.eSysLog("Skipping timer due to invalid or empty filename"); + if (time(NULL) <= timer->StopTime()) + pOutdatedTimers->DelTimer(timer); + delete timer; + free(file); + continue; + } timer->SetFile(file); free(file); } @@ -36,6 +36,7 @@ The project's page is at http://winni.vdr-developer.org/epgsearch #include "epgsearchtools.h" #include "conflictcheck.h" #include "timerstatus.h" +#include "uservars.h" std::list<std::string> cEpgsearchServiceHandler::SearchTimerList() { @@ -322,3 +323,16 @@ bool cEpgsearchServiceHandler::IsConflictCheckAdvised() { return gl_timerStatusMonitor?gl_timerStatusMonitor->ConflictCheckAdvised():false; } + +std::set<std::string> cEpgsearchServiceHandler::ShortDirectoryList() +{ + cMenuDirSelect::CreateDirSet(false); + return cMenuDirSelect::directorySet; +} + +std::string cEpgsearchServiceHandler::Evaluate(const std::string& expr, const cEvent* event) +{ + if (!event) return expr; + cVarExpr varExpr(expr); + return varExpr.Evaluate(event); +} @@ -160,7 +160,7 @@ struct Epgsearch_services_v1_0 std::auto_ptr<cServiceHandler> handler; }; -// Data structures for service "Epgsearch-services-v1.0" +// Data structures for service "Epgsearch-services-v1.1" class cServiceHandler_v1_1 : public cServiceHandler { public: @@ -176,4 +176,20 @@ struct Epgsearch_services_v1_1 std::auto_ptr<cServiceHandler_v1_1> handler; }; +// Data structures for service "Epgsearch-services-v1.2" +class cServiceHandler_v1_2 : public cServiceHandler_v1_1 +{ + public: + // List of all recording directories used in recordings, timers (and optionally search timers or in epgsearchdirs.conf) + virtual std::set<std::string> ShortDirectoryList() = 0; + // Evaluate an expression against an event + virtual std::string Evaluate(const std::string& expr, const cEvent* event) = 0; +}; + +struct Epgsearch_services_v1_2 +{ +// in/out + std::auto_ptr<cServiceHandler_v1_2> handler; +}; + #endif |