vdr-plugin-epgsearch/0000755000175000017500000000000012466747543014452 5ustar tobiastobiasvdr-plugin-epgsearch/mail.h0000644000175000017500000001001312466747543015540 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCH_MAIL_H #define __EPGSEARCH_MAIL_H #include #include #include #include #include "conflictcheck.h" using std::string; using std::set; // --- cMailNotifier -------------------------------------------------------- class cMailNotifier { protected: string subject; string body; bool SendMailViaSendmail(); bool SendMailViaScript(); bool SendMail(bool force=false); bool ExecuteMailScript(string ScriptArgs); public: string scriptReply; cMailNotifier() {} cMailNotifier(string Subject, string Body); bool TestMailAccount(string MailAddressTo, string MailAddress, string MailServer, string AuthUser, string AuthPass); static string LoadTemplate(const string& templtype); static string GetTemplValue(const string& templ, const string& entry); static string MailCmd; }; class cMailTimerNotification { friend class cMailUpdateNotifier; tEventID eventID; tChannelID channelID; uint timerMod; protected: virtual const cEvent* GetEvent() const; public: cMailTimerNotification(tEventID EventID, tChannelID ChannelID, uint TimerMod = tmNoChange) : eventID(EventID), channelID(ChannelID), timerMod(TimerMod) {} virtual bool operator< (const cMailTimerNotification &N) const; virtual string Format(const string& templ) const; }; class cMailDelTimerNotification { friend class cMailUpdateNotifier; time_t start; tChannelID channelID; public: string formatted; cMailDelTimerNotification(cTimer* t, const cEvent* pEvent, const string& templ); cMailDelTimerNotification(const string& Formatted, tChannelID ChannelID, time_t Start); bool operator< (const cMailDelTimerNotification &N) const; string Format(const string& templ) const { return formatted; } }; class cMailAnnounceEventNotification : public cMailTimerNotification { friend class cMailUpdateNotifier; int searchextID; public: cMailAnnounceEventNotification(tEventID EventID, tChannelID ChannelID, int SearchExtID) : cMailTimerNotification(EventID, ChannelID), searchextID(SearchExtID) {} string Format(const string& templ) const; }; class cMailUpdateNotifier : public cMailNotifier { set newTimers; set modTimers; set delTimers; set announceEvents; string mailTemplate; public: cMailUpdateNotifier(); void AddNewTimerNotification(tEventID EventID, tChannelID ChannelID); void AddModTimerNotification(tEventID EventID, tChannelID ChannelID, uint timerMod = tmNoChange); void AddRemoveTimerNotification(cTimer* t, const cEvent* e = NULL); void AddRemoveTimerNotification(const string& Formatted, tChannelID ChannelID, time_t Start); void AddAnnounceEventNotification(tEventID EventID, tChannelID ChannelID, int SearchExtID); void SendUpdateNotifications(); }; class cMailConflictNotifier : public cMailNotifier { public: void SendConflictNotifications(cConflictCheck& conflictcheck); }; #endif vdr-plugin-epgsearch/varparser.c0000644000175000017500000001460412466747543016630 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include "varparser.h" #include #include "log.h" #include "epgsearchtools.h" #include bool cVarParser::Parse(const string& input) { return ParseAssign(input); } bool cVarParser::ParseAssign(const string& input) { int assignPos = input.find("="); if (assignPos >= 0) { string var(input.begin(), input.begin() + assignPos); if (ParseVar(var)) { varName = Strip(var); string assign(input.begin() + assignPos + 1, input.end()); return ParseExp(assign); } } LogFile.eSysLog("error parsing '%s'", input.c_str()); return false; } bool cVarParser::ParseExp(const string& input) { // system call? int sysPos = input.find("system"); if (sysPos == 0) return ParseShellCmd(input); // connect command? int conPos = input.find("connect"); if (conPos == 0) return ParseConnectCmd(input); // length command? int lenPos = input.find("length"); if (lenPos == 0) return ParseLengthCmd(input); // conditional expression? int varPos = Strip(input).find("%"); if (varPos == 0) { int queryPos = input.find("?"); if (queryPos >= 0) { int colonPos = input.find(":"); if (colonPos > queryPos) return ParseCondExp(input); } } // composed expression compExpr = input; return true; } bool cVarParser::ParseShellCmd(const string& input) { int cmdPos = input.find("("); int cmdArgsBegin = input.find(","); int cmdArgsEnd = input.rfind(")"); if (cmdPos == -1 || cmdArgsEnd == -1) return false; string shellcmd(input.begin() + cmdPos + 1, input.begin() + (cmdArgsBegin >= 0?cmdArgsBegin:cmdArgsEnd)); shellcmd = Strip(shellcmd); cmdArgs = ""; if (cmdArgsBegin >= 0) cmdArgs = string(input.begin() + cmdArgsBegin + 1, input.begin() + cmdArgsEnd); string cmdVDR = "varcmd: " + shellcmd; cmd = new cCommand; if (!cmd->Parse(cmdVDR.c_str())) { LogFile.eSysLog("error parsing command: %s", input.c_str()); delete cmd; cmd = NULL; return false; } type = cVarParser::shellcmd; return true; } bool cVarParser::ParseConnectCmd(const string& input) { int startCon = input.find("("); int endCon = input.find(")"); if (startCon == -1 || endCon == -1) return false; string connect(input.begin() + startCon + 1, input.begin() + endCon); std::stringstream ss(connect); std::string item; if (std::getline(ss, item, ',')) connectAddr = item; if (std::getline(ss, item, ',')) connectPort = atoi(item.c_str()); if (std::getline(ss, item)) cmdArgs = item; connectAddr = Strip(connectAddr); cmdArgs = Strip(cmdArgs); if (connectAddr.size() == 0 || connectPort == -1) { LogFile.eSysLog("error parsing command: %s", input.c_str()); return false; } type = cVarParser::connectcmd; return true; } bool cVarParser::ParseLengthCmd(const string& input) { int startLen = input.find("("); int endLen = input.find(")"); if (startLen == -1 || endLen == -1) return false; string arg(input.begin() + startLen + 1, input.begin() + endLen); compExpr = arg; type = cVarParser::lengthcmd; return true; } bool cVarParser::ParseCondExp(const string& input) { int condEndPos = input.find("?"); string cond(input.begin(), input.begin() + condEndPos); int condNeqPos = cond.find("!="); int condEqPos = cond.find("=="); if (condEqPos == -1 && condNeqPos == -1) { cond += "!="; condNeqPos = cond.find("!="); } if (condEqPos >= 0 || condNeqPos >= 0) { if (!ParseEquality(cond)) { LogFile.eSysLog("error parsing '%s'", input.c_str()); return false; } condOp = (condEqPos >= 0)?condEq:condNeq; } else { LogFile.eSysLog("error parsing '%s'", input.c_str()); return false; } string truefalse(input.begin() + condEndPos + 1, input.end()); int elsePos = truefalse.find(":"); if (elsePos >= 0) { string truePart(truefalse.begin(), truefalse.begin() + elsePos); string falsePart(truefalse.begin() + elsePos + 1, truefalse.end()); if (ParseVar(truePart) && ParseVar(falsePart)) { condvarTrue = Strip(truePart); condvarFalse = Strip(falsePart); type = cVarParser::condition; return true; } } LogFile.eSysLog("error parsing '%s'", input.c_str()); condEqLeft = condEqRight = ""; return false; } bool cVarParser::ParseEquality(const string& input) { int condEqPos = input.find("=="); int condNeqPos = input.find("!="); int condOpPos = -1; if (condEqPos >= 0) condOpPos = condEqPos; if (condNeqPos >= 0) condOpPos = condNeqPos; if (condOpPos == -1) return false; string left(input.begin(), input.begin() + condOpPos); string right(input.begin() + condOpPos + 2, input.end()); if (ParseExp(left) && ParseExp(right)) { condEqLeft = Strip(left); condEqRight = Strip(right); return true; } return false; } bool cVarParser::ParseVar(const string& input) { string str = Strip(input); if (str.size() > 2 && str[0] == '%' && str[str.size()-1] == '%') return true; return false; } bool cVarParser::IsCondExpr() { return type == cVarParser::condition; } bool cVarParser::IsShellCmd() { return type == cVarParser::shellcmd; } bool cVarParser::IsConnectCmd() { return type == cVarParser::connectcmd; } bool cVarParser::IsLengthCmd() { return type == cVarParser::lengthcmd; } vdr-plugin-epgsearch/main.c0000644000175000017500000000335112466747543015544 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ // The functions contained in this file are pretty dummy // and are included only as a placeholder. Nevertheless, // they *will* get included in the static library if you // don't remove them :) // // Obviously, you 'll have to write yourself the super-duper // functions to include in the resulting library... // Also, it's not necessary to write every function in this file. // Feel free to add more files in this project. They will be // included in the resulting library. // A function adding two integers and returning the result int SampleAddInt(int i1, int i2) { return i1 + i2; } // A function doing nothing ;) void SampleFunction1() { // insert code here } // A function always returning zero int SampleFunction2() { // insert code here return 0; } vdr-plugin-epgsearch/varparser.h0000644000175000017500000000427012466747543016633 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __VAR_PARSER_INC__ #define __VAR_PARSER_INC__ #include #include #include #include "epgsearchtools.h" using std::string; using std::vector; typedef enum { condEq = 0, condNeq } condOperator; class cVarParser { typedef enum { composed=0, condition, shellcmd, connectcmd, lengthcmd } exprType; public: string varName; string condEqLeft; string condEqRight; condOperator condOp; string condvarTrue; string condvarFalse; string compExpr; cCommand* cmd; string cmdArgs; string connectAddr; int connectPort; exprType type; cVarParser() : cmd(NULL), connectPort(-1), type(composed) { condOp=condEq; } bool Parse(const string& input); bool ParseExp(const string& input); bool IsCondExpr(); bool IsShellCmd(); bool IsConnectCmd(); bool IsLengthCmd(); private: bool ParseAssign(const string& input); bool ParseShellCmd(const string& input); bool ParseConnectCmd(const string& input); bool ParseLengthCmd(const string& input); bool ParseCondExp(const string& input); bool ParseEquality(const string& input); bool ParseVar(const string& input); }; #endif vdr-plugin-epgsearch/menu_commands.c0000644000175000017500000002313012466747543017442 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "menu_commands.h" #include #include #include #include "menu_searchresults.h" #include "menu_myedittimer.h" #include "menu_search.h" #include "menu_searchedit.h" #include "epgsearchcfg.h" #include "recdone.h" #include "epgsearchtools.h" #include "switchtimer.h" #include "switchtimer_thread.h" #include "blacklist.h" #include "menu_blacklistedit.h" #include #include "menu_deftimercheckmethod.h" // --- cMenuSearchCommands --------------------------------------------------------- cMenuSearchCommands::cMenuSearchCommands(const char *Title, const cEvent* Event, bool DirectCall, cSearchExt* Search) :cOsdMenu(Title) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcCommand); #endif directCall = DirectCall; SetHasHotkeys(); LoadCommands(); search = Search; event = Event; Add(new cOsdItem(hk(tr("Repeats")))); Add(new cOsdItem(hk(trVDR("Button$Record")))); Add(new cOsdItem(hk(trVDR("Button$Switch")))); Add(new cOsdItem(hk(tr("Create search")))); Add(new cOsdItem(hk(tr("Search in recordings")))); Add(new cOsdItem(hk(tr("Mark as 'already recorded'?")))); Add(new cOsdItem(hk(tr("Add/Remove to/from switch list?")))); Add(new cOsdItem(hk(tr("Create blacklist")))); for (cCommand *command = commands.First(); command; command = commands.Next(command)) Add(new cOsdItem(hk(command->Title()))); if (event) { cString szTitle = cString::sprintf("%s: %s", tr("EPG Commands"), event->Title()); SetTitle(szTitle); } } cMenuSearchCommands::~cMenuSearchCommands() { } void cMenuSearchCommands::LoadCommands() { const char* szLanguageCode = I18nLanguageCode(I18nCurrentLanguage()); char *pstrSearchToken, *pptr; char *pstrSearch=strdup(szLanguageCode); pstrSearchToken=strtok_r(pstrSearch, ",", &pptr); bool bLoaded = false; while(pstrSearchToken) // may contain multiple code, e.g. 'ger,deu' { cString cmdFile = cString::sprintf("%s-%s.conf", ADDDIR(CONFIGDIR, "epgsearchcmds"), pstrSearchToken); if (access(cmdFile, F_OK) == 0) { commands.Load(cmdFile, true); bLoaded = true; break; } pstrSearchToken=strtok_r(NULL, ",", &pptr); } if (!bLoaded) commands.Load(AddDirectory(CONFIGDIR, "epgsearchcmds.conf"), true); free(pstrSearch); } eOSState cMenuSearchCommands::Switch(void) { cChannel *channel = Channels.GetByChannelID(event->ChannelID(), true, true); if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true)) return osEnd; else { INFO(trVDR("Can't switch channel!")); return osContinue; } } eOSState cMenuSearchCommands::ExtendedSearch(void) { return AddSubMenu(new cMenuEPGSearchExt()); } eOSState cMenuSearchCommands::Record(void) { if (!event) return osContinue; eTimerMatch timerMatch = tmNone; cTimer* timer = Timers.GetMatch(event, &timerMatch); if (timerMatch == tmFull) { if (EPGSearchConfig.useVDRTimerEditMenu) return AddSubMenu(new cMenuEditTimer(timer)); else return AddSubMenu(new cMenuMyEditTimer(timer, false, event, timer->Channel())); } timer = new cTimer(event); PrepareTimerFile(event, timer); cTimer *t = Timers.GetTimer(timer); if (EPGSearchConfig.onePressTimerCreation == 0 || t || (!t && event->StartTime() - (Setup.MarginStart+2) * 60 < time(NULL))) { if (t) { delete timer; timer = t; } if (EPGSearchConfig.useVDRTimerEditMenu) return AddSubMenu(new cMenuEditTimer(timer, !t)); else return AddSubMenu(new cMenuMyEditTimer(timer, !t, event)); } else { string fullaux = ""; string aux = ""; if (event) { int bstart = event->StartTime() - timer->StartTime(); int bstop = timer->StopTime() - event->EndTime(); int checkmode = DefTimerCheckModes.GetMode(timer->Channel()); aux = UpdateAuxValue(aux, "channel", NumToString(timer->Channel()->Number()) + " - " + CHANNELNAME(timer->Channel())); aux = UpdateAuxValue(aux, "update", checkmode); aux = UpdateAuxValue(aux, "eventid", event->EventID()); aux = UpdateAuxValue(aux, "bstart", bstart); aux = UpdateAuxValue(aux, "bstop", bstop); fullaux = UpdateAuxValue(fullaux, "epgsearch", aux); } #ifdef USE_PINPLUGIN aux = ""; aux = UpdateAuxValue(aux, "protected", timer->FskProtection() ? "yes" : "no"); fullaux = UpdateAuxValue(fullaux, "pin-plugin", aux); #endif SetAux(timer, fullaux); Timers.Add(timer); timer->Matches(); Timers.SetModified(); LogFile.iSysLog("timer %s added (active)", *timer->ToDescr()); return osBack; } return osContinue; } eOSState cMenuSearchCommands::MarkAsRecorded(void) { if (!event) return osContinue; if (!Interface->Confirm(tr("Mark as 'already recorded'?"))) return osContinue; cTimer* dummyTimer = new cTimer(event); cMutexLock RecsDoneLock(&RecsDone); RecsDone.Add(new cRecDone(dummyTimer, event, search)); RecsDone.Save(); delete dummyTimer; return osBack; } eOSState cMenuSearchCommands::AddToSwitchList(void) { if (!event) return osContinue; time_t now = time(NULL); if (now >= event->StartTime()) { ERROR(tr("Already running!")); return osBack; } cSwitchTimer* switchTimer = SwitchTimers.InSwitchList(event); if (!switchTimer) { if (!Interface->Confirm(tr("Add to switch list?"))) return osContinue; cMutexLock SwitchTimersLock(&SwitchTimers); SwitchTimers.Add(new cSwitchTimer(event)); SwitchTimers.Save(); cSwitchTimerThread::Init(); // asure the thread is running } else { if (!Interface->Confirm(tr("Delete from switch list?"))) return osContinue; cMutexLock SwitchTimersLock(&SwitchTimers); SwitchTimers.Del(switchTimer); SwitchTimers.Save(); if (SwitchTimers.Count() == 0) cSwitchTimerThread::Exit(); } return osBack; } eOSState cMenuSearchCommands::CreateSearchTimer(void) { if (!event) return osContinue; cSearchExt* pNew = new cSearchExt; strcpy(pNew->search, event->Title()); pNew->channelMin = pNew->channelMax = Channels.GetByChannelID(event->ChannelID()); return AddSubMenu(new cMenuEditSearchExt(pNew, true, false, true)); } eOSState cMenuSearchCommands::CreateBlacklist(void) { if (!event) return osContinue; cBlacklist* pNew = new cBlacklist; strcpy(pNew->search, event->Title()); return AddSubMenu(new cMenuBlacklistEdit(pNew, true)); } eOSState cMenuSearchCommands::Execute(void) { int current = Current(); if (current <= 7) { if (current == 0) return AddSubMenu(new cMenuSearchResultsForQuery(event->Title(), true)); if (current == 1) return Record(); if (current == 2) return Switch(); if (current == 3) return CreateSearchTimer(); if (current == 4) return AddSubMenu(new cMenuSearchResultsForRecs(event->Title())); if (current == 5) return MarkAsRecorded(); if (current == 6) return AddToSwitchList(); if (current == 7) return CreateBlacklist(); } cCommand *command = commands.Get(current-8); if (command) { cString buffer; bool confirmed = true; if (command->Confirm()) { buffer = cString::sprintf("%s?", command->Title()); confirmed = Interface->Confirm(buffer); } if (confirmed) { buffer = cString::sprintf("%s...", command->Title()); Skins.Message(mtStatus, buffer); buffer = cString::sprintf("'%s' %ld %ld %d '%s' '%s'", EscapeString(event->Title()).c_str(), event->StartTime(), event->EndTime(), ChannelNrFromEvent(event), EscapeString(Channels.GetByChannelID(event->ChannelID(), true, true)->Name()).c_str(), EscapeString(event->ShortText()?event->ShortText():"").c_str()); const char *Result = command->Execute(buffer); Skins.Message(mtStatus, NULL); if (Result) return AddSubMenu(new cMenuText(command->Title(), Result, fontFix)); return osBack; } } return osContinue; } eOSState cMenuSearchCommands::ProcessKey(eKeys Key) { bool hadSubmenu = HasSubMenu(); eOSState state = cOsdMenu::ProcessKey(Key); // jump back to calling menu, if a command was called directly with key '1' .. '9' if (directCall && hadSubmenu && !HasSubMenu()) return osBack; if (state == osUnknown) { switch (Key) { case kGreen: case kYellow: case kBlue: return osContinue; case k1...k9: case kOk: return Execute(); default: break; } } return state; } vdr-plugin-epgsearch/noannounce.c0000644000175000017500000001075112466747543016765 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "noannounce.h" #include "epgsearchtools.h" using std::string; cNoAnnounces NoAnnounces; char *cNoAnnounce::buffer = NULL; // -- cNoAnnounce ----------------------------------------------------------------- cNoAnnounce::cNoAnnounce(void) { title = shortText = ""; startTime = nextAnnounce = 0; buffer = NULL; } cNoAnnounce::cNoAnnounce(const cEvent* e, time_t NextAnnounce) { title = shortText = ""; startTime = 0; buffer = NULL; if (e) { if (e->Title()) title = e->Title(); if (e->ShortText()) shortText = e->ShortText(); channelID = e->ChannelID(); startTime = e->StartTime(); nextAnnounce = NextAnnounce; } } cNoAnnounce::~cNoAnnounce(void) { if (buffer) { free(buffer); buffer = NULL; } } bool cNoAnnounce::operator== (const cNoAnnounce &arg) const { return (startTime == arg.startTime && channelID == arg.channelID); } bool cNoAnnounce::Parse(const char *s) { char *line; char *pos; char *pos_next; int parameter = 1; int valuelen; #define MAXVALUELEN (10 * MaxFileName) char value[MAXVALUELEN]; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != ':') { pos_next = strchr(pos, ':'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MAXVALUELEN) { LogFile.eSysLog("entry '%s' is too long. Will be truncated!", pos); valuelen = MAXVALUELEN; } strn0cpy(value, pos, valuelen); pos = pos_next; switch (parameter) { case 1: title = value; break; case 2: shortText = value; break; case 3: channelID = tChannelID::FromString(value); break; case 4: startTime = atol(value); break; case 5: nextAnnounce = atol(value); break; default: break; } //switch } parameter++; } if (*pos) pos++; } //while title = ReplaceAll(title, "|", ":"); shortText = ReplaceAll(shortText, "|", ":"); free(line); return (parameter >= 5) ? true : false; } const char *cNoAnnounce::ToText(void) const { free(buffer); msprintf(&buffer, "%s:%s:%s:%ld:%ld", ReplaceAll(title, ":", "|").c_str(), ReplaceAll(shortText, ":", "|").c_str(), *channelID.ToString(), startTime, nextAnnounce); return buffer; } bool cNoAnnounce::Save(FILE *f) { return fprintf(f, "%s\n", ToText()) > 0; } // -- cNoAnnounces ----------------------------------------------------------------- cNoAnnounce* cNoAnnounces::InList(const cEvent* e) { cNoAnnounce noAnnounceTemp(e); cNoAnnounce* noAnnounce = First(); while (noAnnounce) { if (*noAnnounce == noAnnounceTemp) { if (noAnnounce->nextAnnounce > 0 && noAnnounce->nextAnnounce < time(NULL)) { Del(noAnnounce); // active again return NULL; } else return noAnnounce; } noAnnounce = Next(noAnnounce); } return NULL; } void cNoAnnounces::ClearOutdated(void) { // remove outdated items cNoAnnounce* noAnnounce = First(); while (noAnnounce) { cNoAnnounce* noAnnounceNext = Next(noAnnounce); if (noAnnounce->startTime < time(NULL)) Del(noAnnounce); noAnnounce = noAnnounceNext; } } void cNoAnnounces::UpdateNextAnnounce(const cEvent* e, time_t NextAnnounce) { cNoAnnounce* noAnnounce = InList(e); if (noAnnounce) noAnnounce->nextAnnounce = NextAnnounce; } vdr-plugin-epgsearch/epgsearchext.c0000644000175000017500000015045412466747543017311 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "epgsearchext.h" #include "epgsearchcfg.h" #include "epgsearchcats.h" #include "epgsearchtools.h" #include #include "menu_searchresults.h" #include "menu_dirselect.h" #include "changrp.h" #include "menu_search.h" #include "menu_searchedit.h" #include "menu_recsdone.h" #include "searchtimer_thread.h" #include "timer_thread.h" #include "uservars.h" #include "blacklist.h" #include cSearchExts SearchExts; cSearchExts SearchTemplates; #ifndef MAX_SUBTITLE_LENGTH #define MAX_SUBTITLE_LENGTH 40 #endif // -- cSearchExt ----------------------------------------------------------------- char *cSearchExt::buffer = NULL; cSearchExt::cSearchExt(void) { ID = -1; *search = 0; options = 1; useTime = false; startTime = 0000; stopTime = 2359; useChannel = false; channelMin = Channels.GetByNumber(cDevice::CurrentChannel()); channelMax = Channels.GetByNumber(cDevice::CurrentChannel()); channelGroup = NULL; useCase = false; mode = 0; useTitle = true; useSubtitle = true; useDescription = true; useDuration = false; minDuration = 0; maxDuration = 2359; useAsSearchTimer = false; useDayOfWeek = false; DayOfWeek = 0; buffer = NULL; *directory = 0; useEpisode = 0; Priority = EPGSearchConfig.DefPriority; Lifetime = EPGSearchConfig.DefLifetime; MarginStart = EPGSearchConfig.DefMarginStart; MarginStop = EPGSearchConfig.DefMarginStop; useVPS = false; action = searchTimerActionRecord; useExtEPGInfo = false; contentsFilter = ""; catvalues = (char**) malloc(SearchExtCats.Count() * sizeof(char*)); cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { catvalues[index] = (char*)malloc(MaxFileName); *catvalues[index] = 0; SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } avoidRepeats = 0; compareTitle = 1; compareSubtitle = 1; compareSummary = 1; compareSummaryMatchInPercent = 90; compareDate = 0; allowedRepeats = 0; catvaluesAvoidRepeat = 0; repeatsWithinDays = 0; delAfterDays = 0; recordingsKeep = 0; switchMinsBefore = 1; pauseOnNrRecordings = 0; blacklistMode = blacklistsOnlyGlobal; // no blacklists blacklists.Clear(); fuzzyTolerance = 1; useInFavorites = 0; menuTemplate = 0; delMode = 0; delAfterCountRecs = 0; delAfterDaysOfFirstRec = 0; useAsSearchTimerFrom = 0; useAsSearchTimerTil = 0; ignoreMissingEPGCats = 0; unmuteSoundOnSwitch = 0; skipRunningEvents = false; } cSearchExt::~cSearchExt(void) { if (buffer) { free(buffer); buffer = NULL; } if (catvalues) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { free(catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } free(catvalues); catvalues = NULL; } } cSearchExt& cSearchExt::operator= (const cSearchExt &SearchExt) { CopyFromTemplate(&SearchExt); ID = SearchExt.ID; strcpy(search, SearchExt.search); cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { *catvalues[index] = 0; strcpy(catvalues[index], SearchExt.catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } return *this; } void cSearchExt::CopyFromTemplate(const cSearchExt* templ, bool ignoreChannelSettings) { options = templ->options; useTime = templ->useTime; startTime = templ->startTime; stopTime = templ->stopTime; if (!ignoreChannelSettings) useChannel = templ->useChannel; useCase = templ->useCase; mode = templ->mode; useTitle = templ->useTitle; useSubtitle = templ->useSubtitle; useDescription = templ->useDescription; useDuration = templ->useDuration; minDuration = templ->minDuration; maxDuration = templ->maxDuration; useAsSearchTimer = templ->useAsSearchTimer; useDayOfWeek = templ->useDayOfWeek; DayOfWeek = templ->DayOfWeek; useEpisode = templ->useEpisode; strcpy(directory, templ->directory); Priority = templ->Priority; Lifetime = templ->Lifetime; MarginStart = templ->MarginStart; MarginStop = templ->MarginStop; useVPS = templ->useVPS; action = templ->action; useExtEPGInfo = templ->useExtEPGInfo; contentsFilter = templ->contentsFilter; switchMinsBefore = templ->switchMinsBefore; pauseOnNrRecordings = templ->pauseOnNrRecordings; cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { strcpy(catvalues[index], templ->catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } if (!ignoreChannelSettings) { channelMin = templ->channelMin; channelMax = templ->channelMax; if (channelGroup) { free(channelGroup); channelGroup = NULL; } if (templ->channelGroup) channelGroup = strdup(templ->channelGroup); } avoidRepeats = templ->avoidRepeats; compareTitle = templ->compareTitle; compareSubtitle = templ->compareSubtitle; compareSummary = templ->compareSummary; compareSummaryMatchInPercent = templ->compareSummaryMatchInPercent; compareDate = templ->compareDate; allowedRepeats = templ->allowedRepeats; catvaluesAvoidRepeat = templ->catvaluesAvoidRepeat; repeatsWithinDays = templ->repeatsWithinDays; delAfterDays = templ->delAfterDays; recordingsKeep = templ->recordingsKeep; blacklistMode = templ->blacklistMode; blacklists.Clear(); cBlacklistObject* blacklistObj = templ->blacklists.First(); while(blacklistObj) { blacklists.Add(new cBlacklistObject(blacklistObj->blacklist)); blacklistObj = templ->blacklists.Next(blacklistObj); } fuzzyTolerance = templ->fuzzyTolerance; useInFavorites = templ->useInFavorites; menuTemplate = templ->menuTemplate; delMode = templ->delMode; delAfterCountRecs = templ->delAfterCountRecs; delAfterDaysOfFirstRec = templ->delAfterDaysOfFirstRec; useAsSearchTimerFrom = templ->useAsSearchTimerFrom; useAsSearchTimerTil = templ->useAsSearchTimerTil; ignoreMissingEPGCats = templ->ignoreMissingEPGCats; unmuteSoundOnSwitch = templ->unmuteSoundOnSwitch; } bool cSearchExt::operator< (const cListObject &ListObject) { cSearchExt *SE = (cSearchExt *)&ListObject; return strcasecmp(search, SE->search) < 0; } char* replaceSpecialChars(const char* in) { char* tmp_in = strdup(in); while(strstr(tmp_in, "|")) tmp_in = strreplace(tmp_in, "|", "!^pipe^!"); // ugly: replace a pipe with something, strreplace(tmp_in, ':', '|'); return tmp_in; } const char *cSearchExt::ToText() { char tmp_Start[5] = ""; char tmp_Stop[5] = ""; char tmp_minDuration[5] = ""; char tmp_maxDuration[5] = ""; cString tmp_chanSel; char* tmp_catvalues = NULL; char* tmp_blacklists = NULL; free(buffer); char* tmp_search = replaceSpecialChars(search); char* tmp_directory = replaceSpecialChars(directory); char* tmp_contentsFilter = replaceSpecialChars(contentsFilter.c_str()); if (useTime) { sprintf(tmp_Start, "%04d", startTime); sprintf(tmp_Stop, "%04d", stopTime); } if (useDuration) { sprintf(tmp_minDuration, "%04d", minDuration); sprintf(tmp_maxDuration, "%04d", maxDuration); } if (useChannel==1) { if (channelMin->Number() < channelMax->Number()) tmp_chanSel = cString::sprintf("%s|%s", CHANNELSTRING(channelMin), CHANNELSTRING(channelMax)); else tmp_chanSel = cString(CHANNELSTRING(channelMin)); } if (useChannel==2) { int channelGroupNr = ChannelGroups.GetIndex(channelGroup); if (channelGroupNr == -1) { LogFile.eSysLog("channel group '%s' does not exist!", channelGroup); useChannel = 0; } else tmp_chanSel = cString(channelGroup); } if (useExtEPGInfo) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { char* catvalue = NULL; if (msprintf(&catvalue, "%s", catvalues[index])==-1) break; while(strstr(catvalue, ":")) catvalue = strreplace(catvalue, ":", "!^colon^!"); // ugly: replace with something, that should not happen to be part ofa category value while(strstr(catvalue, "|")) catvalue = strreplace(catvalue, "|", "!^pipe^!"); // ugly: replace with something, that should not happen to be part of a regular expression if (index == 0) msprintf(&tmp_catvalues, "%d#%s", SearchExtCat->id, catvalue); else { char* temp = tmp_catvalues; msprintf(&tmp_catvalues, "%s|%d#%s", tmp_catvalues, SearchExtCat->id, catvalue); free(temp); } SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; free(catvalue); } } if (blacklistMode == blacklistsSelection && blacklists.Count() > 0) { cBlacklistObject *blacklistObj = blacklists.First(); int index = 0; while (blacklistObj) { if (index == 0) msprintf(&tmp_blacklists, "%d", blacklistObj->blacklist->ID); else { char* temp = tmp_blacklists; msprintf(&tmp_blacklists, "%s|%d", tmp_blacklists, blacklistObj->blacklist->ID); free(temp); } blacklistObj = blacklists.Next(blacklistObj); index++; } } msprintf(&buffer, "%d:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d:%s:%d:%d:%d:%d:%d:%d:%d:%s:%d:%d:%d:%d:%d:%ld:%d:%d:%d:%d:%d:%d:%s:%d:%d:%d:%d:%d:%d:%ld:%ld:%d:%d:%d:%s:%d", ID, tmp_search, useTime, tmp_Start, tmp_Stop, useChannel, (useChannel>0 && useChannel<3)?*tmp_chanSel:"0", useCase, mode, useTitle, useSubtitle, useDescription, useDuration, tmp_minDuration, tmp_maxDuration, useAsSearchTimer, useDayOfWeek, DayOfWeek, useEpisode, tmp_directory, Priority, Lifetime, MarginStart, MarginStop, useVPS, action, useExtEPGInfo, useExtEPGInfo?tmp_catvalues:"", avoidRepeats, allowedRepeats, compareTitle, compareSubtitle, compareSummary, catvaluesAvoidRepeat, repeatsWithinDays, delAfterDays, recordingsKeep, switchMinsBefore, pauseOnNrRecordings, blacklistMode, blacklists.Count()>0?tmp_blacklists:"", fuzzyTolerance, useInFavorites, menuTemplate, delMode, delAfterCountRecs, delAfterDaysOfFirstRec, useAsSearchTimerFrom, useAsSearchTimerTil, ignoreMissingEPGCats, unmuteSoundOnSwitch, compareSummaryMatchInPercent, contentsFilter.c_str(), compareDate); if (tmp_search) free(tmp_search); if (tmp_directory) free(tmp_directory); if (tmp_catvalues) free(tmp_catvalues); if (tmp_blacklists) free(tmp_blacklists); if (tmp_contentsFilter) free(tmp_contentsFilter); return buffer; } bool cSearchExt::Parse(const char *s) { char *line; char *pos; char *pos_next; int parameter = 1; int valuelen; char value[MaxFileName]; bool disableSearchtimer = false; *directory = 0; *search = 0; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != ':') { pos_next = strchr(pos, ':'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MaxFileName) valuelen = MaxFileName; strn0cpy(value, pos, valuelen); pos = pos_next; switch (parameter) { case 1: if (!isnumber(value)) return false; ID = atoi(value); break; case 2: strcpy(search, value); break; case 3: useTime = atoi(value); break; case 4: startTime = atoi(value); break; case 5: stopTime = atoi(value); break; case 6: useChannel = atoi(value); break; case 7: if (useChannel == 0) { channelMin = NULL; channelMax = NULL; } else if (useChannel == 1) { int minNum=0, maxNum=0; int fields = sscanf(value, "%d-%d", &minNum, &maxNum); if (fields == 0) // stored with ID { #ifdef __FreeBSD__ char *channelMinbuffer = MALLOC(char, 32); char *channelMaxbuffer = MALLOC(char, 32); int channels = sscanf(value, "%31[^|]|%31[^|]", channelMinbuffer, channelMaxbuffer); #else char *channelMinbuffer = NULL; char *channelMaxbuffer = NULL; int channels = sscanf(value, "%m[^|]|%m[^|]", &channelMinbuffer, &channelMaxbuffer); #endif channelMin = Channels.GetByChannelID(tChannelID::FromString(channelMinbuffer), true, true); if (!channelMin) { LogFile.eSysLog("ERROR: channel '%s' not defined", channelMinbuffer); channelMin = channelMax = NULL; disableSearchtimer = true; useChannel = 0; } if (channels == 1) channelMax = channelMin; else { channelMax = Channels.GetByChannelID(tChannelID::FromString(channelMaxbuffer), true, true); if (!channelMax) { LogFile.eSysLog("ERROR: channel '%s' not defined", channelMaxbuffer); channelMin = channelMax = NULL; disableSearchtimer = true; useChannel = 0; } } free(channelMinbuffer); free(channelMaxbuffer); } } else if (useChannel == 2) channelGroup = strdup(value); break; case 8: useCase = atoi(value); break; case 9: mode = atoi(value); break; case 10: useTitle = atoi(value); break; case 11: useSubtitle = atoi(value); break; case 12: useDescription = atoi(value); break; case 13: useDuration = atoi(value); break; case 14: minDuration = atoi(value); break; case 15: maxDuration = atoi(value); break; case 16: useAsSearchTimer = atoi(value); break; case 17: useDayOfWeek = atoi(value); break; case 18: DayOfWeek = atoi(value); break; case 19: useEpisode = atoi(value); break; case 20: strcpy(directory, value); break; case 21: Priority = atoi(value); break; case 22: Lifetime = atoi(value); break; case 23: MarginStart = atoi(value); break; case 24: MarginStop = atoi(value); break; case 25: useVPS = atoi(value); break; case 26: action = atoi(value); break; case 27: useExtEPGInfo = atoi(value); break; case 28: if (!ParseExtEPGValues(value)) { LogFile.eSysLog("ERROR reading ext. EPG values - 1"); free(line); return false; } break; case 29: avoidRepeats = atoi(value); break; case 30: allowedRepeats = atoi(value); break; case 31: compareTitle = atoi(value); break; case 32: compareSubtitle = atoi(value)>0?1:0; break; case 33: compareSummary = atoi(value); break; case 34: catvaluesAvoidRepeat = atol(value); break; case 35: repeatsWithinDays = atoi(value); break; case 36: delAfterDays = atoi(value); break; case 37: recordingsKeep = atoi(value); break; case 38: switchMinsBefore = atoi(value); break; case 39: pauseOnNrRecordings = atoi(value); break; case 40: blacklistMode = atoi(value); break; case 41: if (blacklistMode == blacklistsSelection && !ParseBlacklistIDs(value)) { LogFile.eSysLog("ERROR parsing blacklist IDs"); free(line); return false; } break; case 42: fuzzyTolerance = atoi(value); break; case 43: useInFavorites = atoi(value); break; case 44: menuTemplate = atoi(value); break; case 45: delMode = atoi(value); break; case 46: delAfterCountRecs = atoi(value); break; case 47: delAfterDaysOfFirstRec = atoi(value); break; case 48: useAsSearchTimerFrom = atol(value); break; case 49: useAsSearchTimerTil = atol(value); break; case 50: ignoreMissingEPGCats = atoi(value); break; case 51: unmuteSoundOnSwitch = atoi(value); break; case 52: compareSummaryMatchInPercent = atoi(value); break; case 53: contentsFilter = value; break; case 54: compareDate = atoi(value); break; default: break; } //switch } parameter++; } if (*pos) pos++; } //while strreplace(directory, '|', ':'); strreplace(search, '|', ':'); strreplace(contentsFilter, "|", ":"); while(strstr(search, "!^pipe^!")) strreplace(search, "!^pipe^!", "|"); while(strstr(directory, "!^pipe^!")) strreplace(directory, "!^pipe^!", "|"); strreplace(contentsFilter, "!^pipe^!", "|"); if (disableSearchtimer && useAsSearchTimer) { useAsSearchTimer = false; LogFile.Log(1, "search timer '%s' disabled", search); } free(line); return (parameter >= 11) ? true : false; } char* cSearchExt::BuildFile(const cEvent* pEvent) const { char* file = NULL; if (!pEvent) return file; const char *Subtitle = pEvent ? pEvent->ShortText() : NULL; char SubtitleBuffer[Utf8BufSize(MAX_SUBTITLE_LENGTH)]; if (isempty(Subtitle)) { time_t Start = pEvent->StartTime(); struct tm tm_r; strftime(SubtitleBuffer, sizeof(SubtitleBuffer), "%Y.%m.%d-%R-%a", localtime_r(&Start, &tm_r)); Subtitle = SubtitleBuffer; } else if (Utf8StrLen(Subtitle) > MAX_SUBTITLE_LENGTH) { Utf8Strn0Cpy(SubtitleBuffer, Subtitle, sizeof(SubtitleBuffer)); SubtitleBuffer[Utf8SymChars(SubtitleBuffer, MAX_SUBTITLE_LENGTH)] = 0; Subtitle = SubtitleBuffer; } if (useEpisode) { cString pFile = cString::sprintf("%s~%s", pEvent->Title(), Subtitle); if (file) free(file); file = strdup(pFile); } else if (pEvent->Title()) file = strdup(pEvent->Title()); if (!isempty(directory)) { char* pFile = NULL; cVarExpr varExprDir(directory); if (!varExprDir.DependsOnVar("%title%", pEvent) && !varExprDir.DependsOnVar("%subtitle%", pEvent)) msprintf(&pFile, "%s~%s", directory, file?file:""); else // ignore existing title and subtitle in file if already used as variables in directory msprintf(&pFile, "%s", directory); // parse the epxression and evaluate it cVarExpr varExprFile(pFile); if (pFile) free(pFile); pFile = strdup(varExprFile.Evaluate(pEvent).c_str()); cVarExpr varExprSearchFile(pFile); if (pFile) free(pFile); pFile = strdup(varExprSearchFile.Evaluate(this).c_str()); if (file) free(file); file = strdup(pFile); free(pFile); } // replace some special chars if (file) { while(strstr(file, "|")) file = strreplace(file, "|", "!^pipe^!"); while(strstr(file, ":")) file = strreplace(file, ':', '|'); while(strstr(file, " ~")) file = strreplace(file, " ~", "~"); while(strstr(file, "~ ")) file = strreplace(file, "~ ", "~"); } return file; } bool cSearchExt::ParseBlacklistIDs(const char *s) { char *line; char *pos; char *pos_next; int valuelen; char value[MaxFileName]; cMutexLock BlacklistLock(&Blacklists); blacklists.Clear(); pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != '|') { pos_next = strchr(pos, '|'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MaxFileName) valuelen = MaxFileName; strn0cpy(value, pos, valuelen); pos = pos_next; cBlacklist* blacklist = Blacklists.GetBlacklistFromID(atoi(value)); if (!blacklist) LogFile.eSysLog("blacklist ID %s missing, will be skipped", value); else blacklists.Add(new cBlacklistObject(blacklist)); } } if (*pos) pos++; } //while free(line); return true; } bool cSearchExt::ParseExtEPGValues(const char *s) { char *line; char *pos; char *pos_next; int valuelen; char value[MaxFileName]; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != '|') { pos_next = strchr(pos, '|'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MaxFileName) valuelen = MaxFileName; strn0cpy(value, pos, valuelen); pos = pos_next; if (!ParseExtEPGEntry(value)) { LogFile.eSysLog("ERROR reading ext. EPG value: %s", value); free(line); return false; } } } if (*pos) pos++; } //while free(line); return true; } bool cSearchExt::ParseExtEPGEntry(const char *s) { char *line; char *pos; char *pos_next; int parameter = 1; int valuelen; char value[MaxFileName]; int currentid = -1; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != '#') { pos_next = strchr(pos, '#'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MaxFileName) valuelen = MaxFileName; strn0cpy(value, pos, valuelen); pos = pos_next; switch (parameter) { case 1: { currentid = atoi(value); int index = SearchExtCats.GetIndexFromID(currentid); if (index > -1 && index < SearchExtCats.Count()) strcpy(catvalues[index], ""); } break; case 2: if (currentid > -1) { int index = SearchExtCats.GetIndexFromID(currentid); if (index > -1 && index < SearchExtCats.Count()) { while(strstr(value, "!^colon^!")) strreplace(value, "!^colon^!", ":"); while(strstr(value, "!^pipe^!")) strreplace(value, "!^pipe^!", "|"); strcpy(catvalues[index], value); } } break; default: break; } //switch } parameter++; } if (*pos) pos++; } //while free(line); return (parameter >= 2) ? true : false; } bool cSearchExt::Save(FILE *f) { return fprintf(f, "%s\n", ToText()) > 0; } cEvent * cSearchExt::GetEventBySearchExt(const cSchedule *schedules, const cEvent *Start, bool inspectTimerMargin) { if (!schedules) return NULL; cEvent *pe = NULL; cEvent *p1 = NULL; const cList* Events = schedules->Events(); if (Start) p1 = Events->Next(Start); else p1 = Events->First(); time_t tNow=time(NULL); char* searchText = strdup(search); int searchStart = 0, searchStop = 0; if (useTime) { searchStart = startTime; searchStop = stopTime; if (searchStop < searchStart) searchStop += 2400; } int minSearchDuration = 0; int maxSearchDuration = 0; if (useDuration) { minSearchDuration = minDuration/100*60 + minDuration%100; maxSearchDuration = maxDuration/100*60 + maxDuration%100; } if (!useCase) ToLower(searchText); for (cEvent *p = p1; p; p = Events->Next(p)) { if(!p) { break; } if (skipRunningEvents && tNow > p->StartTime()) continue; // ignore events without title if (!p->Title() || !*p->Title()) continue; if (tNow < p->EndTime() + (inspectTimerMargin?(MarginStop * 60):0)) { if (useTime) { time_t tEvent = p->StartTime(); struct tm tmEvent; localtime_r(&tEvent, &tmEvent); int eventStart = tmEvent.tm_hour*100 + tmEvent.tm_min; int eventStart2 = eventStart + 2400; if ((eventStart < searchStart || eventStart > searchStop) && (eventStart2 < searchStart || eventStart2 > searchStop)) continue; if (useDayOfWeek) { if (DayOfWeek >= 0) { if (( DayOfWeek != tmEvent.tm_wday || (DayOfWeek == tmEvent.tm_wday && eventStart < searchStart)) && (!((DayOfWeek+1)%7 == tmEvent.tm_wday && eventStart2 < searchStop))) continue; } else { int iFound = 0; for(int i=0; i<7; i++) { if ((abs(DayOfWeek) & (int)pow(2,i)) && ((i == tmEvent.tm_wday && eventStart >= searchStart) || ((i+1)%7 == tmEvent.tm_wday && eventStart2 < searchStop))) { iFound = 1; break; } } if (!iFound) continue; } } } if (useDuration) { int duration = p->Duration()/60; if (minSearchDuration > duration || maxSearchDuration < duration) continue; } if (!useTime && useDayOfWeek) { time_t tEvent = p->StartTime(); struct tm tmEvent; localtime_r(&tEvent, &tmEvent); if (DayOfWeek >= 0 && DayOfWeek != tmEvent.tm_wday) continue; if (DayOfWeek < 0) { int iFound = 0; for(int i=0; i<7; i++) if (abs(DayOfWeek) & (int)pow(2,i) && i == tmEvent.tm_wday) { iFound = 1; break; } if (!iFound) continue; } } char* szTest = NULL; msprintf(&szTest, "%s%s%s%s%s", (useTitle?(p->Title()?p->Title():""):""), (useSubtitle||useDescription)?"~":"", (useSubtitle?(p->ShortText()?p->ShortText():""):""),useDescription?"~":"", (useDescription?(p->Description()?p->Description():""):"")); if (!useCase) ToLower(szTest); if (szTest && *szTest) { if (!MatchesSearchMode(szTest, searchText, mode," ,;|~", fuzzyTolerance)) { free(szTest); continue; } } if (szTest) free(szTest); if (contentsFilter.size() > 0 && !MatchesContentsFilter(p)) continue; if (useExtEPGInfo && !MatchesExtEPGInfo(p)) continue; pe=p; break; } } free(searchText); return pe; } // returns a pointer array to the matching search results cSearchResults* cSearchExt::Run(int PayTVMode, bool inspectTimerMargin, int evalLimitMins, cSearchResults* pPrevResults, bool suppressRepeatCheck) { LogFile.Log(3,"start search for search timer '%s'", search); cSchedulesLock schedulesLock; const cSchedules *schedules; schedules = cSchedules::Schedules(schedulesLock); if(!schedules) { LogFile.Log(1,"schedules are currently locked! try again later."); return NULL; } bool noPayTV = false; if (PayTVMode == -1) // use search's setting noPayTV = (useChannel == 3); else noPayTV = (PayTVMode == 1); time_t tNow=time(NULL); const cSchedule *Schedule = schedules->First(); cSearchResults* pSearchResults = pPrevResults; cSearchResults* pBlacklistResults = GetBlacklistEvents(inspectTimerMargin?MarginStop:0); int counter = 0; while (Schedule) { cChannel* channel = Channels.GetByChannelID(Schedule->ChannelID(),true,true); if (!channel) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } if (useChannel == 1 && channelMin && channelMax) { if (channelMin->Number() > channel->Number() || channelMax->Number() < channel->Number()) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } } if (useChannel == 2 && channelGroup) { cChannelGroup* group = ChannelGroups.GetGroupByName(channelGroup); if (!group || !group->ChannelInGroup(channel)) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } } if (useChannel == 3 && noPayTV) { if (channel->Ca() >= CA_ENCRYPTED_MIN) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } } if (noPayTV) // no paytv { if (channel->Ca() >= CA_ENCRYPTED_MIN) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } } const cEvent *pPrevEvent = NULL; do { const cEvent* event = GetEventBySearchExt(Schedule, pPrevEvent,inspectTimerMargin); pPrevEvent = event; if (evalLimitMins && event) // limit evaluation to now + limit { if (tNow + evalLimitMins*60 <= event->EndTime()) break; } if (event && Channels.GetByChannelID(event->ChannelID(),true,true)) { if (pBlacklistResults && pBlacklistResults->Lookup(event)) { LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d): matches blacklist", event->Title()?event->Title():"no title", event->ShortText()?event->ShortText():"no subtitle", GETDATESTRING(event), GETTIMESTRING(event), ChannelNrFromEvent(event)); continue; } if (!pSearchResults) pSearchResults = new cSearchResults; pSearchResults->Add(new cSearchResult(event, this)); counter++; } } while(pPrevEvent); Schedule = (const cSchedule *)schedules->Next(Schedule); } LogFile.Log(3,"found %d event(s) for search timer '%s'", counter, search); if (pBlacklistResults) delete pBlacklistResults; if (useAsSearchTimer && avoidRepeats && pSearchResults && !suppressRepeatCheck) { pSearchResults->SortBy(CompareEventTime); // sort before checking repeats to make sure the first event is selected CheckRepeatTimers(pSearchResults); } skipRunningEvents = false; return pSearchResults; } cSearchResults* cSearchExt::GetBlacklistEvents(int MarginStop) { if (blacklistMode == blacklistsNone) return NULL; cMutexLock BlacklistLock(&Blacklists); cSearchResults* blacklistEvents = NULL; if (blacklistMode == blacklistsOnlyGlobal) { cBlacklist* tmpblacklist = Blacklists.First(); while(tmpblacklist) { if (tmpblacklist->isGlobal) blacklistEvents = tmpblacklist->Run(blacklistEvents, MarginStop); tmpblacklist = Blacklists.Next(tmpblacklist); } } if (blacklistMode == blacklistsAll) { cBlacklist* tmpblacklist = Blacklists.First(); while(tmpblacklist) { blacklistEvents = tmpblacklist->Run(blacklistEvents, MarginStop); tmpblacklist = Blacklists.Next(tmpblacklist); } } if (blacklistMode == blacklistsSelection) { cBlacklistObject* tmpblacklistObj = blacklists.First(); while(tmpblacklistObj) { blacklistEvents = tmpblacklistObj->blacklist->Run(blacklistEvents, MarginStop); tmpblacklistObj = blacklists.Next(tmpblacklistObj); } } return blacklistEvents; } void cSearchExt::CheckRepeatTimers(cSearchResults* pResults) { if (!pResults) return; if (avoidRepeats == 0) return; LogFile.Log(2,"analysing repeats for search timer '%s'...", search); if (action != searchTimerActionRecord) { LogFile.Log(3,"search timer not set to 'record', so skip all"); return; } cSearchResult* pResultObj = NULL; for (pResultObj = pResults->First(); pResultObj; pResultObj = pResults->Next(pResultObj)) { if (action != searchTimerActionRecord) // only announce if there is no timer for the event { pResultObj->needsTimer = false; continue; } const cEvent* pEvent = pResultObj->event; // check if this event was already recorded int records = 0; cRecDone* firstRec = NULL; LogFile.Log(3,"get count recordings with %d%% match", compareSummaryMatchInPercent); records = RecsDone.GetCountRecordings(pEvent, this, &firstRec, compareSummaryMatchInPercent); LogFile.Log(3,"recordings: %d", records); if (records > allowedRepeats) // already recorded { LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d): already recorded %d equal event(s)", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent), records); pResultObj->needsTimer = false; // first assume we need no timer continue; } int plannedTimers = 0; LogFile.Log(3,"get planned recordings"); cSearchResult* pFirstResultMatching = NULL; // check other results, if they are already planned for equal events for (cSearchResult* pResultObjP = pResults->First(); pResultObjP; pResultObjP = pResults->Next(pResultObjP)) { if (pResultObj == pResultObjP) break; const cEvent* pEventP = pResultObjP->event; if (!pEventP) continue; if (!pResultObjP->needsTimer) continue; if (EventsMatch(pEvent, pEventP, compareTitle, compareSubtitle, compareSummary, compareDate, catvaluesAvoidRepeat, compareSummaryMatchInPercent)) { if (!pFirstResultMatching) pFirstResultMatching = pResultObjP; plannedTimers++; } } LogFile.Log(3,"planned: %d", plannedTimers); if (plannedTimers + records > allowedRepeats) { LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d): events planned(%d), recorded(%d), allowed(%d)", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent), plannedTimers, records, allowedRepeats); pResultObj->needsTimer = false; continue; } else if (allowedRepeats > 0 && repeatsWithinDays > 0) // if we only allow repeats with in a given range { if (firstRec) // already recorded, check for allowed repeat within days { if (firstRec->startTime > pEvent->StartTime() - pEvent->Duration()) // no repeat { LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d); no repeat for event already recorded at %s, channel %d", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent), DAYDATETIME(firstRec->startTime), firstRec->ChannelNr()); pResultObj->needsTimer = false; continue; } int daysFromFirstRec = int(double((pEvent->StartTime() - firstRec->startTime)) / (60*60*24) + 0.5); if (daysFromFirstRec > repeatsWithinDays) { LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d); first recording at %s is %d days before, limit is %d days", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent), DAYDATETIME(firstRec->startTime),daysFromFirstRec, repeatsWithinDays); pResultObj->needsTimer = false; continue; } } if (plannedTimers > 0 && pFirstResultMatching) { const cEvent* pFirst = pFirstResultMatching->event; if (pFirst->StartTime() > pEvent->StartTime() - pEvent->Duration()) // no repeat { LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d); no repeat for event already recorded at %s - %s, channel %d", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent), GETDATESTRING(pFirst), GETTIMESTRING(pFirst), ChannelNrFromEvent(pFirst)); pResultObj->needsTimer = false; continue; } int daysBetween = int(double((pEvent->StartTime() - pFirst->StartTime())) / (60*60*24) + 0.5); if (daysBetween > repeatsWithinDays) { LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d); first event '%s~%s' (%s - %s) is %d days before, limit is %d days", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent), GETDATESTRING(pFirst), GETTIMESTRING(pFirst),daysBetween, repeatsWithinDays); pResultObj->needsTimer = false; continue; } } } bool dummy; cTimer* timer = cSearchTimerThread::GetTimer(this, pEvent, dummy); if (timer && !timer->HasFlags(tfActive)) { LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d), existing timer disabled", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent)); pResultObj->needsTimer = false; continue; } else LogFile.Log(3,"*** planning event '%s~%s' (%s - %s, channel %d) for recording", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent)); } int needsTimer = 0; for (pResultObj = pResults->First(); pResultObj; pResultObj = pResults->Next(pResultObj)) if (pResultObj->needsTimer) needsTimer++; LogFile.Log(2,"%d/%d events need a timer for search timer '%s'", needsTimer, pResults->Count(), search); } void cSearchExt::CheckExistingRecordings(cSearchResults* pResults) { if (!pResults) return; LogFile.Log(3,"analysing existing recordings for search timer '%s'...", search); // how many recordings do we already have? int num = GetCountRecordings(); cSearchResult* pResultObj = NULL; int remain = pauseOnNrRecordings - num; for (pResultObj = pResults->First(); pResultObj; pResultObj = pResults->Next(pResultObj), remain--) { if (!pResultObj->needsTimer) { remain++; continue; // maybe already disabled because of done feature } pResultObj->needsTimer = (remain > 0); if (remain <= 0) { const cEvent* pEvent = pResultObj->event; LogFile.Log(3,"skip '%s~%s' (%s - %s, channel %d): only %d recordings are allowed", pEvent->Title()?pEvent->Title():"no title", pEvent->ShortText()?pEvent->ShortText():"no subtitle", GETDATESTRING(pEvent), GETTIMESTRING(pEvent), ChannelNrFromEvent(pEvent), pauseOnNrRecordings); } } } bool cSearchExt::MatchesExtEPGInfo(const cEvent* e) { if (!e || !e->Description()) return false; cSearchExtCat* SearchExtCat = SearchExtCats.First(); while (SearchExtCat) { char* value = NULL; int index = SearchExtCats.GetIndexFromID(SearchExtCat->id); if (index > -1) value = catvalues[index]; if (value && SearchExtCat->searchmode >= 10 && atol(value) == 0) // numerical value != 0 ? value = NULL; if (value && *value) { char* testvalue = GetExtEPGValue(e, SearchExtCat); if (!testvalue) return (ignoreMissingEPGCats?true:false); // compare not case sensitive char* valueLower = strdup(value); ToLower(valueLower); ToLower(testvalue); if (!MatchesSearchMode(testvalue, valueLower, SearchExtCat->searchmode, ",;|~", fuzzyTolerance)) { free(testvalue); free(valueLower); return false; } free(testvalue); free(valueLower); } SearchExtCat = SearchExtCats.Next(SearchExtCat); } return true; } void cSearchExt::OnOffTimers(bool bOn) { for (cTimer *ti = Timers.First(); ti; ti = Timers.Next(ti)) { if (((!bOn && ti->HasFlags(tfActive)) || (bOn && !ti->HasFlags(tfActive))) && TriggeredFromSearchTimerID(ti) == ID) ti->OnOff(); } Timers.SetModified(); } void cSearchExt::DeleteAllTimers() { cList DelTimers; cTimer *ti = Timers.First(); while(ti) { if (!ti->Recording() && TriggeredFromSearchTimerID(ti) == ID) { cTimer* tiNext = Timers.Next(ti); LogFile.iSysLog("deleting timer %s", *ti->ToDescr()); Timers.Del(ti); Timers.SetModified(); ti = tiNext; } else ti = Timers.Next(ti); }; } cTimerObjList* cSearchExt::GetTimerList(cTimerObjList* timerList) { if (!timerList) timerList = new cTimerObjList; for (cTimer *ti = Timers.First(); ti; ti = Timers.Next(ti)) { if (TriggeredFromSearchTimerID(ti) == ID) { // check if already in list bool found = false; for (cTimerObj *tObj = timerList->First(); tObj; tObj = timerList->Next(tObj)) { if (tObj->timer == ti) { found = true; break; } } if (!found) timerList->Add(new cTimerObj(ti)); } } return timerList; } // counts the currently existent recordings triggered by this search timer int cSearchExt::GetCountRecordings() { int countRecs = 0; for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) { if (recording->IsEdited()) continue; // ignore recordings edited if (!recording->Info()) continue; char* searchID = GetAuxValue(recording, "s-id"); if (!searchID) continue; if (ID == atoi(searchID)) countRecs++; free(searchID); } LogFile.Log(3, "found %d recordings for search '%s'", countRecs, search); return countRecs; } bool cSearchExt::IsActiveAt(time_t t) { if (useAsSearchTimer == 0) return false; if (useAsSearchTimer == 2) { if (useAsSearchTimerFrom > 0 && t < useAsSearchTimerFrom) return false; if (useAsSearchTimerTil > 0 && t > useAsSearchTimerTil) return false; } return true; } bool cSearchExt::HasContent(int contentID) { for(unsigned int i=0; i>std::noshowbase>>std::hex>>tmpContentID)) return false; if (contentID == tmpContentID) return true; } return false; } void cSearchExt::SetContentFilter(int* contentStringsFlags) { // create the hex array of content descriptor IDs string tmp; contentsFilter = ""; for(unsigned int i=0; contentStringsFlags && i<=CONTENT_DESCRIPTOR_MAX; i++) { if (contentStringsFlags[i]) { std::ostringstream oss; oss<>std::hex>>searchContentID)) return false; int c=0, eventContentID=0; bool found = false; while((eventContentID=e->Contents(c++)) > 0) if (eventContentID == searchContentID) { found = true; break; } if (!found) return false; } return true; #endif } // -- cSearchExts ---------------------------------------------------------------- bool cSearchExts::Load(const char *FileName) { cMutexLock SearchExtsLock(this); Clear(); if (FileName) { free(fileName); fileName = strdup(FileName); } bool result = true; if (fileName && access(fileName, F_OK) == 0) { LogFile.iSysLog("loading %s", fileName); FILE *f = fopen(fileName, "r"); if (f) { int line = 0; char buffer[MAXPARSEBUFFER]; result = true; while (fgets(buffer, sizeof(buffer), f) > 0) { line++; char *p = strchr(buffer, '#'); if (p == buffer) *p = 0; stripspace(buffer); if (!isempty(buffer)) { cSearchExt* search = new cSearchExt; if (search->Parse(buffer)) Add(search); else { LogFile.eSysLog("error in '%s', line %d\n", fileName, line); delete search; result = false; break; } } } fclose(f); } else { LOG_ERROR_STR(fileName); result = false; } } if (!result) fprintf(stderr, "vdr: error while reading '%s'\n", fileName); LogFile.Log(2,"loaded searches from %s (count: %d)", fileName, Count()); return result; } int cSearchExts::GetNewID() { cMutexLock SearchExtsLock(this); int newID = -1; cSearchExt *l = (cSearchExt *)First(); while (l) { newID = max(newID, l->ID); l = (cSearchExt *)l->Next(); } return newID+1; } void cSearchExts::Update(void) { cMutexLock SearchExtsLock(this); cSearchExt *l = (cSearchExt *)First(); while (l) { // check if ID is set if (l->ID == -1) l->ID = GetNewID(); l = (cSearchExt *)l->Next(); } } bool cSearchExts::Save(void) { cMutexLock SearchExtsLock(this); bool result = true; cSearchExt *l = (cSearchExt *)this->First(); cSafeFile f(fileName); if (f.Open()) { while (l) { if (!l->Save(f)) { result = false; break; } l = (cSearchExt *)l->Next(); } if (!f.Close()) result = false; } else result = false; return result; } cSearchExt* cSearchExts::GetSearchFromID(int ID) { if (ID == -1) return NULL; cMutexLock SearchExtsLock(this); cSearchExt *l = (cSearchExt *)First(); while (l) { if (l->ID == ID) return l; l = (cSearchExt *)l->Next(); } return NULL; } void cSearchExts::RemoveBlacklistID(int ID) { bool changed = false; cMutexLock SearchExtsLock(this); cSearchExt *l = (cSearchExt *)First(); while (l) { cBlacklistObject* blacklistObj = l->blacklists.First(); while(blacklistObj) { cBlacklistObject* blacklistObjNext = l->blacklists.Next(blacklistObj); if (blacklistObj->blacklist->ID == ID) { l->blacklists.Del(blacklistObj); changed = true; } blacklistObj = blacklistObjNext; } l = (cSearchExt *)l->Next(); } if (changed) Save(); } bool cSearchExts::Exists(const cSearchExt* SearchExt) { cMutexLock SearchExtsLock(this); cSearchExt *l = (cSearchExt *)First(); while (l) { if (l == SearchExt) return true; l = (cSearchExt *)l->Next(); } return false; } cSearchExts* cSearchExts::Clone() { cSearchExts* clonedList = new cSearchExts(); cMutexLock SearchExtsLock(this); cSearchExt *l = (cSearchExt *)First(); while (l) { cSearchExt* clone = new cSearchExt(); *clone = *l; clonedList->Add(clone); l = (cSearchExt *)l->Next(); } return clonedList; } bool cSearchExts::CheckForAutoDelete(cSearchExt* SearchExt) { if (!SearchExt || SearchExt->delMode == 0) return false; cRecDone* firstRec = NULL; bool delSearch = false; int recs = RecsDone.GetTotalCountRecordings(SearchExt, &firstRec); if (SearchExt->delMode == 1 && SearchExt->delAfterCountRecs > 0) delSearch = recs >= SearchExt->delAfterCountRecs; if (SearchExt->delMode == 2 && SearchExt->delAfterDaysOfFirstRec && firstRec) delSearch = (time(NULL) - firstRec->startTime) > SearchExt->delAfterDaysOfFirstRec * 24 * 60 * 60; if (delSearch) { int DelID = SearchExt->ID; LogFile.Log(1,"auto deleting search '%s' (ID: %d)", SearchExt->search, DelID); cMutexLock SearchExtsLock(&SearchExts); SearchExts.Del(SearchExt); SearchExts.Save(); RecsDone.RemoveSearchID(DelID); } return delSearch; } void cSearchExts::SortBy(int(*compar)(const void *, const void *)) { int n = Count(); cListObject *a[n]; cListObject *object = objects; int i = 0; while (object && i < n) { a[i++] = object; object = object->Next(); } qsort(a, n, sizeof(cListObject *), compar); objects = lastObject = NULL; for (i = 0; i < n; i++) { a[i]->Unlink(); count--; Add(a[i]); } } cSearchResult::cSearchResult(const cEvent* Event, int searchID) : event(Event), blacklist(NULL), needsTimer(true) { search = SearchExts.GetSearchFromID(searchID); } vdr-plugin-epgsearch/epgsearchtools.c0000644000175000017500000006601312466747543017646 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include #include #include #include #include #ifdef __FreeBSD__ #include #endif #include "uservars.h" #include "epgsearchtools.h" #include "epgsearchext.h" #include "epgsearchcats.h" #include "epgsearchcfg.h" #include "svdrpclient.h" #include "distance.h" #include "md5.h" #include "afuzzy.h" #include "timerstatus.h" #include #ifdef HAVE_PCREPOSIX #include #elif defined(HAVE_LIBTRE) #include #else #include #endif const char AllowedChars[] = trNOOP("$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_"); extern bool isUTF8; int CompareEventTime(const void *p1, const void *p2) { time_t time1 = (*(cSearchResult **)p1)->event->StartTime(); time_t time2 = (*(cSearchResult **)p2)->event->StartTime(); if (time1 == time2) return (int)(ChannelNrFromEvent((*(cSearchResult **)p1)->event) - ChannelNrFromEvent((*(cSearchResult **)p2)->event)); else return (int)(time1 - time2); } int CompareEventChannel(const void *p1, const void *p2) { int ch1 = ChannelNrFromEvent((*(cSearchResult **)p1)->event); int ch2 = ChannelNrFromEvent((*(cSearchResult **)p2)->event); if (ch1 == ch2) return (int)((*(cSearchResult **)p1)->event->StartTime() - (*(cSearchResult **)p2)->event->StartTime()); else return ch1 - ch2; } int CompareSearchExtPrioDescTerm(const void *p1, const void *p2) { int prio1 = (*(cSearchExt **)p1)->Priority; int prio2 = (*(cSearchExt **)p2)->Priority; if (prio2 != prio1) return prio2 - prio1; else return strcmp((*(cSearchExt **)p1)->search, (*(cSearchExt **)p2)->search); } cString IndentMenuItem(const char* szString, int indentions) { char* szIndented = NULL; msprintf(&szIndented, "%*s", strlen(szString)+indentions*2, szString); cString szIndentedStr(szIndented, true /*take pointer*/); return szIndentedStr; } bool MatchesSearchMode(const char* szTest, const char* searchText, int mode, const char* delim, int tolerance) { if (szTest && *szTest) { if (mode == 0) // substring return (strstr(szTest, searchText) != NULL); else if (mode == 1 || mode == 2) // AND or OR { bool bTesting = false; char *pstrSearchToken, *pptr; bool bFirst=true; char *pstrSearch=strdup(searchText); pstrSearchToken=strtok_r(pstrSearch, delim, &pptr); while(pstrSearchToken) { if(szTest && strstr(szTest, skipspace(pstrSearchToken))) { if(mode==1) { // means AND if(bFirst) { bTesting=true; bFirst=false; } else bTesting&=true; } else bTesting|=true; } else {// not found!! if(mode==1) { // means AND bTesting=false; bFirst=false; } } pstrSearchToken=strtok_r(NULL, delim, &pptr); } free(pstrSearch); return bTesting; } else if (mode == 3) // match exactly { if (strcmp(szTest, searchText) == 0) return true; else return false; } else if (mode == 4) // regexp { regex_t re; if ( 0 == regcomp(&re, searchText, REG_EXTENDED | REG_NOSUB) ) { int status = regexec( &re, szTest, 0, NULL, 0); regfree(&re); return (status == 0); } return false; } else if (mode == 5) // fuzzy { AFUZZY af = { NULL, NULL, NULL, NULL, NULL, NULL, { 0 }, { 0 }, 0, 0, 0, 0, 0, 0 }; string query = searchText?searchText:""; if (query.size() > 32) query = query.substr(0, 32); afuzzy_init(query.c_str(), tolerance, 0, &af); /* Checking substring */ int res = afuzzy_checkSUB(szTest, &af); afuzzy_free(&af); return (res > 0); } else if (mode >= 10 && mode <= 15) { int testvalue = atoi(szTest); int value = atoi(searchText); if (value == 0) return true; if (mode == 10) // less return testvalue < value; else if (mode == 11) // less or equal return testvalue <= value; else if (mode == 12) // greater return testvalue > value; else if (mode == 13) // greater or equal return testvalue >= value; else if (mode == 14) // equal return testvalue == value; else if (mode == 15) // not equal return testvalue != value; } } return false; } void ToLower(char* szText) { if (!szText) return; if (!isUTF8) { for (int loop = 0; szText[loop] !=0; loop++) szText[loop] = tolower(szText[loop]); return; } else { int length = strlen(szText)+1; uint* valueUtf8 = new uint[length]; int lengthUtf8 = Utf8ToArray(szText, valueUtf8, length); for(int i=0; iDescription(), SearchExtCat->name, SearchExtCat->format); } char* GetExtEPGValue(const char* description, const char* catname, const char *format) { if (isempty(description)) return NULL; char* tmp1 = NULL; char* tmp2 = NULL; // search the category, must be the first line or at the beginning of a line if (msprintf(&tmp1, "\n%s: ", catname)==-1 || msprintf(&tmp2, "%s: ", catname)==-1) return NULL; char* descr = strdup(description); char* cat = NULL; int valueOffset = 0; if ((cat = strstr(descr, tmp1)) != NULL) { cat++; // skip linefeed valueOffset = strlen(tmp1); } else if (strstr(descr, tmp2) == descr) // in first line { cat = descr; valueOffset = strlen(tmp2)+1; } else { free(descr); free(tmp1); free(tmp2); return NULL; } // search the value to appear before the next line feed or end char* end = strchr(cat, '\n'); int endpos = strlen(cat); if (end) endpos = end - cat; cat[endpos] = 0; char* value = NULL; msprintf(&value, "%s", cat + valueOffset - 1); if (format) { int ivalue; if (sscanf(value,"%8i",&ivalue)==1) { free(value); value = NULL; msprintf(&value, format, ivalue); } } free(descr); free(tmp1); free(tmp2); return value; } char* GetAuxValue(const char* aux, const char* name) { if (isempty(aux)) return NULL; char* descr = strdup(aux); char* beginaux = strstr(descr, ""); char* endaux = strstr(descr, ""); if (!beginaux || !endaux) { free(descr); return NULL; } beginaux += 11; // strlen(""); endaux[0] = 0; memmove(descr, beginaux, endaux - beginaux + 1); if (strcmp(name, "epgsearch") == 0) return descr; // full aux int namelen = strlen(name); char catname[100] = ""; catname[0] = '<'; memcpy(catname + 1, name, namelen); catname[1 + namelen] = '>'; catname[2 + namelen] = 0; char* cat = strcasestr(descr, catname); if (!cat) { free(descr); return NULL; } cat += namelen + 2; char* end = strstr(cat, "Info()) return NULL; return GetAuxValue(recording->Info()->Aux(), name); } char* GetAuxValue(const cTimer *timer, const char* name) { if (!timer || !timer->Aux()) return NULL; return GetAuxValue(timer->Aux(), name); } string UpdateAuxValue(string aux, string section, long num) { return UpdateAuxValue(aux, section, NumToString(num)); } string UpdateAuxValue(string aux, string section, string value) { string secStart = "<" + section + ">"; string secEnd = ""; int valueStartPos = aux.find(secStart); int valueEndPos = aux.find(secEnd); if (valueStartPos >= 0 && valueEndPos >= 0) aux.replace(valueStartPos + secStart.size(), valueEndPos - valueStartPos - secStart.size(), value); else aux += secStart + value + secEnd; return aux; } // replace s1 with s2 in s ignoring the case of s1 char *strreplacei(char *s, const char *s1, const char *s2) { char *p = strcasestr(s, s1); if (p) { int of = p - s; int l = strlen(s); int l1 = strlen(s1); int l2 = 0; if (s2) l2 = strlen(s2); if (l2 > l1) s = (char *)realloc(s, l + l2 - l1 + 1); if (l2 != l1) memmove(s + of + l2, s + of + l1, l - of - l1 + 1); memcpy(s + of, s2, l2); } return s; } std::string strreplace( std::string& result, const std::string& replaceWhat, const std::string& replaceWithWhat) { while(1) { const int pos = result.find(replaceWhat); if (pos==-1) break; result.replace(pos,replaceWhat.size(),replaceWithWhat); } return result; } void sleepMSec(long ms) { cCondWait::SleepMs(ms); } void sleepSec(long s) { sleepMSec(s * 1000); } bool SendViaSVDRP(cString SVDRPcmd) { bool bSuccess = true; cString cmdbuf; if (EPGSearchConfig.useExternalSVDRP) { cmdbuf = cString::sprintf("%s -p %d \"%s\"", cSVDRPClient::SVDRPSendCmd, EPGSearchConfig.SVDRPPort, *SVDRPcmd); FILE *p = popen(cmdbuf, "r"); if (p) pclose(p); else { LogFile.eSysLog("can't open pipe for command '%s'", *cmdbuf); bSuccess = false; } } else { cmdbuf = SVDRPcmd; cSVDRPClient client; if (!client.SendCmd(*cmdbuf)) { LogFile.eSysLog("command '%s' failed", *cmdbuf); bSuccess = false; } } return bSuccess; } int SendMsg(cString Message, bool confirm, int seconds, eMessageType messageType) { int Keys = Skins.QueueMessage(messageType, Message, seconds, confirm?seconds+2:0); return Keys; } bool InEditMode(const char* ItemText, const char* ItemName, const char* ItemValue) { bool bEditMode = true; // ugly solution to detect, if in edit mode char* value = strdup(ItemText); strreplace(value, ItemName, ""); strreplace(value, ":\t", ""); // for bigpatch strreplace(value, "\t", ""); if (strlen(value) == strlen(ItemValue)) bEditMode = false; free(value); return bEditMode; } // checks if the timer was triggered from a search timer and return a pointer to the search cSearchExt* TriggeredFromSearchTimer(const cTimer* timer) { char* searchID = GetAuxValue(timer, "s-id"); if (!searchID) return NULL; cSearchExt* search = SearchExts.GetSearchFromID(atoi(searchID)); free(searchID); return search; } int TriggeredFromSearchTimerID(const cTimer* timer) { cSearchExt* trigger = TriggeredFromSearchTimer(timer); if (trigger) return trigger->ID; else return -1; } double FuzzyMatch(const char* s1, const char* s2, int maxLength) { Distance D; int dist = D.LD (s1, s2, maxLength); double fMaxLength = max(strlen(s1), strlen(s2)); return (fMaxLength - dist)/fMaxLength; } bool DescriptionMatches(const char* eDescr, const char* rDescr, int matchLimit) { if (eDescr == NULL && rDescr == NULL) return true; if (eDescr == NULL && rDescr != NULL) return false; if (eDescr != NULL && rDescr == NULL) return false; int l_eDescr = strlen(eDescr); int l_rDescr = strlen(rDescr); if (l_eDescr == l_rDescr && strcmp(eDescr, rDescr) == 0) return true; // partial match: // first check the length, should only be different at match limit int minLength = min(l_eDescr, l_rDescr); int maxLength = max(l_eDescr, l_rDescr); if (100*double(minLength)/double(maxLength) < matchLimit) return false; // last try with Levenshtein Distance, only compare the first 1000 chars double fMatch = FuzzyMatch(eDescr, rDescr, 1000); double tmp_matchlimit = matchLimit/100.0; if(maxLength - minLength < 5 && matchLimit < 95) { tmp_matchlimit = 0.95; LogFile.Log(2,"difference between both descriptions is < 5 setting matchlimit to: %.2f %%", tmp_matchlimit*100); } if (fMatch > tmp_matchlimit) { LogFile.Log(2,"match is: %.2f %%", fMatch*100); return true; } return false; } const cEvent* GetEvent(cTimer* timer) { const cEvent* event = NULL; const cChannel *channel = timer->Channel(); time_t Time = timer->StartTime() + (timer->StopTime() - timer->StartTime()) / 2; for (int seconds = 0; seconds <= 3; seconds++) { { cSchedulesLock SchedulesLock; const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); if (Schedules) { const cSchedule *Schedule = Schedules->GetSchedule(channel->GetChannelID()); if (Schedule) { event = Schedule->GetEventAround(Time); if (event) return event; } } } if (seconds == 0) LogFile.Log(2,"waiting for EPG info..."); sleepSec(1); } LogFile.Log(1,"no EPG info available"); return NULL; } // this extracts the real description from a given epg entry cutting all that looks like a category line // we assume that a category has a name not longer than MAXCATNAMELENGTH and a value not longer than // MAXCATVALUELENGTH (so in most cases e.g. the 'cast' category will stay part of the description). name and // value are separated with ': ' #define MAXCATNAMELENGTH 40 #define MAXCATVALUELENGTH 60 char* GetRawDescription(const char* descr) { if (!descr || !*descr) return NULL; char* rawDescr = (char*) calloc(strlen(descr)+1, sizeof(char)); const char* tmp = descr; while(tmp) { // extract a single line const char* lf = strchr(tmp, '\n'); char* line = NULL; if (lf) line = strndup(tmp, lf-tmp); else line = strdup(tmp); // if (lf) *lf = 0; // check for category char* delim = strstr(line, ": "); if (!delim || (delim && (delim - line > MAXCATNAMELENGTH || strlen(line) - (delim - line) + 2 > MAXCATVALUELENGTH))) if (*line) strcat(rawDescr, line); if (lf) tmp += strlen(line)+1; else tmp = NULL; free(line); } return rawDescr; } void PrepareTimerFile(const cEvent* event, cTimer* timer) { if (!event) return; if (EPGSearchConfig.addSubtitleToTimer == addSubtitleNever && strlen(EPGSearchConfig.defrecdir) == 0) // nothing to do return; if (!isempty(event->ShortText())) // add subtitle if present { bool addSubtitle = (EPGSearchConfig.addSubtitleToTimer != addSubtitleNever); if (EPGSearchConfig.addSubtitleToTimer == addSubtitleSmart) if (event->Duration() > 80*60) addSubtitle = false; if (addSubtitle) { char tmp[MaxFileName] = ""; snprintf(tmp, MaxFileName, "%s~%s", event->Title(), event->ShortText()); timer->SetFile(tmp); } } if (strlen(EPGSearchConfig.defrecdir) > 0) { char directory[MaxFileName] = ""; strn0cpy(directory, EPGSearchConfig.defrecdir,sizeof(directory)); cVarExpr varExprDir(directory); if (!varExprDir.DependsOnVar("%title%", event)) { strcat(directory, "~"); strcat(directory, timer->File()); } // parse the epxression and evaluate it cVarExpr varExpr(directory); strcpy(directory, varExpr.Evaluate(event).c_str()); if (strchr(directory, '%') == NULL) // only set directory to new value if all categories could have been replaced timer->SetFile(directory); } } bool EventsMatch(const cEvent* event1, const cEvent* event2, bool compareTitle, int compareSubtitle, bool compareSummary, int compareDate, unsigned long catvaluesAvoidRepeat, int matchLimit) { if (!event1 || !event2) return false; if (event1 == event2) return true; // only compare the alphanumeric portions string Title1 = ""; string Title2 = ""; if (compareTitle) { string s1 = event1->Title()?event1->Title():""; string s2 = event2->Title()?event2->Title():""; Title1 = GetAlNum(s1); Title2 = GetAlNum(s2); std::transform(Title1.begin(), Title1.end(), Title1.begin(), tolower); std::transform(Title2.begin(), Title2.end(), Title2.begin(), tolower); } string Subtitle1 = ""; string Subtitle2 = ""; if (compareSubtitle) { string s1 = event1->ShortText()?event1->ShortText():""; string s2 = event2->ShortText()?event2->ShortText():""; Subtitle1 = GetAlNum(s1); Subtitle2 = GetAlNum(s2); std::transform(Subtitle1.begin(), Subtitle1.end(), Subtitle1.begin(), tolower); std::transform(Subtitle2.begin(), Subtitle2.end(), Subtitle2.begin(), tolower); } string compareExpression = ""; if (compareDate == 1) compareExpression = "%date%"; if (compareDate == 2) compareExpression = "%year%-%week%"; if (compareDate == 3) compareExpression = "%year%-%month%"; bool match = false; if ((!compareTitle || Title1 == Title2) && (!compareSubtitle || (Subtitle1 == Subtitle2 && Subtitle1!=""))) { const char* Descr1 = event1->Description(); const char* Descr2 = event2->Description(); if (compareSummary) { char* rawDescr1 = GetRawDescription(Descr1); char* rawDescr2 = GetRawDescription(Descr2); match = DescriptionMatches(rawDescr1, rawDescr2, matchLimit); free(rawDescr1); free(rawDescr2); if (!match) return false; } if (compareExpression.size() > 0) { cVarExpr varExpr(compareExpression); string resEvent1 = varExpr.Evaluate(event1); string resEvent2 = varExpr.Evaluate(event2); if (resEvent1 != resEvent2) return false; } if (catvaluesAvoidRepeat != 0) // check categories { bool bCatMatch = ((Descr1 && Descr2) || (!Descr1 && !Descr2)); cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (catvaluesAvoidRepeat > 0 && SearchExtCat && bCatMatch) { if (catvaluesAvoidRepeat & (1<name, SearchExtCat->format); char* CatValue2 = GetExtEPGValue(Descr2, SearchExtCat->name, SearchExtCat->format); if ((!CatValue1 && CatValue2) || (!CatValue2 && CatValue1) || (CatValue1 && CatValue2 && strcmp(CatValue1, CatValue2) != 0)) bCatMatch = false; free(CatValue1); free(CatValue2); } SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } if (bCatMatch) match = true; } else match = true; } return match; } int ChannelNrFromEvent(const cEvent* pEvent) { if (!pEvent) return -1; cChannel* channel = Channels.GetByChannelID(pEvent->ChannelID(), true, true); if (!channel) return -1; else return channel->Number(); } void DelTimer(int index) { cString cmdbuf = cString::sprintf("DELT %d", index); LogFile.Log(2, "delete timer %d", index); SendViaSVDRP(cmdbuf); gl_timerStatusMonitor->SetConflictCheckAdvised(); } char* FixSeparators(char* buffer, char sep) { int l = strlen(buffer); char *dest = buffer; for (int i = 0; i < l; i ++) { char c = buffer[i]; int j = i; if (c == sep) { for (j = i + 1; (j < l) & (buffer[j] == ' '); j++) ; if ((j <= l) | (i + 1 < j)) { switch (buffer[j]) { case '\t': i = j; c = '\t'; break; case 0: i = j; c = 0; break; default: break; } } } if (c == '\t') { for (; (j < l) & (buffer[j] == ' '); j++) ; if (j < l && buffer[j] == sep) { buffer[j] = '\t'; i = j - 1; continue; } } *dest++ = c; } *dest = 0; return buffer; } cString DateTime(time_t t) { char buffer[32]; if (t == 0) time(&t); struct tm tm_r; tm *tm = localtime_r(&t, &tm_r); snprintf(buffer, sizeof(buffer), "%02d.%02d. %02d:%02d", tm->tm_mday, tm->tm_mon + 1, tm->tm_hour, tm->tm_min); return buffer; } string NumToString(long num) { ostringstream os; os << num; return os.str(); } int FindIgnoreCase(const string& expr, const string& query) { const char *p = expr.c_str(); const char *r = strcasestr(p, query.c_str()); if (!r) return -1; return r - p; } bool EqualsNoCase(const string& a, const string& b) { return strcasecmp(a.c_str(), b.c_str()) == 0; } string Strip(const string& input) { string str = input; string::size_type pos = str.find_last_not_of(' '); if(pos != string::npos) { str.erase(pos + 1); pos = str.find_first_not_of(' '); if(pos != string::npos) str.erase(0, pos); } else str.erase(str.begin(), str.end()); return str; } string GetAlNum(const string& s) { string res; for(unsigned int i=0; i= 0) result.replace(pos, what.size(), with); return result; } string EscapeString(const string& S) { string tmp = S; int apostrophPos = 0; int apostrophTempPos = 0; while((apostrophPos = tmp.find("'", apostrophTempPos)) >= apostrophTempPos) { tmp.replace(apostrophPos, 1, "'\"'\"'"); apostrophTempPos = apostrophPos + 5; } return tmp; } string QuoteApostroph(const string& S) { string tmp = S; int apostrophPos = 0; int apostrophTempPos = 0; while((apostrophPos = tmp.find("\"", apostrophTempPos)) >= apostrophTempPos) { tmp.replace(apostrophPos, 1, "\\\""); apostrophTempPos = apostrophPos + 2; } return tmp; } string MD5(const string& input) { char* szInput = strdup(input.c_str()); if (!szInput) return ""; char* szRes = MD5String(szInput); string res = szRes; free(szRes); return res; } void SetAux(cTimer* timer, string aux) { if (!timer) return; string timerText = *timer->ToText(); string::size_type auxPos = string::npos; for(int i=0; i<=7; i++) // get aux value auxPos = timerText.find(":", auxPos == string::npos?0:auxPos+1); if (auxPos == string::npos) return; timerText.replace(auxPos+1, timerText.size()-auxPos+1, aux); timer->Parse(timerText.c_str()); } int msprintf(char **strp, const char *fmt, ...) { va_list ap; va_start (ap, fmt); int res=vasprintf (strp, fmt, ap); va_end (ap); return res; } std::string GetCodeset() { // Taken from VDR's vdr.c char *CodeSet = NULL; if (setlocale(LC_CTYPE, "")) CodeSet = nl_langinfo(CODESET); else { char *LangEnv = getenv("LANG"); // last resort in case locale stuff isn't installed if (LangEnv) { CodeSet = strchr(LangEnv, '.'); if (CodeSet) CodeSet++; // skip the dot } } if (CodeSet) return std::string(CodeSet); else return "ISO-8859-15"; } /* Read a line from a socket */ ssize_t Readline(int sockd, char *vptr, size_t maxlen) { size_t n, rc; char c, *buffer; buffer = vptr; for ( n = 1; n < maxlen; n++ ) { if ( (rc = read(sockd, &c, 1)) == 1 ) { if ( c == '\n' ) break; *buffer++ = c; } else if ( rc == 0 ) { if ( n == 1 ) return 0; else break; } else { if ( errno == EINTR ) continue; return -1; } } *buffer = 0; return n; } /* Write a line to a socket */ ssize_t Writeline(int sockd, const char *vptr, ssize_t n) { ssize_t nleft; ssize_t nwritten; const char *buffer; buffer = vptr; nleft = n; while ( nleft > 0 ) { if ( (nwritten = write(sockd, buffer, nleft)) <= 0 ) { if ( errno == EINTR ) nwritten = 0; else return -1; } nleft -= nwritten; buffer += nwritten; } return n; } long getAddrFromString(const char* hostnameOrIp, struct sockaddr_in* addr) { unsigned long ip; struct hostent * he; if(hostnameOrIp==NULL || addr==NULL) return -1; ip=inet_addr(hostnameOrIp); if(ip!=INADDR_NONE) { addr->sin_addr.s_addr=ip; return 0; } else { he=gethostbyname(hostnameOrIp); if(he==NULL) return -1; else memcpy(&(addr->sin_addr),he->h_addr_list[0],4); return 0; } } #if VDRVERSNUM >= 10712 char *cCommand::result = NULL; cCommand::cCommand(void) { title = command = NULL; confirm = false; } cCommand::~cCommand() { free(title); free(command); } bool cCommand::Parse(const char *s) { const char *p = strchr(s, ':'); if (p) { int l = p - s; if (l > 0) { title = MALLOC(char, l + 1); stripspace(strn0cpy(title, s, l + 1)); if (!isempty(title)) { int l = strlen(title); if (l > 1 && title[l - 1] == '?') { confirm = true; title[l - 1] = 0; } command = stripspace(strdup(skipspace(p + 1))); return !isempty(command); } } } return false; } const char *cCommand::Execute(const char *Parameters) { free(result); result = NULL; cString cmdbuf; if (Parameters) cmdbuf = cString::sprintf("%s %s", command, Parameters); const char *cmd = *cmdbuf ? *cmdbuf : command; dsyslog("executing command '%s'", cmd); cPipe p; if (p.Open(cmd, "r")) { int l = 0; int c; while ((c = fgetc(p)) != EOF) { if (l % 20 == 0) result = (char *)realloc(result, l + 21); result[l++] = char(c); } if (result) result[l] = 0; p.Close(); } else esyslog("ERROR: can't open pipe for command '%s'", cmd); return result; } #endif vdr-plugin-epgsearch/menu_conflictcheck.c0000644000175000017500000003222312466747543020443 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include "menu_conflictcheck.h" #include "menu_commands.h" #include "menu_event.h" #include "conflictcheck.h" #include "timer_thread.h" #include using std::string; // --- cMenuConflictCheckItem ------------------------------------------------------- cMenuConflictCheckItem::cMenuConflictCheckItem(cConflictCheckTime* Ct, cConflictCheckTimerObj* TimerObj) { checktime = Ct; timerObj = TimerObj; cString buffer; if (!TimerObj) // print header { struct tm tm_r; const time_t t = checktime->evaltime; tm *tm = localtime_r(&t, &tm_r); char dateshort[7] = ""; strftime(dateshort, sizeof(dateshort), "%d.%m.", tm); buffer = cString::sprintf("%s\t%s %s", WEEKDAYNAME(t), dateshort, TIMESTRING(t)); SetSelectable(false); } else { cTimer* t = timerObj->timer; int recPart = timerObj->recDuration * 100 / (timerObj->stop - timerObj->start); buffer = cString::sprintf("%d\t%s\t%d\t%2d%%\t%s", t->Channel()->Number(), t->Channel()->ShortName(true), t->Priority(), recPart, t->File()); } SetText(buffer); } // --- cMenuConflictCheck ------------------------------------------------------- cMenuConflictCheck::cMenuConflictCheck() :cOsdMenu("", 4, 12, 4, 5, 30) { #if VDRVERSNUM >= 10734 SetMenuCategory(mcTimerEdit); #endif showAll = false; lastSel = -1; BuildList(); Update(); } void cMenuConflictCheck::Update() { if (conflictCheck.numConflicts > 0) { if (conflictCheck.numConflicts==conflictCheck.relevantConflicts) SetHelp(conflictCheck.relevantConflicts?tr("Button$Details"):NULL, NULL, NULL, NULL); else if (showAll) SetHelp(tr("Button$Details"), NULL, NULL, tr("Button$Filter")); else SetHelp(conflictCheck.relevantConflicts?tr("Button$Details"):NULL, NULL, NULL, tr("Button$Show all")); } else SetHelp(NULL, NULL, NULL, NULL); cString buffer = cString::sprintf("%s - %d/%d %s", tr("Timer conflicts"), showAll?conflictCheck.numConflicts:conflictCheck.relevantConflicts, conflictCheck.numConflicts, tr("conflicts")); SetTitle(buffer); Display(); } bool cMenuConflictCheck::BuildList() { Clear(); conflictCheck.Check(); if ((showAll && conflictCheck.numConflicts > 0) || conflictCheck.relevantConflicts > 0) { cList* failedList = conflictCheck.GetFailed(); for(cConflictCheckTime* ct = failedList->First(); ct; ct = failedList->Next(ct)) { if (!showAll && ct->ignore) continue; Add(new cMenuConflictCheckItem(ct)); std::set::iterator it; for (it = ct->failedTimers.begin(); it != ct->failedTimers.end(); ++it) if (!(*it)->ignore || showAll) Add(new cMenuConflictCheckItem(ct, *it)); } } else { cOsdItem* pInfoItem = new cOsdItem(conflictCheck.numConflicts==0?tr("no conflicts!"):tr("no important conflicts!")); pInfoItem->SetSelectable(false); Add(pInfoItem); } SetCurrent(Get(lastSel)); return false; } cConflictCheckTimerObj* cMenuConflictCheck::CurrentTimerObj(void) { cMenuConflictCheckItem *item = (cMenuConflictCheckItem *)Get(Current()); return (item && item->Selectable())? item->timerObj : NULL; } eOSState cMenuConflictCheck::ProcessKey(eKeys Key) { bool HadSubMenu = HasSubMenu(); eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: if (Count() == 1) return osBack; case kRed: if (CurrentTimerObj()) state = AddSubMenu(new cMenuConflictCheckDetails(CurrentTimerObj(), &conflictCheck)); break; case kBlue: showAll = !showAll; BuildList(); Update(); state = osContinue; break; default: break; } } if (HadSubMenu && !HasSubMenu()) // Update conflict list { lastSel = Current(); BuildList(); Update(); } return state; } // --- cMenuConflictCheckDetailsItem ------------------------------------------------------- cMenuConflictCheckDetailsItem::cMenuConflictCheckDetailsItem(cConflictCheckTimerObj* TimerObj) { timerObj = TimerObj; hasTimer = timerObj->OrigTimer()?timerObj->OrigTimer()->HasFlags(tfActive):false; Update(true); } bool cMenuConflictCheckDetailsItem::Update(bool Force) { bool oldhasTimer = hasTimer; hasTimer = timerObj->OrigTimer()?timerObj->OrigTimer()->HasFlags(tfActive):false; if (Force || hasTimer != oldhasTimer) { cTimer* timer = timerObj->timer; char device[2]=""; if (hasTimer) { if (!timerObj->conflCheckTime && timerObj->device > -1) sprintf(device, "%d", timerObj->device+1); else strcpy(device, tr("C")); } cString buffer = cString::sprintf("%s\t%d\t%s - %s\t%d\t%s\t%s", hasTimer?">":"", timer->Channel()->Number(), TIMESTRING(timerObj->start), TIMESTRING(timerObj->stop), timer->Priority(), device, timer->File()); SetText(buffer); } return true; } // --- cMenuConflictCheckDetails ------------------------------------------------------- cMenuConflictCheckDetails::cMenuConflictCheckDetails(cConflictCheckTimerObj* TimerObj, cConflictCheck* ConflictCheck) :cOsdMenu(tr("Timer conflicts"), 2, 4, 13, 3, 2) { #if VDRVERSNUM >= 10734 SetMenuCategory(mcTimerEdit); #endif timerObj = TimerObj; checktime = timerObj->conflCheckTime; conflictCheck = ConflictCheck; BuildList(); SetHelpKeys(); int recPart = timerObj->recDuration * 100 / (timerObj->stop - timerObj->start); cString buffer = cString::sprintf("%s - %s - %d%%", DATESTRING(checktime->evaltime), TIMESTRING(checktime->evaltime), recPart); SetTitle(buffer); } bool cMenuConflictCheckDetails::BuildList() { Clear(); int sel = -1; std::set::iterator it; if (timerObj->concurrentTimers) for (it = timerObj->concurrentTimers->begin(); it != timerObj->concurrentTimers->end(); ++it) { Add(new cMenuConflictCheckDetailsItem(*it)); if ((*it)->Event()) eventObjects.Add((*it)->Event()); if ((*it) == timerObj) sel = Count()-1; } SetCurrent(Get(sel)); return true; } void cMenuConflictCheckDetails::SetHelpKeys() { cConflictCheckTimerObj* curTimerObj = CurrentTimerObj(); bool hasTimer = true; bool hasEvent = false; if (curTimerObj) { hasTimer = curTimerObj->timer->HasFlags(tfActive); hasEvent = curTimerObj->Event(); } SetHelp(hasEvent?tr("Button$Repeats"):NULL, trVDR("Button$On/Off"), hasTimer?trVDR("Button$Delete"):NULL, tr("Button$Commands")); } cConflictCheckTimerObj* cMenuConflictCheckDetails::CurrentTimerObj(void) { cMenuConflictCheckDetailsItem *item = (cMenuConflictCheckDetailsItem *)Get(Current()); return item ? item->timerObj : NULL; } eOSState cMenuConflictCheckDetails::Commands(eKeys Key) { if (HasSubMenu() || Count() == 0) return osContinue; cConflictCheckTimerObj* curTimerObj = CurrentTimerObj(); if (curTimerObj && curTimerObj->Event()) { cMenuSearchCommands *menu; eOSState state = AddSubMenu(menu = new cMenuSearchCommands(tr("EPG Commands"), curTimerObj->Event(), true)); if (Key != kNone) state = menu->ProcessKey(Key); return state; } return osContinue; } eOSState cMenuConflictCheckDetails::ToggleTimer(cConflictCheckTimerObj* TimerObj) { if (!TimerObj || !TimerObj->OrigTimer()) return osContinue; TimerObj->OrigTimer()->OnOff(); Timers.SetModified(); Update(); Display(); return osContinue; } bool cMenuConflictCheckDetails::Update(bool Force) { bool result = false; for (cOsdItem *item = First(); item; item = Next(item)) { if (item->Selectable() && ((cMenuConflictCheckDetailsItem *)item)->Update(Force)) result = true; } return result; } eOSState cMenuConflictCheckDetails::DeleteTimer(cConflictCheckTimerObj* TimerObj) { cTimer* timer = TimerObj->OrigTimer(); // Check if this timer is active: if (timer) { if (Interface->Confirm(trVDR("Delete timer?"))) { if (timer->Recording()) { if (Interface->Confirm(trVDR("Timer still recording - really delete?"))) { timer->Skip(); cRecordControls::Process(time(NULL)); } else return osContinue; } LogFile.iSysLog("deleting timer %s", *timer->ToDescr()); Timers.Del(timer); cOsdMenu::Del(Current()); Timers.SetModified(); Display(); return osBack; } } return osContinue; } eOSState cMenuConflictCheckDetails::ShowSummary() { cConflictCheckTimerObj* curTimerObj = CurrentTimerObj(); if (!curTimerObj) return osContinue; const cEvent *ei = curTimerObj->Event(); if (ei) { cChannel *channel = Channels.GetByChannelID(ei->ChannelID(), true, true); if (channel) return AddSubMenu(new cMenuEventSearchSimple(ei, eventObjects)); } return osContinue; } void cMenuConflictCheckDetails::UpdateCurrent() { cEventObj* cureventObj = eventObjects.GetCurrent(); if (cureventObj && cureventObj->Event()) for (cMenuConflictCheckDetailsItem *item = (cMenuConflictCheckDetailsItem *)First(); item; item = (cMenuConflictCheckDetailsItem *)Next(item)) if (item->Selectable() && item->timerObj && item->timerObj->Event() == cureventObj->Event()) { cureventObj->Select(false); SetCurrent(item); Display(); break; } } eOSState cMenuConflictCheckDetails::ProcessKey(eKeys Key) { bool HadSubMenu = HasSubMenu(); eOSState state = cOsdMenu::ProcessKey(Key); if (!HasSubMenu() && HadSubMenu) // navigation in summary could have changed current item, so update it UpdateCurrent(); if (state == osUnknown) { switch (Key) { case k1...k9: if (!HasSubMenu()) return Commands(Key); else state = osContinue; break; case kOk: if (!HasSubMenu()) return ShowSummary(); else state = osContinue; break; case kRed: if(!HasSubMenu()) { if (CurrentTimerObj() && CurrentTimerObj()->Event()) return Commands(k1); else state = osContinue; } else state = osContinue; break; case kGreen: if(!HasSubMenu()) state = ToggleTimer(CurrentTimerObj()); break; case kYellow: if(!HasSubMenu()) state = DeleteTimer(CurrentTimerObj()); break; case kBlue: if(!HasSubMenu()) { if (CurrentTimerObj() && CurrentTimerObj()->Event()) return AddSubMenu(new cMenuSearchCommands(tr("EPG Commands"),CurrentTimerObj()->Event())); else state = osContinue; } else state = osContinue; break; default: break; } } if (!HasSubMenu()) { // perhaps a timer was deleted, so first check this if (conflictCheck) { std::set::iterator it; if (timerObj->concurrentTimers) { for (it = timerObj->concurrentTimers->begin(); it != timerObj->concurrentTimers->end(); ++it) { bool found = false; for(cTimer* checkT = Timers.First(); checkT; checkT = Timers.Next(checkT)) { checkT->Matches(); if (checkT == (*it)->OrigTimer()) // ok -> found, check for changes { if (checkT->IsSingleEvent()) { if (checkT->StartTime() == (*it)->start && checkT->StopTime() == (*it)->stop) { found = true; break; } } else // repeating timer { if (checkT->DayMatches((*it)->start)) // same day? { int begin = cTimer::TimeToInt(checkT->Start()); // seconds from midnight int length = cTimer::TimeToInt(checkT->Stop()) - begin; if (length < 0) length += SECSINDAY; time_t Start = cTimer::SetTime((*it)->start, cTimer::TimeToInt(checkT->Start())); if (Start == (*it)->start && (*it)->stop == (*it)->start + length) found = true; } } } } if (!found) return osBack; } } } if (Key != kNone) SetHelpKeys(); if ((HadSubMenu || gl_TimerProgged) && Update(true)) { if (gl_TimerProgged) // when using epgsearch's timer edit menu, update is delayed because of SVDRP { gl_TimerProgged = 0; SetHelpKeys(); } Display(); } } return state; } vdr-plugin-epgsearch/menu_timersdone.c0000644000175000017500000001464212466747543020022 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "menu_timersdone.h" #include "epgsearchtools.h" int sortModeTimerDone = 0; cMenuTimerDoneItem::cMenuTimerDoneItem(cTimerDone* TimerDone) { timerDone = TimerDone; Set(); } void cMenuTimerDoneItem::Set(void) { if (!timerDone) return; char *buffer = NULL; char buf[32]; struct tm tm_r; tm *tm = localtime_r(&timerDone->start, &tm_r); strftime(buf, sizeof(buf), "%d.%m.%y %H:%M", tm); const cChannel* ch = Channels.GetByChannelID(timerDone->channelID, true, true); msprintf(&buffer, "%d\t%s\t%s~%s", ch?ch->Number():0, buf, timerDone->title.c_str(), timerDone->shorttext.c_str()); SetText(buffer, false); } int cMenuTimerDoneItem::Compare(const cListObject &ListObject) const { cMenuTimerDoneItem *p = (cMenuTimerDoneItem *)&ListObject; if (sortModeTimerDone == 0) // sort by Date if (timerDone->start > p->timerDone->start) return 1; else return -1; else { cString s1 = cString::sprintf("%s~%s", timerDone->title.c_str(), timerDone->shorttext.c_str()); cString s2 = cString::sprintf("%s~%s", p->timerDone->title.c_str(), p->timerDone->shorttext.c_str()); int res = strcasecmp(s1, s2); return res; } } // --- cMenuTimersDone ---------------------------------------------------------- cMenuTimersDone::cMenuTimersDone(cSearchExt* Search) :cOsdMenu("", 4, 15) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcTimer); #endif search = Search; showAll = true; sortModeTimerDone = 0; if (search) showAll = false; Set(); Display(); } void cMenuTimersDone::Set() { Clear(); eventObjects.Clear(); cMutexLock TimersDoneLock(&TimersDone); cTimerDone* timerDone = TimersDone.First(); while (timerDone) { if (showAll || (!showAll && search && timerDone->searchID == search->ID)) Add(new cMenuTimerDoneItem(timerDone)); timerDone = TimersDone.Next(timerDone); } UpdateTitle(); SetHelp(sortModeTimerDone==0?tr("Button$by name"):tr("Button$by date"), tr("Button$Delete all"), trVDR("Button$Delete"), showAll?search->search:tr("Button$Show all")); Sort(); cMenuTimerDoneItem* item = (cMenuTimerDoneItem*)First(); while(item) { if (item->timerDone) { const cEvent* Event = item->timerDone->GetEvent(); if (Event) eventObjects.Add(Event); } item = (cMenuTimerDoneItem*)Next(item); } } void cMenuTimersDone::UpdateCurrent() { // navigation in summary could have changed current item, so update it cEventObj* cureventObj = eventObjects.GetCurrent(); if (cureventObj && cureventObj->Event()) for (cMenuTimerDoneItem *item = (cMenuTimerDoneItem *)First(); item; item = (cMenuTimerDoneItem *)Next(item)) if (item->Selectable() && item->timerDone->GetEvent() == cureventObj->Event()) { cureventObj->Select(false); SetCurrent(item); Display(); break; } } cTimerDone *cMenuTimersDone::CurrentTimerDone(void) { cMenuTimerDoneItem *item = (cMenuTimerDoneItem *)Get(Current()); return item ? item->timerDone : NULL; } void cMenuTimersDone::UpdateTitle() { cString buffer = cString::sprintf("%d %s%s%s", Count(), tr("Timers"), showAll?"":" ", showAll?"":search->search); SetTitle(buffer); Display(); } eOSState cMenuTimersDone::Delete(void) { cTimerDone *curTimerDone = CurrentTimerDone(); if (curTimerDone) { if (Interface->Confirm(tr("Edit$Delete entry?"))) { LogFile.Log(1,"deleted timer done: '%s~%s'", curTimerDone->title!=""?curTimerDone->title.c_str():"unknown title", curTimerDone->shorttext!=""?curTimerDone->shorttext.c_str():"unknown subtitle"); cMutexLock TimersDoneLock(&TimersDone); TimersDone.Del(curTimerDone); TimersDone.Save(); cOsdMenu::Del(Current()); Display(); UpdateTitle(); } } return osContinue; } eOSState cMenuTimersDone::DeleteAll(void) { if (Interface->Confirm(tr("Edit$Delete all entries?"))) { cMutexLock TimersDoneLock(&TimersDone); while(Count()>0) { cMenuTimerDoneItem *item = (cMenuTimerDoneItem *)Get(0); if (!item) break; cTimerDone *curTimerDone = item->timerDone; TimersDone.Del(curTimerDone); cOsdMenu::Del(0); } TimersDone.Save(); Display(); UpdateTitle(); } return osContinue; } eOSState cMenuTimersDone::ProcessKey(eKeys Key) { bool HadSubMenu = HasSubMenu(); eOSState state = cOsdMenu::ProcessKey(Key); if (!HasSubMenu() && HadSubMenu) UpdateCurrent(); if (state == osUnknown) { switch (Key) { case kGreen: state = DeleteAll(); break; case kYellow: state = Delete(); break; case kBlue: if(!HasSubMenu()) { showAll = !showAll; Set(); Display(); } break; case k0: case kRed: if(!HasSubMenu()) { sortModeTimerDone = 1-sortModeTimerDone; Set(); Display(); } break; case k8: return osContinue; case kOk: { cTimerDone *TimerDone = CurrentTimerDone(); if (TimerDone) { const cEvent* Event = TimerDone->GetEvent(); if (!Event) break; return AddSubMenu(new cMenuEventSearchSimple(Event, eventObjects)); } } default: break; } } return state; } vdr-plugin-epgsearch/conflictcheck.h0000644000175000017500000002365412466747543017434 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCHCONFLCH_H #define __EPGSEARCHCONFLCH_H #include "epgsearchtools.h" #include #include #include #include #define DO_MULTIPLE_RECORDINGS 1 #define DO_REC_AND_PLAY_ON_PRIMARY_DEVICE 1 class cConflictCheckTime; class TimerObjSort; // --- cConflictCheckTimerObj -------------------------------------------------------- class cConflictCheckTimerObj : public cTimerObj { const cEvent* event; public: time_t start; time_t stop; int device; int origIndex; int recDuration; time_t lastRecStart; time_t lastRecStop; cConflictCheckTime* conflCheckTime; std::set* concurrentTimers; bool ignore; cConflictCheckTimerObj(cTimer* Timer, time_t Start, time_t Stop, int Device = -1, int OrigIndex=-1); ~cConflictCheckTimerObj(); int Compare(const cListObject &ListObject) const; const cEvent* Event(); const cEvent* SetEventFromSchedule(); int Matches(const cEvent *Event, int *Overlap) const; cTimer* OrigTimer() {return Timers.GetTimer(timer); } }; class TimerObjSort { public: bool operator() (cConflictCheckTimerObj* a, cConflictCheckTimerObj* b) { return (a->Compare(*b) < 0); } }; // --- cConflictCheckTime -------------------------------------------------------- class cConflictCheckTime : public cListObject { public: time_t evaltime; std::set startingTimers; std::set stoppingTimers; std::set failedTimers; std::set concurrentRecs; bool ignore; cConflictCheckTime(time_t EvalTime) : evaltime(EvalTime), ignore(false) {} int Compare(const cListObject &ListObject) const { cConflictCheckTime *p = (cConflictCheckTime *)&ListObject; return evaltime - p->evaltime; } }; // --- cConflictCheckDevice -------------------------------------------------------- // This class tries to emulate the behaviour of a DVB device // NOTE: The case device == NULL is only for debugging purposes class cConflictCheckDevice { public: std::set recTimers; cDevice* device; int devicenr; std::vector bondedDevices; cConflictCheckDevice() { device = NULL; devicenr = 0; } int Priority() const { int prio = -1; for(std::set::iterator it = recTimers.begin(); it != recTimers.end(); ++it) prio = max(prio, (*it)->timer->Priority()); return prio; }; int CardIndex(void) const { if (device) return device->CardIndex(); else return devicenr;} bool Receiving() const { return !recTimers.empty(); } bool IsTunedTo (const cChannel* Channel) const { for(std::set::iterator it = recTimers.begin(); it != recTimers.end(); ++it) if ((*it)->timer->Channel()->Source() == Channel->Source() && (*it)->timer->Channel()->Transponder() == Channel->Transponder()) return true; return false; } bool HasDecoder() const { if (device) return device->HasDecoder(); else return (devicenr == 3); } bool HasCi() const { if (device) return device->HasCi(); else return (devicenr == 3); } bool IsPrimaryDevice() const { if (device) return device->IsPrimaryDevice(); else return (devicenr == 3); } bool ProvidesSource(int Source) const { if (device) return device->ProvidesSource(Source); else { // int type = Source & cSource::st_Mask; // if (devicenr == 0) return type == cSource::stCable; // if (devicenr > 0) return type == cSource::stTerr; // return false; return true; } } cCamSlot *CamSlot(void) const { if (device) return device->CamSlot(); else return NULL;} int Ca() const { for(std::set::iterator it = recTimers.begin(); it != recTimers.end(); ++it) return (*it)->timer->Channel()->Ca(); return 0; } bool HasPid(int Pid) const { return true; } bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const { bool result = false; bool hasPriority = Priority < 0 || Priority > this->Priority(); bool needsDetachReceivers = false; if (ProvidesSource(Channel->Source())) { result = hasPriority; if (Priority >= 0 && Receiving()) { if (IsTunedTo(Channel)) { if ((Channel->Vpid() && !HasPid(Channel->Vpid())) || (Channel->Apid(0) && !HasPid(Channel->Apid(0)))) { #ifdef DO_MULTIPLE_RECORDINGS if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) { if (CamSlot()->CanDecrypt(Channel)) result = true; else needsDetachReceivers = true; } else if (!IsPrimaryDevice()) result = true; #ifdef DO_REC_AND_PLAY_ON_PRIMARY_DEVICE else #if APIVERSNUM < 10725 result = Priority >= Setup.PrimaryLimit; #else result = Priority >= 0; #endif #endif #endif } else #if APIVERSNUM < 10725 result = !IsPrimaryDevice() || Priority >= Setup.PrimaryLimit; #else result = !IsPrimaryDevice() || Priority >= 0; #endif } else needsDetachReceivers = true; } } if (result) { if (!BondingOk(Channel)) { // This device is bonded, so we need to check the priorities of the others: for (size_t i=0; iPriority() >= Priority) { LogFile.Log(3, "Attached receiver to bonded device %i has higher priority.", bondedDevices[i]->CardIndex()+1); result = false; break; } } if (result) LogFile.Log(3, "Bonding ok, but detaches receiver on device %i.", CardIndex()); else LogFile.Log(3, "Bonding not okay on device %i.", CardIndex()); needsDetachReceivers = Receiving(); } else { LogFile.Log(3, "Bonding ok on device %i.", CardIndex()); } } if (NeedsDetachReceivers) *NeedsDetachReceivers = needsDetachReceivers; return result; } bool BondingOk(const cChannel *Channel) const { if (bondedDevices.empty()) return true; LogFile.Log(3, "Checking for bonding constraints on device %i", CardIndex()+1); cString BondingParams = GetBondingParams(Channel); for(size_t i=0; i< bondedDevices.size(); i++) { // bonding not okay, if a bonded devices records on another polarization or freq. band if (!bondedDevices[i]->recTimers.empty()) { if (strcmp(BondingParams, GetBondingParams((*bondedDevices[i]->recTimers.begin())->timer->Channel())) != 0) { LogFile.Log(3, "Bonded device %i has receiver attached. Not safe to use device.", bondedDevices[i]->CardIndex()+1); return false; } else { LogFile.Log(3, "Bonded device %i has receiver attached but its safe.", bondedDevices[i]->CardIndex()+1); } } else { LogFile.Log(3, "Bonded device %i has no receivers attached - ok.", bondedDevices[i]->CardIndex()+1); } } return true; } cString GetBondingParams(const cChannel *Channel) const //copied from cDVBTuner { #if APIVERSNUM > 10721 cDvbTransponderParameters dtp(Channel->Parameters()); if (Setup.DiSEqC) { if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, Channel->Source(), Channel->Frequency(), dtp.Polarization(), NULL)) return diseqc->Commands(); } else { bool ToneOff = Channel->Frequency() < Setup.LnbSLOF; bool VoltOff = dtp.Polarization() == 'V' || dtp.Polarization() == 'R'; return cString::sprintf("%c %c", ToneOff ? 't' : 'T', VoltOff ? 'v' : 'V'); } #endif return ""; } }; // --- cConflictCheck -------------------------------------------------------- class cConflictCheck { cList* timerList; cList* evaltimeList; cList* failedList; std::set pendingTimers; cConflictCheckDevice *devices; int numDevices; time_t maxCheck; std::vector camSlotStatusArray; public: int relevantConflicts; int numConflicts; time_t nextRelevantConflictDate; cConflictCheck(); ~cConflictCheck(); void InitDevicesInfo(); void Check(); void BondDevices(const char* bondings); cList* CreateCurrentTimerList(); cList* CreateEvaluationTimeList(cList*); cList* CreateConflictList(cList*, cList* timerList); int GetDevice(cConflictCheckTimerObj* TimerObj, bool *NeedsDetachReceivers); cList* GetFailed() { return failedList; } cList* GetTimers() { return timerList; } void AddConflict(cConflictCheckTimerObj* TimerObj, cConflictCheckTime* Checktime, std::set& pendingTimers); int ProcessCheckTime(cConflictCheckTime* checkTime); bool TimerInConflict(cTimer*); void EvaluateConflCheckCmd(); eModuleStatus CamSlotModuleStatus(cCamSlot *CamSlot); }; #endif vdr-plugin-epgsearch/menu_searchactions.h0000644000175000017500000000300312466747543020471 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCHACTIONS_H #define __EPGSEARCHACTIONS_H #include #include "epgsearchext.h" // --- cMenuSearchActions --------------------------------------------------------- class cMenuSearchActions : public cOsdMenu { private: cSearchExt* search; bool directCall; eOSState Search(void); eOSState OnOffSearchtimer(void); eOSState Execute(); public: cMenuSearchActions(cSearchExt* Search, bool DirectCall = false); virtual ~cMenuSearchActions(); virtual eOSState ProcessKey(eKeys Key); }; #endif vdr-plugin-epgsearch/menu_search.h0000644000175000017500000000256412466747543017123 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __MENU_SEARCH_H #define __MENU_SEARCH_H #include #include "epgsearchext.h" class cMenuEPGSearchExt : public cOsdMenu { private: eOSState New(void); eOSState Delete(void); eOSState Actions(eKeys Key); protected: virtual eOSState ProcessKey(eKeys Key); public: cMenuEPGSearchExt(); cSearchExt* CurrentSearchExt(void); void UpdateTitle(); }; #endif vdr-plugin-epgsearch/rcfile.c0000644000175000017500000000512712466747543016067 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include "rcfile.h" #include "log.h" cRCLine::cRCLine(void) { name = value = NULL; } cRCLine::cRCLine(const char *Name, const char *Value) { name = strdup(Name); value = strdup(Value); } cRCLine::~cRCLine() { free(name); free(value); } bool cRCLine::Parse(char *s) { char *p = strchr(s, '='); if (p) { *p = 0; char *Name = compactspace(s); char *Value = compactspace(p + 1); if (*Name) { name = strdup(Name); value = strdup(Value); return true; } } return false; } cRCFile::cRCFile() { ChannelNr = -1; SearchMode = 1; // default is 'AND' UseTitle = 1; UseSubtitle = 1; UseDescr = 1; strcpy(Search, ""); } bool cRCFile::Load(const char *FileName) { if (cConfig::Load(FileName, true)) { bool result = true; for (cRCLine *l = First(); l; l = Next(l)) { bool error = false; if (!Parse(l->Name(), l->Value())) error = true; if (error) { LogFile.eSysLog("ERROR: unknown parameter: %s = %s", l->Name(), l->Value()); result = false; } } return result; } return false; } bool cRCFile::Parse(const char *Name, const char *Value) { if (!strcasecmp(Name, "Search")) strn0cpy(Search, Value, MAXSTRINGLEN); else if (!strcasecmp(Name, "SearchMode")) SearchMode = atoi(Value); else if (!strcasecmp(Name, "ChannelNr")) ChannelNr = atoi(Value); else if (!strcasecmp(Name, "UseTitle")) UseTitle = atoi(Value); else if (!strcasecmp(Name, "UseSubtitle")) UseSubtitle = atoi(Value); else if (!strcasecmp(Name, "UseDescr")) UseDescr = atoi(Value); else return false; return true; } vdr-plugin-epgsearch/menu_deftimercheckmethod.c0000644000175000017500000001123612466747543021643 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifdef __FreeBSD__ #include #endif #include "menu_deftimercheckmethod.h" #include "menu_myedittimer.h" const char *cMenuDefTimerCheckMethod::CheckModes[3]; cDefTimerCheckModes DefTimerCheckModes; // -- cDefTimerCheckMode ----------------------------------------------------------------- bool cDefTimerCheckMode::Parse(const char *s) { char *line; char *pos; char *pos_next; int parameter = 1; int valuelen; #define MAXVALUELEN (10 * MaxFileName) char value[MAXVALUELEN]; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != '|') { pos_next = strchr(pos, '|'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MAXVALUELEN) { LogFile.eSysLog("entry '%s' is too long. Will be truncated!", pos); valuelen = MAXVALUELEN; } strn0cpy(value, pos, valuelen); pos = pos_next; switch (parameter) { case 1: channelID = tChannelID::FromString(value); break; case 2: mode = atol(value); break; default: break; } //switch } parameter++; } if (*pos) pos++; } //while free(line); return (parameter >= 2) ? true : false; } cString cDefTimerCheckMode::ToText(void) const { cString buffer = cString::sprintf("%s|%d", *channelID.ToString(), mode); return buffer; } bool cDefTimerCheckMode::Save(FILE *f) { if (mode == 0) return true; // don't save the default return fprintf(f, "%s\n", *ToText()) > 0; } int cDefTimerCheckModes::GetMode(const cChannel* channel) { if (!channel) return 0; tChannelID ChannelID = channel->GetChannelID(); for (cDefTimerCheckMode *defMode = First(); defMode; defMode = Next(defMode)) if (defMode->channelID == ChannelID) return defMode->mode; return 0; } void cDefTimerCheckModes::SetMode(const cChannel* channel, int mode) { if (!channel) return; tChannelID ChannelID = channel->GetChannelID(); for (cDefTimerCheckMode *defMode = First(); defMode; defMode = Next(defMode)) if (defMode->channelID == ChannelID) { defMode->mode = mode; return; } Add(new cDefTimerCheckMode(ChannelID, mode)); } // --- cMenuDefTimerCheckMethod --------------------------------------------------------- cMenuDefTimerCheckMethod::cMenuDefTimerCheckMethod() :cOsdMenu(tr("Default timer check method"), 20) { #if VDRVERSNUM >= 10734 SetMenuCategory(mcSetupPlugins); #endif CheckModes[0] = tr("no check"); CheckModes[UPD_CHDUR] = tr("by channel and time"); CheckModes[UPD_EVENTID] = tr("by event ID"); modes = NULL; Set(); } cMenuDefTimerCheckMethod::~cMenuDefTimerCheckMethod() { delete [] modes; } void cMenuDefTimerCheckMethod::Set() { int current = Current(); Clear(); delete modes; modes = new int[Channels.Count()]; int i=0; for (cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel), i++) { if (!channel->GroupSep() && *channel->Name()) { modes[i] = DefTimerCheckModes.GetMode(channel); Add(new cMenuEditStraItem(channel->Name(), &modes[i], 3, CheckModes)); } } SetCurrent(Get(current)); } eOSState cMenuDefTimerCheckMethod::ProcessKey(eKeys Key) { eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: { int i=0; for (cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel), i++) if (!channel->GroupSep() && *channel->Name()) DefTimerCheckModes.SetMode(channel, modes[i]); DefTimerCheckModes.Save(); return osBack; } default: break; } } return state; } vdr-plugin-epgsearch/HISTORY0000644000175000017500000021261212466747543015542 0ustar tobiastobiasVDR Plugin 'epgsearch' Revision History --------------------------------------- 2013-03-xx; Version 1.0.1 - maintenance release new: - new Makefile style as introduced in vdr-1.7.36, the old Makefile still exists as Makefile.before.1.7.36 for previous vdr builds. Many thanks to Copperhead, Stefan Hofmann and Christopher Reimer for their work. - implement device bonding in conflict checker, thanks to Joachim Wilke for providing a patch - new service interface "Epgsearch-enablesearchtimers-v1.0" to switch the search timers background update on/off. Updated the sample in source/vdr-epgsearchclient-0.0.2.tgz to use the new service. - new format specifier like %02i in the epgsearchcats.conf, thanks to Joe_D for providing a patch ('man 5 epgsearchcats.conf' for more information). - in the menu 'recordings done' you can now toggle the blue key to 'Orphaned' to show recordings with vanished search timers. - when channel separators are displayed the filling '-' can cause problems in the output of graphlcd. Set PLUGIN_EPGSEARCH_SEP_ITEMS=--- in your Make.config to avoid this. Most skins (except classic, st:tng) will translate '---' into a single line anyway (Feature #857, thanks to 'KeineAhnung' for providing a patch) - search timers are now processed by their descending timer priority. Search timers with the same priority are sorted by their search term. Thanks to Anonym for providing a patch - new bugtracker at http://projects.vdr-developer.org/projects/plg-epgsearch - thanks to Tobias Grimm - dropped old code for vdr < 1.6.0, thanks to Ville Skyttä for whole pile of patches - updated MainMenuHooks patch to 1.0.1 - czech translation, thanks to Radek Stastny fixes: - fixed a memory leak, thanks to Sundararaj Reel for the patch - fixed a crash when editing blacklists 2011-09-11; Version 1.0.0 new: - supports vdr-1.6.0 to vdr-1.7.21 - avoid repeats with new 'compare date' entry: compare two events by their date to ignore repeats within the same day, week or month - global blacklists: blacklists for search timers can now be global to exclude generally unwanted events (like on my double SD/HD channels). Default mode for search timers is now 'only global', but can be set to 'none' to ignore also global blacklists. - new setup variable epgsearch.ConflCheckCmd (no gui for this, so edit setup.conf!), that allows executing a command for each timer causing a conflict, see the MANUAL for details. - vdr-1.7.15 has changed the SVDRP default port to 6419, please update this in epgsearch's setup menu too! - there is now an official git repository for epgsearch, that contains the latest development. First usage: git clone git://projects.vdr-developer.org/vdr-plugin-epgsearch.git Keep up-to-date with: git pull Web-git: http://projects.vdr-developer.org/git/?p=vdr-plugin-epgsearch.git many thanks to the maintainers of projects.vdr-developer.org, especially Tobias Grimm - directory entries from VDR's folders.conf are now also read and offered in the directory selection of the timer menu. - Search timer support for content descriptors as introduced in vdr-1.7.11. This lets you search for broadcasts by their type, like "Movie/Drama", "Documentation",... - Search timers now have a new action "Announce and switch". This announces the event via OSD right before it starts and lets you switch to its channel with 'Ok'. Switch timers now have the same option. - in addition to the announcements via OSD new events can now also be reported by mail. To do so, there's a new search timer action "Announce by mail". You also have to update your mail template file epgsearchupdmail.templ (s. the updated html sample in the conf directory and/or read the MANUAL '13. Email notification'). - The time in hours between the search timer mails can now be configured in the setup to avoid flooding your inbox. epgsearch buffers the contents of the pending mails in the new file pendingnotifications.conf. - New setup option to check if there is EPG content for the next x hours. If not you get warned by OSD and/or mail (Setup -> Search and search timers), suggested by Andreas Mair. - new internal variables: * %day%, %month% and %year% which return the numeric day, month and year (with century) of an event * %chgrp% returns the VDR channel group name corresponding to an event * %liveeventid% returns the encoded event ID as used in the frontend 'live' to add direct links e.g. in the search timer mails (see sample conf/epgsearchupdmail-html.templ). * %timer.liveid% returns the encoded timer ID as used in the frontend 'live' to add direct links e.g. in the search timer mails. * %date_iso% and %date_iso_now% return the (current) date in 'YYYY-MM-DD' format, suggested by Andreas Mair. * %search.series% returns 1 or 0 depending on the flag "series recording" of a search and can be used in the directory entry of a search or its depending variables. - new command 'connect' within internal variables: with this command you can connect to a TCP service, pass data and assign the result to a variable. See the MANUAL for details. - new command 'length' within internal variables: this returns the length of the given arguments - in memory to pat: french translation update, thanks to Patrice Staudt - italian translation update, thanks to Diego Pierotto - finnish translation update, thanks to Rolf Ahrenberg and Ville Skyttä - new lithuanian translation, thanks to Valdemaras Pipiras - new slovak translation, thanks to Milan Hrala - new SVDRP command 'MENU [NOW|PRG|SUM]' to call one of the main OSD menus or the summary of the current event. If any epgsearch menu is open a subsequent SVDRP call will close it again. - changed the maximum number of days for a timer conflict check from 99 to 14 - patch by Jörg Wendel for new graphtft patch - 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. - Avoid repeats: The option 'Yes' for 'Compare subtitle' is now replaced with 'if present'. With this setting epgsearch will classify two events only as equal if their episode names match and are not empty. - epgsearch now uses the shutdown handler (introduced in vdr 1.5.1) to prevent a search timer update to be interrupted. - the SVDRP command UPDS for triggering search timer updates has now a new option 'SCAN' that will execute an EPG scan before the search timer update actually starts. - when deleting a search timer now its list of created timers is also cleared, suggested by Sundararaj Reel - moved 'file' and 'directory' to the top in the timer edit menu, since at least in my case its the most common entry to change, e.g. to select a folder for the recording. - auto enable Wareagle icons if VDRSymbols font is used (can be overwritten with WarEagleIcons=0 in epgsearchmenu.conf), suggested by Ronny Kornexl - the correct content encoding for mail notifications is now automatically detected - epgsearch now autodetects an installed pin plugin or graphtft, also the optional libraries libpcre und libtre (can be turned off by commenting AUTOCONFIG in the Makefile) - new patch vdr.epgsearch-exttimeredit.diff: this patch against VDR integrates epgsearch's timer edit menu to VDR's timer menu, thanks S:oren@vdr-portal for providing it. - some speed enhancements, thanks to Tobias Bratfisch for providing patches - if the VPS time differs from the start time of an event the VPS marker is now 'v' instead of 'V' - the first run of the background threads (searchtimer, switchtimer, conflict check) is now triggered by the first call to cPlugin::MainThreadHook instead of waiting 20s after VDRs startup. - The update check for manual timers does now ignore timers whose start or stop time was edited by the user. - default path to sendmail is now '/usr/sbin/sendmail' and can be configured in the Makefile, thanks to Ville Skyttä for providing a patch. - externally triggered search timer updates (via service interface or SVDRP) will now automatically activate the setting "Use search timers" in the setup. - epgsearch now also checks the recordings length among the correct start and stop time of a timer when testing for complete recordings. 98% and more are handled as complete. - switch timers are now also visible in all search results EPG menus - Avoid repeats: in 'compare summary' one can now adjust the required match, default is 90%. - if there is no subtitle the filename now defaults to YYYY.MM.DD-HH.MM-Weekday to ease sorting in some frontends, thanks to Dominic Evans for providing a patch - should now compile in FreeBSD, thanks to Juergen Lock for providing a patch - new SVDRP command UPDT to reload the list of search timers in epgsearch.conf 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 to egal@vdrportal - when an incomplete recording triggers a search timer update for a search timer with 'avoid repeats' now running events are ignored for the repeats. - now using cCondWait::Wait instead of cCondWait:SleepMs to avoid shutdown problems, thanks to e9hack@vdrportal for providing a patch - fixed line breaks in SVDRP command LSTT, thanks to Andreas Mair for providing a patch - improved response time when canceling the search timer thread - fixed a segfault occurring when navigating to a userdefined epg menu that has expired in the meantime, thanks to Mike Constabel for reporting - the day selection menu in the timer edit menu was hidden - if an event was matched by multiple search timers with 'announce only' setting, it was also listed more than once. Thanks to Andreas Mair for reporting. - fixed a bug in search timer announcements concerning the display of the corresponding search timer - fixed some memory leaks, thanks to Bittor Corl for providing a patch - some fixes to compile with gcc-4.4, thanks to firefly@vdrportal for providing a patch - fixed wrong man section of some man pages, thanks to Ville Skyttä for providing a patch - some fixes regarding libtre includes, thanks to Ville Skyttä for providing a patch - fix UTF8-character handling in timer file names, thanks to Rolf Ahrenberg for providing a patch - fixed a crash when adding huge episode names to the timer's file name, thanks to Lari Tuononen for reporting - make sure only one regular expression library is linked against epgsearch, thanks to Ville Skyttä for providing a patch. - some providers have strange EPG time changes only by some seconds. epgsearch now ignores changes less than 60s and does not touch the corresponding timer or report by mail, thanks to cmichel@mantis for reporting - possible fix of the old problem with a crash in libpcre, thanks to Andreas Cz. for the patch and to Stefan Bauer for pointing me to it. - fix a crash when toggling between with/without subtitle in timer info view for events that have (very) long "short" texts, thanks to Ville Skyttä for providing a patch. - fixed file descriptor handling when there are errors in SVDRP communication, thanks to Teemu Rantanen for providing a patch. - fixed the service interface for switchtimers because of wrong parameter handling, thanks to gnapheus@vdrportal for reporting. - fixed case insensitve searching when Utf-8 characters are involved, thanks to Ville Skyttä for reporting - fixed check of complete VPS recordings, thanks to durchflieger@vdr-portal for providing a patch. 2008-04-29: Version 0.9.24 new: - support for vdr-1.6.x/1.7.x - speedup in searching and search timer updates (about 25%) - speedup in EPG menues, thanks to patch authors from http://www.open7x0.org - support for VDRSymbols font (activate it with 'WarEagle=1' in epgsearchmenu.conf) - the EPG command 'Search in recordings' now evaluates the info.vdr instead of the recordings path name and also does fuzzy searching, suggested by Mase@vdrportal - search timers with action 'switch only' and switch timers now have an additional option 'unmute sound' which unmutes audio at the event, if it was off, suggested by Michael Brückner - the timer update notification mails supports now an additional variable %timer.modreason%, that holds the reason for a timer update in plain text (see epgsearchupdmail(-html).templ for a sample) - support for a conf.d mechanism (s. MANUAL -> 14. The conf.d subdirectory), suggested by Mike Constabel. - new SVDRP command 'LSCC' that returns the results of a timer conflict check. See the MANUAL for details about the format of the result list. - new patch against VDR (vdr-1.5.17-progressbar-support-0.0.1.diff) that adds support for graphical progressbars in skins classic and st:tng, thanks to zulu@vdrportal - '0' in the menu of done recordings now toggles the display of the episode name only - the favorites menu can now also be displayed after 'Overview - Now' via setup, suggested by Bittor Corl - menu of recordings done now sorts the date top down - support for new info key behaviour in vdr-1.5.13 - changes for builtin graphtft-patch (when using VDR-extension-patch you need > v.37) - updated the timercmd-patch for vdr-1.5.12 (patches/timercmd-0.1_1.5.12.diff) - added patches/README.patches to describe the existing patches - update of 'undoneepgsearch.sh', a script to remove recordings from the done file via reccmds.conf, thanks to Viking@vdrportal. - update of finnish translation, thanks to Rolf Ahrenberg - full spanish translation, many thanks to agusmir, dragondefuego, GenaroL, lopezm and nachofr from todopvr.com, and especially to bittor - update of italian translation, thanks to Diego Pierotto - update of dutch translation, thanks to carel@bugtracker - the setup option "No announcements when replaying" is now ignored, if the search timer update was triggered manually, suggested by Andreas Mair. fixes: - shifting the time display: the start time now only gets displayed in 'Overview - Now' instead of a progressbar, if there's not already a start time in the menu template ('%time%') as in the default template, thanks to Getty@vdrportal for reporting - fixed some issues regarding GPL, thanks to Thomas Günther for reporting - fixed a crash when no EPG is present, thanks to Petri Helin for providing a patch - the default value for maximum duration is now '23:59' to avoid problems with external tools, thanks to ralf-naujokat@bugtracker for reporting (bug-id #371) - after an EPG change of less then 10 minutes epgsearch modified a timer instead of creating a new one. This caused problems with events with less then 10 minutes. The tolerance is therefore now min(, 10 min). Thanks to Janne Liimatainen for reporting. - fixed some translations, thanks to ramirez@vdrportal for reporting - speed improvement when scrolling through EPG menus, thanks to ramirez@vdrportal for reporting - fixed a crash, when SIGINT is signaled while background threads startup - channel group separators in 'Overview Now/Next/...' are now hidden if they are empty like in ':@30', thanks to Ulf Kiener for providing a patch - fixed a crash in the setup of the addon plugins when VDR is patched with the ext-patch and active LIEMIKUUTIO - 'avoid repeats' combined with 'pause on ... recordings' created to less timers, thanks to spockele@vdrportal for reporting - fixed some compiler warnings with g++ 4.3 - fine-tuning fuzzy matching of descriptions, thanks to Alf Fahland for providing a patch - fixed a problem with pipes in the pattern of blacklists, thanks to Andreas Mair for reporting. - fixed labeling the green/yellow color keys after toggling the keys in menu 'Schedule', thanks to Andreas Mair for reporting. - fixed evaluation of compiler flags like WITHOUT_EPGSEARCHONLY,... 2007-09-02: Version 0.9.23 new: - full support for new i18n system in vdr>=1.5.7, but keeps fully backwards compatible - when using extended EPG categories one can now also compare by value, e.g. to search for events after some year. Therefore new searchmodes (10 which means '<', 11 which means '<=', ...) were introduced in the file epgsearchcats.conf. Example: # 'until year' 3|Year|until year||11 # 'from year' 12|Year|from year||13 One could use this also to search for a specific season of a series, if this data is part of the EPG. See the section in the documentation for a complete list of all search modes. - The edit menu for search timers has now a switch 'Ignore missing categories' for extended EPG categories. If set to 'Yes' this tells epgsearch that a missing EPG category should not exclude an event from the results. Caution: Using this without any other criterions could flood your timers. - Search timers have now an 'auto delete' feature. The edit menu therefor provides: * after x recordings, or * after x days after first recording Only complete recordings are counted. The deletion of the search timer is executed directly after the end of the corresponding recording - new action "Create a copy" in menu Search/Actions to create and edit a copy of the current search, suggested by Michael Brückner. - the option "use as search timer" has now a third value 'user defined' besides 'yes' and 'no', that allows specifying a time margin where the search timer is active, suggested by jo01@vdrportal - the progressbar now displays the start time instead of an empty bar, when shifting to future events, thanks to zulu@vdrportal for providing a patch. - menu "show timers created" shows now summary for the timers done with 'Ok'. Also the shortcuts '1..9' for the EPG-commands are available. - built-in pin-plugin patch (no more need to patch epgsearch). Activate it by compiling with 'USE_PINPLUGIN' in VDR's Make.config (as already done in VDR extension patch) - built-in graphtft-plugin patch (no more need to patch epgsearch). Activate it by compiling with 'USE_GRAPHTFT' in VDR's Make.config (as already done in VDR extension patch) - update of finnish translation, thanks to Rolf Ahrenberg - update of french translation, thanks to Patrice Staudt - added file README.Translators with notes for translators fixes: - fixed a bug in timer creation after navigating through the summary menu, thanks to Rolf Ahrenberg for reporting - Label "Record" or "Timer" in menu summary fixed with respect to existing timer. - fixed switch timers in the case when EPG has changed, thanks to Juergen Urban for providing a patch - fixed some compiler warnings in g++-4.2, thanks to Michael Brückner for reporting - added "," to the allowed characters for a search timer, thanks to Mike Constabel for reporting. 2007-05-27: Version 0.9.22 new: - new option in timer conflict check "When a recording starts": This performs a conflict check when any recording starts and informs about it via OSD if the conflict is within the next 2h. So also timers not created with epgsearch are checked, the same for instant recordings. - new service interface "Epgsearch-services-v1.0": This allows other plugins to access and manage many components of epgsearch as searchtimers, setup values,... and execute tasks like searching for repeats (Have a look at services.h for more information). - new project homepage: http://winni.vdr-developer.org/epgsearch, many thanks to Thomas Keil, sorry, only german at the moment ;) - update for finnish translation, thanks to Rolf Ahrenberg fixes: - complete rewrite of the summary menu and its navigation to avoid problems with skins and fix some other bugs. - when testing for repeats now also the comparison with the done-file only checks the alphanumeric portions of title and episode - fixed another issue with quotes when calling commands for EPG events - some license changes and additions for integration in Debian repositories - fixed a bug in displayed time, when using user defined times and shifting with FRew/FFwd, thanks to Torsten Weigelt for reporting - the aux info about the channel was not added in 'one press timer creation'. Thanks to Rolf Ahrenberg for providing a patch. 2007-04-29: Version 0.9.21 new: - support for the new MainMenuHooksPatch. This replaces the vdr-replace-schedulemenu patch. The new patch is used by other plugins too, so from now on only one patch is needed. The old patch is still supported, but this will be removed in the next releases. - announcements of broadcasts via OSD have been completely redesigned. Instead of displaying them event by event, you get now "x new broadcast(s) found! Show them?". Pressing 'Ok' shows a menu of all events with the usual functions as in other EPG menus. With "Edit" you can modify the announce settings (like "announce again: yes/no" or announce again after day x). - timer conflict notifications via OSD can now be suppressed while replaying. Nevertheless, if a conflict comes up within the next 2 hours the message gets still displayed. - all addon plugins (epgsearchonly, quickepgsearch, conflictcheckonly) now have a setup option to toggle the main menu entry on/off, thanks to Tobias Grimm for providing a patch. - channel name in aux info of manual timers, thanks to Rolf Ahrenberg for providing a patch. - new script undoneepgsearch.sh to undo a timer within the recordings menu, more info at: http://www.vdr-portal.de/board/thread.php?postid=574109#post574109 Thanks to the author Christian Jacobsen - update for french translation, thanks to Patrice Staudt - update for finnish translation, thanks to Rolf Ahrenberg - menu 'timer conflicts details' now also shows the date of the conflict in menu title, suggested by Rusk@vdrportal. - the password for mail authentication is now hidden in the OSD, i.e. represented with '***...' - the setup for mail notifications now also has a "Send to" address, because some providers don't allow the same address for sender and recipient. If "Send to" is not set, epgsearch automatically uses the sender address as recipient. - when testing for repeats (with feature 'Avoid repeats') epgsearch now only compares the alphanumeric portions of title and episode and ignores the case too. Suggested by chello@vdrportal. - thanks to Rolf Ahrenberg for finnish translation update - added '&' to the set of valid chars for search terms fixes: - the tags stored in the aux info of the timers created with search timers conform now to correct XML syntax (no capitals, no blanks). E.g. "Search timer" will be changed to "searchtimer". So don't wonder if the first search timer update will modify all existent timers created with search timers. Thanks to Rolf Ahrenberg for reporting. - update of recordingdone.sh because of the previous changes, thanks to Mike Constabel for providing a patch - fixed a segfault in the case of misconfigured extended EPG categories. - scrolling text items now works again, if your skin supports this. Thanks to ufauser@vdrportal for reporting. - setup option "Use search timers" now always gets automatically enabled, if one toggles a search to 'active' or manually starts a search timer update. - fixed handling of double quotes in title/episode when passed to userdefined EPG commands, thanks to Mike Constabel for reporting. - fixed menu handling in search timer templates menu, thanks to wombel@vdrportal for reporting. 2007-01-30: Version 0.9.20 new: - support for vdr-1.5.0. Note: the CA support in the timer conflict check is highly experimental because I have no CAMs to test it! - epgsearch can now also modify manual timers according to EPG changes. When using epgsearch's own timer edit menu you can select between * no check * by event ID * by channel/time Please refer to the README (1.4.4 Setup/Timer Programming/Default timer check method) for further notes. - the timespan used in the favorites menu can now be adjusted via setup. Default is 24h. - Event announcements: If the user presses one of the keys 'Ok', '0', ... '9' while the announcement of an event is displayed, he will be asked if further announcements of this event should be disabled for ever (user hit '0' or 'Ok') or for the next 'x' days (user hit '1' to '9'). After pressing 'Ok' again, this setting will be stored. - With the new setup option "No announcements when replaying" you can now suppress any announcements of broadcasts when you currently replay anything. Suggested by Andreas Mair. - Besides the done file for recordings there is now a done file for timers (timersdone.conf). This allows deleting timers without getting them again with the next search timer update. With the new menu 'Show timers created' in Search/Actions one can edit this list. The whole feature can be disabled in the search timers setup. Note: the done list is only populated with timers that were newly created with this release. - new addon plugin 'quickepgsearch': it creates a main menu entry 'Quick search' and can be used to search for any event in the EPG. Include it with '-Pquickepgsearch' , suggested by SurfaceCleanerZ@vdrportal. - new setup option "Limit channels from 1 to" to speed up epgsearchs call. If the current channel is above the limit, all channels will be displayed. Suggested by Uwe@vdrportal. - new SVDRP commands: * 'LSRD' returns a list of all recording directories used in existing recordings, timers, search timers or as specified in epgsearchdirs.conf * 'LSTT [ID]' to list all search templates, or the one with the passed ID (format is the same as epgsearch.conf) * 'NEWT ' to add a new search template REMARK: the value of element ID is ignored. epgsearch will always assign the next free ID * 'DELT ' to delete the search template with ID * 'EDIT ' to modify an existing search template * 'DEFT [ID]' returns the ID of the default search template. When passing an ID it activates the corresponding template as default. - modified SVDRP commands: * 'DELS [ID] [DELT]' now also deletes created timers for search with ID when passing the optional 'DELT'. - you can now also use sendmail for mail delivery besides the script sendemail.pl (-> setup), suggested by Patrick Cernko - new variables: * '%timespan%' to be used in menus or mails. It will be replaced with the timespan from now to the begin of an event (e.g. 'in 15m'). It is now used in the default menu template of the favorites menu, where the date field was removed. * '%length%' for the length of a broadcast in seconds. - thanks to Rolf Ahrenberg for finnish translation update fixes: - manually created timers are now neither deleted nor modified by any search timers. - the addon conflictcheckonly was compiled even if WITHOUT_CONFLICTCHECKONLY was defined in the Makefile, thanks to Ronny Kornexl for reporting. - search term and directory support now the characters 'ß' (only for language german) and '@'. - 'avoid repeats' had a bug (in some special cases) that created a timer for any later repeat instead of the first event. - a search with "Use day of week" AND "Use time" where "Start before" is after midnight now also matches events on the next day til "Start before". E.g. "Start after 22:00" and "Start before 03:00" on monday will also match an event at 01:00 at tuesday. - already recording timers are now modified only, if the timers stop time has changed (e.g. by an EPG update), thanks to Mike Constabel for reporting. - fixed a bug in evaluation of user variables, thanks to Mike Constabel for reporting and remote debugging - fixed a bug in conflict mail notification concerning timers without assigned events 2006-10-27: Version 0.9.19 new: - if search results of different searches intersect, now only the search that initially created a corresponding timer may modify it. - new variables: * '%search.query%' to be used in the recording directory of a search timer. Will be substituted to the query of a search timer. * '%videodir%' VDR video directory (e.g. /video) * '%plugconfdir%' VDR plugin config directory (e.g. /etc/vdr/plugins) * '%epgsearchdir%' epgsearchs config directory (e.g. /etc/vdr/plugins/epgsearch) - the syntax of the 'system' command within a user variable has changed to be more flexible. It's now: %uservar%=system(/path/to/script[, parameters]) where the optional 'parameters' can now be any expression using other variables except directly using conditional expressions or other system calls. - update for french translation, thanks to Patrice Staudt fixes: - VPS timers created by search timers are now always updated to their VPS time, even if the user has changed start/stop time. - after editing the setup any menu templates defined in epgsearchmenu.conf were reset to defaults, thanks to s.krueger@vdrportal for reporting. - existing VDR serial timers are not modified anymore to regular timers by the search timer update. 2006-10-01: Version 0.9.18 new: - IMPORTANT!!! PLEASE READ THIS!: epgsearch expects its conf files now in a separate configuration directory 'epgsearch' and not in the general plugin configuration directory as with previous versions! Please create this directory in your plugins configuration directory and move all epgsearch-files to it before running this version. Like this: mkdir /etc/vdr/plugins/epgsearch mv /etc/vdr/plugins/epgsearch*.* /etc/vdr/plugins/epgsearch mv /etc/vdr/plugins/.epgsearch* /etc/vdr/plugins/epgsearch This is only important if you don't already use epgsearchs '--config' or '-c' parameter. - new 'Favorites menu' besides 'Now' and 'Next': This menu can show a list of all your favorite broadcasts for the next 24h. To enable it activate 'Show favorites menu' in the setup. To let epgsearch know what your favorites are create/edit some searches and enable 'Use in favorites menu'. - new setup option for timer conflict check: 'After each timer programming'. This performs a conflict check after each manual timer programming and - if the new/modified timer is involved in a conflict - pops up an OSD message about it. - new email notifications about search timer updates or timer conflicts with a customizable mail content. Please refer to the MANUAL section 'Email notification' for further details. - epgsearch has now a set of man pages. A very BIG thanks to Mike Constabel (vejoun@vdrportal) who did the complete job of rewriting/correcting and formatting the current docs. The man pages cover the README's, MANUAL and a documentation of all conf's that epgsearch uses. Available for german and english. Install them with 'make install-doc' in epgsearch's src-directory. - you can now define your own variables to be used in the default recordings directory, search timer recording directory or your own menu templates. Since this is quite complex please refer to the MANUAL section 'User defined variables'. Just an example to see what is possible: # Weekday, Date, Time %DateStr%=%time_w% %date% %time% # Themes or Subtitle or Date %ThemesSubtitleDate1%=%Subtitle% ? %Subtitle% : %DateStr% %ThemesSubtitleDate%=%Themes% ? %Themes% : %ThemesSubtitleDate1% # Calls this script to get a recording path %DocuScript%=system(doku.pl,%Title%,%Subtitle%,%Episode%,%Themes%,%Category%,%Genre%) %Docu%=%DocuScript% - key 'Ok' can now also be configured to switch to a channel instead of displaying the summary, suggested by malachay@vdrportal. - if a timer was created by a search timer then epgsearch's own timer edit menu now displays the name of the search timer in a non selectable item at the bottom of the menu. - when an event is announced via search timers you can now create a timer for it, when you press the red key while the announce is visible, suggested by Andreas Mair - if search timers are disabled by setup then creating/editing a search timer now automatically activates them in setup, suggested by Andreas Mair. - you can now use more than one menu template for search results, please refer to the MANUAL section "Customizing the EPG menus". - the check for a complete recording now also accepts short breaks (< 2s, e.g. a channel pid change) - new SVDRP commands: * LSTC [channel group name] list all channel groups or if given the one with name 'group name' * NEWC create a new channel group, format as in epgsearchchangrps.conf * EDIC modify an existing channel group, format as in epgsearchchangrps.conf * DELC delete an existing channel group * RENC rename an existing channel group * 'LSTB [ID]' to list all blacklists, or the one with the passed ID (format is the same as epgsearchblacklists.conf, see MANUAL) * 'NEWB ' to add a new blacklist REMARK: the value of element ID is ignored. epgsearch will always assign the next free ID * 'DELB ' to delete the blacklist with ID * 'EDIB ' to modify an existing blacklist * 'QRYS < ID(s) >' to get the results for a search with the given ID. Multiple IDs can also be passed and have to be separated with '|'. * 'QRYS ' to get the results for a search with the given search settings. * 'QRYF [hours]' to get the results for the favorites menu. The optional parameter specifies the number of hours to evaluate and defaults to 24h. * 'LSTE [ID] to get the extended EPG categories defined in epgsearchcats.conf or the one with the given ID. * 'MODS ID ON|OFF' turns on/off the option 'Use as search timer'. * 'SETP option' returns the current value of the setup option (see MANUAL). - epgsearch has now a bug tracking system (german) and a mailing list (english) http://www.vdr-developer.org/mantisbt http://www.vdr-developer.org/mailman/listinfo/epgsearch thanks to the providers of developer.org - new service interface "Epgsearch-switchtimer-v1.0" to access and manage switch timers, thanks to Dirk Leber for his extension. - update for french translation (including setup help!), thanks to Patrice Staudt - thanks to Rolf Ahrenberg for finnish translation update - thanks to Mike Constabel for providing a HTML update mail template (conf/epgsearchupdmail-html.templ) fixes: - the first day of a repeating timer is now taken into consideration in the timer conflict check, thanks to zimuland@vdrportal for reporting - fixed search timer update for VPS timers, thanks to Chello and oholler@vdrportal for reporting. - fixed handling of the sign '|' when changing the search type of a search timer, thanks to Chello@vdrportal for reporting - changed some default search mode values in the epgsearchcats.conf samples for multiple selection - removed extra line feeds in SVDRP response of LSTS, thanks to Andreas Mair for reporting - channel criterion 'no pay tv' in search timers was ignored, thanks to Andreas Mair for reporting - fixed initial min/max values for search criterion 'duration', thanks to Mike Constabel for reporting - fixed a bug when selecting the conflict check 'after each search timer update' in setup, thanks to Ronny Kornexl for reporting - some changes for thread safeness - added '--remove-destination' to the Makefile as introduced in vdr-1.4.2-3 2006-08-07: Version 0.9.17d (maintenance release) fixes: - fixed a wrong usage of 'cPlugin::ConfigDirectory' in search timer thread, thanks to Udo Richter and Petri Hintukainen for reporting 2006-06-12: Version 0.9.17c fixes: - fixed a problem with multiple selection of extended epg category values, thanks to Christian Jacobsen for reporting - another compilation fix for linvdr, thanks to toxic-tonic@vdrportal 2006-06-10: Version 0.9.17b fixes: - fixed some problems with repeating timers in timer conflict check, thanks to Peter Juenger for reporting - fixed a crash in timer conflict check when there was an active recording on a device provided by a plugin (e.g. pvr, streamdev), thanks to Gerhard Steiner for reporting. 2006-06-06: Version 0.9.17a fixes: - menu 'timer conflicts' automatically returned if there where periodic timers, thanks to lostinspc@vdrportal - fixed some compiling problems with gcc-2.95 and gcc-4.1.0, thanks to ferdi03@vdrportal, smudo81@vdrportal, toxic-tonic@vdrportal 2006-06-05: Version 0.9.17 - dropped support for vdr < 1.3.46 :-( - changed logic in jumping through menus with user-defined times: you can now also access times on next day, if they are less then 20 hours in the future. Thanks to egal@vdrportal and CKone@vdrportal. - epgsearch has now its own timer conflict check which can be customized by setup regarding relevant priorities, the time span to check or the relevant conflict duration. There is also a conflict manager in Search/Actions that can be used to resolve conflicts. Many thanks to Mike Constabel for heavy testing ;-) - if there is a timer conflicts notification via OSD, you can now press 'Ok' to go directly to the timer conflicts overview. - if you like to have a separate main menu entry for the timer conflict check use '-P conflictcheckonly' which comes as 'mini'-plugin with epgsearch and simply calls epgsearch's conflict menu. conflictcheckonly has a setup option to display an info about the last conflict check directly in its main menu entry. - setup is now completely restructured and has now something like an 'online' help. - menu 'switch timers' now also displays the channel number - input logic for extended EPG categories changed to allow multiple values. - added script 'timercmds-auxinfo.sh' that displays the aux info (e.g. the search timer responsible for the timer) in VDR's timer menu (requires the timercmd patch), thanks to the author Mike Constabel - user-defined EPG times with empty description get now their associated time as description, suggested by Thiemo Gehrke - new service interface "Epgsearch-conflictmenu-v1.0" to call epgsearch's conflict menu from other plugins. - new service interface "Epgsearch-lastconflictinfo-v1.0" to get an info about the last conflict check result. - epgsearchmenu.conf is not more reloaded with every plugin call, since this is only useful when testing the conf file. To activate the permanent reload again, pass the new start parameter '-r' or '--reloadmenuconf' in your runvdr - thanks to Rolf Ahrenberg for finnish translation update - added HISTORY.DE (german HISTORY) fixes: - loading epgsearchmenu.conf now falls back to menu defaults, if the conf file contains any errors. - fixed handling of '%' in LSTS in SVDRP for vdr > 1.3.44, thanks to Mike Constabel - fixed loading epgsearchmenu.conf for epgsearchonly and service interface "Epgsearch-searchmenu-v1.0", thanks to Daniel Dorau for reporting. - fixed display update in menu 'Search templates', thanks to Mike Constabel - fixed a bug when deleting associated timers of a search timer when there are no timers present, thanks to Patrick Koppen for reporting. - hopefully fixed a bug when adding a search entry to templates, thanks to Patrick Koppen for reporting. 2006-04-18: Version 0.9.16 (maintenance release) fixes: - the display of 'Overview - Now' was broken, when using progressbar and channel numbers in default menu look. Thanks to Gerhard Steiner for reporting this one. - when using small OSD fonts, the progressbars where flickering because of 1 pixel line height. Thanks to holymoly and TomG@vdrportal. - support for the APIVERSION define as introduced in vdr-1.3.47 2006-04-14: Version 0.9.15 new: - the EPG menus can now be customized with the file epgsearchmenu.conf (sample file in 'conf' subdirectory), e.g. the entry: MenuWhatsOnNow=%chnr%:3|%progrt2s%:5| %time% %t_status%:8|%category%:6| %title% ~ %subtitle%:35 creates a menu line starting with the channel number, followed by a progress bar in text2skin style, the start time, the timer status, the EPG category (like "movie") and finally the title and subtitle. You can customize each menu ('What's on now, next, other times, schedule and search results with a separate line). Please refer to the MANUAL for more information. - IMPORTANT change to search timers: epgsearch now removes timers, that are not needed anymore (if vdr >= 1.3.44). These are: * timers, that are no more valid because of EPG changes. This should avoid the double recordings after an EPG change. * timers, that do not match the search criterions after a change of the search timer. So you don't have to remove them manually anymore. If the user has modified start or stop of such a timer, it will be kept. - new search mode 'fuzzy' in searches. This performs a fuzzy search applying an algorithm like it's used in agrep. The error tolerance can be set with the edit field 'Tolerance'. - added the 'one press' timer creation feature in EPG menus as introduced in vdr-1.3.38 with one small difference: If the event is already running or about to start within MarginStart + 2 minutes, the timer edit menu will be popup to allow editing the file/directory entry, because this cannot be changed when the recording immediately starts. Else, the timer is created immediately. Can be turned off in setup. - with the red button in epgsearch's own timer edit menu one can now delete an existing timer, suggested by Rolf Ahrenberg. - if the main menu entry is not hidden, its name can now be set by setup. (Note: when changing the name to something different than the default, it is no more dependent on the OSD language) - changed the default main menu entry from 'Search' to 'Program guide' - some people requested a separate main menu entry for epgsearch's search menu. Therefore I've added a little plugin called 'epgsearchonly' that simply calls epgsearch's search menu. Its main menu entry is 'Search'. Compilation of epgsearchonly is automatically done, but can be switched off in the Makefile when uncommenting the line #WITHOUT_EPGSEARCHONLY=1. To use it simply put '-P epgsearchonly' to your VDR start script. (requires >= vdr-1.3.30) - new service interface "Epgsearch-searchmenu-v1.0" to call epgsearch's search menu from other plugins. - new action 'Delete created timers?' for search entries to delete all timers created from the current search timer. Does not affect recording timers. - When deleting a search, you can now decide if all timers created from this search should also be deleted. - If the user modifies the start/stop time of a timer created by epgsearch this timer will not be changed anymore(only vdr >= 1.3.44 ) - If an event is currently recorded, the status flag in the EPG menus is now 'R' instead of 'T' - Support for wareagle-icon-patch (activate it by adding the line 'WarEagleIcons=1' to epgsearchmenu.conf) - Progressbar in Now/Next beautified when using setup option 'graphical', inspired by Nordlichts-EPG-Plugin - new setup option to show/hide radio channels in the EPG menus, suggested by Patrice Staudt. - new service interface "Epgsearch-searchresults-v1.0", that returns a result list of events matching a given search, suggested by Andreas Brugger - removed some special setup options, because their function can also be realized with a customized menu now: * "show progress bar in 'Next'", in default menu now off * "display width for progressbar", in default menu now 4 * "show short channel name", in default now always short * "Show episode text in schedules", now always displayed - update for finnish translation, thanks to Rolf Ahrenberg - aux field is now formatted in full XML style (if vdr >= 1.3.44). As a result of this, an updated recordingdone.sh is provided in the 'scripts' subdirectory. Thanks to Mike Constabel for providing a patch. - search timer update now always runs in low priority, suggested by Christian Jacobsen - new SVDRP command 'FIND'. This allows searching an event and returns a list of results consisting of 'NEWT' lines, that can be used to immediately create a timer for a result. Suggested by Lari Tuononen fixes: - thanks to Darren Salt for patches for g++ 4.1 and some things concerning thread safeness and code review - fixed some memory leaks - fixed calling user defined EPG commands, thanks to rzndl@vdrportal - fixed blacklist match for search timers, thanks to Christian Jacobsen - make sure that the episode name of a timer is less then MAX_SUBTITLE_LENGTH, thanks to Mike Constabel - speedup for search timer update 2006-03-05: Version 0.9.14a fixes: - EPG command 'mark as already recorded' crashed, thanks to Mike Constabel for reporting this 2006-03-04: Version 0.9.14 new: - when disabling/enabling a search timer you can now decide if the associated timers should also be disabled/enabled. - new built-in EPG command 'Create blacklist' to create a blacklist from any EPG menu. - the summary of an entry in the menu 'recordings done' has now an additional button 'Aux info', that displays the content of the aux field. - update for the script recordingdone.sh to work also with vdr-1.3.44, thanks to Mike Constabel for his changes. - conversion scripts for upgrade to vdr-1.3.44: Because of the different handling of auxiliary info (summary -> aux) some features of epgsearch won't work with recordings made before vdr-1.3.44. This applies to the done-Feature and to the automatic deletion of recordings. Without using these scripts you will simply have some more recordings. So you actually don't have to apply them, but when using them, all works fine. Thanks to Mike Constable for providing them. * new script convert_info_vdr.pl. This converts the info file of recordings made before vdr-1.3.44 and moves epgsearch aux data to the new aux field. * new script convert_epgsearchdone_data.pl. This converts the epgsearchdone.data file adding an 'aux' section to it. - update for script mtdone2epgsearchdone.sh, thanks to Christian Jacobsen - update for french translation, thanks to Patrice Staudt - update for finnish translation, thanks to Rolf Ahrenberg fixes: - done-feature was broken with vdr-1.3.44, thanks to Mike Constabel for reporting this - another fix of high cpu load in search timer thread, thanks to sledgehammer@vdrportal for reporting this - automatic linking after extracting the tarball removed again, requested by distribution maintainers. - fixed some compiler warnings when using -Wformat=2, thanks to Darren Salt for reporting and providing a patch 2006-02-28: Version 0.9.13 new: - support for vdr-1.3.44: works now, but: because of the summary/aux changes in vdr-1.3.44 the additional info about the search timer, that triggered a timer/recording, or the recording channel is currently not available. This info is now stored in the new aux field of timers/recordings. - blacklists: you can now maintain one or more blacklists and select them within a search or search timer. A blacklist works like a normal search and defines events that should be ignored in a search or search timer. Blacklists can be managed from setup or with the new search action 'Show blacklists' or directly when editing a search. Within a search you can select one or more or all blacklists. If any search result is also contained in a black list result set it will be skipped. - the switchtimer background thread is now only active, while there are any active switch timers. - when you unpack the tar file, the necessary link is now automatically created (like text2skin) - the result list of repeats of an event now omits the currently running event, suggested by Ronny Kornexl - thanks for beta testing to Mike Constabel - update for finnish translation, thanks to Rolf Ahrenberg fixes: - the setup option 'Add episode to manual timers' was not stored 2006-02-12: Version 0.9.12 new: - new feature 'pause when ... recordings exist" for search timers. If the given number (>0) of recordings exist, then the search timer will not create further timers. After deleting one or more recordings new timers are generated again. fixes: - fixed a crash when surfing to a channel without epg in schedule menu 2006-02-08: Version 0.9.11a fixes: - high cpu load fixed 2006-02-07: Version 0.9.11 new: - support for vdr-1.3.42 - new feature switch timers: add an event with the new epg command 'Add to switch list' to the switch list and epgsearch will switch the channel one minute before the event starts. The current content of the switch list can be controlled within the search menu with the new action 'Show switch list'. If there is a switch timer for an event its menu item is labeled with 'S', if there is no real timer. - switch timers also for search timers: a search timer can now be configured to 'switch only'. Its search results are then added to the switch list and epgsearch will switch to the found events one minute before they start. There will be no real timer for such a search timer. - search criterion 'Use channel' has now an additional value 'only FTA' to search in non encrypted channels only - new setup option 'Show day separators' for menu 'Schedule', that displays an additional line at day break. - epgsearch has now a SVDRP interface with the following commands (requires vdr > 1.3.30): * 'LSTS [ID]' to list all searches, or the one with the passed ID (format is the same as epgsearch.conf, see MANUAL) * 'NEWS ' to add a new search REMARK: the value of element ID is ignored. epgsearch will always assign the next free ID * 'DELS ' to delete the search with ID * 'EDIS ' to modify an existing search * 'UPDS [OSD]' to update the search timers. Passing the optional keyword 'OSD' pops up an OSD message after the update has finished. * 'UPDD' to reload the file epgsearchdone.data, e.g. after an external tool has modified it. * 'SETS ' to activate or cancel the search timer background thread. - since setup gets too big it has now the modes 'Standard' and 'Extended'(toggled with key 'red'), suggested by Rolf Ahrenberg - update for finnish translation, thanks to Rolf Ahrenberg - update for italian translation, thanks to reelbox users - update for french translation, thanks to Patrice Staudt - new dutch translation, thanks to reelbox users - using 127.0.0.1 instead of resolving 'localhost' for SVDRP, suggested by Thiemo Gehrke - added script recordingdone.sh for your reccmds.conf to add a recording to epgsearch's done file, thanks to Patrice Staudt, Christian Jacobsen and Mike Constabel - added script mtdone2epgsearchdone.sh to move recordings from mastertimer's done file to epgsearch's done file, thanks to Christian Jacobsen. - thanks to Mike Constabel and Andreas Brugger for testing and bug reports fixes: - fixed a bug after using templates, thanks to Christian Jacobsen 2006-01-15: Version 0.9.10 new: - update of all schedule and search result menus after creating/changing a timer, as introduced in vdr-1.3.38 - button 'Record' now labeled with 'Record' or 'Timer' depending on existing timer for the event, as introduced in vdr-1.3.38 - epgsearch's own timer edit menu now displays the recording device number for a currently recording timer - new setup option: 'Add episode to manual timers' affects adding the subtitle to the timer file in manual timer programming. The setting 'smart' skips the subtitle if the event has more that 80 min. - search edit menu for search timers changed for future extensions: 'Action' now selects the job to do for the search results, currently 'record' (default) or 'announce only' - thanks to Rolf Ahrenberg for finnish translation update fixes: - in vdr-1.3.38 some translations were broken - updated the timercmds-patches to work with vdr-1.3.38 2006-01-08: Version 0.9.9 new: - support for vdr-1.3.38 - search templates: the settings of a search are often quite the same as already done with other searches. You can now create templates that can be selected when editing a search (with key blue). A template can also be set as default. A new search will then get the default settings automatically. - extended setup with 'search templates' to manage the new templates - new action 'Use as template' to copy a search to the templates - setup option to display the subtitle in the schedules, thanks to Darren Salt for his patch - extension of feature 'Delete recordings after ... days' with 'Keep ... recordings'. This will asure, that last x recordings will not be deleted, even if they are expired. fixes: - the search timer feature 'Delete recordings after ... days' also deleted recordings that were edited. fixed now. 2005-11-27: Version 0.9.8 new: ATTENTION: this version converts epgsearch.conf (the file that stores the searches) to a NEW FORMAT. A backup of the old file is stored as epgsearch.conf.bak. If you switch back to an older version you have to move the backup file back to epgsearch.conf. - new feature 'avoid repeats' for search timers, aka 'done' feature (please read the README before using it!). A special thanks to Mike Constabel (vejoun@vdrportal) for many hours of testing and bug reports. * timer preview * recognition of broken recordings * fuzzy event comparison - the menu of search results for a search timer with 'avoid repeats' has an additional mode for key 'blue' to preview the timers, that will be programmed with it. - new setup option to display channels without EPG in 'What's on...', idea from 'Nordlicht's EPG plugin' - new setup option to show channel separators in 'What's on...', idea from 'Nordlicht's EPG plugin' - new feature 'Delete recordings after ... days'. This removes a recording automatically after the given days. It's a nice thing for e.g. news recordings (like Tagesschau), that are only interesting for a few days - the timer summary now contains additional information about the event: event title, subtitle (if present) at the top, the name and ID of the search timer, that triggered the timer, and also the recording channel (after the real summary) at the bottom - the summary of timers that are manually programmed now also contains info about title, subtitle (if present) and the recording channel - 'Execute' in searches menu has been replaced with 'Actions' that list a menu consisting of * Execute search * Use as search timer on/off * Trigger search timer update * Show recordings done You can also use the short keys to trigger the corresponding action without opening this menu - introduced a logfile (default file is plugin-configdir/epgsearch.log, but can be specified with commandline option '-l /path/to/logfile'. Commandline option '-v n' specifies the verbose level of the logfile. n=0 means no logging, allowed values are n=0(default),1(standard),2(extended),3(for debug). - setup has now a default recording directory entry, that is used in manual timer programming. It supports also entries like '%Category%~%Genre%'. The directory gets automatically replaced with the values of the event (but only if all variables were replaced). - depending on the calling menu the event menu (summary) now labels the buttons green/yellow with the previous/next channel or the start of the previous/next event, suggested by Andreas Brugger - the channel number is now also listed in menu 'search results', if the setup option 'show channel numbers' is set, suggested by Gerhard Steiner. - short keys (1,2,...) to EPG commands are now also available in the EPG summary menu, suggested by Frank Krömmelbein - if VDR version >= 1.3.31 then setup has now an option to choose between epgsearch's timer edit menu and VDR's built-in menu (useful when using a patched VDR timer edit menu, suggested by Frank Krömmelbein) - if a subtitle is present the menu for manual timer programming now always adds the subtitle to the timer file as default, suggested by Gerhard Steiner - optimized the splitting of the directory and file entry when re-editing a timer in manual programming, thanks to Andreas Brugger - the EPG menus now always display a subtitle in the form 'title ~ subtitle' if present - new service 'Epgsearch-updatesearchtimers-v1.0' to trigger a search timer update - if a search timer update is triggered from the actions menu then an osd message is displayed when it has finished (also when using the service 'Epgsearch-updatesearchtimers-v1.0' optional) - the menu of search timers now displays the number of (active) searchtimers in its title - now checking if manual timer programming has failed and display an osd message in that case (needs vdr >= 1.3.30 to work) - thanks to Rolf Ahrenberg for updating the finnish translation - thanks to Mike Constabel for corrections in READMEs and MANUAL fixes: - epgsearch now exits to main menu when not called directly via a short key, thanks to Andreas Brugger - fixed editing menu search term in english translation - fixed sorting search timer list after editing a search timer, thanks to Mike Constabel - fixed menu navigation with respect to empty schedules, thanks to Darren Salt for his patch - fixed misaligned search entries in searches menu, thanks to Andreas Brugger 2005-09-04: Version 0.9.7 new: - changes in the events summary now also trigger a timer update fixes: - fixed a memory leak in search timers with regular expressions, thanks to TomG@vdrportal - fixed channel name display in color buttons when a channel separator exists, thanks to viking@vdrportal 2005-08-27: Version 0.9.6 new: - search criterion 'use channel' extended by 'channel groups'. Channel groups can be managed with their own menu and allow a much more flexible way to select channels for the search procedure. - epgsearch now exposes its extended timer edit menu and searching the epg as services to other plugins (s. MANUAL or contact me, if you are interested) - if a timer is programmed for an event (searchtimer or manual programming) then the summary is now also passed to the timer (allows displaying the summary pressing 'ok' in timer menu), thanks to TomG@vdrportal - after toggling the color buttons with '0' in the schedule menu the yellow/green button now move to the schedule of the previous/next channel - added a patch from Uwe/egal@vdrportal that replaces vdr's standard schedule menu with the epgsearch plugin. Also big thanks to Uwe for the changes in epgsearch. After patching VDR you have to activate the patch in epgsearch's setup. - after editing a new search, its entry now gets correctly sorted in the list of all searches, thanks to Mike Constabel - added Gerhard Steiner's timercmd patch for vdr >= 1.3.25 - a 'back' in the start menu now always closes the osd (should solve some trouble with the submenu patch) - events without title are now ignored, regardless of the search criteria, thanks to Mike Constabel - new EPG variable '%channel%', that can be used in directory entries and gets replaced with the channels name - recording margins in search timers can now be negative (allows intentional cutting the begin/end of recording), suggested by Mike Constabel - extended EPG categories are now compared case insensitive - updated finnish translation, thanks to Rolf Ahrenberg fixes: - '.epgsearchrc' now too is expected in the config path specified with -c (if given), thanks to Ronny Kornexl - fixed programming of timers with empty file and directory, thanks to Andreas Brugger - fixed search timer programming in case of midnight between start and stop time - fixed directory selection when listing of dirs is empty, thanks to harvey@vdrportal - (de)activating a searchtimer with '0' did not store, thanks to Mike Constabel - fixed menu navigation (green-yellow-yellow-green displayed the summary instead of 'whats on now'), thanks to Mike Constabel 2005-07-02: Version 0.9.5 - epgsearch has now its own menu for standard timer editing with the following extensions (timer programming is based on SVDRP, so this should be configured!): * additional item 'directory' with selection of existing directories with key 'blue' (also supports EPG variables like "%category%" when using ext. EPG info) * item 'file' can be extended with subtitle (if present) pressing key 'blue' * item 'file' and 'directory' can be reset to standard pressing key 'yellow' * when editing weekdays then item 'day' can be customized with a submenu for arbitrary weekdays selection - menu 'userdefined days of week' for search timers now starts with 'Monday' instead of 'Sunday' - menu 'Select directory' now lists distinct items of the following sources: * current recording directories * current timer directories * directories used in search timers * directories specified in epgsearchdirs.conf key 'yellow' can be used to change the depth of the directory listing. - Progressbar in 'Next' can now be switched on/off with its own setup item. - support for language dependent commands for EPG (default loading uses epgsearchcmds.conf, if there is no epgsearchcmds-XXX.conf, where XXX is the language code as shown in i18n.c, see MANUAL) - directly calling a command with key '1'..'9' will now go back to the calling menu after execution instead of displaying menu 'commands' - added a commandline option '-c' or '--config' to specify the plugins own config directory (option). - added commandline help for 'vdr --help - thanks again to Mike Constabel (vejoun@vdrportal) for great beta testing and suggestions, and to Rolf Ahrenberg for finnish translation. 2005-05-24: Version 0.9.4 - support for extended EPG info (categories) in search timers (please refer to the README 'Using extended EPG info'). - added a submenu to select an existing directory when editing a search timer. This menu can also be extended with entries in the file epgsearchdirs.conf - usage of variables like "%Genre%" or "%Category% in the directory entry of a search timer. These are replaced with the current extended EPG info when a timer is created. - key '0' in search menu now toggles the flag 'use as search timer' - fixed compilation for vdr < 1.3.18 (thanks to TomG@vdrportal) - updated script rememberevent.sh (thanks to Ronny Kornexl for complete rewrite and extensions) - added script epg2master-timer.sh for the commands menu, that adds an event to master-timer, thanks to the author Christian Jacobsen / Viking (vdrportal) - some changes to compile with bigpatch - removed font patch for progressbar, since runtime patch seems to work fine - added a script timerrep.sh to search the repeats of a timer from timer menu (requires the timercmds.conf-patch from Gerhard Steiner, see dir patches) - updated/rearranged README(.DE) and added also a MANUAL (only english) for detailed info about some topics, since README gets too big. - Added a description of the format of epgsearch.conf to MANUAL - fixed a bug with buttons display in search timer edit menu - a special thanks to Mike Constabel (vejoun@vdrportal) for great beta testing and suggestions, and to Rolf Ahrenberg for finnish translation. 2005-04-14: Version 0.9.3 - implemented direct SVDRP communication (no more need for svdrpsend. For now, the old external method can still be used when you pass it with -f as parameter, if you omit -f the internal method is used) - added buttons '<<' and '>>' in detailed epg view (summary) to jump to the previous/next event of the menu behind (schedule, now, next, ..., search results) - new feature to use epgsearch for searching from other plugins or scripts (see the README 'Usage from other plugins or scripts') - shifting displayed time with FF, FR or by toggling with '0' is now also available in schedule menu - added a setup option to set a default for handling pay tv channels when searching (does not affect search timers) - fixed day check in searchtimer scan with respect to changes in vdr-1.3.23 - changed detection of existing timers to reduce superfluous timer modifications. - added channel name and subtitle to parameters for custom commands - small change in input logic of 'from channel' when editing a search entry - updated screen shots on project homepage 2005-03-20: Version 0.9.2 - update for vdr-1.3.23 2005-03-19: Version 0.9.1 - french translation update, thanks to Patrice Staudt - fixed a problem with priority and lifetime when modifying a timer 2005-03-19: Version 0.9.0 - new search mode 'regular expressions' (POSIX(default) or Perl compatible by compiler switch HAVE_PCREPOSIX in the Makefile, see README - Installation) - new search mode 'match exactly' to simplify matching of short search terms - new option for search timers: 'only annouce' will not add a timer, but display an OSD message about the found event - new progressbar in 'what's on next', that displays the time span to the next event (0 minutes(=100%) to max. 30 minutes(=0%)) - timer conficts can now be checked in the background and are displayed via OSD after each search timer scan (requires a recent timeline plugin running) - key blue in search results now toggles between "only FTA" and "all channels" (to hide results from pay tv channels) - removed some superfluous search timer modifications - finnish translation, thanks to Rolf Ahrenberg - updated README and added a description of the search process - shifted version number to allow subversions 2005-02-15: Version 0.0.8 - added support for VPS in search timers - channels of search timers are now stored with ID rather than number (avoids editing your searches after channel modifications) - corrections in the english version, thanks to Darren Salt - fixed a bug in criterion duration - fixed channel selection when shifting displayed time, thanks to Ronny Kornexl - put some space between progressbar and event info (TtV*) for text2skin 1.0 - fixed compilaton problems in vdr-1.3.10 - switch display in search results to 'episode name only' with key yellow - fixed width of start time, when displaying channel number, thanks to Gerhard Steiner 2005-01-22: Version 0.0.7 - Start menu can now be setup between 'schedule' and 'now' - runtime patch for progressbar (no need to patch vdr anymore, experimental) - Added lifetime, priority and margins for start and stop for searchtimers - Added new font-patch for vdr-1.3.18 - new: italian translation, thanks to Sean Carlos - french translation, thanks to Patrice Staudt - finnish translation by Rolf Ahrenberg - search term can now be empty to search for anything, that matches other criterions searchtimers - Fixed editing of criterion 'to channel', thanks to gunnar@vdrportal 2005-01-11: Version 0.0.6 - now compiles also with vdr-1.3.18 - Search criterion 'channel' can now be a range of channels (thanks to gunnar@vdrportal) - Setup option 'short channel names' for display in 'now', 'next',... (only available for >= vdr-1.3.15, thanks to dido@vdrportal) - french translation, thanks to Patrice Staudt - added external trigger to force a search scan (e.g. at shutdown, thanks to Ronny Kornexl) - fixed display of color keys while editing search term and directory (thanks to Ronny Kornexl) - recordings found with 'search in recordings' can now be replayed from result list - fixed menu switching now-program-now (thanks to dido@vdrportal) 2005-01-03: Version 0.0.5 - time in 'now', 'next',... can now be shifted with FastFwd and FastRew or with Green/Yellow when toggling with '0' (see README) - search results now display 't' ,'T', if there is already a timer for an entry, thanks to LordPSI@vdrportal. - translation of new things to finnish (as always thanks to Rolf Ahrenberg) - sorting by channel in repeatings should work now, thanks to LordPSI@vdrportal. - fixed searching in mode 'one word', thanks to LordPSI@vdrportal - fixed key blue and red in an empty search list, thanks to Ronny Kornexl - fixed compilation problem with vdr-1.3.10, thanks to rockclimber@vdrportal - fixed some function calls to thread safeness (thanks to ?) - fixed graphical progressbar, thanks to white_@vdrportal - rewritten the README's 2004-11-30: Version 0.0.4 - New feature 'search timers' (like vdradmins 'auto timers', see the readme, thanks to Rolf Ahrenberg for idea and code review) - Progressbar can now be set to graphical bars in setup (you have to apply a vdr-patch for this, see README, thanks to Uwe/egal from vdrportal for creating the needed fonts) - Added builtin command to commands menu to create a search from epg entry - Added builtin command to commands menu to switch to channel of selected entry - Added builtin command to commands menu to search the current epg entry in recordings (thanks to Adreas Kool for his patch) - Key "Blue" can now also be customized by setup (switch/search) - Key '0' toggles key mapping of red and blue key (thanks to Roman (Uatschitchun) from vdrportal for his idea) - Added 'day(s) of week' as search criterion - Executing a command on an epg entry now only closes command menu, not the whole plugin - Display of channel number in "what's on" controlled by setup - fixed column display to prevent cutting of channel name - fixed selection of current channel in "what's on now" (thanks to Leo from vdrportal for reporting this) - button 'ok' in empty search results jumps back to search list 2004-11-08: Version 0.0.3 - Added an ASCII-based progress bar to the 'what's on now' view of the schedules. (Usage and display width customizable by setup). - Added up to 4 user defined times besides "now" and "next" (you can use this for example for "primetime" or "late night") - Renamed plugin main entry from "EPG search" to "Search" - Added duration to search criterions - Added commands menu in 'search results' list - Behaviour of red key is now the same in 'search results' as in main menu of the plugin. - Updated history and readme's 2004-09-11: Version 0.0.2 - New feature for executing commands on epg items (see README) - Added script epg2autotimer.sh to create autotimers from epg - Added finnish translation (thanks to Rolf Ahrenberg, also for code review) - Behaviour of red key can now be switched by setup form "Standard" to "Commands". - code is now more structured - BUGFIX: Blue key for switching in summary should work now (thanks to Sir James Lachtveel and others for reporting this one) 2004-08-15: Version 0.0.1 - Initial revision. vdr-plugin-epgsearch/md5.c0000644000175000017500000002251312466747543015306 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ ///////////////////////////////////////////////////////////////////////// // MD5.cpp // Implementation file for MD5 class // // This C++ Class implementation of the original RSA Data Security, Inc. // MD5 Message-Digest Algorithm is copyright (c) 2002, Gary McNickle. // All rights reserved. This software is a derivative of the "RSA Data // Security, Inc. MD5 Message-Digest Algorithm" // // You may use this software free of any charge, but without any // warranty or implied warranty, provided that you follow the terms // of the original RSA copyright, listed below. // // Original RSA Data Security, Inc. Copyright notice ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All // rights reserved. // // License to copy and use this software is granted provided that it // is identified as the "RSA Data Security, Inc. MD5 Message-Digest // Algorithm" in all material mentioning or referencing this software // or this function. // License is also granted to make and use derivative works provided // that such works are identified as "derived from the RSA Data // Security, Inc. MD5 Message-Digest Algorithm" in all material // mentioning or referencing the derived work. // RSA Data Security, Inc. makes no representations concerning either // the merchantability of this software or the suitability of this // software for any particular purpose. It is provided "as is" // without express or implied warranty of any kind. // These notices must be retained in any copies of any part of this // documentation and/or software. ///////////////////////////////////////////////////////////////////////// #include #include #include #include #include "md5.h" static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 // PrintMD5: Converts a completed md5 digest into a char* string. char* PrintMD5(uchar md5Digest[16]) { char chBuffer[256]; char chEach[10]; int nCount; memset(chBuffer,0,256); memset(chEach, 0, 10); for (nCount = 0; nCount < 16; nCount++) { sprintf(chEach, "%02x", md5Digest[nCount]); strncat(chBuffer, chEach, sizeof(chEach)); } return strdup(chBuffer); } // MD5String: Performs the MD5 algorithm on a char* string, returning // the results as a char*. char* MD5String(char* szString) { int nLen = strlen(szString); md5 alg; alg.Update((unsigned char*)szString, (unsigned int)nLen); alg.Finalize(); return PrintMD5(alg.Digest()); } // md5::Init // Initializes a new context. void md5::Init() { memset(m_Count, 0, 2 * sizeof(uint4)); m_State[0] = 0x67452301; m_State[1] = 0xefcdab89; m_State[2] = 0x98badcfe; m_State[3] = 0x10325476; } // md5::Update // MD5 block update operation. Continues an MD5 message-digest // operation, processing another message block, and updating the // context. void md5::Update(uchar* chInput, uint4 nInputLen) { uint4 i, index, partLen; // Compute number of bytes mod 64 index = (unsigned int)((m_Count[0] >> 3) & 0x3F); // Update number of bits if ((m_Count[0] += (nInputLen << 3)) < (nInputLen << 3)) m_Count[1]++; m_Count[1] += (nInputLen >> 29); partLen = 64 - index; // Transform as many times as possible. if (nInputLen >= partLen) { memcpy( &m_Buffer[index], chInput, partLen ); Transform(m_Buffer); for (i = partLen; i + 63 < nInputLen; i += 64) Transform(&chInput[i]); index = 0; } else i = 0; // Buffer remaining input memcpy( &m_Buffer[index], &chInput[i], nInputLen-i ); } // md5::Finalize // MD5 finalization. Ends an MD5 message-digest operation, writing // the message digest and zeroizing the context. void md5::Finalize() { uchar bits[8]; uint4 index, padLen; // Save number of bits Encode (bits, m_Count, 8); // Pad out to 56 mod 64 index = (unsigned int)((m_Count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); Update(PADDING, padLen); // Append length (before padding) Update (bits, 8); // Store state in digest Encode (m_Digest, m_State, 16); memset(m_Count, 0, 2 * sizeof(uint4)); memset(m_State, 0, 4 * sizeof(uint4)); memset(m_Buffer,0, 64 * sizeof(uchar)); } // md5::Transform // MD5 basic transformation. Transforms state based on block. void md5::Transform (uchar* block) { uint4 a = m_State[0], b = m_State[1], c = m_State[2], d = m_State[3], x[16]; Decode (x, block, 64); // Round 1 FF (a, b, c, d, x[ 0], S11, 0xd76aa478); FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); FF (c, d, a, b, x[ 2], S13, 0x242070db); FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); FF (d, a, b, c, x[ 5], S12, 0x4787c62a); FF (c, d, a, b, x[ 6], S13, 0xa8304613); FF (b, c, d, a, x[ 7], S14, 0xfd469501); FF (a, b, c, d, x[ 8], S11, 0x698098d8); FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); FF (c, d, a, b, x[10], S13, 0xffff5bb1); FF (b, c, d, a, x[11], S14, 0x895cd7be); FF (a, b, c, d, x[12], S11, 0x6b901122); FF (d, a, b, c, x[13], S12, 0xfd987193); FF (c, d, a, b, x[14], S13, 0xa679438e); FF (b, c, d, a, x[15], S14, 0x49b40821); // Round 2 GG (a, b, c, d, x[ 1], S21, 0xf61e2562); GG (d, a, b, c, x[ 6], S22, 0xc040b340); GG (c, d, a, b, x[11], S23, 0x265e5a51); GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); GG (a, b, c, d, x[ 5], S21, 0xd62f105d); GG (d, a, b, c, x[10], S22, 0x2441453); GG (c, d, a, b, x[15], S23, 0xd8a1e681); GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); GG (d, a, b, c, x[14], S22, 0xc33707d6); GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); GG (b, c, d, a, x[ 8], S24, 0x455a14ed); GG (a, b, c, d, x[13], S21, 0xa9e3e905); GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); GG (c, d, a, b, x[ 7], S23, 0x676f02d9); GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); // Round 3 HH (a, b, c, d, x[ 5], S31, 0xfffa3942); HH (d, a, b, c, x[ 8], S32, 0x8771f681); HH (c, d, a, b, x[11], S33, 0x6d9d6122); HH (b, c, d, a, x[14], S34, 0xfde5380c); HH (a, b, c, d, x[ 1], S31, 0xa4beea44); HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); HH (b, c, d, a, x[10], S34, 0xbebfbc70); HH (a, b, c, d, x[13], S31, 0x289b7ec6); HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); HH (b, c, d, a, x[ 6], S34, 0x4881d05); HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); HH (d, a, b, c, x[12], S32, 0xe6db99e5); HH (c, d, a, b, x[15], S33, 0x1fa27cf8); HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); // Round 4 II (a, b, c, d, x[ 0], S41, 0xf4292244); II (d, a, b, c, x[ 7], S42, 0x432aff97); II (c, d, a, b, x[14], S43, 0xab9423a7); II (b, c, d, a, x[ 5], S44, 0xfc93a039); II (a, b, c, d, x[12], S41, 0x655b59c3); II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); II (c, d, a, b, x[10], S43, 0xffeff47d); II (b, c, d, a, x[ 1], S44, 0x85845dd1); II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); II (d, a, b, c, x[15], S42, 0xfe2ce6e0); II (c, d, a, b, x[ 6], S43, 0xa3014314); II (b, c, d, a, x[13], S44, 0x4e0811a1); II (a, b, c, d, x[ 4], S41, 0xf7537e82); II (d, a, b, c, x[11], S42, 0xbd3af235); II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); II (b, c, d, a, x[ 9], S44, 0xeb86d391); m_State[0] += a; m_State[1] += b; m_State[2] += c; m_State[3] += d; memset(x, 0, sizeof(x)); } // md5::Encode // Encodes input (uint4) into output (uchar). Assumes nLength is // a multiple of 4. void md5::Encode(uchar* dest, uint4* src, uint4 nLength) { uint4 i, j; assert(nLength % 4 == 0); for (i = 0, j = 0; j < nLength; i++, j += 4) { dest[j] = (uchar)(src[i] & 0xff); dest[j+1] = (uchar)((src[i] >> 8) & 0xff); dest[j+2] = (uchar)((src[i] >> 16) & 0xff); dest[j+3] = (uchar)((src[i] >> 24) & 0xff); } } // md5::Decode // Decodes input (uchar) into output (uint4). Assumes nLength is // a multiple of 4. void md5::Decode(uint4* dest, uchar* src, uint4 nLength) { uint4 i, j; assert(nLength % 4 == 0); for (i = 0, j = 0; j < nLength; i++, j += 4) { dest[i] = ((uint4)src[j]) | (((uint4)src[j+1])<<8) | (((uint4)src[j+2])<<16) | (((uint4)src[j+3])<<24); } } vdr-plugin-epgsearch/recdone.h0000644000175000017500000000522312466747543016244 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __RECDONE_H #define __RECDONE_H #include #include #include #include "epgsearchext.h" class cSearchExt; // --- cRecDone -------------------------------------------------------- class cRecDone : public cListObject { public: char *title; // Title of this event char *shortText; // Short description of this event char *description; // Description of this event char *aux; // Aux info time_t startTime; // Start time of the timer int duration; int searchID; // ID of the search, that triggered this recording tChannelID channelID; char* rawdescription; static char *buffer; cRecDone(); cRecDone(cTimer*, const cEvent* event, cSearchExt* search); ~cRecDone(); static bool Read(FILE *f); bool Parse(char *s); const char *ToText(void); bool Save(FILE *f); int ChannelNr(); }; class cRecsDone : public cList, public cMutex { private: char *fileName; public: void Clear(void) { free(fileName); fileName = NULL; cList::Clear(); } cRecsDone(void) { fileName = NULL; } int GetCountRecordings(const cEvent* event, cSearchExt* search, cRecDone** first = NULL, int matchLimit = 90); int GetCountRecordings(const cEvent*, bool compareTitle, int compareSubtitle, bool compareSummary, int compareDate, unsigned long, cRecDone** first = NULL, int matchLimit = 90); int GetTotalCountRecordings(cSearchExt* search, cRecDone** first); void RemoveSearchID(int ID); bool Load(const char *FileName = NULL); bool Save(void); }; extern cRecsDone RecsDone; #endif vdr-plugin-epgsearch/rcfile.h0000644000175000017500000000323012466747543016065 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCHRCFILE_H #define __EPGSEARCHRCFILE_H #include #define MAXSTRINGLEN 256 class cRCLine : public cListObject { private: char *name; char *value; public: cRCLine(void); cRCLine(const char *Name, const char *Value); virtual ~cRCLine(); const char *Name(void) { return name; } const char *Value(void) { return value; } bool Parse(char *s); }; class cRCFile : public cConfig { bool Parse(const char *Name, const char *Value); public: cRCFile(); bool Load(const char *FileName); char Search[MAXSTRINGLEN]; int SearchMode; int ChannelNr; int UseTitle; int UseSubtitle; int UseDescr; }; #endif vdr-plugin-epgsearch/recstatus.h0000644000175000017500000000355112466747543016644 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "recdone.h" #include "epgsearchtools.h" // --- cRecDoneTimerObj -------------------------------------------------------- class cRecDoneTimerObj : public cTimerObj { public: int deviceNr; cRecDone* recDone; time_t lastBreak; public: cRecDoneTimerObj(cTimer* Timer, int DeviceNr) : cTimerObj(Timer), deviceNr(DeviceNr), recDone(NULL), lastBreak(0) {} ~cRecDoneTimerObj() { timer = NULL; recDone = NULL; } // do not delete anything! }; class cRecStatusMonitor : public cStatus { cList TimersRecording; protected: virtual void Recording(const cDevice *Device, const char *Name, const char*, bool On); public: cRecStatusMonitor(); int TimerRecDevice(cTimer*); bool IsPesRecording(cRecording *pRecording); int RecLengthInSecs(cRecording *pRecording); }; extern cRecStatusMonitor* gl_recStatusMonitor; vdr-plugin-epgsearch/po/0000755000175000017500000000000012466747543015070 5ustar tobiastobiasvdr-plugin-epgsearch/po/sv_SE.po0000644000175000017500000005643512466747543016464 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Tomas Prybil , 2002 # Jan Ekholm , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Tomas Prybil \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "Inspelning" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Inställningar" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" #, fuzzy msgid "Button$Orphaned" msgstr "Inspelning" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Inspelning" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/da_DK.po0000644000175000017500000005636112466747543016405 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Mogens Elneff , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Mogens Elneff \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" #, fuzzy msgid "Button$Commands" msgstr "Optag" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Indstillinger" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" #, fuzzy msgid "Button$Orphaned" msgstr "Optag" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Optag" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/es_ES.po0000644000175000017500000012017012466747543016427 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Users from todopvr.com: agusmir, bittor, dragondefuego, GenaroL, lopezm and nachofr # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-11-18 20:09+0200\n" "Last-Translator: bittor from open7x0.org \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "Grupos de canales" msgid "Button$Select" msgstr "Seleccionar" msgid "Channel group used by:" msgstr "Grupo de canales usado por:" msgid "Edit$Delete group?" msgstr "¿Borrar grupo?" msgid "Edit channel group" msgstr "Editar grupo de canales" msgid "Group name" msgstr "Nombre del grupo" msgid "Button$Invert selection" msgstr "Invertir selección" msgid "Button$All yes" msgstr "Todo sí" msgid "Button$All no" msgstr "Todo no" msgid "Group name is empty!" msgstr "¡Nombre del grupo vacío!" msgid "Group name already exists!" msgstr "¡Ya existe el nombre del grupo!" msgid "Direct access to epgsearch's conflict check menu" msgstr "Acceso directo al menú de conflictos EPGSearch" msgid "Timer conflicts" msgstr "Conflictos de programación" msgid "Conflict info in main menu" msgstr "Mostrar conflictos en menú principal" msgid "next" msgstr "siguiente" #, c-format msgid "timer conflict at %s! Show it?" msgstr "¿Mostrar conflicto de programación a las %s?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "¡%d conflictos de programación! El 1º a las %s. ¿Mostrarlos?" msgid "search the EPG for repeats and more" msgstr "Buscar repeticiones en la EPG" msgid "Program guide" msgstr "Guía de programación" msgid "search timer update running" msgstr "Actualizando programación por búsqueda" msgid "Direct access to epgsearch's search menu" msgstr "Acceso directo al menú de búsquedas en EPG" msgid "Search" msgstr "Búsquedas en EPG" msgid "EpgSearch-Search in main menu" msgstr "Búsquedas en EPG en menú principal" msgid "Button$Help" msgstr "Ayuda" msgid "Standard" msgstr "Estándar" msgid "Button$Commands" msgstr "Órdenes" msgid "Button$Search" msgstr "Buscar" msgid "never" msgstr "nunca" msgid "always" msgstr "siempre" msgid "smart" msgstr "inteligente" msgid "before user-def. times" msgstr "antes hora-def." msgid "after user-def. times" msgstr "después hora-def." msgid "before 'next'" msgstr "antes de 'Después'" msgid "General" msgstr "General" msgid "EPG menus" msgstr "Menús EPG" msgid "User-defined EPG times" msgstr "Horario EPG definido por el usuario" msgid "Timer programming" msgstr "Programación" msgid "Search and search timers" msgstr "Búsqueda y programaciones por búsqueda" msgid "Timer conflict checking" msgstr "Comprobando conflictos de programación" msgid "Email notification" msgstr "Notificación por correo" msgid "Hide main menu entry" msgstr "Ocultar entrada del menú principal" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Oculta la entrada del menú principal y puede ser útil si este plugin sustituye a la entrada 'Guía de programación' original." msgid "Main menu entry" msgstr "Entrada en el menú principal" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "El nombre de la entrada para el menú principal, que por defecto es 'Guía de programación'." msgid "Replace original schedule" msgstr "Sustituir guía de prog. original" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "Aquí puede des/activar que éste plugin sustituya la entrada original 'Guía de programación', pero sólo funciona cuando el VDR está parcheado para permitirlo." msgid "Start menu" msgstr "Menú de inicio" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "Elija entre 'Ahora' y 'Guía de programación' como menú inicial cuando se llama a este plugin." msgid "Ok key" msgstr "Botón OK" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" "Elija el comportamiento del botón 'OK'. Puede usarse para mostrar el resumen o cambiar al canal correspondiente.\n" "Nota: la funcionalidad del botón 'azul' (Cambiar/Info/Buscar) depende de ésta configuración." msgid "Red key" msgstr "Botón rojo" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" "Elija la función estándar ('Grabar' u 'Órdenes') que desee tener en el botón rojo.\n" "(Puede alternarse con el botón '0')" msgid "Blue key" msgstr "Botón azul" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" "Elija la función estándar ('Cambiar'/'Info' o 'Buscar') que desee tener en el botón azul.\n" "(Puede alternarse con el botón '0')" msgid "Show progress in 'Now'" msgstr "Mostrar progreso en 'Ahora'" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "Muestra una barra de progreso en la pantalla 'Ahora' que informa sobre el tiempo restante de la emisión actual." msgid "Show channel numbers" msgstr "Mostrar el número de los canales" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" "Muestra el número de los canales en la pantalla 'Ahora'.\n" "\n" "(Para definir el menú totalmente a su gusto, por favor lea el MANUAL)" msgid "Show channel separators" msgstr "Mostrar separadores de canales" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "Muestra los grupos de canales VDR como separadores entre sus canales en la pantalla 'Ahora'." msgid "Show day separators" msgstr "Mostrar separadores de día" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "Muestra una línea de separación al cambiar de día en la 'Guía de programación'." msgid "Show radio channels" msgstr "Mostrar los canales de radio" msgid "Help$Show also radio channels." msgstr "Mostrar también los canales de radio" msgid "Limit channels from 1 to" msgstr "Limitar canales de 1 a" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "Si tiene un gran número de canales, puede acelerar los menús limitando los canales mostrados con éste parámetro. Use '0' para desactivar el límite." msgid "'One press' timer creation" msgstr "Crear programación inmediata" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "Cuando crea una programación con 'Grabar', puede elegir entre crearla inmediatamente o mostrar el menú para editarla." msgid "Show channels without EPG" msgstr "Mostrar canales sin EPG" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "Elija 'sí' cuando desee mostrar los canales sin EPG en la pantalla 'Ahora'. Pulse 'OK' sobre estas entradas para cambiar a ese canal." msgid "Time interval for FRew/FFwd [min]" msgstr "Minutos para Rebobinar/Avanzar" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" "Elija el intervalo de tiempo que se usará para saltar a través de la EPG pulsando '<<' y '>>'.\n" "\n" "(Si no tiene estos botones en su mando a distancia, puede acceder a esta funcionalidad pulsando el botón '0' y tendrá las funciones '<<' y '>>' en los botones verde y amarillo)" msgid "Toggle Green/Yellow" msgstr "Alternar Verde/Amarillo" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "Especifique si los botones verde y amarillo también cambian al pulsar '0'." msgid "Show favorites menu" msgstr "Mostrar el menú favoritos" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" "Un menú de favoritos puede mostrar una lista de sus emisiones favoritas. Actívelo si desea un menú adicional a los existentes 'Ahora' y 'Después'.\n" "Algunas búsquedas pueden ser usadas como favoritos si activa la opción 'Usar en el menú favoritos' cuando edita una búsqueda." msgid "for the next ... hours" msgstr "para las próximas ... horas" msgid "Help$This value controls the timespan used to display your favorites." msgstr "Éste valor controla el intervalo usado para mostrar sus favoritos." msgid "Use user-defined time" msgstr "Usar horario definido por usuario" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "Además de 'Ahora' y 'Después' puede definir hasta 4 horarios distintos en la EPG, que pueden usarse pulsando varias veces el botón verde, p.e. 'hora de mayor audiencia', 'medianoche', ..." msgid "Description" msgstr "Descripción" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "Ésta es la descripción de su horario definido que se mostrará como etiqueta del botón verde." msgid "Time" msgstr "Horario" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "Especifique el horario definido en 'HH:MM'." msgid "Use VDR's timer edit menu" msgstr "Usar menú editar programación VDR" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" "Este plugin posee un editor de programaciones que amplía el original con ciertas funcionalidades adicionales como:\n" "- una entrada adicional de directorio\n" "- definir días de la semana para repetir programaciones\n" "- añadir el nombre del episodio\n" "- soporte para variables EPG (ver el MANUAL)" msgid "Default recording dir" msgstr "Dir. de grabación por defecto" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "Cuando crea una programación, aquí puede especificar un directorio por defecto para la grabación." msgid "Add episode to manual timers" msgstr "Añadir episodio a prog. manual" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" "Cuando crea una programación en serie, puede añadir automáticamente el nombre del episodio.\n" "\n" "- nunca: no añadir\n" "- siempre: si existe, añadir siempre el nombre del episodio\n" "- inteligente: añadir solamente si la emisión dura menos de 80 minutos." msgid "Default timer check method" msgstr "Método de comprobación por defecto" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" "Las programaciones manuales pueden comprobar cambios en la EPG. Aquí puede establecer el método de comprobación por defecto para cada canal. Elija entre\n" "\n" "- sin comprobación.\n" "- por ID de emisión: comprueba un ID de emisión suministrado por el emisor del canal.\n" "- por canal y hora: comprueba que coincida la duración." msgid "Button$Setup" msgstr "Configuración" msgid "Use search timers" msgstr "Usar programaciones por búsqueda" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "'Programaciones por búsqueda' se usa para crear automáticamente programaciones de emisiones que coincidan con los criterios de búsqueda." msgid " Update interval [min]" msgstr " Intervalo de actualización [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "Especifique el intervalo de tiempo con el que se buscarán nuevas emisiones." msgid " SVDRP port" msgstr " Puerto SVDRP" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "Las nuevas programaciones o cambios de programación se realizan con SVDRP. El valor por defecto debe ser correcto, sólo modifíquelo si sabe lo que está haciendo." msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "Especifique la prioridad por defecto de las programaciones creadas con este plugin. Éste valor también lo puede establecer para cada búsqueda." msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Especifique el tiempo de duración por defecto de las programaciones/grabaciones creadas con este plugin. Éste valor también lo puede establecer para cada búsqueda." msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Especifique el margen de tiempo por defecto para el inicio de las programaciones/grabaciones creadas con este plugin. Éste valor también lo puede establecer para cada búsqueda." msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Especifique el margen de tiempo por defecto para el final de las programaciones/grabaciones creadas con este plugin. Éste valor también lo puede establecer para cada búsqueda." msgid "No announcements when replaying" msgstr "Sin avisos mientras se reproduce" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "Establecer a 'sí' cuando no desee recibir ningún aviso de emisiones durante una reproducción." msgid "Recreate timers after deletion" msgstr "Recrear programaciones tras borrar" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "Establecer a 'sí' cuando desee que las programaciones se creen de nuevo con la siguiente actualización de programación por búsqueda después de borrarlas." msgid "Check if EPG exists for ... [h]" msgstr "" #, fuzzy msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "Establecer a 'sí' cuando desee comprobar conflictos después de actualizar cada programación por búsqueda." #, fuzzy msgid "Warn by OSD" msgstr "Sólo avisar" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "Establecer a 'sí' cuando desee recibir una notificación por correo sobre los conflictos de programación." #, fuzzy msgid "Warn by mail" msgstr "Sólo avisar" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "Establecer a 'sí' cuando su cuenta necesite autenticación para enviar correos." #, fuzzy msgid "Channel group to check" msgstr "Grupo de canales" #, fuzzy msgid "Help$Specify the channel group to check." msgstr "Especifique el nombre de la plantilla." msgid "Ignore PayTV channels" msgstr "Ignorar los canales de pago" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "Establecer a 'sí' cuando no desee buscar en los canales de pago." msgid "Search templates" msgstr "Plantillas de búsqueda" msgid "Help$Here you can setup templates for your searches." msgstr "Aquí puede configurar las plantillas de búsqueda." msgid "Blacklists" msgstr "Listas negras" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "Aquí puede configurar las listas negras, que pueden ser usadas para excluir emisiones no deseadas." msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "Aquí puede configurar los grupos de canales que pueden ser usados en una búsqueda. Éstos son diferentes a los grupos de canales del VDR y representan un conjunto de canales arbitrario, p.e.: 'Cine'." msgid "Ignore below priority" msgstr "Ignorar la prioridad inferior" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Si falla una programación con una prioridad por debajo del valor dado, no será clasificada como importante. Después de una comprobación de conflictos, sólo los conflictos importantes mostrarán un mensaje OSD sobre el conflicto." msgid "Ignore conflict duration less ... min." msgstr "Ignorar conflicto inferior a ... min." msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Si la duración de un conflicto es menor que el número de minutos dado, no será clasificada como importante. Sólo los conflictos importantes mostrarán un mensaje OSD sobre el conflicto después de una comprobación de conflictos automática." msgid "Only check within next ... days" msgstr "Sólo comprobar los próximos ... días" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "Este valor reduce la comprobación de conflictos al rango de días dados. El resto de conflictos son clasificados como 'no importantes'." msgid "--- Automatic checking ---" msgstr "--- Comprobación automática ---" msgid "After each timer programming" msgstr "Después de cada programación" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "Establecer a 'sí' cuando desee ejecutar la comprobación de conflictos después de cada programación manual. En caso de existir un conflicto se mostrará inmediatamente un mensaje que informe de ello. Éste mensaje sólo se mostrará si la programación está implicada en un conflicto." msgid "When a recording starts" msgstr "Cuando empieza una grabación" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "Establecer a 'sí' cuando desee comprobar conflictos al iniciar una grabación. En caso de existir un conflicto se mostrará inmediatamente un mensaje que informe de ello. Éste mensaje sólo se mostrará si el conflicto se produce en las próximas 2 horas." msgid "After each search timer update" msgstr "Después de actualizar programación" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "Establecer a 'sí' cuando desee comprobar conflictos después de actualizar cada programación por búsqueda." msgid "every ... minutes" msgstr "cada ... minutos" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" "Especifique el intervalo de tiempo a usar para la comprobación de conflictos automática en segundo plano.\n" "('0' deshabilita la comprobación automática)" msgid "if conflicts within next ... minutes" msgstr "si hay conflictos en próximos ... min." msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "Si el próximo conflicto aparece en el número de minutos indicado, puede especificar un intervalo de comprobación menor para obtener más notificaciones OSD sobre él." msgid "Avoid notification when replaying" msgstr "Evitar notificación al reproducir" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "Establecer a 'sí' cuando no desee mostrar mensajes OSD de conflictos mientras está reproduciendo algo. Sin embargo, se mostrarán mensajes si el primer conflicto se produce en las 2 horas siguientes." msgid "Search timer notification" msgstr "Notificar prog. por búsqueda" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "Establecer a 'sí' cuando desee tener una notificación por correo de las programaciones por búsqueda que fueron creadas automáticamente." msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "Notificar conflicto en programación" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "Establecer a 'sí' cuando desee recibir una notificación por correo sobre los conflictos de programación." msgid "Send to" msgstr "Enviar a" msgid "Help$Specify the email address where notifications should be sent to." msgstr "Especifique la dirección de correo donde deben enviarse las notificaciones." msgid "Mail method" msgstr "Método de correo" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" "Especifique el método a usar para enviar correos.\n" "Puede elegir entre\n" " - 'sendmail': necesita un sistema de correo correctamente configurado\n" " - 'SendEmail.pl': script simple para la entrega de correo" msgid "--- Email account ---" msgstr "--- Cuenta de correo ---" msgid "Email address" msgstr "Dirección de correo" msgid "Help$Specify the email address where notifications should be sent from." msgstr "Especifique la dirección de correo desde donde se enviarán las notificaciones." msgid "SMTP server" msgstr "Servidor SMTP" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "Especifique el servidor SMTP que debe entregar las notificaciones. Si está usando un puerto distinto al normal(25) añada el puerto con \":puerto\"." msgid "Use SMTP authentication" msgstr "Usar autenticación SMTP" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "Establecer a 'sí' cuando su cuenta necesite autenticación para enviar correos." msgid "Auth user" msgstr "Usuario" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "Si esta cuenta necesita autenticación SMTP, especifique el usuario." msgid "Auth password" msgstr "Contraseña" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "Si esta cuenta necesita autenticación SMTP, especifique la contraseña." msgid "Mail account check failed!" msgstr "¡Falló la prueba de cuenta de correo!" msgid "Button$Test" msgstr "Probar" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " aábcçdeéfghiíjklmnñoópqrstuúüvwxyz0123456789-_.,#~\\^$[]|()*+?{}/:%@&_" msgid "Start/Stop time has changed" msgstr "Ha cambiado el tiempo inicial/final" msgid "Title/episode has changed" msgstr "Ha cambiado el título/episodio" msgid "No new timers were added." msgstr "No se añadieron nuevas programaciones." msgid "No timers were modified." msgstr "No se modificaron programaciones." msgid "No timers were deleted." msgstr "No se borraron programaciones." msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "¡Esta versión de EPGSearch no soporta este servicio!" msgid "EPGSearch does not exist!" msgstr "¡No existe EPGSearch!" #, c-format msgid "%d new broadcast" msgstr "%d nuevas emisiones" msgid "Button$by channel" msgstr "por canal" msgid "Button$by time" msgstr "por horario" msgid "Button$Episode" msgstr "Episodio" msgid "Button$Title" msgstr "Título" msgid "announce details" msgstr "detalles del aviso" msgid "announce again" msgstr "avisar otra vez" msgid "with next update" msgstr "con la próxima actualización" msgid "again from" msgstr "otra vez desde" msgid "Search timer" msgstr "Programación por búsqueda" msgid "Edit blacklist" msgstr "Editar la lista negra" msgid "phrase" msgstr "frase" msgid "all words" msgstr "palabra completa" msgid "at least one word" msgstr "mínimo 1 palabra" msgid "match exactly" msgstr "exacta" msgid "regular expression" msgstr "expresión regular" msgid "fuzzy" msgstr "imprecisa" msgid "user-defined" msgstr "definido por usuario" msgid "interval" msgstr "intervalo" msgid "channel group" msgstr "grupo de canales" msgid "only FTA" msgstr "sólo en abierto" msgid "Search term" msgstr "Buscar palabra" msgid "Search mode" msgstr "Modo de búsqueda" msgid "Tolerance" msgstr "Tolerancia" msgid "Match case" msgstr "Mayúscula/minúscula" msgid "Use title" msgstr "Usar título" msgid "Use subtitle" msgstr "Usar subtítulo" msgid "Use description" msgstr "Usar descripción" msgid "Use extended EPG info" msgstr "Usar info ampliada de la EPG" msgid "Ignore missing categories" msgstr "Ignorar categorías perdidas" msgid "Use channel" msgstr "Usar canal" msgid " from channel" msgstr " desde el canal" msgid " to channel" msgstr " hasta el canal" msgid "Channel group" msgstr "Grupo de canales" msgid "Use time" msgstr "Usar horario" msgid " Start after" msgstr " Comenzar después" msgid " Start before" msgstr " Comenzar antes" msgid "Use duration" msgstr "Usar duración" msgid " Min. duration" msgstr " Duración mín." msgid " Max. duration" msgstr " Duración máx." msgid "Use day of week" msgstr "Usar día de la semana" msgid "Day of week" msgstr "Día de la semana" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "Plantillas" msgid "*** Invalid Channel ***" msgstr "*** Canal no válido ***" msgid "Please check channel criteria!" msgstr "¡Compruebe requisitos del canal!" msgid "Edit$Delete blacklist?" msgstr "¿Borrar la lista negra?" msgid "Repeats" msgstr "Repeticiones" msgid "Create search" msgstr "Crear una búsqueda" msgid "Search in recordings" msgstr "Buscar en las grabaciones" msgid "Mark as 'already recorded'?" msgstr "¿Marcar como 'ya grabado'?" msgid "Add/Remove to/from switch list?" msgstr "¿Añadir/Borrar a/de la lista de cambio?" msgid "Create blacklist" msgstr "Crear lista negra" msgid "EPG Commands" msgstr "Órdenes EPG" msgid "Already running!" msgstr "¡Ya se está ejecutando!" msgid "Add to switch list?" msgstr "¿Añadir a la lista de cambio?" msgid "Delete from switch list?" msgstr "¿Borrar de la lista de cambio?" msgid "Button$Details" msgstr "Detalles" msgid "Button$Filter" msgstr "Filtro" msgid "Button$Show all" msgstr "Mostrar todo" msgid "conflicts" msgstr "conflictos" msgid "no conflicts!" msgstr "¡no hay conflictos!" msgid "no important conflicts!" msgstr "¡no hay conflictos importantes!" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "Repeticiones" msgid "no check" msgstr "sin comprobación" msgid "by channel and time" msgstr "por canal y hora" msgid "by event ID" msgstr "por ID de emisión" msgid "Select directory" msgstr "Seleccionar directorio" msgid "Button$Level" msgstr "Nivel" msgid "Event" msgstr "Emisión" msgid "Favorites" msgstr "Favoritos" msgid "Search results" msgstr "Resultados de la búsqueda" msgid "Timer conflict! Show?" msgstr "¿Mostrar conflicto de programación?" msgid "Directory" msgstr "Directorio" msgid "Channel" msgstr "Canal" msgid "Childlock" msgstr "Bloqueo niños" msgid "Timer check" msgstr "Comprobación" msgid "recording with device" msgstr "grabación con dispositivo" msgid "Button$With subtitle" msgstr "Con subtítulo" msgid "Button$Without subtitle" msgstr "Sin subtítulo" msgid "Button$Extended" msgstr "Ampliado" msgid "Button$Simple" msgstr "Simple" msgid "Use blacklists" msgstr "Usar listas negras" msgid "Edit$Search text too short - use anyway?" msgstr "El texto a buscar es muy corto - ¿usar de todas formas?" #, fuzzy msgid "Button$Orphaned" msgstr "por canal" msgid "Button$by name" msgstr "por nombre" msgid "Button$by date" msgstr "por fecha" msgid "Button$Delete all" msgstr "Borrar todo" msgid "Recordings" msgstr "Grabaciones" msgid "Edit$Delete entry?" msgstr "¿Borrar entrada?" msgid "Edit$Delete all entries?" msgstr "¿Borrar todas las entradas?" msgid "Summary" msgstr "Resumen" msgid "Auxiliary info" msgstr "Más información" msgid "Button$Aux info" msgstr "Más info" msgid "Search actions" msgstr "Acciones de búsqueda" msgid "Execute search" msgstr "Realizar búsqueda" msgid "Use as search timer on/off" msgstr "Usar como prog. por búsqueda sí/no" msgid "Trigger search timer update" msgstr "Actualizar prog. por búsqueda" msgid "Show recordings done" msgstr "Mostrar grabaciones realizadas" msgid "Show timers created" msgstr "Mostrar programaciones creadas" msgid "Create a copy" msgstr "Crear una copia" msgid "Use as template" msgstr "Usar como plantilla" msgid "Show switch list" msgstr "Mostrar lista de cambio" msgid "Show blacklists" msgstr "Mostrar listas negras" msgid "Delete created timers?" msgstr "¿Borrar las programaciones creadas?" msgid "Timer conflict check" msgstr "Comprobar conflictos de programación" msgid "Disable associated timers too?" msgstr "¿Desactivar las programaciones asociadas?" msgid "Activate associated timers too?" msgstr "¿Activar las programaciones asociadas?" msgid "Search timers activated in setup." msgstr "Progs. por búsqueda activas en la configuración." msgid "Run search timer update?" msgstr "¿Actualizar programación por búsqueda?" msgid "Copy this entry?" msgstr "¿Copiar esta entrada?" msgid "Copy" msgstr "Copiar" msgid "Copy this entry to templates?" msgstr "¿Copiar esta entrada a plantillas?" msgid "Delete all timers created from this search?" msgstr "¿Borrar las programaciones creadas por esta búsqueda?" msgid "Button$Actions" msgstr "Acciones" msgid "Search entries" msgstr "Entradas de búsqueda" msgid "active" msgstr "activa" msgid "Edit$Delete search?" msgstr "¿Borrar la búsqueda?" msgid "Edit search" msgstr "Editar búsqueda" msgid "Record" msgstr "Grabar" #, fuzzy msgid "Announce by OSD" msgstr "Sólo avisar" msgid "Switch only" msgstr "Cambiar de canal" msgid "Announce and switch" msgstr "Avisar y cambiar" #, fuzzy msgid "Announce by mail" msgstr "Sólo avisar" msgid "only globals" msgstr "" msgid "Selection" msgstr "selección" msgid "all" msgstr "todo" msgid "count recordings" msgstr "incluir grabaciones" msgid "count days" msgstr "incluir días" msgid "if present" msgstr "si existe" #, fuzzy msgid "same day" msgstr "Último día" #, fuzzy msgid "same week" msgstr "Día de la semana" msgid "same month" msgstr "" msgid "Template name" msgstr "Nombre de la plantilla" msgid "Help$Specify the name of the template." msgstr "Especifique el nombre de la plantilla." msgid "Help$Specify here the term to search for." msgstr "Especifique la palabra a buscar." msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" "Existen los siguientes modos de búsqueda:\n" "\n" "- frase: búsquedas por subpalabras\n" "- palabra completa: deben aparecer todas las palabras\n" "- mínimo 1 palabra: debe aparecer al menos una palabra\n" "- exacta: debe coincidir exactamente\n" "- expresión regular: coincidir con una expresión regular\n" "- imprecisa: búsquedas por aproximación" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "Establece la tolerancia de la búsqueda imprecisa. El valor representa los errores permitidos." msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "Establecer a 'Sí' cuando la búsqueda deba coincidir con el valor dado." msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "Establecer a 'Sí' cuando desee buscar en el título de una emisión." msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "Establecer a 'Sí' cuando desee buscar en el episodio de una emisión." msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "Establecer a 'Sí' cuando desee buscar en el resumen de una emisión." #, fuzzy msgid "Use content descriptor" msgstr "Usar descripción" #, fuzzy msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "Establecer a 'Sí' cuando desee buscar en el título de una emisión." msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "El resumen de una emisión puede contener información adicional como 'Género', 'Categoría', 'Año', ... llamada 'categorías EPG' en el EPGSearch. A menudo los proveedores EPG externos ofrecen esta información. Esto permite refinar una búsqueda y otras funcionalidades atractivas, como buscar por el 'consejo del día'. Para usarlo, establecer a 'Sí'." msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "El archivo epgsearchcats.conf especifica el modo de búsqueda de esta entrada. Se puede buscar por texto o por valor. También puede editar una lista de valores predefinidos en este archivo que puede seleccionar aquí." msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "Si una categoría seleccionada no es parte del resumen de una emisión, normalmente ésta no incluye ese evento en los resultados de la búsqueda. Para evitarlo establezca esta opción a 'Sí', pero maneje esto con cuidado para evitar una gran cantidad de resultados." msgid "Use in favorites menu" msgstr "Usar en el menú favoritos" msgid "Result menu layout" msgstr "Presentación de resultados" msgid "Use as search timer" msgstr "Usar como prog. por búsqueda" msgid "Action" msgstr "Acción" msgid "Switch ... minutes before start" msgstr "Cambiar ... minutos antes del inicio" msgid "Unmute sound" msgstr "Sonido quitar silencio" msgid "Ask ... minutes before start" msgstr "Preguntar ... minutos antes del inicio" msgid " Series recording" msgstr " Grabación en serie" msgid "Delete recordings after ... days" msgstr "Borrar grabación a los ... días" msgid "Keep ... recordings" msgstr "Mantener ... grabaciones" msgid "Pause when ... recordings exist" msgstr "Pausar al tener ... grabaciones" msgid "Avoid repeats" msgstr "Evitar repeticiones" msgid "Allowed repeats" msgstr "Permitir repeticiones" msgid "Only repeats within ... days" msgstr "Sólo repetidos dentro de ... días" msgid "Compare title" msgstr "Comparar título" msgid "Compare subtitle" msgstr "Comparar subtítulo" msgid "Compare summary" msgstr "Comparar resumen" #, fuzzy msgid "Min. match in %" msgstr " Duración mín." #, fuzzy msgid "Compare date" msgstr "Comparar título" msgid "Compare categories" msgstr "Comparar categorías" msgid "VPS" msgstr "VPS" msgid "Auto delete" msgstr "Auto borrar" msgid "after ... recordings" msgstr "después ... grabaciones" msgid "after ... days after first rec." msgstr "después ... días de la 1ª grab." msgid "Edit user-defined days of week" msgstr "Editar días de la semana definidos por el usuario" msgid "Compare" msgstr "Comparar" msgid "Select blacklists" msgstr "Seleccionar las listas negras" msgid "Values for EPG category" msgstr "Valores para categorías EPG" msgid "Button$Apply" msgstr "Aplicar" msgid "less" msgstr "menor" msgid "less or equal" msgstr "menor o igual" msgid "greater" msgstr "mayor" msgid "greater or equal" msgstr "mayor o igual" msgid "equal" msgstr "igual" msgid "not equal" msgstr "distinto" msgid "Activation of search timer" msgstr "Activar prog. por búsqueda" msgid "First day" msgstr "Primer día" msgid "Last day" msgstr "Último día" msgid "Button$all channels" msgstr "todos los canales" msgid "Button$only FTA" msgstr "sólo en abierto" msgid "Button$Timer preview" msgstr "Previsualizar programación" msgid "Blacklist results" msgstr "Resultados de la lista negra" msgid "found recordings" msgstr "grabaciones encontradas" msgid "Error while accessing recording!" msgstr "¡Error al acceder a grabación!" msgid "Button$Default" msgstr "Por defecto" msgid "Edit$Delete template?" msgstr "¿Borrar plantilla?" msgid "Overwrite existing entries?" msgstr "¿Sobrescribir las entradas existentes?" msgid "Edit entry" msgstr "Editar entrada" msgid "Switch" msgstr "Cambiar" msgid "Announce only" msgstr "Sólo avisar" msgid "Announce ... minutes before start" msgstr "Avisar ... minutos antes del inicio" msgid "action at" msgstr "ejecutar a las" msgid "Switch list" msgstr "Lista de cambio" msgid "Edit template" msgstr "Editar plantilla" msgid "Timers" msgstr "Programaciones" msgid ">>> no info! <<<" msgstr " «sin información» " msgid "Overview" msgstr "Resumen" msgid "Button$Favorites" msgstr "Favoritos" msgid "Quick search for broadcasts" msgstr "Búsqueda rápida de emisiones" msgid "Quick search" msgstr "Búsqueda rápida" msgid "Show in main menu" msgstr "Mostrar en menú principal" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "¡%d nuevas emisiones encontradas! ¿Mostrarlas?" msgid "Search timer update done!" msgstr "¡Programación por búsqueda actualizada!" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "¿Cambiar a (%d) '%s'?" msgid "Programming timer failed!" msgstr "¡La programación ha fallado!" #~ msgid "in %02ldd" #~ msgstr "en %02ldd" #~ msgid "in %02ldh" #~ msgstr "en %02ldh" #~ msgid "in %02ldm" #~ msgstr "en %02ldm" #, fuzzy #~ msgid "Compare expression" #~ msgstr "expresión regular" vdr-plugin-epgsearch/po/fi_FI.po0000644000175000017500000011656012466747543016415 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Rolf Ahrenberg , 2003-2011 # Ville Skyttä , 2009, 2011 # msgid "" msgstr "" "Project-Id-Version: EPGSearch 0.9.25\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2011-01-04 21:07+0200\n" "Last-Translator: Ville Skyttä \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Channel groups" msgstr "Kanavaryhmät" msgid "Button$Select" msgstr "Valitse" msgid "Channel group used by:" msgstr "Kanavaryhmä käytössä:" msgid "Edit$Delete group?" msgstr "Poistetaanko kanavaryhmä?" msgid "Edit channel group" msgstr "Muokkaa kanavaryhmää" msgid "Group name" msgstr "Kanavaryhmän nimi" msgid "Button$Invert selection" msgstr "Päinvastoin" msgid "Button$All yes" msgstr "Kaikki" msgid "Button$All no" msgstr "Ei yhtään" msgid "Group name is empty!" msgstr "Kanavaryhmältä puuttuu nimi!" msgid "Group name already exists!" msgstr "Samanniminen kanavaryhmä on jo olemassa!" msgid "Direct access to epgsearch's conflict check menu" msgstr "Suoratoiminto EPGSearch-laajennoksen ajastimien tarkistukselle" msgid "Timer conflicts" msgstr "Päällekkäiset ajastimet" msgid "Conflict info in main menu" msgstr "Näytä päällekkäisyydet päävalikossa" msgid "next" msgstr "seuraava" #, c-format msgid "timer conflict at %s! Show it?" msgstr "Päällekkäinen ajastin (%s)! Näytetäänkö?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "Päällekkäisiä ajastimia %d kpl (%s)! Näytetäänkö?" msgid "search the EPG for repeats and more" msgstr "Monipuolinen ohjelmaopas hakutoiminnolla" msgid "Program guide" msgstr "Ohjelmaopas" msgid "search timer update running" msgstr "hakuajastimien päivitys käynnissä" msgid "Direct access to epgsearch's search menu" msgstr "Suoratoiminto EPGSearch-laajennoksen haulle" msgid "Search" msgstr "Etsi ohjelmaoppaasta" msgid "EpgSearch-Search in main menu" msgstr "EpgSearch-laajennoksen hakutoiminto päävalikossa" msgid "Button$Help" msgstr "Opaste" msgid "Standard" msgstr "Vakio" msgid "Button$Commands" msgstr "Komennot" msgid "Button$Search" msgstr "Etsi" msgid "never" msgstr "ei koskaan" msgid "always" msgstr "aina" msgid "smart" msgstr "älykkäästi" msgid "before user-def. times" msgstr "ennen ajankohtia" msgid "after user-def. times" msgstr "ajankohtien jälkeen" msgid "before 'next'" msgstr "ennen seuraavia" msgid "General" msgstr "Yleiset" msgid "EPG menus" msgstr "Valikot" msgid "User-defined EPG times" msgstr "Käyttäjän määrittelemät ajankohdat" msgid "Timer programming" msgstr "Ajastimien luonti" msgid "Search and search timers" msgstr "Haut ja hakuajastimet" msgid "Timer conflict checking" msgstr "Päällekkäisten ajastimien tarkistus" msgid "Email notification" msgstr "Ilmoitukset sähköpostilla" msgid "Hide main menu entry" msgstr "Piilota valinta päävalikosta" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Piilottaa valinnan päävalikosta. Suositellaan asetettavaksi päälle, jos laajennoksella korvataan alkuperäinen ohjelmaopas." msgid "Main menu entry" msgstr "Valinta päävalikossa" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "Päävalikossa sijaitsevan valinnan nimi, joka on oletuksena 'Ohjelmaopas'." msgid "Replace original schedule" msgstr "Korvaa alkuperäinen ohjelmaopas" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "Korvaa alkuperäisen ohjelmaoppaan päävalikossa tällä laajennoksella, jos VDR on paikattu asianmukaisesti." msgid "Start menu" msgstr "Oletusnäyttö" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "Valitsee oletusnäytöksi joko tämänhetkisen yleiskatsauksen tai valitun kanavan ohjelmiston." msgid "Ok key" msgstr "OK-näppäin" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" "Valitse toiminto OK-näppäimelle: näytä ohjelman tiedot tai vaihda kyseiselle kanavalle.\n" "Huomioi: sinisen näppäimen toiminto (Vaihda/Tiedot/Hae) riippuu tästä asetuksesta." msgid "Red key" msgstr "Punainen näppäin" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" "Valitsee oletustoiminnon ('Tallenna' tai 'Komennot') punaiselle näppäimelle.\n" "Punaisen näppäimen toimintoa voidaan vaihtaa myös lennossa painamalla näppäintä 0." msgid "Blue key" msgstr "Sininen näppäin" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" "Valitsee oletustoiminnon ('Valitse' tai 'Etsi') siniselle näppäimelle.\n" "Sinisen näppäimen toimintoa voidaan vaihtaa myös lennossa painamalla näppäintä 0." msgid "Show progress in 'Now'" msgstr "Näytä aikajana 'Nyt'-sivulla" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "Näyttää aikajanan tämänhetkisessä yleiskatsauksessa." msgid "Show channel numbers" msgstr "Näytä kanavien numerointi" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" "Näyttää kanavien numeroinnin tämänhetkisessä yleiskatsauksessa.\n" "\n" "Lisätietoja valikon muokkauksesta löytyy MANUAL-tiedostosta." msgid "Show channel separators" msgstr "Näytä kanavaerottimet" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "Näyttää erottimet yleiskatsauksessa kanaville." msgid "Show day separators" msgstr "Näytä päiväerottimet" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "Näyttää erottimet ohjelmistossa päivän vaihtuessa." msgid "Show radio channels" msgstr "Näytä radiokanavat" msgid "Help$Show also radio channels." msgstr "Näyttää myös radiokanavat listauksessa." msgid "Limit channels from 1 to" msgstr "Näytettävien kanavien rajoitus" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "Voit nopeuttaa toimintoja rajoittamalla näytettävien kanavien lukumäärää tällä asetuksella. Poistat rajoituksen asettamalla arvoksi nollan." msgid "'One press' timer creation" msgstr "Luo ajastimet yhdellä painalluksella" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "Valitsee oletustoiminnon ajastimen luonnille. Voit luoda ajastimen joko automaattisesti yhdellä painalluksella tai vaihtoehtoisesti avata ajastinvalikon." msgid "Show channels without EPG" msgstr "Näytä ohjelmaoppaattomat kanavat" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "Näyttää tämänhetkisessä yleiskatsauksessa myöskin kanavat, joilta ei löydy ohjelmatietoja. Voit vaihtaa tällaiselle kanavalle OK-näppäimellä." msgid "Time interval for FRew/FFwd [min]" msgstr "Oletusaikasiirtymä [min]" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" "Valitsee ohjelmaoppaan oletusaikasiirtymän pikakelausnäppäimille.\n" "\n" "Jos sinulla ei ole kyseisiä näppäimiä käytössäsi, voit asettaa kyseiset toiminnot vihreälle ja keltaiselle näppäimelle painamalla näppäintä 0." msgid "Toggle Green/Yellow" msgstr "Käytä aikasiirtymää värinäppäimillä" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "Määrittelee vaihdetaanko vihreän ja keltaisen näppäimen toimintoja painamalla näppäintä 0." msgid "Show favorites menu" msgstr "Näytä suosikkivalikko" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" "Suosikkivalikossa listataan suosikiksi merkityt ohjelmat. Jos tämä valinta on aktiivinen, suosikkivalikko löytyy 'Nyt'- ja 'Seuraavaksi'-valikkojen rinnalta. \n" "Mikä tahansa haku voidaan merkitä suosikiksi aktivoimalla 'Käytä suosikkina'-valinta." msgid "for the next ... hours" msgstr "seuraaville ... tunnille" msgid "Help$This value controls the timespan used to display your favorites." msgstr "Tämä arvo määrittelee käytetyn ajanjakson suosikkien näyttämiselle." msgid "Use user-defined time" msgstr "Määrittele ajankohta" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "Määrittelee käyttäjän muokattavissa olevat ajankohdat 'Nyt' ja 'Seuraavaksi' näyttöjen rinnalle ohjelmaoppaan yleiskatsaukseen." msgid "Description" msgstr "Kuvaus" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "Asettaa kuvauksen vihreään näppäimeen käyttäjän muokkaamalle ajankohdalle." msgid "Time" msgstr "Kellonaika" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "Asettaa kellonajan käyttäjän muokkaamalle ajankohdalle." msgid "Use VDR's timer edit menu" msgstr "Käytä alkuperäistä ajastinvalikkoa" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" "Tällä laajennoksella on oma laajennettu ajastinvalikko mm. seuraavilla lisätoiminnoilla:\n" "\n" "- hakemiston määritys\n" "- vapaasti määriteltävät viikonpäivät toistuville ajastimille\n" "- jakson nimen täydennys\n" "- erilaisten EPG-muuttujien tuki (ks. MANUAL-tiedostosta)" msgid "Default recording dir" msgstr "Oletushakemisto tallenteille" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "Määrittelee oletushakemiston tallenteille." msgid "Add episode to manual timers" msgstr "Lisää jakson nimi norm. ajastimiin" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" "Asettaa toiminnon sarjatallennuksen jakson nimen lisäykselle:\n" "\n" "- ei koskaan: ei lisätä\n" "- aina: lisätään aina, jos olemassa\n" "- älykkäästi: lisätään vain, jos tapahtuman kesto on alle 80 min" msgid "Default timer check method" msgstr "Oletustapa ajastimen valvonnalle" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" "Käsinluotuja ajastimia voidaan valvoa ohjelmaoppaan muutoksia vasten. Voit asettaa oletustavan jokaista kanavaa kohden:\n" "\n" "- ei valvontaa\n" "- tapahtuman tunniste: ohjelmisto-oppaassa lähetettävän tunnisteen mukaan\n" "- kanava ja aika: tapahtuman keston ja ajankohdan mukaan" msgid "Button$Setup" msgstr "Asetukset" msgid "Use search timers" msgstr "Käytä hakuajastimia" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "Hakuajastimilla luodaan automaattisesti ajastimia hakuehtoihin sopiviin tapahtumiin." msgid " Update interval [min]" msgstr " Päivitysväli [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "Määrittelee päivitysvälin hakuajastimien taustapäivitykselle." msgid " SVDRP port" msgstr " SVDRP-portti" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "Uusien ajastimien luonti ja olemassa olevien muokkaus on toteutettu SVDRP-protokollan kautta. Suositellaan käytettävän vain oletusarvoa." msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "Määrittelee oletusprioriteetin tämän laajennoksen kautta luotaville ajastimille. Prioriteettia voidaan muokata ajastinkohtaisesti." msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Määrittelee oletuseliniän tämän laajennoksen kautta luotaville ajastimille. Elinaikaa voidaan muokata ajastinkohtaisesti." msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Määrittelee oletusmarginaalin tallennuksen aloitukselle tämän laajennoksen kautta luotaville ajastimille. Marginaaleja voidaan muokata ajastinkohtaisesti." msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Määrittelee oletusmarginaalin tallennuksen lopetukselle tämän laajennoksen kautta luotaville ajastimille. Marginaaleja voidaan muokata ajastinkohtaisesti." msgid "No announcements when replaying" msgstr "Älä muistuta toiston aikana" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "Laittamalla tämän asetuksen päälle et saa ohjelmista muistutuksia toistettaessa tallenteita." msgid "Recreate timers after deletion" msgstr "Luo ajastimet uudelleen" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "Laittamalla tämän asetuksen päälle saat luotua ajastimet uudelleen seuraava hakuajastin päivityksen yhteydessä, jos olet poistanut ne." msgid "Check if EPG exists for ... [h]" msgstr "Tarkasta tulevat ohjelmatiedot... [h]" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "Määrittelee vaadittavat tulevat ohjelmatiedot tunteina hakuajastimien päivityksen yhteydessä, jonka jälkeen käyttäjää varoitetaan." msgid "Warn by OSD" msgstr "Muistuta kuvaruutunäytöllä" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "Laittamalla tämän asetuksen päälle saat varoitukset ohjelmatietojen tarkastuksesta kuvaruutunäytölle." msgid "Warn by mail" msgstr "Muistuta sähköpostitse" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "Laittamalla tämän asetuksen päälle saat varoitukset ohjelmatietojen tarkastuksesta sähköpostitse." msgid "Channel group to check" msgstr "Tarkastettava kanavaryhmä" msgid "Help$Specify the channel group to check." msgstr "Määrittelee tarkastettavan kanavaryhmän." msgid "Ignore PayTV channels" msgstr "Jätä salatut kanavat huomioimatta" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "Piilottaa salatut kanavat haettaessa uusintoja." msgid "Search templates" msgstr "Mallipohjat hakuehdoille" msgid "Help$Here you can setup templates for your searches." msgstr "Määrittele mallipohjia hakuehdoille." msgid "Blacklists" msgstr "Mustat listat" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "Määrittele mustia listoja hakuehdoille. Mustien listojen tapahtumia ei näytetä hakutuloksissa." msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "Määrittele kanavaryhmiä hakuehdoille. Tämän laajennoksen kanavaryhmät eivät ole yhteydessä VDR:n omiin kanavaryhmiin." msgid "Ignore below priority" msgstr "Sivuuta alhaisemmat prioriteetit" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Asetusarvoa korkeammalla prioriteetilla olevat ajastimet ovat merkitseviä. Vain merkitsevät päällekkäisyydet aiheuttavat viestin kuvaruutunäytölle automaattisen tarkistuksen yhteydessä." msgid "Ignore conflict duration less ... min." msgstr "Sivuuta alle ... min. päällekkäisyydet" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Jos ajastimien päällekkäisyys on alle asetetun minuuttimäärän, sitä ei pidetä merkitsevänä. Vain merkitsevät päällekkäisyydet aiheuttavat viestin kuvaruutunäytölle tarkistuksen yhteydessä." msgid "Only check within next ... days" msgstr "Tarkista vain seuraavat ... päivää" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "Asettaa ajanjakson päivinä päällekkäisyyksien tarkistukselle. Muita päällekkäisyyksiä ei pidetä vielä merkitsevinä." msgid "--- Automatic checking ---" msgstr "--- Automaattinen tarkistus ---" msgid "After each timer programming" msgstr "Jokaisen ajastimen luonnin jälkeen" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "Päällekkäisten ajastimien tarkistus suoritaan aina jokaisen ajastimen luonnin jälkeen. Jos luodulle ajastimelle löydetään päällekkäisyyksiä, niin siitä tiedotetaan käyttäjälle heti." msgid "When a recording starts" msgstr "Tallennuksen alkaessa" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "Päällekkäisten ajastimien tarkistus suoritaan aina tallennuksen alkaessa. Jos luodulle ajastimelle löydetään päällekkäisyyksiä seuraavan kahden tunnin aikana, niin siitä tiedotetaan käyttäjälle heti." msgid "After each search timer update" msgstr "Päivitettäessä hakuajastimia" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "Suorittaa päällekkäisyyksien tarkistuksen jokaisen hakuajastimen päivityksen yhteydessä." msgid "every ... minutes" msgstr "joka ... minuutti" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" "Määrittää aikajakson taustalla tehtävälle automaattiselle päällekkäisyyksien tarkistukselle.\n" "Arvolla '0' saat asetettua automaattisen tarkistuksen pois päältä" msgid "if conflicts within next ... minutes" msgstr "jos päällekkäisyys ... min. kuluessa" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "Jos seuraava päällekkäisyys esiintyy asetetun ajan kuluessa, tällä asetuksella pystyt määrittämään lyhyemmän tarkistusvälin saadaksesi tarkempia kuvaruutuviestejä." msgid "Avoid notification when replaying" msgstr "Älä näytä ilmoituksia toiston aikana" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "Laittamalla tämän asetuksen päälle saat estettyä kuvaruutuviestit päällekkäisistä ajastimista toiston aikana. Kuvaruutuviesti näytetään kuitenkin aina, jos päällekkäinen ajastin on alle kahden tunnin kuluttua." msgid "Search timer notification" msgstr "Ilmoitukset hakuajastimista" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "Tällä asetuksella saat ilmoitukset automaattisesti lisätyistä hakuajastimista sähköpostiisi." msgid "Time between mails [h]" msgstr "Sähköpostin lähetysväli [h]" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" "Vähimmäisväliaika tunteina sähköpostien\n" "lähetykselle. Mikäli 0, uusi sähköposti\n" "lähetetään aina hakuajastimen päivittyessä\n" "uusilla tuloksilla." msgid "Timer conflict notification" msgstr "Ilmoitukset päällekkäisistä ajastimista" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "Tällä asetuksella saat ilmoitukset päällekkäisistä ajastimista sähköpostiisi." msgid "Send to" msgstr "Vastaanottaja" msgid "Help$Specify the email address where notifications should be sent to." msgstr "Määrittelee sähköpostiosoitteen, jonne ilmoitukset lähetetään." msgid "Mail method" msgstr "Lähetystapa" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" "Määrittelee lähetystavan sähköposteille.\n" "Voit valita kahden vaihtoehdon väliltä:\n" " - 'sendmail': vaatii oikein konfiguroidun sähköpostisysteemin\n" " - 'SendEmail.pl': yksinkertainen skriptitiedosto sähköpostin lähetykseen" msgid "--- Email account ---" msgstr "--- Sähköposti ---" msgid "Email address" msgstr "Sähköpostiosoite" msgid "Help$Specify the email address where notifications should be sent from." msgstr "Määrittelee sähköpostiosoitteen, josta ilmoitukset lähetetään." msgid "SMTP server" msgstr "SMTP-palvelin" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "Määrittelee käytettävän SMTP-palvelimen. Portti voidaan määritellä erikseen lisäämällä palvelimen osoitteen loppuun \":portti\", jos se eroaa oletuksesta (25)." msgid "Use SMTP authentication" msgstr "Käytä SMTP-autentikointia" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "Asettaa SMTP-autentikoinnin päälle sähköpostin lähetystä varten." msgid "Auth user" msgstr "SMTP-käyttäjätunnus" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "Määrittelee käyttäjätunnuksen, jos SMTP-palvelimelle pitää autentikoitua." msgid "Auth password" msgstr "SMTP-salasana" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "Määrittelee salasanan, jos SMTP-palvelimelle pitää autentikoitua." msgid "Mail account check failed!" msgstr "Sähköpostilaatikon tarkistus epäonnistui!" msgid "Button$Test" msgstr "Testaa" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " abcdefghijklmnopqrstuvwxyzåäö0123456789-.,#~\\^$[]|()*+?{}/:%@&" msgid "Start/Stop time has changed" msgstr "Ohjelman aloitus/lopetusaika muuttunut" msgid "Title/episode has changed" msgstr "Ohjelman nimi/kuvaus muuttunut" msgid "No new timers were added." msgstr "Yhtään uutta ajastinta ei lisätty." msgid "No timers were modified." msgstr "Yhtään ajastinta ei muokattu." msgid "No timers were deleted." msgstr "Yhtään ajastinta ei poistettu." msgid "No new events to announce." msgstr "Ei uusia ilmoitettavia tapahtumia." msgid "This version of EPGSearch does not support this service!" msgstr "EPGSearch-laajennos ei tarjoa vaadittavaa palvelua!" msgid "EPGSearch does not exist!" msgstr "EPGSearch-laajennosta ei löydy!" #, c-format msgid "%d new broadcast" msgstr "%d uutta lähetystä" msgid "Button$by channel" msgstr "Kanavat" msgid "Button$by time" msgstr "Kellonajat" msgid "Button$Episode" msgstr "Jaksot" msgid "Button$Title" msgstr "Nimet" msgid "announce details" msgstr "Muistutuksen tiedot" msgid "announce again" msgstr "Muistuta uudelleen" msgid "with next update" msgstr "Seuraavassa päivityksessä" msgid "again from" msgstr "Alkaen taas" msgid "Search timer" msgstr "Hakuajastin" msgid "Edit blacklist" msgstr "Muokkaa mustaa listaa" msgid "phrase" msgstr "fraasi" msgid "all words" msgstr "kaikki sanat" msgid "at least one word" msgstr "yksi sana" msgid "match exactly" msgstr "täsmällinen" msgid "regular expression" msgstr "säännöllinen lauseke" msgid "fuzzy" msgstr "sumea" msgid "user-defined" msgstr "valitut" msgid "interval" msgstr "kyllä" msgid "channel group" msgstr "kanavaryhmä" msgid "only FTA" msgstr "vapaat kanavat" msgid "Search term" msgstr "Hakutermi" msgid "Search mode" msgstr "Hakutapa" msgid "Tolerance" msgstr "Toleranssi" msgid "Match case" msgstr "Huomioi kirjainkoko" msgid "Use title" msgstr "Käytä ohjelmanimeä" msgid "Use subtitle" msgstr "Käytä lyhyttä ohjelmakuvausta" msgid "Use description" msgstr "Käytä ohjelmakuvausta" msgid "Use extended EPG info" msgstr "Käytä laajennettua ohjelmaopasta" msgid "Ignore missing categories" msgstr "Jätä puuttuvat kategoriat huomioimatta" msgid "Use channel" msgstr "Käytä kanavaa" msgid " from channel" msgstr " Kanavasta" msgid " to channel" msgstr " Kanavaan" msgid "Channel group" msgstr "Kanavaryhmä" msgid "Use time" msgstr "Käytä aloitusaikaa" msgid " Start after" msgstr " Aloitusaika aikaisintaan" msgid " Start before" msgstr " Aloitusaika viimeistään" msgid "Use duration" msgstr "Käytä kestoaikaa" msgid " Min. duration" msgstr " Kestoaika vähintään" msgid " Max. duration" msgstr " Kestoaika enintään" msgid "Use day of week" msgstr "Käytä viikonpäivää" msgid "Day of week" msgstr "Viikonpäivä" msgid "Use global" msgstr "Käytä globaalina" msgid "Button$Templates" msgstr "Mallipohjat" msgid "*** Invalid Channel ***" msgstr "*** Virheellinen kanavavalinta ***" msgid "Please check channel criteria!" msgstr "Tarkasta hakuehdot!" msgid "Edit$Delete blacklist?" msgstr "Poistetaanko musta lista?" msgid "Repeats" msgstr "Toistuvat" msgid "Create search" msgstr "Luo haku" msgid "Search in recordings" msgstr "Etsi tallenteista" msgid "Mark as 'already recorded'?" msgstr "Merkitse tallennetuksi" msgid "Add/Remove to/from switch list?" msgstr "Lisää/poista kanavanvaihtolistalle" msgid "Create blacklist" msgstr "Lisää mustalle listalle" msgid "EPG Commands" msgstr "Komennot" msgid "Already running!" msgstr "Nyt menossa!" msgid "Add to switch list?" msgstr "Lisätäänkö kanavanvaihtolistalle?" msgid "Delete from switch list?" msgstr "Poistetaanko kanavanvaihtolistalta?" msgid "Button$Details" msgstr "Lisätiedot" msgid "Button$Filter" msgstr "Suodata" msgid "Button$Show all" msgstr "Näytä kaikki" msgid "conflicts" msgstr "päällekkäisyyttä" msgid "no conflicts!" msgstr "ei päällekkäisyyksiä!" msgid "no important conflicts!" msgstr "ei merkitseviä päällekkäisyyksiä!" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "Toistuvat" msgid "no check" msgstr "ei valvontaa" msgid "by channel and time" msgstr "kanava ja aika" msgid "by event ID" msgstr "tapahtuman tunniste" msgid "Select directory" msgstr "Valitse hakemisto" msgid "Button$Level" msgstr "Taso" msgid "Event" msgstr "Tapahtuma" msgid "Favorites" msgstr "Suosikit" msgid "Search results" msgstr "Hakutulokset" msgid "Timer conflict! Show?" msgstr "Päällekkäisiä ajastimia! Näytetäänkö?" msgid "Directory" msgstr "Hakemisto" msgid "Channel" msgstr "Kanava" msgid "Childlock" msgstr "Lapsilukko" msgid "Timer check" msgstr "Valvontatapa" msgid "recording with device" msgstr "Tallennetaan laitteella" msgid "Button$With subtitle" msgstr "Kuvaus" msgid "Button$Without subtitle" msgstr "Ei kuvausta" msgid "Button$Extended" msgstr "Laaja" msgid "Button$Simple" msgstr "Suppea" msgid "Use blacklists" msgstr "Käytä mustia listoja" msgid "Edit$Search text too short - use anyway?" msgstr "Liian suppea hakuehto - etsitäänkö silti?" msgid "Button$Orphaned" msgstr "Orvot" msgid "Button$by name" msgstr "Nimi" msgid "Button$by date" msgstr "Päivämäärä" msgid "Button$Delete all" msgstr "Poista kaikki" msgid "Recordings" msgstr "Tallenteet" msgid "Edit$Delete entry?" msgstr "Poista hakutermi" msgid "Edit$Delete all entries?" msgstr "Poista kaikki hakutermit" msgid "Summary" msgstr "Yhteenveto" msgid "Auxiliary info" msgstr "Lisätiedot" msgid "Button$Aux info" msgstr "Lisätiedot" msgid "Search actions" msgstr "Hakukomennot" msgid "Execute search" msgstr "Suorita haku" msgid "Use as search timer on/off" msgstr "Aseta/poista hakuajastintoiminto" msgid "Trigger search timer update" msgstr "Päivitä hakuajastimet" msgid "Show recordings done" msgstr "Näytä tehdyt tallennukset" msgid "Show timers created" msgstr "Näytä luodut ajastimet" msgid "Create a copy" msgstr "Kopioi" msgid "Use as template" msgstr "Käytä mallipohjana" msgid "Show switch list" msgstr "Näytä kanavanvaihtolista" msgid "Show blacklists" msgstr "Näytä mustat listat" msgid "Delete created timers?" msgstr "Poista haulla luodut ajastimet" msgid "Timer conflict check" msgstr "Tarkista päällekkäiset ajastimet" msgid "Disable associated timers too?" msgstr "Poistetaanko käytöstä myös assosioidut ajastimet?" msgid "Activate associated timers too?" msgstr "Otetaanko käyttöön myös assosioidut ajastimet?" msgid "Search timers activated in setup." msgstr "Hakuajastimet aktivoitu asetuksista" msgid "Run search timer update?" msgstr "Päivitetäänkö hakuajastimet?" msgid "Copy this entry?" msgstr "Kopioidaanko tämä hakuajastin?" msgid "Copy" msgstr "Kopio" msgid "Copy this entry to templates?" msgstr "Kopioidaanko hakutermi mallipohjaksi?" msgid "Delete all timers created from this search?" msgstr "Poistetaanko kaikki tällä haulla luodut ajastimet?" msgid "Button$Actions" msgstr "Komennot" msgid "Search entries" msgstr "Hakutermit" msgid "active" msgstr "aktiivista" msgid "Edit$Delete search?" msgstr "Poistetaanko haku?" msgid "Edit search" msgstr "Muokkaa hakua" msgid "Record" msgstr "Tallenna" msgid "Announce by OSD" msgstr "muistutus kuvaruutunäytölle" msgid "Switch only" msgstr "kanavanvaihto" msgid "Announce and switch" msgstr "muistutus ja kanavanvaihto" msgid "Announce by mail" msgstr "muistutus sähköpostitse" msgid "only globals" msgstr "vain globaalit" msgid "Selection" msgstr "valittu" msgid "all" msgstr "kaikki" msgid "count recordings" msgstr "lukumäärän mukaan" msgid "count days" msgstr "päivien mukaan" msgid "if present" msgstr "jos olemassa" msgid "same day" msgstr "sama päivä" msgid "same week" msgstr "sama viikko" msgid "same month" msgstr "sama kuukausi" msgid "Template name" msgstr "Mallipohjan nimi" msgid "Help$Specify the name of the template." msgstr "Määrittelee mallipohjan nimen." msgid "Help$Specify here the term to search for." msgstr "Määrittelee käytettävän hakutermin." msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" "Käytössä ovat seuraavat hakutavat:\n" "\n" "- fraasi: määritelty fraasi pitää löytyä\n" "- kaikki sanat: kaikkien määriteltyjen sanojen pitää löytyä\n" "- yksi sana: yksi määritellyistä sanoista pitää löytyä\n" "- täsmällinen: ehdon pitää löytyä täsmällisesti\n" "- säännöllinen lauseke: määritellyn säännöllisen lausekkeen pitää löytyä\n" "- sumea: samankaltaisia pitää löytyä määriteltyyn ehtoon nähden" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "Määrittelee toleranssin sumealle haulle. Arvo kertoo sallittujen virheiden lukumäärän." msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "Tällä asetuksella pystyt huomioimaan kirjainkoon vaikutuksen hakutulokseen." msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "Tällä asetuksella pystyt etsimään ohjelmanimestä." msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "Tällä asetuksella pystyt etsimään lyhyestä ohjelmakuvauksesta." msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "Tällä asetuksella pystyt etsimään ohjelmakuvauksesta." msgid "Use content descriptor" msgstr "Käytä sisältökuvausta" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "Tällä asetuksella pystyt etsimään sisältökuvauksesta." msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "Ohjelmakuvaus voi sisältää ohjelmaoppaan kategoriatietoja ('lajityyppi', 'kategoria', 'valmistumisvuosi', ...), joita ulkoiset ohjelmaoppaat voivat tuottaa. Tällä asetuksella voit hakea myös niiden perusteella." msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "Tiedosto 'epgsearchcats.conf' määrittelee käytettävät hakutavat ja voit viitata niihin joko tekstinä tai pelkällä luvulla. Lisäksi pystyt myöskin muokkaamaan määriteltyjen kategorioiden listaa." msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "Jos valittua kategoriaa ei löydy ohjelmakuvauksesta, ei ohjelmaa normaalisti myöskään löydy hakutuloksista. Tällä asetuksella voit estää sen, mutta samalla voit saada huomattavan määrän halutuloksia." msgid "Use in favorites menu" msgstr "Käytä suosikkina" msgid "Result menu layout" msgstr "Hakutulosten ulkoasu" msgid "Use as search timer" msgstr "Käytä hakuajastimena" msgid "Action" msgstr "Toiminto" msgid "Switch ... minutes before start" msgstr "Vaihda ... minuuttia ennen alkua" msgid "Unmute sound" msgstr "Ota mykistys pois päältä" msgid "Ask ... minutes before start" msgstr "Kysy ... minuuttia ennen alkua" msgid " Series recording" msgstr " Sarjatallennus" msgid "Delete recordings after ... days" msgstr "Poista tallenteet ... päivän jälkeen" msgid "Keep ... recordings" msgstr "Säilytä ... tallennetta" msgid "Pause when ... recordings exist" msgstr "Keskeytä ... tallenteen jälkeen" msgid "Avoid repeats" msgstr "Estä uusinnat" msgid "Allowed repeats" msgstr "Sallittujen uusintojen lukumäärä" msgid "Only repeats within ... days" msgstr "Vain uusinnat ... päivän sisällä" msgid "Compare title" msgstr "Vertaa nimeä" msgid "Compare subtitle" msgstr "Vertaa jakson nimeä" msgid "Compare summary" msgstr "Vertaa kuvausta" msgid "Min. match in %" msgstr "Vaadittava yhdenmukaisuus [%]" msgid "Compare date" msgstr "Vertaa päivämäärää" msgid "Compare categories" msgstr "Vertaa kategorioita" msgid "VPS" msgstr "VPS" msgid "Auto delete" msgstr "Poista automaattisesti" msgid "after ... recordings" msgstr "... tallenteen jälkeen" msgid "after ... days after first rec." msgstr "... päivän jälkeen ensimmäisestä" msgid "Edit user-defined days of week" msgstr "Muokkaa valittuja viikonpäiviä" msgid "Compare" msgstr "Vertaa" msgid "Select blacklists" msgstr "Valitse mustat listat" msgid "Values for EPG category" msgstr "Valinnat ohjelmaoppaan kategorioille" msgid "Button$Apply" msgstr "Käytä" msgid "less" msgstr "pienempi" msgid "less or equal" msgstr "pienempi tai yhtä suuri" msgid "greater" msgstr "suurempi" msgid "greater or equal" msgstr "suurempi tai yhtä suuri" msgid "equal" msgstr "yhtä suuri" msgid "not equal" msgstr "erisuuri" msgid "Activation of search timer" msgstr "Hakuajastimien aktivointi" msgid "First day" msgstr "Aloituspäivä" msgid "Last day" msgstr "Lopetuspäivä" msgid "Button$all channels" msgstr "Kaikki" msgid "Button$only FTA" msgstr "Vapaat" msgid "Button$Timer preview" msgstr "Esikatselu" msgid "Blacklist results" msgstr "Mustan listan tulokset" msgid "found recordings" msgstr "löydetyt tallenteet" msgid "Error while accessing recording!" msgstr "Tallenteen toistaminen epäonnistui!" msgid "Button$Default" msgstr "Oletus" msgid "Edit$Delete template?" msgstr "Poistetaanko mallipohja?" msgid "Overwrite existing entries?" msgstr "Kirjoitetaanko olemassa olevan päälle?" msgid "Edit entry" msgstr "Muokkaa valintaa" msgid "Switch" msgstr "kanavanvaihto" msgid "Announce only" msgstr "muistutus" msgid "Announce ... minutes before start" msgstr "Muistuta ... minuuttia ennen alkua" msgid "action at" msgstr "Kellonaika kanavanvaihdolle" msgid "Switch list" msgstr "Kanavanvaihtolista" msgid "Edit template" msgstr "Muokkaa mallipohjaa" msgid "Timers" msgstr "Ajastimet" msgid ">>> no info! <<<" msgstr ">>> ei tietoja! <<<" msgid "Overview" msgstr "Yleiskatsaus" msgid "Button$Favorites" msgstr "Suosikit" msgid "Quick search for broadcasts" msgstr "Pikahaku ohjelmaoppaalle" msgid "Quick search" msgstr "Pikahaku" msgid "Show in main menu" msgstr "Näytä valinta päävalikossa" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "Löydettiin %d uutta lähetystä! Näytetäänkö?" msgid "Search timer update done!" msgstr "Hakuajastimet päivitetty!" #, c-format msgid "small EPG content on:%s" msgstr "vajaat ohjelmatiedot: %s" msgid "VDR EPG check warning" msgstr "Varoitus VDR:n ohjelmatietojen tarkastuksesta" #, c-format msgid "Switch to (%d) '%s'?" msgstr "Vaihdetaanko kanavalle (%d) '%s'?" msgid "Programming timer failed!" msgstr "Ajastimen ohjelmointi epäonnistui!" #~ msgid "in %02ldd" #~ msgstr "%02ldd" #~ msgid "in %02ldh" #~ msgstr "%02ldh" #~ msgid "in %02ldm" #~ msgstr "%02ldm" vdr-plugin-epgsearch/po/pt_PT.po0000644000175000017500000005671112466747543016470 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Paulo Lopes , 2001 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Paulo Lopes \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Configurar" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Lorsqu'une programmation dont la prioritée est en dessous de la valeur définie, n'aboutit pas, alors elle est qualifiée de 'non-importante'. Seulement les conflits importants sont affichés à l'écran lors de la vérification automatique." msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "Filtre" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" msgid "Button$Orphaned" msgstr "" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Gravar" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/el_GR.po0000644000175000017500000005644012466747543016431 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Dimitrios Dimitrakos , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Dimitrios Dimitrakos \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" #, fuzzy msgid "Button$Commands" msgstr "ΕγγÏαφή" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Ρυθμισεις" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" #, fuzzy msgid "Button$Orphaned" msgstr "ΕγγÏαφή" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "ΕγγÏαφή" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/nl_NL.po0000644000175000017500000011527112466747543016441 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Arnold Niessen , 2001 # Hans Dingemans , 2003 # Maarten Wisse , 2005 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Maarten Wisse \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "Kanaal groepen" msgid "Button$Select" msgstr "Selecteer" msgid "Channel group used by:" msgstr "Kanaalgroep gebruikt door:" msgid "Edit$Delete group?" msgstr "Groep wissen?" msgid "Edit channel group" msgstr "Bewerk kanaalgroep" msgid "Group name" msgstr "Groep naam" msgid "Button$Invert selection" msgstr "Selectie omdraaien" msgid "Button$All yes" msgstr "Alles ja" msgid "Button$All no" msgstr "Alles nee" msgid "Group name is empty!" msgstr "Groep naam is leeg!" msgid "Group name already exists!" msgstr "Groep naam bestaat al!" msgid "Direct access to epgsearch's conflict check menu" msgstr "Directe toegang tot epgsearch's conflict controle menu" msgid "Timer conflicts" msgstr "Timer conflicten" msgid "Conflict info in main menu" msgstr "Conflict info tonen in hoofdmenu" msgid "next" msgstr "volgende" #, c-format msgid "timer conflict at %s! Show it?" msgstr "Timerconflict op %s! Tonen?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "%d timer conflicten! eerste op %s. Tonen?" msgid "search the EPG for repeats and more" msgstr "Zoek in de EPG naar herhalingen en meer" msgid "Program guide" msgstr "Programmagids" #, fuzzy msgid "search timer update running" msgstr "Verversen zoektimer gereed!" msgid "Direct access to epgsearch's search menu" msgstr "Direct toegang tot epgsearch's zoek menu" msgid "Search" msgstr "Zoek" msgid "EpgSearch-Search in main menu" msgstr "EpgSearch-Search in hoofdmenu" msgid "Button$Help" msgstr "Help" msgid "Standard" msgstr "Standaard" msgid "Button$Commands" msgstr "Commando's" msgid "Button$Search" msgstr "Zoek" msgid "never" msgstr "nooit" msgid "always" msgstr "altijd" msgid "smart" msgstr "slim" msgid "before user-def. times" msgstr "vóór gebruiker-gedef. tijden" msgid "after user-def. times" msgstr "ná gebruiker-gedef. tijden" msgid "before 'next'" msgstr "" msgid "General" msgstr "Algemeen" msgid "EPG menus" msgstr "EPG menu's" msgid "User-defined EPG times" msgstr "Gebruiker-gedefinieerde EPG tijden" msgid "Timer programming" msgstr "Timer programmering" msgid "Search and search timers" msgstr "Zoek en zoektimers" msgid "Timer conflict checking" msgstr "Timer conflict controle" msgid "Email notification" msgstr "E-mail notificatie" msgid "Hide main menu entry" msgstr "Verberg vermelding in hoofdmenu" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Verbergt de vermelding in het hoofdmenu en kan van pas komen als deze plugin wordt gebruikt om de originele programmagids te vervangen." msgid "Main menu entry" msgstr "Hoofdmenu vermelding" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "De naam van de regel in het hoofdmenu welke gerelateerd is aan 'programmagids'" msgid "Replace original schedule" msgstr "Originele 'Programmagids' vervangen" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "Als VDR gepatcht is om deze plugin de originele 'Programmagids' menu te laten vervangen dan kan dat hier ge(de)activeerd worden" msgid "Start menu" msgstr "Startmenu" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "Maak een keuze tussen 'Overzicht', 'Nu' en 'programmagids' als startmenu wanneer plugin wordt geactiveerd." msgid "Ok key" msgstr "OK toets" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" "Kies hier het gedrag van de 'OK' toets. Hij kan gebruikt worden om een samenvatting te tonen of om te schakelen naar het betreffende kanaal.\n" "Letop: de functionaliteit van de 'BLAUW' toets (Schakel/Info/Zoek) is afhankelijk van deze instelling." msgid "Red key" msgstr "Rode toets" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" "Kies welke standaard functie (Opname of Commando's) aan de rode toets moet worden toegewezen.\n" "(Kan worden omgeschakeld met de '0' toets)" msgid "Blue key" msgstr "Blauwe toets" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" "Kies welke standaard functie ('Schakel'/'Info' of 'Zoek') aan de blauwe toets moet worden toegewezen.\n" "(Kan worden omgeschakeld met de '0' toets)" msgid "Show progress in 'Now'" msgstr "Toon voortgang in 'Nu'" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "Toont een voortschreidingsbalk in 'Overzicht - Nu' welke de resterende tijd van het huidige programma weergeeft." msgid "Show channel numbers" msgstr "Toon kanaal nummers" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" "Toon kanaal nummers in 'Overzicht - Nu.\n" "\n" "(Raadpleeg de MANUAL om het hele menu naar eigen inzicht te veranderen)" msgid "Show channel separators" msgstr "Toon kanaal scheidingstekens" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "Toon VDR kanaal groepen als scheidingstekens tussen de kanalen in 'Overzicht - Nu'." msgid "Show day separators" msgstr "Toon schedingstekens tussen dagovergangen" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "Toon een scheidingsteken tussen dagovergangen in 'Programmaoverzicht'" msgid "Show radio channels" msgstr "Toon radiokanalen" msgid "Help$Show also radio channels." msgstr "Toon ook radiokanalen" msgid "Limit channels from 1 to" msgstr "Beperk aantal kanalenvan 1 tot" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "Als er sprake is van een groot aantal kanalen dan kan de snelheid worden bevorderd als het aantal kanalen wordt beperkt. Gebruik '0' om de limitering op te heffen" msgid "'One press' timer creation" msgstr "Maak met één toetsdruk een nieuwe timer aan" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "Als er een timer is gemaakt met 'Opname' dan kan er gekozen worden de timer direct aan te maken of eerst het 'Wijzig timer' menu te tonen." msgid "Show channels without EPG" msgstr "Toon kanalen zonder EPG" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "Kies 'ja' als er in 'Overzicht - Nu' kanalen zonder EPG moeten worden getoond. 'OK' op deze regels schakelt het kanaal in" msgid "Time interval for FRew/FFwd [min]" msgstr "Tijd interval voor FRew/FFwd [min]" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" "Kies hier het tijdsinterval wat gebruikt wordt om met FRew/FFwd door de EPG te springen.\n" "\n" "(Als deze toetsen niet beschikbaar druk dan eerst op de '0' toets en daarna op 'Groen' en 'Geel' om heen en terug te springem" msgid "Toggle Green/Yellow" msgstr "Groen/Geel verwisselen" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "Geef aan of 'Groen' en 'Geel' ook moeten worden geschakeld als op '0' wordt gedrukt" msgid "Show favorites menu" msgstr "Toon favorieten menu" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" "Een favorieten menu kan een lijst van favoriete uitzendingen tonen. Activeer dit als er extra menu's naast 'Nu' en 'Next' gewenst zijn\n" "Iedere willekeurige zoekactie kan ingezet worden als favoriet\n" "Daarvoor hoeft enkel de optie 'Gebruik in favorieten menu' geactiveerd te worden tijdens het aanmaken of wijzigen van een zoekactie." msgid "for the next ... hours" msgstr "de komende ... uur" msgid "Help$This value controls the timespan used to display your favorites." msgstr "Deze waarde regelt het interval dat wordt gebruikt voor het tonen van de favorieten" msgid "Use user-defined time" msgstr "Gebruik gebruiker's tijd" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "Naast 'Nu' en 'Straks' kunnen nog 4 andere tijden in de EPG worden gespeficiteerd. Deze kunnen worden benaderd door herhaaldelijk op de 'Groene'toets te drukken, bv 'prime time', 'late night'..." msgid "Description" msgstr "Beschrijving" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "Dit is de beschrijving van de gebruiker-gedefinieerde tijd zoals het als label bij de toets 'Groen' verschijnt" msgid "Time" msgstr "Tijd" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "Specificeer hier de gebruiker-gedefinieerde tijd als 'HH:MM'" msgid "Use VDR's timer edit menu" msgstr "Gebruik VDR's timer bewerkingsmenu" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" "Deze plugin beschikt over zijn eigen timer bewerkingsmenu die de originele uitbreid met extra functionaliteit zoals\n" "- een extra regel voor een map\n" "- gebruiker-gedefinieerde dagen van de week voor herhaal-timers\n" "- toevoegen van een 'episode naam'\n" "- ondersteuning voor EPG variabelen (see MANUAL)" msgid "Default recording dir" msgstr "Standaard map voor opnames" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "Bij het aanmaken van een timer kan hier de standaard opname map worden opgegeven" msgid "Add episode to manual timers" msgstr "Voeg episode toe aan handmatige timers" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" "Als er een herhaaltimer wordt aangemaakt voor series, dan kan er automatisch de episode naam worden toegevoegd.\n" "\n" "- nooit: voeg niets toe\n" "- altijd: voeg altijd de episode naam toe indien aanwezig\n" "- smart: voeg alleen toe wanneer programma minder dan 80 min duurt." msgid "Default timer check method" msgstr "Standaard timer controle methode" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" "Handmatige timers kunnen worden gecontroleerd op EPG veranderingen. Hier kan de standaard methode voor ieder kanaal ingesteld worden. Kies uit\n" "\n" "- geen controle\n" "- op event-ID: kontroleert m.b.v. een event-ID meegzonden door de TV Provider.\n" "- op kanaal an tijd: controleer of de tijdsduur overeenkomt." msgid "Button$Setup" msgstr "Instellingen" msgid "Use search timers" msgstr "Gebruik zoektimers" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "Zoektimers kunnen worden gebruikt om automatisch timers te maken o.b.v. programma's die voldoen aan bepaalde zoekcriteria." msgid " Update interval [min]" msgstr " Update interval [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "Geef hier het tijdsinterval op dat wordt gebruikt om op de achtergrond te zoeken naar programma's" msgid " SVDRP port" msgstr " SVDRP poort" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "Het programmeren of wijzigen van timers wordt gedaan met SVDRP. De standaard waarde moet goed staan, dus wijzig dit allen als er echt reden toe is." msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "Bepaal hier de standaard prioriteit van timers aangemaakt met deze plugin. Deze waarde kan ook worden aangepast voor iedere afzonderlijke zoekactie" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Bepaal hier de standaard levensduur van timers/opnames aangemaakt door deze plugin. Deze waarde kan ook worden aangepast voor iedere afzonderlijke zoekactie" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Bepaal hier de standaard start opname-marge van timers/opnames aangemaakt door deze plugin. Deze waarde kan ook worden aangepast voor iedere afzonderlijke zoekactie" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Bepaal hier de standaard stop opname-marge van timers/opnames aangemaakt door deze plugin. Deze waarde kan ook worden aangepast voor iedere afzonderlijke zoekactie" msgid "No announcements when replaying" msgstr "Geen meldingen tijdens afspelen" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "Kies 'ja' indien er geen meldingen van toekomstige uitzendingen gewenst zijn als er op dat moment iets wordt afgespeeld" msgid "Recreate timers after deletion" msgstr "Maak timer opnieuw aan na verwijderen" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "Kies 'ja' als timers na het verwijderen opnieuw moeten worden aangemaakt met een nieuwe zoek-timer update" msgid "Check if EPG exists for ... [h]" msgstr "" #, fuzzy msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "Kies 'ja' als de conflict controle moet worden uitgevoerd na het verversen van iedere zoek-timer" #, fuzzy msgid "Warn by OSD" msgstr "Alleen aankondigen (geen timer)" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "Kies 'ja' indien er een notificatie e-mail verstuurd moet worden bij timer conflicten" #, fuzzy msgid "Warn by mail" msgstr "Alleen aankondigen (geen timer)" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "kies 'ja' indien uw abonnement authenticatie vereist voor het verzenden van e-mails." #, fuzzy msgid "Channel group to check" msgstr "Kanaal groep" #, fuzzy msgid "Help$Specify the channel group to check." msgstr "Geef de naam op van het sjabloon" msgid "Ignore PayTV channels" msgstr "Negeer PayTV kanalen" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "Kies 'ja' als er geen programma's van payTV kanalen mogen worden getoond tijdens het zoeken naar herhalingen" msgid "Search templates" msgstr "Zoek sjabloon" msgid "Help$Here you can setup templates for your searches." msgstr "Hier kunnen sjablonen worden aangemaakt voor zoekacties." msgid "Blacklists" msgstr "Blacklists" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "Hier kunnen 'Blacklists' worden aangemaakt die kunnen worden gebruikt om programma's uit te sluiten van zoekactie's " msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "Hier kunnen groepen van kanalen worden opgegeven die kunnen worden gebruikt binnen een zoekactie. Deze groepen wijken af van de VDR kanaal groepen en bestaan uit willekeurig kanalen zoals 'FreeTV." msgid "Ignore below priority" msgstr "Negeer onder de prioriteit" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Als een timer met een prioriteit onder de gegeven waarde mislukt dan wordt hij niet gemerkt als 'belangrijk'. Alleen belangrijke conflicten zullen een OSD melding tot gevolg hebben." msgid "Ignore conflict duration less ... min." msgstr "Negeer conflictduur van minder dan ... min." msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Indien de duur van conflict(en) kleiner is dan het gegeven aantal minuten dan worden deze niet gemerkt als 'belangrijk' Alleen belangrijke conflicten zullen een OSD melding tot gevolg hebben." msgid "Only check within next ... days" msgstr "Controleer alleen vóór de volgende ... dagen" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "Deze waarde beperkt de conflict controle tot het gegeven aantal dagen. Alle andere conflicten worden als 'nog niet belangrijk' bestempeld." msgid "--- Automatic checking ---" msgstr "--- Automatische controle ---" msgid "After each timer programming" msgstr "Na iedere aangemaakte timer" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "Kies 'ja' als de conflict controle bij iedere handmatig aangemaakte timer moet worden uitgevoerd. In het geval van een conflict verschijnt er direct een waarschuwing. Deze waarschuwing wordt alleen getoond als de timer betrokken is bij een willekeurig conflict." msgid "When a recording starts" msgstr "Wanneer een opname start" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "Kies 'ja' als de conflict controle moet worden uitgevoerd bij iedere startende opname. In het geval van een conflict verschijnt er direct een waarschuwing. Deze waarschuwing wordt alleen getoond als de timer betrokken is bij een willekeurig conflict." msgid "After each search timer update" msgstr "Na het verversen van iedere zoek-timer" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "Kies 'ja' als de conflict controle moet worden uitgevoerd na het verversen van iedere zoek-timer" msgid "every ... minutes" msgstr "iedere ... minuten" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "Bepaal hier de tijdsduur gebruikt voor de automatische conflict controle in de achtergrond" msgid "if conflicts within next ... minutes" msgstr "indien conflict optreed binnen ... minuten" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "Als het volgende conflict binnen het gegeven aantal minuten optreedt dan kan hier een korter interval worden gespecificeerd om meer OSD notificaties te verkrijgen." msgid "Avoid notification when replaying" msgstr "Vermijdt notificatie tijdens afspelen" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "Kies 'ja' indien er geen OSD berichten mogen verschijnen tijdens het afspelen. Desondanks zullen berichten wel verschijnen indien het volgende conflict binnen 2 uur optreedt" msgid "Search timer notification" msgstr "Zoektimer notificatie" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "Kies 'ja' wanneer er een notificatie e-mail verstuurd moet worden over zoektimers die automatisch op de achtergrond werden aangenaakt." msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "Timer conflict notificatie" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "Kies 'ja' indien er een notificatie e-mail verstuurd moet worden bij timer conflicten" msgid "Send to" msgstr "Zend naar" msgid "Help$Specify the email address where notifications should be sent to." msgstr "Geef het e-mail adres op waar de notificaties naartoe gestuurd moeen worden" msgid "Mail method" msgstr "Mail methode" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "--- E-mail gebruiker ---" msgid "Email address" msgstr "E-mail adres" msgid "Help$Specify the email address where notifications should be sent from." msgstr "Geef het e-mail adres op waar vandaan de e-mail notificaties verzonden worden" msgid "SMTP server" msgstr "SMTP server" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "Geef de SMTP server voor het verzenden van de notificaties. Indien een andere dan de standaard poort (25) wordt gebruik voeg dan toe \":port\"" msgid "Use SMTP authentication" msgstr "Gebruik SMTP authenticatie" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "kies 'ja' indien uw abonnement authenticatie vereist voor het verzenden van e-mails." msgid "Auth user" msgstr "Auth gebruiker" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "Geef de e-mail gebruikernaam op, indien SMTP authenticatie voor het abonnement vereist is." msgid "Auth password" msgstr "Auth wachtwoord" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "Geef het e-mail wachtwoord op, indien SMTP authenticatie voor het abonnement vereist is." msgid "Mail account check failed!" msgstr "Mail abonnement verificatie mislukt!" msgid "Button$Test" msgstr "Test" #, fuzzy msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "Geen nieuwe timers aangemaakt" msgid "No timers were modified." msgstr "Er zijn geen timers aangepast" msgid "No timers were deleted." msgstr "Er zijn geen timers gewist" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "Deze versie van EPGSearch ondersteunt deze mogelijkheid niet!" msgid "EPGSearch does not exist!" msgstr "EPGsearch is niet aanwezig!" #, c-format msgid "%d new broadcast" msgstr "%d nieuwe uitzending" msgid "Button$by channel" msgstr "per kanaal" msgid "Button$by time" msgstr "op tijd" msgid "Button$Episode" msgstr "Aflevering" msgid "Button$Title" msgstr "Titel" msgid "announce details" msgstr "vermeldt details" msgid "announce again" msgstr "vermeldt nogmaals" msgid "with next update" msgstr "bij volgende herziening" msgid "again from" msgstr "nogmaals vanaf" msgid "Search timer" msgstr "Zoektimer" msgid "Edit blacklist" msgstr "Wijzig blacklist" msgid "phrase" msgstr "uitdruk" msgid "all words" msgstr "alle woorden" msgid "at least one word" msgstr "tenminste een woord" msgid "match exactly" msgstr "precies passend" msgid "regular expression" msgstr "reguliere uitdrukking" msgid "fuzzy" msgstr "fuzzy" msgid "user-defined" msgstr "gebruiker-gedefinieerd" msgid "interval" msgstr "interval" msgid "channel group" msgstr "kanaalgroep" msgid "only FTA" msgstr "alleen FTA" msgid "Search term" msgstr "Zoekterm" msgid "Search mode" msgstr "Zoekinstellingen" msgid "Tolerance" msgstr "Tolerantie" msgid "Match case" msgstr "Case sensitive" msgid "Use title" msgstr "Gebruik titel" msgid "Use subtitle" msgstr "Gebruik ondertitel" msgid "Use description" msgstr "Gebruik beschrijving" msgid "Use extended EPG info" msgstr "Gebruik uitgebreide EPG info" msgid "Ignore missing categories" msgstr "Negeer ontbrekende categoriëen" msgid "Use channel" msgstr "Gebruik kanaal" msgid " from channel" msgstr " van kanaal" msgid " to channel" msgstr " tot kanaal" msgid "Channel group" msgstr "Kanaal groep" msgid "Use time" msgstr "Gebruik tijd" msgid " Start after" msgstr " Start na" msgid " Start before" msgstr " Start voor" msgid "Use duration" msgstr "Gebruik tijdsduur" msgid " Min. duration" msgstr " Min. duur" msgid " Max. duration" msgstr " Max. tijdsduur" msgid "Use day of week" msgstr "Gebruik dag van de week" msgid "Day of week" msgstr "Dag van de week" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "Sjablonen" msgid "*** Invalid Channel ***" msgstr "*** Ongeldig Kanaal ***" msgid "Please check channel criteria!" msgstr "AUB kanaal criteria nakijken" msgid "Edit$Delete blacklist?" msgstr "Verwijder blacklist?" msgid "Repeats" msgstr "Herhalingen" msgid "Create search" msgstr "Maak een zoekactie aan" msgid "Search in recordings" msgstr "Zoek in opname's" msgid "Mark as 'already recorded'?" msgstr "Markeer als 'reeds opgenomen'?" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "Maak nieuwe blacklist" msgid "EPG Commands" msgstr "EPG commando's" msgid "Already running!" msgstr "Reeds actief!" msgid "Add to switch list?" msgstr "Voeg toe aan schakellijst?" msgid "Delete from switch list?" msgstr "Verwijder van schakellijst?" msgid "Button$Details" msgstr "Details" msgid "Button$Filter" msgstr "Filter" msgid "Button$Show all" msgstr "Toon alles" msgid "conflicts" msgstr "conflicten" msgid "no conflicts!" msgstr "geen conflicten!" msgid "no important conflicts!" msgstr "geen belangrijke conflicten!" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "Herhalingen" msgid "no check" msgstr "geen controle" msgid "by channel and time" msgstr "op kanaal en tijd" msgid "by event ID" msgstr "op event-ID" msgid "Select directory" msgstr "Selecteer map" msgid "Button$Level" msgstr "Niveau" msgid "Event" msgstr "Gebeurtenis" msgid "Favorites" msgstr "Favorieten" msgid "Search results" msgstr "Zoekresultaten" msgid "Timer conflict! Show?" msgstr "Timerconflict! Tonen?" msgid "Directory" msgstr "Map" msgid "Channel" msgstr "Kanaal" msgid "Childlock" msgstr "Kinderslot" msgid "Timer check" msgstr "Timercontrole" msgid "recording with device" msgstr "neemt op met kaart" msgid "Button$With subtitle" msgstr "Met ondertitel" msgid "Button$Without subtitle" msgstr "Zonder ondertitel" msgid "Button$Extended" msgstr "Uitgebreid" msgid "Button$Simple" msgstr "Eenvoudig" msgid "Use blacklists" msgstr "Gebruik blacklists" msgid "Edit$Search text too short - use anyway?" msgstr "Zoektekst te kort - toch gebruiken?" #, fuzzy msgid "Button$Orphaned" msgstr "per kanaal" msgid "Button$by name" msgstr "op naam" msgid "Button$by date" msgstr "op datum" msgid "Button$Delete all" msgstr "Verwijder alles" msgid "Recordings" msgstr "Opnames" msgid "Edit$Delete entry?" msgstr "Verwijder regel?" msgid "Edit$Delete all entries?" msgstr "Verwijder alle regels?" msgid "Summary" msgstr "Samenvatting" msgid "Auxiliary info" msgstr "Reserve info" msgid "Button$Aux info" msgstr "Res. info" msgid "Search actions" msgstr "Zoekcriteria acties" msgid "Execute search" msgstr "Voer zoekcriterium uit" msgid "Use as search timer on/off" msgstr "Gebruik als zoek-timer aan/uit" msgid "Trigger search timer update" msgstr "Start verversen zoektimer" msgid "Show recordings done" msgstr "Tonen opnames gereed" msgid "Show timers created" msgstr "Toon aangemaakte timers" msgid "Create a copy" msgstr "Maak een kopie" msgid "Use as template" msgstr "Gebruik als sjabloon" msgid "Show switch list" msgstr "Toon schakellijst" msgid "Show blacklists" msgstr "Toon blacklists" msgid "Delete created timers?" msgstr "Verwijder aangemaakte timers?" msgid "Timer conflict check" msgstr "Timerconflict controle" msgid "Disable associated timers too?" msgstr "Schakel gemeenschappelijke timers ook uit?" msgid "Activate associated timers too?" msgstr "Activeer gemeenschappelijke timers ook?" msgid "Search timers activated in setup." msgstr "Zoektimers geactiveerd in instellingen" msgid "Run search timer update?" msgstr "Start verversen zoektimer? " msgid "Copy this entry?" msgstr "Kopiëer deze regel?" msgid "Copy" msgstr "Kopiëer" msgid "Copy this entry to templates?" msgstr "Kopiëer deze regel naar sjablonen" msgid "Delete all timers created from this search?" msgstr "Verwijder alle timers aangemaakt door dit zoekcriterium?" msgid "Button$Actions" msgstr "Acties" msgid "Search entries" msgstr "Zoekregels" msgid "active" msgstr "actief" msgid "Edit$Delete search?" msgstr "Zoekcriterium wissen?" msgid "Edit search" msgstr "Bewerk zoekcriteria" msgid "Record" msgstr "Opnemen" #, fuzzy msgid "Announce by OSD" msgstr "Alleen aankondigen (geen timer)" msgid "Switch only" msgstr "Alleen schakelen" #, fuzzy msgid "Announce and switch" msgstr "Alleen aankondigen (geen timer)" #, fuzzy msgid "Announce by mail" msgstr "Alleen aankondigen (geen timer)" msgid "only globals" msgstr "" msgid "Selection" msgstr "Selectie" msgid "all" msgstr "alles" msgid "count recordings" msgstr "tel opnames" msgid "count days" msgstr "tel dagen" msgid "if present" msgstr "" #, fuzzy msgid "same day" msgstr "Eerste dag" #, fuzzy msgid "same week" msgstr "Dag van de week" msgid "same month" msgstr "" msgid "Template name" msgstr "Naam van sjabloon" msgid "Help$Specify the name of the template." msgstr "Geef de naam op van het sjabloon" msgid "Help$Specify here the term to search for." msgstr "Vul hier de zoekterm in." msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" "Er kan gekozen worden uit de volgende zoekinstellingen:\n" "- alle woorden: alle los voorkomende woorden moeten gevonden worden\n" "- minstens één woord: minstens én woord moet worden gevonden\n" "- past precies: de hele zoekterm komt exact overeen\n" "- reguliere expressie: resultaat past bij uitkomst expressie\n" "- 'fuzzy' zoeken: zoek naar mogelijke matches" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "Hier wordt de tolerantie van de 'fuzzy'zoekactie opgegeven. De waarde vertegenwoordigd de toegestane fouten" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "Kies 'ja' idien de zoekactie case-sensitive moet zijn" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "Kies 'ja' indien de zoekactie moet zoeken in de titel van het programma" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "Kies 'ja' indien de zoakactie moet zoeken in de aflevering van een programma" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "Kies 'ja' indien de zoekactie moet zoeken in de samenvatting van een programma." #, fuzzy msgid "Use content descriptor" msgstr "Gebruik beschrijving" #, fuzzy msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "Kies 'ja' indien de zoekactie moet zoeken in de titel van het programma" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "De samenvatting van een programma kan extra informatie bevatten zoals 'Genre', 'Jaar',... binnen EPGsearch 'EPG categoriëen' genoemd. " msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "Het bestand epgsearchcats.conf omschrijft de zoekinstellingen voor deze regel. Men kan zoeken op tekst of waarde. Er kan ook een lijst van voorgedefinieerde waarden geselecteerd en aangepast worden" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "Als een gekozen categorie geen onderdeel is van een samenvatting van een programma, dan zal dit programma niet verschijnen in de zoekresultaten. Om dit te voorkomen kan deze optie worden ingesteld, maar het kan leiden tot heel veel resultaten!" msgid "Use in favorites menu" msgstr "Gebruik in favorieten menu" msgid "Result menu layout" msgstr "Uiterlijk menu resultaten" msgid "Use as search timer" msgstr "Gebruik als zoektimer" msgid "Action" msgstr "Actie" msgid "Switch ... minutes before start" msgstr "Schakel ... minuten voor start" msgid "Unmute sound" msgstr "" #, fuzzy msgid "Ask ... minutes before start" msgstr "Schakel ... minuten voor start" msgid " Series recording" msgstr " Serie's opnemen" msgid "Delete recordings after ... days" msgstr "Verwijder opnames na ... dagen" msgid "Keep ... recordings" msgstr "Bewaar ... opnames" msgid "Pause when ... recordings exist" msgstr "Pauzeer wanneer ... opnames bestaan" msgid "Avoid repeats" msgstr "Vermijdt herhalingen" msgid "Allowed repeats" msgstr "Toegestane herhalingen" msgid "Only repeats within ... days" msgstr "Alleen herhalingen binnen ... dagen" msgid "Compare title" msgstr "Vergelijk titel" msgid "Compare subtitle" msgstr "Vergelijk ondertiteling" msgid "Compare summary" msgstr "Vergelijk samenvatting" #, fuzzy msgid "Min. match in %" msgstr " Min. duur" #, fuzzy msgid "Compare date" msgstr "Vergelijk titel" msgid "Compare categories" msgstr "vergelijk categoriëen" msgid "VPS" msgstr "VPS" msgid "Auto delete" msgstr "Automatisch wissen" msgid "after ... recordings" msgstr "na ... opnames" msgid "after ... days after first rec." msgstr "na ... dagen na eerste opname" msgid "Edit user-defined days of week" msgstr "Bewerk door gebruiker gedefinieerde dagen van de week" msgid "Compare" msgstr "Vergelijk" msgid "Select blacklists" msgstr "Kies blacklists" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "Toepassen" msgid "less" msgstr "minder" msgid "less or equal" msgstr "minder of gelijk" msgid "greater" msgstr "meer" msgid "greater or equal" msgstr "meer of gelijk" msgid "equal" msgstr "gelijk" msgid "not equal" msgstr "niet geljk" msgid "Activation of search timer" msgstr "Activering van zoektimer" msgid "First day" msgstr "" msgid "Last day" msgstr "Eerste dag" msgid "Button$all channels" msgstr "alle kanalen" msgid "Button$only FTA" msgstr "alleen FTA" msgid "Button$Timer preview" msgstr "Timer preview" msgid "Blacklist results" msgstr "Blacklists resultaten" msgid "found recordings" msgstr "gevonden opname's" msgid "Error while accessing recording!" msgstr "Fout tijdens benaderen opnames!" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "Verwijder sjabloon?" msgid "Overwrite existing entries?" msgstr "Overschrijf bestaande invoer?" msgid "Edit entry" msgstr "Wijzig invoer" #, fuzzy msgid "Switch" msgstr "Alleen schakelen" msgid "Announce only" msgstr "Alleen aankondigen (geen timer)" #, fuzzy msgid "Announce ... minutes before start" msgstr "Schakel ... minuten voor start" msgid "action at" msgstr "actie op" msgid "Switch list" msgstr "Schakellijst" msgid "Edit template" msgstr "Wijzig sjabloon" msgid "Timers" msgstr "Timers" msgid ">>> no info! <<<" msgstr ">>> geen info! <<<" msgid "Overview" msgstr "Overzicht" msgid "Button$Favorites" msgstr "Favorieten" msgid "Quick search for broadcasts" msgstr "Snel zoeken naar uitzendingen" msgid "Quick search" msgstr "Snel zoeken" msgid "Show in main menu" msgstr "Toon vermelding in hoofdmenu" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "%d nieuwe uitzending(en) gevonden! Tonen?" msgid "Search timer update done!" msgstr "Verversen zoektimer gereed!" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "Programmeren timer mislukt!" #~ msgid "in %02ldd" #~ msgstr "in %02ldd" #~ msgid "in %02ldh" #~ msgstr "in %02ldh" #~ msgid "in %02ldm" #~ msgstr "in %02ldm" #, fuzzy #~ msgid "Compare expression" #~ msgstr "reguliere uitdrukking" vdr-plugin-epgsearch/po/hr_HR.po0000644000175000017500000005644612466747543016451 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Drazen Dupor , 2004 # Dino Ravnic , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Drazen Dupor \n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" #, fuzzy msgid "Button$Commands" msgstr "Snimi" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Konfiguracija" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" #, fuzzy msgid "Button$Orphaned" msgstr "Snimi" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Snimi" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/ru_RU.po0000644000175000017500000005635412466747543016501 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Vyacheslav Dikonov , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Vyacheslav Dikonov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "ÐаÑтройка" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" msgid "Button$Orphaned" msgstr "" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "ЗапиÑÑŒ" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/de_DE.po0000644000175000017500000011777612466747543016413 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Klaus Schmidinger , 2000 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Klaus Schmidinger \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "Kanalgruppen" msgid "Button$Select" msgstr "Auswahl" msgid "Channel group used by:" msgstr "Gruppe wird verwendet von:" msgid "Edit$Delete group?" msgstr "Gruppe löschen?" msgid "Edit channel group" msgstr "Kanalgruppe editieren" msgid "Group name" msgstr "Gruppenname" msgid "Button$Invert selection" msgstr "Ausw. umdrehen" msgid "Button$All yes" msgstr "Alle ja" msgid "Button$All no" msgstr "Alle nein" msgid "Group name is empty!" msgstr "Gruppenname ist leer!" msgid "Group name already exists!" msgstr "Gruppe existiert bereits!" msgid "Direct access to epgsearch's conflict check menu" msgstr "Direkter Zugriff auf epgsearch's Konflikt-Prüfungs-Menü" msgid "Timer conflicts" msgstr "Timer-Konflikte" msgid "Conflict info in main menu" msgstr "Konflikt-Info im Hauptmenü" msgid "next" msgstr "nächster" #, c-format msgid "timer conflict at %s! Show it?" msgstr "Timer-Konflikt am %s! Anzeigen?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "%d Timer-Konflikte! Erster am %s. Anzeigen?" msgid "search the EPG for repeats and more" msgstr "Suche im EPG nach Wiederholungen und anderem" msgid "Program guide" msgstr "Programmführer" msgid "search timer update running" msgstr "Suchtimer-Update läuft" msgid "Direct access to epgsearch's search menu" msgstr "Direkter Zugriff auf epgsearch's Suchenmenu" msgid "Search" msgstr "Suche" msgid "EpgSearch-Search in main menu" msgstr "EpgSearch-Suche im Hauptmenü" msgid "Button$Help" msgstr "Hilfe" msgid "Standard" msgstr "Standard" msgid "Button$Commands" msgstr "Befehle" msgid "Button$Search" msgstr "Suche" msgid "never" msgstr "nie" msgid "always" msgstr "immer" msgid "smart" msgstr "intelligent" msgid "before user-def. times" msgstr "vor ben.-def. Zeiten" msgid "after user-def. times" msgstr "nach ben.-def. Zeiten" msgid "before 'next'" msgstr "vor 'Nächste'" msgid "General" msgstr "Allgemein" msgid "EPG menus" msgstr "EPG Menüs" msgid "User-defined EPG times" msgstr "Benutzerdef. EPG-Zeiten" msgid "Timer programming" msgstr "Timer-Programmierung" msgid "Search and search timers" msgstr "Suche und Suchtimer" msgid "Timer conflict checking" msgstr "Timer-Konflikt-Prüfung" msgid "Email notification" msgstr "Email-Benachrichtigung" msgid "Hide main menu entry" msgstr "Hauptmenüeintrag verstecken" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Blendet den Hauptmenüeintrag aus. Das kann nützlich sein, falls dieses Plugin verwendet wird, um den originalen 'Programm'-Eintrag zu ersetzen." msgid "Main menu entry" msgstr "Hauptmenü-Eintrag" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "Der Name des Hauptmenüeintrags. Die Standard-Vorgabe ist 'Programmführer'." msgid "Replace original schedule" msgstr "Originale Programmübersicht ersetzen" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "Falls VDR gepatched wurde, um dem Plugin zu erlauben, den originalen 'Programm'-Eintrag zu ersetzen, so kann hier diese Ersetzung de/aktiviert werden." msgid "Start menu" msgstr "Starte mit" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "Hier kann zwischen 'Übersicht - Jetzt' und 'Programm' als Start-Menü für das Plugin gewählt werden." msgid "Ok key" msgstr "Taste Ok" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" "Hier kann das Verhalten der 'Ok'-Taste bestimmt werden. Man kann damit die Inhaltsangabe anzeigen oder zum entsprechenden Sender wechseln.\n" "Hinweis: Die Funktion der Taste 'Blau' (Umschalten/Info/Suche) hängt von dieser Einstellung ab." msgid "Red key" msgstr "Taste Rot" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" "Hier kann ausgewählt werden, welche Standardfunktion ('Aufnehmen' oder 'Befehle') auf der roten Taste liegen soll.\n" "(Umschalten auch mit Taste '0' möglich)" msgid "Blue key" msgstr "Taste Blau" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" "Hier kann ausgewählt werden, welche Standardfunktion ('Umschalten'/'Info' oder 'Suche') auf der blauen Taste liegen soll.\n" "(Umschalten auch mit Taste '0' möglich)" msgid "Show progress in 'Now'" msgstr "Zeige Fortschritt in 'Jetzt'" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "Zeigt einen Fortschrittsbalken in 'Übersicht - Jetzt' an, der wiedergibt wieweit die Sendung bereits fortgeschritten ist." msgid "Show channel numbers" msgstr "Zeige Kanalnummern" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" "Anzeige von Kanalnummern in 'Übersicht - Jetzt'.\n" "\n" "(Zur vollständigen Anpassung einer eigenen Menüdarstellung, bitte das MANUAL lesen)" msgid "Show channel separators" msgstr "Zeige Kanal-Separatoren" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "Anzeige von VDR-Kanalgruppen als Trennlinien zwischen den Programmen in 'Übersicht - Jetzt'." msgid "Show day separators" msgstr "Zeige Tages-Separatoren" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "Anzeige von Trennlinien beim Datumswechsel in der Programmübersicht." msgid "Show radio channels" msgstr "Zeige Radiokanäle" msgid "Help$Show also radio channels." msgstr "Auch Radio-Kanäle anzeigen." msgid "Limit channels from 1 to" msgstr "Kanäle begrenzen von 1 bis" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "Bei einer sehr großen Kanalliste läßt sich der Menü-Aufbau mit dieser Einstellung durch eine Einschränkung der angezeigten Kanäle beschleunigen. Mit '0' wird das Limit aufgehoben." msgid "'One press' timer creation" msgstr "Timer mit 'Aufnehmen' sofort anlegen" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "Beim Erzeugen eines Timers mit 'Aufnehmen' kann hier zwischen dem sofortigen Anlegen des Timers oder der Anzeige des Timer-Edit-Menüs gewählt werden." msgid "Show channels without EPG" msgstr "Zeige Kanäle ohne EPG" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "Hier kann eingestellt werden, ob auch Programme ohne EPG in 'Übersicht - Jetzt' erscheinen sollen. Ein 'Ok' auf diesen Einträgen schaltet zu diesem Kanal um." msgid "Time interval for FRew/FFwd [min]" msgstr "Zeitintervall für FRew/FFwd [min]" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" "Hier kann die Zeitspanne eingestellt werden, die beim Drücken von FRew/FFwd als Sprung durch den EPG benutzt werden soll.\n" "\n" "(Falls diese Tasten nicht vorhanden sind, kann mit '0' ebenfalls diese Funktion erreicht werden. Man erhält dann '<<' und '>>' auf den Tasten Grün/Gelb)" msgid "Toggle Green/Yellow" msgstr "Grün/Gelb umschalten" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "Hiermit wird angegeben, ob die Tasten Grün/Gelb beim Drücken von '0' mitumgeschaltet werden sollen." msgid "Show favorites menu" msgstr "Zeige Favoriten-Menü" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" "Ein Favoriten-Menü kann eine Liste der Lieblingssendungen anzeigen. Hier auswählen, wenn neben 'Jetzt' und 'Nächste' ein solches Menü gewünscht wird.\n" "Jede Suche kann als Favorit verwendet werden. Dazu einfach die Option 'In Favoritenmenü verw.' beim Editieren einer Suche setzen." msgid "for the next ... hours" msgstr "für die nächsten ... Stunden" msgid "Help$This value controls the timespan used to display your favorites." msgstr "Mit diesem Wert wird die Zeitspanne eingestellt, für die Favoriten angezeigt werden sollen." msgid "Use user-defined time" msgstr "Verw. benutzerdef. Zeit" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "Neben 'Jetzt' und 'Nächste' können bis zu 4 weitere Zeiten im EPG angegeben werden, die durch wiederholtes Drücken der Taste Grün verwendet werden können, z.B. 'Abends', 'Spätabend',..." msgid "Description" msgstr "Beschreibung" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "Dies ist die Beschreibung für die benutzer-definierte Zeit, wie sie als Beschriftung für die Taste Grün verwendet werden soll." msgid "Time" msgstr "Zeit" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "Hier wird die benutzer-definierte Zeit im Format 'HH:MM' angegeben." msgid "Use VDR's timer edit menu" msgstr "VDR's Timer-Edit-Menu verw." msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" "Diese Plugin hat sein eigenes Timer-Edit-Menü, das das orginale um einige zusätzliche Funktionen erweitert:\n" "\n" "- ein zusätzlicher Verzeichniseintrag\n" "- benutzerdef. Wochentage für Wiederh.-Timer\n" "- Ergänzung um Episodenname\n" "- Unterstützung von EPG-Variablen (s.MANUAL)" msgid "Default recording dir" msgstr "Standard Aufn.-Verzeichnis" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "Beim Anlegen eines Timers kann hier ein Standard-Aufnahmeverzeichnis vorgegeben werden." msgid "Add episode to manual timers" msgstr "Untertitel in manuellen Timern" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" "Wenn man einen Timer für eine Serie erzeugt, kann mit dieser Option automatisch der Episodenname ergänzt werden.\n" "\n" "- niemals: keine Ergänzung\n" "- immer: immer ergänzen, falls Episodenname vorhanden.\n" "- intelligent: nur ergänzen, wenn Sendung weniger als 80 min dauert" msgid "Default timer check method" msgstr "Standard-Timer-Prüfmethode" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" "Manuelle Timer können hinsichtlich EPG-Änderungen überwacht werden. Hier kann die Standard-Prüfmethode für jeden Kanal hinterlegt werden. Zur Wahl stehen:\n" "\n" "- keine Prüfung\n" "- anhand Sendungskennung: geprüft wird anhand einer Kennung, die durch den Sender vergeben wird.\n" "- anhand Sender/Uhrzeit: geprüft wird anhand der Sendung, die am besten zur Dauer der ursprünglichen Sendung passt." msgid "Button$Setup" msgstr "Einstellungen" msgid "Use search timers" msgstr "Verwende Suchtimer" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "'Suchtimer' können verwendet werden um automatisch Timer für Sendungen zu erstellen, die von einer Suche gefunden werden." msgid " Update interval [min]" msgstr " Aktualisierungsintervall [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "Hier kann das Zeitintervall angegeben werden, in dem im Hintergrund automatisch nach neuen Sendungen gesucht werden soll." msgid " SVDRP port" msgstr " SVDRP Port" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "Die Programmierung neuer Timer oder Timer-Änderungen erfolgt mit SVDRP. Der Vorgabewert hier sollte immer korrekt sein, also nur ändern, wenn man weiß, was man tut." msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "Hier wird die Standard-Priorität für Timer angegeben, die von diesem Plugin erzeugt werden. Dieser Wert kann aber auch bei jeder Suche einzeln gesetzt werden." msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Hier wird die Standard-Lebensdauer für Timer angegeben, die von diesem Plugin erzeugt werden. Dieser Wert kann aber auch bei jeder Suche einzeln gesetzt werden." msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Hier wird die Standard-Vorlaufzeit für Timer angegeben, die von diesem Plugin erzeugt werden. Dieser Wert kann aber auch bei jeder Suche einzeln gesetzt werden." msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Hier wird die Standard-Nachlaufzeit für Timer angegeben, die von diesem Plugin erzeugt werden. Dieser Wert kann aber auch bei jeder Suche einzeln gesetzt werden." msgid "No announcements when replaying" msgstr "Keine Ankündigungen bei Wiedergabe" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "Bitte auf 'Ja' setzen, wenn während einer Wiedergabe keine Ankündigungen über Sendungen erwünscht sind." msgid "Recreate timers after deletion" msgstr "Timer nach Löschen neuprogrammieren" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "Hier 'Ja' wählen, wenn gelöschte Timer mit dem nächsten Suchtimer-Update neu programmiert werden sollen." msgid "Check if EPG exists for ... [h]" msgstr "Prüfe ob EPG für ... [h] existiert" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "Hier kann angeben werden wie viele Stunden zukünftigen EPGs existieren sollen und andernfalls nach einem Suchtimer Update gewarnt werden." msgid "Warn by OSD" msgstr "per OSD warnen" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "Hier mit 'Ja' auswählen, ob eine Warnung zum EPG Check per OSD gewünscht ist." msgid "Warn by mail" msgstr "per Mail warnen" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "Hier mit 'Ja' auswählen, ob eine Warnung zum EPG Check per Mail gewünscht ist." msgid "Channel group to check" msgstr "zu prüfende Kanalgruppe" msgid "Help$Specify the channel group to check." msgstr "Hier die zu prüfende Kanalgruppe auswählen." msgid "Ignore PayTV channels" msgstr "PayTV-Sender ignorieren" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "Um bei der Suche nach Wiederholungen Sendungen von PayTV-Kanälen zu ignorieren, kann hier die Option auf 'Ja' gesetzt werden." msgid "Search templates" msgstr "Such-Vorlagen" msgid "Help$Here you can setup templates for your searches." msgstr "Hier können Vorlagen für Suchen erstellt werden." msgid "Blacklists" msgstr "Ausschlusslisten" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "Hiermit können Ausschlusslisten erstellt werden, die innerhalb einer Suche verwendet werden können, um Sendungen auszuschließen, die man nicht haben will." msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "Hier können Kanalgruppen erstellt werden, die innerhalb einer Suche verwendet werden können. Die Kanalgruppen sind nicht mit den VDR-Kanalgruppen zu vergleichen, sondern stellen einfach eine Gruppe von beliebigen Sendern dar, z.B. 'FreeTV'." msgid "Ignore below priority" msgstr "Ignoriere unter Priorität" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Falls ein Timer fehlschlagen wird, dessen Priorität unter dem angegeben Wert liegt, wird er als 'nicht wichtig' eingestuft. Nur bei wichtigen Konflikten erfolgt eine Nachricht per OSD bei der automatischen Konfliktprüfung." msgid "Ignore conflict duration less ... min." msgstr "Ignoriere Konfliktdauer unter ... Min." msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Falls die Konfliktdauer unter der angegebenen Anzahl an Minuten liegt, wird er als 'nicht wichtig' eingestuft. Nur bei wichtigen Konflikten erfolgt eine Nachricht per OSD bei der automatischen Konfliktprüfung." msgid "Only check within next ... days" msgstr "Prüfe nur die nächsten ... Tage" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "Mit diesem Wert kann der Zeitbereich der Konfliktprüfung eingestellt werden. Alle Konflikte ausserhalb des Bereichs werden als 'noch nicht wichtig' eingestuft." msgid "--- Automatic checking ---" msgstr "--- Automatische Prüfung ---" msgid "After each timer programming" msgstr "Nach jeder Timer-Programmierung" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "Hier auf 'Ja' setzen, wenn die Konfliktprüfung nach jeder manuellen Timer-Programmierung erfolgen soll. Im Falle eines Konflikts wird dann sofort eine Nachricht angezeigt. Diese erscheint nur, wenn dieser Timer in einen Konflikt verwickelt ist." msgid "When a recording starts" msgstr "Beim Beginn einer Aufnahme" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "Hier auf 'Ja' setzen, wenn die Konfliktprüfung beim Beginn jeder Aufnahme erfolgen soll. Im Falle eines Konflikts wird dann sofort eine Nachricht angezeigt. Diese erscheint nur, wenn der Konflikt innerhalb der nächsten 2 Stunden auftritt." msgid "After each search timer update" msgstr "Nach jedem Suchtimer-Update" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "Hier auf 'Ja' setzen, wenn die Konfliktprüfung nach jedem Suchtimer-Update erfolgen soll." msgid "every ... minutes" msgstr "alle ... Minuten" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" "Hier kann das Zeitintervall angegeben werden, in dem eine automatische Konfliktprüfung im Hintergrund erfolgen soll.\n" "(mit '0' wird die automatsiche Prüfung deaktiviert.)" msgid "if conflicts within next ... minutes" msgstr "Wenn nächster Konflikt in ... Minuten" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "Wenn der nächste Konflikt innerhalb der angegebenen Anzahl von Minuten liegt, kann man hiermit ein kürzeres Prüfintervall angeben, damit man häufiger über den Konflikt per OSD benachrichtigt wird." msgid "Avoid notification when replaying" msgstr "Vermeide Nachricht bei Wiedergabe" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "Bitte auf 'Ja' setzen, wenn während einer Wiedergabe keine OSD-Benachrichtigungen über Timer-Konflikte gewünscht sind. Die Benachrichtigung erfolgt trotzdem, wenn der nächste Konflikt innerhalb der nächsten 2 Stunden auftritt." msgid "Search timer notification" msgstr "Suchtimer-Benachrichtigung" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "Hier mit 'Ja' auswählen, ob eine Email-Benachrichtigung über automatisch im Hintergrund programmierte Suchtimer versandt werden soll." msgid "Time between mails [h]" msgstr "Zeit zwischen Mails [h]" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" "Hier die gewünschte Zeit in [h] zwischen\n" "zwei Mails angeben. Mit '0' erhält man eine\n" "neue Mail nach jedem Suchtimer-Update\n" "mit neuen Ergebnissen." msgid "Timer conflict notification" msgstr "Timer-Konflikt-Benachrichtigung" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "Hier mit 'Ja' auswählen, ob eine Email-Benachrichtigung über Timer-Konflikte versändet werden soll." msgid "Send to" msgstr "Senden an" msgid "Help$Specify the email address where notifications should be sent to." msgstr "Hier wird die Email-Adresse angegeben, an welche die Benachrichtigungen versandt werden." msgid "Mail method" msgstr "Mail-Methode" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" "Bitte hier die gewünschte Methode zum Emailversand auswählen. Verfügbar sind:\n" " - 'sendmail': erfordert ein korrekt konfiguriertes Mailsystem\n" " - 'SendEmail.pl': ein einfaches Skript zum Mailversand" msgid "--- Email account ---" msgstr "--- Email-Konto ---" msgid "Email address" msgstr "Email-Adresse" msgid "Help$Specify the email address where notifications should be sent from." msgstr "Hier wird die Email-Adresse angegeben, mit der die Benachrichtigungen versandt werden." msgid "SMTP server" msgstr "SMTP Server" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "Hier wird der SMTP Server hinterlegt, über den die Benachrichtigungen versandt werden. Falls dieser einen anderen Port als den Standard(25) verwendet, dann mit \":port\" anhängen." msgid "Use SMTP authentication" msgstr "Verw. SMTP-Authentifizierung" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "Hier auf 'Ja' setzen, wenn das Emailkonto SMTP-Authentifizierung zum Emailversand benötigt." msgid "Auth user" msgstr "Auth-Benutzer" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "Hier wird der Auth-Benutzername angegeben, falls dieses Emailkonto eine Authentifizierung für SMTP benötigt." msgid "Auth password" msgstr "Auth-Passwort" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "Hier wird das Auth-Passwort angegeben, falls dieses Emailkonto eine Authentifizierung für SMTP benötigt." msgid "Mail account check failed!" msgstr "Mailkonto-Prüfung fehlgeschlagen!" msgid "Button$Test" msgstr "Test" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " aäbcdefghijklmnoöpqrsßtuüvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgid "Start/Stop time has changed" msgstr "Start/Stop-Zeit hat sich geändert" msgid "Title/episode has changed" msgstr "Titel/Episode hat sich geändert" msgid "No new timers were added." msgstr "Es wurden keine neuen Timer angelegt." msgid "No timers were modified." msgstr "Es wurden keine Timer geändert." msgid "No timers were deleted." msgstr "Es wurden keine Timer gelöscht." msgid "No new events to announce." msgstr "Keine neuen Sendungen anzukündigen." msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "%d neue Sendung(en)" msgid "Button$by channel" msgstr "nach Programm" msgid "Button$by time" msgstr "nach Beginn" msgid "Button$Episode" msgstr "Episode" msgid "Button$Title" msgstr "Titel" msgid "announce details" msgstr "Ankündigungsdetails" msgid "announce again" msgstr "Erneut ankündigen" msgid "with next update" msgstr "beim nächsten Update" msgid "again from" msgstr "erneut ab" msgid "Search timer" msgstr "Suchtimer" msgid "Edit blacklist" msgstr "Ausschlussliste editieren" msgid "phrase" msgstr "Ausdruck" msgid "all words" msgstr "alle Worte" msgid "at least one word" msgstr "ein Wort" msgid "match exactly" msgstr "exakt" msgid "regular expression" msgstr "regulärer Ausdruck" msgid "fuzzy" msgstr "unscharf" msgid "user-defined" msgstr "benutzerdefiniert" msgid "interval" msgstr "Bereich" msgid "channel group" msgstr "Kanalgruppe" msgid "only FTA" msgstr "ohne PayTV" msgid "Search term" msgstr "Suche" msgid "Search mode" msgstr "Suchmodus" msgid "Tolerance" msgstr "Toleranz" msgid "Match case" msgstr "Groß/klein" msgid "Use title" msgstr "Verw. Titel" msgid "Use subtitle" msgstr "Verw. Untertitel" msgid "Use description" msgstr "Verw. Beschreibung" msgid "Use extended EPG info" msgstr "Verw. erweiterte EPG Info" msgid "Ignore missing categories" msgstr "Ignoriere fehlende Kat." msgid "Use channel" msgstr "Verw. Kanal" msgid " from channel" msgstr " von Kanal" msgid " to channel" msgstr " bis Kanal" msgid "Channel group" msgstr "Kanalgruppe" msgid "Use time" msgstr "Verw. Uhrzeit" msgid " Start after" msgstr " Start nach" msgid " Start before" msgstr " Start vor" msgid "Use duration" msgstr "Verw. Dauer" msgid " Min. duration" msgstr " Min. Dauer" msgid " Max. duration" msgstr " Max. Dauer" msgid "Use day of week" msgstr "Verw. Wochentag" msgid "Day of week" msgstr "Wochentag" msgid "Use global" msgstr "Global verwenden" msgid "Button$Templates" msgstr "Vorlagen" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "Bitte Senderkriterien prüfen!" msgid "Edit$Delete blacklist?" msgstr "Ausschlussliste löschen?" msgid "Repeats" msgstr "Wiederholung" msgid "Create search" msgstr "Suche anlegen" msgid "Search in recordings" msgstr "Suche in Aufnahmen" msgid "Mark as 'already recorded'?" msgstr "als 'bereits aufgezeichnet' markieren?" msgid "Add/Remove to/from switch list?" msgstr "In/Aus Umschaltliste?" msgid "Create blacklist" msgstr "Ausschlussliste anlegen" msgid "EPG Commands" msgstr "EPG Befehle" msgid "Already running!" msgstr "Läuft bereits!" msgid "Add to switch list?" msgstr "In Umschaltliste aufnehmen?" msgid "Delete from switch list?" msgstr "Aus Umschaltliste entfernen?" msgid "Button$Details" msgstr "Details" msgid "Button$Filter" msgstr "Filter" msgid "Button$Show all" msgstr "Zeige alle" msgid "conflicts" msgstr "Konflikte" msgid "no conflicts!" msgstr "keine Konflikte!" msgid "no important conflicts!" msgstr "keine wichtigen Konflikte!" msgid "C" msgstr "K" msgid "Button$Repeats" msgstr "Wiederh." msgid "no check" msgstr "ohne Überwachung" msgid "by channel and time" msgstr "anhand Sender/Uhrzeit" msgid "by event ID" msgstr "anhand Sendungskennung" msgid "Select directory" msgstr "Verzeichnis wählen" msgid "Button$Level" msgstr "Ebene" msgid "Event" msgstr "" msgid "Favorites" msgstr "Favoriten" msgid "Search results" msgstr "Suchergebnisse" msgid "Timer conflict! Show?" msgstr "Timer-Konflikt! Anzeigen?" msgid "Directory" msgstr "Verzeichnis" msgid "Channel" msgstr "" msgid "Childlock" msgstr "Kindersicherung" msgid "Timer check" msgstr "Überwachung" msgid "recording with device" msgstr "Aufnahme mit Gerät" msgid "Button$With subtitle" msgstr "Mit Untertitel" msgid "Button$Without subtitle" msgstr "Ohne Untertitel" msgid "Button$Extended" msgstr "Erweitert" msgid "Button$Simple" msgstr "Einfach" msgid "Use blacklists" msgstr "Verw. Ausschlusslisten" msgid "Edit$Search text too short - use anyway?" msgstr "Suchtext zu kurz - trotzdem verwenden?" msgid "Button$Orphaned" msgstr "Verwaiste" msgid "Button$by name" msgstr "nach Name" msgid "Button$by date" msgstr "nach Datum" msgid "Button$Delete all" msgstr "Alle löschen" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "Eintrag löschen?" msgid "Edit$Delete all entries?" msgstr "Alle Einträge löschen?" msgid "Summary" msgstr "Inhalt" msgid "Auxiliary info" msgstr "Zusatzinfo" msgid "Button$Aux info" msgstr "Zusatzinfo" msgid "Search actions" msgstr "Suchaktionen" msgid "Execute search" msgstr "Suche ausführen" msgid "Use as search timer on/off" msgstr "Als Suchtimer verwenden an/aus" msgid "Trigger search timer update" msgstr "Suchtimer jetzt aktualisieren" msgid "Show recordings done" msgstr "Zeige erledigte Aufnahmen" msgid "Show timers created" msgstr "Zeige erstellte Timer" msgid "Create a copy" msgstr "Kopie anlegen" msgid "Use as template" msgstr "Als Vorlage verwenden" msgid "Show switch list" msgstr "Zeige Umschaltliste" msgid "Show blacklists" msgstr "Zeige Ausschlusslisten" msgid "Delete created timers?" msgstr "Erstellte Timer löschen?" msgid "Timer conflict check" msgstr "Auf Timer-Konflikte prüfen" msgid "Disable associated timers too?" msgstr "Zugehörige Timer auch deaktivieren?" msgid "Activate associated timers too?" msgstr "Zugehörige Timer auch aktivieren?" msgid "Search timers activated in setup." msgstr "Suchtimer wurden im Setup aktiviert." msgid "Run search timer update?" msgstr "Suchtimer-Update ausführen?" msgid "Copy this entry?" msgstr "Diesen Eintrag kopieren?" msgid "Copy" msgstr "Kopie" msgid "Copy this entry to templates?" msgstr "Diesen Eintrag in Vorlagen kopieren?" msgid "Delete all timers created from this search?" msgstr "Alle Timer löschen, die von dieser Suche erzeugt wurden?" msgid "Button$Actions" msgstr "Aktionen" msgid "Search entries" msgstr "Sucheinträge" msgid "active" msgstr "aktiv" msgid "Edit$Delete search?" msgstr "Suche löschen?" msgid "Edit search" msgstr "Suche editieren" msgid "Record" msgstr "Aufnehmen" msgid "Announce by OSD" msgstr "per OSD ankündigen" msgid "Switch only" msgstr "Nur umschalten" msgid "Announce and switch" msgstr "Ankündigen und Umschalten" msgid "Announce by mail" msgstr "per Mail ankündigen" msgid "only globals" msgstr "nur globale" msgid "Selection" msgstr "Auswahl" msgid "all" msgstr "alle" msgid "count recordings" msgstr "Anzahl Aufnahmen" msgid "count days" msgstr "Anzahl Tage" msgid "if present" msgstr "wenn vorhanden" msgid "same day" msgstr "gleicher Tag" msgid "same week" msgstr "gleiche Woche" msgid "same month" msgstr "gleicher Monat" msgid "Template name" msgstr "Vorlagenname" msgid "Help$Specify the name of the template." msgstr "Hier den Namen für die Vorlage angeben." msgid "Help$Specify here the term to search for." msgstr "Hier den Begriff angeben, nach dem gesucht werden soll." msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" "Es gibt folgende Such-Modi:\n" "\n" "- Ausdruck: sucht nach einem Teil-Ausdruck\n" "- alle Worte: alle einzelnen Worte müssen auftauchen\n" "- ein Wort: nur ein Wort muss auftauchen\n" "- exakt: genaue Übereinstimmung\n" "- regulärer Ausdruck: sucht nach reg. Ausdruck\n" "- unscharf: sucht nach ungefährer Übereinstimmung" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "Hiermit wird die Toleranz für die unscharfe Suche angegeben. Der Wert entspricht den erlaubten Fehlern." msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "Auf 'Ja' setzen, wenn die Suche die Groß-/Kleinschreibung beachtet soll." msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "Auf 'Ja' setzen, wenn die Suche im Titel einer Sendung stattfinden soll." msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "Auf 'Ja' setzen, wenn die Suche im Untertitel einer Sendung stattfinden soll." msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "Auf 'Ja' setzen, wenn die Suche in der Zusammenfassung einer Sendung stattfinden soll." msgid "Use content descriptor" msgstr "Verw. Kennung für Inhalt" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "Auf 'Ja' setzen, wenn die Suche anhand Kennungen zum Inhalt der Sendung stattfinden soll." msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "Die Zusammenfassung einer Sendung kann Zusatz-Informationen wie 'Genre', 'Kategorie', 'Jahr', ... enthalten, welche in EPGSearch 'EPG-Kategorien' genannt werden. Externe EPG-Anbieter liefern diese Informationen häufig mit aus. Damit läßt sich eine Suche verfeinern und auch andere Dinge, wie die Suche nach dem Tagestipp, sind möglich. Zur Verwendung auf 'Ja' setzen." msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "In der Datei epgsearchcats.conf kann der Suchmodus für diesen Eintrag festgelegt werden. Man kann textuell oder numerisch suchen. Ausserdem kann in dieser Datei eine Liste vordefinierter Werte angegeben werden, die hier zur Auswahl stehen." msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "Falls eine gewählte Kategorie nicht in der Zusammenfassung einer Sendung vorhanden ist, wird diese normalerweise aus den Suchergebnissen ausgeschlossen. Um das zu vermeiden, bitte die Option auf 'Ja' setzen. Aber bitte mit Vorsicht verwenden, um eine riesige Menge an Ergebnissen zu vermeiden." msgid "Use in favorites menu" msgstr "In Favoritenmenü verw." msgid "Result menu layout" msgstr "Layout des Ergebnismenüs" msgid "Use as search timer" msgstr "Als Suchtimer verwenden" msgid "Action" msgstr "Aktion" msgid "Switch ... minutes before start" msgstr "Umschalten ... Minuten vor Start" msgid "Unmute sound" msgstr "Ton anschalten" msgid "Ask ... minutes before start" msgstr "Nachfrage ... Minuten vor Start" msgid " Series recording" msgstr " Serienaufnahme" msgid "Delete recordings after ... days" msgstr "Aufn. nach ... Tagen löschen" msgid "Keep ... recordings" msgstr "Behalte ... Aufnahmen" msgid "Pause when ... recordings exist" msgstr "Pause, wenn ... Aufnahmen exist." msgid "Avoid repeats" msgstr "Vermeide Wiederholung" msgid "Allowed repeats" msgstr "Erlaubte Wiederholungen" msgid "Only repeats within ... days" msgstr "Nur Wiederh. innerhalb ... Tagen" msgid "Compare title" msgstr "Vergleiche Titel" msgid "Compare subtitle" msgstr "Vergleiche Untertitel" msgid "Compare summary" msgstr "Vergleiche Beschreibung" msgid "Min. match in %" msgstr "Min. Übereinstimmung in %" msgid "Compare date" msgstr "Vergleiche Zeitpunkt" msgid "Compare categories" msgstr "Vergl. Kategorien" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "automatisch löschen" msgid "after ... recordings" msgstr "nach ... Aufnahmen" msgid "after ... days after first rec." msgstr "nach ... Tagen nach erster Aufn." msgid "Edit user-defined days of week" msgstr "Benutzerdefinierte Wochentage editieren" msgid "Compare" msgstr "Vergleiche" msgid "Select blacklists" msgstr "Ausschlusslisten auswählen" msgid "Values for EPG category" msgstr "Werte für EPG-Kategorie" msgid "Button$Apply" msgstr "Übernehmen" msgid "less" msgstr "kleiner" msgid "less or equal" msgstr "kleiner oder gleich" msgid "greater" msgstr "größer" msgid "greater or equal" msgstr "größer oder gleich" msgid "equal" msgstr "gleich" msgid "not equal" msgstr "ungleich" msgid "Activation of search timer" msgstr "Aktivierung des Suchtimers" msgid "First day" msgstr "Erster Tag" msgid "Last day" msgstr "Letzter Tag" msgid "Button$all channels" msgstr "mit PayTV" msgid "Button$only FTA" msgstr "ohne PayTV" msgid "Button$Timer preview" msgstr "Timer-Vorsch." msgid "Blacklist results" msgstr "Ausschluss-Ergebnisse" msgid "found recordings" msgstr "gefundene Aufnahmen" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "Standard" msgid "Edit$Delete template?" msgstr "Vorlage löschen?" msgid "Overwrite existing entries?" msgstr "Vorhandene Werte überschreiben?" msgid "Edit entry" msgstr "Eintrag editieren" msgid "Switch" msgstr "Nur umschalten" msgid "Announce only" msgstr "Nur ankündigen" msgid "Announce ... minutes before start" msgstr "Ankündigen ... Minuten vor Start" msgid "action at" msgstr "Ausführung um" msgid "Switch list" msgstr "Umschaltliste" msgid "Edit template" msgstr "Vorlage editieren" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr ">>> keine Info! <<<" msgid "Overview" msgstr "Übersicht" msgid "Button$Favorites" msgstr "Favoriten" msgid "Quick search for broadcasts" msgstr "Schnelle Suche nach Sendungen" msgid "Quick search" msgstr "Schnellsuche" msgid "Show in main menu" msgstr "Im Hauptmenü anzeigen" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "%d neue Sendung(en) gefunden! Anzeigen?" msgid "Search timer update done!" msgstr "Suchtimer-Update durchgeführt!" #, c-format msgid "small EPG content on:%s" msgstr "wenig EPG Inhalt für:%s" msgid "VDR EPG check warning" msgstr "VDR EPG Check Warnung" #, c-format msgid "Switch to (%d) '%s'?" msgstr "Umschalten zu (%d) '%s'?" msgid "Programming timer failed!" msgstr "Timer-Programmierung fehlschlagen!" #~ msgid "in %02ldd" #~ msgstr "in %02ldd" #~ msgid "in %02ldh" #~ msgstr "in %02ldh" #~ msgid "in %02ldm" #~ msgstr "in %02ldm" vdr-plugin-epgsearch/po/ca_ES.po0000644000175000017500000005651212466747543016413 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Marc Rovira Vall , 2003 # Ramon Roca , 2003 # Jordi Vilà , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Jordi Vilà \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" #, fuzzy msgid "Button$Commands" msgstr "Gravar" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Configuració" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" #, fuzzy msgid "Button$Orphaned" msgstr "Gravar" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Gravar" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/sk_SK.po0000644000175000017500000011652312466747543016452 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Vladimír Bárta , 2006 # msgid "" msgstr "" "Project-Id-Version: epgsearch\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2009-11-02 09:40+0100\n" "Last-Translator: Milan Hrala \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "Skupiny kanálov" msgid "Button$Select" msgstr "VybraÅ¥" msgid "Channel group used by:" msgstr "Použitá skupina kanálov:" msgid "Edit$Delete group?" msgstr "VymazaÅ¥ skupinu" msgid "Edit channel group" msgstr "UpraviÅ¥ skupinu kanálu" msgid "Group name" msgstr "Názov skupiny" msgid "Button$Invert selection" msgstr "PrevrátiÅ¥ výber" msgid "Button$All yes" msgstr "Ãno vÅ¡etko" msgid "Button$All no" msgstr "VÅ¡etko nie" msgid "Group name is empty!" msgstr "Meno skupiny je prázdne!" msgid "Group name already exists!" msgstr "Meno skupiny existuje!" msgid "Direct access to epgsearch's conflict check menu" msgstr "Priamy prístup EPGsearch k menu konfliktov" msgid "Timer conflicts" msgstr "Konflikty plánovaÄa" msgid "Conflict info in main menu" msgstr "Informácie o konfliktoch v hlav menu" msgid "next" msgstr "Äalší" #, c-format msgid "timer conflict at %s! Show it?" msgstr "Konflikt plánu o %s! ZobraziÅ¥?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "%d konflikty plánovania! Prvý o %s. UkázaÅ¥" msgid "search the EPG for repeats and more" msgstr "PrehľadaÅ¥ televízny program, Äi nebude repríza" msgid "Program guide" msgstr "Programový sprievodca" #, fuzzy msgid "search timer update running" msgstr "Aktualizácia vyhľadávania plánov skonÄená!" msgid "Direct access to epgsearch's search menu" msgstr "Priamy prístup k epgsearch cez vyhľadávacie menu" msgid "Search" msgstr "HĺadaÅ¥" msgid "EpgSearch-Search in main menu" msgstr "EpgSearch-Vyhľadávanie v hlavnom menu" msgid "Button$Help" msgstr "Pomoc" msgid "Standard" msgstr "bežne" msgid "Button$Commands" msgstr "Príkazy" msgid "Button$Search" msgstr "HľadaÅ¥" msgid "never" msgstr "nikdy" msgid "always" msgstr "vždy" msgid "smart" msgstr "chytrý" msgid "before user-def. times" msgstr "pred užívateľ-def. plánu" msgid "after user-def. times" msgstr "po užívateľ-def. plánu" msgid "before 'next'" msgstr "pred 'Äalším'" msgid "General" msgstr "Hlavné" msgid "EPG menus" msgstr "EPG menu" msgid "User-defined EPG times" msgstr "Užívateľom-urÄený EPG plán" msgid "Timer programming" msgstr "Plán programovania" msgid "Search and search timers" msgstr "HľadaÅ¥ a prehľadaÅ¥ plány" msgid "Timer conflict checking" msgstr "Kontrola konfliktov plánu" msgid "Email notification" msgstr "Oznámenie na Email" msgid "Hide main menu entry" msgstr "SkryÅ¥ v hlavnom menu" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Skryje v hlavnom menu položku. Môže to byÅ¥ užitoÄné, ak tento modul má nahradiÅ¥ pôvodný 'Program' ." msgid "Main menu entry" msgstr "Hlavné menu" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "meno položky v hlavnom menu , ktorá je nastavená na 'Programový sprievodca'." msgid "Replace original schedule" msgstr "NahradiÅ¥ pôvodný harmonogram" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "KeÄ je VDR opravený, môžete aktivovaÅ¥ výmenu televízneho programu tu, aby tento modul nahradil pôvodný televízny program." msgid "Start menu" msgstr "Å tart menu" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "KeÄ sa spustí tento modul, tak si vyberte medzi 'Prehľad - teraz' a 'Televíznym programom' v Å tart menu." msgid "Ok key" msgstr "Ok klávesa" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" "Tu si vyberte správanie klávesy 'Ok'. Môžete ju použiÅ¥ na zobrazenie súhrnu alebo prepnúť na zodpovedajúci kanál.\n" "Poznámka: funkcia 'modrej' klávesy (Prepnúť / Informácie / HľadaÅ¥) závisí na nastavení." msgid "Red key" msgstr "ÄŒervená klávesa" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" "Vyberte si, ktoré Å¡tandardné funkcie ( 'Nahrávky' alebo 'príkazy'), chcete maÅ¥ pod Äerveným tlaÄítkom.\n" "(Možno zapínaÅ¥ s klávesou '0')" msgid "Blue key" msgstr "Modrá klávesa" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" "Vyberte si, ktoré Å¡tandardné funkcie ( 'Nahrávky' alebo 'príkazy'), chcete maÅ¥ pod modrým tlaÄítkom.\n" "(Možno zapínaÅ¥ s klávesou '0')" msgid "Show progress in 'Now'" msgstr "ZobraziÅ¥ proces v 'Now'" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "Ukazuje priebeh v 'Prehľad - teraz', ktorý informuje o zostávajúcom Äase aktuálnej udalosti." msgid "Show channel numbers" msgstr "ZobraziÅ¥ Äíslo kanálu" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" "Zobrazenie Äísla kanálov v 'Prehľad - Teraz'. \n" "\n" "(Ak chcete kompletne definovaÅ¥ vlastné menu ,prosím skontrolujte MANUÃL)" msgid "Show channel separators" msgstr "OddeliÅ¥ zobrazené kanály" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "ZobraziÅ¥ skupiny VDR kanálov s oddeľovaÄmi v 'Prehľad - Teraz'." msgid "Show day separators" msgstr "ZobraziÅ¥ oddeľovaÄe dní" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "ZobraziÅ¥ deliace Äiary cez dennú prestávku v 'PlánovaÄi." msgid "Show radio channels" msgstr "ZobraziÅ¥ rádio kanály" msgid "Help$Show also radio channels." msgstr "ZobraziÅ¥ tiež rozhlasové kanály" msgid "Limit channels from 1 to" msgstr "Limit kanálov od 1 do" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "Ak máte veľa nastavených kanálov, môžete urýchliÅ¥ vec tak, že obmedzíte zobrazené kanály s týmto nastavením. Použite '0 'pre vypnutie limitu." msgid "'One press' timer creation" msgstr "Raz stlaÄiÅ¥ vytvorenie plánu" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "KeÄ je ÄasovaÄ vytvorený s 'NahraÅ¥', tak si môžete vybraÅ¥ medzi okamžitým vytvorením ÄasovaÄa alebo zobrazenie menu s úpravami ÄasovaÄa." msgid "Show channels without EPG" msgstr "ZobraziÅ¥ kanály bez EPG" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "Vyberte 'áno', ak chcete zobraziÅ¥ kanály bez EPG v 'Prehľad - Teraz'. 'Ok' na tejto položieke prepína kanál." msgid "Time interval for FRew/FFwd [min]" msgstr "ÄŒasový úsek pre FRew/FFwd [min]" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" "Tu si vyberte Äasový interval, ktorý by mal byÅ¥ použitý pre skákanie cez EPG stlaÄením FRew / FFwd.\n" "\n" "(Ak nemáte tie klávesy, môžete prepínaÅ¥ na túto funkciu stlaÄením '0' a '<<' alebo '>>' ' klávesy zelenej a žltej)search" msgid "Toggle Green/Yellow" msgstr "PrepínaÄ zelenej/žltej" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "UveÄte, Äi zelenou a žltou, sa má tiež prepínaÅ¥ pri stlaÄení '0 '." msgid "Show favorites menu" msgstr "ZobraziÅ¥ obľúbené menu" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" "Obľúbené položky menu je možné zobraziÅ¥ zoznam obľúbených staníc. PovoliÅ¥, ak chcete ÄalÅ¡ie ponuky vedľa 'teraz' a 'Nasleduje' \n" "Akékoľvek vyhľadávania možno použiÅ¥ ako obľúbené. Musíte len nastaviÅ¥ voľbu 'PoužiÅ¥ do obľúbených položiek menu' pri úpravách vyhľadávania." msgid "for the next ... hours" msgstr "Za ÄalÅ¡ie ... hodiny" msgid "Help$This value controls the timespan used to display your favorites." msgstr "Táto hodnota urÄuje Äasové rozpätie pre zobrazenie obľúbených." msgid "Use user-defined time" msgstr "PoužiÅ¥ užívateľom definované plánovanie" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "Okrem 'teraz' a 'Nasleduje' môžete zadaÅ¥ až 4 iné Äasy v EPG, ktoré môžu byÅ¥ použité po opakovanom stlaÄení zeleného tlaÄitka, napr 'hlavnom vysielacom Äase', 'neskoro v noci',..." msgid "Description" msgstr "Popis" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "To to je znázornené pre užívateľom-stanovenej lehote(Äasu), ako bude vyzeraÅ¥ oznaÄenie na zelenom tlaÄítku." msgid "Time" msgstr "ÄŒas" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "Presne napíšte Äas vo formáte 'HH:MM'." msgid "Use VDR's timer edit menu" msgstr "PoužiÅ¥ menu úpravy VDR ÄasovaÄa" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" "Tento modul je rozšírením pôvodného menu s úpravami vysielacieho Äasu a pridáva niektoré nové funkcie, ako je \n" "- Pridávanie položkou v adresári \n" "- UrÄenie dňa v týždni, ak sa opakujú vysielacie Äasy \n" "- Pridanie mena epizódy \n" "- Podporu pre menlivé EPG (pozri manuál)" msgid "Default recording dir" msgstr "Predvolený adresár záznamov" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "Tu môžete zadaÅ¥ predvolený adresár záznamov ,ktorý sa použije ak vytvárate nový plán nahrávania," msgid "Add episode to manual timers" msgstr "PridaÅ¥ epizódy do ruÄného ÄasovaÄa" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" "Ak vytvoríte plán nahrávania pre sériu, môžete automaticky pridaÅ¥ názov epizódy. \n" "\n" "- Nikdy: nie okrem \n" "- Vždy: vždy pridaÅ¥ meno epizódy ak je prítomné \n" "- Inteligentne :pridaÅ¥ iba ak udalosÅ¥ trvá menej ako 80 minút." msgid "Default timer check method" msgstr "Predvolený postup kontroly plánov" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" "Manuálne plány môžu byÅ¥ kontrolované na zmeny EPG. Tu si môžete nastaviÅ¥ predvolený spôsob kontroly pre každý kanál. Vyberte si medzi \n" "\n" "- nekontrolovaÅ¥ \n" " - Podľa ID udalosti: kontroly ID udalosti poskytované poskytovateľom kanála. \n" "- Podľa kanálu a Äasu: kontrola dĺžky vysielaného programu." msgid "Button$Setup" msgstr "Nastavenie" msgid "Use search timers" msgstr "PoužiÅ¥ vyhľadávanie ÄasovaÄov" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "Vyhľadávanie vysielacieho Äasu 'možno použiÅ¥ na automatické vytváranie plánov nahrávania, ktoré zodpovedajú vášmu hľadanému kritériu." msgid " Update interval [min]" msgstr " obnovovací interval [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "Zvolte ako Äasto sa majú na pozadí hľadaÅ¥ udalosti." msgid " SVDRP port" msgstr " SVDRP port" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "Programovanie nových plánov alebo úpravy plánov sa vykonávajú so SVDRP. Predvolená hodnota by mala byÅ¥ v poriadku, takže ho zmente len vtedy, ak viete, Äo robíte." msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "UveÄte predvolenú prioritu plánov nahrávania vytvorených s týmto modulom. Túto hodnotu možno upraviÅ¥ aj pre každé samostatné hľadanie." msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "UveÄte predvolenú životnosÅ¥ plánov / nahrávky vytvorených s týmto modulom. Túto hodnotu možno upraviÅ¥ aj pre každé samostatné hľadanie." msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "UveÄte predvolený nadbytok úvodného záznamu plánu / nahrávky vytvoreným s týmto modulom. Túto hodnotu možno upraviÅ¥ aj pre každé samostatné hľadanie." msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "UveÄte predvolený nadbytok pri ukonÄení nahrávania plánu / nahrávky vytvoreným s týmto modulom. Túto hodnotu možno upraviÅ¥ aj pre každé samostatné hľadanie." msgid "No announcements when replaying" msgstr "NeoznamovaÅ¥ pri prehrávaní" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "Ak nieÄo prehrávate a nepáÄi sa vám oznamovanie o vysielaní, tak nastavte 'áno'" msgid "Recreate timers after deletion" msgstr "Znova vytvoriÅ¥ plán po vymazaní" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "Ak zmažete plán nahrávania a nechcete aby bol znova vytvorený po automatickom obnovení vyhľadávaÄa plánov, tak nastavte 'áno'" msgid "Check if EPG exists for ... [h]" msgstr "" #, fuzzy msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "Ak kontrola konfliktov by mala byÅ¥ vykonávaná pri každom obnovení vyhľadávaÄa plánov, tak nastavte 'áno'" #, fuzzy msgid "Warn by OSD" msgstr "Iba oznámiÅ¥" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "Nastavte áno ak potrebujete oznamovaÅ¥ konflikty plánu na mail" #, fuzzy msgid "Warn by mail" msgstr "Iba oznámiÅ¥" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "Nastavte Ãno, ak váš úÄet potrebuje overenie na poslanie mailov" #, fuzzy msgid "Channel group to check" msgstr "Skupina kanálov" #, fuzzy msgid "Help$Specify the channel group to check." msgstr "UveÄte meno Å¡ablony" msgid "Ignore PayTV channels" msgstr "NevšímaÅ¥ si PayTV kanály" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "Ak nepotrebujete zobraziÅ¥ udalosti na kanáloch PayTV pri opakovanom vyhľadávaní, nastavte 'áno'" msgid "Search templates" msgstr "Vyhľadávanie Å¡ablóny" msgid "Help$Here you can setup templates for your searches." msgstr "Tu si môžete nastaviÅ¥ Å¡ablóny pre vyhľadávanie." msgid "Blacklists" msgstr "ÄŒierny zoznam" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "Tu sa nastavuje Äierny zoznam, ktorý môže byÅ¥ použitý v rámci hľadania a tak vylúÄiÅ¥ udalosti, ktoré sa vám nepáÄia." msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "Tu si môžete nastaviÅ¥ skupinu kanálov, ktoré majú byÅ¥ použité v rámci hľadania. Tie sú odliÅ¡né od kanálov VDR skupín a predstavujú súbor ľubovoľných kanálov, napr 'volne šíriteľné '." msgid "Ignore below priority" msgstr "nevšímaÅ¥ si prioritu" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Ak je plán nahrávania s prioritou pod danú hodnotu dôjde k zlyhaniu, pretože nebude klasifikovaný ako dôležitý. Iba dôležité konflikty vyvolávajú OSD správy." msgid "Ignore conflict duration less ... min." msgstr "NevšímaÅ¥ si konflikty menÅ¡ie ako ... min" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Ak doba konfliktu pretrváva menej ako daný poÄet minút, nebude konflikt braÅ¥ ako dôležitý. Iba dôležité konflikty sa automaticky zobrazia ako OSD správa." msgid "Only check within next ... days" msgstr "SkontrolovaÅ¥ iba do budúcich ... dní" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "Táto hodnota znižuje konflikty podľa daného rozsahu dní. VÅ¡etky ostatné konflikty sú klasifikované ako 'eÅ¡te dôležité'." msgid "--- Automatic checking ---" msgstr "--- Automatická kontrola ---" msgid "After each timer programming" msgstr "Po každom programovaní ÄasovaÄa" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "Ak pri ruÄnom programovaní plánu nastane konflikt, tak vám vypíše okamžitú správu o konflikte. Správa sa zobrazí v prípade ak plán je zapojený do akéhokoľvek konfliktu. Ak danú funkciu chcete použiÅ¥ zvolte 'áno'" msgid "When a recording starts" msgstr "Pri nahrávaní sa spustí" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "Nastavte 'áno' ak by mala byÅ¥ kontrola konfliktov vykonaná pri spustiní nahrávania. V prípade konfliktu vám poÅ¡le okamžite správu. Správa sa zobrazí v prípade konfliktu iba poÄas 2 hodín." msgid "After each search timer update" msgstr "Po každom hľadaní plánu zmenené" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "Ak kontrola konfliktov by mala byÅ¥ vykonávaná pri každom obnovení vyhľadávaÄa plánov, tak nastavte 'áno'" msgid "every ... minutes" msgstr "každých ... minút" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" "Zvolte ako Äasto majú byÅ¥ použité automatické kontroly konfliktov na pozadí. \n" "('0 'Zakáže automatické kontroly)" msgid "if conflicts within next ... minutes" msgstr "ak je v rozpore s ÄalÅ¡ou ... minútou" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "Ak sa objaví Äalší konflikt v danom poÄte minút, môžete zvoliÅ¥ kratší interval kontroly a tak získaÅ¥ viac OSD oznámení. " msgid "Avoid notification when replaying" msgstr "Vyhnúť sa oznámeniam pri prehrávaní" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "Nastavte 'áno', ak nechcete dostávaÅ¥ OSD správu o konfliktoch, v prípade,že nieÄo prehrávate. AvÅ¡ak, správy sa zobrazia v prípade prvého nadchádzajúceho konfliktu v nasledujúcich 2 hodinách." msgid "Search timer notification" msgstr "Hlásenie vyhľadávania ÄasovaÄa" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "Nastavte áno ak potrebujete oznamovaÅ¥ automaticky vyhľadané plány na mail" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "OznámiÅ¥ konflikt plánov" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "Nastavte áno ak potrebujete oznamovaÅ¥ konflikty plánu na mail" msgid "Send to" msgstr "PoslaÅ¥ no" msgid "Help$Specify the email address where notifications should be sent to." msgstr "Rozpíšte email adresu, na ktorú by sa mali posielaÅ¥ oznámenia." msgid "Mail method" msgstr "Mailová metóda" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" "Zvolte použitý spôsob posielania mailov.\n" "Vyberte medzi\n" " - 'sendmail': vyžaduje, aby bol správne nakonfigurovaný systém e-mailu - 'SendEmail.pl': jednoduchý skript pre doruÄovanie poÅ¡ty" msgid "--- Email account ---" msgstr "--- Email úÄet ---" msgid "Email address" msgstr "Email adresa" msgid "Help$Specify the email address where notifications should be sent from." msgstr "Zadajte mailovú adresu na ktorá sa budú posielaÅ¥ upozornenia." msgid "SMTP server" msgstr "SMTP server" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "Zadajte SMTP server, ktorý by mal posielaÅ¥ oznámenia. Ak sa port líši od predvoleného (25), tak pripíšte port s \": port \"." msgid "Use SMTP authentication" msgstr "PoužiÅ¥ SMTP overenie" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "Nastavte Ãno, ak váš úÄet potrebuje overenie na poslanie mailov" msgid "Auth user" msgstr "Dôveryhodný užívateľ" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "Zvolte overovacie meno, ak úÄet potrebuje overenie pre SMTP" msgid "Auth password" msgstr "Dôveryhodné heslo" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "Zvolte overovacie heslo, ak je nutné overenie pre SMTP." msgid "Mail account check failed!" msgstr "Chyba kontroly mailového úÄtu!" msgid "Button$Test" msgstr "TestovaÅ¥" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " aáäbcÄdÄeéfghiíjklĺľmnňoóôpqrÅ•sÅ¡tÅ¥uúvwxyýzž0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgid "Start/Stop time has changed" msgstr "SpustiÅ¥/ZastaviÅ¥ dobu zmien" msgid "Title/episode has changed" msgstr "Názov / epizóda sa zmenila" msgid "No new timers were added." msgstr "Žiadne nové plány neboli pridané." msgid "No timers were modified." msgstr "Žiadne plány neboli upravované." msgid "No timers were deleted." msgstr "Žiadne plány neboli vymazané." msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "Táto verzia epgsearch nepodporuje túto službu!" msgid "EPGSearch does not exist!" msgstr "Epgsearch neexistuje!" #, c-format msgid "%d new broadcast" msgstr "%d nové vysielanie" msgid "Button$by channel" msgstr "podľa kanálu" msgid "Button$by time" msgstr "podľa Äasu" msgid "Button$Episode" msgstr "Epizóda" msgid "Button$Title" msgstr "Názov" msgid "announce details" msgstr "oznámiÅ¥ podrobnosti" msgid "announce again" msgstr "oznámiÅ¥ znova" msgid "with next update" msgstr "s ÄalÅ¡ou aktualizáciou" msgid "again from" msgstr "znova od" msgid "Search timer" msgstr "HľadaÅ¥ Äasy" msgid "Edit blacklist" msgstr "UpraviÅ¥ Äiernu listinu" msgid "phrase" msgstr "slovné spojenie" msgid "all words" msgstr "vÅ¡etky slová" msgid "at least one word" msgstr "aspoň jedno slovo" msgid "match exactly" msgstr "prispôsobiÅ¥ presne" msgid "regular expression" msgstr "bežný výraz" msgid "fuzzy" msgstr "nejasný" msgid "user-defined" msgstr "urÄené užívateľom" msgid "interval" msgstr "Äasové rozpätie" msgid "channel group" msgstr "skupin kanálov" msgid "only FTA" msgstr "iba voľne šíritelné" msgid "Search term" msgstr "HľadaÅ¥ termín" msgid "Search mode" msgstr "Spôsob vyhľadávania" msgid "Tolerance" msgstr "odchylka " msgid "Match case" msgstr "Argumenty zhody" msgid "Use title" msgstr "PoužiÅ¥ názov" msgid "Use subtitle" msgstr "PoužiÅ¥ titulky" msgid "Use description" msgstr "PoužiÅ¥ popis" msgid "Use extended EPG info" msgstr "PoužiÅ¥ rozšírené EPG informácie" msgid "Ignore missing categories" msgstr "IgnorovaÅ¥ chýbajúce kategórie" msgid "Use channel" msgstr "Použi kanál" msgid " from channel" msgstr " od kanálu" msgid " to channel" msgstr " po kanál" msgid "Channel group" msgstr "Skupina kanálov" msgid "Use time" msgstr " Použi Äas" msgid " Start after" msgstr " od kedy" msgid " Start before" msgstr " Po kedy" msgid "Use duration" msgstr " Poži trvanie" msgid " Min. duration" msgstr " Min. doba" msgid " Max. duration" msgstr " Max doba" msgid "Use day of week" msgstr " Použi deň v týždni" msgid "Day of week" msgstr " Deň v týždni" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "Å ablony" msgid "*** Invalid Channel ***" msgstr "*** Neplatný kanál ***" msgid "Please check channel criteria!" msgstr "Prosím, skontrolujte kritéria kanálu!" msgid "Edit$Delete blacklist?" msgstr "VymazaÅ¥ Äierny zoznam?" msgid "Repeats" msgstr "Repríza" msgid "Create search" msgstr "VytvoriÅ¥ vyhľadávanie" msgid "Search in recordings" msgstr "HľadaÅ¥ v nahrávkach" msgid "Mark as 'already recorded'?" msgstr "VymazaÅ¥ urÄené nahrá " msgid "Add/Remove to/from switch list?" msgstr "PridaÅ¥/VymazaÅ¥ do/zo zoznamu?" msgid "Create blacklist" msgstr "VytvoriÅ¥ Äiernu listinu" msgid "EPG Commands" msgstr "EPG príkazy" msgid "Already running!" msgstr "Práve spustené!" msgid "Add to switch list?" msgstr "PridaÅ¥ do zoznamu?" msgid "Delete from switch list?" msgstr "VymazaÅ¥ zo zoznamu?" msgid "Button$Details" msgstr "Podrobnosti" msgid "Button$Filter" msgstr "filter" msgid "Button$Show all" msgstr "ZobraziÅ¥ vÅ¡etko" msgid "conflicts" msgstr "konflikty" msgid "no conflicts!" msgstr "Bez konfliktu!" msgid "no important conflicts!" msgstr "žiadne dôležité konflikty!" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "Reprízy" msgid "no check" msgstr "neskontrolované" msgid "by channel and time" msgstr "podľa kanálu a Äasu" msgid "by event ID" msgstr "podľa ID" msgid "Select directory" msgstr "VybraÅ¥ adresár" msgid "Button$Level" msgstr "Úroveň" msgid "Event" msgstr "Udalosti" msgid "Favorites" msgstr "Obľúbené" msgid "Search results" msgstr "Výsledok hľadania" msgid "Timer conflict! Show?" msgstr "Konflikt plánu! ZobraziÅ¥?" msgid "Directory" msgstr "Adresár" msgid "Channel" msgstr "Kanál" msgid "Childlock" msgstr "Detský zámok" msgid "Timer check" msgstr "Kontrola plánu" msgid "recording with device" msgstr "nahrávanie so zariadením" msgid "Button$With subtitle" msgstr "S titulkami" msgid "Button$Without subtitle" msgstr "Bez titulkov" msgid "Button$Extended" msgstr "Rozšírené" msgid "Button$Simple" msgstr "Jednoduché" msgid "Use blacklists" msgstr "PoužiÅ¥ Äiernu listinu" msgid "Edit$Search text too short - use anyway?" msgstr "Hľadaný text je krátky - použiÅ¥ aj tak?" #, fuzzy msgid "Button$Orphaned" msgstr "podľa kanálu" msgid "Button$by name" msgstr "podľa mena" msgid "Button$by date" msgstr "podľa dátumu" msgid "Button$Delete all" msgstr "VymazaÅ¥ vÅ¡etko" msgid "Recordings" msgstr "Nahrávky" msgid "Edit$Delete entry?" msgstr "VymazaÅ¥ údaje?" msgid "Edit$Delete all entries?" msgstr "VymazaÅ¥ vÅ¡etky údaje?" msgid "Summary" msgstr "Celkovo" msgid "Auxiliary info" msgstr "Doplňujúce informácie" msgid "Button$Aux info" msgstr "Pomocné informácie" msgid "Search actions" msgstr "HľadaÅ¥ akcie" msgid "Execute search" msgstr "SpustiÅ¥ vyhladávanie" msgid "Use as search timer on/off" msgstr "PoužiÅ¥ ako vyhľadávaÄ plánu zapnuté/vypnuté" msgid "Trigger search timer update" msgstr "Spustená aktualizácia vyhľadávania plánu" msgid "Show recordings done" msgstr "ZobraziÅ¥ spravené nahrávky" msgid "Show timers created" msgstr "ZobraziÅ¥ vytvorené plány" msgid "Create a copy" msgstr "VytvoriÅ¥ a kopírovaÅ¥" msgid "Use as template" msgstr "PoužiÅ¥ ako Å¡ablonu" msgid "Show switch list" msgstr "ZobraziÅ¥ zoznam" msgid "Show blacklists" msgstr "ZobraziÅ¥ Äiernu listinu" msgid "Delete created timers?" msgstr "VymazaÅ¥ vytvorené plány?" msgid "Timer conflict check" msgstr "Kontrola konfliktu plánov" msgid "Disable associated timers too?" msgstr "ZakázaÅ¥ súvisiace plány?" msgid "Activate associated timers too?" msgstr "PovoliÅ¥ aj súvisiace plány?" msgid "Search timers activated in setup." msgstr "VyhľadávaÄ plánov aktivovaný v nastavení." msgid "Run search timer update?" msgstr "SpustiÅ¥ aktualizáciu vyhladávania plánov?" msgid "Copy this entry?" msgstr "KopírovaÅ¥ tieto údaje?" msgid "Copy" msgstr "KopírovaÅ¥" msgid "Copy this entry to templates?" msgstr "KopírovaÅ¥ tieto údaje z Å¡ablon?" msgid "Delete all timers created from this search?" msgstr "VymazaÅ¥ vÅ¡etky plány vytvorené cez vyhľadávaÄ?" msgid "Button$Actions" msgstr "Akcia" msgid "Search entries" msgstr "VyhľadaÅ¥ údaje" msgid "active" msgstr "aktívne" msgid "Edit$Delete search?" msgstr "VymazaÅ¥ vyhľadané?" msgid "Edit search" msgstr "UpraviÅ¥ vyhladávanie" msgid "Record" msgstr "NahraÅ¥" #, fuzzy msgid "Announce by OSD" msgstr "Iba oznámiÅ¥" msgid "Switch only" msgstr "Prepnúť iba" #, fuzzy msgid "Announce and switch" msgstr "Iba oznámiÅ¥" #, fuzzy msgid "Announce by mail" msgstr "Iba oznámiÅ¥" msgid "only globals" msgstr "" msgid "Selection" msgstr "Vybrané" msgid "all" msgstr "vÅ¡etko" msgid "count recordings" msgstr "PoÄet nahrávok" msgid "count days" msgstr "PoÄet dní" msgid "if present" msgstr "" #, fuzzy msgid "same day" msgstr "Posledný deň" #, fuzzy msgid "same week" msgstr " Deň v týždni" msgid "same month" msgstr "" msgid "Template name" msgstr "Meno Å¡ablony" msgid "Help$Specify the name of the template." msgstr "UveÄte meno Å¡ablony" msgid "Help$Specify here the term to search for." msgstr "Sem zadajte termín pre vyhĺadávanie" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" "Podľa spôsobu vyhĺadávania je: \n" "\n" "- Veta: vyhľadávanie Äiastkového termínu \n" "- VÅ¡etky slová: vÅ¡etky jednotlivé slová musia byÅ¥ \n" "- Aspoň jedno slovo: aspoň jedno jediné slovo, musí byÅ¥ \n" "- Presne sa zhodujú: musia presne zodpovedaÅ¥ \n" "- ZvyÄajný výraz: presný výraz \n" "- Nepresné vyhľadávanie: vyhľadávanie približne" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "Toto nastaví toleranciu nepresnosti vyhľadávania. Hodnota predstavuje povolené chyby." msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "Nastavte 'Ãno', ak vaÅ¡e vyhľadávanie by malo zodpovedaÅ¥ prípadu." msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "Nastavte 'Ãno', ak chcete hľadaÅ¥ v názvoch ." msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "Nastavte 'Ãno', ak chcete hľadaÅ¥ v epizóde ." msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "Nastavte 'Ãno', ak chcete hľadaÅ¥ vo vÅ¡etkých údajoch." #, fuzzy msgid "Use content descriptor" msgstr "PoužiÅ¥ popis" #, fuzzy msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "Nastavte 'Ãno', ak chcete hľadaÅ¥ v názvoch ." msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "Súhrn udalostí, môže obsahovaÅ¥ ÄalÅ¡ie informácie, ako 'Žáner', 'Kategória', 'Rok',... tzv 'EPG kategórie' v epgsearch. VonkajÅ¡ie EPG služby Äasto takéto informácie poskytujú. To umožňuje kvalitnejÅ¡ie vyhľadávanie a iné veci, ako je hľadanie 'typ dňa' alebo 'kino na' . Pre použitie nastavte na 'Ãno'." msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "Súbor epgsearchcats.conf Å¡pecifikuje režim hľadania pre túto položku. Môže vyhľadávaÅ¥ podľa textu alebo hodnoty. Môžete tiež upravovaÅ¥ zoznam preddefinovaných hodnôt, v tomto súbore, ktorý možno vybraÅ¥ tu." msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "Ak vybraná kategória nie je súÄasÅ¥ou súhrnu údajov, tak je zvyÄajne vylúÄená z výsledkov vyhľadávania. Ak chcete tomu predísÅ¥, nastavte túto voľbu na 'Ãno', ale s mierou prosím , aby sa zabránilo veľkému množstvu výsledkov." msgid "Use in favorites menu" msgstr "PoužiÅ¥ v obľúbenom menu" msgid "Result menu layout" msgstr "UsporiadaÅ¥ výsledné menu" msgid "Use as search timer" msgstr "PoužiÅ¥ ako vyhľadávaÄ plánu" msgid "Action" msgstr "Akcia" msgid "Switch ... minutes before start" msgstr "Prepnúť ... minút pred Å¡tartom" msgid "Unmute sound" msgstr "PustiÅ¥ zvuk" #, fuzzy msgid "Ask ... minutes before start" msgstr "Prepnúť ... minút pred Å¡tartom" msgid " Series recording" msgstr " Sériové nahrávky" msgid "Delete recordings after ... days" msgstr "VymazaÅ¥ nahrávky po ... dňoch" msgid "Keep ... recordings" msgstr "UchovaÅ¥ ... nahrávok" msgid "Pause when ... recordings exist" msgstr "ZastaviÅ¥ ak ... nahrávka existuje" msgid "Avoid repeats" msgstr "VyhýbaÅ¥ sa reprízam" msgid "Allowed repeats" msgstr "povoliÅ¥ reprízy" msgid "Only repeats within ... days" msgstr "Iba reprízy behom ... dní" msgid "Compare title" msgstr "porovnaÅ¥ tituly" msgid "Compare subtitle" msgstr "porovnaÅ¥ titulky" msgid "Compare summary" msgstr "porovnaÅ¥ celkovo" #, fuzzy msgid "Min. match in %" msgstr " Min. doba" #, fuzzy msgid "Compare date" msgstr "porovnaÅ¥ tituly" msgid "Compare categories" msgstr "porovnaÅ¥ kategórie" msgid "VPS" msgstr "VPS" msgid "Auto delete" msgstr "automaticky vymazaÅ¥" msgid "after ... recordings" msgstr "po ... nahrávkach" msgid "after ... days after first rec." msgstr "po ... dňoch od prvého nahratia." msgid "Edit user-defined days of week" msgstr "UpraviÅ¥ užívateľom urÄený deň v týždni" msgid "Compare" msgstr "porovnaÅ¥" msgid "Select blacklists" msgstr "VybraÅ¥ Äiernu listinu" msgid "Values for EPG category" msgstr "Hodnota pre EPG kategóriu" msgid "Button$Apply" msgstr "PoužiÅ¥" msgid "less" msgstr "menej" msgid "less or equal" msgstr "menej alebo rovnako" msgid "greater" msgstr "viacej" msgid "greater or equal" msgstr "VäÄší alebo rovný" msgid "equal" msgstr "rovnaký" msgid "not equal" msgstr "nerovná sa" msgid "Activation of search timer" msgstr "Aktivácia vyhľadávania plánu" msgid "First day" msgstr "Prvý deň" msgid "Last day" msgstr "Posledný deň" msgid "Button$all channels" msgstr "vÅ¡etky kanály" msgid "Button$only FTA" msgstr "iba voľne šíriteľné" msgid "Button$Timer preview" msgstr "Náhľad plánu" msgid "Blacklist results" msgstr "výsledky Äierneho zoznamu" msgid "found recordings" msgstr "nájdené nahrávky" msgid "Error while accessing recording!" msgstr "Chyba prístupu k záznamom!" msgid "Button$Default" msgstr "Predvolené" msgid "Edit$Delete template?" msgstr "VymazaÅ¥ Å¡ablónu?" msgid "Overwrite existing entries?" msgstr "PrepísaÅ¥ existujúce údaje?" msgid "Edit entry" msgstr "UpraviÅ¥ údaje" #, fuzzy msgid "Switch" msgstr "Prepnúť iba" msgid "Announce only" msgstr "Iba oznámiÅ¥" #, fuzzy msgid "Announce ... minutes before start" msgstr "Prepnúť ... minút pred Å¡tartom" msgid "action at" msgstr "za akciou" msgid "Switch list" msgstr "Prepnúť zoznam" msgid "Edit template" msgstr "UpraviÅ¥ Å¡ablóny" msgid "Timers" msgstr "Plány" msgid ">>> no info! <<<" msgstr ">>> žiadne informácie! <<<" msgid "Overview" msgstr "Prehľad" msgid "Button$Favorites" msgstr "Obľúbené" msgid "Quick search for broadcasts" msgstr "Rýchle vyhľadávanie vo vysielaní" msgid "Quick search" msgstr "Rýchle hľadanie" msgid "Show in main menu" msgstr "ZobraziÅ¥ v hlavnom menu" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "%d nové vysielanie(a) nájdené! ZobraziÅ¥ ich?" msgid "Search timer update done!" msgstr "Aktualizácia vyhľadávania plánov skonÄená!" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "Chyba programovania plánovaÄa" #~ msgid "in %02ldd" #~ msgstr "v %02ldd" #~ msgid "in %02ldh" #~ msgstr "v %02ldh" #~ msgid "in %02ldm" #~ msgstr "v %02ldm" #, fuzzy #~ msgid "Compare expression" #~ msgstr "bežný výraz" #~ msgid "File" #~ msgstr "Súbor" #~ msgid "Day" #~ msgstr "Deň" vdr-plugin-epgsearch/po/hu_HU.po0000644000175000017500000005663112466747543016453 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Istvan Koenigsberger , 2002 # Guido Josten , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Istvan Koenigsberger , Guido Josten \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Beállítások" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " aábcdeéfghiíjklmnoóöőpqrstuúüűvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" msgid "Button$Orphaned" msgstr "" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Felvenni" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/lt_LT.po0000644000175000017500000012042412466747543016451 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Valdemaras Pipiras , 2009 # msgid "" msgstr "" "Project-Id-Version: VDR 1.7.10\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Valdemaras Pipiras \n" "Language-Team: Lithuanian \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "kanalo grupÄ—s" msgid "Button$Select" msgstr "Pasirinkti" msgid "Channel group used by:" msgstr "Kanalo grupÄ— naudojama:" msgid "Edit$Delete group?" msgstr "IÅ¡trinti grupÄ™?" msgid "Edit channel group" msgstr "Koreguoti kanalo grupÄ™" msgid "Group name" msgstr "GrupÄ—s pavadinimas" msgid "Button$Invert selection" msgstr "AtvirkÅ¡tinis pasirinkimas" msgid "Button$All yes" msgstr "Visi taip" msgid "Button$All no" msgstr "Visi ne" msgid "Group name is empty!" msgstr "GrupÄ—s pavadinimas tuÅ¡Äias!" msgid "Group name already exists!" msgstr "Toks grupÄ—s pavadinimas jau yra!" msgid "Direct access to epgsearch's conflict check menu" msgstr "Tiesioginis priÄ—jimas prie epgsearch įskiepo konflikto pasirinkimo meniu" msgid "Timer conflicts" msgstr "LaikmaÄio konfliktai" msgid "Conflict info in main menu" msgstr "KOnflikto informacija pagrindiniame meniu" msgid "next" msgstr "sekantis" #, c-format msgid "timer conflict at %s! Show it?" msgstr "LaikmaÄio konflikas %s! Rodyti?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "%d kaikmaÄio konfliktas(ų)! Pirmasis %s. Rodyti juos?" msgid "search the EPG for repeats and more" msgstr "paieÅ¡ka po EPG ieÅ¡kant pasikartojimų ir kt." msgid "Program guide" msgstr "Programos gidas" msgid "search timer update running" msgstr "vyksta laikmaÄio paieÅ¡kos atnaujinimas" msgid "Direct access to epgsearch's search menu" msgstr "Tiesioginis priÄ—jimas prie epgsearch įskiepo paieÅ¡kos meniu" msgid "Search" msgstr "PaiÅ¡ka" msgid "EpgSearch-Search in main menu" msgstr "IeÅ¡koti pagrindiniame meniu" msgid "Button$Help" msgstr "Pagalba" msgid "Standard" msgstr "Standartas" msgid "Button$Commands" msgstr "Komandos" msgid "Button$Search" msgstr "PaieÅ¡ka" msgid "never" msgstr "niekada" msgid "always" msgstr "visada" msgid "smart" msgstr "protingas" msgid "before user-def. times" msgstr "prieÅ¡ vartotojo nustatytus laikus" msgid "after user-def. times" msgstr "po vartotojo nustatytų laikų" msgid "before 'next'" msgstr "prieÅ¡ 'Sekantis'" msgid "General" msgstr "Pagrindinis" msgid "EPG menus" msgstr "EPG meniu" msgid "User-defined EPG times" msgstr "Vartotojo nustatyti EPG laikai" msgid "Timer programming" msgstr "LaikmaÄio nustatymai" msgid "Search and search timers" msgstr "PaieÅ¡ka ir paieÅ¡kos laikmaÄiai" msgid "Timer conflict checking" msgstr "IeÅ¡koma laikmaÄių konfliktų" msgid "Email notification" msgstr "El. paÅ¡to perspÄ—jimas" msgid "Hide main menu entry" msgstr "PaslÄ—pti pagrindinio meniu antraÅ¡tÄ™" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Paslepia pagrindinio meniu antraÅ¡tÄ™ bei gali bÅ«ti naudingas jei Å¡is įskiepas naudojamas kaip pakaita įprastai naudojamai 'Programa' antraÅ¡tei." msgid "Main menu entry" msgstr "Pagrindinio meniu įraÅ¡as" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "Pagrindinio meniu antraÅ¡tÄ—s pavadinimas, kuris standartiÅ¡kai skamba kaip 'Programm guide'." msgid "Replace original schedule" msgstr "PakeiÄia įprastai naudojamÄ… programÄ…" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "Kai VDR yra įskiepytas kad leistų pakeisti įprastai naudojamÄ… 'Programa' antraÅ¡tÄ™, Å¡iuo įšraÅ¡u galit įjungti/iÅ¡jungti tokį pakeitimÄ…." msgid "Start menu" msgstr "Pradinis meniu" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "Pasirinkit tarp 'Kas rodoma dabar' ir 'Programa' kaip pradinÄ™ antraÅ¡tÄ™ Å¡io įskiepo paleidimui." msgid "Ok key" msgstr "Ok mygtukas" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" "ÄŒia nustatykite 'Ok' mygtuko elgsenÄ…. JÅ«s galite naudoti jį apraÅ¡ymo parodymui arba esamo kanalo perjungimui.\n" "TurÄ—kite omenyje: 'mÄ—lyno' mygtuko funkcionalumas (Perjungimas/Informacija/PaieÅ¡ka) tiesiogiai priklauso nuo Å¡io parametro." msgid "Red key" msgstr "Raudonas mygtukas" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" "Pasirinkite kokiÄ… pagrindinÄ™ funkcijÄ… ('Ä®raÅ¡inÄ—jimas' ar 'Komandos') turÄ—tų atlikinÄ—ti raudonas mygtukas.\n" "(Gali bÅ«ti sukeista naudojant '0' mygtukÄ…)" msgid "Blue key" msgstr "MÄ—lynas mygtukas" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" "Pasirinkite kokiÄ… pagrindinÄ™ funkcijÄ… ('Perjungimas/Informacija' ar 'PaieÅ¡ka') turÄ—tų atlikinÄ—ti mÄ—lynas mygtukas.\n" "(Pakeiskit spausdami '0')" msgid "Show progress in 'Now'" msgstr "Rodyti praeitÄ… laikÄ… nuo einamos programos pradžios arba kitaip progresÄ… 'Dabar' skiltyje" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "Rodo progreso juostÄ… 'Kas rodoma dabar' dalyje, kas suteikia daugiau informacijos apie tai kiek laiko laida dar tÄ™sis." msgid "Show channel numbers" msgstr "Rodyti kanalų numerius" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" "Rodyti kanalų numerius 'Kas rodoma dabar' dalyje.\n" "\n" "(Kad visiÅ¡kai pakeistumÄ—t savo meniu iÅ¡vaizdÄ…, skaitykit manualÄ…)" msgid "Show channel separators" msgstr "Rodyti kanalų skirtukus" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "Rodyti VDR kanalų grupes kaip skirtukus tarp kanalų 'Kas rodoma dabar' dalyje." msgid "Show day separators" msgstr "Rodyti dienų skirtukus" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "Rodyti skiriamÄ…jÄ… linijÄ… tarp dienų 'Programa' dalyje." msgid "Show radio channels" msgstr "Rodyti radijo kanalus" msgid "Help$Show also radio channels." msgstr "Taip pat rodyti radijo kanalus." msgid "Limit channels from 1 to" msgstr "Riboti kanalus nuo Ä… iki" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "Jei turite didelį skaiÄių kanalų ir norite pagreitinti sistemos darbÄ…, tada reikÄ—tų riboti rodomų kanalų skaiÄių. Spauskit '0' mygtukÄ… kad athungtumÄ—t šį parametrÄ…." msgid "'One press' timer creation" msgstr "'Vienu paspaudimu' laikmaÄio sukÅ«rimas" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "Kai laikmatis sukuriamas iÅ¡ 'Ä®raÅ¡yti' dalies, galima pasirinkti tarp greito laikmaÄio sukÅ«rimo arba sukÅ«rimo pasirinkimo per laikmaÄio meniu." msgid "Show channels without EPG" msgstr "Rodyti kanalus be EPG" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "ÄŒia pasirinkit 'taip' jei norite rodyti kanalus be EPG 'Kas rodoma dabar' dalyje. SpustelÄ—jus 'Ok' ant įrašų perjungs kanalÄ…." msgid "Time interval for FRew/FFwd [min]" msgstr "Laiko intervalas FRew/FFwd [min]" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" "ÄŒia pasirinkite laiko intervalÄ… kuris bus naudojamas perÅ¡okant per EPG įraÅ¡us, spaudžiant FRew/FFwd mygtukus.\n" "\n" "\n" "(Jei tokių mygtukų jÅ«sÅ« distancinio valdymo pultas neturi, galite keisti parametro vertes paspaudÄ™ '0' bei spustelÄ—jÄ™ ant pasirodžiusių '<<' bei '>>' su žaliu bei geltonu mygtukais)" msgid "Toggle Green/Yellow" msgstr "Sukeisti ŽaliÄ…/GeltonÄ…" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "Norodyti ar žalias ir geltonas taip pat turÄ—tų bÅ«ti sukeiÄiami vietomis paspaudus '0'." msgid "Show favorites menu" msgstr "Rodyti mÄ—gstamiausių meniu" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" "MÄ—gstamiasių meniu gali rodyti jÅ«sų mÄ—gstamiasių transliacijų sÄ…rašą. Ä®galinkit Å¡iÄ… funkcijÄ…, jei norite papildomų meniu punktų be 'Dabar' ir 'Sekantis'\n" "Bet kokia vykdyta paieÅ¡ka gali bÅ«ti panaudota kaip dalis mÄ—gstamiasių sÄ…raÅ¡e. Tiesiog koreguodami paieÅ¡kos užklausÄ… turite įgalinti 'Naudokit mÄ—gstamiausiųjų meniu' parametrÄ…." msgid "for the next ... hours" msgstr "sekanÄiom ... valandom" msgid "Help$This value controls the timespan used to display your favorites." msgstr "Å is parametras nustato laiko " msgid "Use user-defined time" msgstr "Vartotojo nustatytas laikas" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "Be 'Dabar' bei 'Sekantis' mygtukų, EPG dar galite nurodyti iki keturių kitų laikų, kurie gali bÅ«ti naudojami spaudinÄ—jant žaliÄ… mygtukÄ…." msgid "Description" msgstr "ApraÅ¡ymas" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "Tai vartotojo sukurto laiko apraÅ¡ymas, kuris matysis kaip pavadinimas ant žalio mygtuko." msgid "Time" msgstr "Laikas" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "Nurodykit laikÄ… Å¡itokiu formatu 'HH:MM'." msgid "Use VDR's timer edit menu" msgstr "Naudoti VDR'o laikmaÄio meniu" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" "Å is įskiepas turi savo laikmaÄio meniu, iÅ¡pleÄiantį orginalų meniu papildomom funkcijom, tokiom kaip\n" "\n" "- papildomo katalogo įvestis\n" "- vartotojo užsiduotos savaitÄ—s dienos, laikmaÄių pakartojimams\n" "- laidos serijos pavadinimo uždÄ—jimo galimybÄ—\n" "- EPG kintamųjų palaikymas (daugiau informacijos Manuale)" msgid "Default recording dir" msgstr "Numatytasis įrašų katalogas" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "Kuriant laikmatį, Äia galima nurodyti numatytÄ…jį katalogÄ… įraÅ¡ams." msgid "Add episode to manual timers" msgstr "PridÄ—ti epizodÄ… nustatytasiems laikmaÄiams" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" "Jei kuriate laikmatį serijalui, galite tuo paÄiu pridÄ—ti tos serijos pavadinimÄ….\n" "\n" "- niekada: nereikia pridÄ—ti\n" "- visada: visada pridÄ—ti serijos pavadinimÄ…, jei toks yra\n" "- protingai: pridÄ—ti tik tada kai laida tÄ™siasi mažiau nei 80 minuÄių." msgid "Default timer check method" msgstr "Numatytasis bÅ«das laikmaÄio patikrai" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" "Rankiniu bÅ«du nustatyti laikmaÄiai gali bÅ«ti pertikrinami ar nebuvo EPG pasikeitimų. ÄŒia kiekvienam kanalui galite nustatyti numatytÄ…jį patikros bÅ«dÄ…. Pasirinkite iÅ¡\n" "\n" "- netikrinti\n" "- pagal laidos id: tikrina pagal laidos id, kurį pateikia kanalo operatorius.\n" "- pagal kanalÄ… ir laikÄ…: tikrina ar sutampa trukmÄ—." msgid "Button$Setup" msgstr "Nustatymai" msgid "Use search timers" msgstr "Naudoti paieÅ¡kos laikmaÄius" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "'PaieÅ¡kos laikmaÄiai' gali bÅ«ti naudojami automatiÅ¡kam laidų, kurios atitiko paieÅ¡kos kriterijus, laikmaÄių sukÅ«rimui." msgid " Update interval [min]" msgstr " Atnaujinimų intervalas [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "ÄŒia nurodyti laiko intervalÄ… tarp vykdomos laidų pasikeitimų paieÅ¡kos." msgid " SVDRP port" msgstr " SVDRP portas" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "Naujų laikmaÄių kÅ«rimas bei laikmaÄių pasikeitimai į sistemÄ… įraÅ¡omi naudojant SVDRP servisÄ…. Numatytoji reikÅ¡mÄ— daugumoj atvejų turÄ—tų tikti, taigi keiskite šį parametrÄ… tik tada kai suprantate kÄ… darote." msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "ÄŒia nurodyti Å¡iuo įskiepu sukurtÄ… numatytÄ…jį laikmaÄių eiliÅ¡kumÄ…. Å is parametras taip pat gali bÅ«ti nustatytas kiekvienai paieÅ¡kai atskirai." msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "ÄŒia nurodyti Å¡iuo įskiepu sukurtÄ… numatytÄ…jį laikmaÄio/įraÅ¡o galiojimo laikÄ…. Å is parametras taip pat gali bÅ«ti nustatytas kiekvienai paieÅ¡kai atskirai." msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "ÄŒia nurodyti Å¡iuo įskiepu sukurtÄ… numatytÄ…jį laikmaÄio/įraÅ¡o pradžios uždelsimo laikÄ… nuo įraÅ¡ymo pradžios. Å is parametras taip pat gali bÅ«ti nustatytas kiekvienai paieÅ¡kai atskirai." msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "ÄŒia nurodyti Å¡iuo įskiepu sukurtÄ… numatytÄ…jį laikmaÄio/įraÅ¡o pabaigos uždelsimo laikÄ… po įraÅ¡ymo pabaigos. Å is parametras taip pat gali bÅ«ti nustatytas kiekvienai paieÅ¡kai atskirai." msgid "No announcements when replaying" msgstr "Nerodyti pranÅ¡imų pakartojimo metu" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "Nustatykite 'taip' jei nenorite gauti jokių transliuotojo praneÅ¡imų, tuo atveju jei Å¡iuo metu žiÅ«rite pakartojimÄ…." msgid "Recreate timers after deletion" msgstr "Atkurti laikmaÄius po iÅ¡trynimo" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "Nustatykite 'taip' jei norite kad laikmaÄiai galÄ—tų bÅ«ti atkurti po iÅ¡trynimo dar kartÄ… panaudojus laikmaÄio paieÅ¡kÄ…." msgid "Check if EPG exists for ... [h]" msgstr "" #, fuzzy msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "Nustatyti 'taip' jei konflikto paieÅ¡ka turÄ—tų bÅ«ti vykdoma po kiekvieno paieÅ¡kos laikmaÄio atnaujinimo." #, fuzzy msgid "Warn by OSD" msgstr "PerspÄ—ti per ekrano užsklandÄ…" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "Nustatyti 'taip' jei norite gauti praneÅ¡imus el. paÅ¡tu apie laikmaÄio konfliktus." #, fuzzy msgid "Warn by mail" msgstr "PerspÄ—ti per emailÄ…" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "Nustatyti 'taip' jei el.paÅ¡to siuntimui reikia autentifikacijos." #, fuzzy msgid "Channel group to check" msgstr "Kanalo grupÄ—" #, fuzzy msgid "Help$Specify the channel group to check." msgstr "Nurodyti Å¡ablono pavadinimÄ…." msgid "Ignore PayTV channels" msgstr "Ignoruoti Mokamus kanalus" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "Nustatykite 'taip' jei nenorite matyti mokamų kanalų laidų kai ieÅ¡kote pakartojimų." msgid "Search templates" msgstr "PaieÅ¡kos Å¡ablonai" msgid "Help$Here you can setup templates for your searches." msgstr "ÄŒia galite nustatyti paieÅ¡kos Å¡ablonus savo paieÅ¡koms." msgid "Blacklists" msgstr "Juodieji sÄ…raÅ¡ai" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "ÄŒia galite nustatyti juoduosius sÄ…raÅ¡us, kad poto neroddyti laidų kurios jums nepatinka." msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "ÄŒia galite nuststyti kanalo grupes, kurios gali bÅ«ti naudojamos paieÅ¡kos metu. Jos skiriasi nuo VDR kanalų grupių." msgid "Ignore below priority" msgstr "Ignoruoti žemesnį prioritetÄ…" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Jei 'nusimuÅ¡' laikmatis, kurio prioritetas žemesnis nei duotoji reikÅ¡mÄ—, tai nebus laikoma kaip svarbus faktas. Po automatinÄ—s konfliktų paieÅ¡kos, informacija ekrane pateikiama tik apie svarbius konflikatus." msgid "Ignore conflict duration less ... min." msgstr "Ignoruoti konfliktiÅ¡kus laidų įraÅ¡us, kurių trukmÄ— mažesnÄ— nei ... min." msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Jei konflikto trukmÄ— bus mažesnÄ— nei duotas minuÄių skaiÄius, tai nebus laikoma kaip svarbus faktas. Po automatinÄ—s konfliktų paieÅ¡kos, informacija ekrane pateikiama tik apie svarbius konflikatus." msgid "Only check within next ... days" msgstr "Tikrinti tik kas ... dienas" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "pagal šį parametrÄ… Nustatomas konflikto paieÅ¡kos periodiÅ¡kumas dienomis. Visi kiti konfliktai laikomi kaip 'dar ne svarbÅ«s'." msgid "--- Automatic checking ---" msgstr "--- AutomatinÄ— paieÅ¡ka ---" msgid "After each timer programming" msgstr "Po kiekvieno laikmaÄio nustatymo" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "Nustatyti 'taip', jei konflikto paieÅ¡ka turÄ—tų bÅ«ti atliekama po kiekvieno rankiniu bÅ«du atlikto laikmaÄio nustatymo. Jei konfliktas aptiktas, jums apie tai ekrane iÅ¡vedama žinutÄ—. ŽinutÄ— rodoma jei laikmatis sukuria kažkokį konfliktÄ…." msgid "When a recording starts" msgstr "Kai įraÅ¡as prasideda" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "Nustatyti 'taip' jei konfliktų paieÅ¡ka turÄ—tų bÅ«ti atliekama kai įraÅ¡ymas prasideda. Jei konfliktas aptiktas, jums apie tai ekrane iÅ¡vedama žinutÄ—. ŽinutÄ— rodoma jei konfliktas vyksta vyksta per artimiausias vdi valandas." msgid "After each search timer update" msgstr "Po kiekvieno paieÅ¡kos laikmaÄio atnaujinimo" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "Nustatyti 'taip' jei konflikto paieÅ¡ka turÄ—tų bÅ«ti vykdoma po kiekvieno paieÅ¡kos laikmaÄio atnaujinimo." msgid "every ... minutes" msgstr "kas ... minutes" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" "ÄŒia nurodyti automatinių konfliktų paieÅ¡kų laiko inetrvalÄ…\n" "('0' iÅ¡jungia automatinÄ™ patikrÄ…)" msgid "if conflicts within next ... minutes" msgstr "jei konfliktai kyla per ... minutes" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "Jei sekantis konfliktas įvyks per duotÄ… minuÄių skaiÄių ir norite daugiau informacijos ekrane apie tai, galite nurodyti trumpesnį patikros intervalÄ…." msgid "Avoid notification when replaying" msgstr "Nerodyti perspÄ—jimų kai kartojama" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "Nustatyti 'taip' jei nenorite matyti žinuÄių ekrane apie konflikus, kai žiÅ«rite pakartojimÄ…. Kitu atveju žinutÄ—s bus rodomos jei konfliktas vyksta vyksta per artimiausias vdi valandas" msgid "Search timer notification" msgstr "PaieÅ¡kos laikmaÄio perspÄ—jimai" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "Nustatyti 'taip' jei norite perspÄ—jimÄ… apie paieÅ¡kos laikmaÄius gauti el. paÅ¡tu" msgid "Time between mails [h]" msgstr "Laikas tarp el. laiÅ¡kų iÅ¡siuntimų [h]" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" "Nurodykit kiek laiko [h]\n" "turÄ—tų minimaliai praeiti tarp dviejų el. laiÅ¡kų siuntimų.\n" "Su '0' mygtuko nuspaudimu gausit el. paÅ¡tÄ… po kiekvieno\n" "paieÅ¡kos laikmaÄio atsinaujinimo naujais rezultatais." msgid "Timer conflict notification" msgstr "LaikmaÄio konflikto perspÄ—jimas" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "Nustatyti 'taip' jei norite gauti praneÅ¡imus el. paÅ¡tu apie laikmaÄio konfliktus." msgid "Send to" msgstr "SiÅ«sti" msgid "Help$Specify the email address where notifications should be sent to." msgstr "Nurodykite el. paÅ¡to adresÄ… kuriuo turÄ—tų bÅ«ti siunÄiami perspÄ—jimai." msgid "Mail method" msgstr "El. paÅ¡tas" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" "ÄŒia nustatykite el. paÅ¡to siuntimo bÅ«dÄ…\n" " - 'sendmail': reikia tinkamai sukonfigÅ«ruoti el. paÅ¡to sistemÄ…\n" " - 'SendEmail.pl': paprastas paÅ¡to siuntimo skriptas" msgid "--- Email account ---" msgstr "--- El. paÅ¡to sÄ…skaita ---" msgid "Email address" msgstr "El. paÅ¡to adresas" msgid "Help$Specify the email address where notifications should be sent from." msgstr "Nurodyti el. paÅ¡to adresÄ… iÅ¡ kurio turÄ—tų bÅ«ti siunÄiami praneÅ¡imai." msgid "SMTP server" msgstr "SMTP serveris" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "\":port\" ." msgid "Use SMTP authentication" msgstr "Naudoti SMTP autentifikacijÄ…" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "Nustatyti 'taip' jei el.paÅ¡to siuntimui reikia autentifikacijos." msgid "Auth user" msgstr "Vartotojo vardas" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "Nurodykit vartotojo vardÄ…, jei reikalinga SMTP autentifikacija." msgid "Auth password" msgstr "Slapyvardis" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "Nurodyki slapyvardį, jei reikalinga SMTP autentifikacija." msgid "Mail account check failed!" msgstr "PaÅ¡to prisijungimo patikra!" msgid "Button$Test" msgstr "Testas" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " aÄ…bcÄdeęėfghiįjklmnopqrsÅ¡tuųūvzž0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgid "Start/Stop time has changed" msgstr "PasikeitÄ— pradžios/pabaigos laikas" msgid "Title/episode has changed" msgstr "PasikeitÄ— pavadinimas/epizodas" msgid "No new timers were added." msgstr "NepridÄ—tas nÄ— vienas laikmatis." msgid "No timers were modified." msgstr "NÄ— vienas laikmatis nebuvo pakeistas." msgid "No timers were deleted." msgstr "NÄ— vienas laikmatis nebuvo iÅ¡trintas." msgid "No new events to announce." msgstr "NÄ—ra apie kÄ… trimituoti." msgid "This version of EPGSearch does not support this service!" msgstr "Å i EPGSarch įskiepo versija nepalaiko Å¡ios funkcijos!" msgid "EPGSearch does not exist!" msgstr "Nerastas EPGSerach įskiepas!" #, c-format msgid "%d new broadcast" msgstr "%d naujas(-i) transliuotojas(-ai)" msgid "Button$by channel" msgstr "pagal kanalÄ…" msgid "Button$by time" msgstr "pagal laikÄ…" msgid "Button$Episode" msgstr "Epizodas" msgid "Button$Title" msgstr "Pavadinimas" msgid "announce details" msgstr "praneÅ¡imo detalÄ—s" msgid "announce again" msgstr "praneÅ¡ti dar kartÄ…" msgid "with next update" msgstr "su sekanÄiu atnaujinimu" msgid "again from" msgstr "dar kartÄ… iÅ¡" msgid "Search timer" msgstr "PaieÅ¡kos laikmatis" msgid "Edit blacklist" msgstr "Koreguoti juoduosius sÄ…raÅ¡us" msgid "phrase" msgstr "frazÄ—" msgid "all words" msgstr "visi žodžiai" msgid "at least one word" msgstr "bent vienas žodis" msgid "match exactly" msgstr "tikslus atitikmuo" msgid "regular expression" msgstr "reguliari iÅ¡raiÅ¡ka" msgid "fuzzy" msgstr "neapibrėžtai" msgid "user-defined" msgstr "vartotojo numastatytas" msgid "interval" msgstr "intervalas" msgid "channel group" msgstr "kanalo grupÄ—" msgid "only FTA" msgstr "tik nekoduoti" msgid "Search term" msgstr "PaiÅ¡kos frazÄ—" msgid "Search mode" msgstr "PaieÅ¡kos bÅ«das" msgid "Tolerance" msgstr "Tolerancija" msgid "Match case" msgstr "Atitikti" msgid "Use title" msgstr "Rodyti pavadinimÄ…" msgid "Use subtitle" msgstr "Rodyti aprašą" msgid "Use description" msgstr "Rodyti apraÅ¡ymÄ…" msgid "Use extended EPG info" msgstr "Rodyti EPG informacijÄ…" msgid "Ignore missing categories" msgstr "Ignoruoti trÅ«kstamas kategorijas" msgid "Use channel" msgstr "Naudoti kanalÄ…" msgid " from channel" msgstr " nuo kanalo" msgid " to channel" msgstr " iki kanalo" msgid "Channel group" msgstr "Kanalo grupÄ—" msgid "Use time" msgstr "Naudoti laikÄ…" msgid " Start after" msgstr " pradÄ—ti po" msgid " Start before" msgstr " pradÄ—ti prieÅ¡" msgid "Use duration" msgstr "Naudoti trukmÄ™" msgid " Min. duration" msgstr " Min. trukmÄ—" msgid " Max. duration" msgstr " Maks. trukmÄ—" msgid "Use day of week" msgstr "Naudoti savaitÄ—s dienÄ…" msgid "Day of week" msgstr "SavaitÄ—s diena" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "Å ablonai" msgid "*** Invalid Channel ***" msgstr "*** Klaidingas kanalas ***" msgid "Please check channel criteria!" msgstr "Patikrinkit kanalo kriterijų!" msgid "Edit$Delete blacklist?" msgstr "IÅ¡trinti juodajį sÄ…rašą?" msgid "Repeats" msgstr "Pakartojimai" msgid "Create search" msgstr "Sukurti paieÅ¡kÄ…" msgid "Search in recordings" msgstr "PaieÅ¡ka įraÅ¡uose" msgid "Mark as 'already recorded'?" msgstr "PažymÄ—ti kaip 'jau įraÅ¡yta'?" msgid "Add/Remove to/from switch list?" msgstr "Ä®traukti/IÅ¡imti į/iÅ¡ perjungimo sÄ…raÅ¡o?" msgid "Create blacklist" msgstr "Sukurti juodajį sÄ…rašą" msgid "EPG Commands" msgstr "EPG komandos" msgid "Already running!" msgstr "Jau groja!" msgid "Add to switch list?" msgstr "Ä®traukti į perjungimo sÄ…rašą?" msgid "Delete from switch list?" msgstr "IÅ¡trinti iÅ¡ perjungimo sÄ…raÅ¡o?" msgid "Button$Details" msgstr "DetalÄ—s" msgid "Button$Filter" msgstr "Filtras" msgid "Button$Show all" msgstr "Rodyti visus" msgid "conflicts" msgstr "konfliktai" msgid "no conflicts!" msgstr "nÄ—ra konfliktų!" msgid "no important conflicts!" msgstr "nÄ—ra svarbių konfliktų!" msgid "C" msgstr "K" msgid "Button$Repeats" msgstr "Pakartojimai" msgid "no check" msgstr "netikrinti" msgid "by channel and time" msgstr "pagal kanalÄ… ir laikÄ…" msgid "by event ID" msgstr "pagal įvykio ID" msgid "Select directory" msgstr "Pasirinkti katalogÄ…" msgid "Button$Level" msgstr "Lygis" msgid "Event" msgstr "Ä®vykis" msgid "Favorites" msgstr "MÄ—gstamiausi" msgid "Search results" msgstr "Rezultatų paieÅ¡ka" msgid "Timer conflict! Show?" msgstr "LaikmaÄio konflikas! Rodyti?" msgid "Directory" msgstr "Katalogas" msgid "Channel" msgstr "Kanalas" msgid "Childlock" msgstr "PaveldÄ—tojo užraktas" msgid "Timer check" msgstr "LaikmaÄio patikra" msgid "recording with device" msgstr "įraÅ¡inÄ—jimas su įrenginiu" msgid "Button$With subtitle" msgstr "Su subtitrais" msgid "Button$Without subtitle" msgstr "Be subtitrų" msgid "Button$Extended" msgstr "IÅ¡plÄ—stas" msgid "Button$Simple" msgstr "Paprastas" msgid "Use blacklists" msgstr "Naudoti juoduosius sÄ…raÅ¡us" msgid "Edit$Search text too short - use anyway?" msgstr "IeÅ¡komas tekstas per trumpas - vistiek naudoti?" #, fuzzy msgid "Button$Orphaned" msgstr "pagal kanalÄ…" msgid "Button$by name" msgstr "pagal pavadinimÄ…" msgid "Button$by date" msgstr "pagal datÄ…" msgid "Button$Delete all" msgstr "Trinti visus" msgid "Recordings" msgstr "Ä®raÅ¡ai" msgid "Edit$Delete entry?" msgstr "IÅ¡trinti įrašą?" msgid "Edit$Delete all entries?" msgstr "IÅ¡trinti visus įraÅ¡us?" msgid "Summary" msgstr "Santrauka" msgid "Auxiliary info" msgstr "Papildoma informacija" msgid "Button$Aux info" msgstr "Pap. informacija" msgid "Search actions" msgstr "Veiksmų paieÅ¡ka" msgid "Execute search" msgstr "Ä®vykdyti paieÅ¡kÄ…" msgid "Use as search timer on/off" msgstr "Naudoti paieÅ¡kos laikmaÄio įjungimui/iÅ¡jungimui" msgid "Trigger search timer update" msgstr "Ä®jungti paieÅ¡kos laikmaÄio atnaujinimÄ…" msgid "Show recordings done" msgstr "Rodyti padarytus įraÅ¡us" msgid "Show timers created" msgstr "Rodyti sukurtus laikmaÄius" msgid "Create a copy" msgstr "Sukurti kopijÄ…" msgid "Use as template" msgstr "Naudoti Å¡ablonÄ…" msgid "Show switch list" msgstr "Rodyti perjungimo sÄ…raÅ¡us" msgid "Show blacklists" msgstr "Rodyti juoduosius sÄ…raÅ¡us" msgid "Delete created timers?" msgstr "IÅ¡trinti sukurtus laikmaÄius?" msgid "Timer conflict check" msgstr "LaikmaÄio konflikto paieÅ¡ka" msgid "Disable associated timers too?" msgstr "Taip pat atjungti ir susijusius laikmaÄius?" msgid "Activate associated timers too?" msgstr "Taip pat aktyvuoti ir susijusius laikmaÄius?" msgid "Search timers activated in setup." msgstr "PaieÅ¡kos laikmaÄiai aktyvuoti." msgid "Run search timer update?" msgstr "Paleisti paieÅ¡kos laikmaÄio atnaujinimÄ…?" msgid "Copy this entry?" msgstr "Kopijuoti Å¡iÄ… įvestį?" msgid "Copy" msgstr "Kopijuoti" msgid "Copy this entry to templates?" msgstr "Koreguoti Å¡iÄ… įvestį į Å¡ablonÄ…?" msgid "Delete all timers created from this search?" msgstr "IÅ¡trinti visus Å¡ios paieÅ¡kos sukurtus laikmaÄius?" msgid "Button$Actions" msgstr "Veiksmai" msgid "Search entries" msgstr "Ä®rašų paieÅ¡ka" msgid "active" msgstr "aktyvus" msgid "Edit$Delete search?" msgstr "IÅ¡trinti paieÅ¡kÄ…?" msgid "Edit search" msgstr "Koreguoti paieÅ¡kÄ…" msgid "Record" msgstr "Ä®raÅ¡yti" msgid "Announce by OSD" msgstr "PerspÄ—ti per ekrano užsklandÄ…" msgid "Switch only" msgstr "Tik perjungti" msgid "Announce and switch" msgstr "PerspÄ—ti ir perjungti" msgid "Announce by mail" msgstr "PerspÄ—ti per emailÄ…" msgid "only globals" msgstr "" msgid "Selection" msgstr "Pasirinkimas" msgid "all" msgstr "visi" msgid "count recordings" msgstr "skaiÄiuoti įraÅ¡us" msgid "count days" msgstr "skaiÄiuoti dienas" msgid "if present" msgstr "jei yra" #, fuzzy msgid "same day" msgstr "PaskutinÄ— diena" #, fuzzy msgid "same week" msgstr "SavaitÄ—s diena" msgid "same month" msgstr "" msgid "Template name" msgstr "Å ablono pavadinimas" msgid "Help$Specify the name of the template." msgstr "Nurodyti Å¡ablono pavadinimÄ…." msgid "Help$Specify here the term to search for." msgstr "ÄŒia nurodykit ko ieÅ¡kote" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" "Galimi Å¡ie paieÅ¡kos metodai:\n" "\n" "- pagal frazÄ™\n" "- visi žodžiai: visi atskiri žodžiai turi atsispindÄ—ti rezultate\n" "- bent vienas žodis: turi bÅ«ti rastas bent vienas žodis\n" "- tiksli paieÅ¡ka\n" "- reguliarioji iÅ¡raiÅ¡ka: galima naudoti regexp sintaksÄ™\n" "- neapibrėžta paieÅ¡ka: ieÅ¡ko grubiai naudojant žodžių dalis" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "Tai duoda neapibrėžtÄ… paieÅ¡kÄ…. Å i reikÅ¡mÄ— nurodo galimų klaidų skaiÄių." msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "Pasirinkite 'Taip', jei norite kad paieÅ¡kos užklausoje paisytumÄ—t raidžių registro." msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "Pasirinkite 'Taip', jei paieÅ¡kÄ… norite vykdyti įvykio pavadinime." msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "Pasirinkite 'Taip', jei paieÅ¡kÄ… norite vykdyti vienoje iÅ¡ įvykio serijos dalių." msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "Pasirinkti 'Taip' jei norite ieÅ¡koti įvykio santraukoje." #, fuzzy msgid "Use content descriptor" msgstr "Rodyti apraÅ¡ymÄ…" #, fuzzy msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "Pasirinkite 'Taip', jei paieÅ¡kÄ… norite vykdyti įvykio pavadinime." msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "Ä®viokio santrauka gali turÄ—ti papildomos informacijos, tokios kaip 'Žanras', 'Kategorija', 'Metai', ... EPGSearch įskiepe vadinamos 'EPG kategorijomis'. IÅ¡oriniai EPG tiekÄ—jai daÅ¡nai pateikia Å¡itÄ… informacijÄ…. Tai leidžia pagražinti paieÅ¡kÄ… ir įvesti kitus gražius dalykÄ—lius, tokius kaip 'dienos frazÄ—'. Kad tai panaudotumÄ—t, pasirinkite 'Taip'" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "Failas epgsearchcats.conf nusako Å¡io įraÅ¡o paieÅ¡kos bÅ«dÄ…, paieÅ¡ka gali bÅ«ti daroma tiek įvedant tiek pasirenkant reikÅ¡mÄ™. JÅ«s taip pat galite koreguoti jau egzistuojantį reikÅ¡mių sÄ…rašą esantį Å¡iame faile." msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "Jei pasirinkta kategorija nÄ—ra įvykio santraukos dalis, tai paprastai neįtraukia įvykio į paieÅ¡kos rezultatus. Kad to iÅ¡vengtumÄ—te, pasirinkite 'Taip', bet darykite tai apgalvotai, nes kitu atveju galite gauti didžiulį skaiÄių rezultatų." msgid "Use in favorites menu" msgstr "Naudoti mÄ—giamiausiųjų sÄ…raÅ¡e." msgid "Result menu layout" msgstr "Rezultatų meniu iÅ¡vaizda" msgid "Use as search timer" msgstr "Naudoti kaip paieÅ¡kos laikmatį" msgid "Action" msgstr "Veiksmas" msgid "Switch ... minutes before start" msgstr "Perjungti likus ... minuÄių iki pradžios" msgid "Unmute sound" msgstr "Ä®jungti garsÄ…" msgid "Ask ... minutes before start" msgstr "Klausti ... minuÄių iki prieÅ¡ pradžios" msgid " Series recording" msgstr " serijų įraÅ¡ai" msgid "Delete recordings after ... days" msgstr "IÅ¡trinti įraÅ¡us po ... dienų" msgid "Keep ... recordings" msgstr "Laikyti ... įraÅ¡us" msgid "Pause when ... recordings exist" msgstr "pristapdyti kai pasiekia ... įrašų ribÄ…." msgid "Avoid repeats" msgstr "IÅ¡vengti pakartojimų" msgid "Allowed repeats" msgstr "Leisti pakartojimus" msgid "Only repeats within ... days" msgstr "Kartoji tik kas ... dienas" msgid "Compare title" msgstr "Palyginti pavadinimÄ…" msgid "Compare subtitle" msgstr "Palyginti aprašą" msgid "Compare summary" msgstr "Palyginti santraukÄ…" #, fuzzy msgid "Min. match in %" msgstr " Min. trukmÄ—" #, fuzzy msgid "Compare date" msgstr "Palyginti pavadinimÄ…" msgid "Compare categories" msgstr "Palyginti kategorijas" msgid "VPS" msgstr "VPS" msgid "Auto delete" msgstr "IÅ¡trunti automatiÅ¡kai" msgid "after ... recordings" msgstr "po ... įrašų" msgid "after ... days after first rec." msgstr "po ... dienų po įraÅ¡ymo" msgid "Edit user-defined days of week" msgstr "Koreguoti vartotojo pasirinktas savaitÄ—s dienas" msgid "Compare" msgstr "Palyginti" msgid "Select blacklists" msgstr "Pasirinkti juoduosius sÄ…raÅ¡us" msgid "Values for EPG category" msgstr "EPG kategorijos vertÄ—s" msgid "Button$Apply" msgstr "Patvirtinti" msgid "less" msgstr "mažiau" msgid "less or equal" msgstr "mažiau arba lygu" msgid "greater" msgstr "daugiau" msgid "greater or equal" msgstr "daugiau arba lygu" msgid "equal" msgstr "lygu" msgid "not equal" msgstr "nelygu" msgid "Activation of search timer" msgstr "PaieÅ¡kos laikmaÄio aktyvavimas" msgid "First day" msgstr "Pirma diena" msgid "Last day" msgstr "PaskutinÄ— diena" msgid "Button$all channels" msgstr "visi kanalai" msgid "Button$only FTA" msgstr "tik nekoduoti" msgid "Button$Timer preview" msgstr "LaikmaÄio peržiÅ«ra." msgid "Blacklist results" msgstr "Rezultatai iÅ¡ juodųjų sÄ…rašų" msgid "found recordings" msgstr "rasti įraÅ¡ai" msgid "Error while accessing recording!" msgstr "Klaida bandant paleisti įrašą!" msgid "Button$Default" msgstr "Numatytasis" msgid "Edit$Delete template?" msgstr "IÅ¡trinti Å¡ablonÄ…?" msgid "Overwrite existing entries?" msgstr "PerraÅ¡yti esamus įraÅ¡us?" msgid "Edit entry" msgstr "Koreguoti įrašą" msgid "Switch" msgstr "Pereiti" msgid "Announce only" msgstr "Tik praneÅ¡ti" msgid "Announce ... minutes before start" msgstr "PraneÅ¡ti ... minuÄių prieÅ¡ prasidedant" msgid "action at" msgstr "veiksmas" msgid "Switch list" msgstr "Sukeisti sÄ…raÅ¡us" msgid "Edit template" msgstr "Koreguoti Å¡ablonÄ…" msgid "Timers" msgstr "LaikmaÄiai" msgid ">>> no info! <<<" msgstr ">>> nÄ—ra informacijos! <<<" msgid "Overview" msgstr "Peržūra" msgid "Button$Favorites" msgstr "MÄ—giamiausi" msgid "Quick search for broadcasts" msgstr "Greita transliacijų paieÅ¡ka" msgid "Quick search" msgstr "Greita paieÅ¡ka" msgid "Show in main menu" msgstr "Rodyti pagriundiniame meniu" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "Rasta %d naujas(ų) transliuotojas(ų)! Parodyti juos?" msgid "Search timer update done!" msgstr "LaikmaÄio atnaujinimo paieÅ¡ka baigta sÄ—kmingai!" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "Pereiti į (%d) '%s'?" msgid "Programming timer failed!" msgstr "Nustatyti laikmaÄio nepavyko!" #~ msgid "in %02ldd" #~ msgstr "per %02ldd" #~ msgid "in %02ldh" #~ msgstr "per %02ldh" #~ msgid "in %02ldm" #~ msgstr "per %02ldm" #, fuzzy #~ msgid "Compare expression" #~ msgstr "reguliari iÅ¡raiÅ¡ka" vdr-plugin-epgsearch/po/fr_FR.po0000644000175000017500000011506012466747543016431 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Jean-Claude Repetto , 2001 # Olivier Jacques , 2003 # Gregoire Favre , 2003 # Nicolas Huillard , 2005 , 2007 # Patrice Staudt , 2008 msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2008-04-30 08:36+0200\n" "Last-Translator: Patrice Staudt \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "Groupe de chaînes" msgid "Button$Select" msgstr "Selection" msgid "Channel group used by:" msgstr "Groupe est utilisé par:" msgid "Edit$Delete group?" msgstr "Effacer groupe $Delete?" msgid "Edit channel group" msgstr "Editer groupe de chaînes" msgid "Group name" msgstr "Nom de groupe" msgid "Button$Invert selection" msgstr "Inversion de la selection" msgid "Button$All yes" msgstr "Tous oui" msgid "Button$All no" msgstr "Tous non" msgid "Group name is empty!" msgstr "Le nom est vide" msgid "Group name already exists!" msgstr "Le groupe existe déjà!" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "Conflits de programmation" msgid "Conflict info in main menu" msgstr "Conflits infos dans le menu principale" msgid "next" msgstr "prochain" #, c-format msgid "timer conflict at %s! Show it?" msgstr "conflit de programmation le %s! Afficher?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "%d de conflits de programmation! Le premier le %s. Afficher?" msgid "search the EPG for repeats and more" msgstr "Recherche de répétition dans EPG" msgid "Program guide" msgstr "Guide du programme" #, fuzzy msgid "search timer update running" msgstr "La mise à jours de recherche est effectuée!" msgid "Direct access to epgsearch's search menu" msgstr "Accès direct dans epgsearch dans le menu recherche" msgid "Search" msgstr "Recherche" msgid "EpgSearch-Search in main menu" msgstr "EpgSearch-Recherche dans le menu proncipale" msgid "Button$Help" msgstr "Aide" msgid "Standard" msgstr "Standart" msgid "Button$Commands" msgstr "Commandes" msgid "Button$Search" msgstr "Recherche" msgid "never" msgstr "jamais" msgid "always" msgstr "toujours" msgid "smart" msgstr "intelligent" msgid "before user-def. times" msgstr "avant le temp utilisateur" msgid "after user-def. times" msgstr "après le temp utilisateur" msgid "before 'next'" msgstr "avant 'le prochain'" msgid "General" msgstr "Général" msgid "EPG menus" msgstr "Menu EPG" msgid "User-defined EPG times" msgstr "Date utilisateur pour la progammation" msgid "Timer programming" msgstr "Programmation" msgid "Search and search timers" msgstr "Recherche et progammation de recherche" msgid "Timer conflict checking" msgstr "Vérification-Conflits-Programmation" msgid "Email notification" msgstr "Notification par mail" msgid "Hide main menu entry" msgstr "Invisible dans le menu principal" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Rend le menu invisible. C'est utile lorsque le plugin remplace le menu programmme d'origine" msgid "Main menu entry" msgstr "Visible dans le menu principal" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "Le nom dans le menu principale. La prédéfinition est 'Guide du programme'. " msgid "Replace original schedule" msgstr "Remplace le menu d'origine programme" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "Lorsque le VDR est muni du patch pour autoriser le remplacement du menu original 'Programme' , vous pouvez activer ou déactiver celui-ci." msgid "Start menu" msgstr "Menue de départ" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "Ici vous pouvez choisir entre 'Maintenant' et 'Programme' comme menu de départ pour le plugin." msgid "Ok key" msgstr "Touche Ok" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" "Ici vous pouvez influencé le comportement de la touch 'Ok'. On peut afficher le continue d'information ou changer pour la chaînes proposée.\n" "Indice: La fonction de la touch 'bleu' (changer/Infos/Recherche) dépend de ce réglage." msgid "Red key" msgstr "Touche rouge" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" "Ici vous pouvez choisir entre la fonction standart 'Enregistrer' et 'Commande' comme menu de la touche rouge.\n" "(Changement possible avec la touch '0')" msgid "Blue key" msgstr "Touche bleu" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" "Ici vous pouvez choisir entre la fonction standart 'Changer de chaine' et 'Recherche' comme menu de la touche bleu.\n" "(Changement possible avec la touch '0')" msgid "Show progress in 'Now'" msgstr "Afficher le progrès dans 'Maintenant'" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "Affiche la barre de progression dans le menu 'Maintenant', qui indique l'avancement de l'émission en cours." msgid "Show channel numbers" msgstr "Afficher le numéro de la chaîne" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" "Affiche du numéro de chaîne dans la vue 'Maintenant'.\n" "\n" "(Pour les réglages de l'affichage menu propre à l'utilisateur, lire le MANUAL)" msgid "Show channel separators" msgstr "Afficher le separateur de chaînes" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "Afficher les groupes de chaines avec une ligne de séparation dans la vue 'Maintenant'." msgid "Show day separators" msgstr "Afficher les séparateur de jours" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "Afficher une ligne de séparation au changement de date dans la vue 'programme'." msgid "Show radio channels" msgstr "Afficher les chaînes de radio" msgid "Help$Show also radio channels." msgstr "Afficher aussi les chaînes de radio." msgid "Limit channels from 1 to" msgstr "Limiter aux chaînes de 1 à" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "Avec cette limite vous rendez l'affichage du menu plus rapide si vous avez une liste de chaînes très longue. Avec '0' vous enlevez la limitation." msgid "'One press' timer creation" msgstr "Programmation immédiate avec enregistrement" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "Lors de la programmation avec 'Enregistrer' vous pouvez choisir entre créer directement ou consulter les détails de la programmation." msgid "Show channels without EPG" msgstr "Afficher les chaînes sans EPG" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "Ici vous pouvez faire disparaitre ou non les chaines sans infos EPG dans la vue 'Maintenant'. Un 'Ok' sur le programme change sur cette chaînes." msgid "Time interval for FRew/FFwd [min]" msgstr "Interval pour FRew/FFwd [min]" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" "Ici vous règlez un laps de temps, qui est utilisé avec les touches '<<' et '>>' à travers les EPG.\n" "\n" "(Si vous n'avez pas ces touches sur votre télécommande, vous pouvez aussi atteindre ces fonctions par la touche '0' grâce à laquelle on obtient les fonctions '<<' et '>>' sur les touches Vert/Jaune)" msgid "Toggle Green/Yellow" msgstr "Commuter vert/jaune" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "Ici vous indiquez, si les touches Verte/Jaune sont commutées avec la touches '0'." msgid "Show favorites menu" msgstr "Afficher le menu favoris" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" "Un menu favori peut contenir la liste de vos émission préférée. Faire le choix ici, si vous voulez avoir un menu favori à coté de 'Maintenant' et 'plus tard.\n" "Chaque recherche peut être utilisé comme favori. Pour cela simplement utiliser l'option Favori lors de l'édition de recherche." msgid "for the next ... hours" msgstr "pour les prochaines ... heures" msgid "Help$This value controls the timespan used to display your favorites." msgstr "Avec cette valeur vous réglez un interval, pour afficher les favoris." msgid "Use user-defined time" msgstr "Utiliser le temps de l'utilisateur" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "En plus de 'Maintenant' et 'Après' vous pouvez définir encore 4 autres crénaux comme 'Le soir', 'La nuit' ou 'encore plus tard' en appuyant plusieurs fois sur la touche verte..." msgid "Description" msgstr "Description" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "Ici la description des temps utilisateurs, accessible en appuyant plusieurs foix sur la touche verte" msgid "Time" msgstr "Temps" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "Ici vous définisez le temps utilisateur dans le format 'HH:MM' par exemple '20:45'" msgid "Use VDR's timer edit menu" msgstr "Utiliser le menu édition VDR-programme" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" "Ce plugin a sont propre éditeur de programmation, qui enrichit l'originale avec beaucoup le fonctions interressantes:\n" "\n" "- une entrée de dossier supplèmentaire\n" "- des programmations hebdomadaires définies par l'utilisateur\n" "- l'utilisation de variable de l'EPG (voire MANUAL)" msgid "Default recording dir" msgstr "Dossier d'enregistrement standart" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "Lors de la programmation vous pouvez définir un dossier par défaut." msgid "Add episode to manual timers" msgstr "Ajouter sous-titre dans la programmation manuel" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" "Lorsque l'on créé une programmation d'une série, on peut voir automatiquement le nom de l'épisode.\n" "\n" "- Jamais: sans nom d'épisode\n" "- Toujours:Compléter toujours avec le noms de l'épisode, si existant.\n" "- intelligent: compléter, si l'épisode dure moins de 80 min" msgid "Default timer check method" msgstr "Méthode standart de vérification de programmation" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" "Des programmations manuelles peuvent être surveillés par rapport au changement d'EPG. Ici vous pouvez définir une méthode de vérification standart pour chaque chaîne. Les choix:\n" "\n" "- pas de vérification\n" "- à partir du numéro d'émission: la vérification se fait à partir d'un numéro délivré par l'émetteur.\n" "- à partir de la chaîne/heure: vérification à partir de l'émission, qui est la mieux adaptée avec la durée de l'émission initiale." msgid "Button$Setup" msgstr "Configuration" msgid "Use search timers" msgstr "Utiliser le programmeur de recherche" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "'Programmation de recherche' peut être utilisé pour programmer automatiquement des émissions, qui sont trouvées par la recherche." msgid " Update interval [min]" msgstr " Interval d'actualisation [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "Ici vous indiquez l'interval avec lequel de nouvelles émissions a programmer sont recherchées." msgid " SVDRP port" msgstr " SVDRP Port" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "La programmation de nouveaux enregistrements ou changements de programmation est réalisé avec SVDRP. La valeur par défaut doit absolument être correcte, ne la changez que si vous savez ce que vous faites." msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "Ici vous définissez la priorité standard de la programmation crée par le plugin. Cette valeur peut être réglée de facon individuelle pour chaque recherche." msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Ici vous définissez la durée de vie de l'enregistrement crée par le plugin. Cette valeur pe ut être réglée de facon individuelle pour chaque recherche." msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Ici vous définissez la marge antérieure à la programmation crée par le plugin. Cette valeur peut être réglée de facon individuelle pour chaque recherche." msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Ici vous définissez la marge postérieure de la programmation crée par le plugin. Cette valeur peut être réglée de facon individuelle pour chaque recherche." msgid "No announcements when replaying" msgstr "Pas d'annonces lors de la lecture" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "Mettez 'oui' si aucune annonce d'émission n'est voulue pendant la lecture." msgid "Recreate timers after deletion" msgstr "Recrer la programmation après l'éffacement" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "Choisissez 'oui' pour refaire les programmations de recherche lorsque vous les avez effacés." msgid "Check if EPG exists for ... [h]" msgstr "" #, fuzzy msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "Avec 'Oui' vous impliquez la vérification de conflits à la mise à jours de la recherche." #, fuzzy msgid "Warn by OSD" msgstr "Annoncer seulement début d'une programme" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "Mettez 'oui',si les conflits de programmation doivent être notifiés." #, fuzzy msgid "Warn by mail" msgstr "Annoncer seulement début d'une programme" #, fuzzy msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "Mettez 'oui',si le compte mail utilise l'authentification pour les mails sortants." #, fuzzy msgid "Channel group to check" msgstr "Groupe de chaînes" #, fuzzy msgid "Help$Specify the channel group to check." msgstr "Spécifier le nom du modèle." msgid "Ignore PayTV channels" msgstr "Ignorer les chaînes payantes" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "Pour éviter les recherches sur les chaînes payantes, vous mettez l'option sur 'oui'" msgid "Search templates" msgstr "Rechercher modèles" msgid "Help$Here you can setup templates for your searches." msgstr "Ici vous créer vos recherches comme modèles" msgid "Blacklists" msgstr "Listes des exclus" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "Avec ceci vous changez les listes d'exclusions, qui sont utilisées par la recherche automatique, pour éviter des emissions que vous ne voulez pas voir." msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "Ici vous définissez des groupes de chaînes qui sont utilisés par la recherche. Ce ne sont pas les groupes de chaînes définis dans VDR comme 'Cinéma', mais une sélection propre de l'utilisateur." msgid "Ignore below priority" msgstr "Ignorer la priorité inférieure" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "Ignorer les conflits inférieurs à ... min." msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Lorsque le temps de conflit est sous le nombre de minutes indiqué, ceci est considéré comme 'non-important'. Uniquement les conflits importants sont affichés à l'écran lors de la vérification automatique de la programmation." msgid "Only check within next ... days" msgstr "Ne vérifier que les prochains ... jours" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "Avec cette valeur vous définissez l'interval de temps de la vérification de conflits. Tous ces conflits en dehors de cet interval sont qualifés comme 'pas encore importants." msgid "--- Automatic checking ---" msgstr "--- Vérifications automatiques ---" msgid "After each timer programming" msgstr "Après chaque programmation" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "Mise à jours après chaque recherche" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "Avec 'Oui' vous impliquez la vérification de conflits à la mise à jours de la recherche." msgid "every ... minutes" msgstr "toutes les ... minutes" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" "Ici vous indiquez l'interval de temps dans lequel la vérification de conflits est effectuée.\n" "(avec '0' vous déactivez la vérification.)" msgid "if conflicts within next ... minutes" msgstr "Si conflit dans ... minutes suivantes" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "Si le conflit à lieu dans l'interval de temp indiqué, alors il est possible de règler un interval de temps plus petit pour la vérification de conflits avec affichage à lécran." msgid "Avoid notification when replaying" msgstr "Eviter les messages pendant la lecture" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "Mettez sur 'oui', si pendant la lecture vous ne voulez pas être dérangé par les affichages des conflits de programmation. L'affichage est fait si les conflits on lieu dans le 2 heures à venir." msgid "Search timer notification" msgstr "Notification de recherche" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "Mettez 'oui',si vous voulez que les nouvelles programmations automatiques soient notifiées par mail." msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "Notification de conflit de programmation" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "Mettez 'oui',si les conflits de programmation doivent être notifiés." msgid "Send to" msgstr "Envoyer à" msgid "Help$Specify the email address where notifications should be sent to." msgstr "Ici vous indiquez l'adresse mail, a laquelle les notifications sont envoyées." msgid "Mail method" msgstr "Méthode de couriel" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "--- Compte courriel ---" msgid "Email address" msgstr "Adresse courriel" msgid "Help$Specify the email address where notifications should be sent from." msgstr "Préciser l'adresse courriel de l'envoyeur des notifications" msgid "SMTP server" msgstr "Serveur SMTP" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "Ici vous indiquez le serveur de mail sortant SMTP, par lequel les notifications vont être envoyées. Si le port standart(25) n'est pas utilisé, alors ajoutez \":port\" par exemple smtp.orange.fr:2525. " msgid "Use SMTP authentication" msgstr "Utiliser l'authentification SMTP" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "Mettez 'oui',si le compte mail utilise l'authentification pour les mails sortants." msgid "Auth user" msgstr "Authentification: utilisateur" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "Ici vous indiquez l'utilisateur pour l'authentification, lorsque le compte mail sortant SMTP en a besoin." msgid "Auth password" msgstr "Authentification: mot de passe" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "Ici vous indiquez le mot de passe pour l'authentification, lorsque le compte mail sortant SMTP en a besoin." msgid "Mail account check failed!" msgstr "La vérification du compte mail a échoué" msgid "Button$Test" msgstr "Test" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " aàbcçdeéèêfghiîjklmnoôpqrstuùûvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgid "Start/Stop time has changed" msgstr "Start/Stop date a changé" msgid "Title/episode has changed" msgstr "Titre/épisode a changé" msgid "No new timers were added." msgstr "Il n'y a pas eu de nouvelle programmation." msgid "No timers were modified." msgstr "La programmation n'a pas été changée." msgid "No timers were deleted." msgstr "Aucune programmation n'a été effacée." msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "Cette version de EPGSearch ne supporte pas ce service!" msgid "EPGSearch does not exist!" msgstr "EPGSearch n'existe pas!" #, c-format msgid "%d new broadcast" msgstr "%d nouvelle(s) émission(s)" msgid "Button$by channel" msgstr "de programme" msgid "Button$by time" msgstr "de début" msgid "Button$Episode" msgstr "Épisode" msgid "Button$Title" msgstr "Titre" msgid "announce details" msgstr "annoncer les détails" msgid "announce again" msgstr "Annoncer à nouveau" msgid "with next update" msgstr "lors de la prochaine mise à jour" msgid "again from" msgstr "recommencer à partir de" msgid "Search timer" msgstr "Programmation de recherche" msgid "Edit blacklist" msgstr "Editer la liste des exclus" msgid "phrase" msgstr "Phrase" msgid "all words" msgstr "tout les mots" msgid "at least one word" msgstr "un mot" msgid "match exactly" msgstr "correspond exactement" msgid "regular expression" msgstr "expression réguliere" msgid "fuzzy" msgstr "imprécis" msgid "user-defined" msgstr "definition d'utilisateur" msgid "interval" msgstr "interval" msgid "channel group" msgstr "Groupe de chaînes" msgid "only FTA" msgstr "sans TV-Payante" msgid "Search term" msgstr "Rechercher" msgid "Search mode" msgstr "Mode de recherche" msgid "Tolerance" msgstr "Tolérance" msgid "Match case" msgstr "Maj/Minuscule" msgid "Use title" msgstr "Utiliser titre" msgid "Use subtitle" msgstr "Utiliser sous-titre" msgid "Use description" msgstr "Utiliser la description" msgid "Use extended EPG info" msgstr "Utiliser les infos EPG avancées" msgid "Ignore missing categories" msgstr "Ignorer les catégories indisponible" msgid "Use channel" msgstr "Utiliser les chaînes" msgid " from channel" msgstr " de la Chaîne" msgid " to channel" msgstr " à la Chaîne" msgid "Channel group" msgstr "Groupe de chaînes" msgid "Use time" msgstr "Utiliser l'heure" msgid " Start after" msgstr " Départ après" msgid " Start before" msgstr " Départ avant" msgid "Use duration" msgstr "Durée d'utilisation" msgid " Min. duration" msgstr " Durée min." msgid " Max. duration" msgstr " Durée max." msgid "Use day of week" msgstr "Utiliser les jours de la semaine" msgid "Day of week" msgstr "Jours de la semaine" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "Modéles" msgid "*** Invalid Channel ***" msgstr "*** Chaîne indisponible ***" msgid "Please check channel criteria!" msgstr "Vérifier le critère de la chaîne!" msgid "Edit$Delete blacklist?" msgstr "Effacer la liste des exclus" msgid "Repeats" msgstr "Répétitions" msgid "Create search" msgstr "Créer une recherche" msgid "Search in recordings" msgstr "Recherche dans enregistrement" msgid "Mark as 'already recorded'?" msgstr "marquer comme 'déjà enregistré'?" msgid "Add/Remove to/from switch list?" msgstr "Ajouter/Effacer de la liste de changement?" msgid "Create blacklist" msgstr "Créer la liste d'exclusions" msgid "EPG Commands" msgstr "Commande EPG" msgid "Already running!" msgstr "Est déjà en cours" msgid "Add to switch list?" msgstr "Ajouter à la liste de changement de chaine?" msgid "Delete from switch list?" msgstr "Effacer de la liste de changement?" msgid "Button$Details" msgstr "Détails" msgid "Button$Filter" msgstr "Filtre" msgid "Button$Show all" msgstr "Montrer tous" msgid "conflicts" msgstr "Conflits" msgid "no conflicts!" msgstr "pas de conflits" msgid "no important conflicts!" msgstr "pas de conflits importants!" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "Répétitions" msgid "no check" msgstr "sans surveillance" msgid "by channel and time" msgstr "à partir chaînes/heures" msgid "by event ID" msgstr "à partir du numéro d'émission" msgid "Select directory" msgstr "Selectionner le dossier" msgid "Button$Level" msgstr "Niveau" msgid "Event" msgstr "Événement" msgid "Favorites" msgstr "Favoris" msgid "Search results" msgstr "Résultat de recherche" msgid "Timer conflict! Show?" msgstr "Afficher les conflits de programmation?" msgid "Directory" msgstr "Dossier" msgid "Channel" msgstr "Chaîne" msgid "Childlock" msgstr "Adulte" msgid "Timer check" msgstr "surveiller" msgid "recording with device" msgstr "Enregistrement avec appareil" msgid "Button$With subtitle" msgstr "Avec les sous-titres" msgid "Button$Without subtitle" msgstr "Sans sous-titres" msgid "Button$Extended" msgstr "Extention" msgid "Button$Simple" msgstr "Simple" msgid "Use blacklists" msgstr "Utiliser la liste des exclus" msgid "Edit$Search text too short - use anyway?" msgstr "Texte de recherche est trop court - l'utiliser comme même?" #, fuzzy msgid "Button$Orphaned" msgstr "de programme" msgid "Button$by name" msgstr "par nom" msgid "Button$by date" msgstr "par la date" msgid "Button$Delete all" msgstr "Effacer toutes" msgid "Recordings" msgstr "Enregistrement" msgid "Edit$Delete entry?" msgstr "Effacer l'entrée" msgid "Edit$Delete all entries?" msgstr "Effacer toutes les entrées" msgid "Summary" msgstr "Contenu" msgid "Auxiliary info" msgstr "Informations supplémentaires" msgid "Button$Aux info" msgstr "Infos supplémentaires" msgid "Search actions" msgstr "Actions de recherche" msgid "Execute search" msgstr "Effectuer la recherche" msgid "Use as search timer on/off" msgstr "Utiliser comme recherche oui/non" msgid "Trigger search timer update" msgstr "Selection" msgid "Show recordings done" msgstr "Afficher les enregistrements effectués" msgid "Show timers created" msgstr "Afficher la programmation effectuée" msgid "Create a copy" msgstr "Créer une copie" msgid "Use as template" msgstr "Utiliser comme modèles" msgid "Show switch list" msgstr "Afficher liste de changement" msgid "Show blacklists" msgstr "Afficher la liste des exclus" msgid "Delete created timers?" msgstr "Effacer les programmations crées" msgid "Timer conflict check" msgstr "Vérifier les conflits de programmation" msgid "Disable associated timers too?" msgstr "Désactiver la programmation correspondante" msgid "Activate associated timers too?" msgstr "Activer la progammation correspondante" msgid "Search timers activated in setup." msgstr "La recherche a été activée dans la configuration." msgid "Run search timer update?" msgstr "Mise à jours programmation de recherche?" msgid "Copy this entry?" msgstr "Copier cette entrée" msgid "Copy" msgstr "Copier" msgid "Copy this entry to templates?" msgstr "Copier cette entrée dans modèles?" msgid "Delete all timers created from this search?" msgstr "Effacer les programmations issues de cette recherche?" msgid "Button$Actions" msgstr "Actions" msgid "Search entries" msgstr "Entrée de recherche" msgid "active" msgstr "actif" msgid "Edit$Delete search?" msgstr "Effacer la recherche" msgid "Edit search" msgstr "Edition recherche" msgid "Record" msgstr "Enregistre" #, fuzzy msgid "Announce by OSD" msgstr "Annoncer seulement début d'une programme" msgid "Switch only" msgstr "Seulement changer de chaine" #, fuzzy msgid "Announce and switch" msgstr "Annoncer seulement début d'une programme" #, fuzzy msgid "Announce by mail" msgstr "Annoncer seulement début d'une programme" msgid "only globals" msgstr "" msgid "Selection" msgstr "Selection" msgid "all" msgstr "tous" msgid "count recordings" msgstr "compter enregistrements" msgid "count days" msgstr "compter jours" msgid "if present" msgstr "" #, fuzzy msgid "same day" msgstr "Dernier jour" #, fuzzy msgid "same week" msgstr "Jours de la semaine" msgid "same month" msgstr "" msgid "Template name" msgstr "Nom du modèle" msgid "Help$Specify the name of the template." msgstr "Spécifier le nom du modèle." msgid "Help$Specify here the term to search for." msgstr "Spécifier ici le term de la recherche." msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" #, fuzzy msgid "Use content descriptor" msgstr "Utiliser la description" #, fuzzy msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "Mettez 'oui',si le compte mail utilise l'authentification pour les mails sortants." msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "Utiliser dans le menu favoris" msgid "Result menu layout" msgstr "Dispositon du menu de résultat" msgid "Use as search timer" msgstr "Utiliser la recherche" msgid "Action" msgstr "Action" msgid "Switch ... minutes before start" msgstr "Changer ... minutes avant le début" msgid "Unmute sound" msgstr "Remettre le son" #, fuzzy msgid "Ask ... minutes before start" msgstr "Changer ... minutes avant le début" msgid " Series recording" msgstr " Enregistrement de serie" msgid "Delete recordings after ... days" msgstr "Effacer l'enregistrement après ... jours" msgid "Keep ... recordings" msgstr "Garder .... enregistrements" msgid "Pause when ... recordings exist" msgstr "Pause, lorsque ... l'enregistrement existe." msgid "Avoid repeats" msgstr "Eviter les répétions" msgid "Allowed repeats" msgstr "Répétitions autorisées" msgid "Only repeats within ... days" msgstr "Que répétion, pendant ... jours" msgid "Compare title" msgstr "Comparer titres" msgid "Compare subtitle" msgstr "Comparer les sous-titres" msgid "Compare summary" msgstr "Comparer les descriptions" #, fuzzy msgid "Min. match in %" msgstr " Durée min." #, fuzzy msgid "Compare date" msgstr "Comparer titres" msgid "Compare categories" msgstr "Comparer categories" msgid "VPS" msgstr "iVPS" msgid "Auto delete" msgstr "Auto effacement" msgid "after ... recordings" msgstr "après ... enregistrements" msgid "after ... days after first rec." msgstr "après ... jours du premier enregistrement" msgid "Edit user-defined days of week" msgstr "Edition des journées définit par l'utilisateur" msgid "Compare" msgstr "Comparer" msgid "Select blacklists" msgstr "Choisir la liste des exclus" msgid "Values for EPG category" msgstr "Valeur pour la catégories EPG" msgid "Button$Apply" msgstr "Appliquer" msgid "less" msgstr "plus petit" msgid "less or equal" msgstr "plus petit ou égale" msgid "greater" msgstr "plus grand" msgid "greater or equal" msgstr "plus grand ou égale" msgid "equal" msgstr "égale" msgid "not equal" msgstr "pas égale" msgid "Activation of search timer" msgstr "Activation de la recherche de programmation" msgid "First day" msgstr "Premier jour" msgid "Last day" msgstr "Dernier jour" msgid "Button$all channels" msgstr "avec TV-Payante" msgid "Button$only FTA" msgstr "sans TV-Payante" msgid "Button$Timer preview" msgstr "Prévu de programmation" msgid "Blacklist results" msgstr "Résultats de la liste des exclus" msgid "found recordings" msgstr "Enregistrements trouvées" msgid "Error while accessing recording!" msgstr "Erreur lors de l'accès à l'enregistrement" msgid "Button$Default" msgstr "Standart" msgid "Edit$Delete template?" msgstr "Effacer le modèle" msgid "Overwrite existing entries?" msgstr "Ecraser les informations?" msgid "Edit entry" msgstr "Editer l'entrée" #, fuzzy msgid "Switch" msgstr "Seulement changer de chaine" msgid "Announce only" msgstr "Annoncer seulement début d'une programme" #, fuzzy msgid "Announce ... minutes before start" msgstr "Changer ... minutes avant le début" msgid "action at" msgstr "Effectuer à" msgid "Switch list" msgstr "Liste de changement de chaine" msgid "Edit template" msgstr "Editer modèles" msgid "Timers" msgstr "Programmations" msgid ">>> no info! <<<" msgstr ">>> Pas d'information! <<<" msgid "Overview" msgstr "Sommaire" msgid "Button$Favorites" msgstr "Favoris" msgid "Quick search for broadcasts" msgstr "Recherche rapide pour les radios" msgid "Quick search" msgstr "Recherche rapide" msgid "Show in main menu" msgstr "Visible dans le menu principale" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "Afficher les %d nouvelles émissions trouvées?" msgid "Search timer update done!" msgstr "La mise à jours de recherche est effectuée!" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "La programmation a échoué" #~ msgid "in %02ldd" #~ msgstr "en %02ldd" #~ msgid "in %02ldh" #~ msgstr "en %02ldh" #~ msgid "in %02ldm" #~ msgstr "en %02ldm" #, fuzzy #~ msgid "Compare expression" #~ msgstr "expression réguliere" vdr-plugin-epgsearch/po/ro_RO.po0000644000175000017500000005644612466747543016467 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Paul Lacatus , 2002 # Lucian Muresan , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Lucian Muresan \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "ConfiguraÅ£ie" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" msgid "Button$Orphaned" msgstr "" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "ÃŽnregistr." msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/tr_TR.po0000644000175000017500000005631112466747543016470 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Oktay Yolgeçen , 2007 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Oktay Yolgeçen \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" msgid "Button$Orphaned" msgstr "" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/et_EE.po0000644000175000017500000005636612466747543016431 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Arthur Konovalov , 2004 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Arthur Konovalov \n" "Language-Team: Estonian \n" "Language: et\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" #, fuzzy msgid "Button$Commands" msgstr "Salvesta" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Sätted" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" #, fuzzy msgid "Button$Orphaned" msgstr "Salvesta" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Salvesta" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/cs_CZ.po0000644000175000017500000007321312466747543016437 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Vladimír Bárta , 2006 # msgid "" msgstr "" "Project-Id-Version: VDR 1.7.21\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2011-10-31 20:21+0200\n" "Last-Translator: Radek Stastny \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "Skupiny stanic" msgid "Button$Select" msgstr "Vyber" msgid "Channel group used by:" msgstr "Skupina použitá v:" msgid "Edit$Delete group?" msgstr "Smazat Skupinu stanic?" msgid "Edit channel group" msgstr "Uravit Skupinu stanic" msgid "Group name" msgstr "Jméno skupiny" msgid "Button$Invert selection" msgstr "Inverzní výbÄ›r" msgid "Button$All yes" msgstr "Ano vÅ¡e" msgid "Button$All no" msgstr "Ne vÅ¡e" msgid "Group name is empty!" msgstr "Jméno nemůže být prázdné!" msgid "Group name already exists!" msgstr "Jméno již použito!" msgid "Direct access to epgsearch's conflict check menu" msgstr "Přímý vstup do menu konfliktů epgsearch" msgid "Timer conflicts" msgstr "Konflikty v nahrávání" msgid "Conflict info in main menu" msgstr "Konflikty do hlavního menu" msgid "next" msgstr "další" #, c-format msgid "timer conflict at %s! Show it?" msgstr "Konflikt Nahrávání %s! Zobrazit?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "Nahrávání - konflikty (%d)! Od %s. Zobrazit?" msgid "search the EPG for repeats and more" msgstr "hledat opakování v programu a další" msgid "Program guide" msgstr "Průvodce programem (EPG)" msgid "search timer update running" msgstr "Probíhá aktualizace Nahrávání" msgid "Direct access to epgsearch's search menu" msgstr "Přímý vstup do menu hledání epgsearch" msgid "Search" msgstr "Automatické nahrávání" msgid "EpgSearch-Search in main menu" msgstr "EpgSearch hledání do hlavního menu" msgid "Button$Help" msgstr "NápovÄ›da" msgid "Standard" msgstr "Výchozí" msgid "Button$Commands" msgstr "Příkazy" msgid "Button$Search" msgstr "Hledat" msgid "never" msgstr "nikdy" msgid "always" msgstr "vždy" msgid "smart" msgstr "chytÅ™e" msgid "before user-def. times" msgstr "pÅ™ed uživatelské Äasy" msgid "after user-def. times" msgstr "po uživatelských Äasech" msgid "before 'next'" msgstr "pÅ™ed 'Nyní'" msgid "General" msgstr "Základní" msgid "EPG menus" msgstr "Programový průvodce" msgid "User-defined EPG times" msgstr "Nastavení Äasu" msgid "Timer programming" msgstr "Nastavení nahrávání" msgid "Search and search timers" msgstr "Hledání a Automatické nahrávání" msgid "Timer conflict checking" msgstr "Kontrola konfliktů nahrávání" msgid "Email notification" msgstr "Mailové zprávy" msgid "Hide main menu entry" msgstr "Skrýt položku v hlavním menu" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Nezobrazovat v hlavním menu, používá se když tento plugin nahrazuje výchozího průvodce programem." msgid "Main menu entry" msgstr "Název položky hlavního menu" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "Jméno položky hlavního menu - výchozí název je Průvodce programem (EPG) " msgid "Replace original schedule" msgstr "Nahradit výchozího průvodce programem" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "Pokud je vdr upraveno, může tento plugin nahradit výchozí položku 'Program'" msgid "Start menu" msgstr "Výchozí menu" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "VýbÄ›r mezi pÅ™ehledem vÅ¡ech stanic - 'Nyní' a programem aktuální stanice - 'Program'" msgid "Ok key" msgstr "OK tlaÄítko" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "ÄŒervené tlaÄítko" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "Modré tlaÄítko" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "Zobrazit Äasové detaily v pÅ™ehledu stanic 'Nyní'" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "Zobrazit Äísla stanic" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "Zobrazit oddÄ›lení mezi stanicemi" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "Zobrazit oddÄ›lení mezi dny" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "Zobrazit radio stanice" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "Omezit zobrazení stanic od 1 do" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "Vytváření nahrávání 'Jedním stiskem'" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "Zobrazit stanice bez programu" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "Posun v průvodci po FRew/FFwd [min]" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "Prohodit Zelené/Žluté" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "Zobrazovat volbu Oblíbené" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "na příštích ... hodin" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "Uživateské Äasy" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "Popis" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "ÄŒas" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "Použít výchozí menu pro nahrávání" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "Výchozí adresář pro nahrávky" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "PÅ™idávat název dílu do Nahrávání" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "Výchozí kontrola plán. Nahrávání" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Nastavení" msgid "Use search timers" msgstr "Používat Automatické nahrávání" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr " Interval mezi hledáním [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "Nezobrazovat infromace pÅ™i pÅ™ehrávání" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "Znovu vytvoÅ™it Nahrávání i po smazání" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "Kontrolvat zda je .. [h] programu" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "Informovat na obrazovce" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "Informovat mailem" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "Skupina stanic ke hledání" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "Ignorovat placené stanice" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "Vzory pro hledání" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "ÄŒerné listiny (blacklist)" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "Ignorovat prioritu pod" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "Vynechat konflikty kratší než ... min" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "Kontrolovat pouze bÄ›hem dalších . dní" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "--- Automatická kontrola ---" msgid "After each timer programming" msgstr "Po vytvoÅ™ení Nahrávání" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "Když zaÄne nahrávání" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "Po každém hledání" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "každých ... minut" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "pokud je konflikt bÄ›hem dalších ... minut" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "Neinformaovat na obrazovce pÅ™i pÅ™ehrávání" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "Informovat o vytvoÅ™ení Nahrávání" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "Interval mezi maily [h]" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "Informovat o konfliktech Nahrávání" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "Adresát" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "Způsob odeslání" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "--- Email úÄet ---" msgid "Email address" msgstr "adresa" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "SMTP server" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "Použít SMTP authentifikaci" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "uživatel" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "heslo" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "Kontrola úÄtu selhala" msgid "Button$Test" msgstr "Test" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "ZmÄ›nil se Äas ZaÄátku/konce" msgid "Title/episode has changed" msgstr "ZmÄ›nil se Název/název dílu" msgid "No new timers were added." msgstr "NevytvoÅ™eno nové Nahrávání." msgid "No timers were modified." msgstr "Neupraveno žádné Nahrávání." msgid "No timers were deleted." msgstr "Žádné nahrávání nebylo smazané." msgid "No new events to announce." msgstr "Zádné nová událost k oznámení. " msgid "This version of EPGSearch does not support this service!" msgstr "Tato verze EPGsearch nepodporuje tuto službu!" msgid "EPGSearch does not exist!" msgstr "EPGsearch neexistuje!" #, c-format msgid "%d new broadcast" msgstr "%d nové vysílání" msgid "Button$by channel" msgstr "Dle stanic" msgid "Button$by time" msgstr "Dle Äasu" msgid "Button$Episode" msgstr "Název dílu" msgid "Button$Title" msgstr "Název" msgid "announce details" msgstr "informovat o podrobostech" msgid "announce again" msgstr "informovat znovu" msgid "with next update" msgstr "pÅ™i dalších zmÄ›nách" msgid "again from" msgstr "znovu od" msgid "Search timer" msgstr "Automatické nahrávání" msgid "Edit blacklist" msgstr "Upravit blacklist" msgid "phrase" msgstr "fráze" msgid "all words" msgstr "vÅ¡echna slova" msgid "at least one word" msgstr "alespoň jedno slovo" msgid "match exactly" msgstr "pÅ™esný výraz" msgid "regular expression" msgstr "regulární výraz" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "více dní" msgid "interval" msgstr "" msgid "channel group" msgstr "skupina kanálů" msgid "only FTA" msgstr "jen volné" msgid "Search term" msgstr "Vyhledej" msgid "Search mode" msgstr "Vyhledávací režim" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "Velikost písmen" msgid "Use title" msgstr "Název" msgid "Use subtitle" msgstr "Název dílu" msgid "Use description" msgstr "Popis" msgid "Use extended EPG info" msgstr "Použít rozšířené EPG informace" msgid "Ignore missing categories" msgstr "Ignorovat chybÄ›jící kategorie." msgid "Use channel" msgstr "Stanice" msgid " from channel" msgstr " od" msgid " to channel" msgstr " do" msgid "Channel group" msgstr "Skupina stanic" msgid "Use time" msgstr "ÄŒas" msgid " Start after" msgstr " ZaÄíná po" msgid " Start before" msgstr " ZaÄíná pÅ™ed" msgid "Use duration" msgstr "Délka" msgid " Min. duration" msgstr " Min. délka" msgid " Max. duration" msgstr " Max. délka" msgid "Use day of week" msgstr "Den v týdnu" msgid "Day of week" msgstr "Den" msgid "Use global" msgstr "Použít globálnÄ›" msgid "Button$Templates" msgstr "Vzory" msgid "*** Invalid Channel ***" msgstr "*** Å¡patná stanice ***" msgid "Please check channel criteria!" msgstr "Zkontrolujte nastavení stanic!" msgid "Edit$Delete blacklist?" msgstr "Smazat blacklist?" msgid "Repeats" msgstr "Opakování" msgid "Create search" msgstr "VytvoÅ™it Hledání" msgid "Search in recordings" msgstr "Hledat v nahrávkách?" msgid "Mark as 'already recorded'?" msgstr "OznaÄit jako 'již nahrané'" msgid "Add/Remove to/from switch list?" msgstr "Upravit seznam pÅ™epnutí?" msgid "Create blacklist" msgstr "VytvoÅ™it blacklist" msgid "EPG Commands" msgstr "EPG příkazy" msgid "Already running!" msgstr "Již běží!" msgid "Add to switch list?" msgstr "PÅ™idat do seznamu pÅ™epnutí?" msgid "Delete from switch list?" msgstr "Smazat ze seznamu pÅ™epnutí?" msgid "Button$Details" msgstr "Detaily" msgid "Button$Filter" msgstr "Filtr" msgid "Button$Show all" msgstr "Zobrazit vÅ¡e" msgid "conflicts" msgstr "konflikty" msgid "no conflicts!" msgstr "žádné konflikty!" msgid "no important conflicts!" msgstr "zádné důležité konflikty!" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "Opakování" msgid "no check" msgstr "žádná kontrola" msgid "by channel and time" msgstr "dle stanice a Äasu" msgid "by event ID" msgstr "dle ID události" msgid "Select directory" msgstr "Vyber adresář" msgid "Button$Level" msgstr "Úroveň" msgid "Event" msgstr "Událost" msgid "Favorites" msgstr "Oblíbené" msgid "Search results" msgstr "Výsledky hledání" msgid "Timer conflict! Show?" msgstr "Konflikt Nahrávání! Zobrazit?" msgid "Directory" msgstr "Adresář" msgid "Channel" msgstr "Stanice" msgid "Childlock" msgstr "DÄ›tská pojistka" msgid "Timer check" msgstr "Kontrola Nahrávání" msgid "recording with device" msgstr "nahrávat zařízením" msgid "Button$With subtitle" msgstr "S Názvem dílu" msgid "Button$Without subtitle" msgstr "Bez Názvu dílu" msgid "Button$Extended" msgstr "Rozšířené" msgid "Button$Simple" msgstr "Výchozí" msgid "Use blacklists" msgstr "Použít blacklist" msgid "Edit$Search text too short - use anyway?" msgstr "Text je příliÅ¡ krátký - pÅ™esto použít?" #, fuzzy msgid "Button$Orphaned" msgstr "Dle stanic" msgid "Button$by name" msgstr "dle jména" msgid "Button$by date" msgstr "dle data" msgid "Button$Delete all" msgstr "Smazat vÅ¡e" msgid "Recordings" msgstr "Nahrávky" msgid "Edit$Delete entry?" msgstr "Smazat?" msgid "Edit$Delete all entries?" msgstr "Smazat vÅ¡e?" msgid "Summary" msgstr "Shrnutí" msgid "Auxiliary info" msgstr "Pomocné info" msgid "Button$Aux info" msgstr "Pom. info" msgid "Search actions" msgstr "Akce hledání" msgid "Execute search" msgstr "Hledat" msgid "Use as search timer on/off" msgstr "Povolit/Zakázat" msgid "Trigger search timer update" msgstr "Hledat zmÄ›ny" msgid "Show recordings done" msgstr "Zobrazit nahrávky" msgid "Show timers created" msgstr "Zobrazit Nahrávání" msgid "Create a copy" msgstr "VytvoÅ™it kopii" msgid "Use as template" msgstr "Použít jako vzor" msgid "Show switch list" msgstr "Zobrazit seznam pÅ™epnutí" msgid "Show blacklists" msgstr "Zobrazit blacklisty" msgid "Delete created timers?" msgstr "Smazat vytvorená Nahrávání?" msgid "Timer conflict check" msgstr "Kontrola konfliktů" msgid "Disable associated timers too?" msgstr "Zakázat i vytvoÅ™ená Nahrávání?" msgid "Activate associated timers too?" msgstr "Povolit i již vytvoÅ™ená Nahrávání?" msgid "Search timers activated in setup." msgstr "Automatické nahrávání povoleno v nastavení." msgid "Run search timer update?" msgstr "Aktualizovat automatické nahrávání?" msgid "Copy this entry?" msgstr "Kopírovat položku?" msgid "Copy" msgstr "Kopírovat" msgid "Copy this entry to templates?" msgstr "Zkopírovat do vzorů?" msgid "Delete all timers created from this search?" msgstr "Smazat vÅ¡echna Nahrávání z tohoto hledání?" msgid "Button$Actions" msgstr "Akce" msgid "Search entries" msgstr "Vyhledat položky" msgid "active" msgstr "povoleno" msgid "Edit$Delete search?" msgstr "Smazat?" msgid "Edit search" msgstr "Upravit hledání" msgid "Record" msgstr "Nahrát" msgid "Announce by OSD" msgstr "Informovat na obrazovce" msgid "Switch only" msgstr "PÅ™epnout" msgid "Announce and switch" msgstr "Informovat a pÅ™epnout" msgid "Announce by mail" msgstr "Informovat mailem" msgid "only globals" msgstr "globální" msgid "Selection" msgstr "výbÄ›r" msgid "all" msgstr "vÅ¡e" msgid "count recordings" msgstr "poÄítat nahrávky" msgid "count days" msgstr "poÄítat dny" msgid "if present" msgstr "pokud existuje" msgid "same day" msgstr "stejný den" msgid "same week" msgstr "stejný týden" msgid "same month" msgstr "stejný mÄ›síc" msgid "Template name" msgstr "Jméno vzoru" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "Použít popis obsahu" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "Zobrazit v Oblíbených" msgid "Result menu layout" msgstr "Způsob zobrazení výsledků" msgid "Use as search timer" msgstr "Použít pro Automatické nahrávání" msgid "Action" msgstr "Akce" msgid "Switch ... minutes before start" msgstr "PÅ™epnout ... minut pÅ™ed zaÄátkem" msgid "Unmute sound" msgstr "ZruÅ¡it ztiÅ¡ení" msgid "Ask ... minutes before start" msgstr "Zeptat se ... minut pÅ™ed zaÄátkem" msgid " Series recording" msgstr " Nahrávání sériálu" msgid "Delete recordings after ... days" msgstr "Smazat nahrávku po ... dnech" msgid "Keep ... recordings" msgstr "Ponechat ... nahrávek" msgid "Pause when ... recordings exist" msgstr "Vynechat pokud uloženo ... nahrávek" msgid "Avoid repeats" msgstr "PÅ™eskoÄit opakování" msgid "Allowed repeats" msgstr "Povolených opakování" msgid "Only repeats within ... days" msgstr "Opakovat po ... dnech" msgid "Compare title" msgstr "Porovnat název" msgid "Compare subtitle" msgstr "Porovnat Název dílu" msgid "Compare summary" msgstr "Porovnat popis" msgid "Min. match in %" msgstr "Odpovídá na ... %" msgid "Compare date" msgstr "Porovnat datum" msgid "Compare categories" msgstr "Porovnat kategorii" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "Automatické smazání" msgid "after ... recordings" msgstr "po ... nahrávkách" msgid "after ... days after first rec." msgstr "po ... dnech po první nahrávce" msgid "Edit user-defined days of week" msgstr "Upravit použité dny" msgid "Compare" msgstr "Porovnat" msgid "Select blacklists" msgstr "Vybrat blacklisty" msgid "Values for EPG category" msgstr "EPG kategorie" msgid "Button$Apply" msgstr "Použít" msgid "less" msgstr "menší" msgid "less or equal" msgstr "menší nebo stejný" msgid "greater" msgstr "vÄ›tší" msgid "greater or equal" msgstr "vÄ›tší nebo stejný" msgid "equal" msgstr "stejný" msgid "not equal" msgstr "jiný" msgid "Activation of search timer" msgstr "Povolit Automatické nahrávání?" msgid "First day" msgstr "První den" msgid "Last day" msgstr "Poslední den" msgid "Button$all channels" msgstr "VÅ¡echny stanice" msgid "Button$only FTA" msgstr "Jen volné" msgid "Button$Timer preview" msgstr "Náhled Nahrávání" msgid "Blacklist results" msgstr "Výsledky blacklist" msgid "found recordings" msgstr "nalezených nahrávek" msgid "Error while accessing recording!" msgstr "Chyba pÅ™i přístupu k nahrávce!" msgid "Button$Default" msgstr "Výchozí" msgid "Edit$Delete template?" msgstr "Smazat vzor?" msgid "Overwrite existing entries?" msgstr "PÅ™epsat existující položky!" msgid "Edit entry" msgstr "Upravit položku" msgid "Switch" msgstr "PÅ™epnout" msgid "Announce only" msgstr "Informovat" msgid "Announce ... minutes before start" msgstr "Informovat ... minut pÅ™edem" msgid "action at" msgstr "v" msgid "Switch list" msgstr "Seznam pÅ™epnutí" msgid "Edit template" msgstr "Upravit vzor" msgid "Timers" msgstr "Nahrávání" msgid ">>> no info! <<<" msgstr ">>> bez informací <<<" msgid "Overview" msgstr "PÅ™ehled" msgid "Button$Favorites" msgstr "Oblíbené" msgid "Quick search for broadcasts" msgstr "Rychlé hledání vysílání" msgid "Quick search" msgstr "Rychlé hledání" msgid "Show in main menu" msgstr "Zobrazit v hlavním menu" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "Nalezeno %d nových vysílání! Zobrazit?" msgid "Search timer update done!" msgstr "Aktualizace Nahrávání dokonÄena!" #, c-format msgid "small EPG content on:%s" msgstr "krátký EPG obsah: %s" msgid "VDR EPG check warning" msgstr "Varování kontroly VDR EPG" #, c-format msgid "Switch to (%d) '%s'?" msgstr "PÅ™epnout na (%d) '%s'?" msgid "Programming timer failed!" msgstr "Nastavení nahrávání selhalo!" #~ msgid "in %02ldd" #~ msgstr "%02ldd" #~ msgid "in %02ldh" #~ msgstr "%02ldh" #~ msgid "in %02ldm" #~ msgstr "%02ldm" vdr-plugin-epgsearch/po/nn_NO.po0000644000175000017500000005642612466747543016454 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Jørgen Tvedt , 2001 # Truls Slevigen , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Truls Slevigen \n" "Language-Team: Norwegian Nynorsk \n" "Language: nn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Konfigurasjon" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "Suodata" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" msgid "Button$Orphaned" msgstr "" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Ta opp" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/sl_SI.po0000644000175000017500000005654312466747543016456 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Miha Setina , 2000 # Matjaz Thaler , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Matjaz Thaler \n" "Language-Team: Slovenian \n" "Language: sl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" msgid "search timer update running" msgstr "" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Nastavitve" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" #, fuzzy msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" msgid "Button$Orphaned" msgstr "" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Posnemi" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/po/it_IT.po0000644000175000017500000011740312466747543016446 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Alberto Carraro , 2001 # Antonio Ospite , 2003 # Sean Carlos , 2005 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2011-07-17 17:46+0100\n" "Last-Translator: Diego Pierotto \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Italian\n" "X-Poedit-Country: ITALY\n" "X-Poedit-SourceCharset: utf-8\n" msgid "Channel groups" msgstr "Gruppi canali" msgid "Button$Select" msgstr "Seleziona" msgid "Channel group used by:" msgstr "Gruppo canali utilizzato da:" msgid "Edit$Delete group?" msgstr "Eliminare il gruppo?" msgid "Edit channel group" msgstr "Modifica gruppo canali" msgid "Group name" msgstr "Nome gruppo" msgid "Button$Invert selection" msgstr "Inverti sel." msgid "Button$All yes" msgstr "Tutti sì" msgid "Button$All no" msgstr "Tutti no" msgid "Group name is empty!" msgstr "Il nome gruppo è vuoto!" msgid "Group name already exists!" msgstr "Nome gruppo già esistente!" msgid "Direct access to epgsearch's conflict check menu" msgstr "Accesso diretto al menu di verifica conflitti di epgsearch" msgid "Timer conflicts" msgstr "Conflitti timer" msgid "Conflict info in main menu" msgstr "Informazioni conflitto nel menu principale" msgid "next" msgstr "prossimo" #, c-format msgid "timer conflict at %s! Show it?" msgstr "Conflitto timer alle %s! Mostrare?" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "%d conflitto timer! Primo alle %s. Mostrarli?" msgid "search the EPG for repeats and more" msgstr "Cerca nella guida EPG: per parole, repliche e altro" msgid "Program guide" msgstr "Guida programmi" msgid "search timer update running" msgstr "aggiornamento timer ricerca in esecuzione" msgid "Direct access to epgsearch's search menu" msgstr "Accesso diretto al menu di ricerca di epgsearch" msgid "Search" msgstr "Cerca" msgid "EpgSearch-Search in main menu" msgstr "Ricerca EpgSearch nel menu principale" msgid "Button$Help" msgstr "Aiuto" msgid "Standard" msgstr "Standard" msgid "Button$Commands" msgstr "Comandi" msgid "Button$Search" msgstr "Cerca" msgid "never" msgstr "mai" msgid "always" msgstr "sempre" msgid "smart" msgstr "intelligente" msgid "before user-def. times" msgstr "prima orari def. da utente" msgid "after user-def. times" msgstr "dopo orari def. da utente" msgid "before 'next'" msgstr "prima 'prossimi'" msgid "General" msgstr "Generale" msgid "EPG menus" msgstr "Menu EPG" msgid "User-defined EPG times" msgstr "Date EPG definite dall'utente" msgid "Timer programming" msgstr "Programmazione" msgid "Search and search timers" msgstr "Ricerca e timer ricerca" msgid "Timer conflict checking" msgstr "Verifica conflitti timer" msgid "Email notification" msgstr "Notifica email" msgid "Hide main menu entry" msgstr "Nascondi voce menu principale" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "Nascondere la voce nel menu può essere utile se questo plugin è usato per sostituire la voce originale 'Programmi'" msgid "Main menu entry" msgstr "Voce nel menu principale" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "Nome della voce menu che corrisponde a 'Guida programmazione'" msgid "Replace original schedule" msgstr "Sostituisci Programmi originale" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "Quando VDR è patchato per permettere a questo plugin di sostituire la voce originale 'Programmi', puoi dis/attivare qui la sostituzione." msgid "Start menu" msgstr "Menu avvio" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "Scegli tra 'Sommario - Adesso' e 'Programmi' come menu iniziale quando questo plugin è chiamato." msgid "Ok key" msgstr "Tasto Ok" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" "Scegli il comportamento del tasto 'Ok'. Puoi usarlo per vedere il sommario o cambiare il canale corrispondente.\n" "Nota: la funzionalità del tasto 'blu' (Cambia/Info/Cerca) dipende da questa impostazione." msgid "Red key" msgstr "Tasto rosso" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" "Scegli quale funzione standard ('Registrazione' o 'Comandi') vuoi avere nel tasto rosso.\n" "(Può essere impostata con il tasto '0')" msgid "Blue key" msgstr "Tasto blu" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" "Scegli quale funzione standard ('Cambia'/'Info' o 'Cerca') vuoi avere nel tasto blu.\n" "(Può essere impostata con il tasto '0')" msgid "Show progress in 'Now'" msgstr "Visualizza progresso in 'Adesso'" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "Mostra una barra d'avanzamento in 'Sommario - Adesso' che informa sul tempo rimanente dell'evento attuale." msgid "Show channel numbers" msgstr "Visualizza i numeri dei canali" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" "Visualizza i numeri dei canali in 'Sommario - Adesso'\n" "\n" "(Per definire completamente il tuo proprio look del menu leggi il file MANUAL)" msgid "Show channel separators" msgstr "Mostra separatori canali" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "Visualizza i gruppi canali come separatori tra i tuoi canali in 'Sommario - Adesso'." msgid "Show day separators" msgstr "Mostra separatori giorni" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "Visualizza una linea di separazione al cambio del giorno in 'Programmi'." msgid "Show radio channels" msgstr "Mostra canali radio" msgid "Help$Show also radio channels." msgstr "Mostra anche i canali radio." msgid "Limit channels from 1 to" msgstr "Limita canali da 1 a" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "Se hai un gran numero di canali puoi velocizzarli limitando i canali visualizzati con questa impostazione. Utilizza '0' per disabilitare il limite." msgid "'One press' timer creation" msgstr "Crea timer ad 'una pressione'" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "Quando un timer è creato con 'Registra' puoi selezionare tra una creazione immediata del timer o la visualizzazione del menu modifica timer." msgid "Show channels without EPG" msgstr "Mostra canali senza EPG" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "Scegli 'sì' se vuoi vedere i canali senza EPG in 'Sommario - Adesso'. 'Ok' in questi valori cambia il canale." msgid "Time interval for FRew/FFwd [min]" msgstr "Intervallo tempo FRew/FFwd [min]" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" "Scegli l'intervallo di tempo che dovrebbe essere usato per spostarsi attraverso l'EPG premendo FRew/FFwd.\n" "\n" "(Se non hai questi tasti, puoi impostare questa funzione premendo '0' ed avere '<<' e '>>' sui tasti verde e giallo)" msgid "Toggle Green/Yellow" msgstr "Alterna i tasti Verde/Giallo" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "Specifica se i tasti verde e giallo si scambieranno anche premendo '0'." msgid "Show favorites menu" msgstr "Mostra il menu preferiti" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" "Un menu preferiti può mostrare un elenco delle tue trasmissioni preferite. Abilitalo se vuoi un menu supplementare in 'Adesso' e 'Prossimi'\n" "Qualsiasi ricerca può essere usata come preferita. Devi solo impostare l'opzione 'Utilizza nel menu preferiti' quando modifichi una ricerca." msgid "for the next ... hours" msgstr "per le prossime ... ore" msgid "Help$This value controls the timespan used to display your favorites." msgstr "Questo valore controlla il tipo di ora usata per visualizzare i tuoi preferiti." msgid "Use user-defined time" msgstr "Utilizza ora utente" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "All'interno di 'Adesso' e 'Prossimi' puoi specificare fino ad altre 4 ore nell'EPG che può essere usato ripetutamente premendo il tasto verde, esempio 'prima serata', 'tarda sera',..." msgid "Description" msgstr "Descrizione" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "Questa è la descrizione dell'ora definita dall'utente che apparirà come etichetta nel pulsante verde." msgid "Time" msgstr "Orario" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "Specifica l'ora definita qui dall'utente in 'HH:MM'." msgid "Use VDR's timer edit menu" msgstr "Utilizza menu modifica timer VDR" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" "Questo plugin ha il suo menu modifica timer che estende quello originale con alcune funzionalità extra come:\n" "- un voce directory supplementare\n" "- giorni della settimana definiti dall'utente per i timer ripetuti\n" "- aggiunta nome episodio\n" "- supporto per variabili EPG (vedi MANUAL)" msgid "Default recording dir" msgstr "Dir. predefinita registrazione" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "Quando si crea un timer puoi specificare una directory di registrazione." msgid "Add episode to manual timers" msgstr "Aggiungi episodi ai timer manuali" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" "Se crei un timer per le serie, puoi automaticamente aggiungere il nome episodio.\n" "\n" "- mai: nessuna aggiunta\n" "- sempre: aggiunge sempre un nome episodio se presente\n" "- veloce: lo aggiunge solo se l'evento termina in meno di 80 minuti" msgid "Default timer check method" msgstr "Metodo verifica timer predefinito" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" "I timer manuali possono essere verificati con le modifiche EPG. Qui puoi impostare il metodo di verifica predefinito per ciascun canale. Scegli tra:\n" "\n" "- nessuna verifica\n" "- ID evento: verifica da un ID evento fornito dall'emittente del canale.\n" "- canale e ora: verifica la corrispondenza della durata." msgid "Button$Setup" msgstr "Opzioni" msgid "Use search timers" msgstr "Utilizza timer di ricerca" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "'Cerca timer' può essere usato per creare automaticamente timer per eventi che corrispondano a criteri di ricerca." msgid " Update interval [min]" msgstr " Intervallo aggiorn. [min]" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "Specifica l'intervallo di tempo da usare durante la ricerca di eventi in sottofondo." msgid " SVDRP port" msgstr " Porta SVDRP" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "La programmazione di nuovi timer o la modifica dei timer viene fatta con SVDRP. Il valore predefinito dovrebbe essere corretto, quindi cambialo solo se sai cosa stai facendo." msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "Specifica qui la priorità predefinita dei timer creati con questo plugin. Questo valore può anche essere adattato per ciascuna ricerca." msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Specifica qui la durata predefinita dei timer/registrazioni creati con questo plugin. Questo valore può anche essere adattato per ciascuna ricerca." msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Specifica qui il margine predefinito di inizio della registrazione dei timer/registrazioni creati con questo plugin. Questo valore può anche essere adattato per ciascuna ricerca." msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "Specifica qui il margine predefinito di fine registrazione dei timer/registrazioni creati con questo plugin. Questo valore può anche essere adattato per ciascuna ricerca." msgid "No announcements when replaying" msgstr "Nessun annuncio durante riproduzione" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "Imposta 'sì' se non ti piace avere degli annunci dalle emittenti se stai attualmente riproducendo qualcosa." msgid "Recreate timers after deletion" msgstr "Ricrea timer dopo eliminazione" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "Imposta 'sì' se vuoi ricreare i timer con la successiva ricerca di aggiornamento timer dopo la loro eliminazione." msgid "Check if EPG exists for ... [h]" msgstr "Verifica se l'EPG esiste per ... [h]" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "Specifica quante ore degli EPG futuri dovrebbero essere notificati anche dopo un aggiornamento del timer di ricerca." msgid "Warn by OSD" msgstr "Notifica tramite OSD" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "Imposta 'sì' se vuoi avere una notifica OSD sulle verifiche EPG." msgid "Warn by mail" msgstr "Notifica tramite mail" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "Imposta 'sì' se vuoi avere una notifica email sulle verifiche EPG." msgid "Channel group to check" msgstr "Gruppo canali da verificare" msgid "Help$Specify the channel group to check." msgstr "Specifica il gruppo canali da verificare." msgid "Ignore PayTV channels" msgstr "Ignora i canali a pagamento" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "Imposta 'sì' se non vuoi vedere gli eventi dei canali a pagamento durante la ricerca delle repliche." msgid "Search templates" msgstr "Cerca modelli" msgid "Help$Here you can setup templates for your searches." msgstr "Qui puoi impostare i modelli per le ricerche." msgid "Blacklists" msgstr "Lista esclusioni" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "Qui puoi impostare le liste di esclusione che possono essere usate all'interno delle ricerche per escludere eventi che non ti piacciono." msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "Qui puoi impostare i gruppi di canali che possono essere usati all'interno di una ricerca. Questi sono diversi dai gruppi canali di VDR e rappresentano un insieme arbitrario di canali, ad esempio 'Gratuiti'." msgid "Ignore below priority" msgstr "Ignora priorità bassa" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Se un timer con priorità più bassa di un dato valore fallirà esso non sarà classificato come importante. Solo i conflitti importanti genereranno un messaggio OSD sul conflitto dopo una verifica automatica del conflitto." msgid "Ignore conflict duration less ... min." msgstr "Ignora durata conflitto minore ... min." msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "Se la durata di un conflitto è inferiore al numero di minuti dati non sarà classificato come importante. Solo i conflitti importanti genereranno un messaggio OSD sul conflitto dopo la verifica automatica di ciascun conflitto." msgid "Only check within next ... days" msgstr "Verifica solo entro i prossimi ... giorni" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "Questo valore riduce la verifica del conflitto ad un dato range di giorni. Tutti gli altri conflitti sono classificati come 'non ancora importanti'." msgid "--- Automatic checking ---" msgstr "--- Verifica automatica ---" msgid "After each timer programming" msgstr "Dopo program. di ciascun timer" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "Imposta 'sì' se il controllo di conflitto dovrebbe essere eseguito dopo la programmazione di ciascun timer manuale. Nel caso di un conflitto avrai immediatamente un messaggio che ti informa di questo. Il messaggio viene visualizzato solo se questo timer è coinvolto in qualche conflitto." msgid "When a recording starts" msgstr "Quando inizia una reg." msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "Imposta 'sì' se il controllo di conflitto dovrebbe essere eseguito dopo l'inizio di una registrazione. Nel caso di un conflitto avrai immediatamente un messaggio che ti informa di questo. Il messaggio viene visualizzato solo se questo conflitto avviene nelle prossime 2 ore." msgid "After each search timer update" msgstr "Dopo ogni aggiorn. timer ricerca" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "Imposta 'sì' se la verifica del conflitto dovrebbe essere eseguita dopo ciascun aggiornamento del timer di ricerca." msgid "every ... minutes" msgstr "ogni ... minuti" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" "Specifica qui l'intervallo da usare per la verifica automatica di un conflitto in sottofondo.\n" "('0' disabilita la verifica automatica)" msgid "if conflicts within next ... minutes" msgstr "in conflitto entro i prossimi ... minuti" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "Se il prossimo conflitto comparirà nel numero dato di minuti puoi specificare qui un intervallo di verifica più breve per avere più notifiche OSD su di esso." msgid "Avoid notification when replaying" msgstr "Evita notifiche durante riprod." msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "Imposta 'sì' se non vuoi avere messaggi OSD sui conflitti se stai riproducendo qualcosa. Tuttavia i messaggi saranno visualizzati se il primo conflitto avviene entro le prossime 2 ore." msgid "Search timer notification" msgstr "Notifica timer di ricerca" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "Imposta 'sì' se vuoi avere una email di notifica sui timer di ricerca che sono stati programmati automaticamente dal sistema." msgid "Time between mails [h]" msgstr "Tempo tra le email [h]" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" "Specifica quanto tempo in [h]\n" "vuoi almeno avere tra due email.\n" "Con '0' hai una nuova email dopo ogni\n" "aggiornamento del timer di ricerca\n" "con nuovi risultati." msgid "Timer conflict notification" msgstr "Notifica timer in conflitto" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "Imposta 'sì' se vuoi avere una notifica email sui timer in conflitto." msgid "Send to" msgstr "Invia a" msgid "Help$Specify the email address where notifications should be sent to." msgstr "Specifica l'indirizzo di posta al quale le notifiche dovrebbero essere spedite." msgid "Mail method" msgstr "Metodo email" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" "Specifica qui il metodo da usare per l'invio delle email.\n" "Puoi scegliere tra:\n" "- 'sendmail': richiede un proprio sistema email configurato\n" "- 'SendEmail.pl': semplice script per la consegna delle email" msgid "--- Email account ---" msgstr "--- Account email ---" msgid "Email address" msgstr "Indirizzo di posta" msgid "Help$Specify the email address where notifications should be sent from." msgstr "Specifica l'indirizzo di posta dal quale le notifiche dovrebbero essere spedite." msgid "SMTP server" msgstr "Server SMTP" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "Specifica il server SMTP che dovrebbe consegnare le notifiche. Se utilizza una porta diversa da quella di default (25) aggiungi la porta con \":porta\"." msgid "Use SMTP authentication" msgstr "Utilizza autenticazione SMTP" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "Imposta 'sì' se il tuo account ha bisogno di autenticazione per inviare email." msgid "Auth user" msgstr "Autenticazione utente" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "Specifica l'utente di autenticazione, se questo account ne ha bisogno per SMTP." msgid "Auth password" msgstr "Password autenticazione" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "Specifica la password di autenticazione, se quanto account ne ha bisogno per SMTP." msgid "Mail account check failed!" msgstr "Verifica account email fallita!" msgid "Button$Test" msgstr "Prova" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr " aáàbcdeéèfghiíìjklmnoóòpqrstuúùvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&°_" msgid "Start/Stop time has changed" msgstr "L'orario di Inizio/Fine è cambiato" msgid "Title/episode has changed" msgstr "Il Titolo/episodio è cambiato" msgid "No new timers were added." msgstr "Nessun nuovo timer aggiunto." msgid "No timers were modified." msgstr "Nessun timer modificato." msgid "No timers were deleted." msgstr "Nessun timer eliminato." msgid "No new events to announce." msgstr "Nessun nuovo evento da annunciare." msgid "This version of EPGSearch does not support this service!" msgstr "Questa versione di EPGSearch non supporta questo servizio!" msgid "EPGSearch does not exist!" msgstr "EPGSearch non esiste!" #, c-format msgid "%d new broadcast" msgstr "%d nuova emittente" msgid "Button$by channel" msgstr "Per canale" msgid "Button$by time" msgstr "Per orario" msgid "Button$Episode" msgstr "Episodio" msgid "Button$Title" msgstr "Titolo" msgid "announce details" msgstr "dettagli annuncio" msgid "announce again" msgstr "annuncia ancora" msgid "with next update" msgstr "con nuovo aggiornamento" msgid "again from" msgstr "ancora da" msgid "Search timer" msgstr "Cerca timer" msgid "Edit blacklist" msgstr "Modifica lista esclusioni" msgid "phrase" msgstr "frase" msgid "all words" msgstr "tutte le parole" msgid "at least one word" msgstr "almeno una parola" msgid "match exactly" msgstr "corrispondenza esatta" msgid "regular expression" msgstr "espressione regolare" msgid "fuzzy" msgstr "imprecisa" msgid "user-defined" msgstr "definito dall'utente" msgid "interval" msgstr "intervallo" msgid "channel group" msgstr "gruppo canali" msgid "only FTA" msgstr "solo gratuiti" msgid "Search term" msgstr "Termine ricerca" msgid "Search mode" msgstr "Modalità di ricerca" msgid "Tolerance" msgstr "Tolleranza" msgid "Match case" msgstr "Maiuscolo/Minuscolo" msgid "Use title" msgstr "Utilizza titolo" msgid "Use subtitle" msgstr "Utilizza sottotitolo" msgid "Use description" msgstr "Utilizza descrizione" msgid "Use extended EPG info" msgstr "Utilizza informazioni EPG estesa" msgid "Ignore missing categories" msgstr "Ignora categorie mancanti" msgid "Use channel" msgstr "Utilizza canale" msgid " from channel" msgstr " da canale" msgid " to channel" msgstr " a canale" msgid "Channel group" msgstr "Gruppo canali" msgid "Use time" msgstr "Utilizza orario" msgid " Start after" msgstr " Inizia dopo" msgid " Start before" msgstr " Inizia prima" msgid "Use duration" msgstr "Utilizza durata" msgid " Min. duration" msgstr " Durata Minima" msgid " Max. duration" msgstr " Durata Massima" msgid "Use day of week" msgstr "Utilizza giorno settimana" msgid "Day of week" msgstr "Giorno settimana" msgid "Use global" msgstr "Utilizza globale" msgid "Button$Templates" msgstr "Modelli" msgid "*** Invalid Channel ***" msgstr "*** Canale NON valido ***" msgid "Please check channel criteria!" msgstr "Controlla i criteri del canale!" msgid "Edit$Delete blacklist?" msgstr "Eliminare lista esclusioni?" msgid "Repeats" msgstr "Repliche" msgid "Create search" msgstr "Crea ricerca" msgid "Search in recordings" msgstr "Cerca nelle registrazioni" msgid "Mark as 'already recorded'?" msgstr "Segnare come 'già registrato'?" msgid "Add/Remove to/from switch list?" msgstr "Aggiungere/Rimuovere a/dalla lista modifiche?" msgid "Create blacklist" msgstr "Crea lista esclusioni" msgid "EPG Commands" msgstr "Comandi EPG" msgid "Already running!" msgstr "In esecuzione!" msgid "Add to switch list?" msgstr "Aggiungere alla lista modifiche?" msgid "Delete from switch list?" msgstr "Eliminare dalla lista modifiche?" msgid "Button$Details" msgstr "Dettagli" msgid "Button$Filter" msgstr "Filtro" msgid "Button$Show all" msgstr "Mostra tutti" msgid "conflicts" msgstr "conflitti" msgid "no conflicts!" msgstr "nessun conflitto!" msgid "no important conflicts!" msgstr "nessun conflitto importante!" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "Repliche" msgid "no check" msgstr "nessuna verifica" msgid "by channel and time" msgstr "per canale e ora" msgid "by event ID" msgstr "per ID evento" msgid "Select directory" msgstr "Seleziona directory" msgid "Button$Level" msgstr "Livello" msgid "Event" msgstr "Evento" msgid "Favorites" msgstr "Preferiti" msgid "Search results" msgstr "Risultati della ricerca" msgid "Timer conflict! Show?" msgstr "Conflitto timer! Mostrare?" msgid "Directory" msgstr "Directory" msgid "Channel" msgstr "Canale" msgid "Childlock" msgstr "Filtro famiglia" msgid "Timer check" msgstr "Verifica timer" msgid "recording with device" msgstr "registra con scheda" msgid "Button$With subtitle" msgstr "Con sottotitoli" msgid "Button$Without subtitle" msgstr "Senza sottotitoli" msgid "Button$Extended" msgstr "Esteso" msgid "Button$Simple" msgstr "Semplice" msgid "Use blacklists" msgstr "Utilizza lista esclusioni" msgid "Edit$Search text too short - use anyway?" msgstr "Il testo da cercare è troppo corto - continuare?" #, fuzzy msgid "Button$Orphaned" msgstr "Per canale" msgid "Button$by name" msgstr "Per nome" msgid "Button$by date" msgstr "Per data" msgid "Button$Delete all" msgstr "Elimina tutti" msgid "Recordings" msgstr "Registrazioni" msgid "Edit$Delete entry?" msgstr "Eliminare voce?" msgid "Edit$Delete all entries?" msgstr "Eliminare tutte le voci?" msgid "Summary" msgstr "Sommario" msgid "Auxiliary info" msgstr "Informazioni ausiliarie" msgid "Button$Aux info" msgstr "Info ausiliarie" msgid "Search actions" msgstr "Azioni ricerca" msgid "Execute search" msgstr "Esegui ricerca" msgid "Use as search timer on/off" msgstr "Utilizza come timer ricerca attivo/disattivo" msgid "Trigger search timer update" msgstr "Attiva aggiornamento timer ricerca" msgid "Show recordings done" msgstr "Mostra registrazioni completate" msgid "Show timers created" msgstr "Mostra timer creati" msgid "Create a copy" msgstr "Crea una copia" msgid "Use as template" msgstr "Utilizza come modello" msgid "Show switch list" msgstr "Mostra lista modifiche" msgid "Show blacklists" msgstr "Mostra lista esclusioni" msgid "Delete created timers?" msgstr "Eliminare timer creati?" msgid "Timer conflict check" msgstr "Verifica conflitti timer" msgid "Disable associated timers too?" msgstr "Disabilitare anche i timer associati?" msgid "Activate associated timers too?" msgstr "Attivare anche i timer associati?" msgid "Search timers activated in setup." msgstr "Timer di ricerca attivati nelle opzioni." msgid "Run search timer update?" msgstr "Eseguire aggiornamento ricerca timer?" msgid "Copy this entry?" msgstr "Copiare questo valore?" msgid "Copy" msgstr "Copia" msgid "Copy this entry to templates?" msgstr "Copiare questo valore nei modelli?" msgid "Delete all timers created from this search?" msgstr "Eliminare tutti i timer creati da questa ricerca?" msgid "Button$Actions" msgstr "Azioni" msgid "Search entries" msgstr "Valori ricerca" msgid "active" msgstr "attivo" msgid "Edit$Delete search?" msgstr "Eliminare criteri?" msgid "Edit search" msgstr "Modifica ricerca" msgid "Record" msgstr "Registra" msgid "Announce by OSD" msgstr "Annuncia tramite OSD" msgid "Switch only" msgstr "Cambia soltanto" msgid "Announce and switch" msgstr "Annuncia e cambia" msgid "Announce by mail" msgstr "Annuncia tramite email" msgid "only globals" msgstr "solo globali" msgid "Selection" msgstr "Selezione" msgid "all" msgstr "tutti" msgid "count recordings" msgstr "conteggia registrazioni" msgid "count days" msgstr "conteggia giorni" msgid "if present" msgstr "se presente" msgid "same day" msgstr "stesso giorno" msgid "same week" msgstr "stessa settimana" msgid "same month" msgstr "stesso mese" msgid "Template name" msgstr "Nome modello" msgid "Help$Specify the name of the template." msgstr "Specifica il nome del modello." msgid "Help$Specify here the term to search for." msgstr "Specifica qui il termine da cercare." msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" "Esistono i seguenti metodi di ricerca:\n" "\n" "- frase: ricerca per sotto termini\n" "- tutte le parole: tutte le singole parole presenti\n" "- almeno una parola: almeno una parola presente\n" "- esatta corrispondenza: deve corrispondere esattamente\n" "- espressione regolare: corrisponde a una espressione regolare\n" "- ricerca imprecisa: ricerca approssimativamente" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "Questo imposta la tolleranza della ricerca imprecisa. Il valore rappresenta gli errori ammessi." msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "Imposta 'Sì' nel caso la ricerca dovesse corrispondere." msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "Imposta 'Sì' se vuoi cercare il titolo di un evento." msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "Imposta 'Sì' se vuoi cercare l'episodio di un evento." msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "Imposta 'Sì' se vuoi cercare il sommario di un evento." msgid "Use content descriptor" msgstr "Utilizza contenuto descrizione" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "Imposta 'Sì' se vuoi cercare i contenuti per descrizione." msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "Il sommario di un evento, può contenere informazione addizionale come 'Genere', 'Categoria', 'Anno',... chiamata 'Categorie EPG' all'interno di EPGSearch. I fornitori di EPG esterni spesso inviano questa informazione. Questo ti permette di rifinire una ricerca e altre cosette, come la ricerca per il 'consiglio del giorno'. Per usarlo imposta 'Sì'." msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "Il file epgsearchcats.conf specifica la modalità di ricerca per questo valore. Uno può cercare per testo o per valore. Puoi anche modificare un elenco di valori predefiniti in questo file che può essere qui selezionato." msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "Se una categoria selezionata non è parte del sommario di un evento questo normalmente esclude questo evento dai risultati di ricerca. Per evitare ciò, imposta 'Sì' come opzione, ma gestiscilo con attenzione per evitare una grande quantità di risultati." msgid "Use in favorites menu" msgstr "Utilizza nel menu preferiti" msgid "Result menu layout" msgstr "Disposizione menu risultati" msgid "Use as search timer" msgstr "Utilizza come timer di ricerca" msgid "Action" msgstr "Azione" msgid "Switch ... minutes before start" msgstr "Cambia ... minuti prima dell'inizio" msgid "Unmute sound" msgstr "Togli suono muto" msgid "Ask ... minutes before start" msgstr "Chiedi ... minuti prima dell'inizio" msgid " Series recording" msgstr " Registrazione di serie" msgid "Delete recordings after ... days" msgstr "Elimina registrazioni dopo ... giorni" msgid "Keep ... recordings" msgstr "Mantieni ... registrazioni" msgid "Pause when ... recordings exist" msgstr "Pausa, quando ... la registrazione esiste" msgid "Avoid repeats" msgstr "Evita repliche" msgid "Allowed repeats" msgstr "Permetti repliche" msgid "Only repeats within ... days" msgstr "Solo repliche entro ... giorni" msgid "Compare title" msgstr "Confronta titolo" msgid "Compare subtitle" msgstr "Confronta sottotitolo" msgid "Compare summary" msgstr "Confronta sommario" msgid "Min. match in %" msgstr "Corrispondenza min. in %" msgid "Compare date" msgstr "Confronta date" msgid "Compare categories" msgstr "Confronta categorie" msgid "VPS" msgstr "VPS" msgid "Auto delete" msgstr "Auto elimina" msgid "after ... recordings" msgstr "dopo ... registrazioni" msgid "after ... days after first rec." msgstr "dopo ... giorni dopo prima reg." msgid "Edit user-defined days of week" msgstr "Modifica giorni della settimana definiti dall'utente" msgid "Compare" msgstr "Confronta" msgid "Select blacklists" msgstr "Seleziona lista esclusioni" msgid "Values for EPG category" msgstr "Valori per la categoria EPG" msgid "Button$Apply" msgstr "Applica" msgid "less" msgstr "minore" msgid "less or equal" msgstr "minore o uguale" msgid "greater" msgstr "maggiore" msgid "greater or equal" msgstr "maggiore o uguale" msgid "equal" msgstr "uguale" msgid "not equal" msgstr "non uguale" msgid "Activation of search timer" msgstr "Attivazione timer ricerca" msgid "First day" msgstr "Primo giorno" msgid "Last day" msgstr "Ultimo giorno" msgid "Button$all channels" msgstr "Tutti i canali" msgid "Button$only FTA" msgstr "Solo gratuiti" msgid "Button$Timer preview" msgstr "Anteprima timer" msgid "Blacklist results" msgstr "Risultati lista esclusioni" msgid "found recordings" msgstr "registrazioni trovate" msgid "Error while accessing recording!" msgstr "Errore durante l'accesso alla registrazione!" msgid "Button$Default" msgstr "Predefinito" msgid "Edit$Delete template?" msgstr "Eliminare modello?" msgid "Overwrite existing entries?" msgstr "Sovrascrivere valori esistenti?" msgid "Edit entry" msgstr "Modifica valore" msgid "Switch" msgstr "Cambia" msgid "Announce only" msgstr "Solo annuncio" msgid "Announce ... minutes before start" msgstr "Annuncia ... minuti prima dell'inizio" msgid "action at" msgstr "azione alle" msgid "Switch list" msgstr "Lista modifiche" msgid "Edit template" msgstr "Modifica modello" msgid "Timers" msgstr "Timer" msgid ">>> no info! <<<" msgstr ">>> nessuna informazione! <<<" msgid "Overview" msgstr "Sommario" msgid "Button$Favorites" msgstr "Preferiti" msgid "Quick search for broadcasts" msgstr "Ricerca veloce per emittenti" msgid "Quick search" msgstr "Ricerca veloce" msgid "Show in main menu" msgstr "Mostra nel menu principale" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "%d nuove emittenti trovate! Mostrarle?" msgid "Search timer update done!" msgstr "Aggiornamento timer ricerca completato!" #, c-format msgid "small EPG content on:%s" msgstr "contenuto piccoli EPG su:%s" msgid "VDR EPG check warning" msgstr "Notifica verifica EPG di VDR" #, c-format msgid "Switch to (%d) '%s'?" msgstr "Cambiare a (%d) '%s'?" msgid "Programming timer failed!" msgstr "Programmazione timer fallito!" #~ msgid "in %02ldd" #~ msgstr "in %02ldd" #~ msgid "in %02ldh" #~ msgstr "in %02ldh" #~ msgid "in %02ldm" #~ msgstr "in %02ldm" #~ msgid "File" #~ msgstr "File" #~ msgid "Day" #~ msgstr "Giorno" vdr-plugin-epgsearch/po/pl_PL.po0000644000175000017500000005633512466747543016452 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Michael Rakowski , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-05 20:24+0100\n" "PO-Revision-Date: 2007-08-14 20:21+0200\n" "Last-Translator: Michael Rakowski \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel groups" msgstr "" msgid "Button$Select" msgstr "" msgid "Channel group used by:" msgstr "" msgid "Edit$Delete group?" msgstr "" msgid "Edit channel group" msgstr "" msgid "Group name" msgstr "" msgid "Button$Invert selection" msgstr "" msgid "Button$All yes" msgstr "" msgid "Button$All no" msgstr "" msgid "Group name is empty!" msgstr "" msgid "Group name already exists!" msgstr "" msgid "Direct access to epgsearch's conflict check menu" msgstr "" msgid "Timer conflicts" msgstr "" msgid "Conflict info in main menu" msgstr "" msgid "next" msgstr "" #, c-format msgid "timer conflict at %s! Show it?" msgstr "" #, c-format msgid "%d timer conflicts! First at %s. Show them?" msgstr "" msgid "search the EPG for repeats and more" msgstr "" msgid "Program guide" msgstr "" #, fuzzy msgid "search timer update running" msgstr "/oui" msgid "Direct access to epgsearch's search menu" msgstr "" msgid "Search" msgstr "" msgid "EpgSearch-Search in main menu" msgstr "" msgid "Button$Help" msgstr "" msgid "Standard" msgstr "" msgid "Button$Commands" msgstr "" msgid "Button$Search" msgstr "" msgid "never" msgstr "" msgid "always" msgstr "" msgid "smart" msgstr "" msgid "before user-def. times" msgstr "" msgid "after user-def. times" msgstr "" msgid "before 'next'" msgstr "" msgid "General" msgstr "" msgid "EPG menus" msgstr "" msgid "User-defined EPG times" msgstr "" msgid "Timer programming" msgstr "" msgid "Search and search timers" msgstr "" msgid "Timer conflict checking" msgstr "" msgid "Email notification" msgstr "" msgid "Hide main menu entry" msgstr "" msgid "Help$Hides the main menu entry and may be useful if this plugin is used to replace the original 'Schedule' entry." msgstr "" msgid "Main menu entry" msgstr "" msgid "Help$The name of the main menu entry which defaults to 'Programm guide'." msgstr "" msgid "Replace original schedule" msgstr "" msgid "Help$When VDR is patched to allow this plugin to replace the original 'Schedule' entry, you can de/activate this replacement here." msgstr "" msgid "Start menu" msgstr "" msgid "Help$Choose between 'Overview - Now' and 'Schedule' as start menu when this plugin is called." msgstr "" msgid "Ok key" msgstr "" msgid "" "Help$Choose here the behaviour of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel.\n" "Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting." msgstr "" msgid "Red key" msgstr "" msgid "" "Help$Choose which standard function ('Record' or 'Commands') you like to have on the red key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Blue key" msgstr "" msgid "" "Help$Choose which standard function ('Switch'/'Info' or 'Search') you like to have on the blue key.\n" "(Can be toggled with key '0')" msgstr "" msgid "Show progress in 'Now'" msgstr "" msgid "Help$Shows a progressbar in 'Overview - Now' that informs about the remaining time of the current event." msgstr "" msgid "Show channel numbers" msgstr "" msgid "" "Help$Display channel numbers in 'Overview - Now'.\n" "\n" "(To completely define your own menu look please inspect the MANUAL)" msgstr "" msgid "Show channel separators" msgstr "" msgid "Help$Display VDR channel groups as separators between your channels in 'Overview - Now'." msgstr "" msgid "Show day separators" msgstr "" msgid "Help$Display a separator line at day break in 'Schedule'." msgstr "" msgid "Show radio channels" msgstr "" msgid "Help$Show also radio channels." msgstr "" msgid "Limit channels from 1 to" msgstr "" msgid "Help$If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit." msgstr "" msgid "'One press' timer creation" msgstr "" msgid "Help$When a timer is created with 'Record' you can choose between an immediate creation of the timer or the display of the timer edit menu." msgstr "" msgid "Show channels without EPG" msgstr "" msgid "Help$Choose 'yes' here if you want to display channels without EPG in 'Overview - Now'. 'Ok' on these entries switches the channel." msgstr "" msgid "Time interval for FRew/FFwd [min]" msgstr "" msgid "" "Help$Choose here the time interval which should be used for jumping through the EPG by pressing FRew/FFwd.\n" "\n" "(If you don't have those keys, you can toggle to this functionality pressing '0' and get '<<' and '>>' on the keys green and yellow)" msgstr "" msgid "Toggle Green/Yellow" msgstr "" msgid "Help$Specify if green and yellow shall also be switched when pressing '0'." msgstr "" msgid "Show favorites menu" msgstr "" msgid "" "Help$A favorites menu can display a list of your favorite broadcasts. Enable this if you want an additional menu besides 'Now' and 'Next'\n" "Any search can be used as a favorite. You only have to set the option 'Use in favorites menu' when editing a search." msgstr "" msgid "for the next ... hours" msgstr "" msgid "Help$This value controls the timespan used to display your favorites." msgstr "" msgid "Use user-defined time" msgstr "" msgid "Help$Besides 'Now' and 'Next' you can specify up to 4 other times in the EPG which can be used by repeatedly pressing the green key, e.g. 'prime time', 'late night',..." msgstr "" msgid "Description" msgstr "" msgid "Help$This is the description for your user-defined time as it will appear as label on the green button." msgstr "" msgid "Time" msgstr "" msgid "Help$Specify the user-defined time here in 'HH:MM'." msgstr "" msgid "Use VDR's timer edit menu" msgstr "" msgid "" "Help$This plugin has its own timer edit menu extending the original one with some extra functionality like\n" "- an additional directory entry\n" "- user-defined days of week for repeating timers\n" "- adding an episode name\n" "- support for EPG variables (see MANUAL)" msgstr "" msgid "Default recording dir" msgstr "" msgid "Help$When creating a timer you can specify here a default recording directory." msgstr "" msgid "Add episode to manual timers" msgstr "" msgid "" "Help$If you create a timer for a series, you can automatically add the episode name.\n" "\n" "- never: no addition\n" "- always: always add episode name if present\n" "- smart: add only if event lasts less than 80 mins." msgstr "" msgid "Default timer check method" msgstr "" msgid "" "Help$Manual timers can be checked for EPG changes. Here you can setup the default check method for each channel. Choose between\n" "\n" "- no checking\n" "- by event ID: checks by an event ID supplied by the channel provider.\n" "- by channel and time: check by the duration match." msgstr "" msgid "Button$Setup" msgstr "Nastawy" msgid "Use search timers" msgstr "" msgid "Help$'Search timers' can be used to automatically create timers for events that match your search criterions." msgstr "" msgid " Update interval [min]" msgstr "" msgid "Help$Specify here the time intervall to be used when searching for events in the background." msgstr "" msgid " SVDRP port" msgstr "" msgid "Help$Programming of new timers or timer changes is done with SVDRP. The default value should be correct, so change it only if you know what you are doing." msgstr "" msgid "Help$Specify here the default priority of timers created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default lifetime of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default start recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "Help$Specify here the default stop recording margin of timers/recordings created with this plugin. This value can also be adjusted for each search itself." msgstr "" msgid "No announcements when replaying" msgstr "" msgid "Help$Set this to 'yes' if you don't like to get any announcements of broadcasts if you currently replay anything." msgstr "" msgid "Recreate timers after deletion" msgstr "" msgid "Help$Set this to 'yes' if you want timers to be recreated with the next search timer update after deleting them." msgstr "" msgid "Check if EPG exists for ... [h]" msgstr "" msgid "Help$Specify how many hours of future EPG there should be and get warned else after a search timer update." msgstr "" msgid "Warn by OSD" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check via OSD." msgstr "" msgid "Warn by mail" msgstr "" msgid "Help$Set this to 'yes' if you want get warnings from the EPG check by mail." msgstr "" msgid "Channel group to check" msgstr "" msgid "Help$Specify the channel group to check." msgstr "" msgid "Ignore PayTV channels" msgstr "" msgid "Help$Set this to 'yes' if don't want to see events on PayTV channels when searching for repeats." msgstr "" msgid "Search templates" msgstr "" msgid "Help$Here you can setup templates for your searches." msgstr "" msgid "Blacklists" msgstr "" msgid "Help$Here you can setup blacklists which can be used within a search to exclude events you don't like." msgstr "" msgid "Help$Here you can setup channel groups which can be used within a search. These are different to VDR channel groups and represent a set of arbitrary channels, e.g. 'FreeTV'." msgstr "" msgid "Ignore below priority" msgstr "" msgid "Help$If a timer with priority below the given value will fail it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Ignore conflict duration less ... min." msgstr "" msgid "Help$If a conflicts duration is less then the given number of minutes it will not be classified as important. Only important conflicts will produce an OSD message about the conflict after an automatic conflict check." msgstr "" msgid "Only check within next ... days" msgstr "" msgid "Help$This value reduces the conflict check to the given range of days. All other conflicts are classified as 'not yet important'." msgstr "" msgid "--- Automatic checking ---" msgstr "" msgid "After each timer programming" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each manual timer programming. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if this timer is involved in any conflict." msgstr "" msgid "When a recording starts" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed when a recording starts. In the case of a conflict you get immediately a message that informs you about it. The message is only displayed if the conflict is within the next 2 hours." msgstr "" msgid "After each search timer update" msgstr "" msgid "Help$Set this to 'yes' if the conflict check should be performed after each search timer update." msgstr "" msgid "every ... minutes" msgstr "" msgid "" "Help$Specify here the time intervall to be used for an automatic conflict check in the background.\n" "('0' disables an automatic check)" msgstr "" msgid "if conflicts within next ... minutes" msgstr "" msgid "Help$If the next conflict will appear in the given number of minutes you can specify here a shorter check intervall to get more OSD notifications about it." msgstr "" msgid "Avoid notification when replaying" msgstr "" msgid "Help$Set this to 'yes' if the don't want to get OSD messages about conflicts if you currently replay something. Nevertheless messages will be displayed if the first upcoming conflict is within the next 2 hours." msgstr "" msgid "Search timer notification" msgstr "/oui" msgid "Help$Set this to 'yes' if you want to get an email notification about the search timers that where programmed automatically in the background." msgstr "" msgid "Time between mails [h]" msgstr "" msgid "" "Help$Specifiy how much time in [h] you would\n" "like to have atleast between two mails.\n" "With '0' you get a new mail after each\n" "search timer update with new results." msgstr "" msgid "Timer conflict notification" msgstr "" msgid "Help$Set this to 'yes' if you want to get an email notification about the timer conflicts." msgstr "" msgid "Send to" msgstr "" msgid "Help$Specify the email address where notifications should be sent to." msgstr "" msgid "Mail method" msgstr "" msgid "" "Help$Specify here the method to use when sending mails.\n" "You can choose between\n" " - 'sendmail': requires a properly configured email system\n" " - 'SendEmail.pl': simple script for mail delivery" msgstr "" msgid "--- Email account ---" msgstr "" msgid "Email address" msgstr "" msgid "Help$Specify the email address where notifications should be sent from." msgstr "" msgid "SMTP server" msgstr "" msgid "Help$Specify the SMTP server that should deliver the notifications. If it's using a port different from the default(25) append the port with \":port\"." msgstr "" msgid "Use SMTP authentication" msgstr "" msgid "Help$Set this to 'yes' if your account needs authentication to send mails." msgstr "" msgid "Auth user" msgstr "" msgid "Help$Specify the auth user, if this account needs authentication for SMTP." msgstr "" msgid "Auth password" msgstr "" msgid "Help$Specify the auth password, if this account needs authentication for SMTP." msgstr "" msgid "Mail account check failed!" msgstr "" msgid "Button$Test" msgstr "" msgid "$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&_" msgstr "" msgid "Start/Stop time has changed" msgstr "" msgid "Title/episode has changed" msgstr "" msgid "No new timers were added." msgstr "" msgid "No timers were modified." msgstr "" msgid "No timers were deleted." msgstr "" msgid "No new events to announce." msgstr "" msgid "This version of EPGSearch does not support this service!" msgstr "" msgid "EPGSearch does not exist!" msgstr "" #, c-format msgid "%d new broadcast" msgstr "" msgid "Button$by channel" msgstr "" msgid "Button$by time" msgstr "" msgid "Button$Episode" msgstr "" msgid "Button$Title" msgstr "" msgid "announce details" msgstr "" msgid "announce again" msgstr "" msgid "with next update" msgstr "" msgid "again from" msgstr "" msgid "Search timer" msgstr "" msgid "Edit blacklist" msgstr "" msgid "phrase" msgstr "" msgid "all words" msgstr "" msgid "at least one word" msgstr "" msgid "match exactly" msgstr "" msgid "regular expression" msgstr "" msgid "fuzzy" msgstr "" msgid "user-defined" msgstr "" msgid "interval" msgstr "" msgid "channel group" msgstr "" msgid "only FTA" msgstr "" msgid "Search term" msgstr "" msgid "Search mode" msgstr "" msgid "Tolerance" msgstr "" msgid "Match case" msgstr "" msgid "Use title" msgstr "" msgid "Use subtitle" msgstr "" msgid "Use description" msgstr "" msgid "Use extended EPG info" msgstr "" msgid "Ignore missing categories" msgstr "" msgid "Use channel" msgstr "" msgid " from channel" msgstr "" msgid " to channel" msgstr "" msgid "Channel group" msgstr "" msgid "Use time" msgstr "" msgid " Start after" msgstr "" msgid " Start before" msgstr "" msgid "Use duration" msgstr "" msgid " Min. duration" msgstr "" msgid " Max. duration" msgstr "" msgid "Use day of week" msgstr "" msgid "Day of week" msgstr "" msgid "Use global" msgstr "" msgid "Button$Templates" msgstr "" msgid "*** Invalid Channel ***" msgstr "" msgid "Please check channel criteria!" msgstr "" msgid "Edit$Delete blacklist?" msgstr "" msgid "Repeats" msgstr "" msgid "Create search" msgstr "" msgid "Search in recordings" msgstr "" msgid "Mark as 'already recorded'?" msgstr "" msgid "Add/Remove to/from switch list?" msgstr "" msgid "Create blacklist" msgstr "" msgid "EPG Commands" msgstr "" msgid "Already running!" msgstr "" msgid "Add to switch list?" msgstr "" msgid "Delete from switch list?" msgstr "" msgid "Button$Details" msgstr "" msgid "Button$Filter" msgstr "" msgid "Button$Show all" msgstr "" msgid "conflicts" msgstr "" msgid "no conflicts!" msgstr "" msgid "no important conflicts!" msgstr "" msgid "C" msgstr "C" msgid "Button$Repeats" msgstr "" msgid "no check" msgstr "" msgid "by channel and time" msgstr "" msgid "by event ID" msgstr "" msgid "Select directory" msgstr "" msgid "Button$Level" msgstr "" msgid "Event" msgstr "" msgid "Favorites" msgstr "" msgid "Search results" msgstr "" msgid "Timer conflict! Show?" msgstr "" msgid "Directory" msgstr "" msgid "Channel" msgstr "" msgid "Childlock" msgstr "" msgid "Timer check" msgstr "" msgid "recording with device" msgstr "" msgid "Button$With subtitle" msgstr "" msgid "Button$Without subtitle" msgstr "" msgid "Button$Extended" msgstr "" msgid "Button$Simple" msgstr "" msgid "Use blacklists" msgstr "" msgid "Edit$Search text too short - use anyway?" msgstr "" msgid "Button$Orphaned" msgstr "" msgid "Button$by name" msgstr "" msgid "Button$by date" msgstr "" msgid "Button$Delete all" msgstr "" msgid "Recordings" msgstr "" msgid "Edit$Delete entry?" msgstr "" msgid "Edit$Delete all entries?" msgstr "" msgid "Summary" msgstr "" msgid "Auxiliary info" msgstr "" msgid "Button$Aux info" msgstr "" msgid "Search actions" msgstr "" msgid "Execute search" msgstr "" msgid "Use as search timer on/off" msgstr "" msgid "Trigger search timer update" msgstr "" msgid "Show recordings done" msgstr "" msgid "Show timers created" msgstr "" msgid "Create a copy" msgstr "" msgid "Use as template" msgstr "" msgid "Show switch list" msgstr "" msgid "Show blacklists" msgstr "" msgid "Delete created timers?" msgstr "" msgid "Timer conflict check" msgstr "" msgid "Disable associated timers too?" msgstr "" msgid "Activate associated timers too?" msgstr "" msgid "Search timers activated in setup." msgstr "" msgid "Run search timer update?" msgstr "" msgid "Copy this entry?" msgstr "" msgid "Copy" msgstr "" msgid "Copy this entry to templates?" msgstr "" msgid "Delete all timers created from this search?" msgstr "" msgid "Button$Actions" msgstr "" msgid "Search entries" msgstr "" msgid "active" msgstr "" msgid "Edit$Delete search?" msgstr "" msgid "Edit search" msgstr "" msgid "Record" msgstr "Nagraj" msgid "Announce by OSD" msgstr "" msgid "Switch only" msgstr "" msgid "Announce and switch" msgstr "" msgid "Announce by mail" msgstr "" msgid "only globals" msgstr "" msgid "Selection" msgstr "" msgid "all" msgstr "" msgid "count recordings" msgstr "" msgid "count days" msgstr "" msgid "if present" msgstr "" msgid "same day" msgstr "" msgid "same week" msgstr "" msgid "same month" msgstr "" msgid "Template name" msgstr "" msgid "Help$Specify the name of the template." msgstr "" msgid "Help$Specify here the term to search for." msgstr "" msgid "" "Help$The following search modes exist:\n" "\n" "- phrase: searches for sub terms\n" "- all words: all single words must appear\n" "- at least one word: at least one single word must appear\n" "- match exactly: must match exactly\n" "- regular expression: match a regular expression\n" "- fuzzy searching: searches approximately" msgstr "" msgid "Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors." msgstr "" msgid "Help$Set this to 'Yes' if your search should match the case." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the title of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the episode of an event." msgstr "" msgid "Help$Set this to 'Yes' if you like to search in the summary of an event." msgstr "" msgid "Use content descriptor" msgstr "" msgid "Help$Set this to 'Yes' if you want to search the contents by a descriptor." msgstr "" msgid "Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'." msgstr "" msgid "Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here." msgstr "" msgid "Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results." msgstr "" msgid "Use in favorites menu" msgstr "" msgid "Result menu layout" msgstr "" msgid "Use as search timer" msgstr "" msgid "Action" msgstr "" msgid "Switch ... minutes before start" msgstr "" msgid "Unmute sound" msgstr "" msgid "Ask ... minutes before start" msgstr "" msgid " Series recording" msgstr "" msgid "Delete recordings after ... days" msgstr "" msgid "Keep ... recordings" msgstr "" msgid "Pause when ... recordings exist" msgstr "" msgid "Avoid repeats" msgstr "" msgid "Allowed repeats" msgstr "" msgid "Only repeats within ... days" msgstr "" msgid "Compare title" msgstr "" msgid "Compare subtitle" msgstr "" msgid "Compare summary" msgstr "" msgid "Min. match in %" msgstr "" msgid "Compare date" msgstr "" msgid "Compare categories" msgstr "" msgid "VPS" msgstr "" msgid "Auto delete" msgstr "" msgid "after ... recordings" msgstr "" msgid "after ... days after first rec." msgstr "" msgid "Edit user-defined days of week" msgstr "" msgid "Compare" msgstr "" msgid "Select blacklists" msgstr "" msgid "Values for EPG category" msgstr "" msgid "Button$Apply" msgstr "" msgid "less" msgstr "" msgid "less or equal" msgstr "" msgid "greater" msgstr "" msgid "greater or equal" msgstr "" msgid "equal" msgstr "" msgid "not equal" msgstr "" msgid "Activation of search timer" msgstr "" msgid "First day" msgstr "" msgid "Last day" msgstr "" msgid "Button$all channels" msgstr "" msgid "Button$only FTA" msgstr "" msgid "Button$Timer preview" msgstr "" msgid "Blacklist results" msgstr "" msgid "found recordings" msgstr "" msgid "Error while accessing recording!" msgstr "" msgid "Button$Default" msgstr "" msgid "Edit$Delete template?" msgstr "" msgid "Overwrite existing entries?" msgstr "" msgid "Edit entry" msgstr "" msgid "Switch" msgstr "" msgid "Announce only" msgstr "" msgid "Announce ... minutes before start" msgstr "" msgid "action at" msgstr "" msgid "Switch list" msgstr "" msgid "Edit template" msgstr "" msgid "Timers" msgstr "" msgid ">>> no info! <<<" msgstr "" msgid "Overview" msgstr "" msgid "Button$Favorites" msgstr "" msgid "Quick search for broadcasts" msgstr "" msgid "Quick search" msgstr "" msgid "Show in main menu" msgstr "" #, c-format msgid "%d new broadcast(s) found! Show them?" msgstr "" msgid "Search timer update done!" msgstr "" #, c-format msgid "small EPG content on:%s" msgstr "" msgid "VDR EPG check warning" msgstr "" #, c-format msgid "Switch to (%d) '%s'?" msgstr "" msgid "Programming timer failed!" msgstr "" vdr-plugin-epgsearch/menu_blacklistedit.c0000644000175000017500000003342112466747543020463 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "menu_blacklistedit.h" #include "changrp.h" #include "epgsearchcats.h" #include "epgsearchtools.h" #include "menu_dirselect.h" #include "menu_searchedit.h" #include "menu_searchtemplate.h" #include "epgsearchcfg.h" #include extern cChannelGroups ChannelGroups; extern cSearchExtCats SearchExtCats; extern const char AllowedChars[]; // --- cMenuBlacklistEdit -------------------------------------------------------- cMenuBlacklistEdit::cMenuBlacklistEdit(cBlacklist *Blacklist, bool New) :cOsdMenu(tr("Edit blacklist"),32) { #if VDRVERSNUM >= 10734 SetMenuCategory(mcSetupPlugins); #endif SearchModes[0] = strdup(tr("phrase")); SearchModes[1] = strdup(tr("all words")); SearchModes[2] = strdup(tr("at least one word")); SearchModes[3] = strdup(tr("match exactly")); SearchModes[4] = strdup(tr("regular expression")); SearchModes[5] = strdup(tr("fuzzy")); DaysOfWeek[0] = strdup(WeekDayName(0)); DaysOfWeek[1] = strdup(WeekDayName(1)); DaysOfWeek[2] = strdup(WeekDayName(2)); DaysOfWeek[3] = strdup(WeekDayName(3)); DaysOfWeek[4] = strdup(WeekDayName(4)); DaysOfWeek[5] = strdup(WeekDayName(5)); DaysOfWeek[6] = strdup(WeekDayName(6)); DaysOfWeek[7] = strdup(tr("user-defined")); UseChannelSel[0] = strdup(trVDR("no")); UseChannelSel[1] = strdup(tr("interval")); UseChannelSel[2] = strdup(tr("channel group")); UseChannelSel[3] = strdup(tr("only FTA")); if (New) { cSearchExt* SearchTempl = NULL; // copy the default settings, if we have a default template cMutexLock SearchTemplatesLock(&SearchTemplates); cSearchExt *SearchExtTempl = SearchTemplates.First(); while (SearchExtTempl) { if (SearchExtTempl->ID == EPGSearchConfig.DefSearchTemplateID) SearchTempl = SearchExtTempl; SearchExtTempl = SearchTemplates.Next(SearchExtTempl); } if (SearchTempl) Blacklist->CopyFromTemplate(SearchTempl); } blacklist = Blacklist; addIfConfirmed = New; if (blacklist) { data = *blacklist; UserDefDayOfWeek = 0; if (blacklist->DayOfWeek < 0) { UserDefDayOfWeek = blacklist->DayOfWeek; data.DayOfWeek = 7; } menuitemsChGr = NULL; channelGroupName = NULL; channelMin = channelMax = cDevice::CurrentChannel(); channelGroupNr = 0; if (data.useChannel==1) { channelMin = data.channelMin->Number(); channelMax = data.channelMax->Number(); } if (data.useChannel==2) { channelGroupNr = ChannelGroups.GetIndex(data.channelGroup); if (channelGroupNr == -1) { free(data.channelGroup); data.channelGroup = NULL; channelGroupNr = 0; // no selection } else { channelGroupName = strdup(data.channelGroup); channelGroupNr++; } } catvaluesNumeric = NULL; if (SearchExtCats.Count() > 0) { catvaluesNumeric = (int*) malloc(SearchExtCats.Count() * sizeof(int)); cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { catvaluesNumeric[index] = atol(blacklist->catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } } Set(); } } void cMenuBlacklistEdit::Set() { int current = Current(); Clear(); Add(new cMenuEditStrItem( tr("Search term"), data.search, sizeof(data.search), tr(AllowedChars))); Add(new cMenuEditStraItem(tr("Search mode"), &data.mode, 6, SearchModes)); if (data.mode == 5) // fuzzy Add(new cMenuEditIntItem(IndentMenuItem(tr("Tolerance")), &data.fuzzyTolerance, 1, 9)); Add(new cMenuEditBoolItem( tr("Match case"), &data.useCase, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem( tr("Use title"), &data.useTitle, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem( tr("Use subtitle"), &data.useSubtitle, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem( tr("Use description"), &data.useDescription, trVDR("no"), trVDR("yes"))); // show Categories only if we have them if (SearchExtCats.Count() > 0) { Add(new cMenuEditBoolItem( tr("Use extended EPG info"), &data.useExtEPGInfo, trVDR("no"), trVDR("yes"))); if (data.useExtEPGInfo) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { if (SearchExtCat->searchmode >= 10) Add(new cMenuEditIntItem(IndentMenuItem(SearchExtCat->menuname), &catvaluesNumeric[index], 0, 999999, "")); else Add(new cMenuEditStrItem( IndentMenuItem(SearchExtCat->menuname), data.catvalues[index], MaxFileName, tr(AllowedChars))); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } Add(new cMenuEditBoolItem(IndentMenuItem(tr("Ignore missing categories")), &data.ignoreMissingEPGCats, trVDR("no"), trVDR("yes"))); } } Add(new cMenuEditStraItem(tr("Use channel"), &data.useChannel, 4, UseChannelSel)); if (data.useChannel==1) { Add(new cMenuEditChanItem(tr(" from channel"), &channelMin)); Add(new cMenuEditChanItem(tr(" to channel"), &channelMax)); } if (data.useChannel==2) { // create the char array for the menu display if (menuitemsChGr) delete [] menuitemsChGr; menuitemsChGr = ChannelGroups.CreateMenuitemsList(); int oldchannelGroupNr = channelGroupNr; channelGroupNr = ChannelGroups.GetIndex(channelGroupName); if (channelGroupNr == -1) { if (oldchannelGroupNr > 0 && oldchannelGroupNr <= ChannelGroups.Count()) // perhaps its name was changed channelGroupNr = oldchannelGroupNr; else channelGroupNr = 0; // no selection } else channelGroupNr++; Add(new cMenuEditStraItem(IndentMenuItem(tr("Channel group")), &channelGroupNr, ChannelGroups.Count()+1, menuitemsChGr)); } Add(new cMenuEditBoolItem( tr("Use time"), &data.useTime, trVDR("no"), trVDR("yes"))); if (data.useTime == true) { Add(new cMenuEditTimeItem(tr(" Start after"), &data.startTime)); Add(new cMenuEditTimeItem(tr(" Start before"), &data.stopTime)); } Add(new cMenuEditBoolItem( tr("Use duration"), &data.useDuration, trVDR("no"), trVDR("yes"))); if (data.useDuration == true) { Add(new cMenuEditTimeItem(tr(" Min. duration"), &data.minDuration)); Add(new cMenuEditTimeItem(tr(" Max. duration"), &data.maxDuration)); } Add(new cMenuEditBoolItem( tr("Use day of week"), &data.useDayOfWeek, trVDR("no"), trVDR("yes"))); if (data.useDayOfWeek) { if (data.DayOfWeek < 0) { UserDefDayOfWeek = data.DayOfWeek; data.DayOfWeek = 7; } Add(new cMenuEditStraItem(IndentMenuItem(tr("Day of week")), &data.DayOfWeek, 8, DaysOfWeek)); } Add(new cMenuEditBoolItem( tr("Use global"), &data.isGlobal, trVDR("no"), trVDR("yes"))); SetCurrent(Get(current)); } cMenuBlacklistEdit::~cMenuBlacklistEdit() { if (blacklist && addIfConfirmed) delete blacklist; // apparently it wasn't confirmed if (menuitemsChGr) free(menuitemsChGr); if (channelGroupName) free(channelGroupName); if (catvaluesNumeric) free(catvaluesNumeric); int i; for(i=0; i<=4; i++) free(SearchModes[i]); for(i=0; i<=7; i++) free(DaysOfWeek[i]); for(i=0; i<=2; i++) free(UseChannelSel[i]); } eOSState cMenuBlacklistEdit::ProcessKey(eKeys Key) { bool bHadSubMenu = HasSubMenu(); int iTemp_mode = data.mode; int iTemp_useTime = data.useTime; int iTemp_useChannel = data.useChannel; int iTemp_useDuration = data.useDuration; int iTemp_useDayOfWeek = data.useDayOfWeek; int iTemp_useExtEPGInfo = data.useExtEPGInfo; eOSState state = cOsdMenu::ProcessKey(Key); if (iTemp_mode != data.mode || iTemp_useTime != data.useTime || iTemp_useChannel != data.useChannel || iTemp_useDuration != data.useDuration || iTemp_useDayOfWeek != data.useDayOfWeek || iTemp_useExtEPGInfo != data.useExtEPGInfo) { Set(); Display(); } const char* ItemText = Get(Current())->Text(); if (!HasSubMenu()) { if (strlen(ItemText)>0 && strstr(ItemText, tr(" from channel")) == ItemText && ((Key >= k0 && Key <= k9) || Key == kLeft || Key == kRight)) { channelMax = channelMin; Set(); Display(); } } int iOnUserDefDayItem = 0; int iOnUseChannelGroups = 0; int iOnChannelGroup = 0; int iOnTerm = 0; int iOnExtCatItemBrowsable = 0; int iCatIndex = -1; char* catname = NULL; if (!HasSubMenu() && strlen(ItemText)>0) { // check, if on an item of ext. EPG info int iOnExtCatItem = 0; cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { if (strstr(ItemText, IndentMenuItem(SearchExtCat->menuname)) == ItemText) { iOnExtCatItem = 1; if (SearchExtCat->nvalues > 0) iOnExtCatItemBrowsable = 1; iCatIndex = index; catname = SearchExtCat->menuname; break; } index++; SearchExtCat = SearchExtCats.Next(SearchExtCat); } if (strstr(ItemText, tr("Search term")) == ItemText) { if (!InEditMode(ItemText, tr("Search term"), data.search)) // show template for a new search { SetHelp(NULL, NULL, NULL, tr("Button$Templates")); iOnTerm = 1; } } if (strstr(ItemText, IndentMenuItem(tr("Day of week"))) == ItemText) { if (data.DayOfWeek == 7) { SetHelp(trVDR("Button$Edit")); iOnUserDefDayItem = 1; } else SetHelp(NULL); } else if (strstr(ItemText, tr("Use channel")) == ItemText && data.useChannel == 2) { SetHelp(NULL, NULL, NULL, tr("Button$Setup")); iOnUseChannelGroups = 1; } else if (strstr(ItemText, IndentMenuItem(tr("Channel group"))) == ItemText) { SetHelp(NULL, NULL, NULL, tr("Button$Setup")); iOnChannelGroup = 1; } else if (iOnExtCatItem) { if (!InEditMode(ItemText, IndentMenuItem(catname), data.catvalues[iCatIndex]) || SearchExtCats.Get(iCatIndex)->searchmode >= 10) SetHelp(NULL, NULL, NULL, iOnExtCatItemBrowsable?tr("Button$Select"):NULL); } else if (strstr(ItemText, tr("Search term")) != ItemText) SetHelp(NULL, NULL, NULL, NULL); } if (state == osUnknown) { if (HasSubMenu()) return osContinue; switch (Key) { case kOk: if (data.useChannel==1) { cChannel *ch = Channels.GetByNumber(channelMin); if (ch) data.channelMin = ch; else { ERROR(tr("*** Invalid Channel ***")); break; } ch = Channels.GetByNumber(channelMax); if (ch) data.channelMax = ch; else { ERROR(tr("*** Invalid Channel ***")); break; } if (channelMin > channelMax) { ERROR(tr("Please check channel criteria!")); return osContinue; } } if (data.useChannel==2) data.channelGroup = strdup(menuitemsChGr[channelGroupNr]); if (blacklist) { *blacklist = data; if (data.DayOfWeek == 7) blacklist->DayOfWeek = UserDefDayOfWeek; // transfer numeric cat values back to search cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { if (SearchExtCat->searchmode >= 10) { if (blacklist->catvalues[index]) free(blacklist->catvalues[index]); msprintf(&blacklist->catvalues[index], "%d", catvaluesNumeric[index]); } SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } if (addIfConfirmed) { cMutexLock BlacklistLock(&Blacklists); blacklist->ID = Blacklists.GetNewID(); Blacklists.Add(blacklist); } Blacklists.Save(); addIfConfirmed = false; } return osBack; case kRed: if (iOnUserDefDayItem) state = AddSubMenu(new cMenuEditDaysOfWeek(&UserDefDayOfWeek)); break; case kBlue: if (iOnUseChannelGroups || iOnChannelGroup) { if (channelGroupName) free(channelGroupName); channelGroupName = strdup(menuitemsChGr[channelGroupNr]); state = AddSubMenu(new cMenuChannelGroups(&channelGroupName)); } if (iOnTerm) state = AddSubMenu(new cMenuEPGSearchTemplate(NULL, &data, addIfConfirmed)); if (iOnExtCatItemBrowsable) state = AddSubMenu(new cMenuCatValuesSelect(data.catvalues[iCatIndex], iCatIndex, SearchExtCats.Get(iCatIndex)->searchmode)); break; case kGreen: case kYellow: state = osContinue; default: break; } } if ((iOnUseChannelGroups || iOnChannelGroup || iOnTerm || iOnExtCatItemBrowsable) && bHadSubMenu && !HasSubMenu()) // return form submenu { if (iOnTerm) { if (data.DayOfWeek < 0) { UserDefDayOfWeek = data.DayOfWeek; data.DayOfWeek = 7; } if (data.useChannel == 2) { channelGroupNr = ChannelGroups.GetIndex(data.channelGroup); channelGroupName = strdup(data.channelGroup); } } if (iOnExtCatItemBrowsable && SearchExtCats.Count() > 0) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { if (SearchExtCat->searchmode >= 10) catvaluesNumeric[index] = atoi(data.catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } } Set(); Display(); } return state; } vdr-plugin-epgsearch/mainmenushortcut.c0000644000175000017500000000537512466747543020235 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include #include #include #include "services.h" #include "mainmenushortcut.h" #include "epgsearchtools.h" static const char SETUPENTRY[] = "MainMenuEntryEnabled"; cMainMenuShortcutSetupPage::cMainMenuShortcutSetupPage(const char *setupText, const char *setupEntry, int *const setupValue) :_setupEntry(setupEntry), _setupValue(setupValue) { dummy=0; Add(new cMenuEditBoolItem(setupText, _setupValue, trVDR("no"), trVDR("yes"))); } void cMainMenuShortcutSetupPage::Store() { SetupStore(_setupEntry, *_setupValue); } cMainMenuShortcut::cMainMenuShortcut() : _mainMenuEntryEnabled(1) { } cMainMenuShortcut::~cMainMenuShortcut() { } cOsdMenu *cMainMenuShortcut::GetEpgSearchMenu(const char *serviceName) { cOsdMenu *menu = NULL; cPlugin *epgSearchPlugin = cPluginManager::GetPlugin("epgsearch"); if (epgSearchPlugin) { EpgSearchMenu_v1_0 *serviceData = new EpgSearchMenu_v1_0; if (epgSearchPlugin->Service(serviceName, serviceData)) { menu = serviceData->Menu; } else { ERROR(tr("This version of EPGSearch does not support this service!")); } delete serviceData; } else { ERROR(tr("EPGSearch does not exist!")); } return menu; } bool cMainMenuShortcut::Initialize() { return true; } bool cMainMenuShortcut::SetupParse(const char *Name, const char *Value) { if (!strcasecmp(Name, SETUPENTRY)) { _mainMenuEntryEnabled = atoi(Value); } return true; } cMenuSetupPage *cMainMenuShortcut::SetupMenu() { return new cMainMenuShortcutSetupPage(SetupText(), SETUPENTRY, &_mainMenuEntryEnabled); } const char *cMainMenuShortcut::MainMenuEntry() { if (_mainMenuEntryEnabled) { return (const char *) MainMenuText(); } else { return NULL; } } vdr-plugin-epgsearch/epgsearchonly.c0000644000175000017500000000403712466747543017465 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include #include "services.h" #include "mainmenushortcut.h" static const char *VERSION = "0.0.1"; static const char *DESCRIPTION = trNOOP("Direct access to epgsearch's search menu"); static const char *MAINMENUENTRY = trNOOP("Search"); static const char *SETUPTEXT = trNOOP("EpgSearch-Search in main menu"); class cPluginEpgsearchonly:public cMainMenuShortcut { public: virtual const char *Version() { return VERSION; } virtual const char *Description() { return I18nTranslate(DESCRIPTION, I18nEpgsearch); } virtual bool Initialize(); virtual cOsdObject *MainMenuAction() { return GetEpgSearchMenu("Epgsearch-searchmenu-v1.0"); }; protected: virtual const char *SetupText() { return I18nTranslate(SETUPTEXT, I18nEpgsearch); } virtual const char *MainMenuText() { return I18nTranslate(MAINMENUENTRY, I18nEpgsearch); } }; bool cPluginEpgsearchonly::Initialize() { return cMainMenuShortcut::Initialize(); } VDRPLUGINCREATOR(cPluginEpgsearchonly); // Don't touch this! vdr-plugin-epgsearch/epgsearchtools.h0000644000175000017500000002166412466747543017656 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCH_TOOLS_INC__ #define __EPGSEARCH_TOOLS_INC__ #include #include // For VDRVERSNUM only #include "epgsearchext.h" #include "recdone.h" using std::string; #if VDRVERSNUM < 10733 #define eTimerMatch int #endif #define MAXPARSEBUFFER KILOBYTE(10) #undef CHANNELNAME #define CHANNELNAME(x) (x ? x->ShortName(true) : "") #undef TIMESTRING #define TIMESTRING(x) *(TimeString(x)) #undef DATESTRING #define DATESTRING(x) *(DateString(x)) #undef GETDATESTRING #define GETDATESTRING(x) *(x->GetDateString()) #undef GETTIMESTRING #define GETTIMESTRING(x) *(x->GetTimeString()) #undef PRINTDAY #define PRINTDAY *cTimer::PrintDay #undef DAYDATETIME #define DAYDATETIME(x) *DayDateTime(x) #undef CHANNELSTRING #define CHANNELSTRING(x) (*x->GetChannelID().ToString()) #undef WEEKDAYNAME #define WEEKDAYNAME(x) (*WeekDayName(x)) #undef ADDDIR #define ADDDIR *AddDirectory #undef CONFIGDIR #define CONFIGDIR (!ConfigDir?cPlugin::ConfigDirectory():ConfigDir) #define CHNUMWIDTH (numdigits(Channels.MaxNumber()) + 2) #define SHORTTEXT(EVENT) \ (EVENT && EPGSearchConfig.showShortText && !isempty((EVENT)->ShortText()))?" ~ ":"", \ (EVENT && EPGSearchConfig.showShortText && !isempty((EVENT)->ShortText()))?(EVENT)->ShortText():"" #define ISRADIO(x) ((x)->Vpid()==0||(x)->Vpid()==1||(x)->Vpid()==0x1fff) #ifndef MENU_SEPARATOR_ITEMS #define MENU_SEPARATOR_ITEMS "----------------------------------------" #endif #define UPDS_WITH_OSD (1<<1) #define UPDS_WITH_EPGSCAN (1<<2) // Icons used in VDRSymbols-Font #define ICON_REC 0x8B #define ICON_RUNNING 0x92 #define ICON_CLOCK 0x8C #define ICON_CLOCK_HALF 0x94 #define ICON_BAR_OPEN 0x87 #define ICON_BAR_FULL 0x88 #define ICON_BAR_EMPTY 0x89 #define ICON_BAR_CLOSE 0x8A #define ICON_VPS 0x93 // UTF-8 Icons #define ICON_BAR_OPEN_UTF8 "\uE007" #define ICON_BAR_FULL_UTF8 "\uE008" #define ICON_BAR_EMPTY_UTF8 "\uE009" #define ICON_BAR_CLOSE_UTF8 "\uE00A" #define ICON_REC_UTF8 "\uE00B" #define ICON_CLOCK_UTF8 "\uE00C" #define ICON_CLOCK_HALF_UTF8 "\uE014" #define ICON_RUNNING_UTF8 "\uE012" #define ICON_VPS_UTF8 "\uE013" #define CONTENT_DESCRIPTOR_MAX 255 #define ERROR(T) Skins.Message(mtError, T) #define INFO(I) Skins.Message(mtInfo, I) extern const char AllowedChars[]; extern char* ConfigDir; // Helper functions class cSearchExt; class cSearchExtCat; class cEvent; cString IndentMenuItem(const char*, int indentions=1); bool MatchesSearchMode(const char* test, const char* values, int searchmode, const char* delim, int tolerance); char* GetExtEPGValue(const cEvent* e, cSearchExtCat* SearchExtCat); char* GetExtEPGValue(const char* description, const char* catname, const char *format); char* GetAuxValue(const char* aux, const char* name); char* GetAuxValue(const cRecording *recording, const char* name); char* GetAuxValue(const cTimer* timer, const char* name); string UpdateAuxValue(string aux, string section, string value); string UpdateAuxValue(string aux, string section, long num); void ToLower(char* szText); char *strreplacei(char *s, const char *s1, const char *s2); std::string strreplace(std::string& result, const std::string& replaceWhat, const std::string& replaceWithWhat); // replace s1 with s2 in s ignoring the case of s1 inline char *strreplacei(char *s, const char *s1, const char s2) { char *p = strcasestr(s, s1); if (p) { int offset = p - s; int l = strlen(s); int l1 = strlen(s1); memmove(s + offset + 1, s + offset + l1, l - offset - l1 + 1); s[offset] = s2; } return s; } void sleepMSec(long ms); void sleepSec(long s); bool SendViaSVDRP(cString SVDRPcmd); int SendMsg(cString Message, bool confirm = false, int seconds = 0, eMessageType messageType = mtInfo); bool InEditMode(const char* ItemText, const char* ItemName, const char* ItemValue); cSearchExt* TriggeredFromSearchTimer(const cTimer* timer); int TriggeredFromSearchTimerID(const cTimer* timer); double FuzzyMatch(const char* s1, const char* s2, int maxLength); bool DescriptionMatches(const char* eDescr, const char* rDescr, int matchLimit = 90); const cEvent* GetEvent(cTimer* timer); char* GetRawDescription(const char* descr); void PrepareTimerFile(const cEvent* event, cTimer* timer); int CompareEventTime(const void *p1, const void *p2); int CompareEventChannel(const void *p1, const void *p2); int CompareSearchExtPrioDescTerm(const void *p1, const void *p2); bool EventsMatch(const cEvent* event1, const cEvent* event2, bool compareTitle, int compareSubtitle, bool compareSummary, int compareDate, unsigned long catvaluesAvoidRepeat, int matchLimit=90); int ChannelNrFromEvent(const cEvent* pEvent); void DelTimer(int index); char* FixSeparators(char* buffer, char sep); cString DateTime(time_t t); string NumToString(long l); int FindIgnoreCase(const string& expr, const string& query); bool EqualsNoCase(const string& a, const string& b); string Strip(const string& input); string ReplaceAll(const string& input, const string& what, const string& with); string GetAlNum(const string& s); string EscapeString(const string& S); string QuoteApostroph(const string& S); string MD5(const string& input); time_t GetDateTime(time_t day, int start); void SetAux(cTimer* timer, string aux); int msprintf(char **strp, const char *fmt, ...); std::string GetCodeset(); ssize_t Readline(int sockd, char *vptr, size_t maxlen); ssize_t Writeline(int sockd, const char *vptr, ssize_t n); long getAddrFromString(const char* hostnameOrIp, struct sockaddr_in* addr); // --- cTimerObj -------------------------------------------------------- class cTimerObj : public cListObject { public: cTimer* timer; cTimerObj(cTimer* Timer) : timer(Timer) {} virtual ~cTimerObj() { timer = NULL; } // do not delete anything! }; // --- cTimerObjList -------------------------------------------------------- class cTimerObjList : public cList { public: void DelTimer(cTimer* t) { for (cTimerObj* pTObj = First(); pTObj; pTObj = Next(pTObj)) if (pTObj->timer == t) { Del(pTObj); return; } } }; // --- icstring ------------------------------------------ // a case-insensitive string class struct ignorecase_traits : public std:: #if defined(__GNUC__) && __GNUC__ < 3 && __GNUC_MINOR__ < 96 string_char_traits #else char_traits #endif { // return whether c1 and c2 are equal static bool eq(const char& c1, const char& c2) { return (c1==c2 || std::toupper(c1)==std::toupper(c2)); } // return whether c1 is less than c2 static bool lt(const char& c1, const char& c2) { return std::toupper(c1) icstring; // --- eTimerMod ------------------------------------------------------------- enum eTimerMod { tmNoChange=0, tmStartStop=1, tmFile=2, tmAuxEventID=4 }; #if VDRVERSNUM >= 10712 // --- cCommands ------------------------------------------------------------------- class cCommand : public cListObject { private: char *title; char *command; bool confirm; static char *result; public: cCommand(void); virtual ~cCommand(); bool Parse(const char *s); const char *Title(void) { return title; } bool Confirm(void) { return confirm; } const char *Execute(const char *Parameters = NULL); }; class cCommands : public cConfig {}; #endif #endif vdr-plugin-epgsearch/menu_dirselect.c0000644000175000017500000001627612466747543017634 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include "menu_dirselect.h" #include "epgsearchext.h" #include "epgsearchcats.h" #include "epgsearchtools.h" set cMenuDirSelect::directorySet; cDirExts DirExts; cConfDDirExts ConfDDirExts; // --- cMenuDirItem --------------------------------------------------------- class cMenuDirItem : public cOsdItem { private: char* directory; public: cMenuDirItem(const char* text) : cOsdItem(text) { directory = strdup(text);} ~cMenuDirItem(){ if (directory) free(directory);} virtual int Compare(const cListObject &ListObject) const; }; int cMenuDirItem::Compare(const cListObject &ListObject) const { const cMenuDirItem *p = (cMenuDirItem *)&ListObject; int hasVars1 = (strchr(directory,'%') != NULL?1:0); int hasVars2 = (strchr(p->directory,'%') != NULL?1:0); if (hasVars1 || hasVars2) { if (hasVars1 != hasVars2) return hasVars2-hasVars1; else return strcasecmp(directory, p->directory); } else return strcasecmp(directory, p->directory); } // --- cMenuDirSelect --------------------------------------------------------- cMenuDirSelect::cMenuDirSelect(char* szDirectory) :cOsdMenu(tr("Select directory")) { #if VDRVERSNUM >= 10733 SetMenuCategory(mcTimerEdit); #endif Directory = szDirectory; yellow=NULL; MaxLevel = 1; CurLevel = 1; Load(); } cMenuDirSelect::~cMenuDirSelect() { if (yellow) free(yellow); } int cMenuDirSelect::Level(const char* szDir) { int iLevel = 1; if (strchr(szDir, '%')) // dirs with vars always have level 1 return 1; do { const char* pos = strchr(szDir, '~'); if (pos) { iLevel++; szDir = pos+1; } else return iLevel; } while(true); return 1; } void cMenuDirSelect::AddDistinct(const char* szText) { int iLevel = Level(szText); MaxLevel = max(MaxLevel, iLevel); if (iLevel > CurLevel) // only show Items of the specified level, except those with vars return; for(int i=0; iText(); char* itemtext = strdup(ItemText); char* sztext = strdup(szText); ToLower(itemtext); ToLower(sztext); if (itemtext && strlen(itemtext) > 0 && strcmp(sztext, itemtext) == 0) { free(itemtext); free(sztext); return; } free(itemtext); free(sztext); } Add(new cMenuDirItem(hk(szText))); } void cMenuDirSelect::CreateDirSet(bool extraDirs) { directorySet.clear(); // add distinct directories from current recordings if (Recordings.Count() == 0) Recordings.Load(); for (cRecording *recording = Recordings.First(); recording; recording = Recordings.Next(recording)) { if (recording->HierarchyLevels() > 0) { char* dir = strdup(recording->Name()); // strip the trailing rec dir char* pos = strrchr(dir, '~'); if (pos) { *pos=0; for(int iLevel = 0; iLevel < recording->HierarchyLevels(); iLevel++) { directorySet.insert(dir); char* pos = strrchr(dir, '~'); if (pos) *pos=0; } } free(dir); } } // add distinct directories from current timers for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer)) { char* dir = strdup(timer->File()); // strip the trailing name dir char* pos = strrchr(dir, '~'); if (pos) { *pos=0; do { directorySet.insert(dir); char* pos = strrchr(dir, '~'); if (pos) *pos=0; else break; } while(true); } free(dir); } #if APIVERSNUM >= 10712 // add distinct directories from folders.conf for(cNestedItem* item = Folders.First(); item; item = Folders.Next(item)) AddVDRFolders(item); #endif 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); } } } #if APIVERSNUM >= 10712 void cMenuDirSelect::AddVDRFolders(cNestedItem* folder, string parentDirectory) { if (folder == NULL) return; string folderDirectory = string((parentDirectory.size() == 0)?"":parentDirectory + "~") + folder->Text(); directorySet.insert(folderDirectory); if (folder->SubItems() == NULL) return; for(cNestedItem* subfolder = folder->SubItems()->First(); subfolder; subfolder = folder->SubItems()->Next(subfolder)) AddVDRFolders(subfolder, folderDirectory); } #endif void cMenuDirSelect::Load() { int current = Current(); char* oldSelection = NULL; // save old selection for reselection if (current>-1) oldSelection = strdup(Get(current)->Text()); Clear(); CreateDirSet(); std::set::iterator it; for (it = directorySet.begin(); it != directorySet.end(); ++it) AddDistinct((*it).c_str()); Sort(); for(int i=0; iText(); if (oldSelection && strchr(text, '%') == NULL && strstr(text, oldSelection) == text) // skip entries with variables { SetCurrent(Get(i)); break; } } if (oldSelection) free(oldSelection); if (yellow) { free(yellow); yellow = NULL; } msprintf(&yellow, "%s %d", tr("Button$Level"), (CurLevel==MaxLevel?1:CurLevel+1)); SetHelp(NULL, NULL, MaxLevel==1?NULL:yellow, tr("Button$Select")); Display(); } eOSState cMenuDirSelect::ProcessKey(eKeys Key) { eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch ((int)Key) { case kBlue|k_Repeat: case kYellow: if (++CurLevel>MaxLevel) CurLevel=1; Load(); return osContinue; case kGreen: case kRed: return osContinue; case kBlue: case kOk: if (Count() > 0) strn0cpy(Directory,Get(Current())->Text(), MaxFileName); return osBack; default: break; } } return state; } vdr-plugin-epgsearch/timerdone.c0000644000175000017500000001400412466747543016603 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "timerdone.h" #include "epgsearchtools.h" using std::string; cTimersDone TimersDone; // -- cTimerDone ----------------------------------------------------------------- cTimerDone::cTimerDone(void) { start = stop = 0; searchID = -1; } cTimerDone::cTimerDone(const time_t Start, const time_t Stop, const cEvent* pEvent, const int SearchID) { start = Start; stop = Stop; if (pEvent) { channelID = pEvent->ChannelID(); title = pEvent->Title()?pEvent->Title():""; shorttext = pEvent->ShortText()?pEvent->ShortText():""; } searchID = SearchID; } bool cTimerDone::operator== (const cTimerDone &arg) const { if (start == arg.start && stop == arg.stop && channelID == arg.channelID) { if (title != arg.title) return false; if (shorttext != "" && arg.shorttext != "" && shorttext != arg.shorttext) return false; if (searchID > -1 && arg.searchID > -1) return searchID == arg.searchID; else return true; } else return false; } bool cTimerDone::Parse(const char *s) { char *line; char *pos; char *pos_next; int parameter = 1; int valuelen; #define MAXVALUELEN (10 * MaxFileName) char value[MAXVALUELEN]; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != ':') { pos_next = strchr(pos, ':'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MAXVALUELEN) { LogFile.eSysLog("entry '%s' is too long. Will be truncated!", pos); valuelen = MAXVALUELEN; } strn0cpy(value, pos, valuelen); pos = pos_next; switch (parameter) { case 1: channelID = tChannelID::FromString(value); break; case 2: start = atol(value); break; case 3: stop = atol(value); break; case 4: searchID = atol(value); break; case 5: title = value; break; case 6: shorttext = value; break; default: break; } //switch } parameter++; } if (*pos) pos++; } //while title = ReplaceAll(title, "|", ":"); shorttext = ReplaceAll(shorttext, "|", ":"); free(line); return (parameter >= 6) ? true : false; } cString cTimerDone::ToText(void) const { cChannel *channel = Channels.GetByChannelID(channelID, true, true); string info = string(DAYDATETIME(start)) + " - " + string(channel?channel->Name():""); cString buffer = cString::sprintf("%s:%ld:%ld:%d:%s:%s:%s", *channelID.ToString(), start, stop, searchID, ReplaceAll(title, ":", "|").c_str(), ReplaceAll(shorttext, ":", "|").c_str(), ReplaceAll(info, ":", "|").c_str()); return buffer; } bool cTimerDone::Save(FILE *f) { return fprintf(f, "%s\n", *ToText()) > 0; } const cEvent* cTimerDone::GetEvent() const { cSchedulesLock schedulesLock; const cSchedules* Schedules = cSchedules::Schedules(schedulesLock); if (!Schedules) return NULL; const cSchedule *Schedule = Schedules->GetSchedule(channelID); if (!Schedule) return NULL; const cEvent* Event = Schedule->GetEventAround(start + (stop - start)/2); return Event; } // -- cTimerDones ----------------------------------------------------------------- cTimerDone* cTimersDone::InList(const time_t Start, const time_t Stop, const cEvent* pEvent, const int SearchID) { cTimerDone td(Start, Stop, pEvent, SearchID); cTimerDone* timerdone = First(); while (timerdone) { if (*timerdone == td) return timerdone; timerdone = Next(timerdone); } return NULL; } void cTimersDone::ClearOutdated(void) { // remove outdated items cTimerDone* timerdone = First(); while (timerdone) { cTimerDone* timerdoneNext = Next(timerdone); if (timerdone->stop < time(NULL)) Del(timerdone); timerdone = timerdoneNext; } } void cTimersDone::Update(const time_t Start, const time_t Stop, const cEvent* pEvent, const int SearchID, cTimerDone* Timerdone) { cTimerDone* timerdone = InList(Start, Stop, pEvent, SearchID); if(timerdone) { timerdone->start = Timerdone->start; timerdone->stop = Timerdone->stop; timerdone->channelID = Timerdone->channelID; timerdone->searchID = Timerdone->searchID; timerdone->title = Timerdone->title; timerdone->shorttext = Timerdone->shorttext; delete Timerdone; } else Add(Timerdone); } void cTimersDone::RemoveEntriesOfSearch(const int SearchID) { cTimerDone* timerdone = First(); while (timerdone) { cTimerDone* timerdoneNext = Next(timerdone); if (timerdone->searchID == SearchID) Del(timerdone); timerdone = timerdoneNext; } } vdr-plugin-epgsearch/COPYING0000644000175000017500000004310612466747543015511 0ustar tobiastobias GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. vdr-plugin-epgsearch/quickepgsearch.c0000644000175000017500000000404112466747543017613 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include #include "services.h" #include "mainmenushortcut.h" static const char VERSION[] = "0.0.1"; static const char DESCRIPTION[] = trNOOP("Quick search for broadcasts"); static const char MAINMENUENTRY[] = trNOOP("Quick search"); static const char SETUPTEXT[] = trNOOP("Show in main menu"); class cPluginQuicksearch : public cMainMenuShortcut { public: virtual const char* Version() { return VERSION; } virtual const char* Description() { return I18nTranslate(DESCRIPTION, I18nEpgsearch); } virtual bool Initialize(); virtual cOsdObject* MainMenuAction() { return GetEpgSearchMenu("Epgsearch-quicksearch-v1.0"); }; protected: virtual const char* SetupText() { return I18nTranslate(SETUPTEXT, I18nEpgsearch); } virtual const char* MainMenuText() { return I18nTranslate(MAINMENUENTRY, I18nEpgsearch); } }; bool cPluginQuicksearch::Initialize() { return cMainMenuShortcut::Initialize(); } VDRPLUGINCREATOR(cPluginQuicksearch); // Don't touch this! vdr-plugin-epgsearch/menu_searchactions.c0000644000175000017500000001477212466747543020503 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include "menu_commands.h" #include #include #include #include "menu_searchactions.h" #include "menu_searchresults.h" #include "menu_recsdone.h" #include "menu_timersdone.h" #include "menu_switchtimers.h" #include "menu_blacklists.h" #include "epgsearchtools.h" #include "menu_conflictcheck.h" #include "epgsearchcfg.h" #include "searchtimer_thread.h" #include "menu_searchedit.h" using namespace std; #define ACTION_COUNTER 11 extern int updateForced; // --- cMenuSearchActions --------------------------------------------------------- cMenuSearchActions::cMenuSearchActions(cSearchExt* Search, bool DirectCall) :cOsdMenu(tr("Search actions")) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcCommand); #endif directCall = DirectCall; SetHasHotkeys(); search = Search; Add(new cOsdItem(hk(tr("Execute search")))); Add(new cOsdItem(hk(tr("Use as search timer on/off")))); Add(new cOsdItem(hk(tr("Trigger search timer update")))); Add(new cOsdItem(hk(tr("Show recordings done")))); Add(new cOsdItem(hk(tr("Show timers created")))); Add(new cOsdItem(hk(tr("Create a copy")))); Add(new cOsdItem(hk(tr("Use as template")))); Add(new cOsdItem(hk(tr("Show switch list")))); Add(new cOsdItem(hk(tr("Show blacklists")))); Add(new cOsdItem(hk(tr("Delete created timers?")))); Add(new cOsdItem(hk(tr("Timer conflict check")))); } cMenuSearchActions::~cMenuSearchActions() { } eOSState cMenuSearchActions::Search(void) { cMenuTemplate* MenuTemplate = NULL; if (!search) return osContinue; if (search->menuTemplate > 0) MenuTemplate = cTemplFile::GetSearchTemplateByPos(search->menuTemplate); if (!MenuTemplate) MenuTemplate = cTemplFile::GetTemplateByName("MenuSearchResults"); return AddSubMenu(new cMenuSearchResultsForSearch(search, MenuTemplate)); } eOSState cMenuSearchActions::OnOffSearchtimer(void) { if (search) { search->useAsSearchTimer = search->useAsSearchTimer?0:1; SearchExts.Save(); if (!search->useAsSearchTimer && Interface->Confirm(tr("Disable associated timers too?"))) search->OnOffTimers(false); if (search->useAsSearchTimer && Interface->Confirm(tr("Activate associated timers too?"))) { search->OnOffTimers(true); if (!EPGSearchConfig.useSearchTimers) // enable search timer thread if necessary { cSearchTimerThread::Init((cPluginEpgsearch*) cPluginManager::GetPlugin("epgsearch"), true); INFO(tr("Search timers activated in setup.")); } } } return osBack; } eOSState cMenuSearchActions::Execute() { int current = Current(); if (current <= ACTION_COUNTER-1) { if (current == 0) return Search(); if (current == 1) return OnOffSearchtimer(); if (current == 2) { if (!EPGSearchConfig.useSearchTimers) // enable search timer thread if necessary { cSearchTimerThread::Init((cPluginEpgsearch*) cPluginManager::GetPlugin("epgsearch"), true); INFO(tr("Search timers activated in setup.")); } if (Interface->Confirm(tr("Run search timer update?"))) updateForced = 3; // with message about completion return osBack; } if (current == 3 && search) return AddSubMenu(new cMenuRecsDone(search)); if (current == 4 && search) return AddSubMenu(new cMenuTimersDone(search)); if (current == 5 && search) { if (!Interface->Confirm(tr("Copy this entry?"))) return osBack; cSearchExt* copy = new cSearchExt; copy->CopyFromTemplate(search); string copyname = string(tr("Copy")) + ": " + search->search; strcpy(copy->search, copyname.c_str()); cMutexLock SearchExtsLock(&SearchExts); copy->ID = SearchExts.GetNewID(); SearchExts.Add(copy); SearchExts.Save(); return AddSubMenu(new cMenuEditSearchExt(copy)); } if (current == 6 && search) { if (!Interface->Confirm(tr("Copy this entry to templates?"))) return osBack; cSearchExt* templateObj = new cSearchExt; templateObj->CopyFromTemplate(search); strcpy(templateObj->search, search->search); cMutexLock SearchTemplatesLock(&SearchTemplates); templateObj->ID = SearchTemplates.GetNewID(); SearchTemplates.Add(templateObj); SearchTemplates.Save(); return osBack; } if (current == 7) return AddSubMenu(new cMenuSwitchTimers()); if (current == 8) return AddSubMenu(new cMenuBlacklists()); if (current == 9) { if (!Interface->Confirm(tr("Delete all timers created from this search?"))) return osBack; search->DeleteAllTimers(); return osBack; } if (current == 10) return AddSubMenu(new cMenuConflictCheck()); } return osContinue; } eOSState cMenuSearchActions::ProcessKey(eKeys Key) { bool hadSubmenu = HasSubMenu(); if (directCall && Key == k1 && !HasSubMenu()) return Search(); eOSState state = cOsdMenu::ProcessKey(Key); // jump back to calling menu, if a command was called directly with key '1' .. '9' if (directCall && hadSubmenu && !HasSubMenu()) return osBack; if (state == osUnknown) { switch (Key) { case kGreen: case kYellow: case kBlue: return osContinue; case kOk: if (!HasSubMenu()) return Execute(); default: break; } } return state; } vdr-plugin-epgsearch/menu_quicksearch.c0000644000175000017500000002525712466747543020157 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include "menu_quicksearch.h" #include "templatefile.h" #include "menu_searchresults.h" #include "epgsearchcats.h" #include "changrp.h" #include "epgsearchcfg.h" #include "blacklist.h" #define QUICKSEARCHSIMPLE 0 #define QUICKSEARCHEXT 1 #define GREENLABEL (editmode==QUICKSEARCHSIMPLE?tr("Button$Extended"):tr("Button$Simple")) // --- cMenuQuickSearch -------------------------------------------------------- cMenuQuickSearch::cMenuQuickSearch(cSearchExt* Quicksearch) :cMenuEditSearchExt(Quicksearch, true, true) { editmode = QUICKSEARCHSIMPLE; Set(); SetHelp(NULL, GREENLABEL, NULL, NULL); } void cMenuQuickSearch::Set() { int current = Current(); Clear(); Add(new cMenuEditStrItem( tr("Search term"), data.search, sizeof(data.search), tr(AllowedChars))); if (editmode == QUICKSEARCHEXT) { Add(new cMenuEditStraItem(tr("Search mode"), &data.mode, 6, SearchModes)); if (data.mode == 5) // fuzzy Add(new cMenuEditIntItem(IndentMenuItem(tr("Tolerance")), &data.fuzzyTolerance, 1, 9)); Add(new cMenuEditBoolItem( tr("Match case"), &data.useCase, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem( tr("Use title"), &data.useTitle, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem( tr("Use subtitle"), &data.useSubtitle, trVDR("no"), trVDR("yes"))); Add(new cMenuEditBoolItem( tr("Use description"), &data.useDescription, trVDR("no"), trVDR("yes"))); // show Categories only if we have them if (SearchExtCats.Count() > 0) { Add(new cMenuEditBoolItem( tr("Use extended EPG info"), &data.useExtEPGInfo, trVDR("no"), trVDR("yes"))); if (data.useExtEPGInfo) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { Add(new cMenuEditStrItem( IndentMenuItem(SearchExtCat->menuname), data.catvalues[index], MaxFileName, tr(AllowedChars))); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } } } Add(new cMenuEditStraItem(tr("Use channel"), &data.useChannel, 4, UseChannelSel)); if (data.useChannel==1) { Add(new cMenuEditChanItem(tr(" from channel"), &channelMin)); Add(new cMenuEditChanItem(tr(" to channel"), &channelMax)); } if (data.useChannel==2) { // create the char array for the menu display if (menuitemsChGr) delete [] menuitemsChGr; menuitemsChGr = ChannelGroups.CreateMenuitemsList(); int oldchannelGroupNr = channelGroupNr; channelGroupNr = ChannelGroups.GetIndex(channelGroupName); if (channelGroupNr == -1) { if (oldchannelGroupNr > 0 && oldchannelGroupNr <= ChannelGroups.Count()) // perhaps its name was changed channelGroupNr = oldchannelGroupNr; else channelGroupNr = 0; // no selection } else channelGroupNr++; Add(new cMenuEditStraItem(IndentMenuItem(tr("Channel group")), &channelGroupNr, ChannelGroups.Count()+1, menuitemsChGr)); } Add(new cMenuEditBoolItem( tr("Use time"), &data.useTime, trVDR("no"), trVDR("yes"))); if (data.useTime == true) { Add(new cMenuEditTimeItem(tr(" Start after"), &data.startTime)); Add(new cMenuEditTimeItem(tr(" Start before"), &data.stopTime)); } Add(new cMenuEditBoolItem( tr("Use duration"), &data.useDuration, trVDR("no"), trVDR("yes"))); if (data.useDuration == true) { Add(new cMenuEditTimeItem(tr(" Min. duration"), &data.minDuration)); Add(new cMenuEditTimeItem(tr(" Max. duration"), &data.maxDuration)); } Add(new cMenuEditBoolItem( tr("Use day of week"), &data.useDayOfWeek, trVDR("no"), trVDR("yes"))); if (data.useDayOfWeek) { if (data.DayOfWeek < 0) { UserDefDayOfWeek = data.DayOfWeek; data.DayOfWeek = 7; } Add(new cMenuEditStraItem(IndentMenuItem(tr("Day of week")), &data.DayOfWeek, 8, DaysOfWeek)); } Add(new cMenuEditStraItem(tr("Use blacklists"), &data.blacklistMode, 3, BlacklistModes)); } SetCurrent(Get(current)); } eOSState cMenuQuickSearch::ProcessKey(eKeys Key) { bool bHadSubMenu = HasSubMenu(); int iTemp_mode = data.mode; int iTemp_useTime = data.useTime; int iTemp_useChannel = data.useChannel; int iTemp_useDuration = data.useDuration; int iTemp_useDayOfWeek = data.useDayOfWeek; int iTemp_useExtEPGInfo = data.useExtEPGInfo; int iTemp_avoidRepeats = data.avoidRepeats; int iTemp_allowedRepeats = data.allowedRepeats; int iTemp_delAfterDays = data.delAfterDays; int iTemp_action = data.action; eOSState state = cOsdMenu::ProcessKey(Key); if (iTemp_mode != data.mode || iTemp_useTime != data.useTime || iTemp_useChannel != data.useChannel || iTemp_useDuration != data.useDuration || iTemp_useDayOfWeek != data.useDayOfWeek || iTemp_useExtEPGInfo != data.useExtEPGInfo || iTemp_avoidRepeats != data.avoidRepeats || iTemp_allowedRepeats != data.allowedRepeats || iTemp_delAfterDays != data.delAfterDays || iTemp_action != data.action) { Set(); Display(); } const char* ItemText = Get(Current())->Text(); if (!HasSubMenu()) { if (strlen(ItemText)>0 && strstr(ItemText, tr(" from channel")) == ItemText && ((Key >= k0 && Key <= k9) || Key == kLeft || Key == kRight)) { channelMax = channelMin; Set(); Display(); } } int iOnUserDefDayItem = 0; int iOnUseChannelGroups = 0; int iOnChannelGroup = 0; int iOnCompareCats = 0; int iOnUseBlacklistsSelection = 0; int iOnExtCatItemBrowsable = 0; int iCatIndex = -1; char* catname = NULL; if (!HasSubMenu() && strlen(ItemText)>0) { // check, if on an item of ext. EPG info int iOnExtCatItem = 0; cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { if (strstr(ItemText, IndentMenuItem(SearchExtCat->menuname)) == ItemText) { iOnExtCatItem = 1; if (SearchExtCat->nvalues > 0) iOnExtCatItemBrowsable = 1; iCatIndex = index; catname = SearchExtCat->menuname; break; } index++; SearchExtCat = SearchExtCats.Next(SearchExtCat); } if (strstr(ItemText, tr("Search term")) == ItemText) { if (!InEditMode(ItemText, tr("Search term"), data.search)) // show template for a new search { SetHelp(NULL, GREENLABEL, NULL, NULL); } } if (strstr(ItemText, IndentMenuItem(tr("Day of week"))) == ItemText) { if (data.DayOfWeek == 7) { SetHelp(trVDR("Button$Edit"), GREENLABEL); iOnUserDefDayItem = 1; } else SetHelp(NULL); } else if (strstr(ItemText, tr("Use channel")) == ItemText && data.useChannel == 2) { SetHelp(NULL, GREENLABEL, NULL, tr("Button$Setup")); iOnUseChannelGroups = 1; } else if (strstr(ItemText, IndentMenuItem(tr("Channel group"))) == ItemText) { SetHelp(NULL, GREENLABEL, NULL, tr("Button$Setup")); iOnChannelGroup = 1; } else if (strstr(ItemText, tr("Use blacklists")) == ItemText && data.blacklistMode == blacklistsSelection) { SetHelp(NULL, GREENLABEL, NULL, tr("Button$Setup")); iOnUseBlacklistsSelection = 1; } else if (iOnExtCatItem) { if (!InEditMode(ItemText, IndentMenuItem(catname), data.catvalues[iCatIndex])) SetHelp(NULL, GREENLABEL, NULL, iOnExtCatItemBrowsable?tr("Button$Select"):NULL); } else if (strstr(ItemText, tr("Search term")) != ItemText) SetHelp(NULL, GREENLABEL, NULL, NULL); } if (state == osUnknown) { if (HasSubMenu()) return osContinue; switch (Key) { case kOk: if (data.useChannel==1) { cChannel *ch = Channels.GetByNumber(channelMin); if (ch) data.channelMin = ch; else { ERROR(tr("*** Invalid Channel ***")); break; } ch = Channels.GetByNumber(channelMax); if (ch) data.channelMax = ch; else { ERROR(tr("*** Invalid Channel ***")); break; } if (channelMin > channelMax) { ERROR(tr("Please check channel criteria!")); return osContinue; } } if (data.useChannel==2) data.channelGroup = strdup(menuitemsChGr[channelGroupNr]); if ((data.useTitle || data.useSubtitle || data.useDescription) && (int(strlen(data.search)) < 3) && !Interface->Confirm(tr("Edit$Search text too short - use anyway?"))) break; if (searchExt) { *searchExt = data; if (data.DayOfWeek == 7) searchExt->DayOfWeek = UserDefDayOfWeek; if (data.blacklistMode == blacklistsSelection) { searchExt->blacklists.Clear(); cBlacklistObject* blacklistObj = blacklists.First(); while(blacklistObj) { searchExt->blacklists.Add(new cBlacklistObject(blacklistObj->blacklist)); blacklistObj = blacklists.Next(blacklistObj); } } else searchExt->blacklists.Clear(); state = AddSubMenu(new cMenuSearchResultsForSearch(searchExt, cTemplFile::GetTemplateByName("MenuSearchResults"))); } break; case kRed: if (iOnUserDefDayItem) state = AddSubMenu(new cMenuEditDaysOfWeek(&UserDefDayOfWeek)); break; case kBlue: if (iOnUseChannelGroups || iOnChannelGroup) { if (channelGroupName) free(channelGroupName); channelGroupName = strdup(menuitemsChGr[channelGroupNr]); state = AddSubMenu(new cMenuChannelGroups(&channelGroupName)); } if (iOnUseBlacklistsSelection) state = AddSubMenu(new cMenuBlacklistsSelection(&blacklists)); if (iOnExtCatItemBrowsable) state = AddSubMenu(new cMenuCatValuesSelect(data.catvalues[iCatIndex], iCatIndex, SearchExtCats.Get(iCatIndex)->searchmode)); break; case kGreen: editmode = (editmode==QUICKSEARCHSIMPLE?QUICKSEARCHEXT:QUICKSEARCHSIMPLE); SetHelp(NULL, GREENLABEL, NULL, NULL); Set(); Display(); break; case kYellow: state = osContinue; default: break; } } if ((iOnUseChannelGroups || iOnChannelGroup || iOnCompareCats) && bHadSubMenu && !HasSubMenu()) // return form submenu { Set(); Display(); } return state; } vdr-plugin-epgsearch/menu_main.h0000644000175000017500000000400512466747543016572 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCH_MENUMAIN_H #define __EPGSEARCH_MENUMAIN_H #include #include "menu_event.h" // --- cMenuSearchMain --------------------------------------------------------- class cMenuSearchMain : public cOsdMenu { private: int helpKeys; cSchedulesLock schedulesLock; const cSchedules *schedules; int otherChannel; int currentChannel; eOSState Record(void); eOSState ExtendedSearch(void); void PrepareSchedule(cChannel *Channel); eOSState Commands(eKeys Key); void SetHelpKeys(bool Force = false); int GetTab(int Tab); int shiftTime; bool InWhatsOnMenu; bool InFavoritesMenu; cEventObjects eventObjects; public: cMenuSearchMain(void); virtual ~cMenuSearchMain(); virtual eOSState ProcessKey(eKeys Key); eOSState Switch(void); eOSState Shift(int iMinutes); eOSState ShowSummary(); bool Update(void); void UpdateCurrent(); #ifdef USE_GRAPHTFT virtual const char* MenuKind() { return "MenuEpgsSchedule"; } virtual void Display(void); #endif static int forceMenu; }; #endif vdr-plugin-epgsearch/epgsearchcfg.h0000644000175000017500000001041312466747543017243 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCHCFG_H #define __EPGSEARCHCFG_H #include #include #include extern int toggleKeys; typedef enum { showNow=0, showNext, showUserMode1, showUserMode2, showUserMode3, showUserMode4, showFavorites, showModeMax } showMode; class cShowMode: public cListObject { showMode mode; time_t seekTime; public: char description[30]; int useIt; int itime; cShowMode() : mode(showNow), seekTime(0), useIt(0), itime(0) { description[0]=0;} cShowMode(showMode Mode, const char* Description, int UseIt=1, int iTime=0, time_t SeekTime=0) : mode(Mode), seekTime(SeekTime), useIt(UseIt), itime(iTime) { if (strlen(Description) > 0) SetDescription(Description); else sprintf(description, "%02d:%02d", iTime/100, iTime%100); } const char* GetDescription() { return description; } int GetTime() const { return itime; } bool GetUsage() const { return useIt; } void SetDescription(const char* szD) { if (szD) strncpy(description, szD, sizeof(description)); } void SetTime(int iT) { itime = iT; } void SetUsage(bool bU) { useIt = bU; } int Compare(const cListObject &ListObject) const; showMode GetMode() const { return mode; } }; typedef enum { addSubtitleNever=0, addSubtitleAlways, addSubtitleSmart } addSubtitleToTimerMode; struct cEPGSearchConfig { public: cEPGSearchConfig(void); int hidemenu; int ReplaceOrgSchedule; int redkeymode; int bluekeymode; int showProgress; int showChannelNr; int useSearchTimers; int UpdateIntervall; int SVDRPPort; int timeShiftValue; int toggleGreenYellow; int StartMenu; int DefPriority; int DefLifetime; int DefMarginStart; int DefMarginStop; int checkTimerConflictsAfterUpdate; int checkMinPriority; int checkMinDuration; int checkMaxDays; int ignorePayTV; int useExternalSVDRP; int ignorePrimary; char defrecdir[MaxFileName]; cShowMode ShowModes[showModeMax]; int useVDRTimerEditMenu; int showChannelGroups; int showDaySeparators; int showEmptyChannels; int DefSearchTemplateID; int addSubtitleToTimer; char mainmenuentry[MaxFileName]; int WarEagle; int showRadioChannels; int onePressTimerCreation; int conflictCheckIntervall; int conflictCheckWithinLimit; int conflictCheckIntervall2; int checkTimerConflAfterTimerProg; int checkTimerConflOnRecording; int showFavoritesMenu; int FavoritesMenuTimespan; int useOkForSwitch; int sendMailOnSearchtimers; int sendMailOnConflicts; char MailAddressTo[MaxFileName]; char MailAddress[MaxFileName]; char MailServer[MaxFileName]; int MailUseAuth; char MailAuthUser[MaxFileName]; char MailAuthPass[MaxFileName]; char LastMailConflicts[MaxFileName]; int mailViaScript; int manualTimerCheckDefault; int noAnnounceWhileReplay; int TimerProgRepeat; int maxChannelMenuNow; int noConflMsgWhileReplay; int sendMailOnSearchtimerHours; int checkEPGHours; int checkEPGWarnByOSD; int checkEPGWarnByMail; int checkEPGchannelGroupNr; time_t lastMailOnSearchtimerAt; char conflCheckCmd[MaxFileName*10]; }; extern cEPGSearchConfig EPGSearchConfig; #endif // __EPGSEARCHCFG_H vdr-plugin-epgsearch/blacklist.h0000644000175000017500000000610112466747543016571 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCHBL_H #define __EPGSEARCHBL_H #include class cSearchExt; class cSearchResults; class cBlacklist : public cListObject { friend class cMenuEditSearchExt; public: int ID; char search[MaxFileName]; int options; int useTime; int startTime; int stopTime; int useChannel; cChannel *channelMin; cChannel *channelMax; char* channelGroup; int useCase; int mode; int useTitle; int useSubtitle; int useDescription; int useDuration; int minDuration; int maxDuration; int useDayOfWeek; int DayOfWeek; int useEpisode; int useExtEPGInfo; int ignoreMissingEPGCats; char** catvalues; int fuzzyTolerance; int isGlobal; static char *buffer; public: cBlacklist(void); virtual ~cBlacklist(void); cBlacklist& operator= (const cBlacklist&); virtual bool operator< (const cListObject &ListObject); const char *Search(void) { return search; } int Options(void) { return options; } int StartTime(void) { return startTime; } int StopTime(void) { return stopTime; } int UseChannel(void) { return useChannel; } cChannel *ChannelMin(void) { return channelMin; } cChannel *ChannelMax(void) { return channelMax; } cEvent * GetEventByBlacklist(const cSchedule *schedules, const cEvent *Start, int MarginStop = 0); bool MatchesExtEPGInfo(const cEvent* e); const char *ToText(void); bool Parse(const char *s); bool ParseExtEPGValues(const char *s); bool ParseExtEPGEntry(const char *s); bool Save(FILE *f); cSearchResults* Run(cSearchResults* pSearchResults = NULL, int MarginStop = 0); void CopyFromTemplate(const cSearchExt* templ); }; class cBlacklists : public cConfig, public cMutex { public: int GetNewID(void); cBlacklist* GetBlacklistFromID(int ID); bool Exists(const cBlacklist* Blacklist); }; class cBlacklistObject: public cListObject { public: cBlacklist* blacklist; cBlacklistObject(cBlacklist* Blacklist) : blacklist(Blacklist) {} }; extern cBlacklists Blacklists; #endif vdr-plugin-epgsearch/timer_thread.c0000644000175000017500000000560712466747543017275 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #ifdef __FreeBSD__ #include #endif #include "timer_thread.h" #include "epgsearchcfg.h" #include "epgsearchtools.h" #include "services.h" #include "svdrpclient.h" #include "timerstatus.h" #include #include cTimerThread *cTimerThread::m_Instance = NULL; TimerThreadStatus cTimerThread::m_Status = TimerThreadReady; int gl_TimerProgged=0; // Flag that indicates, when programming is finished cTimerThread::cTimerThread() : cThread("EPGSearch: timer") { m_Active = false; } cTimerThread::~cTimerThread() { if (m_Active) Stop(); cTimerThread::m_Instance = NULL; } void cTimerThread::Init(cString cmd) { if (m_Instance == NULL) { m_Instance = new cTimerThread; m_Instance->m_cmd = cmd; m_Instance->Start(); } } void cTimerThread::Exit(void) { if (m_Instance != NULL) { m_Instance->Stop(); DELETENULL(m_Instance); } } void cTimerThread::Stop(void) { m_Active = false; Cancel(3); } void cTimerThread::Action(void) { m_Active = true; if (EPGSearchConfig.useExternalSVDRP && !cSVDRPClient::SVDRPSendCmd) { LogFile.eSysLog("ERROR - SVDRPSend script not specified or does not exist (use -f option)"); m_Active = false; return; } while (m_Active) { if (!Running()) { m_Active=false; break; } if (Timers.BeingEdited()) { sleepSec(1); continue; } bool bSuccess = SendViaSVDRP(m_cmd); if (!bSuccess) { Epgsearch_osdmessage_v1_0* service_data = new Epgsearch_osdmessage_v1_0; service_data->message = strdup(tr("Programming timer failed!")); service_data->type = mtError; cPluginManager::CallFirstService("Epgsearch-osdmessage-v1.0", service_data); delete service_data; } else { gl_TimerProgged = 1; if (gl_timerStatusMonitor) gl_timerStatusMonitor->SetConflictCheckAdvised(); } m_Active = false; }; } vdr-plugin-epgsearch/Makefile0000644000175000017500000002415612466747543016122 0ustar tobiastobias# # Makefile for epgsearch, a Video Disk Recorder plugin # # Christian Wieninger cwieninger at gmx.de # # Adapted to the new VDR makefile environment by Copperhead, # refined by Stefan Hofmann # ### ------------ ### CONFIG START ### ### to change an option just edit the value: 0 => false, 1 => true ### edit one of these lines to '1', if you don't want the addon epgsearchonly, ### conflictcheckonly or quickepgsearch WITHOUT_EPGSEARCHONLY=0 WITHOUT_CONFLICTCHECKONLY=0 WITHOUT_QUICKSEARCH=0 ### edit this to '0' if you don't want epgsearch to auto config itself AUTOCONFIG=1 ### if AUTOCONFIG is not active you can manually enable the ### optional modules or patches for other plugins ifeq ($(AUTOCONFIG),0) # if you want to use Perl compatible regular expressions (PCRE) or libtre for # unlimited fuzzy searching, uncomment this and set the value to pcre or tre # also have a look at INSTALL for further notes on this #REGEXLIB = pcre # uncomment this to enable support for the pin plugin. #USE_PINPLUGIN = 1 # uncomment this to enable support for the graphtft plugin. #USE_GRAPHTFT = 1 endif ### the sendmail executable to use when epgsearch is configured to use the ### sendmail method for sending mail SENDMAIL = /usr/sbin/sendmail ### ### CONFIG END ### do not edit below this line if you don't know what you do ;-) ### ------------------------------------------------------------- PLUGIN = epgsearch MAINMENUSHORTCUT = epgsearchmainmenushortcut PLUGIN2 = epgsearchonly PLUGIN3 = conflictcheckonly PLUGIN4 = quickepgsearch ### The version number of this plugin (taken from the main source file): VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') ### The directory environment: # Use package data if installed...otherwise assume we're under the VDR source directory: #PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc)) PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr)) LIBDIR = $(call PKGCFG,libdir) LOCDIR = $(call PKGCFG,locdir) MANDIR = $(call PKGCFG,mandir) CONFDIR = $(call PKGCFG,configdir) BINDIR = $(call PKGCFG,bindir) # TMPDIR ?= /tmp PLGCFG = $(call PKGCFG,plgcfg) -include $(PLGCFG) ### The compiler options: export CFLAGS = $(call PKGCFG,cflags) export CXXFLAGS = $(call PKGCFG,cxxflags) ### configuring modules ifeq ($(AUTOCONFIG),1) ifeq (exists, $(shell pkg-config libpcre && echo exists)) REGEXLIB = pcre else ifeq (exists, $(shell pkg-config tre && echo exists)) REGEXLIB = tre endif ifeq (exists, $(shell test -e ../pin && echo exists)) USE_PINPLUGIN = 1 endif ifeq (exists, $(shell test -e ../graphtft && echo exists)) USE_GRAPHTFT = 1 endif ifeq (exists, $(shell test -e ../graphtftng && echo exists)) USE_GRAPHTFT = 1 endif endif ### The version number of VDR's plugin API: APIVERSION = $(call PKGCFG,apiversion) ### The name of the distribution archive: ARCHIVE = $(PLUGIN)-$(VERSION) PACKAGE = vdr-$(ARCHIVE) ### Includes and Defines (add further entries here): INCLUDES += DEFINES += ifneq ($(SENDMAIL),) DEFINES += -DSENDMAIL='"$(SENDMAIL)"' endif ### The object files (add further files here): ALL = libvdr-$(PLUGIN).so createcats ifeq ($(WITHOUT_EPGSEARCHONLY), 0) ALL += libvdr-$(PLUGIN2).so endif ifeq ($(WITHOUT_CONFLICTCHECKONLY), 0) ALL += libvdr-$(PLUGIN3).so endif ifeq ($(WITHOUT_QUICKSEARCH), 0) ALL += libvdr-$(PLUGIN4).so endif OBJS = afuzzy.o blacklist.o changrp.o confdloader.o conflictcheck.o conflictcheck_thread.o distance.o $(PLUGIN).o epgsearchcats.o epgsearchcfg.o epgsearchext.o epgsearchsetup.o epgsearchsvdrp.o epgsearchtools.o mail.o md5.o menu_announcelist.o menu_blacklistedit.o menu_blacklists.o menu_commands.o menu_conflictcheck.o menu_deftimercheckmethod.o menu_dirselect.o menu_event.o menu_favorites.o menu_main.o menu_myedittimer.o menu_quicksearch.o menu_recsdone.o menu_search.o menu_searchactions.o menu_searchedit.o menu_searchresults.o menu_searchtemplate.o menu_switchtimers.o menu_templateedit.o menu_timersdone.o menu_whatson.o noannounce.o pending_notifications.o rcfile.o recdone.o recstatus.o searchtimer_thread.o services.o switchtimer.o switchtimer_thread.o templatefile.o timer_thread.o timerdone.o timerstatus.o uservars.o varparser.o ifeq ($(REGEXLIB), pcre) LIBS += $(shell pcre-config --libs-posix) #LIBS += -L/usr/lib -lpcreposix -lpcre INCLUDE += $(shell pcre-config --cflags) DEFINES += -DHAVE_PCREPOSIX else ifeq ($(REGEXLIB), tre) LIBS += -L$(shell pkg-config --variable=libdir tre) $(shell pkg-config --libs tre) #LIBS += -L/usr/lib -ltre DEFINES += -DHAVE_LIBTRE INCLUDE += $(shell pkg-config --cflags tre) endif ifdef USE_PINPLUGIN DEFINES += -DUSE_PINPLUGIN endif ifdef USE_GRAPHTFT DEFINES += -DUSE_GRAPHTFT endif ifdef CFLC DEFINES += -DCFLC endif ifdef DEBUG_CONFL DEFINES += -DDEBUG_CONFL endif ifdef PLUGIN_EPGSEARCH_MAX_SUBTITLE_LENGTH DEFINES += -DMAX_SUBTITLE_LENGTH='$(PLUGIN_EPGSEARCH_MAX_SUBTITLE_LENGTH)' endif ### length of the filling '-' in the channel separators, defaults to ### "----------------------------------------" ### overwrite this with PLUGIN_EPGSEARCH_SEP_ITEMS=--- ### to avoid problems with graphlcd ifdef PLUGIN_EPGSEARCH_SEP_ITEMS DEFINES += -DMENU_SEPARATOR_ITEMS='"$(PLUGIN_EPGSEARCH_SEP_ITEMS)"' endif OBJS2 = mainmenushortcut.o epgsearchonly.o LIBS2 = OBJS3 = mainmenushortcut.o conflictcheckonly.o LIBS3 = OBJS4 = mainmenushortcut.o quickepgsearch.o LIBS4 = ### The main target: all: $(ALL) i18n docs ### Implicit rules: %.o: %.c $(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN)"' $(INCLUDES) -o $@ $< mainmenushortcut.o: mainmenushortcut.c $(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(MAINMENUSHORTCUT)"' $(INCLUDES) -o $@ $< epgsearchonly.o: epgsearchonly.c $(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN2)"' $(INCLUDES) -o $@ $< conflictcheckonly.o: conflictcheckonly.c $(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN3)"' $(INCLUDES) -o $@ $< quickepgsearch.o: quickepgsearch.c $(CXX) $(CXXFLAGS) -c $(DEFINES) -DPLUGIN_NAME_I18N='"$(PLUGIN4)"' $(INCLUDES) -o $@ $< # Dependencies: MAKEDEP = $(CXX) -MM -MG DEPFILE = .dependencies $(DEPFILE): Makefile @$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) $(OBJS2:%.o=%.c) $(OBJS3:%.o=%.c) $(OBJS4:%.o=%.c)> $@ -include $(DEPFILE) ### Internationalization (I18N): PODIR = po I18Npo = $(wildcard $(PODIR)/*.po) I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file)))) I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file)))))) I18Npot = $(PODIR)/$(PLUGIN).pot %.mo: %.po msgfmt -c -o $@ $< $(I18Npot): $(wildcard *.c) xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='' -o $@ `ls $^` %.po: $(I18Npot) msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< @touch $@ $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo install -D -m644 $< $@ .PHONY: i18n i18n: $(I18Nmo) $(I18Npot) install-i18n: $(I18Nmsgs) ### Targets: libvdr-$(PLUGIN).so: $(OBJS) $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) $(LIBS) -o $@ libvdr-$(PLUGIN2).so: $(OBJS2) $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS2) $(LIBS2) -o $@ libvdr-$(PLUGIN3).so: $(OBJS3) $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS3) $(LIBS3) -o $@ libvdr-$(PLUGIN4).so: $(OBJS4) $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS4) $(LIBS4) -o $@ createcats: createcats.o Makefile $(CXX) $(CXXFLAGS) $(LDFLAGS) createcats.o -o $@ docs: ./docsrc2man.sh ./docsrc2html.sh ln -sf ./doc/en/epgsearch.4.txt MANUAL ln -sf ./doc/en/epgsearch.1.txt README ln -sf ./doc/de/epgsearch.1.txt README.DE install-$(PLUGIN): libvdr-$(PLUGIN).so install -D libvdr-$(PLUGIN).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN).so.$(APIVERSION) install-$(PLUGIN2): libvdr-$(PLUGIN2).so install -D libvdr-$(PLUGIN2).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN2).so.$(APIVERSION) install-$(PLUGIN3): libvdr-$(PLUGIN3).so install -D libvdr-$(PLUGIN3).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN3).so.$(APIVERSION) install-$(PLUGIN4): libvdr-$(PLUGIN4).so install -D libvdr-$(PLUGIN4).so $(DESTDIR)$(LIBDIR)/libvdr-$(PLUGIN4).so.$(APIVERSION) install-conf: mkdir -p $(DESTDIR)$(CONFDIR)/plugins/$(PLUGIN)/conf.d cp -n conf/* $(DESTDIR)$(CONFDIR)/plugins/$(PLUGIN) install-doc: mkdir -p $(DESTDIR)$(MANDIR)/man1 mkdir -p $(DESTDIR)$(MANDIR)/man4 mkdir -p $(DESTDIR)$(MANDIR)/man5 mkdir -p $(DESTDIR)$(MANDIR)/de/man1 mkdir -p $(DESTDIR)$(MANDIR)/de/man5 cp man/en/*1.gz $(DESTDIR)$(MANDIR)/man1/ cp man/en/*4.gz $(DESTDIR)$(MANDIR)/man4/ cp man/en/*5.gz $(DESTDIR)$(MANDIR)/man5/ cp man/de/*1.gz $(DESTDIR)$(MANDIR)/de/man1/ cp man/de/*5.gz $(DESTDIR)$(MANDIR)/de/man5/ install-bin: createcats mkdir -p $(DESTDIR)$(BINDIR) cp createcats $(DESTDIR)$(BINDIR) install: install-lib install-i18n install-conf install-doc install-bin install-lib: install-$(PLUGIN) install-$(PLUGIN2) install-$(PLUGIN3) install-$(PLUGIN4) dist: docs clean @-rm -rf $(TMPDIR)/$(ARCHIVE) @mkdir $(TMPDIR)/$(ARCHIVE) @cp -a * $(TMPDIR)/$(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE)/doc-src @-rm -rf $(TMPDIR)/$(ARCHIVE)/html @-rm -rf $(TMPDIR)/$(ARCHIVE)/docsrc2man.sh @-rm -rf $(TMPDIR)/$(ARCHIVE)/docsrc2html.sh @tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE) @ln -sf README.git README @echo Distribution package created as $(PACKAGE).tgz distfull: docs clean @-rm -rf $(TMPDIR)/$(ARCHIVE) @mkdir $(TMPDIR)/$(ARCHIVE) @cp -a * $(TMPDIR)/$(ARCHIVE) @tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE) @ln -sf README.git README @echo complete distribution package created as $(PACKAGE).tgz clean: @-rm -f $(PODIR)/*.mo $(PODIR)/*.pot @-rm -f $(OBJS) $(OBJS2) $(OBJS3) $(OBJS4) $(DEPFILE) *.so *.tgz core* createcats createcats.o pod2*.tmp @-find . \( -name "*~" -o -name "#*#" \) -print0 | xargs -0r rm -f @-rm -rf doc html man vdr-plugin-epgsearch/switchtimer_thread.h0000644000175000017500000000271612466747543020522 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef VDR_SWITCHTIMER_THREAD_H #define VDR_SWITCHTIMER_THREAD_H #include "switchtimer.h" #include class cSwitchTimerThread: public cThread { private: bool m_Active; time_t m_lastUpdate; cCondWait Wait; protected: virtual void Action(void); void Stop(void); public: static cSwitchTimerThread *m_Instance; cSwitchTimerThread(void); virtual ~cSwitchTimerThread(); static void Init(void); static void Exit(void); }; #endif vdr-plugin-epgsearch/epgsearchsetup.h0000644000175000017500000000666012466747543017655 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCH_H #define __EPGSEARCH_H #include #include "epgsearchcfg.h" #include class cPluginEpgsearch; class cMenuSetupSubMenu : public cOsdMenu { protected: cEPGSearchConfig* data; std::vector helpTexts; eOSState Help(); void AddHelp(const char* helpText); virtual eOSState ProcessKey(eKeys Key); virtual void Set(void) = 0; public: cMenuSetupSubMenu(const char* Title, cEPGSearchConfig* Data); }; class cMenuSetupGeneral : public cMenuSetupSubMenu { protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupGeneral(cEPGSearchConfig* Data); }; class cMenuSetupEPGMenus : public cMenuSetupSubMenu { protected: void Set(void); void SetHelpKeys(); public: cMenuSetupEPGMenus(cEPGSearchConfig* Data); }; class cMenuSetupUserdefTimes : public cMenuSetupSubMenu { protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupUserdefTimes(cEPGSearchConfig* Data); }; class cMenuSetupTimers : public cMenuSetupSubMenu { protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); void SetHelpKeys(); public: cMenuSetupTimers(cEPGSearchConfig* Data); }; class cMenuSetupSearchtimers : public cMenuSetupSubMenu { char** menuitemsChGr; protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); void SetHelpKeys(); public: cMenuSetupSearchtimers(cEPGSearchConfig* Data); ~cMenuSetupSearchtimers(); }; class cMenuSetupTimerConflicts : public cMenuSetupSubMenu { protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupTimerConflicts(cEPGSearchConfig* Data); }; class cMenuSetupMailNotification : public cMenuSetupSubMenu { char tmpMailAuthPass[MaxFileName]; void SetHelpKeys(); protected: virtual eOSState ProcessKey(eKeys Key); void Set(void); public: cMenuSetupMailNotification(cEPGSearchConfig* Data); eOSState TestMailAccount(); static const char *HostNameChars; static const char *UserNameChars; static const char *PasswordChars; static const char *MailBoxChars; }; class cMenuEPGSearchSetup : public cMenuSetupPage { private: virtual void Setup(void); cEPGSearchConfig data; int delaySearchTimerThreadMode; protected: virtual eOSState ProcessKey(eKeys Key); virtual void Store(void); void Set(void); public: cMenuEPGSearchSetup(void); }; #endif vdr-plugin-epgsearch/uservars.c0000644000175000017500000002766512466747543016510 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #ifdef __FreeBSD__ #include #endif #include "uservars.h" #include "epgsearchcats.h" #include "epgsearchtools.h" #include "log.h" #include #include cUserVars UserVars; string cPlugconfdirVar::dir = ""; string cExtEPGVar::nameSpace = "epg"; string cTimerVar::nameSpace = "timer"; string cSearchVar::nameSpace = "search"; // cUserVar cUserVar::cUserVar() { oldEvent = NULL; oldescapeStrings = false; } string cUserVar::Evaluate(const cEvent* e, bool escapeStrings) { if (oldEvent && oldEvent == e && oldescapeStrings == escapeStrings) return oldResult; usedVars.clear(); string result; if (IsShellCmd()) result = EvaluateShellCmd(e); else if (IsConnectCmd()) result = EvaluateConnectCmd(e); else if (IsLengthCmd()) result = EvaluateLengthCmd(e); else if (IsCondExpr()) result = EvaluateCondExpr(e); else result = EvaluateCompExpr(e); oldResult = result; oldEvent = e; oldescapeStrings = escapeStrings; // avoid double dir separators int pos = 0; while((pos = result.find("~~")) >= 0) result.replace(pos, 2, "~"); return result; } string cUserVar::EvaluateShellCmd(const cEvent* e) { if (!varparser.cmd) return ""; string cmdArgs; if (varparser.cmdArgs != "") { string args = varparser.cmdArgs; varparser.compExpr = args; //handle the args as composed expr cmdArgs = EvaluateCompExpr(e, true); } const char* res = varparser.cmd->Execute(cmdArgs.c_str()); string result = res?res:""; int crPos = 0; // remove any CR while((crPos = result.find("\n")) >= 0) result.replace(crPos, 1, ""); return result; } #define MAX_LINE 1000 string cUserVar::EvaluateConnectCmd(const cEvent* e) { if (varparser.connectAddr == "") return ""; int conn_s; /* connection socket */ struct sockaddr_in servaddr; /* socket address structure */ char buffer[MAX_LINE]; /* character buffer */ if ( (conn_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { LogFile.eSysLog("Error creating listening socket"); return ""; } memset(&servaddr, 0, sizeof(varparser.connectAddr.c_str())); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(varparser.connectPort); if (getAddrFromString(varparser.connectAddr.c_str(), &servaddr) != 0) { LogFile.eSysLog("Invalid remote address"); return ""; } if ( connect(conn_s, (struct sockaddr *) &servaddr, sizeof(servaddr) ) < 0 ) { LogFile.eSysLog("Error calling connect()"); return ""; } varparser.compExpr = varparser.cmdArgs; string resexp = EvaluateCompExpr(e, true); sprintf(buffer, "%s\n", resexp.c_str()); Writeline(conn_s, buffer, strlen(buffer)); Readline(conn_s, buffer, MAX_LINE-1); close(conn_s); return buffer; } string cUserVar::EvaluateLengthCmd(const cEvent* e) { return NumToString(EvaluateCompExpr(e, false).size()); } string cUserVar::EvaluateCondExpr(const cEvent* e, bool escapeStrings) { string condresult = ""; cVarExpr leftExp(varparser.condEqLeft); string resLeft = leftExp.Evaluate(e); cVarExpr rightExp(varparser.condEqRight); string resRight = rightExp.Evaluate(e); if (varparser.condOp == condEq && resLeft == resRight) condresult = "1"; // assign any value if (varparser.condOp == condNeq && resLeft != resRight) condresult = "1"; // assign any value cUserVar* condVarTrue = UserVars.GetFromName(varparser.condvarTrue); cUserVar* condVarFalse = UserVars.GetFromName(varparser.condvarFalse); if (!condVarTrue || !condVarFalse) return ""; if (!AddDepVar(condVarTrue)) return ""; if (!AddDepVar(condVarFalse)) return ""; if (condresult != "") { LogFile.Log(3, "using case 'true'"); return condVarTrue->Evaluate(e, escapeStrings); } else { LogFile.Log(3, "using case 'false'"); return condVarFalse->Evaluate(e, escapeStrings); } } string cUserVar::EvaluateCompExpr(const cEvent* e, bool escapeStrings) { string expr = varparser.compExpr; if (expr.find('%') == string::npos) return expr; // handle internal vars like title and subtitle expr = EvaluateInternalVars(expr, e, escapeStrings); // replace ext. EPG variables expr = EvaluateExtEPGVars(expr, e, escapeStrings); // replace other user vars expr = EvaluateUserVars(expr, e, escapeStrings); return expr; } string cUserVar::EvaluateInternalVars(const string& Expr, const cEvent* e, bool escapeStrings) { string expr = Expr; if (expr.find('%') == string::npos) return expr; std::map::iterator it; for (it = UserVars.internalVars.begin(); it != UserVars.internalVars.end(); ++it) { string varName = (it->second)->Name(); int varPos = 0; while((varPos = FindIgnoreCase(expr, varName)) >= 0) { usedVars.insert(it->second); expr.replace(varPos, varName.size(), (it->second)->Evaluate(e, escapeStrings)); } } return expr; } string cUserVar::EvaluateExtEPGVars(const string& Expr, const cEvent* e, bool escapeStrings) { string expr = Expr; if (expr.find('%') == string::npos) return expr; std::map::iterator evar; for (evar = UserVars.extEPGVars.begin(); evar != UserVars.extEPGVars.end(); ++evar) { // replace ext. EPG variables with leading namespace string varName = evar->second->Name(true); int varPos = 0; while((varPos = FindIgnoreCase(expr, varName)) >= 0) { expr.replace(varPos, varName.size(), evar->second->Evaluate(e, escapeStrings)); usedVars.insert(evar->second); } // replace ext. EPG variables without leading namespace varName = evar->second->Name(); varPos = 0; while((varPos = FindIgnoreCase(expr, varName)) >= 0) { expr.replace(varPos, varName.size(), evar->second->Evaluate(e, escapeStrings)); usedVars.insert(evar->second); } } return expr; } string cUserVar::EvaluateUserVars(const string& Expr, const cEvent* e, bool escapeStrings) { string expr = Expr; if (expr.find('%') == string::npos) return expr; std::set::iterator it; for (it = UserVars.userVars.begin(); it != UserVars.userVars.end(); ++it) { string varName = (*it)->Name(); int varPos = 0; while((varPos = FindIgnoreCase(expr, varName)) >= 0) { if (!AddDepVar(*it)) return ""; expr.replace(varPos, varName.size(), (*it)->Evaluate(e, escapeStrings)); } } return expr; } string cUserVar::EvaluateInternalTimerVars(const string& Expr, const cTimer* t) { string expr = Expr; if (expr.find('%') == string::npos) return expr; std::map::iterator tvar; for (tvar = UserVars.internalTimerVars.begin(); tvar != UserVars.internalTimerVars.end(); ++tvar) { string varName = tvar->second->Name(); int varPos = 0; while((varPos = FindIgnoreCase(expr, varName)) >= 0) { expr.replace(varPos, varName.size(), tvar->second->Evaluate(t)); } } return expr; } string cUserVar::EvaluateInternalSearchVars(const string& Expr, const cSearchExt* s) { string expr = Expr; if (expr.find('%') == string::npos) return expr; std::map::iterator svar; for (svar = UserVars.internalSearchVars.begin(); svar != UserVars.internalSearchVars.end(); ++svar) { string varName = svar->second->Name(); int varPos = 0; while((varPos = FindIgnoreCase(expr, varName)) >= 0) { expr.replace(varPos, varName.size(), svar->second->Evaluate(s)); } } return expr; } bool cUserVar::DependsOnVar(const string& varName) { string VarName = Strip(varName); cUserVar* var = UserVars.GetFromName(VarName); if (!var) return false; return DependsOnVar(var); } bool cUserVar::DependsOnVar(cUserVar* var) { if (!var) return false; if (usedVars.find(var) != usedVars.end()) return true; std::set::iterator it; for (it = usedVars.begin(); it != usedVars.end(); ++it) if ((*it)->DependsOnVar(var)) return true; return false; } bool cUserVar::AddDepVar(cUserVar* var) { if (var == this || var->DependsOnVar(this)) { LogFile.eSysLog("ERROR - found cylic reference to var '%s' in var '%s'", var->Name().c_str(), Name().c_str()); return false; } usedVars.insert(var); return true; } void cUserVar::ResetCache() { oldEvent = NULL; oldResult = ""; } // cUserVarLine bool cUserVarLine::Parse(char *s) { if (!s) return false; if (s[0] == '#') return true; char *p = strchr(s, '='); if (p) { cUserVar* userVar = new cUserVar; if (userVar->varparser.Parse(s)) { cUserVar* oldVar = UserVars.GetFromName(userVar->Name(), false); if (oldVar) // allow redefintion of existing vars { LogFile.Log(1, "variable '%s' gets overwritten", oldVar->Name().c_str()); UserVars.userVars.erase(oldVar); delete oldVar; } UserVars.userVars.insert(userVar); return true; } } return false; } // cUserVars cUserVar* cUserVars::GetFromName(const string& varName, bool log) { string VarName = Strip(varName); std::transform(VarName.begin(), VarName.end(), VarName.begin(), tolower); std::map::iterator ivar = internalVars.find(VarName); if (ivar != internalVars.end()) return ivar->second; std::set::iterator uvar; for (uvar = userVars.begin(); uvar != userVars.end(); ++uvar) if (EqualsNoCase((*uvar)->Name(), VarName)) return (*uvar); std::map::iterator evar = extEPGVars.find(VarName); if (evar != extEPGVars.end()) return evar->second; if (log) LogFile.eSysLog("var '%s' not defined!", VarName.c_str()); return NULL; } // cVarExpr string cVarExpr::Evaluate(const cEvent* e) { // create a dummy user var cUserVar var; if (!var.varparser.ParseExp(expr)) return ""; LogFile.Log(3, "start evaluating expression '%s'", expr.c_str()); string result = var.Evaluate(e); LogFile.Log(3, "stop evaluating expression '%s' - result: '%s'", expr.c_str(), result.c_str()); usedVars = var.usedVars; return result; } string cVarExpr::Evaluate(const cTimer* t) { // create a dummy user var cUserVar var; if (!var.varparser.ParseExp(expr)) return ""; usedVars = var.usedVars; return var.EvaluateInternalTimerVars(expr, t); } string cVarExpr::Evaluate(const cSearchExt* s) { // create a dummy user var cUserVar var; if (!var.varparser.ParseExp(expr)) return ""; usedVars = var.usedVars; return var.EvaluateInternalSearchVars(expr, s); } bool cVarExpr::DependsOnVar(const string& varName, const cEvent* e) { string VarName = Strip(varName); if (FindIgnoreCase(expr, VarName) >= 0) return true; // create a dummy user var cUserVar var; var.varparser.varName = expr; if (!var.varparser.ParseExp(expr)) return false; var.Evaluate(e); return var.DependsOnVar(VarName); } vdr-plugin-epgsearch/conflictcheck_thread.h0000644000175000017500000000340612466747543020754 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef VDR_CONFLICTCHECK_THREAD_H #define VDR_CONFLICTCHECK_THREAD_H #include #include "conflictcheck.h" #include "epgsearch.h" class cConflictCheckThread: public cThread { private: bool m_Active; time_t m_lastUpdate; cPluginEpgsearch* m_plugin; static bool m_runOnce; static bool m_forceUpdate; cCondWait Wait; protected: virtual void Action(void); void Stop(void); public: static cConflictCheckThread *m_Instance; static time_t m_cacheNextConflict; static int m_cacheRelevantConflicts; static int m_cacheTotalConflicts; cConflictCheckThread(cPluginEpgsearch* thePlugin); virtual ~cConflictCheckThread(); static void Init(cPluginEpgsearch* thePlugin, bool runOnce = false); static void Exit(void); }; #endif vdr-plugin-epgsearch/epgsearch.h0000644000175000017500000000417312466747543016571 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef VDR_EPGSEARCH_H #define VDR_EPGSEARCH_H #include "epgsearchext.h" class cPluginEpgsearch : public cPlugin { public: bool showConflicts; bool showAnnounces; static bool VDR_readyafterStartup; cPluginEpgsearch(void); virtual ~cPluginEpgsearch(); virtual const char *Version(void); virtual const char *Description(void); virtual const char *CommandLineHelp(void); virtual bool ProcessArgs(int argc, char *argv[]); virtual bool Initialize(void); virtual bool Start(void); virtual void Stop(void); virtual void MainThreadHook(void); virtual const char *MainMenuEntry(void); virtual cOsdObject *MainMenuAction(void); virtual cMenuSetupPage *SetupMenu(void); virtual bool SetupParse(const char *Name, const char *Value); cOsdObject *DoInitialSearch(char* rcFilename); void LoadMenuTemplates(); bool Service(const char *Id, void *Data); virtual const char **SVDRPHelpPages(void); virtual cString SVDRPCommand(const char *Cmd, const char *Option, int &ReplyCode); void LoadUserVars(); void LoadConfD(); void CheckUTF8(); virtual cString Active(void); }; #endif vdr-plugin-epgsearch/menu_searchedit.c0000644000175000017500000012563212466747543017766 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include #include "menu_searchedit.h" #include "changrp.h" #include "epgsearchcats.h" #include "epgsearchtools.h" #include "menu_dirselect.h" #include "menu_recsdone.h" #include "menu_searchtemplate.h" #include "epgsearchcfg.h" #include "blacklist.h" #include "menu_blacklists.h" #include "epgsearch.h" #include "searchtimer_thread.h" #include #include "templatefile.h" using namespace std; cChannelGroups ChannelGroups; cSearchExtCats SearchExtCats; // --- cMenuEditSearchExt -------------------------------------------------------- cMenuEditSearchExt::cMenuEditSearchExt(cSearchExt *SearchExt, bool New, bool Template, bool FromEPG) :cOsdMenu(tr("Edit search"),32) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcPlugin); #endif templateMode = Template; SearchModes[0] = strdup(tr("phrase")); SearchModes[1] = strdup(tr("all words")); SearchModes[2] = strdup(tr("at least one word")); SearchModes[3] = strdup(tr("match exactly")); SearchModes[4] = strdup(tr("regular expression")); SearchModes[5] = strdup(tr("fuzzy")); DaysOfWeek[0] = strdup(WeekDayName(0)); DaysOfWeek[1] = strdup(WeekDayName(1)); DaysOfWeek[2] = strdup(WeekDayName(2)); DaysOfWeek[3] = strdup(WeekDayName(3)); DaysOfWeek[4] = strdup(WeekDayName(4)); DaysOfWeek[5] = strdup(WeekDayName(5)); DaysOfWeek[6] = strdup(WeekDayName(6)); DaysOfWeek[7] = strdup(tr("user-defined")); UseChannelSel[0] = strdup(trVDR("no")); UseChannelSel[1] = strdup(tr("interval")); UseChannelSel[2] = strdup(tr("channel group")); UseChannelSel[3] = strdup(tr("only FTA")); SearchTimerModes[0] = strdup(tr("Record")); SearchTimerModes[1] = strdup(tr("Announce by OSD")); SearchTimerModes[2] = strdup(tr("Switch only")); SearchTimerModes[3] = strdup(tr("Announce and switch")); SearchTimerModes[4] = strdup(tr("Announce by mail")); BlacklistModes[0] = strdup(tr("only globals")); BlacklistModes[1] = strdup(tr("Selection")); BlacklistModes[2] = strdup(tr("all")); BlacklistModes[3] = strdup(trVDR("none")); DelModes[0] = strdup(trVDR("no")); DelModes[1] = strdup(tr("count recordings")); DelModes[2] = strdup(tr("count days")); SearchActiveModes[0] = strdup(trVDR("no")); SearchActiveModes[1] = strdup(trVDR("yes")); SearchActiveModes[2] = strdup(tr("user-defined")); CompareSubtitleModes[0] = strdup(trVDR("no")); CompareSubtitleModes[1] = strdup(tr("if present")); CompareDateModes[0] = strdup(trVDR("no")); CompareDateModes[1] = strdup(tr("same day")); CompareDateModes[2] = strdup(tr("same week")); CompareDateModes[3] = strdup(tr("same month")); #if APIVERSNUM > 10710 // collect content string IDs std::set contentStrings; for(unsigned int i=0; iID == EPGSearchConfig.DefSearchTemplateID) SearchTempl = SearchExtTempl; SearchExtTempl = SearchTemplates.Next(SearchExtTempl); } if (SearchTempl) SearchExt->CopyFromTemplate(SearchTempl, FromEPG); } searchExt = SearchExt; addIfConfirmed = New; if (!templateMode) SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Templates")); if (searchExt) { data = *searchExt; UserDefDayOfWeek = 0; if (searchExt->DayOfWeek < 0) { UserDefDayOfWeek = searchExt->DayOfWeek; data.DayOfWeek = 7; } menuitemsChGr = NULL; channelGroupName = NULL; channelMin = channelMax = cDevice::CurrentChannel(); channelGroupNr = 0; if (data.channelMin) channelMin = data.channelMin->Number(); if (data.channelMax) channelMax = data.channelMax->Number(); if (data.useChannel==2) { channelGroupNr = ChannelGroups.GetIndex(data.channelGroup); if (channelGroupNr == -1) { free(data.channelGroup); data.channelGroup = NULL; channelGroupNr = 0; // no selection } else { channelGroupName = strdup(data.channelGroup); channelGroupNr++; } } contentStringsFlags = NULL; #if APIVERSNUM > 10710 // set the flags for the content descriptors contentStringsFlags = (int*) malloc((CONTENT_DESCRIPTOR_MAX+1) * sizeof(int)); for(unsigned int i=0; i<=CONTENT_DESCRIPTOR_MAX;i++) contentStringsFlags[i] = data.HasContent(i); useContentDescriptors = (data.contentsFilter.size() > 0); #endif catarrayAvoidRepeats = NULL; catvaluesNumeric = NULL; if (SearchExtCats.Count() > 0) { // fill an array, that stores yes/no for using categories in avoid repeats catarrayAvoidRepeats = (int*) malloc(SearchExtCats.Count() * sizeof(int)); catvaluesNumeric = (int*) malloc(SearchExtCats.Count() * sizeof(int)); cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { catarrayAvoidRepeats[index] = (SearchExt->catvaluesAvoidRepeat & (1<catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } } blacklists.Clear(); if (data.blacklistMode == blacklistsSelection) { cBlacklistObject* blacklistObj = searchExt->blacklists.First(); while(blacklistObj) { blacklists.Add(new cBlacklistObject(blacklistObj->blacklist)); blacklistObj = searchExt->blacklists.Next(blacklistObj); } } Set(); } } void cMenuEditSearchExt::AddHelp(const char* helpText) { helpTexts.push_back(helpText); } void cMenuEditSearchExt::Set() { int current = Current(); Clear(); helpTexts.clear(); if (templateMode) { Add(new cMenuEditStrItem( tr("Template name"), data.search, sizeof(data.search), tr(AllowedChars))); AddHelp(tr("Help$Specify the name of the template.")); } else { Add(new cMenuEditStrItem( tr("Search term"), data.search, sizeof(data.search), tr(AllowedChars))); AddHelp(tr("Help$Specify here the term to search for.")); } Add(new cMenuEditStraItem(tr("Search mode"), &data.mode, 6, SearchModes)); AddHelp(tr("Help$The following search modes exist:\n\n- phrase: searches for sub terms\n- all words: all single words must appear\n- at least one word: at least one single word must appear\n- match exactly: must match exactly\n- regular expression: match a regular expression\n- fuzzy searching: searches approximately")); if (data.mode == 5) // fuzzy { Add(new cMenuEditIntItem(IndentMenuItem(tr("Tolerance")), &data.fuzzyTolerance, 1, 9)); AddHelp(tr("Help$This sets the tolerance of fuzzy searching. The value represents the allowed errors.")); } Add(new cMenuEditBoolItem( tr("Match case"), &data.useCase, trVDR("no"), trVDR("yes"))); AddHelp(tr("Help$Set this to 'Yes' if your search should match the case.")); Add(new cMenuEditBoolItem( tr("Use title"), &data.useTitle, trVDR("no"), trVDR("yes"))); AddHelp(tr("Help$Set this to 'Yes' if you like to search in the title of an event.")); Add(new cMenuEditBoolItem( tr("Use subtitle"), &data.useSubtitle, trVDR("no"), trVDR("yes"))); AddHelp(tr("Help$Set this to 'Yes' if you like to search in the episode of an event.")); Add(new cMenuEditBoolItem( tr("Use description"), &data.useDescription, trVDR("no"), trVDR("yes"))); AddHelp(tr("Help$Set this to 'Yes' if you like to search in the summary of an event.")); #if APIVERSNUM > 10710 Add(new cMenuEditBoolItem( tr("Use content descriptor"), &useContentDescriptors, trVDR("no"), trVDR("yes"))); AddHelp(tr("Help$Set this to 'Yes' if you want to search the contents by a descriptor.")); if (useContentDescriptors) { vector::const_iterator it; for(unsigned int i=0; i< contentStringIDs.size(); i++) { int level = (contentStringIDs[i] % 0x10==0?1:2); Add(new cMenuEditBoolItem(IndentMenuItem(tr(cEvent::ContentToString(contentStringIDs[i])), level), &contentStringsFlags[contentStringIDs[i]], trVDR("no"), trVDR("yes"))); } } #endif // show Categories only if we have them if (SearchExtCats.Count() > 0) { Add(new cMenuEditBoolItem( tr("Use extended EPG info"), &data.useExtEPGInfo, trVDR("no"), trVDR("yes"))); AddHelp(tr("Help$The summary of an event, can contain additional information like 'Genre', 'Category', 'Year',... called 'EPG categories' within EPGSearch. External EPG providers often deliver this information. This allows refining a search and other nice things, like searching for the 'tip of the day'. To use it set this to 'Yes'.")); if (data.useExtEPGInfo) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { if (SearchExtCat->searchmode >= 10) Add(new cMenuEditIntItem(IndentMenuItem(SearchExtCat->menuname), &catvaluesNumeric[index], 0, 999999, "")); else Add(new cMenuEditStrItem( IndentMenuItem(SearchExtCat->menuname), data.catvalues[index], MaxFileName, tr(AllowedChars))); AddHelp(tr("Help$The file epgsearchcats.conf specifies the search mode for this entry. One can search by text or by value. You can also edit a list of predefined values in this file that can be selected here.")); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } Add(new cMenuEditBoolItem(IndentMenuItem(tr("Ignore missing categories")), &data.ignoreMissingEPGCats, trVDR("no"), trVDR("yes"))); AddHelp(tr("Help$If a selected category is not part of the summary of an event this normally excludes this event from the search results. To avoid this, set this option to 'Yes', but please handle this with care to avoid a huge amount of results.")); } } Add(new cMenuEditStraItem(tr("Use channel"), &data.useChannel, 4, UseChannelSel)); if (data.useChannel==1) { Add(new cMenuEditChanItem(tr(" from channel"), &channelMin)); Add(new cMenuEditChanItem(tr(" to channel"), &channelMax)); } if (data.useChannel==2) { // create the char array for the menu display if (menuitemsChGr) delete [] menuitemsChGr; menuitemsChGr = ChannelGroups.CreateMenuitemsList(); int oldchannelGroupNr = channelGroupNr; channelGroupNr = ChannelGroups.GetIndex(channelGroupName); if (channelGroupNr == -1) { if (oldchannelGroupNr > 0 && oldchannelGroupNr <= ChannelGroups.Count()) // perhaps its name was changed channelGroupNr = oldchannelGroupNr; else channelGroupNr = 0; // no selection } else channelGroupNr++; Add(new cMenuEditStraItem(IndentMenuItem(tr("Channel group")), &channelGroupNr, ChannelGroups.Count()+1, menuitemsChGr)); } Add(new cMenuEditBoolItem( tr("Use time"), &data.useTime, trVDR("no"), trVDR("yes"))); if (data.useTime == true) { Add(new cMenuEditTimeItem(tr(" Start after"), &data.startTime)); Add(new cMenuEditTimeItem(tr(" Start before"), &data.stopTime)); } Add(new cMenuEditBoolItem( tr("Use duration"), &data.useDuration, trVDR("no"), trVDR("yes"))); if (data.useDuration == true) { Add(new cMenuEditTimeItem(tr(" Min. duration"), &data.minDuration)); Add(new cMenuEditTimeItem(tr(" Max. duration"), &data.maxDuration)); } Add(new cMenuEditBoolItem( tr("Use day of week"), &data.useDayOfWeek, trVDR("no"), trVDR("yes"))); if (data.useDayOfWeek) { if (data.DayOfWeek < 0) { UserDefDayOfWeek = data.DayOfWeek; data.DayOfWeek = 7; } Add(new cMenuEditStraItem(IndentMenuItem(tr("Day of week")), &data.DayOfWeek, 8, DaysOfWeek)); } Add(new cMenuEditStraItem(tr("Use blacklists"), &data.blacklistMode, 4, BlacklistModes)); if (EPGSearchConfig.showFavoritesMenu) Add(new cMenuEditBoolItem( tr("Use in favorites menu"), &data.useInFavorites, trVDR("no"), trVDR("yes"))); int countSearchTemplates = 0; if ((countSearchTemplates = cTemplFile::CountSearchResultsTemplates()) > 1) { Add(new cMenuEditStraItem(tr("Result menu layout"), &data.menuTemplate, countSearchTemplates, cTemplFile::SearchTemplates)); } Add(new cMenuEditStraItem( tr("Use as search timer"), &data.useAsSearchTimer, 3, SearchActiveModes)); if (data.useAsSearchTimer) { Add(new cMenuEditStraItem(IndentMenuItem(tr("Action")), &data.action, 5, SearchTimerModes)); if (data.action == searchTimerActionSwitchOnly) { Add(new cMenuEditIntItem(IndentMenuItem(tr("Switch ... minutes before start")), &data.switchMinsBefore, 0, 99)); Add(new cMenuEditBoolItem(IndentMenuItem(tr("Unmute sound")), &data.unmuteSoundOnSwitch, trVDR("no"), trVDR("yes"))); } if (data.action == searchTimerActionAnnounceAndSwitch) { Add(new cMenuEditIntItem(IndentMenuItem(tr("Ask ... minutes before start")), &data.switchMinsBefore, 0, 99)); Add(new cMenuEditBoolItem(IndentMenuItem(tr("Unmute sound")), &data.unmuteSoundOnSwitch, trVDR("no"), trVDR("yes"))); } if (data.action == searchTimerActionRecord) { Add(new cMenuEditBoolItem( tr(" Series recording"), &data.useEpisode, trVDR("no"), trVDR("yes"))); Add(new cMenuEditStrItem(IndentMenuItem(tr("Directory")), data.directory, sizeof(data.directory), tr(AllowedChars))); Add(new cMenuEditIntItem(IndentMenuItem(tr("Delete recordings after ... days")), &data.delAfterDays, 0, 999)); if (data.delAfterDays > 0) Add(new cMenuEditIntItem(IndentMenuItem(IndentMenuItem(tr("Keep ... recordings"))), &data.recordingsKeep, 0, 999)); Add(new cMenuEditIntItem(IndentMenuItem(tr("Pause when ... recordings exist")), &data.pauseOnNrRecordings, 0, 999)); Add(new cMenuEditBoolItem(IndentMenuItem(tr("Avoid repeats")), &data.avoidRepeats, trVDR("no"), trVDR("yes"))); if (data.avoidRepeats) { Add(new cMenuEditIntItem(IndentMenuItem(tr("Allowed repeats"),2), &data.allowedRepeats, 0, 99)); if (data.allowedRepeats > 0) Add(new cMenuEditIntItem(IndentMenuItem(tr("Only repeats within ... days"),2), &data.repeatsWithinDays, 0, 999)); Add(new cMenuEditBoolItem(IndentMenuItem(tr("Compare title"),2), &data.compareTitle, trVDR("no"), trVDR("yes"))); Add(new cMenuEditStraItem(IndentMenuItem(tr("Compare subtitle"),2), &data.compareSubtitle, 2, CompareSubtitleModes)); Add(new cMenuEditBoolItem(IndentMenuItem(tr("Compare summary"),2), &data.compareSummary, trVDR("no"), trVDR("yes"))); if (data.compareSummary) Add(new cMenuEditIntItem(IndentMenuItem(tr("Min. match in %"),3), &data.compareSummaryMatchInPercent, 1, 100)); Add(new cMenuEditStraItem(IndentMenuItem(tr("Compare date"),2), &data.compareDate, 4, CompareDateModes)); // show 'Compare categories' only if we have them if (SearchExtCats.Count() > 0) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int iUsed = 0; int index = 0; while (SearchExtCat) { if (catarrayAvoidRepeats[index]) iUsed++; SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } cString itemtext = cString::sprintf("%s (%d/%d)", tr("Compare categories"), iUsed, SearchExtCats.Count()); Add(new cOsdItem(IndentMenuItem(IndentMenuItem(itemtext)))); } } Add(new cMenuEditIntItem(IndentMenuItem(trVDR("Priority")), &data.Priority, 0, MAXPRIORITY)); Add(new cMenuEditIntItem(IndentMenuItem(trVDR("Lifetime")), &data.Lifetime, 0, MAXLIFETIME)); Add(new cMenuEditIntItem(IndentMenuItem(trVDR("Setup.Recording$Margin at start (min)")), &data.MarginStart, -INT_MAX, INT_MAX)); Add(new cMenuEditIntItem(IndentMenuItem(trVDR("Setup.Recording$Margin at stop (min)")), &data.MarginStop, -INT_MAX, INT_MAX)); Add(new cMenuEditBoolItem(IndentMenuItem(tr("VPS")), &data.useVPS, trVDR("no"), trVDR("yes"))); } if (data.action == searchTimerActionRecord) { Add(new cMenuEditStraItem(IndentMenuItem(tr("Auto delete")), &data.delMode, 3, DelModes)); if (data.delMode == 1) Add(new cMenuEditIntItem(IndentMenuItem(IndentMenuItem(tr("after ... recordings"))), &data.delAfterCountRecs, 0, 999)); else if (data.delMode == 2) Add(new cMenuEditIntItem(IndentMenuItem(IndentMenuItem(tr("after ... days after first rec."))), &data.delAfterDaysOfFirstRec, 0, 999)); } } SetCurrent(Get(current)); } cMenuEditSearchExt::~cMenuEditSearchExt() { if (searchExt && addIfConfirmed) delete searchExt; // apparently it wasn't confirmed if (menuitemsChGr) free(menuitemsChGr); if (channelGroupName) free(channelGroupName); if (catarrayAvoidRepeats) free(catarrayAvoidRepeats); if (catvaluesNumeric) free(catvaluesNumeric); if (contentStringsFlags) free(contentStringsFlags); int i; for(i=0; i<=5; i++) free(SearchModes[i]); for(i=0; i<=7; i++) free(DaysOfWeek[i]); for(i=0; i<=2; i++) free(UseChannelSel[i]); for(i=0; i<=2; i++) free(SearchTimerModes[i]); for(i=0; i<=3; i++) free(BlacklistModes[i]); for(i=0; i<=2; i++) free(DelModes[i]); for(i=0; i<=2; i++) free(SearchActiveModes[i]); for(i=0; i<=1; i++) free(CompareSubtitleModes[i]); for(i=0; i<=3; i++) free(CompareDateModes[i]); } eOSState cMenuEditSearchExt::Help() { const char* ItemText = Get(Current())->Text(); eOSState state = osContinue; if(Current() < (int) helpTexts.size()) { char* title = NULL; if (msprintf(&title, "%s - %s", tr("Button$Help"), ItemText)!=-1) { if (strchr(title, ':')) *strchr(title, ':') = 0; state = AddSubMenu(new cMenuText(title, helpTexts[Current()])); free(title); } } return state; } eOSState cMenuEditSearchExt::ProcessKey(eKeys Key) { bool bHadSubMenu = HasSubMenu(); int iTemp_mode = data.mode; int iTemp_useTime = data.useTime; int iTemp_useChannel = data.useChannel; int iTemp_useDuration = data.useDuration; int iTemp_useDayOfWeek = data.useDayOfWeek; int iTemp_useAsSearchTimer = data.useAsSearchTimer; int iTemp_useExtEPGInfo = data.useExtEPGInfo; int iTemp_useContentDescriptor = useContentDescriptors; int iTemp_avoidRepeats = data.avoidRepeats; int iTemp_allowedRepeats = data.allowedRepeats; int iTemp_delAfterDays = data.delAfterDays; int iTemp_action = data.action; int iTemp_delMode = data.delMode; int iTemp_compareSummary = data.compareSummary; eOSState state = cOsdMenu::ProcessKey(Key); if (iTemp_mode != data.mode || iTemp_useTime != data.useTime || iTemp_useChannel != data.useChannel || iTemp_useDuration != data.useDuration || iTemp_useDayOfWeek != data.useDayOfWeek || iTemp_useAsSearchTimer != data.useAsSearchTimer || iTemp_useExtEPGInfo != data.useExtEPGInfo || iTemp_useContentDescriptor != useContentDescriptors || iTemp_avoidRepeats != data.avoidRepeats || iTemp_allowedRepeats != data.allowedRepeats || iTemp_delAfterDays != data.delAfterDays || iTemp_action != data.action || iTemp_delMode != data.delMode || iTemp_compareSummary != data.compareSummary) { Set(); Display(); if ((iTemp_useAsSearchTimer != data.useAsSearchTimer || iTemp_action != data.action) && data.useAsSearchTimer) // if search timer menu is dropped then scroll down to display all contents { int cur = Current(); PageDown(); SetCurrent(Get(cur)); Display(); } } const char* ItemText = Get(Current())->Text(); if (!HasSubMenu()) { if (strlen(ItemText)>0 && strstr(ItemText, tr(" from channel")) == ItemText && ((Key >= k0 && Key <= k9) || Key == kLeft || Key == kRight)) { channelMax = channelMin; Set(); Display(); } } int iOnUserDefDayItem = 0; int iOnDirectoryItem = 0; int iOnUseChannelGroups = 0; int iOnChannelGroup = 0; int iOnAvoidRepeats = 0; int iOnCompareCats = 0; int iOnTerm = 0; int iOnUseBlacklistsSelection = 0; int iOnExtCatItemBrowsable = 0; int iOnUseAsSearchTimer = 0; int iCatIndex = -1; char* catname = NULL; if (!HasSubMenu() && strlen(ItemText)>0) { // check, if on an item of ext. EPG info int iOnExtCatItem = 0; cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { if (strstr(ItemText, IndentMenuItem(SearchExtCat->menuname)) == ItemText) { iOnExtCatItem = 1; if (SearchExtCat->nvalues > 0) iOnExtCatItemBrowsable = 1; iCatIndex = index; catname = SearchExtCat->menuname; break; } index++; SearchExtCat = SearchExtCats.Next(SearchExtCat); } if (strstr(ItemText, tr("Search term")) == ItemText) { if (!InEditMode(ItemText, tr("Search term"), data.search)) // show template for a new search { SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Templates")); iOnTerm = 1; } } else if (strstr(ItemText, IndentMenuItem(tr("Day of week"))) == ItemText) { if (data.DayOfWeek == 7) { SetHelp(trVDR("Button$Edit")); iOnUserDefDayItem = 1; } else SetHelp(NULL, NULL, tr("Button$Help")); } else if (strstr(ItemText, tr("Use as search timer")) == ItemText) { if (data.useAsSearchTimer == 2) { SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Setup")); iOnUseAsSearchTimer = 1; } else SetHelp(NULL, NULL, tr("Button$Help")); } else if (strstr(ItemText, IndentMenuItem(tr("Directory"))) == ItemText) { if (!InEditMode(ItemText, IndentMenuItem(tr("Directory")), data.directory)) SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Select")); iOnDirectoryItem = 1; } else if (strstr(ItemText, tr("Use channel")) == ItemText && data.useChannel == 2) { SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Setup")); iOnUseChannelGroups = 1; } else if (strstr(ItemText, IndentMenuItem(tr("Channel group"))) == ItemText) { SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Setup")); iOnChannelGroup = 1; } else if (strstr(ItemText, tr("Use blacklists")) == ItemText && data.blacklistMode == blacklistsSelection) { SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Setup")); iOnUseBlacklistsSelection = 1; } else if (strstr(ItemText, IndentMenuItem(tr("Avoid repeats"))) == ItemText) { SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Setup")); iOnAvoidRepeats = 1; } else if (strstr(ItemText, IndentMenuItem(IndentMenuItem(tr("Compare categories")))) == ItemText) { SetHelp(NULL, NULL, tr("Button$Help"), tr("Button$Setup")); iOnCompareCats = 1; } else if (iOnExtCatItem) { if (!InEditMode(ItemText, IndentMenuItem(catname), data.catvalues[iCatIndex]) || SearchExtCats.Get(iCatIndex)->searchmode >= 10) SetHelp(NULL, NULL, tr("Button$Help"), iOnExtCatItemBrowsable?tr("Button$Select"):NULL); } else if (strstr(ItemText, tr("Search term")) != ItemText) SetHelp(NULL, NULL, tr("Button$Help"), NULL); } if (state == osUnknown) { if (HasSubMenu()) return osContinue; switch (Key) { case kOk: if (data.useChannel==1) { cChannel *ch = Channels.GetByNumber(channelMin); if (ch) data.channelMin = ch; else { ERROR(tr("*** Invalid Channel ***")); break; } ch = Channels.GetByNumber(channelMax); if (ch) data.channelMax = ch; else { ERROR(tr("*** Invalid Channel ***")); break; } if (channelMin > channelMax) { ERROR(tr("Please check channel criteria!")); return osContinue; } } if (data.useChannel==2) data.channelGroup = strdup(menuitemsChGr[channelGroupNr]); if ((data.useTitle || data.useSubtitle || data.useDescription) && (int(strlen(data.search)) < 3) && !Interface->Confirm(tr("Edit$Search text too short - use anyway?"))) break; if (searchExt) { *searchExt = data; if (data.DayOfWeek == 7) searchExt->DayOfWeek = UserDefDayOfWeek; // transfer cat selection for 'avoid repeats' back to search cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; searchExt->catvaluesAvoidRepeat = 0; while (SearchExtCat) { if (catarrayAvoidRepeats[index]) searchExt->catvaluesAvoidRepeat += (1<searchmode >= 10) { if (searchExt->catvalues[index]) free(searchExt->catvalues[index]); msprintf(&searchExt->catvalues[index], "%d", catvaluesNumeric[index]); } SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } searchExt->SetContentFilter(useContentDescriptors?contentStringsFlags:NULL); if (data.blacklistMode == blacklistsSelection) { searchExt->blacklists.Clear(); cBlacklistObject* blacklistObj = blacklists.First(); while(blacklistObj) { searchExt->blacklists.Add(new cBlacklistObject(blacklistObj->blacklist)); blacklistObj = blacklists.Next(blacklistObj); } } else searchExt->blacklists.Clear(); if (addIfConfirmed) { cMutexLock SearchExtsLock(&SearchExts); searchExt->ID = SearchExts.GetNewID(); SearchExts.Add(searchExt); } if (searchExt->useAsSearchTimer && !EPGSearchConfig.useSearchTimers) // enable search timer thread if necessary { cSearchTimerThread::Init((cPluginEpgsearch*) cPluginManager::GetPlugin("epgsearch"), true); INFO(tr("Search timers activated in setup.")); } SearchExts.Save(); addIfConfirmed = false; } return osBack; case kRed: if (iOnUserDefDayItem) state = AddSubMenu(new cMenuEditDaysOfWeek(&UserDefDayOfWeek)); break; case kBlue: if (iOnDirectoryItem && !InEditMode(ItemText, IndentMenuItem(tr("Directory")), data.directory)) state = AddSubMenu(new cMenuDirSelect(data.directory)); if (iOnUseChannelGroups || iOnChannelGroup) { if (channelGroupName) free(channelGroupName); channelGroupName = strdup(menuitemsChGr[channelGroupNr]); state = AddSubMenu(new cMenuChannelGroups(&channelGroupName)); } if (iOnAvoidRepeats) state = AddSubMenu(new cMenuRecsDone(searchExt)); if (iOnCompareCats) state = AddSubMenu(new cMenuSearchEditCompCats(catarrayAvoidRepeats)); if (iOnTerm) state = AddSubMenu(new cMenuEPGSearchTemplate(&data, NULL, addIfConfirmed)); if (iOnUseBlacklistsSelection) state = AddSubMenu(new cMenuBlacklistsSelection(&blacklists)); if (iOnExtCatItemBrowsable) state = AddSubMenu(new cMenuCatValuesSelect(data.catvalues[iCatIndex], iCatIndex, SearchExtCats.Get(iCatIndex)->searchmode)); if (iOnUseAsSearchTimer) state = AddSubMenu(new cMenuSearchActivSettings(&data)); break; case kGreen: state = osContinue; break; case kYellow: case kInfo: state = Help(); break; default: break; } } if ((iOnUseChannelGroups || iOnChannelGroup || iOnCompareCats || iOnTerm || iOnExtCatItemBrowsable) && bHadSubMenu && !HasSubMenu()) // return form submenu { if (iOnTerm) { if (data.DayOfWeek < 0) { UserDefDayOfWeek = data.DayOfWeek; data.DayOfWeek = 7; } if (data.useChannel == 1) { channelMin = data.channelMin->Number(); channelMax = data.channelMax->Number(); } if (data.useChannel == 2) { channelGroupNr = ChannelGroups.GetIndex(data.channelGroup); channelGroupName = strdup(data.channelGroup); } if (SearchExtCats.Count() > 0) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { catarrayAvoidRepeats[index] = (data.catvaluesAvoidRepeat & (1< 0) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { if (SearchExtCat->searchmode >= 10) catvaluesNumeric[index] = atoi(data.catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } } Set(); Display(); } return state; } // --- cMenuEditDaysOfWeek -------------------------------------------------------- cMenuEditDaysOfWeek::cMenuEditDaysOfWeek(int* DaysOfWeek, int Offset, bool Negate) :cOsdMenu(tr("Edit user-defined days of week"),30) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcPlugin); #endif int i=0; offset = Offset; negate = Negate; pDaysOfWeek = DaysOfWeek; if (negate) *pDaysOfWeek = -*pDaysOfWeek; for(i=0; i<7; i++) Days[(i+offset)%7]=((*pDaysOfWeek) & (int)pow(2,i))?1:0; for(i=0; i<7; i++) Add(new cMenuEditBoolItem( WeekDayName((i+1)%7), &Days[(i+1)%7], trVDR("no"), trVDR("yes"))); SetHelp(NULL); } eOSState cMenuEditDaysOfWeek::ProcessKey(eKeys Key) { if (Key == kBack && negate) *pDaysOfWeek = -*pDaysOfWeek; eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: *pDaysOfWeek = 0; for(int i=0; i<7; i++) *pDaysOfWeek += Days[i]?(int)pow(2,(i+7-offset)%7):0; if (negate) *pDaysOfWeek = -*pDaysOfWeek; state = osBack; break; default: break; } } return state; } // --- cMenuSearchEditCompCats -------------------------------------------------------- cMenuSearchEditCompCats::cMenuSearchEditCompCats(int* catarrayAvoidRepeats) :cOsdMenu(tr("Compare categories"),30) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcPlugin); #endif search_catarrayAvoidRepeats = catarrayAvoidRepeats; edit_catarrayAvoidRepeats = (int*) malloc(SearchExtCats.Count() * sizeof(int)); cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { edit_catarrayAvoidRepeats[index] = catarrayAvoidRepeats[index]; cString menutext = cString::sprintf("%s %s", tr("Compare"), SearchExtCat->menuname); Add(new cMenuEditBoolItem(menutext, &edit_catarrayAvoidRepeats[index], trVDR("no"), trVDR("yes"))); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } } cMenuSearchEditCompCats::~cMenuSearchEditCompCats() { free(edit_catarrayAvoidRepeats); } eOSState cMenuSearchEditCompCats::ProcessKey(eKeys Key) { eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { search_catarrayAvoidRepeats[index] = edit_catarrayAvoidRepeats[index]; SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } } state = osBack; break; default: break; } } return state; } // --- cMenuBlacklistsSelection -------------------------------------------------------- cMenuBlacklistsSelection::cMenuBlacklistsSelection(cList* pBlacklists) :cOsdMenu(tr("Select blacklists"),30) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcPlugin); #endif blacklists = pBlacklists; blacklistsSel = new int[Blacklists.Count()]; cMutexLock BlacklistLock(&Blacklists); cBlacklist* blacklist = Blacklists.First(); int index = 0; while(blacklist) { blacklistsSel[index] = false; cBlacklistObject* blacklistObjSel = blacklists->First(); while(blacklistObjSel) { if (blacklistObjSel->blacklist->ID == blacklist->ID) { blacklistsSel[index] = true; break; } blacklistObjSel = blacklists->Next(blacklistObjSel); } blacklist = Blacklists.Next(blacklist); index++; } SetHelp(tr("Button$Invert selection"), tr("Button$All yes"), tr("Button$All no"), tr("Button$Setup")); Set(); } cMenuBlacklistsSelection::~cMenuBlacklistsSelection() { if (blacklistsSel) delete [] blacklistsSel; } // --- cMenuBlacklistsSelectionItem ---------------------------------------------------------- class cMenuBlacklistsSelectionItem : public cMenuEditBoolItem { const char* name; public: cMenuBlacklistsSelectionItem(const char *Name, int *Value, const char *FalseString = NULL, const char *TrueString = NULL): cMenuEditBoolItem(Name, Value, FalseString, TrueString) { name = Name; } int Compare(const cListObject &ListObject) const { cMenuBlacklistsSelectionItem *p = (cMenuBlacklistsSelectionItem*)&ListObject; return strcasecmp(name, p->name); } }; void cMenuBlacklistsSelection::Set() { int current = Current(); Clear(); cMutexLock BlacklistLock(&Blacklists); cBlacklist* blacklist = Blacklists.First(); int index = 0; while(blacklist) { Add(new cMenuBlacklistsSelectionItem(blacklist->search, &blacklistsSel[index], trVDR("no"), trVDR("yes"))); blacklist = Blacklists.Next(blacklist); index++; } SetCurrent(Get(current)); Sort(); } eOSState cMenuBlacklistsSelection::ProcessKey(eKeys Key) { bool bHadSubMenu = HasSubMenu(); eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: { cMutexLock BlacklistLock(&Blacklists); blacklists->Clear(); cBlacklist* blacklist = Blacklists.First(); int index = 0; while(blacklist) { if (blacklistsSel[index++]) blacklists->Add(new cBlacklistObject(blacklist)); blacklist = Blacklists.Next(blacklist); } } state = osBack; break; case kRed: case kGreen: case kYellow: { cMutexLock BlacklistLock(&Blacklists); cBlacklist* blacklist = Blacklists.First(); int index = 0; while(blacklist) { blacklistsSel[index] = (Key == kGreen?1:(Key == kRed?1-blacklistsSel[index]:0)); blacklist = Blacklists.Next(blacklist); index++; } Set(); Display(); return osContinue; } break; case kBlue: state = AddSubMenu(new cMenuBlacklists); break; default: break; } } if (bHadSubMenu && !HasSubMenu()) // return form submenu { Clear(); delete [] blacklistsSel; blacklistsSel = new int[Blacklists.Count()]; cMutexLock BlacklistLock(&Blacklists); cBlacklist* blacklist = Blacklists.First(); int index = 0; while(blacklist) { blacklistsSel[index] = false; cBlacklistObject* blacklistObjSel = blacklists->First(); while(blacklistObjSel) { if (blacklistObjSel->blacklist->ID == blacklist->ID) { blacklistsSel[index] = true; break; } blacklistObjSel = blacklists->Next(blacklistObjSel); } blacklist = Blacklists.Next(blacklist); index++; } Set(); Display(); } return state; } // --- cMenuCatValuesSelect -------------------------------------------------------- cMenuCatValuesSelect::cMenuCatValuesSelect(char* CatValues, int CatIndex, int SearchMode) :cOsdMenu(tr("Values for EPG category"), 1, 40) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcPlugin); #endif catValues = CatValues; catIndex = CatIndex; searchMode = SearchMode; cSearchExtCat* SearchExtCat = SearchExtCats.Get(catIndex); if (SearchExtCat) { sel_cats.assign(SearchExtCat->nvalues, false); for(int i=0; invalues; i++) { char *pstrSearchToken, *pptr; char *pstrSearch=strdup(catValues); pstrSearchToken=strtok_r(pstrSearch, ",;|~", &pptr); while(pstrSearchToken) { if(SearchExtCat->values[i] && strcmp(SearchExtCat->values[i], skipspace(pstrSearchToken))==0) sel_cats[i] = true; pstrSearchToken=strtok_r(NULL, ",;|~", &pptr); } free(pstrSearch); } } Set(); SetHelp(trVDR("Button$On/Off"), NULL, NULL, tr("Button$Apply")); } void cMenuCatValuesSelect::Set() { int current = Current(); int selCount = 0; Clear(); string SearchMode = string(tr("Search mode")) + ": "; if (searchMode == 0) SearchMode += tr("phrase"); else if (searchMode == 1) SearchMode += tr("all words"); else if (searchMode == 2) SearchMode += tr("at least one word"); else if (searchMode == 3) SearchMode += tr("match exactly"); else if (searchMode == 4) SearchMode += tr("regular expression"); else if (searchMode == 10) SearchMode += tr("less"); else if (searchMode == 11) SearchMode += tr("less or equal"); else if (searchMode == 12) SearchMode += tr("greater"); else if (searchMode == 13) SearchMode += tr("greater or equal"); else if (searchMode == 14) SearchMode += tr("equal"); else if (searchMode == 15) SearchMode += tr("not equal"); cOsdItem* sItem = new cOsdItem(SearchMode.c_str()); Add(sItem); sItem->SetSelectable(false); cSearchExtCat* SearchExtCat = SearchExtCats.Get(catIndex); if (SearchExtCat) { for(int i=0; invalues; i++) { cString entry = cString::sprintf("%c\t%s", sel_cats[i]?'*':' ', SearchExtCat->values[i]); if (sel_cats[i]) selCount++; Add(new cOsdItem(entry)); } } SetCurrent(Get(current)); if (SearchExtCat) { cString title = cString::sprintf("%s (%d/%d)", tr("Values for EPG category"), selCount, SearchExtCat->nvalues); if (*title) SetTitle(title); } Display(); } eOSState cMenuCatValuesSelect::ProcessKey(eKeys Key) { eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: case kRed: if (Current()>0) { cSearchExtCat* SearchExtCat = SearchExtCats.Get(catIndex); if (SearchExtCat && SearchExtCat->searchmode >= 10 && catValues) // only one numeric value, so jump back { strcpy(catValues, SearchExtCat->values[Current()-1]); state = osBack; } else { sel_cats[Current()-1] = !sel_cats[Current()-1]; Set(); Display(); } } break; case kBlue: { *catValues = 0; cSearchExtCat* SearchExtCat = SearchExtCats.Get(catIndex); if (SearchExtCat) { for(int i=0; invalues; i++) { if (sel_cats[i]) { if (*catValues) strcat(catValues, ", "); strcat(catValues, SearchExtCat->values[i]); } } } state = osBack; break; } default: break; } } return state; } // --- cMenuSearchActivSettings -------------------------------------------------------- cMenuSearchActivSettings::cMenuSearchActivSettings(cSearchExt *SearchExt) :cOsdMenu(tr("Activation of search timer"), 25) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcPlugin); #endif searchExt = SearchExt; if (searchExt) { Add(new cMenuEditDateItem(tr("First day"), &searchExt->useAsSearchTimerFrom, NULL)); Add(new cMenuEditDateItem(tr("Last day"), &searchExt->useAsSearchTimerTil, NULL)); } } eOSState cMenuSearchActivSettings::ProcessKey(eKeys Key) { eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kOk: state = osBack; break; default: break; } } return state; } vdr-plugin-epgsearch/menu_announcelist.h0000644000175000017500000000354312466747543020356 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __ANNOUNCELIST_H #define __ANNOUNCELIST_H #include "menu_searchresults.h" // --- cMenuAnnounceList ------------------------------------------------------ class cMenuAnnounceList : public cMenuSearchResultsForList { friend class cMenuAnnounceDetails; virtual void SetHelpKeys(bool Force=false); eOSState ProcessKey(eKeys Key); protected: static bool showsDetails; public: cMenuAnnounceList(cSearchResults& SearchResults); }; // --- cMenuAnnounceDetails ------------------------------------------------------ class cMenuAnnounceDetails : public cOsdMenu { const cEvent* event; const cSearchExt* search; int announceAgain; int announceWithNextUpdate; time_t announceAgainDay; eOSState ProcessKey(eKeys Key); void Set(); public: cMenuAnnounceDetails(const cEvent* Event, const cSearchExt* Search); ~cMenuAnnounceDetails(); }; #endif vdr-plugin-epgsearch/menu_conflictcheck.h0000644000175000017500000000563412466747543020456 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCHMENUCONFL_H #define __EPGSEARCHMENUCONFL_H #include #include "conflictcheck.h" #include "menu_event.h" // --- cMenuConflictCheckItem ------------------------------------------------------ class cMenuConflictCheckItem : public cOsdItem { public: cConflictCheckTime* checktime; cConflictCheckTimerObj* timerObj; cMenuConflictCheckItem(cConflictCheckTime* Ct, cConflictCheckTimerObj* TimerObj = NULL); }; // --- cMenuConflictCheck ------------------------------------------------------ class cMenuConflictCheck : public cOsdMenu { private: cConflictCheck conflictCheck; bool showAll; int lastSel; virtual eOSState ProcessKey(eKeys Key); cConflictCheckTimerObj* CurrentTimerObj(void); void Update(); bool BuildList(); public: cMenuConflictCheck(); }; // --- cMenuConflictCheckDetailsItem ------------------------------------------------------ class cMenuConflictCheckDetailsItem : public cOsdItem { bool hasTimer; public: cConflictCheckTimerObj* timerObj; cMenuConflictCheckDetailsItem(cConflictCheckTimerObj* TimerObj = NULL); bool Update(bool Force = false); }; // --- cMenuConflictCheckDetails ------------------------------------------------------ class cMenuConflictCheckDetails : public cOsdMenu { private: cConflictCheck* conflictCheck; cConflictCheckTimerObj* timerObj; cConflictCheckTime* checktime; cEventObjects eventObjects; virtual eOSState ProcessKey(eKeys Key); cConflictCheckTimerObj* CurrentTimerObj(void); eOSState Commands(eKeys Key); void SetHelpKeys(); eOSState ToggleTimer(cConflictCheckTimerObj* TimerObj); eOSState DeleteTimer(cConflictCheckTimerObj* TimerObj); bool Update(bool Force = false); bool BuildList(); eOSState ShowSummary(); void UpdateCurrent(); public: cMenuConflictCheckDetails(cConflictCheckTimerObj* TimerObj = NULL, cConflictCheck* ConflictCheck = NULL); }; #endif vdr-plugin-epgsearch/INSTALL0000644000175000017500000000273412466747543015511 0ustar tobiastobiasTheres nothing special about it. Install it like any other standard plugin (unpack, soft link, make plugins). Optional libraries: ------------------- libpcre ------- For support of Perl compatible regular expressions in a search you have to use libpcre: simply edit the plugins Makefile and uncomment '#REGEXLIB = pcre' to 'REGEXLIB = pcre' or append 'REGEXLIB=pcre' to your 'make plugins' call. (you will need pcreposix installed, comes with libpcre from www.pcre.org, but it's already part of most distributions HINT: if all compiles well, but after starting VDR you get: ERROR: /usr/lib/libpcreposix.so.0: undefined symbol: pcre_free). update libpcre from www.pcre.org and recompile the plugin. There seems to be a problem with PCRE on some systems, that produce a crash when using regexp. Til now, I could not find the reason. So perhaps dont use REGEXLIB=pcre, if you don't really need it. libtre ------ epgsearch has a fuzzy search algorithm. Unfortunately it's restricted to search patterns with a maximum of 31 characters. This results in empty results if more than 31 characters are used. To avoid this limitation you can use the TRE package (http://laurikari.net/tre/). Install tre (on debian: apt-get install tre-agrep libtre4 libtre-dev) and activate epgsearch's support for it in the Makefile by uncommenting '#REGEXLIB = pcre' to 'REGEXLIB = tre' or append it to your 'make plugins' call. After recompiling epgsearch will now use an algorithm similar to 'agrep' with no limits. vdr-plugin-epgsearch/uservars.h0000644000175000017500000006361512466747543016510 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __USERVARS_INC__ #define __USERVARS_INC__ #include #include #include #include #include #include #include #include "varparser.h" #include "epgsearchtools.h" #include "epgsearchcats.h" using std::string; using std::set; using std::map; using std::ostringstream; class cUserVar : public cListObject { const cEvent* oldEvent; // cache bool oldescapeStrings; string oldResult; string EvaluateCondExpr(const cEvent* e, bool escapeStrings = false); string EvaluateCompExpr(const cEvent* e, bool escapeStrings = false); string EvaluateShellCmd(const cEvent* e); string EvaluateConnectCmd(const cEvent* e); string EvaluateLengthCmd(const cEvent* e); public: cUserVar(); cVarParser varparser; set usedVars; virtual string Evaluate(const cEvent* e, bool escapeStrings = false); string EvaluateInternalVars(const string& Expr, const cEvent* e, bool escapeStrings = false); string EvaluateInternalTimerVars(const string& Expr, const cTimer* t); string EvaluateInternalSearchVars(const string& Expr, const cSearchExt* s); string EvaluateExtEPGVars(const string& Expr, const cEvent* e, bool escapeStrings = false); string EvaluateUserVars(const string& Expr, const cEvent* e, bool escapeStrings = false); virtual string Name(bool = false) { return varparser.varName; } virtual bool IsCondExpr() { return varparser.IsCondExpr(); } virtual bool IsShellCmd() { return varparser.IsShellCmd(); } virtual bool IsConnectCmd() { return varparser.IsConnectCmd(); } virtual bool IsLengthCmd() { return varparser.IsLengthCmd(); } bool DependsOnVar(const string& varName); bool DependsOnVar(cUserVar* var); bool AddDepVar(cUserVar* var); void ResetCache(); }; class cExtEPGVar : public cUserVar { const string name; static string nameSpace; public: cExtEPGVar(const string& Name) : name(Name) {} string Name(bool withNamespace = false) { return "%" + (withNamespace?nameSpace + ".":"") + name + "%"; } bool IsCondExpr() { return false; } bool IsShellCmd() { return false; } string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; cSearchExtCat* SearchExtCat = SearchExtCats.First(); while (SearchExtCat) { string varName = string("%") + SearchExtCat->name + string("%"); int varPos = FindIgnoreCase(varName, Name()); if (varPos == 0) { char* value = GetExtEPGValue(e, SearchExtCat); string res = value?value:""; if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } SearchExtCat = SearchExtCats.Next(SearchExtCat); } return ""; } }; class cInternalVar : public cUserVar { const string name; public: cInternalVar(const string& Name) : name(Name) {} string Name(bool = false) { return "%" + name + "%"; } bool IsCondExpr() { return false; } bool IsShellCmd() { return false; } }; class cTitleVar : public cInternalVar { public: cTitleVar() : cInternalVar("title") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { string res = (e && !isempty(e->Title()))? e->Title() : ""; if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cSubtitleVar : public cInternalVar { public: cSubtitleVar() : cInternalVar("subtitle") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { string res = (e && !isempty(e->ShortText()))? e->ShortText() : ""; if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cSummaryVar : public cInternalVar { public: cSummaryVar() : cInternalVar("summary") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { string res = (e && !isempty(e->Description()))? e->Description() : ""; if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cHTMLSummaryVar : public cInternalVar { public: cHTMLSummaryVar() : cInternalVar("htmlsummary") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (e && !isempty(e->Description())) { string res = ReplaceAll(e->Description(), "\n", "
"); if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } else return ""; } }; class cEventIDVar : public cInternalVar { public: cEventIDVar() : cInternalVar("eventid") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (e) { ostringstream os; os << e->EventID(); return os.str(); } else return ""; } }; class cLiveEventIDVar : public cInternalVar { public: cLiveEventIDVar() : cInternalVar("liveeventid") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; cChannel *channel = Channels.GetByChannelID(e->ChannelID(), true); if (!channel) return ""; string res(channel->GetChannelID().ToString()); res = "event_" + res; res = ReplaceAll(res, ".", "p"); res = ReplaceAll(res, "-", "m"); res += "_" + NumToString(e->EventID()); if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cTimeVar : public cInternalVar { public: cTimeVar() : cInternalVar("time") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { string res = (e? *(e->GetTimeString()) : ""); if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cTimeEndVar : public cInternalVar { public: cTimeEndVar() : cInternalVar("timeend") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { string res = (e? *(e->GetEndTimeString()) : ""); if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cTime_wVar : public cInternalVar { public: cTime_wVar() : cInternalVar("time_w") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { string res = (e? WEEKDAYNAME(e->StartTime()) : ""); if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cTime_dVar : public cInternalVar { public: cTime_dVar() : cInternalVar("time_d") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; char day[3] = ""; struct tm tm_r; const time_t t = e->StartTime(); tm *tm = localtime_r(&t, &tm_r); strftime(day, sizeof(day), "%d", tm); if (escapeStrings) return "'" + EscapeString(day) + "'"; else return day; } }; class cTime_lngVar : public cInternalVar { public: cTime_lngVar() : cInternalVar("time_lng") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; ostringstream os; os << e->StartTime(); if (escapeStrings) return "'" + EscapeString(os.str()) + "'"; else return os.str(); } }; class cTimeSpanVar : public cInternalVar { public: cTimeSpanVar() : cInternalVar("timespan") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; time_t diff = e->StartTime() - time(NULL); string res; if (labs(diff) >= SECSINDAY) { cString buffer; if (diff > 0) buffer = cString::sprintf(tr("in %02ldd"), long(diff / SECSINDAY)); else buffer = cString::sprintf("%02ldd", long(-diff / SECSINDAY)); res = buffer; } else if (labs(diff) >= (60 * 60)) { cString buffer; if (diff > 0) buffer = cString::sprintf(tr("in %02ldh"), long(diff / (60*60))); else buffer = cString::sprintf("%02ldh", long(-diff / (60*60))); res = buffer; } else { cString buffer; if (diff > 0) buffer = cString::sprintf(tr("in %02ldm"), long(diff / 60)); else buffer = cString::sprintf("%02ldm", long(-diff / 60)); res = buffer; } if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cLength_Var : public cInternalVar { public: cLength_Var() : cInternalVar("length") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { return (e? NumToString(e->Duration()) : ""); } }; class cDateVar : public cInternalVar { public: cDateVar() : cInternalVar("date") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; char date[9] = ""; struct tm tm_r; const time_t t = e->StartTime(); tm *tm = localtime_r(&t, &tm_r); strftime(date, sizeof(date), "%d.%m.%y", tm); if (escapeStrings) return "'" + EscapeString(date) + "'"; else return date; } }; class cDateShortVar : public cInternalVar { public: cDateShortVar() : cInternalVar("datesh") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; char dateshort[7] = ""; struct tm tm_r; const time_t t = e->StartTime(); tm *tm = localtime_r(&t, &tm_r); strftime(dateshort, sizeof(dateshort), "%d.%m.", tm); if (escapeStrings) return "'" + EscapeString(dateshort) + "'"; else return dateshort; } }; class cDateISOVar : public cInternalVar { public: cDateISOVar() : cInternalVar("date_iso") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; char dateISO[11] = ""; struct tm tm_r; const time_t t = e->StartTime(); tm *tm = localtime_r(&t, &tm_r); strftime(dateISO, sizeof(dateISO), "%Y-%m-%d", tm); if (escapeStrings) return "'" + EscapeString(dateISO) + "'"; else return dateISO; } }; class cYearVar : public cInternalVar { public: cYearVar() : cInternalVar("year") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; char year[5] = ""; struct tm tm_r; const time_t t = e->StartTime(); tm *tm = localtime_r(&t, &tm_r); strftime(year, sizeof(year), "%Y", tm); if (escapeStrings) return "'" + EscapeString(year) + "'"; else return year; } }; class cMonthVar : public cInternalVar { public: cMonthVar() : cInternalVar("month") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; char month[3] = ""; struct tm tm_r; const time_t t = e->StartTime(); tm *tm = localtime_r(&t, &tm_r); strftime(month, sizeof(month), "%m", tm); if (escapeStrings) return "'" + EscapeString(month) + "'"; else return month; } }; class cDayVar : public cInternalVar { public: cDayVar() : cInternalVar("day") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; char day[3] = ""; struct tm tm_r; const time_t t = e->StartTime(); tm *tm = localtime_r(&t, &tm_r); strftime(day, sizeof(day), "%d", tm); if (escapeStrings) return "'" + EscapeString(day) + "'"; else return day; } }; class cWeekVar : public cInternalVar { public: cWeekVar() : cInternalVar("week") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; char day[3] = ""; struct tm tm_r; const time_t t = e->StartTime(); tm *tm = localtime_r(&t, &tm_r); strftime(day, sizeof(day), "%V", tm); if (escapeStrings) return "'" + EscapeString(day) + "'"; else return day; } }; class cChannelNrVar : public cInternalVar { public: cChannelNrVar() : cInternalVar("chnr") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { int chnr = ChannelNrFromEvent(e); if (chnr < 0) return ""; return NumToString(chnr); } }; class cChannelShortVar : public cInternalVar { public: cChannelShortVar() : cInternalVar("chsh") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; cChannel *channel = Channels.GetByChannelID(e->ChannelID(), true); string res = channel?channel->ShortName(true):""; if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cChannelLongVar : public cInternalVar { public: cChannelLongVar() : cInternalVar("chlng") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; cChannel *channel = Channels.GetByChannelID(e->ChannelID(), true); string res = channel?channel->Name():""; if (escapeStrings) return "'" + EscapeString(res) + "'"; else return res; } }; class cChannelDataVar : public cInternalVar { public: cChannelDataVar() : cInternalVar("chdata") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; cChannel *channel = Channels.GetByChannelID(e->ChannelID(), true); return channel?CHANNELSTRING(channel):""; } }; class cChannelGroupVar : public cInternalVar { public: cChannelGroupVar() : cInternalVar("chgrp") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; ostringstream os; cChannel *channel = Channels.GetByChannelID(e->ChannelID(), true); while(channel && !channel->GroupSep()) channel = Channels.Prev(channel); if (!channel || !channel->Name()) return ""; string grpName = channel->Name(); if (escapeStrings) return "'" + EscapeString(grpName) + "'"; else return grpName; } }; class cNEWTCmdVar : public cInternalVar { public: cNEWTCmdVar() : cInternalVar("newtcmd") {} string Evaluate(const cEvent* e, bool escapeStrings = false) { if (!e) return ""; cTimer* timer = new cTimer(e); string newtCmd = *(timer->ToText()); if (escapeStrings) return "'" + EscapeString(newtCmd) + "'"; else return newtCmd; } }; // independet variables class cColonVar : public cInternalVar { public: cColonVar() : cInternalVar("colon") {} string Evaluate(const cEvent*, bool escapeStrings = false) { return ":"; } }; class cDateNowVar : public cInternalVar { public: cDateNowVar() : cInternalVar("datenow") {} string Evaluate(const cEvent*, bool escapeStrings = false) { char date[9] = ""; struct tm tm_r; const time_t t = time(NULL); tm *tm = localtime_r(&t, &tm_r); strftime(date, sizeof(date), "%d.%m.%y", tm); if (escapeStrings) return "'" + EscapeString(date) + "'"; else return date; } }; class cDateShortNowVar : public cInternalVar { public: cDateShortNowVar() : cInternalVar("dateshnow") {} string Evaluate(const cEvent*, bool escapeStrings = false) { char dateshort[7] = ""; struct tm tm_r; const time_t t = time(NULL); tm *tm = localtime_r(&t, &tm_r); strftime(dateshort, sizeof(dateshort), "%d.%m.", tm); if (escapeStrings) return "'" + EscapeString(dateshort) + "'"; else return dateshort; } }; class cDateISONowVar : public cInternalVar { public: cDateISONowVar() : cInternalVar("date_iso_now") {} string Evaluate(const cEvent*, bool escapeStrings = false) { char dateISO[11] = ""; struct tm tm_r; const time_t t = time(NULL); tm *tm = localtime_r(&t, &tm_r); strftime(dateISO, sizeof(dateISO), "%Y-%m-%d", tm); if (escapeStrings) return "'" + EscapeString(dateISO) + "'"; else return dateISO; } }; class cTimeNowVar : public cInternalVar { public: cTimeNowVar() : cInternalVar("timenow") {} string Evaluate(const cEvent*, bool escapeStrings = false) { return TIMESTRING(time(NULL)); } }; class cVideodirVar : public cInternalVar { public: cVideodirVar() : cInternalVar("videodir") {} string Evaluate(const cEvent*, bool escapeStrings = false) { #if APIVERSNUM > 20101 return cVideoDirectory::Name(); #else return VideoDirectory; #endif } }; class cPlugconfdirVar : public cInternalVar { public: static string dir; cPlugconfdirVar() : cInternalVar("plugconfdir") {} string Evaluate(const cEvent*, bool escapeStrings = false) { return dir; } }; class cEpgsearchconfdirVar : public cInternalVar { public: static string dir; cEpgsearchconfdirVar() : cInternalVar("epgsearchdir") {} string Evaluate(const cEvent*, bool escapeStrings = false) { return CONFIGDIR; } }; // timer variables class cTimerVar { static string nameSpace; const string name; public: cTimerVar(const string& Name) : name(Name) {} virtual ~cTimerVar() {} string Name() { return "%" + nameSpace + "." + name + "%"; } virtual string Evaluate(const cTimer* t) = 0; }; class cTimerDateVar : public cTimerVar { public: cTimerDateVar() : cTimerVar("date") {} string Evaluate(const cTimer* t) { if (!t) return ""; return DATESTRING(t->StartTime()); } }; class cTimerStartVar : public cTimerVar { public: cTimerStartVar() : cTimerVar("start") {} string Evaluate(const cTimer* t) { if (!t) return ""; return TIMESTRING(t->StartTime()); } }; class cTimerStopVar : public cTimerVar { public: cTimerStopVar() : cTimerVar("stop") {} string Evaluate(const cTimer* t) { if (!t) return ""; return TIMESTRING(t->StopTime()); } }; class cTimerFileVar : public cTimerVar { public: cTimerFileVar() : cTimerVar("file") {} string Evaluate(const cTimer* t) { if (!t) return ""; return t->File(); } }; class cTimerChnrVar : public cTimerVar { public: cTimerChnrVar() : cTimerVar("chnr") {} string Evaluate(const cTimer* t) { if (!t || !t->Channel()) return ""; return NumToString(t->Channel()->Number()); } }; class cTimerChannelShortVar : public cTimerVar { public: cTimerChannelShortVar() : cTimerVar("chsh") {} string Evaluate(const cTimer* t) { if (!t || !t->Channel()) return ""; return t->Channel()->ShortName(true); } }; class cTimerChannelLongVar : public cTimerVar { public: cTimerChannelLongVar() : cTimerVar("chlng") {} string Evaluate(const cTimer* t) { if (!t || !t->Channel()) return ""; return t->Channel()->Name(); } }; class cTimerSearchVar : public cTimerVar { public: cTimerSearchVar() : cTimerVar("search") {} string Evaluate(const cTimer* t) { if (!t) return ""; cSearchExt* s = TriggeredFromSearchTimer(t); if (!s) return ""; return s->search; } }; class cTimerSearchIDVar : public cTimerVar { public: cTimerSearchIDVar() : cTimerVar("searchid") {} string Evaluate(const cTimer* t) { if (!t) return ""; int ID = TriggeredFromSearchTimerID(t); if (ID < 0) return ""; return NumToString(ID); } }; class cTimerLiveIDVar : public cTimerVar { public: cTimerLiveIDVar() : cTimerVar("liveid") {} string Evaluate(const cTimer* t) { if (!t || !t->Channel()) return ""; ostringstream builder; builder << *(t->Channel()->GetChannelID().ToString()) << ":" << t->WeekDays() << ":" << t->Day() << ":" << t->Start() << ":" << t->Stop(); string res = builder.str(); res = "timer_" + res; res = ReplaceAll(res, ".", "p"); res = ReplaceAll(res, "-", "m"); res = ReplaceAll(res, ":", "c"); return res; } }; // search variables class cSearchVar { const string name; static string nameSpace; public: cSearchVar(const string& Name) : name(Name) {} virtual ~cSearchVar() {} string Name() { return "%" + nameSpace + "." + name + "%"; } virtual string Evaluate(const cSearchExt* s) = 0; }; class cSearchQueryVar : public cSearchVar { public: cSearchQueryVar() : cSearchVar("query") {} string Evaluate(const cSearchExt* s) { if (!s) return ""; return s->search; } }; class cSearchSeriesVar : public cSearchVar { public: cSearchSeriesVar() : cSearchVar("series") {} string Evaluate(const cSearchExt* s) { if (!s) return ""; return NumToString(s->useEpisode); } }; class cUserVars : public cList { public: cTitleVar titleVar; cSubtitleVar subtitleVar; cSummaryVar summaryVar; cHTMLSummaryVar htmlsummaryVar; cEventIDVar eventIDVar; cLiveEventIDVar liveeventIDVar; cTimeVar timeVar; cTimeEndVar timeEndVar; cTime_wVar time_wVar; cTime_dVar time_dVar; cTime_lngVar time_lngVar; cTimeSpanVar time_spanVar; cLength_Var length_Var; cDateVar dateVar; cDateShortVar dateShortVar; cDateISOVar dateISOVar; cYearVar yearVar; cMonthVar monthVar; cDayVar dayVar; cWeekVar weekVar; cChannelNrVar chnrVar; cChannelShortVar chShortVar; cChannelLongVar chLongVar; cChannelDataVar chDataVar; cChannelGroupVar chGroupVar; cNEWTCmdVar newtCmdVar; cSearchQueryVar searchQueryVar; cSearchSeriesVar searchSeriesVar; cColonVar colonVar; cDateNowVar dateNowVar; cDateShortNowVar dateShortNowVar; cDateISONowVar dateISONowVar; cTimeNowVar timeNowVar; cVideodirVar videodirVar; cPlugconfdirVar plugconfdirVar; cEpgsearchconfdirVar epgsearchconfdirVar; cTimerDateVar timerDateVar; cTimerStartVar timerStartVar; cTimerStopVar timerStopVar; cTimerFileVar timerFileVar; cTimerChnrVar timerChnrVar; cTimerChannelShortVar timerChShortVar; cTimerChannelLongVar timerChLongVar; cTimerSearchVar timerSearchVar; cTimerSearchIDVar timerSearchIDVar; cTimerLiveIDVar timerLiveIDVar; map extEPGVars; set userVars; map internalVars; map internalTimerVars; map internalSearchVars; void InitInternalVars() { internalVars[titleVar.Name()] = &titleVar; internalVars[subtitleVar.Name()] = &subtitleVar; internalVars[summaryVar.Name()] = &summaryVar; internalVars[htmlsummaryVar.Name()] = &htmlsummaryVar; internalVars[eventIDVar.Name()] = &eventIDVar; internalVars[liveeventIDVar.Name()] = &liveeventIDVar; internalVars[timeVar.Name()] = &timeVar; internalVars[timeEndVar.Name()] = &timeEndVar; internalVars[time_wVar.Name()] = &time_wVar; internalVars[time_dVar.Name()] = &time_dVar; internalVars[time_lngVar.Name()] = &time_lngVar; internalVars[time_spanVar.Name()] = &time_spanVar; internalVars[length_Var.Name()] = &length_Var; internalVars[dateVar.Name()] = &dateVar; internalVars[dateShortVar.Name()] = &dateShortVar; internalVars[dateISOVar.Name()] = &dateISOVar; internalVars[yearVar.Name()] = &yearVar; internalVars[monthVar.Name()] = &monthVar; internalVars[dayVar.Name()] = &dayVar; internalVars[weekVar.Name()] = &weekVar; internalVars[chnrVar.Name()] = &chnrVar; internalVars[chShortVar.Name()] = &chShortVar; internalVars[chLongVar.Name()] = &chLongVar; internalVars[chDataVar.Name()] = &chDataVar; internalVars[chGroupVar.Name()] = &chGroupVar; internalVars[newtCmdVar.Name()] = &newtCmdVar; internalVars[colonVar.Name()] = &colonVar; internalVars[dateNowVar.Name()] = &dateNowVar; internalVars[dateShortNowVar.Name()] = &dateShortNowVar; internalVars[dateISONowVar.Name()] = &dateISONowVar; internalVars[timeNowVar.Name()] = &timeNowVar; internalVars[videodirVar.Name()] = &videodirVar; internalVars[plugconfdirVar.Name()] = &plugconfdirVar; internalVars[epgsearchconfdirVar.Name()] = &epgsearchconfdirVar; internalTimerVars[timerDateVar.Name()] = &timerDateVar; internalTimerVars[timerStartVar.Name()] = &timerStartVar; internalTimerVars[timerStopVar.Name()] = &timerStopVar; internalTimerVars[timerFileVar.Name()] = &timerFileVar; internalTimerVars[timerChnrVar.Name()] = &timerChnrVar; internalTimerVars[timerChShortVar.Name()] = &timerChShortVar; internalTimerVars[timerChLongVar.Name()] = &timerChLongVar; internalTimerVars[timerSearchVar.Name()] = &timerSearchVar; internalTimerVars[timerSearchIDVar.Name()] = &timerSearchIDVar; internalTimerVars[timerLiveIDVar.Name()] = &timerLiveIDVar; internalSearchVars[searchQueryVar.Name()] = &searchQueryVar; internalSearchVars[searchSeriesVar.Name()] = &searchSeriesVar; } void InitExtEPGVars() { cSearchExtCat* SearchExtCat = SearchExtCats.First(); while (SearchExtCat) { string varName = SearchExtCat->name; std::transform(varName.begin(), varName.end(), varName.begin(), tolower); cExtEPGVar* extEPGVar = new cExtEPGVar(varName); extEPGVars[extEPGVar->Name()] = extEPGVar; SearchExtCat = SearchExtCats.Next(SearchExtCat); } } void ResetCache() { cUserVar* var = First(); while (var) { var->ResetCache(); var = Next(var); } } ~cUserVars() { std::map::iterator evar; for (evar = extEPGVars.begin(); evar != extEPGVars.end(); ++evar) delete evar->second; extEPGVars.clear(); std::set::iterator uvar; for (uvar = userVars.begin(); uvar != userVars.end(); ++uvar) delete (*uvar); userVars.clear(); } cUserVar* GetFromName(const string& varName, bool log = true); }; extern cUserVars UserVars; class cUserVarLine : public cListObject { public: static bool Parse(char *s); }; class cUserVarFile : public cConfig { public: cUserVarFile() { UserVars.Clear(); }; }; class cVarExpr { string expr; public: set usedVars; cVarExpr(const string& Expr) : expr(Expr) {} string Evaluate(const cEvent* e = NULL); string Evaluate(const cTimer* t); string Evaluate(const cSearchExt* s); bool DependsOnVar(const string& varName, const cEvent* e); }; #endif vdr-plugin-epgsearch/menu_announcelist.c0000644000175000017500000001420412466747543020345 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "menu_announcelist.h" #include "epgsearchcfg.h" #include "noannounce.h" bool cMenuAnnounceList::showsDetails; // --- cMenuAnnounceList ------------------------------------------------------- cMenuAnnounceList::cMenuAnnounceList(cSearchResults& SearchResults) :cMenuSearchResultsForList(SearchResults, tr("%d new broadcast"), false) { showsDetails = false; } void cMenuAnnounceList::SetHelpKeys(bool Force) { cMenuSearchResultsItem *item = (cMenuSearchResultsItem *)Get(Current()); int NewHelpKeys = 0; if (item) { if (item->Selectable() && item->timerMatch == tmFull) NewHelpKeys = 2; else NewHelpKeys = 1; } bool hasTimer = (NewHelpKeys == 2); if (NewHelpKeys != helpKeys || Force) { if (toggleKeys==0) SetHelp((EPGSearchConfig.redkeymode==0?(hasTimer?trVDR("Button$Timer"):trVDR("Button$Record")):tr("Button$Commands")), m_bSort? tr("Button$by channel"):tr("Button$by time"), modeYellow==showTitleEpisode?tr("Button$Episode"):tr("Button$Title"), trVDR("Button$Edit")); else SetHelp((EPGSearchConfig.redkeymode==1?(hasTimer?trVDR("Button$Timer"):trVDR("Button$Record")):tr("Button$Commands")), m_bSort? tr("Button$by channel"):tr("Button$by time"), modeYellow==showTitleEpisode?tr("Button$Episode"):tr("Button$Title"), trVDR("Button$Edit")); helpKeys = NewHelpKeys; } } eOSState cMenuAnnounceList::ProcessKey(eKeys Key) { eOSState state = cMenuSearchResultsForList::ProcessKey(Key); if (state == osUnknown) { switch (Key) { case kBlue: { cMenuSearchResultsItem *item = (cMenuSearchResultsItem *)Get(Current()); if (item) { if (!HasSubMenu()) return AddSubMenu(new cMenuAnnounceDetails(item->event, item->search)); else if (!showsDetails) return Switch(); else return osContinue; } } break; default: break; } } return state; } // --- cMenuAnnounceDetails ------------------------------------------------------- cMenuAnnounceDetails::cMenuAnnounceDetails(const cEvent* Event, const cSearchExt* Search) :cOsdMenu("", 25), event(Event) { #if VDRVERSNUM >= 10728 SetMenuCategory(mcEvent); #endif cMenuAnnounceList::showsDetails = true; if (event && !isempty(event->Title())) { cString szTitle = cString::sprintf("%s: %s", tr("announce details"), event->Title()); SetTitle(szTitle); } search = Search; announceAgain = 1; announceWithNextUpdate = 1; announceAgainDay = 0; cNoAnnounce* noAnnounce = NoAnnounces.InList(event); if (noAnnounce) { if (noAnnounce->nextAnnounce > 0) { announceAgainDay = noAnnounce->nextAnnounce; announceWithNextUpdate = 0; } else announceAgain = 0; } Set(); } cMenuAnnounceDetails::~cMenuAnnounceDetails() { cMenuAnnounceList::showsDetails = false; } void cMenuAnnounceDetails::Set() { int current = Current(); Clear(); Add(new cMenuEditBoolItem(tr("announce again"), &announceAgain, trVDR("no"), trVDR("yes"))); if (announceAgain) { Add(new cMenuEditBoolItem(IndentMenuItem(tr("with next update")), &announceWithNextUpdate, trVDR("no"), trVDR("yes"))); if (!announceWithNextUpdate) Add(new cMenuEditDateItem(IndentMenuItem(IndentMenuItem(tr("again from"))), &announceAgainDay, NULL)); } else announceAgainDay = 0; if (search) { cOsdItem* pInfoItem = new cOsdItem(""); pInfoItem->SetSelectable(false); Add(pInfoItem); cString info = cString::sprintf("%s: %s", tr("Search timer"), search->search); pInfoItem = new cOsdItem(info); pInfoItem->SetSelectable(false); Add(pInfoItem); } SetCurrent(Get(current)); Display(); } eOSState cMenuAnnounceDetails::ProcessKey(eKeys Key) { int iTemp_announceAgain = announceAgain; int iTemp_announceWithNextUpdate = announceWithNextUpdate; eOSState state = cOsdMenu::ProcessKey(Key); if (iTemp_announceAgain != announceAgain || iTemp_announceWithNextUpdate != announceWithNextUpdate) { Set(); Display(); } if (state == osUnknown) { switch (Key) { case kRed: case kGreen: case kBlue: case kYellow: case kFastRew: case kFastFwd: case kRecord: case k0...k9: return osContinue; case kOk: { cNoAnnounce* noAnnounce = NoAnnounces.InList(event); if (!announceAgain || !announceWithNextUpdate) { if (!noAnnounce) { noAnnounce = new cNoAnnounce(event, announceAgainDay); NoAnnounces.Add(noAnnounce); } else NoAnnounces.UpdateNextAnnounce(event, announceAgainDay); NoAnnounces.ClearOutdated(); } if (announceAgain && announceWithNextUpdate && noAnnounce) NoAnnounces.Del(noAnnounce); NoAnnounces.Save(); } return osBack; default: break; } } return state; } vdr-plugin-epgsearch/menu_favorites.h0000644000175000017500000000270112466747543017651 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCHFAVORITES_H #define __EPGSEARCHFAVORITES_H #include "menu_searchresults.h" class cMenuFavorites : public cMenuSearchResults { private: bool BuildList(); virtual eOSState OnGreen(); virtual eOSState OnYellow(); public: cMenuFavorites(); virtual eOSState ProcessKey(eKeys Key); virtual void SetHelpKeys(bool Force=false); #ifdef USE_GRAPHTFT virtual const char* MenuKind(); virtual void Display(void); #endif }; #endif vdr-plugin-epgsearch/menu_whatson.c0000644000175000017500000007054312466747543017336 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include #include #include "uservars.h" #include "menu_whatson.h" #include "epgsearchext.h" #include "menu_event.h" #include "menu_myedittimer.h" #include "menu_searchresults.h" #include "menu_search.h" #include "menu_commands.h" #include "epgsearchcfg.h" #include "switchtimer.h" #include "epgsearchcats.h" #include "conflictcheck.h" #include #include #include "menu_conflictcheck.h" #include "templatefile.h" #include "menu_deftimercheckmethod.h" #include "timerstatus.h" #define HOURS(x) ((x)/100) #define MINUTES(x) ((x)%100) #define SKIPHOURS 20 #define HOURS2SECS(x) (x*60*60) extern int exitToMainMenu; extern bool isUTF8; int gl_InfoConflict = 0; // --- cMenuMyScheduleItem ------------------------------------------------------ cMenuMyScheduleItem::cMenuMyScheduleItem(const cEvent *Event, cChannel *Channel, showMode Mode, cMenuTemplate* MenuTemplate) { event = Event; channel = Channel; mode = Mode; timerMatch = tmNone; inSwitchList = false; menuTemplate = MenuTemplate; Update(true); } bool cMenuMyScheduleItem::Update(bool Force) { if (!menuTemplate) return false; const char* menutemplate = menuTemplate->MenuTemplate(); if (!menutemplate || strlen(menutemplate) == 0) return false; bool result = false; eTimerMatch OldTimerMatch = timerMatch; bool OldInSwitchList = inSwitchList; bool hasMatch = false; cTimer* timer = NULL; if (event) timer = Timers.GetMatch(event, &timerMatch); if (event) inSwitchList = (SwitchTimers.InSwitchList(event)!=NULL); if (timer) hasMatch = true; if (Force || timerMatch != OldTimerMatch || inSwitchList != OldInSwitchList) { char szProgressPart[Utf8BufSize(12)] = ""; char szProgressPartT2S[12] = ""; time_t now = time(NULL); if (channel) { if (event) { time_t startTime = event->StartTime(); if ((now - event->StartTime()) >= 0 || strstr(menutemplate, "%time%") != NULL) { int frac = 0; if (mode == showNow) { int dur = event->Duration(); if (dur != 0) frac = ((now - startTime) * 8 + (dur >> 1)) / dur; } if (mode == showNext) frac = ( ( 30*60 - min((time_t)30*60, startTime - now) ) * 8 + 15*60 ) / (30*60); frac = min(8,max(0, frac)); szProgressPartT2S[0] = '['; memset(szProgressPartT2S + 1,'|',frac); memset(szProgressPartT2S + 1 + frac ,' ', 8 - frac); szProgressPartT2S[9] = ']'; szProgressPartT2S[10] = 0; if (!isUTF8) { szProgressPart[0] = ICON_BAR_OPEN; memset(szProgressPart + 1, ICON_BAR_EMPTY, 6); szProgressPart[7] = ICON_BAR_CLOSE; szProgressPart[8] = 0; memset(szProgressPart, ICON_BAR_FULL, frac?frac:sizeof(szProgressPart)); } else { #if defined(__GNUC__) && __GNUC__ < 3 && __GNUC_MINOR__ < 96 #else std::stringstream buffer; buffer << ICON_BAR_OPEN_UTF8; for(int i=0;i<8;i++) buffer << (iGetTimeString(), 12); szProgressPart[11] = 0; memcpy(szProgressPartT2S, szProgressPart, 12); } } } char t[Utf8BufSize(2)],v[Utf8BufSize(2)],r[Utf8BufSize(2)]; char szStatus[Utf8BufSize(4)]; szStatus[3] = 0; t[1]=v[1]=r[1] = 0; if (EPGSearchConfig.WarEagle) { if (!isUTF8) { t[0] = event && hasMatch ? (timerMatch == tmFull) ? ((timer && timer->Recording())?ICON_REC:ICON_CLOCK) : ICON_CLOCK_HALF : ' '; v[0] = event && event->Vps() && (event->Vps() - event->StartTime()) ? ICON_VPS : ' '; r[0] = event && event->IsRunning() ? ICON_RUNNING : ' '; } else { #if defined(__GNUC__) && __GNUC__ < 3 && __GNUC_MINOR__ < 96 #else sprintf(t, "%s", (event && hasMatch ? (timerMatch == tmFull) ? ((timer && timer->Recording())?ICON_REC_UTF8:ICON_CLOCK_UTF8) : ICON_CLOCK_HALF_UTF8 : " ")); sprintf(v, "%s", event && event->Vps() && (event->Vps() - event->StartTime()) ? ICON_VPS_UTF8 : " "); sprintf(r, "%s", (event && event->IsRunning() ? ICON_RUNNING_UTF8 : " ")); #endif } } else { t[0] = event && hasMatch ? (timerMatch == tmFull) ? ((timer && timer->Recording())?'R':'T') : 't' : ' '; v[0] = event && event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' '; r[0] = event && event->IsRunning() ? '*' : ' '; } if (event && inSwitchList) { cSwitchTimer* s = SwitchTimers.InSwitchList(event); t[0] = (s && s->mode==1)?'s':'S'; } if (EPGSearchConfig.WarEagle && isUTF8) { std::stringstream buffer; buffer << t << v << r; char* temp = strdup(buffer.str().c_str()); sprintf(szStatus, "%s", temp); free(temp); } else { szStatus[0] = t[0]; szStatus[1] = v[0]; szStatus[2] = r[0]; } char* buffer = strdup(menutemplate); strreplace(buffer, '|', '\t'); char* title = NULL; title = strdup(event?event->Title():tr(">>> no info! <<<")); title = strreplacei(title, ":", "%colon%"); // assume a title has the form "a?b:c", // we need to replace the colon to avoid misinterpretation of the expression as a condition buffer = strreplacei(buffer, "%title%", title); free(title); if (channel) { char szChannelNr[6] = ""; snprintf(szChannelNr, 6, "%d", channel->Number()); buffer = strreplacei(buffer, "%chnr%", szChannelNr); buffer = strreplacei(buffer, "%chsh%", channel->ShortName(true)); buffer = strreplacei(buffer, "%chlng%", channel->Name()); buffer = strreplacei(buffer, "%progr%", szProgressPart); buffer = strreplacei(buffer, "%progrT2S%", szProgressPartT2S); } // parse the epxression and evaluate it cVarExpr varExpr(buffer); char* tmp = strdup(varExpr.Evaluate(event).c_str()); free(buffer); buffer = tmp; buffer = strreplacei(buffer, "$status$", szStatus); buffer = strreplacei(buffer, "$t_status$", t); buffer = strreplacei(buffer, "$v_status$", v); buffer = strreplacei(buffer, "$r_status$", r); buffer = FixSeparators(buffer, '~'); buffer = FixSeparators(buffer, ':'); buffer = FixSeparators(buffer, '-'); SetText(buffer, false); if (gl_InfoConflict == 0 && EPGSearchConfig.checkTimerConflAfterTimerProg && !Force && timer && timerMatch && timerMatch != OldTimerMatch) { cConflictCheck C; C.Check(); if (C.TimerInConflict(timer)) gl_InfoConflict = 1; } return true; } return result; } void cMenuMyScheduleItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable) { #if APIVERSNUM >= 10733 bool withDate = (channel == NULL); // search for a better way to determine this if (!DisplayMenu->SetItemEvent(event, Index, Current, Selectable, channel, withDate, timerMatch)) DisplayMenu->SetItem(Text(), Index, Current, Selectable); #endif } // --- cMenuMyScheduleSepItem ------------------------------------------------------ cMenuMyScheduleSepItem::cMenuMyScheduleSepItem(const cEvent *Event, cChannel *Channel) : cMenuMyScheduleItem(Event, Channel, showNow, NULL) { event = Event; channel = Channel; dummyEvent = NULL; SetSelectable(false); Update(true); } cMenuMyScheduleSepItem::~cMenuMyScheduleSepItem() { if (dummyEvent) delete dummyEvent; } bool cMenuMyScheduleSepItem::Update(bool Force) { if (channel) SetText(cString::sprintf("%s\t %s %s", MENU_SEPARATOR_ITEMS, channel->Name(), MENU_SEPARATOR_ITEMS)); else if (event) { dummyEvent = new cEvent(0); dummyEvent->SetTitle(cString::sprintf("%s\t %s %s", MENU_SEPARATOR_ITEMS, GETDATESTRING(event), MENU_SEPARATOR_ITEMS)); SetText(dummyEvent->Title()); } return true; } void cMenuMyScheduleSepItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable) { #if APIVERSNUM >= 10733 bool withDate = (channel == NULL); // search for a better way to determine this if (!DisplayMenu->SetItemEvent(dummyEvent, Index, Current, Selectable, channel, withDate, timerMatch)) DisplayMenu->SetItem(Text(), Index, Current, Selectable); #endif } // --- cMenuWhatsOnSearch ---------------------------------------------------------- int cMenuWhatsOnSearch::currentChannel = 0; showMode cMenuWhatsOnSearch::currentShowMode = showNow; cChannel *cMenuWhatsOnSearch::scheduleChannel = NULL; extern const char *ShowModes[]; cList cMenuWhatsOnSearch::showModes; time_t cMenuWhatsOnSearch::seekTime = 0; int cMenuWhatsOnSearch::shiftTime = 0; cMenuWhatsOnSearch::cMenuWhatsOnSearch(const cSchedules *Schedules, int CurrentChannelNr) :cOsdMenu("", GetTab(1), GetTab(2), GetTab(3), GetTab(4), GetTab(5)) { #if VDRVERSNUM >= 10734 if (currentShowMode == showNow) SetMenuCategory(mcScheduleNow); else if (currentShowMode == showNext) SetMenuCategory(mcScheduleNext); else SetMenuCategory(mcSchedule); #endif helpKeys = -1; shiftTime = 0; schedules = Schedules; CreateShowModes(); LoadSchedules(); currentChannel = CurrentChannelNr; SetHelpKeys(); } cMenuWhatsOnSearch::~cMenuWhatsOnSearch() { } #ifdef USE_GRAPHTFT const char* cMenuWhatsOnSearch::MenuKind() { if (currentShowMode == showNow) return "MenuEpgsWhatsOnNow"; if (currentShowMode == showNext) return "MenuEpgsWhatsOnNext"; if (currentShowMode > showNext) return "MenuEpgsWhatsOnElse"; else return "MenuWhatsOnElse"; } void cMenuWhatsOnSearch::Display(void) { cOsdMenu::Display(); if (Count() > 0) { int i = 0; for (cOsdItem *item = First(); item; item = Next(item)) cStatus::MsgOsdEventItem(!item->Selectable() ? 0 : ((cMenuMyScheduleItem*)item)->event, item->Text(), i++, Count()); } } #endif /* GRAPHTFT */ int cMenuWhatsOnSearch::GetTab(int Tab) { if (currentShowMode == showNow) return cTemplFile::GetTemplateByName("MenuWhatsOnNow")->Tab(Tab-1); if (currentShowMode == showNext) return cTemplFile::GetTemplateByName("MenuWhatsOnNext")->Tab(Tab-1); if (currentShowMode > showNext) return cTemplFile::GetTemplateByName("MenuWhatsOnElse")->Tab(Tab-1); else return 0; } void cMenuWhatsOnSearch::LoadSchedules() { Clear(); eventObjects.Clear(); // time_t SeekTime; cString szTitle; cShowMode* mode = GetShowMode(currentShowMode); if (!mode) return; if (shiftTime != 0) { if (currentShowMode == showNow || currentShowMode == showNext) seekTime = time(NULL); else { if (mode) seekTime = GetTimeT(mode->GetTime()); if (seekTime < time(NULL)) seekTime += HOURS2SECS(24); } seekTime += shiftTime*60; struct tm tm_r; time_t now = time(NULL); tm tm_seek = *localtime_r(&seekTime, &tm_r); tm tm_now = *localtime_r(&now, &tm_r); if (tm_seek.tm_mday != tm_now.tm_mday) szTitle = cString::sprintf("%s - %s", tr("Overview"), DAYDATETIME(seekTime)); else szTitle = cString::sprintf("%s - %02d:%02d", tr("Overview"), tm_seek.tm_hour, tm_seek.tm_min); } else { seekTime = GetTimeT(mode->GetTime()); if (seekTime < time(NULL) && currentShowMode != showNow && currentShowMode != showNext) { seekTime += HOURS2SECS(24); szTitle = cString::sprintf("%s - %s (%s)", tr("Overview"), mode->GetDescription(), *WeekDayName(seekTime)); } else szTitle = cString::sprintf("%s - %s", tr("Overview"), mode->GetDescription()); } SetTitle(szTitle); cMenuTemplate* currentTemplate = NULL; if (currentShowMode == showNow) currentTemplate = cTemplFile::GetTemplateByName("MenuWhatsOnNow"); if (currentShowMode == showNext) currentTemplate = cTemplFile::GetTemplateByName("MenuWhatsOnNext"); if (currentShowMode > showNext) currentTemplate = cTemplFile::GetTemplateByName("MenuWhatsOnElse"); int maxChannel = EPGSearchConfig.maxChannelMenuNow; if (currentChannel > maxChannel) maxChannel = 0; for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { if (!Channel->GroupSep()) { if (maxChannel && Channel->Number() > maxChannel) break; if (EPGSearchConfig.showRadioChannels == 0 && ISRADIO(Channel)) continue; const cSchedule *Schedule = schedules->GetSchedule(Channel); const cEvent *Event = NULL; if (Schedule) { if (shiftTime != 0) Event = Schedule->GetEventAround(seekTime); else { switch(currentShowMode) { default: case showNow: Event = Schedule->GetPresentEvent(); break; case showNext: Event = Schedule->GetFollowingEvent(); break; case showUserMode1: case showUserMode2: case showUserMode3: case showUserMode4: Event = Schedule->GetEventAround(seekTime); break; } } } if (!EPGSearchConfig.showEmptyChannels && !Event) continue; Add(new cMenuMyScheduleItem(Event, Channel, currentShowMode, currentTemplate), Channel->Number() == currentChannel); if (Event) eventObjects.Add(Event); } else { if (EPGSearchConfig.showChannelGroups && strlen(Channel->Name())) Add(new cMenuMyScheduleSepItem(NULL, Channel)); } } } time_t cMenuWhatsOnSearch::GetTimeT(int iTime) { struct tm tm_r; time_t t = time(NULL); tm* tmnow = localtime_r(&t, &tm_r); tmnow->tm_hour = HOURS(iTime); tmnow->tm_min = MINUTES(iTime); return mktime(tmnow); } showMode cMenuWhatsOnSearch::GetNextMode() { showMode nextShowMode = currentShowMode; cShowMode* Mode = GetShowMode(currentShowMode); if (Mode) { cShowMode* ModeNext = showModes.Next(Mode); if (ModeNext == NULL) nextShowMode = showNow; else nextShowMode = ModeNext->GetMode(); } else // no mode found? fall back to 'now' nextShowMode = showNow; return nextShowMode; } void cMenuWhatsOnSearch::CreateShowModes() { showModes.Clear(); cShowMode* ModeNow = new cShowMode(showNow, trVDR("Button$Now")); showModes.Add(ModeNow); cShowMode* ModeNext = new cShowMode(showNext, trVDR("Button$Next")); showModes.Add(ModeNext); time_t now = time(NULL); for(int i=showUserMode1; i HOURS2SECS(SKIPHOURS)) continue; cShowMode* Mode = new cShowMode((showMode)i, EPGSearchConfig.ShowModes[i].GetDescription(), 1, EPGSearchConfig.ShowModes[i].GetTime(), SeekTime); showModes.Add(Mode); } if (EPGSearchConfig.showFavoritesMenu) { cShowMode* ModeFav = new cShowMode(showFavorites, tr("Button$Favorites")); showModes.Add(ModeFav); } showModes.Sort(); } cShowMode* cMenuWhatsOnSearch::GetShowMode(showMode mode) { for (cShowMode *showMode = showModes.First(); showMode; showMode = showModes.Next(showMode)) if (mode == showMode->GetMode()) return showMode; return NULL; } cChannel *cMenuWhatsOnSearch::ScheduleChannel(cChannel *force_channel) { cChannel *ch = force_channel?force_channel:scheduleChannel; scheduleChannel = NULL; return ch; } eOSState cMenuWhatsOnSearch::Switch(void) { cMenuMyScheduleItem *item = (cMenuMyScheduleItem *)Get(Current()); if (item && item->channel) { if (cDevice::PrimaryDevice()->SwitchChannel(item->channel, true)) return osEnd; } INFO(trVDR("Can't switch channel!")); return osContinue; } eOSState cMenuWhatsOnSearch::Record(void) { cMenuMyScheduleItem *item = (cMenuMyScheduleItem *)Get(Current()); if (item) { if (item->timerMatch == tmFull) { eTimerMatch tm = tmNone; cTimer *timer = Timers.GetMatch(item->event, &tm); if (timer) { if (EPGSearchConfig.useVDRTimerEditMenu) return AddSubMenu(new cMenuEditTimer(timer)); else return AddSubMenu(new cMenuMyEditTimer(timer, false, item->event, item->channel)); } } cTimer *timer = NULL; if (item->event) { timer = new cTimer(item->event); PrepareTimerFile(item->event, timer); } else timer = new cTimer(false, false, item->channel); cTimer *t = Timers.GetTimer(timer); if (EPGSearchConfig.onePressTimerCreation == 0 || t || !item->event || (!t && item->event && item->event->StartTime() - (Setup.MarginStart+2) * 60 < time(NULL))) { if (t) { delete timer; timer = t; } timer->SetFlags(tfActive); if (EPGSearchConfig.useVDRTimerEditMenu) return AddSubMenu(new cMenuEditTimer(timer, !t)); else return AddSubMenu(new cMenuMyEditTimer(timer, !t, item->event, item->channel)); } else { string fullaux = ""; string aux = ""; if (item->event) { const cEvent* event = item->event; int bstart = event->StartTime() - timer->StartTime(); int bstop = timer->StopTime() - event->EndTime(); int checkmode = DefTimerCheckModes.GetMode(timer->Channel()); aux = UpdateAuxValue(aux, "channel", NumToString(timer->Channel()->Number()) + " - " + CHANNELNAME(timer->Channel())); aux = UpdateAuxValue(aux, "update", checkmode); aux = UpdateAuxValue(aux, "eventid", event->EventID()); aux = UpdateAuxValue(aux, "bstart", bstart); aux = UpdateAuxValue(aux, "bstop", bstop); fullaux = UpdateAuxValue(fullaux, "epgsearch", aux); } #ifdef USE_PINPLUGIN aux = ""; aux = UpdateAuxValue(aux, "protected", timer->FskProtection() ? "yes" : "no"); fullaux = UpdateAuxValue(fullaux, "pin-plugin", aux); #endif SetAux(timer, fullaux); Timers.Add(timer); gl_timerStatusMonitor->SetConflictCheckAdvised(); timer->Matches(); Timers.SetModified(); LogFile.iSysLog("timer %s added (active)", *timer->ToDescr()); if (HasSubMenu()) CloseSubMenu(); if (Update()) Display(); SetHelpKeys(); } } return osContinue; } bool cMenuWhatsOnSearch::Update(void) { bool result = false; for (cOsdItem *item = First(); item; item = Next(item)) { if (item->Selectable() && ((cMenuMyScheduleItem *)item)->Update()) result = true; } return result; } eOSState cMenuWhatsOnSearch::Commands(eKeys Key) { if (HasSubMenu() || Count() == 0) return osContinue; cMenuMyScheduleItem *mi = (cMenuMyScheduleItem *)Get(Current()); if (mi) { if (!mi->event) { if (Key == k3) return Switch(); else if (Key == k2) return Record(); else return osContinue; } cMenuSearchCommands *menu; eOSState state = AddSubMenu(menu = new cMenuSearchCommands(tr("EPG Commands"), mi->event, true)); if (Key != kNone) state = menu->ProcessKey(Key); return state; } return osContinue; } eOSState cMenuWhatsOnSearch::ExtendedSearch(void) { return AddSubMenu(new cMenuEPGSearchExt()); } void cMenuWhatsOnSearch::SetHelpKeys(bool Force) { cMenuMyScheduleItem *item = (cMenuMyScheduleItem *)Get(Current()); int NewHelpKeys = 0; if (item) { if (item->Selectable() && item->timerMatch == tmFull) NewHelpKeys = 2; else NewHelpKeys = 1; } bool hasTimer = (NewHelpKeys == 2); if (NewHelpKeys != helpKeys || Force) { showMode nextShowMode = GetNextMode(); cShowMode* mode = GetShowMode(nextShowMode); const char* szButtonGreen = NULL; if (mode) szButtonGreen = mode->GetDescription(); if (toggleKeys==0) SetHelp((EPGSearchConfig.redkeymode==0?(hasTimer?trVDR("Button$Timer"):trVDR("Button$Record")):tr("Button$Commands")), szButtonGreen, trVDR("Button$Schedule"), EPGSearchConfig.bluekeymode==0?(EPGSearchConfig.useOkForSwitch?trVDR("Button$Info"):trVDR("Button$Switch")):tr("Button$Search")); else SetHelp((EPGSearchConfig.redkeymode==1?(hasTimer?trVDR("Button$Timer"):trVDR("Button$Record")):tr("Button$Commands")), (EPGSearchConfig.toggleGreenYellow==0?szButtonGreen:"<<"), (EPGSearchConfig.toggleGreenYellow==0?trVDR("Button$Schedule"):">>"), EPGSearchConfig.bluekeymode==1?(EPGSearchConfig.useOkForSwitch?trVDR("Button$Info"):trVDR("Button$Switch")):tr("Button$Search")); helpKeys = NewHelpKeys; } } eOSState cMenuWhatsOnSearch::Shift(int iMinutes) { shiftTime += iMinutes; cMenuMyScheduleItem *mi = (cMenuMyScheduleItem *)Get(Current()); int TempChannel = currentChannel; if (mi) { currentChannel = mi->channel->Number(); scheduleChannel = Channels.GetByNumber(currentChannel); } LoadSchedules(); Display(); currentChannel = TempChannel; SetHelpKeys(); return osContinue; } eOSState cMenuWhatsOnSearch::ShowSummary() { if (Count()) { const cEvent *ei = ((cMenuMyScheduleItem *)Get(Current()))->event; if (ei) { cChannel *channel = Channels.GetByChannelID(ei->ChannelID(), true, true); if (channel) return AddSubMenu(new cMenuEventSearch(ei, eventObjects, SurfModeChannel)); } } return osContinue; } void cMenuWhatsOnSearch::UpdateCurrent() { // navigation in summary could have changed current item, so update it cEventObj* cureventObj = eventObjects.GetCurrent(); if (cureventObj && cureventObj->Event()) for (cMenuMyScheduleItem *item = (cMenuMyScheduleItem *)First(); item; item = (cMenuMyScheduleItem *)Next(item)) if (item->Selectable() && item->event == cureventObj->Event()) { cureventObj->Select(false); SetCurrent(item); Display(); break; } } eOSState cMenuWhatsOnSearch::ProcessKey(eKeys Key) { exitToMainMenu = 0; if (!HasSubMenu() && Key == kBack) { exitToMainMenu = 1; return osBack; } bool HadSubMenu = HasSubMenu(); eOSState state = cOsdMenu::ProcessKey(Key); if (!HasSubMenu() && HadSubMenu) // navigation in summary could have changed current item, so update it UpdateCurrent(); if (state == osUnknown) { switch (Key) { case kFastRew: if(!HasSubMenu()) return Shift(-EPGSearchConfig.timeShiftValue); break; case kFastFwd: if(!HasSubMenu()) return Shift(EPGSearchConfig.timeShiftValue); break; case kRecord: case kRed: if(HasSubMenu()) { UpdateCurrent(); state = Record(); break; } if (Count()) { if (EPGSearchConfig.redkeymode==toggleKeys) state = Record(); else { cMenuMyScheduleItem *mi = (cMenuMyScheduleItem *)Get(Current()); if (mi && mi->Selectable()) { if (mi->event) return AddSubMenu(new cMenuSearchCommands(tr("EPG Commands"),mi->event)); else return osContinue; } } } break; case k0: if(!HasSubMenu()) { toggleKeys = 1 - toggleKeys; SetHelpKeys(true); } state = osContinue; break; case k1...k9: return Commands(Key); case kYellow: if(!HasSubMenu()) { if (toggleKeys == 0 || (toggleKeys == 1 && EPGSearchConfig.toggleGreenYellow == 0)) { cMenuMyScheduleItem *mi = (cMenuMyScheduleItem *)Get(Current()); if (mi && mi->Selectable() && mi->channel) { const cSchedule *Schedule = schedules->GetSchedule(mi->channel); if (Schedule) { time_t now = time(NULL); bool hasFutureEvents = false; for (const cEvent *e = Schedule->Events()->First(); e; e = Schedule->Events()->Next(e)) if (e->StartTime() > now) { hasFutureEvents = true; break; } if (!hasFutureEvents) return osContinue; } else return osContinue; } state = osBack; // continue with kGreen } else return Shift(EPGSearchConfig.timeShiftValue); } case kGreen: if(!HasSubMenu()) { if (toggleKeys == 0 || (toggleKeys == 1 && EPGSearchConfig.toggleGreenYellow == 0)) { if (Key == kYellow) currentShowMode = showNow; else currentShowMode = GetNextMode(); cMenuMyScheduleItem *mi = (cMenuMyScheduleItem *)Get(Current()); if (mi && mi->Selectable()) { currentChannel = mi->channel->Number(); scheduleChannel = Channels.GetByNumber(currentChannel); } } else return Shift(-EPGSearchConfig.timeShiftValue); } break; case kBlue: if (HasSubMenu()) { UpdateCurrent(); return Switch(); } if (EPGSearchConfig.bluekeymode==toggleKeys) return EPGSearchConfig.useOkForSwitch?ShowSummary():Switch(); else return ExtendedSearch(); break; case kOk: { cMenuMyScheduleItem *mi = (cMenuMyScheduleItem *)Get(Current()); if (mi && mi->Selectable()) { if (!mi->event) // no EPG, so simply switch to channel return Switch(); else return EPGSearchConfig.useOkForSwitch?Switch():ShowSummary(); } } break; case kInfo: return ShowSummary(); break; default: break; } } if (!HasSubMenu()) { if ((HadSubMenu || gl_TimerProgged) && Update()) { if (gl_TimerProgged) // when using epgsearch's timer edit menu, update is delayed because of SVDRP { gl_TimerProgged = 0; SetHelpKeys(); } Display(); } if (Key != kNone) SetHelpKeys(); if (gl_InfoConflict) { gl_InfoConflict = 0; if (Interface->Confirm(tr("Timer conflict! Show?"))) return AddSubMenu(new cMenuConflictCheck()); } } return state; } vdr-plugin-epgsearch/scripts/0000755000175000017500000000000012466747543016141 5ustar tobiastobiasvdr-plugin-epgsearch/scripts/mtdone2epgsearchdone.sh0000755000175000017500000000622112466747543022601 0ustar tobiastobias#!/bin/sh # Written by : # Viking / vdrportal.de # cjac AT ich-habe-fertig.com # # Call with one of these parameters # a. Master-Timer Done-file # # Parameter : # --sid X = use S-ID X instead of default (see below) #------------------------------------------------------------------------------ # Should wo only test what is done ? TEST=yes # should the script ask for S-ID for each recording ? # The script shows a list of possible S-ID's at the beginning ASK_SID=no # What S-ID should be used if no other selected DEFAULT_SID=0 # adjust the following line to your path to svdrpsend SVDRPSEND=svdrpsend # Home of EPGsearch EPGSEARCH_HOME="/etc/vdr/plugins" # do not edit below this line #------------------------------------------------------------------------------ EPGSEARCHDONE_FILE="$EPGSEARCH_HOME/epgsearchdone.data" EPGSEARCH_FILE="$EPGSEARCH_HOME/epgsearch.conf" PrevTitle="" Count=0 function ShowUsableSIDs() { printf "\n" grep -v "^#" $EPGSEARCH_FILE | sort -t':' -k2 | awk -F':' '{ print $1"\t"$2 }' printf "\n" } function AddRecToDone() { Rec=$1 Title=$(echo $Rec|cut -f1 -d'|') Subtitle=$(echo $Rec|cut -f2 -d'|') [ "$Subtitle" = "NoSub" ] && Subtitle="" if [ "$ASK_SID" = "yes" ]; then if [ "$Title" != "$PrevTitle" ]; then [ $Count -gt 10 ] && Count=1 || let Count++ [ $Count -eq 1 ] && ShowUsableSIDs printf "Adding \"%s, %s\".\n" "$Title" "$Subtitle" printf "Enter S-ID (s=skip, ENTER=$DEFAULT_SID): " read NEW_SID > $EPGSEARCHDONE_FILE echo "T $Title" >> $EPGSEARCHDONE_FILE [ ! -z "$Subtitle" ] && echo "S $Subtitle" >> $EPGSEARCHDONE_FILE echo "D " >> $EPGSEARCHDONE_FILE echo "r" >> $EPGSEARCHDONE_FILE else printf "SKIP \"%s, %s\"\n\n" "$Title" "$Subtitle" fi } if [ "$1" = "--sid" ]; then shift if [ -z "$1" ]; then printf "\nS-ID as parameter expected\n\n" else DEFAULT_SID=$1 shift printf "\nFound parameter \"--sid\", Default S-ID is now set to $DEFAULT_SID\n\n" fi fi if [ -z "$1" ]; then printf "\nERROR : Parameter 1 should be a Master-Timer done-file\n\n" exit 1 fi [ "$TEST" = "yes" ] && EPGSEARCHDONE_FILE=$EPGSEARCHDONE_FILE.test || cp $EPGSEARCHDONE_FILE $EPGSEARCHDONE_FILE.bak [ "$ASK_SID" = "yes" ] && ShowUsableSIDs printf "Default S-ID: $DEFAULT_SID\n\n" while read i; do AddRecToDone "$i" ; done <$1 if [ "$TEST" = "yes" ]; then printf "\n\nTEST run !!!!\nNow take a look at the File $EPGSEARCHDONE_FILE to see if everything is OK.\n\n" else # Tell epgsearch that done-file was changed echo "$SVDRPSEND PLUG epgsearch UPDD >/dev/null 2>&1" | at now >/dev/null 2>&1 fi vdr-plugin-epgsearch/scripts/epg2autotimer.sh0000755000175000017500000000157512466747543021277 0ustar tobiastobias#!/bin/sh # # epg2autotimer.sh - v.0.1 # # source: epgsearch-plugin # # add this line to your epgsearchcmds.conf: # folgende zeile in die epgsearchcmds.conf eintragen: # # epg2autotimer : /usr/local/bin/epg2autotimer.sh # CONFIG START AUTOTIMER_FILE="$SOURCEDIR/vdradmin/vdradmind.at" SVDRPSEND=svdrpsend # default autotimer settings STATUS=1 # 0 = inactive (by default) / 1 = active SERIE=1 # Serienaufnahme PRIO=0 # Priority / Priorität LIFE_TIME=0 # Lifetime / Lebensdauer TARGET_DIR= # Folder / Verzeichnis SEARCH_WHERE=1 # Where to search / Wo soll gesucht werden? 1: Title 3: Title+Subtitle 7: All # CONFIG END # add autotimer echo "${STATUS}:${1}:${SEARCH_WHERE}:::${SERIE}:${PRIO}:${LIFE_TIME}:${4}:${TARGET_DIR}" >> "${AUTOTIMER_FILE}" echo "Done..." # jump back at now <[?]; # # = descriptor displayed in VDR # [?] = confirmation request, before execute command (optionally) # = command what execute # # When a command is executed the following parameters are passed to it: # # $1: the name of the epg entry # $2: the start time of the epg entry as time_t value (like in the shutdown script) # $3: the end time # $4: the channel of the epg entry # # See also at man-pages vdr(5), it the same syntax as reccmds.conf # Muistutus? : /usr/local/bin/rememberevent.sh 0 Muistutus vaihtaen? : /usr/local/bin/rememberevent.sh 1 epg2taste : /usr/local/bin/epg2taste.sh epg2autotimer : /usr/local/bin/epg2autotimer.sh vdr-plugin-epgsearch/scripts/autotimer2searchtimer.pl0000755000175000017500000001777512466747543023044 0ustar tobiastobias#!/usr/bin/perl # # Convert VDRAdmin-AM autotimer (vdradmin.at) into # epgsearch searchtimer (epgsearch.conf) # # Version: 0.2beta 2006-08-06 # # Author: Mike Constabel (vejoun @ vdrportal) # Andreas Mair (amair @ vdrportal) # # You need: # # - VDRAdmin-AM >= 3.4.6 # - Epgsearch >= 0.9.16 # use Socket; use Getopt::Std; #--------------------------------------------------------------------------- $Usage = qq{ Usage: $0 [options] -i filename -o filename -m 0|1 $0 [options] -i filename -o filename -s -m 0|1 $0 [options] -i filename -s -m 0|1 Action: -i filename input file, vdradmind.at -o filename output file, epgsearch.conf.new (file will be overwritten!) -s send to epgsearch via svdrp (needs running vdr with epgsearch plugin) -m 0|1 which new searchmode for autotimers with active status: yes, once 0 means the whole string must match 1 means every word must match [default] In epgsearch 0 is default, vdradmin only use 1 Options: -r autotimers with regular expressions will be disabled while converting, with this option you can enable the corresponding searchtimers. You should not do this! Check the converted searchtimers and enable them manually! Wrong searchtimers will flood your timers. -d host Host for SVDRP import -p port Port for SVDRP import -h Show this help text }; die $Usage if (!getopts('i:o:srm:d:p:h') || !$opt_i || $opt_h || !($opt_o || $opt_s) || !($opt_m == 0 || $opt_m == 1)); my $AT_FILENAME = $opt_i; my $EPGSEARCH_FILENAME = $opt_o; my $SENDSVDRP = $opt_s ? 1 : 0; my $EnableRegex = $opt_r ? 1 : 0; my $Searchmode = defined $opt_m ? $opt_m : 1; my $Dest = $opt_d ? $opt_d : "localhost"; my $Port = $opt_p ? $opt_p : 6419; my $Timeout = 30; # max. seconds to wait for svdrp response my $conf_str="%i:%s:%i:%s:%s:%i:%s:%i:%i:%i:%i:%i:0:::%i:%i:%s:%i:%s:%s:%s:%s:%s:0:0:0::%i:0:1:1:0:0:0:0:0:1:0:0::1"; # [ID=0], pattern, time?, starttime, stopptime, channel? (0,1), channel, match case (0,1), search mode (0,4), title, subtitle, description, [duration=0], [min=""], [max=""], searchtimer? (0,1), # use week? (0,1), weekday "0", series? (0,1), dir, prio, lft, bstart, bstop, [VPS=0], [action=0], [use ext. epg=0], [ext. epg=""], done? (0,1), [repeats=0], [ctitle=1], [csubtitle=1], [cdescription=0], # [cext. epg=0], [reapeats within days=0], [delete after x days=0], [keep=0], [min before switch=1], [nach x rec pausieren=0], [blacklist=0], [blacklist-id=""], [fuzzy=0] sub AT_Read { my (@at); if (-s $AT_FILENAME) { open(AT_FILE, $AT_FILENAME) || printf("Can't open %s", $AT_FILENAME); while () { chomp; next if ($_ eq ""); my ($active, $pattern, $section, $start, $stop, $episode, $prio, $lft, $channel, $directory, $done, $weekday, $buffers, $bstart, $bstop) = split(/\:/, $_); $pattern =~ s/\|/\:/g; $pattern =~ s/\\:/\|/g; $directory =~ s/\|/\:/g; push( @at, { active => $active, pattern => $pattern, section => $section, start => $start, stop => $stop, buffers => $buffers, bstart => $bstart, bstop => $bstop, episode => $episode, prio => $prio, lft => $lft, channel => $channel, directory => $directory, done => $done, weekdays => $weekday } ); } close(AT_FILE); } return (@at); } sub CONF_Collect { my @at = @_; my @st; my $weekday = $stitle = $ssubtitle = $sdescription = $id = $case = 0; my $mode = $Searchmode; my $pattern; my $directory; for my $at (@at) { if ($at->{pattern} =~ /^\/(.*)\/(i?)$/) { $mode = 4; $case = 1 if ($2 eq "i"); $pattern = $1; } else { $pattern = $at->{pattern}; } $directory = $at->{directory}; $pattern =~ s/\|/\!\^pipe\^\!/g; $pattern =~ s/\:/\|/g; $directory =~ s/\|/\!\^pipe\^\!/g; $directory =~ s/\:/\|/g; $weekday = undef; my $wd_bits = 0; if ($at->{weekdays} =~ /^(\d)(\d)(\d)(\d)(\d)(\d)(\d)$/) { if ($7) { #Sunday $weekday = 0; $wd_bits |= 1; } if ($1) { #Monday $weekday = 1; $wd_bits |= 2; } if ($2) { #Tuesday $weekday = 2; $wd_bits |= 4; } if ($3) { #Wednesday $weekday = 3; $wd_bits |= 8; } if ($4) { #Thursday $weekday = 4; $wd_bits |= 16; } if ($5) { #Friday $weekday = 5; $wd_bits |= 32; } if ($6) { #Saturday $weekday = 6; $wd_bits |= 64; } } if ($wd_bits !~ /^(1|2|4|8|16|32|64)$/) { $weekday = -$wd_bits; } $stitle = $at->{section} & 1 ? 1 : 0; $ssubtitle = $at->{section} & 2 ? 1 : 0; $sdescription = $at->{section} & 4 ? 1 : 0; $id += 1 if ($EPGSEARCH_FILENAME); $data = sprintf $conf_str, $id, $pattern, $at->{start} || $at->{stop} ? 1 : 0, $at->{start} ? sprintf("%04i", $at->{start}) : "", $at->{stop} ? sprintf("%04i", $at->{stop}) : "", $at->{channel} ? 1 : 0, $at->{channel} ? $at->{channel} : "", $case, $mode, $stitle, $ssubtitle, $sdescription, ($at->{active} && ($mode != 4 || $EnableRegex)) ? 1 : 0, $weekday eq -127 || $wd_bits eq 0 ? 0 : 1, $weekday, $at->{episode} ? 1 : 0, $directory, $at->{prio} ? $at->{prio} : "", $at->{lft} ? $at->{lft} : "", $at->{buffers} ? $at->{bstart} : "", $at->{buffers} ? $at->{bstop} : "", $at->{done} ? 1 : 0; #avoid_repeats push @st,$data; } return (@st) } sub Error { print STDERR "@_\n"; close(SOCK); exit 0; } sub SplitLine($) { my ($line)=@_; if ($line =~ /^([0-9]{3})([- ])(.*)$/) { return ($1,$2,$3); } Error("Unidentified Line: $line"); } sub WriteSearchtimerSVDRP { my @str = @_; $SIG{ALRM} = sub { Error("timeout"); }; alarm($Timeout); my $iaddr = inet_aton($Dest) || Error("no host: $Dest"); my $paddr = sockaddr_in($Port, $iaddr); my $proto = getprotobyname('tcp'); socket(SOCK, PF_INET, SOCK_STREAM, $proto) || Error("socket: $!"); connect(SOCK, $paddr) || Error("connect: $!"); select(SOCK); $| = 1; select(STDOUT); while () { chomp; print STDOUT "(1):$_\n"; my ($code,$sep,$data)=SplitLine($_); last if ($code=220 && $sep eq ' '); } foreach my $line (@str) { chomp $line; printf SOCK "PLUG epgsearch NEWS %s\r\n", $line; } while () { chomp; print STDOUT "(2):$_\n"; my ($code,$sep,$data)=SplitLine($_); last if ($code==900 && $sep eq ' '); } print SOCK "quit\r\n"; while () { chomp; print STDOUT "(3):$_\n"; my ($code,$sep,$data)=SplitLine($_); last if ($code==221 && $sep eq ' '); } close(SOCK) || Error("close: $!"); } sub WriteSearchtimerFile { my @str = @_; open(STFILE, ">".$EPGSEARCH_FILENAME) || die("Cannot open file ${EPGSEARCH_FILENAME}!"); print STFILE "#version 2 - DONT TOUCH THIS!\n"; foreach my $line (@str) { chomp $line; printf STFILE "%s\n", $line; } close STFILE } #--------------------------------------------------------------------------- # main my @st; @st = CONF_Collect(AT_Read()); if ( $SENDSVDRP ) { WriteSearchtimerSVDRP(@st); } if ( $EPGSEARCH_FILENAME ) { WriteSearchtimerFile(@st); } vdr-plugin-epgsearch/scripts/convert_info_vdr.pl0000755000175000017500000000343212466747543022051 0ustar tobiastobias#!/usr/bin/perl # # Dieses Script konvertiert die info.vdrs in das Format, das # vdr >= 1.3.44 und epgsearch >= 0.9.14 verwenden. # # Aufrufen: # # find "/video" -path "*.rec" -exec convert_info_vdr.pl "{}" \; # # Bitte die beiden Variablen unter Einstellungen anpassen! # # Mike Constabel vejoun @ vdrportal # 2006-03-01 # use strict; ## my $backup=1; # Backup erstellen? 1=Ja (info.bak), 0=Nein my $keepdata=1; # Die epgsearch-Daten in summary behalten? 1=Ja, 0=Nein ## die("Kein Parameter, bitte Anleitung im Script lesen.") if ! $ARGV[0]; my $Pfad=$ARGV[0]; my $DateiAlt=$Pfad."/info.vdr"; my $DateiNeu=$Pfad."/info.neu"; my $DateiBak=$Pfad."/info.bak"; open(DATEI,"<".$DateiAlt) || die("Datei nicht gefunden: $DateiAlt"); open(NEU,">".$DateiNeu) || die("Datei kann nicht geöffnet werden: $DateiAlt"); my $Zeile = ""; my $epgsearch = ""; my $neuformat = 0; my $aux = ""; printf ("Konvertiere %s\n",$DateiAlt); while() { $Zeile = $_; print NEU $Zeile if $Zeile =~ /^[CETSX] .+/; $epgsearch = $1 if $Zeile =~ /^D .*(Kanal.+Suchtimer.+S-ID.+)$/; if ( $Zeile =~ /^(D .+)\|Kanal.+Suchtimer.+S-ID.+$/ && ! $keepdata ) { print NEU sprintf("%s\n",$1); } elsif ( $Zeile =~ /^(D .+)$/ ) { print NEU sprintf("%s\n",$1); } if ( $Zeile =~ /^(@ .+)$/ ) { $neuformat=1; $aux = $1; } } if ( $neuformat == 1 && $aux !~ /epgsearch/ && $epgsearch ne "" ) { $aux .= "".$epgsearch.""; print NEU sprintf("%s\n",$aux); } elsif ( $neuformat == 1 ) { print NEU sprintf("%s\n",$aux); } print NEU sprintf("@ %s\n",$epgsearch) if ( $neuformat == 0 && $epgsearch ne "" ); close(DATEI); close(NEU); rename $DateiAlt, $DateiBak if ( ! -e $DateiBak && $backup == 1 ); rename $DateiNeu, $DateiAlt; vdr-plugin-epgsearch/scripts/timercmds-auxinfo.sh0000755000175000017500000000204112466747543022133 0ustar tobiastobias#!/bin/bash # # Displays the AUX-Info from timers # # Use it as command in timercmds.conf # # Example: # # Display AUX info : /usr/local/bin/timercmds-auxinfo.sh # # 2006-04-24 vejoun @ vdrportal # Version 0.4 # # # Your timers.conf TIMERS="/video/timers.conf" # CHANNELID="$2" START="$3" TITLE="$5" SUBTITLE="$6" DIR="$7" TIME="$(awk 'BEGIN{print strftime("%Y-%m-%d:%H%M",'$START')}')" || exit $? SEARCH="[0-9]*:${CHANNELID}:${TIME}:[0-9]*:[0-9]*:[0-9]*:${DIR//:/|/}:" AUX="$(egrep -m 1 "$SEARCH" "$TIMERS" | cut -d":" -f9-)" if [ -n "$TITLE" ]; then echo -e "TITLE:\n$TITLE\n" else echo -e "TITLE:\nTimer off, no title available\n" fi if [ -n "$SUBTITLE" ]; then echo -e "SUBTITLE:\n$SUBTITLE\n" else if [ -n "$TITLE" ]; then echo -e "SUBTITLE:\nNo subtitle available\n" else echo -e "SUBTITLE:\nTimer off, no subtitle available\n" fi fi if [ -n "$DIR" ]; then echo -e "PATH:\n$DIR\n" fi if [ -z "$AUX" ]; then echo -e "AUX:\nNo AUX data found\n" else echo -e "AUX:\n${AUX//>\\n<}\n" fi #EOF vdr-plugin-epgsearch/scripts/epg2master-timer.sh0000755000175000017500000000210712466747543021667 0ustar tobiastobias#!/bin/sh # # epg2master-timer.sh # # source: epgsearch-plugin, taken from vdr-wiki.de # author: Christian Jacobsen / Viking (vdrportal) # # add this line to your epgsearchcmds.conf: # folgende zeile in die epgsearchcmds.conf eintragen: # # epg2master-timer : /path_to_this_script/epg2master-timer.sh # epg2master-timer (no subtitle) : /path_to_this_script/epg2master-timer.sh -nosub # CONFIG START MASTERTIMER_FILE=/etc/master-timer/torecord # CONFIG END if touch $MASTERTIMER_FILE >/dev/null 2>&1 ; then USESUB=yes if [ "$1" = -nosub ] ; then USESUB=no fi # add timer printf "\nAdding Master-Timer :\n" printf "\n[$1]\nTitle = $1\n" | tee -a $MASTERTIMER_FILE if [ "$6" != "" -a $USESUB = yes ] ; then printf "Subtitle = $6\n" | tee -a $MASTERTIMER_FILE fi # with "^" and "$" so that the exact channel name is used. printf "Channel = ^$5\$\n" | tee -a $MASTERTIMER_FILE printf "\n\nLast 10 lines of torecord : \n\n" tail -10 $MASTERTIMER_FILE else echo "Error, cannot open file ($MASTERTIMER_FILE)..." fi vdr-plugin-epgsearch/scripts/recordingdone.sh0000755000175000017500000001154212466747543021325 0ustar tobiastobias#!/bin/sh # Originally written by : # Viking / vdrportal.de # cjac AT ich-habe-fertig.com # #---------------------------------------------------------------- # Version 1.3 # # Mike Constabel # # HISTORY: # # 2007-03-29: Version 1.3 # # - fixes for use with epgsearch >= 0.9.21 # # 2006-09-01: Version 1.2 # # - fixed setsid calling # # 2006-07-17: Version 1.1 # # - added setsid for calling UPDD # # 2006-??-?? update for vdr >= 1.3.44 and epgsearch >= 0.9.13a # #---------------------------------------------------------------- # # Call with one of these parameters # a. Recording Directory as parameter 1 # b. --recursive "Start_Dir" # c. --recursive # # If called with "--recursive" either "Start_Dir" or "VIDEO_ROOT" # from below is searched for recordings to put to the done-file # #---------------------------------------------------------------- # Should wo only test what is done ? TEST=yes # should we add recordings that have a S-ID in info.vdr ? # That is recordings already recorded with epgsearch-autotimer # and they are probably already in the done file! # yes = add recodrings with S-ID # no = don't add recordings with S-ID ADD_SID_RECORDINGS=no # should the script ask for S-ID for each recording ? # The script shows a list of possible S-ID's at the beginning ASK_SID=no # What S-ID should be used if no other selected DEFAULT_SID=-1 # Use the recording-dir's ctime as recording time? CTIME_FROM_RECORDING=yes # adjust the following line to your path to svdrpsend SVDRPSEND=svdrpsend # Home of EPGsearch EPGSEARCH_HOME="/etc/vdr/plugins" # Video root VIDEO_ROOT="/video" # do not edit below this line #------------------------------------------------------------------------------ EPGSEARCHDONE_FILE="$EPGSEARCH_HOME/epgsearchdone.data" EPGSEARCH_FILE="$EPGSEARCH_HOME/epgsearch.conf" PrevTitle="" function ShowUsableSIDs() { printf "\n" grep -v "^#" $EPGSEARCH_FILE | sort -t':' -k2 | awk -F':' '{ print $1"\t"$2 }' printf "\n" } function AddRecToDone() { Rec=$1 if [ -e "$Rec/info.vdr" ]; then # Get ctime from recordingdir if [ "$CTIME_FROM_RECORDING" = "yes" ]; then CTIME="$(echo "$Rec" | sed 's#......\.rec/##;s#.*/##')" CTIME="$(date +%s -d"${CTIME:0:10} ${CTIME:11:2}:${CTIME:14:2}")" fi # Find S-ID in info.vdr S_IDAlt=`grep -s "^D .*s-id:" $Rec/info.vdr | sed -re 's/^D .*s-id: ([0-9]*).*/\1/'` S_IDNeu=`grep -s "^@ .*.*.*<\/s-id>.*<\/epgsearch>" $Rec/info.vdr | sed -re 's/^@ .*.*([0-9]*)<\/s-id>.*<\/epgsearch>.*/\1/'` [ "$S_IDAlt" != "" ] && S_ID="$S_IDAlt" [ "$S_IDNeu" != "" ] && S_ID="$S_IDNeu" Title=$(grep "^T " $Rec/info.vdr| cut -f2- -d' '|head -1) Subtitle=$(grep "^S " $Rec/info.vdr| cut -f2- -d' '|head -1) if [ "$S_ID" = "" -o "$S_ID" != "" -a "$ADD_SID_RECORDINGS" = "yes" ]; then [ $(grep "^T " $Rec/info.vdr| wc -l) -gt 1 ] && printf "\n\nERROR: DUAL T Line %s\n\n" "$Rec" printf "Adding \"%s, %s\".\n" "$Title" "$Subtitle" if [ "$ASK_SID" = "yes" -a "$S_ID" = "" ]; then if [ "$Title" != "$PrevTitle" ]; then printf "Enter S-ID (s=skip, ENTER=$DEFAULT_SID): " read NEW_SID if [ "$NEW_SID" != "s" ]; then [ -z "$NEW_SID" ] && NEW_SID=$DEFAULT_SID printf "S-ID is set to $NEW_SID for \"$Title\"\n\n" fi else printf "Title matches, using same S-ID as before : $NEW_SID\n\n" fi PrevTitle=$Title else [ "$S_ID" = "" ] && NEW_SID=$DEFAULT_SID || NEW_SID=$S_ID fi if [ "$NEW_SID" != "s" ]; then echo "R $CTIME 0 $NEW_SID" >> $EPGSEARCHDONE_FILE grep -v "^[EVX] " $Rec/info.vdr >> $EPGSEARCHDONE_FILE echo "r" >> $EPGSEARCHDONE_FILE else printf "SKIP \"%s, %s\"\n\n" "$Title" "$Subtitle" fi else printf "SKIP \"%s, %s\" - it has S-ID: $S_ID\n\n" "$Title" "$Subtitle" fi else printf "No Info.vdr found : %s\n" "$Rec" fi } if [ -z "$1" ]; then printf "\nERROR : Parameter 1 should be either \"--recursive\" with start directory or a recording directory.\n" exit 1 fi [ "$TEST" = "yes" ] && EPGSEARCHDONE_FILE=$EPGSEARCHDONE_FILE.test || cp $EPGSEARCHDONE_FILE $EPGSEARCHDONE_FILE.bak if [ "$1" = "--recursive" ]; then shift [ "$ASK_SID" = "yes" ] && ShowUsableSIDs printf "Default S-ID: $DEFAULT_SID\n\n" [ ! -z "$1" ] && START_DIR=$1 || START_DIR=$VIDEO_ROOT for i in $(find $START_DIR/ -type d -name "*.rec" -print); do AddRecToDone $i ; done else AddRecToDone $1 fi if [ "$TEST" = "yes" ]; then printf "\n\nTEST run !!!!\nNow take a look at the File $EPGSEARCHDONE_FILE to see if everything is OK.\n\n" else # Tell epgsearch that done-file was changed if ! echo "$SVDRPSEND PLUG epgsearch UPDD >/dev/null 2>&1" | at now >/dev/null 2>&1; then if ! setsid "$SVDRPSEND" PLUG epgsearch UPDD >/dev/null 2>&1; then echo "ERROR calling $SVDRPSEND PLUG epgsearch UPDD" fi fi fi #EOF vdr-plugin-epgsearch/scripts/recrep.sh0000755000175000017500000000252612466747543017765 0ustar tobiastobias#!/bin/bash #------------------------------------------------------------------------------ # this script allows searching for a repeat of a recording using epgsearch # add the following lines to your reccmds.conf # # Search for repeat : /path_to_this_script/recrep.sh 0 # Search for repeat with subtitle (same episode): /path_to_this_script/recrep.sh 1 # # Author: Christian Wieninger (cwieninger@gmx.de) # Version: 1.1 - 2011-01-16 # # requirements: grep #------------------------------------------------------------------------------ # adjust the following lines to your config # your plugins config dir PLUGINCONFDIR=/var/lib/vdr/plugins/epgsearch # path to svdrpsend SVDRPSEND=svdrpsend # the key used to call epgsearch EPGSEARCHKEY=green # do not edit below this line cat << EOM >/tmp/cmd.sh INFOFILE="$2/info"; TITLE=\$(grep '^T ' \$INFOFILE); #cut leading 'T ' TITLE=\${TITLE#*\$T }; EPISODE=\$(grep '^S ' \$INFOFILE) #cut leading 'S ' EPISODE=\${EPISODE#*\$S }; SEARCHTERM=\$TITLE; if [ "$1" -eq "1" ]; then SEARCHTERM=\$TITLE~\$EPISODE; fi RCFILE=$PLUGINCONFDIR/.epgsearchrc echo Search=\$SEARCHTERM > \$RCFILE #search for this term as phrase echo SearchMode=0 >> \$RCFILE if [ "$1" -eq "0" ]; then echo UseSubtitle=0 >> \$RCFILE; fi echo UseDescr=0 >> \$RCFILE $SVDRPSEND HITK $EPGSEARCHKEY EOM echo ". /tmp/cmd.sh; rm /tmp/cmd.sh" | at now vdr-plugin-epgsearch/scripts/sendEmail.pl0000755000175000017500000017173412466747543020417 0ustar tobiastobias#!/usr/bin/perl -w ############################################################################## ## sendEmail ## Written by: Brandon Zehm ## ## License: ## sendEmail (hereafter referred to as "program") is free software; ## you can redistribute it and/or modify it under the terms of the GNU General ## Public License as published by the Free Software Foundation; either version ## 2 of the License, or (at your option) any later version. ## Note that when redistributing modified versions of this source code, you ## must ensure that this disclaimer and the above coder's names are included ## VERBATIM in the modified code. ## ## Disclaimer: ## This program is provided with no warranty of any kind, either expressed or ## implied. It is the responsibility of the user (you) to fully research and ## comprehend the usage of this program. As with any tool, it can be misused, ## either intentionally (you're a vandal) or unintentionally (you're a moron). ## THE AUTHOR(S) IS(ARE) NOT RESPONSIBLE FOR ANYTHING YOU DO WITH THIS PROGRAM ## or anything that happens because of your use (or misuse) of this program, ## including but not limited to anything you, your lawyers, or anyone else ## can dream up. And now, a relevant quote directly from the GPL: ## ## NO WARRANTY ## ## 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY ## FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN ## OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES ## PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED ## OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS ## TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ## PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, ## REPAIR OR CORRECTION. ## ############################################################################## use strict; use IO::Socket; ######################## ## Global Variables ## ######################## my %conf = ( ## General "programName" => $0, ## The name of this program "version" => '1.52', ## The version of this program "authorName" => 'Brandon Zehm', ## Author's Name "authorEmail" => 'caspian@dotconf.net', ## Author's Email Address "timezone" => '+0000 (GMT)', ## We always use +0000 for the time zone "hostname" => 'localhost', ## Used in printmsg() for all output, and in SMTP EHLO. "debug" => 0, ## Default debug level "error" => '', ## Error messages will often be stored here ## Logging "debug" => 0, "stdout" => 1, "logging" => 0, ## If this is true the printmsg function prints to the log file "logFile" => '', ## If this is specified (form the command line via -l) this file will be used for logging. ## Network "server" => 'localhost', ## Default SMTP server "port" => 25, ## Default port "alarm" => '', ## Default timeout for connects and reads, this gets set from $opt{'timeout'} ## Email "delimiter" => "----MIME delimiter for sendEmail-" ## MIME Delimiter . rand(1000000), ## Add some randomness to the delimiter "Message-ID" => rand(1000000) . "-sendEmail", ## Message-ID for email header "authUsername" => '', ## Username used in SMTP Auth "authPassword" => '', ## Password used in SMTP Auth ); ## This hash stores the options passed on the command line via the -o option. my %opt = ( ## Addressing "reply-to" => '', ## Reply-To field ## Message "message-file" => '', ## File to read message body from "message-header" => '', ## Additional email header line "message-format" => 'normal', ## If "raw" is specified the message is sent unmodified "message-charset" => 'iso-8859-1', ## Message character-set ## Network "timeout" => 60, ## Default timeout for connects and reads, this is copied to $conf{'alarm'} later. ); ## More variables used later in the program my $CRLF = "\015\012"; my $subject = ''; my $message = ''; my $from = ''; my @to = (); my @cc = (); my @bcc = (); my @attachments = (); my @attachments_names = (); ## For printing colors to the console my ${colorRed} = "\033[31;1m"; my ${colorGreen} = "\033[32;1m"; my ${colorCyan} = "\033[36;1m"; my ${colorWhite} = "\033[37;1m"; my ${colorNormal} = "\033[m"; my ${colorBold} = "\033[1m"; my ${colorNoBold} = "\033[0m"; ## Don't use shell escape codes on Windows systems if ($^O =~ /win/i) { ${colorRed} = ""; ${colorGreen} = ""; ${colorCyan} = ""; ${colorWhite} = ""; ${colorNormal} = ""; ${colorBold} = ""; ${colorNoBold} = ""; } ############################# ## ## MAIN PROGRAM ## ############################# ## Initialize initialize(); ## Process Command Line processCommandLine(); $conf{'alarm'} = $opt{'timeout'}; ## Abort program after $conf{'alarm'} seconds to avoid infinite hangs alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32 ################################################### ## Read $message from STDIN if -m was not used ## ################################################### if (!($message)) { ## Read message body from a file specified with -o message-file= if ($opt{'message-file'}) { if (! -e $opt{'message-file'}) { printmsg("ERROR => Message body file specified [$opt{'message-file'}] does not exist!", 0); printmsg("HINT => 1) check spelling of your file; 2) fully qualify the path; 3) doubble quote it", 1); quit("", 1); } if (! -r $opt{'message-file'}) { printmsg("ERROR => Message body file specified can not be read due to restricted permissions!", 0); printmsg("HINT => Check permissions on file specified to ensure it can be read", 1); quit("", 1); } if (!open(MFILE, "< " . $opt{'message-file'})) { printmsg("ERROR => Error opening message body file [$opt{'message-file'}]: $!", 0); quit("", 1); } while () { $message .= $_; } close(MFILE); } ## Read message body from STDIN else { alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32 if ($conf{'stdout'}) { print "Reading message body from STDIN because the '-m' option was not used.\n"; print "If you are manually typing in a message:\n"; print " - First line must be received within $conf{'alarm'} seconds.\n" if ($^O !~ /win/i); print " - End manual input with a CTRL-D on its own line.\n\n" if ($^O !~ /win/i); print " - End manual input with a CTRL-Z on its own line.\n\n" if ($^O =~ /win/i); } while () { ## Read STDIN into $message $message .= $_; alarm(0) if ($^O !~ /win/i); ## Disable the alarm since at least one line was received } printmsg("Message input complete.", 0); } } ## Replace bare LF's with CRLF's (\012 should always have \015 with it) $message =~ s/(\015)?(\012|$)/\015\012/g; ## Replace bare CR's with CRLF's (\015 should always have \012 with it) $message =~ s/(\015)(\012|$)?/\015\012/g; ## Check message for bare periods and encode them $message =~ s/(^|$CRLF)(\.{1})($CRLF|$)/$1.$2$3/g; ## Get the current date for the email header my ($sec,$min,$hour,$mday,$mon,$year,$day) = gmtime(); $year += 1900; $mon = return_month($mon); $day = return_day($day); my $date = sprintf("%s, %s %s %d %.2d:%.2d:%.2d %s",$day, $mday, $mon, $year, $hour, $min, $sec, $conf{'timezone'}); ################################## ## Connect to the SMTP server ## ################################## printmsg("DEBUG => Connecting to $conf{'server'}:$conf{'port'}", 1); $SIG{'ALRM'} = sub { printmsg("ERROR => Timeout while connecting to $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds.", 0); printmsg("HINT => Try specifying a different mail relay with the -s option.", 1); quit("", 1); }; alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32; my $SERVER = IO::Socket::INET->new( PeerAddr => $conf{'server'}, PeerPort => $conf{'port'}, Proto => 'tcp', Autoflush => 1, timeout => $conf{'alarm'}, ); alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32; ## Make sure we got connected if ( (!$SERVER) or (!$SERVER->opened()) ) { printmsg("ERROR => Connection attempt to $conf{'server'}:$conf{'port'} failed: $@", 0); printmsg("HINT => Try specifying a different mail relay with the -s option.", 1); quit("", 1); } ######################### ## Do the SMTP Dance ## ######################### ## Read initial greeting to make sure we're talking to a live SMTP server if (SMTPchat()) { quit($conf{'error'}, 1); } ## EHLO if (SMTPchat('EHLO ' . $conf{'hostname'})) { printmsg($conf{'error'}, 0); printmsg("NOTICE => EHLO command failed, attempting HELO instead"); if (SMTPchat('HELO ' . $conf{'hostname'})) { quit($conf{'error'}, 1); } if ( $conf{'authUsername'} and $conf{'authPassword'} ) { printmsg("WARNING => The mail server does not support ESMTP or SMTP AUTH!"); } } else { ## Do SMTP Auth if required if ( $conf{'authUsername'} and $conf{'authPassword'} ) { if (SMTPchat('AUTH LOGIN')) { quit($conf{'error'}, 1); } if (SMTPchat($conf{'authUsername'})) { quit($conf{'error'}, 1); } if (SMTPchat($conf{'authPassword'})) { quit($conf{'error'}, 1); } } } ## MAIL FROM if (SMTPchat('MAIL FROM:<' .(returnAddressParts($from))[1]. '>')) { quit($conf{'error'}, 1); } ## RCPT TO my $oneRcptAccepted = 0; foreach my $rcpt (@to, @cc, @bcc) { my ($name, $address) = returnAddressParts($rcpt); if (SMTPchat('RCPT TO:<' . $address . '>')) { printmsg("WARNING => The recipient <$address> was rejected by the mail server, error follows:", 0); $conf{'error'} =~ s/^ERROR/WARNING/o; printmsg($conf{'error'}, 0); } elsif ($oneRcptAccepted == 0) { $oneRcptAccepted = 1; } } ## If no recipients were accepted we need to exit with an error. if ($oneRcptAccepted == 0) { quit("ERROR => Exiting. No recipients were accepted for delivery by the mail server.", 1); } ## DATA if (SMTPchat('DATA')) { quit($conf{'error'}, 1); } ############################### ## Build and send the body ## ############################### printmsg("INFO => Sending message body",1); ## If the message-format is raw just send the message as-is. if ($opt{'message-format'} =~ /^raw$/i) { print $SERVER $message; } ## If the message-format isn't raw, then build and send the message, else { ## Message-ID: print $SERVER 'Message-ID: <' . $conf{'Message-ID'} . '@' . $conf{'hostname'} . '>' . $CRLF; ## From: "Name" (the pointless test below is just to keep scoping correct) if ($from) { my ($name, $address) = returnAddressParts($from); print $SERVER 'From: "' . $name . '" <' . $address . '>' . $CRLF; } ## Reply-To: if ($opt{'reply-to'}) { my ($name, $address) = returnAddressParts($opt{'reply-to'}); print $SERVER 'Reply-To: "' . $name . '" <' . $address . '>' . $CRLF; } ## To: "Name" if (scalar(@to) > 0) { print $SERVER "To:"; for (my $a = 0; $a < scalar(@to); $a++) { my $msg = ""; my ($name, $address) = returnAddressParts($to[$a]); $msg = " \"$name\" <$address>"; ## If we're not on the last address add a comma to the end of the line. if (($a + 1) != scalar(@to)) { $msg .= ","; } print $SERVER $msg . $CRLF; } } ## We always want a To: line so if the only recipients were bcc'd they don't see who it was sent to else { print $SERVER "To: \"Undisclosed Recipients\" <>$CRLF"; } if (scalar(@cc) > 0) { print $SERVER "Cc:"; for (my $a = 0; $a < scalar(@cc); $a++) { my $msg = ""; my ($name, $address) = returnAddressParts($cc[$a]); $msg = " \"$name\" <$address>"; ## If we're not on the last address add a comma to the end of the line. if (($a + 1) != scalar(@cc)) { $msg .= ","; } print $SERVER $msg . $CRLF; } } print $SERVER 'Subject: ' . $subject . $CRLF; ## Subject print $SERVER 'Date: ' . $date . $CRLF; ## Date print $SERVER 'X-Mailer: sendEmail-'.$conf{'version'}.$CRLF; ## X-Mailer ## Send an additional message header line if specified if ($opt{'message-header'}) { print $SERVER $opt{'message-header'} . $CRLF; } ## Encode all messages with MIME. print $SERVER "MIME-Version: 1.0$CRLF"; print $SERVER "Content-Type: multipart/mixed; boundary=\"$conf{'delimiter'}\"$CRLF"; print $SERVER "$CRLF"; print $SERVER "This is a multi-part message in MIME format. To properly display this message you need a MIME-Version 1.0 compliant Email program.$CRLF"; print $SERVER "$CRLF"; ## Send message body print $SERVER "--$conf{'delimiter'}$CRLF"; ## If the message contains HTML change the Content-Type if ($message =~ /^\s*/i) { printmsg("Message is in HTML format", 1); print $SERVER "Content-Type: text/html;$CRLF"; } ## Otherwise it's a normal text email else { print $SERVER "Content-Type: text/plain;$CRLF"; } print $SERVER " charset=\"" . $opt{'message-charset'} . "\"$CRLF"; print $SERVER "Content-Transfer-Encoding: 7bit$CRLF"; print $SERVER $CRLF; print $SERVER $message; ## Send Attachemnts if ($attachments[0]) { ## Disable the alarm so people on modems can send big attachments alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32 ## Send the attachments foreach my $filename (@attachments) { ## This is check 2, we already checked this above, but just in case... if ( ! -f $filename ) { printmsg("ERROR => The file [$filename] doesn't exist! Email will be sent, but without that attachment.", 0); } elsif ( ! -r $filename ) { printmsg("ERROR => Couldn't open the file [$filename] for reading: $! Email will be sent, but without that attachment.", 0); } else { printmsg("DEBUG => Sending the attachment [$filename]", 1); send_attachment($filename); } } } ## End the mime encoded message print $SERVER "$CRLF--$conf{'delimiter'}--$CRLF"; } ## Tell the server we are done sending the email print $SERVER "$CRLF.$CRLF"; if (SMTPchat()) { quit($conf{'error'}, 1); } #################### # We are done!!! # #################### ## Disconnect from the server if (SMTPchat('QUIT')) { quit($conf{'error'}, 1); } close $SERVER; ####################################### ## Generate exit message/log entry ## ####################################### if ($conf{'debug'} or $conf{'logging'}) { printmsg("Generating a detailed exit message", 3); ## Put the message together my $output = "Email was sent successfully! From: <" . (returnAddressParts($from))[1] . "> "; if (scalar(@to) > 0) { $output .= "To: "; for ($a = 0; $a < scalar(@to); $a++) { $output .= "<" . (returnAddressParts($to[$a]))[1] . "> "; } } if (scalar(@cc) > 0) { $output .= "Cc: "; for ($a = 0; $a < scalar(@cc); $a++) { $output .= "<" . (returnAddressParts($cc[$a]))[1] . "> "; } } if (scalar(@bcc) > 0) { $output .= "Bcc: "; for ($a = 0; $a < scalar(@bcc); $a++) { $output .= "<" . (returnAddressParts($bcc[$a]))[1] . "> "; } } $output .= "Subject: [$subject] " if ($subject); if (scalar(@attachments_names) > 0) { $output .= "Attachment(s): "; foreach(@attachments_names) { $output .= "[$_] "; } } $output .= "Server: [$conf{'server'}:$conf{'port'}]"; ###################### # Exit the program # ###################### ## Print / Log the detailed message quit($output, 0); } else { ## Or the standard message quit("Email was sent successfully!", 0); } ############################################################################################### ## Function: initialize () ## ## Does all the script startup jibberish. ## ############################################################################################### sub initialize { ## Set STDOUT to flush immediatly after each print $| = 1; ## Intercept signals $SIG{'QUIT'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; $SIG{'INT'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; $SIG{'KILL'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; $SIG{'TERM'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; ## ALARM and HUP signals are not supported in Win32 unless ($^O =~ /win/i) { $SIG{'HUP'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; $SIG{'ALRM'} = sub { quit("EXITING: Received SIG$_[0]", 1); }; } ## Fixup $conf{'programName'} $conf{'programName'} =~ s/(.)*[\/,\\]//; $0 = $conf{'programName'} . " " . join(" ", @ARGV); ## Fixup $conf{'hostname'} if ($conf{'hostname'} eq 'localhost') { $conf{'hostname'} = ""; if ($ENV{'HOSTNAME'}) { $conf{'hostname'} = lc($ENV{'HOSTNAME'}); } elsif ($ENV{'COMPUTERNAME'}) { $conf{'hostname'} = lc($ENV{'COMPUTERNAME'}); } else { ## Try the hostname module use Sys::Hostname; $conf{'hostname'} = lc(hostname()); } ## Assign a name of "localhost" if it can't find anything else. if (!$conf{'hostname'}) { $conf{'hostname'} = 'localhost'; } $conf{'hostname'} =~ s/\..*$//; ## Remove domain name if it's present } return(1); } ############################################################################################### ## Function: processCommandLine () ## ## Processes command line storing important data in global vars (usually %conf) ## ############################################################################################### sub processCommandLine { ############################ ## Process command line ## ############################ my @ARGS = @ARGV; ## This is so later we can re-parse the command line args later if we need to my $numargv = @ARGS; help() unless ($numargv); my $counter = 0; for ($counter = 0; $counter < $numargv; $counter++) { if ($ARGS[$counter] =~ /^-h$/i) { ## Help ## help(); } elsif ($ARGS[$counter] eq "") { ## Ignore null arguments ## Do nothing } elsif ($ARGS[$counter] =~ /^--help/) { ## Topical Help ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { helpTopic($ARGS[$counter]); } else { help(); } } elsif ($ARGS[$counter] =~ /^-o$/i) { ## Options specified with -o ## $counter++; ## Loop through each option passed after the -o while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { if ($ARGS[$counter] !~ /(\S+)=(\S.*)/) { printmsg("WARNING => Name/Value pair [$ARGS[$counter]] is not properly formatted", 0); printmsg("WARNING => Arguments proceeding -o should be in the form of \"name=value\"", 0); } else { if (exists($opt{$1})) { $opt{$1} = $2; printmsg("DEBUG => Assigned \$opt{} key/value: $1 => $2", 3); } else { printmsg("WARNING => Name/Value pair [$ARGS[$counter]] will be ignored: unknown key [$1]", 0); printmsg("HINT => Try the --help option to find valid command line arguments", 1); } } $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-f$/) { ## From ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $from = $ARGS[$counter]; } else { printmsg("WARNING => The argument after -f was not an email address!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-t$/) { ## To ## $counter++; while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { if ($ARGS[$counter] =~ /[;,]/) { push (@to, split(/[;,]/, $ARGS[$counter])); } else { push (@to,$ARGS[$counter]); } $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-cc$/) { ## Cc ## $counter++; while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { if ($ARGS[$counter] =~ /[;,]/) { push (@cc, split(/[;,]/, $ARGS[$counter])); } else { push (@cc,$ARGS[$counter]); } $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-bcc$/) { ## Bcc ## $counter++; while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { if ($ARGS[$counter] =~ /[;,]/) { push (@bcc, split(/[;,]/, $ARGS[$counter])); } else { push (@bcc,$ARGS[$counter]); } $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-m$/) { ## Message ## $counter++; $message = ""; while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { if ($message) { $message .= " "; } $message .= $ARGS[$counter]; $counter++; } $counter--; ## Replace '\n' with $CRLF. ## This allows newlines with messages sent on the command line $message =~ s/\\n/$CRLF/g; } elsif ($ARGS[$counter] =~ /^-u$/) { ## Subject ## $counter++; $subject = ""; while ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { if ($subject) { $subject .= " "; } $subject .= $ARGS[$counter]; $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-s$/) { ## Server ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'server'} = $ARGS[$counter]; if ($conf{'server'} =~ /:/) { ## Port ## ($conf{'server'},$conf{'port'}) = split(":",$conf{'server'}); } } else { printmsg("WARNING - The argument after -s was not the server!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-a$/) { ## Attachments ## $counter++; while ($ARGS[$counter] && ($ARGS[$counter] !~ /^-/)) { push (@attachments,$ARGS[$counter]); $counter++; } $counter--; } elsif ($ARGS[$counter] =~ /^-xu$/) { ## AuthSMTP Username ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'authUsername'} = $ARGS[$counter]; my $tmp = substr(pack('u', $conf{'authUsername'}), 1); ## Convert the string to uuencoded text chop($tmp); $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 $conf{'authUsername'} = $tmp; } else { printmsg("WARNING => The argument after -xu was not valid username!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-xp$/) { ## AuthSMTP Password ## $counter++; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'authPassword'} = $ARGS[$counter]; my $tmp = substr(pack('u', $conf{'authPassword'}), 1); ## Convert the binary to uuencoded text chop($tmp); $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 $conf{'authPassword'} = $tmp; } else { printmsg("WARNING => The argument after -xp was not valid password!", 0); $counter--; } } elsif ($ARGS[$counter] =~ /^-l$/) { ## Logging ## $counter++; $conf{'logging'} = 1; if ($ARGS[$counter] && $ARGS[$counter] !~ /^-/) { $conf{'logFile'} = $ARGS[$counter]; } else { printmsg("WARNING - The argument after -l was not the log file!", 0); $counter--; } } elsif ($ARGS[$counter] =~ s/^-v+//i) { ## Verbosity ## my $tmp = (length($&) - 1); $conf{'debug'} += $tmp; } elsif ($ARGS[$counter] =~ /^-q$/) { ## Quiet ## $conf{'stdout'} = 0; } else { printmsg("Error: \"$ARGS[$counter]\" is not a recognized option!", 0); help(); } } ################################################### ## Verify required variables are set correctly ## ################################################### if (!$conf{'server'}) { $conf{'server'} = 'localhost'; } if (!$conf{'port'}) { $conf{'port'} = 25; } if (!$from) { quit("ERROR => You must specify a 'from' field! Try --help.", 1); } if ( ((scalar(@to)) + (scalar(@cc)) + (scalar(@bcc))) <= 0) { quit("ERROR => You must specify at least one recipient via -t, -cc, or -bcc", 1); } ## Make sure email addresses look OK. foreach my $addr (@to, @cc, @bcc, $from, $opt{'reply-to'}) { if ($addr) { if (!returnAddressParts($addr)) { printmsg("ERROR => Can't use improperly formatted email address: $addr", 0); printmsg("HINT => Try viewing the extended help on addressing with \"--help addressing\"", 1); quit("", 1); } } } ## Make sure all attachments exist. foreach my $file (@attachments) { if ( (! -f $file) or (! -r $file) ) { printmsg("ERROR => The attachment [$file] doesn't exist!", 0); printmsg("HINT => Try specifying the full path to the file or reading extended help with \"--help message\"", 1); quit("", 1); } } if ($conf{'logging'} and (!$conf{'logFile'})) { quit("ERROR => You used -l to enable logging but didn't specify a log file!", 1); } if ( $conf{'authUsername'} ) { if (!$conf{'authPassword'}) { quit ("ERROR => You must supply both a username and a password to use SMTP auth.",1); } } ## Return 0 errors return(0); } ## getline($socketRef) sub getline { my ($socketRef) = @_; local ($/) = "\r\n"; return $$socketRef->getline; } ## Receive a (multiline?) SMTP response from ($socketRef) sub getResponse { my ($socketRef) = @_; my ($tmp, $reply); local ($/) = "\r\n"; return undef unless defined($tmp = getline($socketRef)); return("getResponse() socket is not open") unless ($$socketRef->opened); ## Keep reading lines if it's a multi-line response while ($tmp =~ /^\d{3}-/o) { $reply .= $tmp; return undef unless defined($tmp = getline($socketRef)); } $reply .= $tmp; $reply =~ s/\r?\n$//o; return $reply; } ############################################################################################### ## Function: SMTPchat ( [string $command] ) ## ## Description: Sends $command to the SMTP server (on SERVER) and awaits a successfull ## reply form the server. If the server returns an error, or does not reply ## within $conf{'alarm'} seconds an error is generated. ## NOTE: $command is optional, if no command is specified then nothing will ## be sent to the server, but a valid response is still required from the server. ## ## Input: [$command] A (optional) valid SMTP command (ex. "HELO") ## ## ## Output: Returns zero on success, or non-zero on error. ## Error messages will be stored in $conf{'error'} ## ## ## Example: SMTPchat ("HELO mail.isp.net"); ############################################################################################### sub SMTPchat { my ($command) = @_; printmsg("INFO => Sending: \t$command", 1) if ($command); ## Send our command print $SERVER "$command$CRLF" if ($command); ## Read a response from the server $SIG{'ALRM'} = sub { $conf{'error'} = "alarm"; $SERVER->close(); }; alarm($conf{'alarm'}) if ($^O !~ /win/i); ## alarm() doesn't work in win32; my $result = getResponse(\$SERVER); alarm(0) if ($^O !~ /win/i); ## alarm() doesn't work in win32; ## Generate an alert if we timed out if ($conf{'error'} eq "alarm") { $conf{'error'} = "ERROR => Timeout while reading from $conf{'server'}:$conf{'port'} There was no response after $conf{'alarm'} seconds."; return(1); } ## Make sure the server actually responded if (!$result) { $conf{'error'} = "ERROR => $conf{'server'}:$conf{'port'} returned a zero byte response to our query."; return(2); } ## Validate the response if (evalSMTPresponse($result)) { ## conf{'error'} will already be set here return(2); } ## Print the success messsage printmsg($conf{'error'}, 1); ## Return Success return(0); } ############################################################################################### ## Function: evalSMTPresponse (string $message ) ## ## Description: Searches $message for either an SMTP success or error code, and returns ## 0 on success, and the actual error code on error. ## ## ## Input: $message Data received from a SMTP server (ex. "220 ## ## ## Output: Returns zero on success, or non-zero on error. ## Error messages will be stored in $conf{'error'} ## ## ## Example: SMTPchat ("HELO mail.isp.net"); ############################################################################################### sub evalSMTPresponse { my ($message) = @_; ## Validate input if (!$message) { $conf{'error'} = "ERROR => No message was passed to evalSMTPresponse(). What happened?"; return(1) } printmsg("DEBUG => evalSMTPresponse() - Checking for SMTP success or error status in the message: $message ", 3); ## Look for a SMTP success code if ($message =~ /^([23]\d\d)/) { printmsg("DEBUG => evalSMTPresponse() - Found SMTP success code: $1", 2); $conf{'error'} = "SUCCESS => Received: \t$message"; return(0); } ## Look for a SMTP error code if ($message =~ /^([45]\d\d)/) { printmsg("DEBUG => evalSMTPresponse() - Found SMTP error code: $1", 2); $conf{'error'} = "ERROR => Received: \t$message"; return($1); } ## If no SMTP codes were found return an error of 1 $conf{'error'} = "ERROR => Received a message with no success or error code. The message received was: $message"; return(2); } ######################################################### # SUB: &return_month(0,1,etc) # returns the name of the month that corrosponds # with the number. returns 0 on error. ######################################################### sub return_month { my $x = $_[0]; if ($x == 0) { return 'Jan'; } if ($x == 1) { return 'Feb'; } if ($x == 2) { return 'Mar'; } if ($x == 3) { return 'Apr'; } if ($x == 4) { return 'May'; } if ($x == 5) { return 'Jun'; } if ($x == 6) { return 'Jul'; } if ($x == 7) { return 'Aug'; } if ($x == 8) { return 'Sep'; } if ($x == 9) { return 'Oct'; } if ($x == 10) { return 'Nov'; } if ($x == 11) { return 'Dec'; } return (0); } ######################################################### # SUB: &return_day(0,1,etc) # returns the name of the day that corrosponds # with the number. returns 0 on error. ######################################################### sub return_day { my $x = $_[0]; if ($x == 0) { return 'Sun'; } if ($x == 1) { return 'Mon'; } if ($x == 2) { return 'Tue'; } if ($x == 3) { return 'Wed'; } if ($x == 4) { return 'Thu'; } if ($x == 5) { return 'Fri'; } if ($x == 6) { return 'Sat'; } return (0); } ############################################################################################### ## Function: returnAddressParts(string $address) ## ## Description: Returns a two element array containing the "Name" and "Address" parts of ## an email address. ## ## Example: "Brandon Zehm " ## would return: ("Brandon Zehm", "caspian@dotconf.net"); ## ## "caspian@dotconf.net" ## would return: ("caspian@dotconf.net", "caspian@dotconf.net") ############################################################################################### sub returnAddressParts { my $input = $_[0]; my $name = ""; my $address = ""; ## Make sure to fail if it looks totally invalid if ($input !~ /(\S+\@\S+)/) { $conf{'error'} = "ERROR => The address [$input] doesn't look like a valid email address, ignoring it"; return(undef()); } ## Check 1, should find addresses like: "Brandon Zehm " elsif ($input =~ /^\s*(\S(.*\S)?)\s*<(\S+\@\S+)>/o) { ($name, $address) = ($1, $3); } ## Otherwise if that failed, just get the address: elsif ($input =~ /<(\S+\@\S+)>/o) { $name = $address = $1; } ## Or maybe it was formatted this way: caspian@dotconf.net elsif ($input =~ /(\S+\@\S+)/o) { $name = $address = $1; } ## Something stupid happened, just return an error. unless ($name and $address) { printmsg("ERROR => Couldn't parse the address: $input", 0); printmsg("HINT => If you think this should work, consider reporting this as a bug to $conf{'authorEmail'}", 1); return(undef()); } ## Make sure there aren't invalid characters in the address, and return it. my $ctrl = '\000-\037'; my $nonASCII = '\x80-\xff'; if ($address =~ /[<> ,;:"'\[\]\\$ctrl$nonASCII]/) { printmsg("WARNING => The address [$address] seems to contain invalid characters: continuing anyway", 0); } return($name, $address); } ######################################################### # SUB: send_attachment("/path/filename") # Sends the mime headers and base64 encoded file # to the email server. ######################################################### sub send_attachment { my ($filename) = @_; ## Get filename passed my (@fields, $y, $filename_name, $encoding, ## Local variables @attachlines, $content_type); my $bin = 1; @fields = split(/\/|\\/, $filename); ## Get the actual filename without the path $filename_name = pop(@fields); push @attachments_names, $filename_name; ## FIXME: This is only used later for putting in the log file ########################## ## Autodetect Mime Type ## ########################## @fields = split(/\./, $filename_name); $encoding = $fields[$#fields]; if ($encoding =~ /txt|text|log|conf|^c$|cpp|^h$|inc|m3u/i) { $content_type = 'text/plain'; } elsif ($encoding =~ /html|htm|shtml|shtm|asp|php|cfm/i) { $content_type = 'text/html'; } elsif ($encoding =~ /sh$/i) { $content_type = 'application/x-sh'; } elsif ($encoding =~ /tcl/i) { $content_type = 'application/x-tcl'; } elsif ($encoding =~ /pl$/i) { $content_type = 'application/x-perl'; } elsif ($encoding =~ /js$/i) { $content_type = 'application/x-javascript'; } elsif ($encoding =~ /man/i) { $content_type = 'application/x-troff-man'; } elsif ($encoding =~ /gif/i) { $content_type = 'image/gif'; } elsif ($encoding =~ /jpg|jpeg|jpe|jfif|pjpeg|pjp/i) { $content_type = 'image/jpeg'; } elsif ($encoding =~ /tif|tiff/i) { $content_type = 'image/tiff'; } elsif ($encoding =~ /xpm/i) { $content_type = 'image/x-xpixmap'; } elsif ($encoding =~ /bmp/i) { $content_type = 'image/x-MS-bmp'; } elsif ($encoding =~ /pcd/i) { $content_type = 'image/x-photo-cd'; } elsif ($encoding =~ /png/i) { $content_type = 'image/png'; } elsif ($encoding =~ /aif|aiff/i) { $content_type = 'audio/x-aiff'; } elsif ($encoding =~ /wav/i) { $content_type = 'audio/x-wav'; } elsif ($encoding =~ /mp2|mp3|mpa/i) { $content_type = 'audio/x-mpeg'; } elsif ($encoding =~ /ra$|ram/i) { $content_type = 'audio/x-pn-realaudio'; } elsif ($encoding =~ /mpeg|mpg/i) { $content_type = 'video/mpeg'; } elsif ($encoding =~ /mov|qt$/i) { $content_type = 'video/quicktime'; } elsif ($encoding =~ /avi/i) { $content_type = 'video/x-msvideo'; } elsif ($encoding =~ /zip/i) { $content_type = 'application/x-zip-compressed'; } elsif ($encoding =~ /tar/i) { $content_type = 'application/x-tar'; } elsif ($encoding =~ /jar/i) { $content_type = 'application/java-archive'; } elsif ($encoding =~ /exe|bin/i) { $content_type = 'application/octet-stream'; } elsif ($encoding =~ /ppt|pot|ppa|pps|pwz/i) { $content_type = 'application/vnd.ms-powerpoint'; } elsif ($encoding =~ /mdb|mda|mde/i) { $content_type = 'application/vnd.ms-access'; } elsif ($encoding =~ /xls|xlt|xlm|xld|xla|xlc|xlw|xll/i) { $content_type = 'application/vnd.ms-excel'; } elsif ($encoding =~ /doc|dot/i) { $content_type = 'application/msword'; } elsif ($encoding =~ /rtf/i) { $content_type = 'application/rtf'; } elsif ($encoding =~ /pdf/i) { $content_type = 'application/pdf'; } elsif ($encoding =~ /tex/i) { $content_type = 'application/x-tex'; } elsif ($encoding =~ /latex/i) { $content_type = 'application/x-latex'; } elsif ($encoding =~ /vcf/i) { $content_type = 'application/x-vcard'; } else { $content_type = 'application/octet-stream'; } ############################ ## Process the attachment ## ############################ ##################################### ## Generate and print MIME headers ## ##################################### $y = "$CRLF--$conf{'delimiter'}$CRLF"; $y .= "Content-Type: $content_type;$CRLF"; $y .= " name=\"$filename_name\"$CRLF"; $y .= "Content-Transfer-Encoding: base64$CRLF"; $y .= "Content-Disposition: attachment; filename=\"$filename_name\"$CRLF"; $y .= "$CRLF"; print $SERVER $y; ########################################################### ## Convert the file to base64 and print it to the server ## ########################################################### open (FILETOATTACH, $filename) || do { printmsg("ERROR => Opening the file [$filename] for attachment failed with the error: $!", 0); return(1); }; binmode(FILETOATTACH); ## Hack to make Win32 work my $res = ""; my $tmp = ""; my $base64 = ""; while () { ## Read a line from the (binary) file $res .= $_; ################################### ## Convert binary data to base64 ## ################################### while ($res =~ s/(.{45})//s) { ## Get 45 bytes from the binary string $tmp = substr(pack('u', $&), 1); ## Convert the binary to uuencoded text chop($tmp); $tmp =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 $base64 .= $tmp; } ################################ ## Print chunks to the server ## ################################ while ($base64 =~ s/(.{76})//s) { print $SERVER "$1$CRLF"; } } ################################### ## Encode and send the leftovers ## ################################### my $padding = ""; if ( ($res) and (length($res) >= 1) ) { $padding = (3 - length($res) % 3) % 3; ## Set flag if binary data isn't divisible by 3 $res = substr(pack('u', $res), 1); ## Convert the binary to uuencoded text chop($res); $res =~ tr|` -_|AA-Za-z0-9+/|; ## Translate from uuencode to base64 } ############################ ## Fix padding at the end ## ############################ $res = $base64 . $res; ## Get left overs from above $res =~ s/.{$padding}$/'=' x $padding/e if $padding; ## Fix the end padding if flag (from above) is set if ($res) { while ($res =~ s/(.{1,76})//s) { ## Send it to the email server. print $SERVER "$1$CRLF"; } } close (FILETOATTACH) || do { printmsg("ERROR - Closing the filehandle for file [$filename] failed with the error: $!", 0); return(2); }; ## Return 0 errors return(0); } ############################################################################################### ## Function: printmsg (string $message, int $level) ## ## Description: Handles all messages - printing them to the screen only if the messages ## $level is >= the global debug level. If $conf{'logFile'} is defined it ## will also log the message to that file. ## ## Input: $message A message to be printed, logged, etc. ## $level The debug level of the message. If ## not defined 0 will be assumed. 0 is ## considered a normal message, 1 and ## higher is considered a debug message. ## ## Output: Prints to STDOUT ## ## Assumptions: $conf{'hostname'} should be the name of the computer we're running on. ## $conf{'stdout'} should be set to 1 if you want to print to stdout ## $conf{'logFile'} should be a full path to a log file if you want that ## $conf{'syslog'} should be 1 if you want to syslog, the syslog() function ## written by Brandon Zehm should be present. ## $conf{'debug'} should be an integer between 0 and 10. ## ## Example: printmsg("WARNING: We believe in generic error messages... NOT!", 0); ############################################################################################### sub printmsg { ## Assign incoming parameters to variables my ( $message, $level ) = @_; ## Make sure input is sane $level = 0 if (!defined($level)); $message =~ s/\s+$//sgo; $message =~ s/\r?\n/, /sgo; ## Continue only if the debug level of the program is >= message debug level. if ($conf{'debug'} >= $level) { ## Get the date in the format: Dec 3 11:14:04 my ($sec, $min, $hour, $mday, $mon) = localtime(); $mon = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$mon]; my $date = sprintf("%s %02d %02d:%02d:%02d", $mon, $mday, $hour, $min, $sec); ## Print to STDOUT always if debugging is enabled, or if conf{stdout} is true. if ( ($conf{'debug'} >= 1) or ($conf{'stdout'} == 1) ) { print "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n"; } ## Print to the log file if $conf{'logging'} is true if ($conf{'logFile'}) { if (openLogFile($conf{'logFile'})) { $conf{'logFile'} = ""; printmsg("ERROR => Opening the file [$conf{'logFile'}] for appending returned the error: $!", 1); } print LOGFILE "$date $conf{'hostname'} $conf{'programName'}\[$$\]: $message\n"; } } ## Return 0 errors return(0); } ############################################################################################### ## FUNCTION: ## openLogFile ( $filename ) ## ## ## DESCRIPTION: ## Opens the file $filename and attaches it to the filehandle "LOGFILE". Returns 0 on success ## and non-zero on failure. Error codes are listed below, and the error message gets set in ## global variable $!. ## ## ## Example: ## openFile ("/var/log/sendEmail.log"); ## ############################################################################################### sub openLogFile { ## Get the incoming filename my $filename = $_[0]; ## Make sure our file exists, and if the file doesn't exist then create it if ( ! -f $filename ) { print STDERR "NOTICE: The log file [$filename] does not exist. Creating it now with mode [0600].\n" if ($conf{'stdout'}); open (LOGFILE, ">>$filename"); close LOGFILE; chmod (0600, $filename); } ## Now open the file and attach it to a filehandle open (LOGFILE,">>$filename") or return (1); ## Put the file into non-buffering mode select LOGFILE; $| = 1; select STDOUT; ## Return success return(0); } ############################################################################################### ## Function: quit (string $message, int $errorLevel) ## ## Description: Exits the program, optionally printing $message. It ## returns an exit error level of $errorLevel to the ## system (0 means no errors, and is assumed if empty.) ## ## Example: quit("Exiting program normally", 0); ############################################################################################### sub quit { my %incoming = (); ( $incoming{'message'}, $incoming{'errorLevel'} ) = @_; $incoming{'errorLevel'} = 0 if (!defined($incoming{'errorLevel'})); ## Print exit message if ($incoming{'message'}) { printmsg($incoming{'message'}, 0); } ## Exit exit($incoming{'errorLevel'}); } ############################################################################################### ## Function: help () ## ## Description: For all those newbies ;) ## Prints a help message and exits the program. ## ############################################################################################### sub help { exit(1) if (!$conf{'stdout'}); print <${colorNoBold} Synopsis: $conf{'programName'} -f ADDRESS [options] ${colorRed}Required:${colorNormal} -f ADDRESS from (sender) email address * At least one recipient required via -t, -cc, or -bcc * Message body required via -m, STDIN, or -o message-file=FILE ${colorGreen}Common:${colorNormal} -t ADDRESS [ADDR ...] to email address(es) -u SUBJECT message subject -m MESSAGE message body -s SERVER[:PORT] smtp mail relay, default is $conf{'server'}:$conf{'port'} ${colorGreen}Optional:${colorNormal} -a FILE [FILE ...] file attachment(s) -cc ADDRESS [ADDR ...] cc email address(es) -bcc ADDRESS [ADDR ...] bcc email address(es) ${colorGreen}Paranormal:${colorNormal} -xu USERNAME authentication user (for SMTP authentication) -xp PASSWORD authentication password (for SMTP authentication) -l LOGFILE log to the specified file -v verbosity, use multiple times for greater effect -q be quiet (no stdout output) -o NAME=VALUE see extended help topic "misc" for details ${colorGreen}Help:${colorNormal} --help TOPIC The following extended help topics are available: addressing explain addressing and related options message explain message body input and related options misc explain -xu, -xp, and others networking explain -s, etc output explain logging and other output options EOM exit(1); } ############################################################################################### ## Function: helpTopic ($topic) ## ## Description: For all those newbies ;) ## Prints a help message and exits the program. ## ############################################################################################### sub helpTopic { exit(1) if (!$conf{'stdout'}); my ($topic) = @_; CASE: { ## ADDRESSING ($topic eq 'addressing') && do { print <" Just Address: "john.doe\@gmail.com" The "Full Name" method is useful if you want a name, rather than a plain email address, to be displayed in the recipient's From, To, or Cc fields when they view the message. ${colorGreen}Multiple Recipients${colorNormal} The -t, -cc, and -bcc options each accept multiple addresses. They may be specified by separating them by either a white space, comma, or semi-colon separated list. You may also specify the -t, -cc, and -bcc options multiple times, each occurance will append the new recipients to the respective list. Examples: (I used "-t" in these examples, but it can be "-cc" or "-bcc" as well) * Space separated list: -t jane.doe\@yahoo.com "John Doe " * Semi-colon separated list: -t "jane.doe\@yahoo.com; John Doe " * Comma separated list: -t "jane.doe\@yahoo.com, John Doe " * Multiple -t, -cc, or -bcc options: -t "jane.doe\@yahoo.com" -t "John Doe " EOM last CASE; }; ## MESSAGE ($topic eq 'message') && do { print <" and sendEmail will properly label the mime header so MUAs properly render the message. -o message-file=FILE This option is one of three methods that allow you to specify the message body for your email. To use this option simply specify a text file containing the body of your email message. Examples: -o message-file=/root/message.txt -o message-file="C:\\Program Files\\output.txt" -o message-header=EMAIL HEADER This option allows you to specify an additional single line to insert into the email headers. Do not use this unless you know what you are doing! Example: To scare a Microsoft Outlook user you may want to try this: -o message-header="X-Message-Flag: This message contains illegal content" -o message-format=raw This option instructs sendEmail to assume the message is already a complete email message. SendEmail will not generate any headers and will transmit the message as-is to the remote SMTP server. Due to the nature of this option the following command line options will be ignored when this one is used: -u SUBJECT -o message-header=EMAIL HEADER -o message-charset=CHARSET -a ATTACHMENT -o message-charset=CHARSET This option allows you to specify the character-set for the message body. The default is iso-8859-1. ${colorGreen}The Message Body${colorNormal} The message body may be specified in one of three ways: 1) Via the -m MESSAGE command line option. Example: -m "This is the message body" 2) By putting the message body in a file and using the -o message-file=FILE command line option. Example: -o message-file=/root/message.txt 3) By piping the message body to sendEmail when nither of the above command line options were specified. Example: grep "ERROR" /var/log/messages | sendEmail -t you\@domain.com ... If the message body begins with "" then the message will be treated as an HTML message and the MIME headers will be written so that a HTML capable email client will display the message in it's HTML form. Any of the above methods may be used with the -o message-format=raw option to deliver an already complete email message. EOM last CASE; }; ## MISC ($topic eq 'misc') && do { print < The help topic specified is not valid!", 1); }; exit(1); } vdr-plugin-epgsearch/scripts/epg2taste.sh0000755000175000017500000000115212466747543020375 0ustar tobiastobias#!/bin/sh # # epg2taste.sh - v.0.1 # # add this line to your epgsearchcmds.conf: # folgende zeile in die epgsearchcmds.conf eintragen: # # epg2taste : /usr/local/bin/epg2taste.sh # CONFIG START TASTE_FILE="/etc/vdr/plugins/taste.conf" SVDRPSEND=svdrpsend # default taste settings REGULAR_EXPRESSION=0 # Regular Expression / Regulärer Ausdruck IGNORE_CASE=0 # Ignore Case / Groß/Kleinschreibung ignorieren # CONFIG END # add taste echo "${REGULAR_EXPRESSION}:${IGNORE_CASE}:${1}" >> "${TASTE_FILE}" echo "Done..." # jump back at now <=0.9.3). # it requires the timercmd patch from Gerhard Steiner, that extends the timers # menu of VDR with commands like in recordings menu # # add the following lines to your timercmds.conf # # Search for repeat : /path_of_this_script/timerrep.sh 0 # Search for repeat (with subtitle): /path_of_this_script/timerrep.sh 1 # # Author: Christian Wieninger (cwieninger@gmx.de) #------------------------------------------------------------------------------ # adjust the following lines to your config # your plugins config dir PLUGINCONFDIR=/etc/vdr/plugins/epgsearch # path to svdrpsend SVDRPSEND=svdrpsend # if you are using special subfolders for some recordings, please add them here FOLDERS="Comedy,Wissen,Serien,Magazine" # the key used to call epgsearch EPGSEARCHKEY=green # do not edit below this line #------------------------------------------------------------------------------ cat << EOM >/tmp/cmd.sh SEARCHTERM="$6"~"$7"; #event info not yet present? then extract it from the file name if test "\$SEARCHTERM" == "~"; then SEARCHTERM='$8' #cut leading special folders i=0; FOLDERS=$FOLDERS; while [ "\$LASTWORD" != "\$FOLDERS" ]; do LASTWORD=\${FOLDERS%%,*}; SEARCHTERM=\${SEARCHTERM#*\$LASTWORD~}; i=\$i+1; FOLDERS=\${FOLDERS#*,}; done #cut trailing dummy subtitle created by epgsearch SEARCHTERM=\${SEARCHTERM%~???_??.??.????-??:??} if [ "$1" -eq "0" ]; then SEARCHTERM=\${SEARCHTERM%~*}; fi fi RCFILE=$PLUGINCONFDIR/.epgsearchrc; echo Search=\$SEARCHTERM > \$RCFILE; echo SearchMode=0 >> \$RCFILE; echo UseDescr=0 >> \$RCFILE; $SVDRPSEND HITK $EPGSEARCHKEY; EOM echo ". /tmp/cmd.sh; rm /tmp/cmd.sh" | at now vdr-plugin-epgsearch/scripts/epgsearchcmds.conf0000644000175000017500000000166512466747543021630 0ustar tobiastobias# # This is an example of epgsearchcmds.conf with sample entries. # # This file should placed on VDR configuration folder with setup.conf # .../setup.conf # .../plugins/epgsearchcmds.conf # # Syntax is: [?]; # # = descriptor displayed in VDR # [?] = confirmation request, before execute command (optionally) # = command what execute # # When a command is executed the following parameters are passed to it: # # $1: the name of the epg entry # $2: the start time of the epg entry as time_t value (like in the shutdown script) # $3: the end time # $4: the channel of the epg entry # # See also at man-pages vdr(5), it the same syntax as reccmds.conf # remember event? : /usr/local/bin/rememberevent.sh 0 remember event? (inc. switch) : /usr/local/bin/rememberevent.sh 1 epg2taste : /usr/local/bin/epg2taste.sh epg2autotimer : /usr/local/bin/epg2autotimer.sh vdr-plugin-epgsearch/scripts/epgsearchcmds-french.conf0000644000175000017500000000345112466747543023066 0ustar tobiastobias# # This is an example of epgsearchcmds.conf with sample entries. # # This file should placed on VDR configuration folder with setup.conf # .../setup.conf # .../plugins/epgsearchcmds.conf # # Syntax is: [?]; # # = descriptor displayed in VDR # [?] = confirmation request, before execute command (optionally) # = command what execute # # When a command is executed the following parameters are passed to it: # # $1: the name of the epg entry # $2: the start time of the epg entry as time_t value (like in the shutdown script) # $3: the end time # $4: the channel of the epg entry # # See also at man-pages vdr(5), it the same syntax as reccmds.conf # ENG remember event? : /usr/local/bin/rememberevent.sh 0 # ENG remember event? (inc. switch) : /usr/local/bin/rememberevent.sh 1 # ENG epg2taste : /usr/local/bin/epg2taste.sh # ENG epg2autotimer : /usr/local/bin/epg2autotimer.sh # # En Francais : Rappel de l'émission? : /usr/lib/vdr/epgsearch/rememberevent.sh 0 Rappel de l'émission? (avec changement de chaînes) : /usr/lib/vdr/epgsearch/rememberevent.sh 1 Programme interdit : /usr/lib/vdr/epgsearch/epg2taste.sh Autoprogrammeur : /usr/lib/vdr/epgsearch/epg2autotimer.sh Enregistrement repeter : /usr/lib/vdr/epgsearch/recrep.sh Rappel repeter : /usr/lib/vdr/epgsearch/timerrep.sh # # remember event? : /usr/lib/vdr/epgsearch/rememberevent.sh 0 # remember event? (inc. switch) : /usr/lib/vdr/epgsearch/rememberevent.sh 1 # epg2taste : /usr/lib/vdr/epgsearch/epg2taste.sh # epg2autotimer : /usr/lib/vdr/epgsearch/epg2autotimer.sh vdr-plugin-epgsearch/scripts/rememberevent.sh0000755000175000017500000000351212466747543021341 0ustar tobiastobias#!/bin/bash # # rememberevent.sh # # source: vdr-plugin epgsearch # # add this lines to your epgsearchcmds.conf: # folgende zeilen in die epgsearchcmds.conf eintragen: # # remember event  : /usr/local/bin/rememberevent.sh 0 # remember event (inc. switch) : /usr/local/bin/rememberevent.sh 1 # show event list  : /usr/local/bin/rememberevent.sh -ls # remove all events?  : /usr/local/bin/rememberevent.sh -rm # CONFIG START ATD_SPOOL=/var/spool/atjobs SVDRPSEND=svdrpsend # default settings MINSBEFORE=1 # minutes before event for announcement COLUMNS=17 # columns for the epg entry FORMAT=MET # date format, eg.: UTC/MET # CONFIG END PATH=/usr/local/bin:$PATH case $1 in -ls) grep -s ^'#[0-2][0-9]:[0-5][0-9]#' $ATD_SPOOL/* | sort -t. +1 | cut -d'#' -f3 ;; -rm) find $ATD_SPOOL -exec grep -qs ^'#[0-2][0-9]:[0-5][0-9]#' \{} \; -exec rm -f \{} \; ;; *) switch_time=`date -d "1970-01-01 $FORMAT $3 seconds" +"%a.%d %H:%M"` entry="#${switch_time#* }#$(printf "%-10s%-0s\n" "${6:0:9}" "$switch_time ${2:0:$COLUMNS}")" secs=$(($3-$MINSBEFORE*60)) secs_now=`date +%s` if [ $secs -le $secs_now ]; then echo "$SVDRPSEND MESG '$2 already runs!' >/dev/null" | at now else if [ -z "$(find $ATD_SPOOL -exec grep -qs "^$entry$" \{} \; -exec rm -v \{} \;)" ]; then at $(date -d "1970-01-01 $FORMAT $secs seconds" +"%H:%M %m/%d/%Y") </dev/null sleep $(($MINSBEFORE*60))s if [ $1 -eq 1 ] ; then $SVDRPSEND CHAN $5 >/dev/null else $SVDRPSEND MESG '$2 starts!' >/dev/null fi $entry EOT fi fi ;; esac vdr-plugin-epgsearch/scripts/convert_epgsearchdone_data.pl0000755000175000017500000000402112466747543024036 0ustar tobiastobias#!/usr/bin/perl # # Dieses Script konvertiert die epgsearchdone.data für # epgsearch >= 0.9.14 # # Die neue epgsearchdone.data funktioniert dann nicht mehr # für epgsearch < 0.9.14 # # Es werden die epgsearch-Daten aus der Summary in die # @-Zeile verlegt. # # Dies ist nicht zwingend erforderlich. Wenn Du nicht sicher bist, # lass es ;) # # Aufrufen: # # convert_epgsearchdone_data.pl /pfad/zur/epgsearchdone.data/ # # z.B. convert_epgsearchdone_data.pl /etc/vdr/plugins/ # # "svdrpsend plug epgsearch updd" nicht vergesssen. # # Backup erstellen? # # my $backup=1; Auf 0 oder 1 # # Mike Constabel vejoun @ vdrportal # 2006-03-02 # use strict; my $backup=1; die("Kein Parameter, bitte Anleitung im Script lesen.") if ! $ARGV[0]; my $Pfad=$ARGV[0]; my $DateiAlt=$Pfad."/epgsearchdone.data"; my $DateiNeu=$Pfad."/epgsearchdone.data.neu"; my $DateiBak=$Pfad."/epgsearchdone.data.bak"; open(DATEI,"<".$DateiAlt) || die("Datei nicht gefunden: $DateiAlt"); open(NEU,">".$DateiNeu) || die("Datei kann nicht geöffnet werden: $DateiAlt"); my $Zeile = ""; my $epgsearch = ""; my $neuformat = 0; my $aux = ""; printf ("Konvertiere %s\n",$DateiAlt); while() { $Zeile = $_; $epgsearch=""; $aux=""; $neuformat = 0; print NEU $Zeile if $Zeile =~ /^[RCTSr].*/; $epgsearch = $1 if $Zeile =~ /^D .*(Kanal.+Suchtimer.+S-ID.+)$/; if ( $Zeile =~ /^(D .+)\|Kanal.+Suchtimer.+S-ID.+$/ ) { print NEU sprintf("%s\n",$1); } elsif ( $Zeile =~ /^(D .+)$/ ) { print NEU sprintf("%s\n",$1); } if ( $Zeile =~ /^(@ .+)$/ ) { $neuformat=1; $aux = $1; } if ( $neuformat == 1 && $aux !~ /epgsearch/ && $epgsearch ne "" ) { $aux .= "".$epgsearch.""; print NEU sprintf("%s\n",$aux); } elsif ( $neuformat == 1 ) { print NEU sprintf("%s\n",$aux); } print NEU sprintf("@ %s\n",$epgsearch) if ( $neuformat == 0 && $epgsearch ne "" ); } close(DATEI); close(NEU); rename $DateiAlt, $DateiBak if ( ! -e $DateiBak && $backup == 1 ); rename $DateiNeu, $DateiAlt; vdr-plugin-epgsearch/scripts/undoneepgsearch.sh0000755000175000017500000001531012466747543021652 0ustar tobiastobias#!/bin/sh # $Id: undoneepgsearch.sh,v 1.7 2008/01/24 15:29:10 cjac Exp $ # # Created 2007 by Viking / vdr-portal # # This script does an undone of recrdings done with EPGsearch # It compares Title and Subtitle with the entry in the done file. # If there is no Subtitle, then the Title and Description is compared. # Options : # --TitleOnly Only match title, Subtitle and Description are ignored # This can be dangerous ! With series you remove ALL entries ! # --CheckDone Only tell if recording is done, not undone # --CheckOnly Only tell if recording is done, not undone # # The options can also be combined. # # # Add this to your reccmds.conf : # # Remove from EPGsearch done : /usr/local/bin/undoneepgsearch.sh # Remove from EPGsearch done - TitleOnly : /usr/local/bin/undoneepgsearch.sh --TitleOnly # Is Recording done : /usr/local/bin/undoneepgsearch.sh --CheckDone #------------------------------------------------------------------------------ # default recordingdone settings EPGSEARCHDONE_FILE="/etc/vdr/plugins/epgsearch/epgsearchdone.data" # EPGSEARCHDONE_FILE="/tmp/epgsearchdone.data" # Backup epgsearchdone.data before changing it (only once a day) BACKUP=yes SVDRPSEND=svdrpsend # For some debugging infos, set to yes DEBUG=no ## DEBUG=yes # do not edit below this line #------------------------------------------------------------------------------ [ "$1" = "" ] && printf "\nERROR Parameter 1 is not set !\n" && exit 1 Title="" Subtitle="" TempFile=/tmp/${0##*/}.$$ EPGSEARCHDONE_WORK=$EPGSEARCHDONE_FILE.work Today=$(date +%Y%m%d) Undone=false function CleanExit() { [ -e $TempFile ] && rm -f $TempFile [ -e $EPGSEARCHDONE_WORK ] && rm -f $EPGSEARCHDONE_WORK [ -e $EPGSEARCHDONE_WORK.undone ] && rm -f $EPGSEARCHDONE_WORK.undone exit 1 } # Get "--" options while [ "${1:0:2}" = "--" ]; do eval ${1:2}=yes shift done Rec=$1 [ "$CheckOnly" = "yes" ] && CheckDone=$CheckOnly if [ ! -e "$Rec/info.vdr" ]; then printf "\nNo Info file found in recording\n" exit 0 fi # Find Tite, Subtitle and Description Title=$(grep "^T " $Rec/info.vdr| cut -f2- -d' ') Subtitle=$(grep "^S " $Rec/info.vdr| cut -f2- -d' ') Description=$(grep "^D " $Rec/info.vdr | sed -e 's/\[/\./g' | sed -e 's/\]/\./g' | sed -e 's/\*/\./g') if [ "$TitleOnly" = "yes" ]; then Description="" Subtitle="" fi if [ -z "$Title" -a -z "$Subtitle" ]; then printf "Title and Subtitle not found, doing nothing\n" exit 0 else printf "Title: $Title\n" if [ "$TitleOnly" = "yes" ]; then echo "- Only using title" else [ ! -z "$Subtitle" ] && printf "Subtitle: $Subtitle\n" || printf "Subtitle: No Subtitle, using Description\n" fi # How many times does title match TitleCnt=$(grep -c "^T $Title$" $EPGSEARCHDONE_FILE) printf "\nFound $TitleCnt matching title lines\n" if [ "$CheckDone" = "yes" ]; then printf "\nDone matching all criteria ?\n\n" if [ -z "$Subtitle" ]; then grep -A1 "^T $Title$" $EPGSEARCHDONE_FILE | grep -q "$Description" else grep -A1 "^T $Title$" $EPGSEARCHDONE_FILE | grep -q -B1 "^S $Subtitle$" fi if [ $? -eq 0 ]; then printf "YES, DONE\n" else printf "NO, NOT done\n" fi exit 0 fi if [ $TitleCnt -gt 0 ]; then # Backup done file, but only one backup per day [ ! -e $EPGSEARCHDONE_FILE.$Today -a "$BACKUP" = "yes" ] && cp $EPGSEARCHDONE_FILE $EPGSEARCHDONE_FILE.$Today # Create Workfile cp -f $EPGSEARCHDONE_FILE $EPGSEARCHDONE_WORK else printf "\nNo matching entry found in done-list.\n" exit 0 fi # Try one match after each other let Try=1 let Match=1 while [ $Try -le $TitleCnt ]; do printf "\nDoes $Try. entry match all criteria : " [ $DEBUG = yes ] && printf "\nMatch=$Match\n" [ $Match -eq 1 ] && grep -m$Match -A4 "^T $Title$" $EPGSEARCHDONE_WORK >$TempFile || grep -m$Match -A4 "^T $Title$" $EPGSEARCHDONE_WORK | grep -A5 "^--$" >$TempFile if [ -z "$Subtitle" ]; then grep -q "$Description" $TempFile else grep -q -B1 "^S $Subtitle$" $TempFile fi if [ $? -eq 0 ]; then printf "YES, " let MatchLine=$(grep -m$Match -n "^T $Title$" $EPGSEARCHDONE_WORK |tail -n 1| cut -f1 -d ':') [ $DEBUG = yes ] && printf "\n\nMatching line : $MatchLine\n" if [ $MatchLine -gt 3 ]; then let FirstLine=MatchLine-3 [ $DEBUG = yes ] && printf "First line of Recording : $FirstLine\n" # First line OK ? nice -n 19 head -n $FirstLine $EPGSEARCHDONE_WORK | tail -n 1 | grep -q "^r" if [ $? -ne 0 ]; then printf "\nERROR: something went wrong finding the First line of recording, quitting\n" CleanExit fi let MatchRLine=$(grep -m$Match -n "^r$" $TempFile |head -n 1| cut -f1 -d ':') let LastMatchLine=MatchLine+MatchRLine # Bugfix - if more than one result then results are separated by a "--" line grep -q "^--$" $TempFile && let LastMatchLine-- [ $DEBUG = yes ] && printf "Last Matching line : $LastMatchLine\n" let TailLines=$(wc -l $EPGSEARCHDONE_WORK | cut -f1 -d' ') nice -n 19 head -n $LastMatchLine $EPGSEARCHDONE_WORK | tail -n 1 | grep -q "^R " if [ $? -ne 0 -a $LastMatchLine -lt $TailLines ]; then printf "\nERROR: something went wrong finding the Last line of recording, quitting\n" CleanExit fi let TailLines=TailLines-LastMatchLine+1 [ $DEBUG = yes ] && printf "TailLines = $TailLines\n" # Sanity check if [ $LastMatchLine -gt $FirstLine ]; then nice -n 19 head -n $FirstLine $EPGSEARCHDONE_WORK >$EPGSEARCHDONE_WORK.undone STATUS=$? nice -n 19 tail -n $TailLines $EPGSEARCHDONE_WORK >>$EPGSEARCHDONE_WORK.undone if [ $STATUS -eq 0 -a $? -eq 0 ]; then cp $EPGSEARCHDONE_WORK.undone $EPGSEARCHDONE_WORK Undone=true printf "Undone\n" fi rm -f $EPGSEARCHDONE_WORK.undone fi fi else printf "NO, not undone\n" let Match++ if [ -z "$Subtitle" ]; then printf "\nEPG DESCRIPTION from done (maybe it helps) :\n\n" grep "^D " $TempFile | cut -c3- | tr '|' '\n' fi fi let Try++ done if [ "$Undone" = "true" ]; then let WorkLines=$(wc -l $EPGSEARCHDONE_WORK | cut -f1 -d' ') let EpgsLines=$(wc -l $EPGSEARCHDONE_FILE | cut -f1 -d' ') [ $DEBUG = yes ] && printf "\nOld number of lines $EpgsLines, new $WorkLines\n" if [ $EpgsLines -gt $WorkLines ]; then cp -f $EPGSEARCHDONE_WORK $EPGSEARCHDONE_FILE [ $? -eq 0 ] && printf "\nUndone successfull\n" || printf "\nSomething went wrong with undone\n" # Reload done-file echo "$SVDRPSEND PLUG epgsearch UPDD" | at now 2>/dev/null else printf "\nSomething went wrong with undone\n" fi else [ -z "$Subtitle" ] && printf "\n\nYou could try using the option --TitleOnly\n" fi [ -e $TempFile ] && rm -f $TempFile [ -e $EPGSEARCHDONE_WORK ] && rm -f $EPGSEARCHDONE_WORK fi vdr-plugin-epgsearch/noannounce.h0000644000175000017500000000412712466747543016772 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __NOANNOUCE_H #define __NOANNOUCE_H #include #include using std::string; // --- cNoAnnouce -------------------------------------------------------- // an event that should not be announced again class cNoAnnounce : public cListObject { public: string title; // Title of this event string shortText; // Short description of this event time_t startTime; // Start time of the timer time_t nextAnnounce; // time of the next announce tChannelID channelID; static char *buffer; cNoAnnounce(); cNoAnnounce(const cEvent* Event, time_t NextAnnounce = 0); ~cNoAnnounce(); bool operator== (const cNoAnnounce &arg) const; static bool Read(FILE *f); bool Parse(const char *s); const char *ToText(void) const; bool Save(FILE *f); bool Valid() { return startTime > 0; } }; class cNoAnnounces : public cConfig { public: cNoAnnounce* InList(const cEvent* e); void ClearOutdated(void); void UpdateNextAnnounce(const cEvent* e, time_t NextAnnounce); }; extern cNoAnnounces NoAnnounces; #endif vdr-plugin-epgsearch/changrp.h0000644000175000017500000000631212466747543016247 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __EPGSEARCHCHANGRP_H #define __EPGSEARCHCHANGRP_H #include #include #include class cSearchExt; // --- cChannelGroupItem -------------------------------------------------------- class cChannelGroupItem : public cListObject { public: cChannel* channel; public: cChannelGroupItem(cChannel* ch) : channel(ch) {} }; // --- cChannelGroup -------------------------------------------------------- class cChannelGroup : public cListObject { public: char name[MaxFileName]; cList channels; public: cChannelGroup(void); virtual ~cChannelGroup(void); bool Parse(const char *s); const char *ToText(void); bool Save(FILE *f); int* CreateChannelSel(); void CreateChannelList(int*); bool ChannelInGroup(cChannel*); }; // --- cChannelGroups -------------------------------------------------------- class cChannelGroups : public cConfig { private: public: cChannelGroups(void) {} ~cChannelGroups(void) {} int GetIndex(char* channelGroup); cChannelGroup* GetGroupByName(const char* channelGroup); cSearchExt* Used(cChannelGroup*); char** CreateMenuitemsList(); }; extern cChannelGroups ChannelGroups; // --- cMenuChannelGroupItem ---------------------------------------------------------- class cMenuChannelGroupItem : public cOsdItem { private: public: cChannelGroup* group; cMenuChannelGroupItem(cChannelGroup*); void Set(void); }; // --- cMenuChannelGroups -------------------------------------------------------- class cMenuChannelGroups : public cOsdMenu { private: cChannelGroup *CurrentGroup(void); eOSState New(void); eOSState Delete(void); int groupSel; char** groupName; protected: virtual eOSState ProcessKey(eKeys Key); public: cMenuChannelGroups(char** groupName = NULL); }; // --- cMenuEditChannelGroup -------------------------------------------------------- class cMenuEditChannelGroup : public cOsdMenu { private: cChannelGroup *group; bool addIfConfirmed; char name[MaxFileName]; int* channelSel; public: cMenuEditChannelGroup(cChannelGroup *group, bool New = false); ~cMenuEditChannelGroup(); void Set(); virtual eOSState ProcessKey(eKeys Key); }; #endif vdr-plugin-epgsearch/confdloader.c0000644000175000017500000000752212466747543017104 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include #include "confdloader.h" #include "log.h" #include "uservars.h" #include "menu_dirselect.h" #include "templatefile.h" #include "epgsearchcats.h" using std::string; // --------------------------- // Loads all files in the conf.d subdirectory of and // applies found settings. // --------------------------- bool cConfDLoader::Load() { const string dirPath(AddDirectory(CONFIGDIR, "conf.d")); LogFile.Log(2, "loading entries in %s", dirPath.c_str()); cReadDir d(dirPath.c_str()); struct dirent* e; string parent(".."); string current("."); int count = 0; bool success = true; while ((e = d.Next())) { string direntry = e->d_name; if ((current == direntry) || (parent == direntry) || (direntry[direntry.size()-1] == '~')) { continue; } /* Check if entry is a directory: I do not rely on e->d_type here because on some systems it is always DT_UNKNOWN. Also testing for DT_DIR does not take into account symbolic links to directories. */ struct stat buf; if ((stat((dirPath + "/" + e->d_name).c_str(), &buf) != 0) || (S_ISDIR(buf.st_mode))) { continue; } success &= LoadFile((dirPath + "/" + e->d_name).c_str()); count++; } LogFile.Log(2, "loaded %d entries in %s", count, dirPath.c_str()); return success; } // --------------------------- // Each file has the form // // [
] // // ... // [
] // ... // // where section is one: // // epgsearchuservars // epgsearchdirs // epgsearchmenu // epgsearchcats // // corresponds to the entries in the related conf files. // --------------------------- bool cConfDLoader::LoadFile(const char *FileName) { if (FileName && access(FileName, F_OK) == 0) { LogFile.Log(1, "loading %s", FileName); FILE *f = fopen(FileName, "r"); if (f) { char *s; int line = 0; cReadLine ReadLine; std::string section; while ((s = ReadLine.Read(f)) != NULL) { line++; char *p = strchr(s, '#'); if (p) *p = 0; stripspace(s); if (!isempty(s)) { if (*s == '[' && *(s+strlen(s)-1)==']') // Section? section = s; else { if (EqualsNoCase(section, "[epgsearchuservars]")) cUserVarLine::Parse(s); if (EqualsNoCase(section, "[epgsearchdirs]")) { cDirExt* D = new cDirExt; if (D && D->Parse(s)) ConfDDirExts.Add(D); else delete D; } if (EqualsNoCase(section, "[epgsearchmenu]")) { cTemplLine T; if (T.Parse(s)) cTemplFile::Parse(T.Name(), T.Value()); } if (EqualsNoCase(section, "[epgsearchcats]")) { cSearchExtCat* cat = new cSearchExtCat; if (cat && cat->Parse(s)) SearchExtCats.Add(cat); else delete cat; } } } } fclose(f); } return true; } else { LOG_ERROR_STR(FileName); return false; } } vdr-plugin-epgsearch/blacklist.c0000644000175000017500000004600012466747543016566 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #include #include "epgsearchtools.h" #include "blacklist.h" #include "epgsearchcats.h" #include #include "menu_dirselect.h" #include "changrp.h" #include "menu_search.h" #include "menu_searchedit.h" #include "menu_searchresults.h" #include cBlacklists Blacklists; // -- cBlacklist ----------------------------------------------------------------- char *cBlacklist::buffer = NULL; cBlacklist::cBlacklist(void) { ID = -1; *search = 0; options = 1; useTime = false; startTime = 0000; stopTime = 2359; useChannel = false; channelMin = Channels.GetByNumber(cDevice::CurrentChannel()); channelMax = Channels.GetByNumber(cDevice::CurrentChannel()); channelGroup = NULL; useCase = false; mode = 0; useTitle = true; useSubtitle = true; useDescription = true; useDuration = false; minDuration = 0; maxDuration = 130; useDayOfWeek = false; DayOfWeek = 0; buffer = NULL; isGlobal = 0; useExtEPGInfo = false; catvalues = (char**) malloc(SearchExtCats.Count() * sizeof(char*)); cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { catvalues[index] = (char*)malloc(MaxFileName); *catvalues[index] = 0; SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } ignoreMissingEPGCats = 0; fuzzyTolerance = 1; } cBlacklist::~cBlacklist(void) { if (buffer) { free(buffer); buffer = NULL; } if (catvalues) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { free(catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } free(catvalues); catvalues = NULL; } } cBlacklist& cBlacklist::operator= (const cBlacklist &Blacklist) { char** catvaluesTemp = this->catvalues; memcpy(this, &Blacklist, sizeof(*this)); this->catvalues = catvaluesTemp; cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { *catvalues[index] = 0; strcpy(catvalues[index], Blacklist.catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } return *this; } void cBlacklist::CopyFromTemplate(const cSearchExt* templ) { options = templ->options; useTime = templ->useTime; startTime = templ->startTime; stopTime = templ->stopTime; useChannel = templ->useChannel; useCase = templ->useCase; mode = templ->mode; useTitle = templ->useTitle; useSubtitle = templ->useSubtitle; useDescription = templ->useDescription; useDuration = templ->useDuration; minDuration = templ->minDuration; maxDuration = templ->maxDuration; useDayOfWeek = templ->useDayOfWeek; DayOfWeek = templ->DayOfWeek; useExtEPGInfo = templ->useExtEPGInfo; isGlobal = 0; cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { strcpy(catvalues[index], templ->catvalues[index]); SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; } channelMin = templ->channelMin; channelMax = templ->channelMax; if (channelGroup) free(channelGroup); if (templ->channelGroup) channelGroup = strdup(templ->channelGroup); fuzzyTolerance = templ->fuzzyTolerance; ignoreMissingEPGCats = templ->ignoreMissingEPGCats; } bool cBlacklist::operator< (const cListObject &ListObject) { cBlacklist *BL = (cBlacklist *)&ListObject; return strcasecmp(search, BL->search) < 0; } const char *cBlacklist::ToText(void) { char tmp_Start[5] = ""; char tmp_Stop[5] = ""; char tmp_minDuration[5] = ""; char tmp_maxDuration[5] = ""; char* tmp_chanSel = NULL; char* tmp_search = NULL; char* tmp_catvalues = NULL; free(buffer); tmp_search = strdup(search); while(strstr(tmp_search, "|")) tmp_search = strreplace(tmp_search, "|", "!^pipe^!"); // ugly: replace a pipe with something, that should not happen to be part of a regular expression strreplace(tmp_search, ':', '|'); if (useTime) { sprintf(tmp_Start, "%04d", startTime); sprintf(tmp_Stop, "%04d", stopTime); } if (useDuration) { sprintf(tmp_minDuration, "%04d", minDuration); sprintf(tmp_maxDuration, "%04d", maxDuration); } if (useChannel==1) { if (channelMin->Number() < channelMax->Number()) msprintf(&tmp_chanSel, "%s|%s", CHANNELSTRING(channelMin), CHANNELSTRING(channelMax)); else msprintf(&tmp_chanSel, "%s", CHANNELSTRING(channelMin)); } if (useChannel==2) { int channelGroupNr = ChannelGroups.GetIndex(channelGroup); if (channelGroupNr == -1) { LogFile.eSysLog("channel group %s does not exist!", channelGroup); useChannel = 0; } else tmp_chanSel = strdup(channelGroup); } if (useExtEPGInfo) { cSearchExtCat *SearchExtCat = SearchExtCats.First(); int index = 0; while (SearchExtCat) { char* catvalue = NULL; if (msprintf(&catvalue, "%s", catvalues[index])!=-1) { while(strstr(catvalue, ":")) catvalue = strreplace(catvalue, ":", "!^colon^!"); // ugly: replace with something, that should not happen to be part ofa category value while(strstr(catvalue, "|")) catvalue = strreplace(catvalue, "|", "!^pipe^!"); // ugly: replace with something, that should not happen to be part of a regular expression if (index == 0) msprintf(&tmp_catvalues, "%d#%s", SearchExtCat->id, catvalue); else { char* temp = tmp_catvalues; msprintf(&tmp_catvalues, "%s|%d#%s", tmp_catvalues, SearchExtCat->id, catvalue); free(temp); } } SearchExtCat = SearchExtCats.Next(SearchExtCat); index++; free(catvalue); } } msprintf(&buffer, "%d:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d:%d:%d:%s:%s:%d:%d:%d:%s:%d:%d:%d", ID, tmp_search, useTime, tmp_Start, tmp_Stop, useChannel, (useChannel>0 && useChannel<3)?tmp_chanSel:"0", useCase, mode, useTitle, useSubtitle, useDescription, useDuration, tmp_minDuration, tmp_maxDuration, useDayOfWeek, DayOfWeek, useExtEPGInfo, useExtEPGInfo?tmp_catvalues:"", fuzzyTolerance, ignoreMissingEPGCats, isGlobal); if (tmp_chanSel) free(tmp_chanSel); if (tmp_search) free(tmp_search); if (tmp_catvalues) free(tmp_catvalues); return buffer; } bool cBlacklist::Parse(const char *s) { char *line; char *pos; char *pos_next; int parameter = 1; int valuelen; char value[MaxFileName]; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != ':') { pos_next = strchr(pos, ':'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MaxFileName) valuelen = MaxFileName; strn0cpy(value, pos, valuelen); pos = pos_next; switch (parameter) { case 1: ID = atoi(value); break; case 2: strcpy(search, value); break; case 3: useTime = atoi(value); break; case 4: startTime = atoi(value); break; case 5: stopTime = atoi(value); break; case 6: useChannel = atoi(value); break; case 7: if (useChannel == 0) { channelMin = NULL; channelMax = NULL; } else if (useChannel == 1) { int minNum=0, maxNum=0; int fields = sscanf(value, "%d-%d", &minNum, &maxNum); if (fields == 0) // stored with ID { #ifdef __FreeBSD__ char *channelMinbuffer = MALLOC(char, 32); char *channelMaxbuffer = MALLOC(char, 32); int channels = sscanf(value, "%31[^|]|%31[^|]", channelMinbuffer, channelMaxbuffer); #else char *channelMinbuffer = NULL; char *channelMaxbuffer = NULL; int channels = sscanf(value, "%m[^|]|%m[^|]", &channelMinbuffer, &channelMaxbuffer); #endif channelMin = Channels.GetByChannelID(tChannelID::FromString(channelMinbuffer), true, true); if (!channelMin) { LogFile.eSysLog("ERROR: channel %s not defined", channelMinbuffer); channelMin = channelMax = NULL; useChannel = 0; } if (channels == 1) channelMax = channelMin; else { channelMax = Channels.GetByChannelID(tChannelID::FromString(channelMaxbuffer), true, true); if (!channelMax) { LogFile.eSysLog("ERROR: channel %s not defined", channelMaxbuffer); channelMin = channelMax = NULL; useChannel = 0; } } free(channelMinbuffer); free(channelMaxbuffer); } } else if (useChannel == 2) channelGroup = strdup(value); break; case 8: useCase = atoi(value); break; case 9: mode = atoi(value); break; case 10: useTitle = atoi(value); break; case 11: useSubtitle = atoi(value); break; case 12: useDescription = atoi(value); break; case 13: useDuration = atoi(value); break; case 14: minDuration = atoi(value); break; case 15: maxDuration = atoi(value); break; case 16: useDayOfWeek = atoi(value); break; case 17: DayOfWeek = atoi(value); break; case 18: useExtEPGInfo = atoi(value); break; case 19: if (!ParseExtEPGValues(value)) { LogFile.eSysLog("ERROR reading ext. EPG values - 1"); free(line); return false; } break; case 20: fuzzyTolerance = atoi(value); break; case 21: ignoreMissingEPGCats = atoi(value); break; case 22: isGlobal = atoi(value); break; default: break; } //switch } parameter++; } if (*pos) pos++; } //while strreplace(search, '|', ':'); while(strstr(search, "!^pipe^!")) strreplace(search, "!^pipe^!", "|"); free(line); return (parameter >= 19) ? true : false; } bool cBlacklist::ParseExtEPGValues(const char *s) { char *line; char *pos; char *pos_next; int valuelen; char value[MaxFileName]; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != '|') { pos_next = strchr(pos, '|'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MaxFileName) valuelen = MaxFileName; strn0cpy(value, pos, valuelen); pos = pos_next; if (!ParseExtEPGEntry(value)) { LogFile.eSysLog("ERROR reading ext. EPG value: %s", value); free(line); return false; } } } if (*pos) pos++; } //while free(line); return true; } bool cBlacklist::ParseExtEPGEntry(const char *s) { char *line; char *pos; char *pos_next; int parameter = 1; int valuelen; char value[MaxFileName]; int currentid = -1; pos = line = strdup(s); pos_next = pos + strlen(pos); if (*pos_next == '\n') *pos_next = 0; while (*pos) { while (*pos == ' ') pos++; if (*pos) { if (*pos != '#') { pos_next = strchr(pos, '#'); if (!pos_next) pos_next = pos + strlen(pos); valuelen = pos_next - pos + 1; if (valuelen > MaxFileName) valuelen = MaxFileName; strn0cpy(value, pos, valuelen); pos = pos_next; switch (parameter) { case 1: { currentid = atoi(value); int index = SearchExtCats.GetIndexFromID(currentid); if (index > -1) strcpy(catvalues[index], ""); } break; case 2: if (currentid > -1) { int index = SearchExtCats.GetIndexFromID(currentid); if (index > -1) { while(strstr(value, "!^colon^!")) strreplace(value, "!^colon^!", ":"); while(strstr(value, "!^pipe^!")) strreplace(value, "!^pipe^!", "|"); strcpy(catvalues[index], value); } } break; default: break; } //switch } parameter++; } if (*pos) pos++; } //while free(line); return (parameter >= 2) ? true : false; } bool cBlacklist::Save(FILE *f) { return fprintf(f, "%s\n", ToText()) > 0; } cEvent * cBlacklist::GetEventByBlacklist(const cSchedule *schedules, const cEvent *Start, int MarginStop) { cEvent *pe = NULL; cEvent *p1 = NULL; if (Start) p1 = schedules->Events()->Next(Start); else p1 = schedules->Events()->First(); time_t tNow=time(NULL); char* szTest = NULL; char* searchText = strdup(search); if (!useCase) ToLower(searchText); int searchStart = 0, searchStop = 0; if (useTime) { searchStart = startTime; searchStop = stopTime; if (searchStop < searchStart) searchStop += 2400; } int minSearchDuration = 0; int maxSearchDuration = 0; if (useDuration) { minSearchDuration = minDuration/100*60 + minDuration%100; maxSearchDuration = maxDuration/100*60 + maxDuration%100; } for (cEvent *p = p1; p; p = schedules->Events()->Next(p)) { if(!p) { break; } if (szTest) { free(szTest); szTest = NULL; } // ignore events without title if (!p->Title() || strlen(p->Title()) == 0) continue; msprintf(&szTest, "%s%s%s%s%s", (useTitle?p->Title():""), (useSubtitle||useDescription)?"~":"", (useSubtitle?p->ShortText():""),useDescription?"~":"", (useDescription?p->Description():"")); if (tNow < p->EndTime() + MarginStop * 60) { if (!useCase) ToLower(szTest); if (useTime) { time_t tEvent = p->StartTime(); struct tm tmEvent; localtime_r(&tEvent, &tmEvent); int eventStart = tmEvent.tm_hour*100 + tmEvent.tm_min; int eventStart2 = tmEvent.tm_hour*100 + tmEvent.tm_min + 2400; if ((eventStart < searchStart || eventStart > searchStop) && (eventStart2 < searchStart || eventStart2 > searchStop)) continue; } if (useDuration) { int duration = p->Duration()/60; if (minSearchDuration > duration || maxSearchDuration < duration) continue; } if (useDayOfWeek) { time_t tEvent = p->StartTime(); struct tm tmEvent; localtime_r(&tEvent, &tmEvent); if (DayOfWeek >= 0 && DayOfWeek != tmEvent.tm_wday) continue; if (DayOfWeek < 0) { int iFound = 0; for(int i=0; i<7; i++) if (abs(DayOfWeek) & (int)pow(2,i) && i == tmEvent.tm_wday) { iFound = 1; break; } if (!iFound) continue; } } if (strlen(szTest) > 0) { if (!MatchesSearchMode(szTest, searchText, mode," ,;|~", fuzzyTolerance)) continue; } if (useExtEPGInfo && !MatchesExtEPGInfo(p)) continue; pe=p; break; } } if (szTest) free(szTest); free(searchText); return pe; } // returns a pointer array to the matching search results cSearchResults* cBlacklist::Run(cSearchResults* pSearchResults, int MarginStop) { LogFile.Log(3,"start search for blacklist '%s'", search); cSchedulesLock schedulesLock; const cSchedules *schedules; schedules = cSchedules::Schedules(schedulesLock); if(!schedules) { LogFile.Log(1,"schedules are currently locked! try again later."); return NULL; } const cSchedule *Schedule = schedules->First(); while (Schedule) { cChannel* channel = Channels.GetByChannelID(Schedule->ChannelID(),true,true); if (!channel) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } if (useChannel == 1 && channelMin && channelMax) { if (channelMin->Number() > channel->Number() || channelMax->Number() < channel->Number()) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } } if (useChannel == 2 && channelGroup) { cChannelGroup* group = ChannelGroups.GetGroupByName(channelGroup); if (!group || !group->ChannelInGroup(channel)) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } } if (useChannel == 3) { if (channel->Ca() >= CA_ENCRYPTED_MIN) { Schedule = (const cSchedule *)schedules->Next(Schedule); continue; } } const cEvent *pPrevEvent = NULL; do { const cEvent* event = GetEventByBlacklist(Schedule, pPrevEvent, MarginStop); pPrevEvent = event; if (event && Channels.GetByChannelID(event->ChannelID(),true,true)) { if (!pSearchResults) pSearchResults = new cSearchResults; pSearchResults->Add(new cSearchResult(event, this)); } } while(pPrevEvent); Schedule = (const cSchedule *)schedules->Next(Schedule); } LogFile.Log(3,"found %d event(s) for blacklist '%s'", pSearchResults?pSearchResults->Count():0, search); return pSearchResults; } bool cBlacklist::MatchesExtEPGInfo(const cEvent* e) { if (!e || !e->Description()) return false; cSearchExtCat* SearchExtCat = SearchExtCats.First(); while (SearchExtCat) { char* value = NULL; int index = SearchExtCats.GetIndexFromID(SearchExtCat->id); if (index > -1) value = catvalues[index]; if (value && strlen(value) > 0) { char* testvalue = GetExtEPGValue(e, SearchExtCat); if (!testvalue) return false; // compare not case sensitive char* valueLower = strdup(value); ToLower(valueLower); ToLower(testvalue); if (!MatchesSearchMode(testvalue, valueLower, SearchExtCat->searchmode, ",;|~", fuzzyTolerance)) { free(testvalue); free(valueLower); return false; } free(testvalue); free(valueLower); } SearchExtCat = SearchExtCats.Next(SearchExtCat); } return true; } // -- cBlacklists ---------------------------------------------------------------- int cBlacklists::GetNewID() { int newID = -1; cMutexLock BlacklistLock(this); cBlacklist *l = (cBlacklist *)First(); while (l) { newID = max(newID, l->ID); l = (cBlacklist *)l->Next(); } return newID+1; } cBlacklist* cBlacklists::GetBlacklistFromID(int ID) { if (ID == -1) return NULL; cMutexLock BlacklistLock(this); cBlacklist *l = (cBlacklist *)First(); while (l) { if (l->ID == ID) return l; l = (cBlacklist *)l->Next(); } return NULL; } bool cBlacklists::Exists(const cBlacklist* Blacklist) { cMutexLock BlacklistLock(this); cBlacklist *l = (cBlacklist*)First(); while (l) { if (l == Blacklist) return true; l = (cBlacklist*)l->Next(); } return false; } vdr-plugin-epgsearch/menu_searchtemplate.h0000644000175000017500000000303212466747543020646 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __MENU_SEARCHTEMPLATE_H #define __MENU_SEARCHTEMPLATE_H #include #include "epgsearchext.h" #include "blacklist.h" class cMenuEPGSearchTemplate : public cOsdMenu { private: bool newSearch; eOSState New(void); eOSState Delete(void); eOSState DefaultTemplate(void); cSearchExt* search; cBlacklist* blacklist; protected: virtual eOSState ProcessKey(eKeys Key); public: cMenuEPGSearchTemplate(cSearchExt* Search, cBlacklist* Blacklist, bool New); cSearchExt* CurrentSearchTemplate(void); }; #endif vdr-plugin-epgsearch/timerdone.h0000644000175000017500000000417312466747543016616 0ustar tobiastobias/* -*- c++ -*- Copyright (C) 2004-2013 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch */ #ifndef __TIMERDONE_H #define __TIMERDONE_H #include #include using std::string; // --- cTimerDone -------------------------------------------------------- class cTimerDone : public cListObject { public: time_t start; // Start time of the timer time_t stop; // Stop time of the timer tChannelID channelID; int searchID; string title; string shorttext; cTimerDone(); cTimerDone(const time_t Start, const time_t Stop, const cEvent* pEvent, const int SearchID); bool operator== (const cTimerDone &arg) const; static bool Read(FILE *f); bool Parse(const char *s); cString ToText(void) const; bool Save(FILE *f); const cEvent* GetEvent() const; }; class cTimersDone : public cConfig, public cMutex { public: cTimerDone* InList(const time_t Start, const time_t Stop, const cEvent* pEvent, const int SearchID); void Update(const time_t Start, const time_t Stop, const cEvent* pEvent, const int SearchID, cTimerDone* timerdone); void ClearOutdated(void); void RemoveEntriesOfSearch(const int SearchID); }; extern cTimersDone TimersDone; #endif vdr-plugin-epgsearch/source/0000755000175000017500000000000012466747543015752 5ustar tobiastobiasvdr-plugin-epgsearch/source/vdr-epgsearchclient-0.0.2.tgz0000644000175000017500000002433412466747543023072 0ustar tobiastobias‹•ÀàOì\ÿwÚF¶Ï¯ÖyÄ”zÁ vœ´¸î†`œÐÚà¸iξ=9ƒ4€ž…¤ÎHvi^öo÷Þ ’t½yûvÃií ™¹ßæs¿ÌY„3%¸´ç¶ç ?ª5êúáÁ“Gý4àóüø7Ÿ7²¿“Ï“fóùóFóiãðú5ž7Ÿ°ãÇ#ÿ«ˆKƞܹ¾ïÞÓï¡öÿ§‘;ÿOëößÅ'øÙÓ§óØ|öìy:ÿçÏ`þŸ>{¤㽟óù?Ø·Ø>Ûšïk³Ð‹g®Ï¦dÑ\°Ÿ]GìÌU7l(ì@:BÂP=‚z »í³Ë.›ºž Qv.¥;›GÌõáû‚Gnà3î;lܱ(`Rp{NCyÍY7w{Î.ü>°¬¯]ßöbG°ïoy %ªÏ°,˜µÈµ…¯"fÏa ÷îG½AŸ™Ï)+˜K'yϺ£Î°w56 s›iåIôÔ L yëÚB哹l÷ú—Ýþu·?¾%2ÝuSÂ0ëà€Õj5f_ ?N›ßu4·ÚýX¶Ç•* Úba<ñPØr°{oé'-‹å)WN éÖ•QÌ=&£¨+Ø• @{õ“X–üP ~PϴLj¨¼q£y÷ê•þR^ïÑvœ±»ò¾>]ÇÎ]©¢{ŽS3!u[„½¯C6 ú|â‰í^“ õ¨|€ùÉ5G«U`%«•Ø´\JEL°ãˆEPªXï-¨]öÅÍA/‹òü†g¦Vr±˜S¥J…4(ž÷G×R„‚GŠS¶7æ3˜XÀq¼÷xÈ8ÃÇÄöÞ8“`*™øÍU‘ëÏ>jœ™×õÀèõ2¶#¶šóë¶ù®FGs}b€Þ¹Ï~…\ž°õt2® ¹ Þ.ÌÜ"pÄf×µÞØ•§á\r%ª¬y ‘¬ÊOYeG§RÌbB‚ø-”`Vˆt•”6HãûÂëË“MÚ¦…ùñbêBL4Ü ð/î/5m¬ÄØ<±Ee5&Âöµ£x²9hm„Š'ۃ΄²¥b¼>Éä¬ÚÑèAi«ÇØgáP¨Ø‹ðˉ` ­"üÆ$@¡¤~ŠüpkvÅoÁ@¢ræ˜"žÆÖ–M6øi8Á¤µÒuÒwÛ³çÔÎ9æ.ǵÑ˪ÌÂ#W1ø/ã üŠû+¬¾6¦ÉÝ[ bñ×CRR'(Á,aŒÑuÍTó*/ø’Më__\T lOvù4ÓC¯3q¦§ –:›Ü—Ij583.ªj·Íz£”3y[=·§ÐÌ‚îz²n‘ ”ÉüÍ¡dpþüi"› ù"o÷,YA s ~1tCn]ë@"å,P»› ¨¡\ßUsa$·ÒUyr3ªI*ö•.ËöC¨6Ì—KÕz%"ý¤\J+˜’‰¹Þr¨£ PÚÉ¡û‰ýȲ§„ñÜŽ'ÖN¦g튴0LêÄ!Äò4· ûõ¾HOÙ4Jæ5&±Ú`ÖDNsèPЦL8ƒÖ)÷°v2.C%Ò)y&SÕ~i2å –Ì/ÂO5˧R±vд ¥5²ÑÐÚÀ^wݸ¾ª•QWJL&™²Â „b~A˜Ã@F:â_‘m­Gx"Y–¨),dR€“ø˜zÁRT¾èÖ“¬H¦W :Ñ -?ÐOꦴó ²SdÔÂ’ÿð°WT‘ÿ0¿ØÊ>÷{ÇVwP7IQ:$›!ú!´ê§ˆ³èÒ*GÓ¶¹·bËe"3õf&0Û\ v3¸iA Ç¡XJJ‚8¼Y c¼¢¨‡³F ˜Ï¶È4?’ åé{ènÐ)Ø‚.~´1¼pºˆÀÓM=îß¼."s¼Aæ¾í“F S¢ÎéS Íüs"¿ÙÈ”f‚öSÍ‚,'™3—Þ[¡toa,ž!0Úö—l!hóò–K—â>nˆMc߯õ¶bË f¸iå á°9”BõìID.k kÇ+è¸Öií0" °×”ØûDusFtBÉ—Ù*Ø›92*ß  î;®/^ /ÜÖ„êã°m •-ns9³«†üûö/ÝÓóÝÈåžû»( ÑAæ˜@[# 5½b%n„]¶Ýeí°‹C>¸åGr¹iµ“° û@ Lþ[ØÑŠFÛ^™x6BÕ‡W˜OöéŸTq(­»J%ÊYQû|!ªë€à…¦­ñ:5e»öœª6;ɴيCé´(‰­Ö}P¦³šÃ|ÇÑîA]Ïý½1üdíþÛñë^ÿë^Œºlüº=[¿e¯Û?wÙ¨wÖeÝóóng<ª²a÷?¯{Ã.{u1xÙ¾Ðd~>²Á˱X÷—ÞhÌCv5œ]wºH ®ÇW×ã¯( (Wè‰fOpŸÅ!ãSÜj§‡)ñ¦šhƶE rý&!>Ô£½^ÚÇ}y}1«qÏc”Û`‰ ó€ È‹ÚÓ`T/Ù@"šú"Q>Â9Óù\„žXè=û gèÓÓP“B™qj1ð0„؇ÓLM ¶ P5áöÍL1HÃqÍ `$Üù7'újŽ …ÄêO–"fèÑ#ñ&Ç+æ„›¬ƒðq~ˆÕvXLX^iÄÕFØê!ãÀ Xõ1`ÄÕ".ÙèWÄ,/*š²Ï؇6óŠFÇ7¢f¡ýÖ£é¶a»> ‹QE˜µ ®«žp}²W}b N#(œ0tp-`È% ƒ8£è6‰ŠI‚ºKatÖçÍ–ÏÃâ=”R‘^OXÛ1ð]¤NRü ŒÁ8S O5´ÝTž0—¯.®_õúa·= Ëù‚UN(þ,g‚˜n˸ê+ëÑîÿäßÿÒ7y‹Çý÷¿£g'ÍÆQãùÑñq“îÿ==~vôåþ×çøŒÓóì’Fké¾ _¬ ¸­Ô-ët£Høl²l±­Ï[ôVtlö½Xp×{1TTw‚Å–ÉCáÔ:ÁB„­2®‡–uû»Õ<ã·@6 8¬k¨Grߌ.šuWo±:B©!± Z«ëf k¦¤o=žãü‹|òýÿ’ß´îãðxÀÿŸ&÷?!àóæñÑñÓ/þÿ9>_[_³d¶É‡x®ßëØ`aoºœ ¿ÇàÁtêÚPz2½=0×cÌ5Mê_©íÎ…âk"ðr‘C•`ô^íª^¯ï™B‡ãj% ˜p'Sx ¥—ËdsCßaáX@œ±M€Ä@Á"¥®ú [ié4‹Û×ëP¾ÖZ$¡Æ\ÂZWƒ•#0¯ÓzëJ ²¹¹zzÊvËj.@Õ™!ÛÛ¾1ú_é5ÕýÓ=è­¥«Ômö?Œßݰ½÷°hÀUÇîî3öaž¢Áj`,uð—ÒÉ_f{••èo¾Á¥GrHª…Ì¢dêüò‹Žª>e³o¾ÁïçíW#ü^²Ú¬‡koP .œšY¯È;®„`È%>4>®j€ö×g?¿<ë Aßzý ýb]³Þ`]ôÖºzîÄ_^éGÑ"Ô܃P`R‹;_ຉc£¬©0®Óe`§eÕ’{Á»eͱB1«>ó‚ *@4ÛžÜ!â$bf©yd¨÷¤1‘ VDfpêάû0ƒØÍb¾C–+é‘õy pŠ¢d™{"Û 9ÚII#¤}Õ{€U¦ÇßÇÊŠ_YxÀâ<J+•J•N%6„Y)Y±„ï¸Ó•YWqÁ‡'±¾5~ëÞ ˜¢ö°óÈ%ã=5 ™¼jw~j¿Âæ[GBƒén|¦§§W¯ÎÈŠ•¹ã°i,©f€S Áõ:º6Tè×gÝûܦ·²S|¦½!}%G÷¼×7cÎÞ½ê_¿ ®‡.|Ó"¿ë·/»ïzÍoû§{¥TÒÞÊ^2b„ÙP?Jä¼üq”µE=0š.pŸÁ˜Œ¡;tüS=h±?Õmkg· ± Âè…„ «ÙðÕH-‰Öðïï1ØŸ‰fJø¶K´.Û?uϺWÄ—hÕ./áÿW øÕyï­_w2C,$N-•Všn¬»eC©RȾŒ ¶@øS½Â~`»/ÖÜ4¡k,ÇåL'CpkAA8Ñ(HŒ£À:9[†O%ß8 "7 Þôaµ…Øya‡¬V“b‘¤˜Š\_¿á°ûºê°W9Ø}Q_s aÝÒ@£&¬&§0@E°‚ì΋Š„à¢FäÏñu‰üf¬kìß‘´ñ‰J=šýÎjÕ¶6àY„=§²`å”!·op¿Á–Šv‡qµÁ O@ÏVB|šÚp5ql&~ lPmˆ}¶ÿ·/eúçúä×ÿ¯{£ñ`øö‘x<´þ?l>Ý\ÿ?vü¥þÿ¬ZÌñÞÞö ü¿u©ÊyíâÛÒú´”¬ÃFã¸Öø¶vxÔbæ@Ž!ÀšÁ“]k& “ú§ÿ?øäû¿ÙTy$÷ûÿÓ£æQsËÿŸ6¿øÿçøèûP¡²WÝ~wؾ`W×//zÿwû£®¹pŸÄ«ìÇÖÍï¾?fô%Ïr§¿ý®JMì\ ÁFÁ4ºÃ¥Û9žÌPyTÅ"¼nmoÒçø;6xªQ‰Û¢ÊF1.ÑŽŽUö2€(ã/ÛŒAÒh6kM c×£¶Åº°"[ ®Ü…\àþ¤ƒë<| •Êýt=A«· ³ÀF,OÓ5²ƒè6àUô§·´fxˆå´«/üp\[ §nÈBWP-&PÕ‚fX¿JŠ6U 9S‰-ð¨Ý™¯%ÄE#,¶ø’Î9¬)ÎÁ͆€QáI“ \Tg¸«´HròáJ‰¦OøBB8½¢»ÖE²ªð 4,ĉÕ,æ’Ãws¤r+l³™k5è²È¬ÑÅJWQ_½{«L7R´èVuF@Öºh,NB­ÅÉ>fÙ·†k…XL¯,è“6xgNZd0“|ÁîæJÞ&Vt(ëâÁ‰+=} Ryà“†atM9w À|“¥•ûÂHÜœ(ÐÌõU$¸S¯Ð^8³¹OÊ.™†Lo$V0ƒAPGÔ¼Á7…îÀ°¡à7h ²j"I›P")¦BJóf˜™À*boçØ4ù|ÉÔöëû. š5ç·f}…ŽŒïh—Ù’Ö¨;rFP°²·ïðàïݹj^©¦¬@[Àª>ÙN³ñÍ |q Ë80—• ÐÂ×ÌPìcº†Fàc £­¥D"úü”äMì~¢A”Ãû)]‡^”£ÃO°³¢Ù84Â59ÍÅѽêÖXYã.­<¼è‡áNÈw(õ„ʸž> G÷DÊÚ¢VîŒf-YE‰ŒùãN¾dŠs|Aþ7ŽQºšôÈ%§ðÀ’'&¯â»pèv|‹\}MŒvœ§ÈÆlæü:Ü«}Åce²+ºC¬Öµ—ÑØ 8Ã%9X5…Z^ÐjetÚ‰TE¥`.  «` "ª0tæl%Sƒ>,òP¸æ,ºƒ9D¨Z¬Ü¬dþ:ºÕ–Vù°‚{ëú"Ízfº›»`T´‘¾Zç‰÷tÆ£·Ž“”WÍÎ0Ð< 4DÓ˜åGR·=¢¿{€A‡Oˆ·F•ä¯6àÌë¦ *I`3|,î0»ºn[õ†©JgI¯t¨xM¯L…ó¥çð ®µ3'Ë5ÍIxÉKÜÔ‰éÔ9-2õ&Ýß’•yR4rWÈ1õQÔZÉ|À$ÓD6KG6èS^\hq CqÕäRÓl¡I¡}=šÏrRÉÈ(×´øü6—ú^ÇB ­…™<ÞÒ/;ñÊj`óØ\\MkF}fé+"dXÐÝÛ@ŽhÐmäz9­ÉÞNzÙL¥ßÊI€§{Õµ“-9›h€”lÆ^`ãYÕÿmïêšÛÆ’ë;~Ê/–ªhMf’l²¥©©¢dØbVµ$eߤ ;¡¤5ü÷ésºûâ$=›}ÉCˆ—KÀýìÛ}ºûô•ß6Ãf^Å8ó·`õ:˜uþ¬QS‡yõT m,Ûàw„ÝÕœ ¢ÊAùÓ^@·¨\ža¢xËú>´:„Üôëô§ÝÃÒ»¡_’\‰+\'Ìkxª&e[ôŒM^­(ØÈ'Ô¥„Œò—ˆÙ¤ºæÍ/"z~ã’7Hhl#1Õ÷bikh :†FnÏeS(A UžV«j#Ú…4~5Â<—îÕx9°ö}N€i—¸IÊX;:ŽðÁi°`t'>‚õFÕ¶Õæv±…þ13Z,—n¿È±+ù¾•ÅkO'²•ád¿/ eSê…H‘É^£æÃc޾s»¡(KIÐÅ×(Áª³äUb ä³ÙEÿ½)k Áh‹½ÆÎN¹{Ü„ï>kP19¿Éå•}¶ÇƒÎhR ÈïíJ" ¼pàNòCæ€v ±‡9Æ‘7ŠÊ4ª‰[ÜAb{¦ûZálcxïYÖøü°5NB|ugxxDˆc1VÝγӆϣÔSHŒwäM¯k7ëðAÒº¬Ð¬|MÕCSUŒº&¤·[šôÊéÇŒ–¶áN¡}åZ(鮀€Ûpˆúy  ‹ñ;Bâ¶õ ¶¶¶ndnh-4"? ó©Óª‹Ç¼¾cÀý—ÒW˜i ŽÍäÃA”&ÀH_…iëDc`ÅÿT›u‡Žä5õîŒq­ƒÕ@€¼wžÊ.=Ñqh»¢{“¿µº¿8ÓØB˽‹9PU-pn‰h†»SÍ^( s­àZ”šÛÁ]iþøˆUòfÍçÑy`Uö5”ô±$ø$rŠçé·j¹!q,ÉY RŠêôv~Š}[-4¯]ÿE£SµI™†—²×Êýë÷¡z ýÑÃ…Tcêðç§SØ(#|y \vo±YSß°Úh×þ&S?q?r ?¥DQ‡@”(„ÌìLiHCV ÅOؤ€+"¿a7ð3^Ò½•îYN† ¨w0æ¤¨Ö Ø™÷S¾ƒÕÖt§Ã ¶ÍÓš›¼.Eþ7jƒ„0:ŠÆÎe ‘íÎ,ç‰{€º¡R›“5[Šv^3þ¦óÚyÍDMëV Q!lÈ A­ÎÒôJzF–árÖOëȰš¶p±¼h…uíÙBÅ#ÝßœÎ>ø©þÇöàðúëLþ‰=X’®øbàÈg%>5ÃÌ RÛßËC˜20 £gùRƲR}f0ÆÒ¶x`øp$ M)nÛN¸ÃÃ0zZg㋱Ö^Î7ÔXÙÑ’HRoŸ"Ý^ZÆ\ƒœÏ/â4E¤’¨‘^¸(Z d ÒôßZÌ)Ò@†k¸‚wéø5F-,‘¨¤BzíŠa:Pfê]GPÙL˜D*^Ö 1Î+Ñ`u°ûýC"¯¤2È\Q¾X›1ƒÿ¹èä=÷ + çКI¡ \5fÅÅð4;·ÂZ ù7g.”uK¿ ãÑá6Á½.öÔkzp×ýf©šeYæâ<îý»n»w±· ‘|Y÷|°¦DPÒ“Ó£[PÙ†éSÄ‘Ã|„‹¯aÛn*×Bz¢Âl âA릟ûPî <Þܽ²šIº§r^®5T¿Ì_CöÞÅÝùh;b\*ä¦ç[MŒ1^Ñؽàý‰ÙO5¸ã—+«Ôhÿ¹u;{¼&€EšG§ýo{:â0ü¤·ˆ=Ǩ:Ó< .ã1€ò=¨ÿ3^Ǥ†Þ2ᇋì§ÑUZâ‰dû2Eôwc‰Q‚ßÇ%§›ºhtvq ê SO¥X‹\ZÑIÒ!œ˜ÖÕߦÁÙ4åj €rm÷þ ¯{’Œ¡b•‡°àûÔž@K)Eê˜óèydÿq–ŽÔ°3œ‚R|Ï Àˆ×þ÷Íý#cy R"ïTsΉ QXœÂ_z°ýôüâ5é‰f›ŸKãZ¾ZŽë¦hNI$…Ã\G dçÄø/˜”ŽŠÅ•2pq—½ãVSŸºÕOŽÉÚ~è¢wFšnÓ³ s±Ñ›ZÓxø[¥\ÿ ŸÇ1ýÊÐxÖŽˆWS>o–rL MiClÈ£áÊVë'qÚ&bë²— ¿GŸ™éßÙD@oÌgÏÒþ»Ì¤Üw7°gªÍRœrDÓºÚŠ›°}GJAt¸#œà½ˆòSØ[‘†S…›¥X´Xr¹Õ°}ø—¸‘D2"5 £|BdT¾¼sY$€g DÅvŽ¯Í¡ ‘Q¯a´B8ˆ›üá+†‹’>;©EeK iu†Á¤[é¡,ˆòÔô² Æ/:Y”õbóÜPk«†›çËV…qó5Ñ ¤çSü¥(-Ñc®r¥"”ÄÝ"ƒ:ê„Ü^655Øž˜›ìÌÆì3ÿ¥§>bŸ4-­~Õ­EÏ®s¢žÅê4pP®·– JÍÖ7Ï»?åæÑ`vÑ=ËgLLú±¶×FÃlìÎ+è„øjRú…Djâí7—þ†ä±`iú‰ûXT ZJNò^‡kÕ:ÖMpÅ_‘¯™ƒ»ogHÅ}âÒNÕe> Ùˆ¦Ï«•¼*N» ©Ç\À?:· êæ%¤{I¢úá¾ZéÜ‹õ¹'³”T«´y¢Ì Ò¼w‚a¬>¾VÙ •~ø¦Íª"~ªJbÂYïÔÄbJJŠ^–[#8½š“8—e(¾é˜»ÖJ­j³ÞQÏt"þóÌ“ký8ÅÆzíi¬²‰èH89”ŽË\Í;…¬´Ò?ß¶™­ØOWÝ‘.´"]¯¦3Ž]7€=çýpg´Rõ±Àë/OÌ w¦‘^Ä®i..QE¦2Pjf¾î~Ú)ÐpΊ àY\¤]U›Æ:(îaWšœZäj]#], ¿’ŒIC… QιH¥-ý8¯îwX/>#æ +åì ÖJ!:¦[R³¢7‰íýJºb Øµ^´,Ó›bnq<<L±ð%”;n:x)kÒÖ=ÌÔààÚZ îuFDlI¯„#v”šæA$’àÚkéea_E¼ñ^ÿ–ÊF& ½Ø­¶où¡î3šó@oýÐmÁˆRUF„:³´o ¼AÔª½…7ƒÖ‹£É×T„ày@íj'‰y†ÐUÕÎètåÜÒô ÉqØ™{tí-a»o zI²mà°TŽóýø¦ûG³¯&C©KÿræàÑ9¨Ñé VØáŸ §ú7f¡6–¿ëœà¨VIcŽX¯oèØ‡Ä8ô€ï­'mÐ0XŒÕܬ|¯»Cçõœ%ÕsCÖ$´!ÈØƳ•iÀˆqÝý~ùûv, Œ?Vù’§›g¯þæb§°@TÎFé¼ò}à¼Â§S7£-UÏUðÙQù£Ü†{Q0fFÂ'ªO–Û¶Ôéfœ~N&ÛÙWîÿgéEv9¼ãõ”®–ü8~JGSgžO?L²,H/¯†“ÙïM2¼·ŽlÔÀVâßÙ¯³ìf–Þf“O£ÙLZ»øšoo¥ñáÅu–^¿Èjf¿^f·³ôËUv“ŒÑü—‘Œg:âƒÑMúe2šáž(4"îdôñj–^¯ßg²uÞùaz;œÌFÙ4‘q|Æ›ñ¤Þ §2ì7é—Ñìj|7 ƒÇäp—æ_F7ïi6bCÙ¯·“l*óO¤íÑ'q&¿ÔË H¾nÆ3Y'™™Œs6æÒø»Þº FÚO>eY¿›Ùðbt=’.Áþ0šÝHäuä—w×C™ÄÝäv<Í¿ÁJ#²à“Ñô/épšØÂþõn’Õ•6> o.¹Q½ÄtÓ¯ã;X ™÷õ{¼ø X¨,}ŸáÒÑgÙ^ySº™Þ}Êl½qé¨,Ðõuz“]Êx‡“¯é4›|]b’Iv;MRr¤'´2¾QÝòÓ6O¤$û ¸»¹Ælí¦Ó=’€6†EÚ°˜Ñ¾'_FÒ9v¨¿ù~‚kPÃæ1ó–U³¿šxÈ0s»+"­t/ÆXƒ ψÒ`A°E†³é BÀ®L>H§·Ùåÿ#¿Ñ“½¾ÖU‘SôWÜ­+¿ôFÒ¡l'¦9´-ĬݸŒHßýsyÒöÝ“?ÈÅõx a“NfÔ#–ÿ^dx{’ÝÈzñ8 //ï&r´ð¾ÑLïä°n¸) æËÓ<š¼÷óÄuN? G×w““žÇ²„h’²6Ä…lz:  ¤£ÒÕå•í^Ú9µ¸w*£•׆ï? y´ŸDÎÂtdk2¶l©ØX|*óãû{üàþã•+¥I éj„uFû/?Ô{ï옕k ÁfïŰ.qU©£¡–GÕ·KÏŒå#ë?šu">ˆ†É6M°?êÚ™Ç —ÁƤŸàb¤þ‡êÜ')×Iר ; &u‚›Q)hH{øÐ+â<$»^ûrm¡Q ó:rÔ0„¬]¡&ÀÔ0âðõ³¿L~sLøM|Ï—‹jŠr |+¶–³ðÞLkÉÆ¤ð )¶Ñ<1B`çÙ~bø7¼±‹|éF?ï•L>Nt£IV7®Ë" òg¬'¿wÆ@´oíB4mz.¾ÇC*&?W2QN) +ü¶Õ-¯þL„_¤¿'IAÏ/Ú/ýÒ¨€¨³ß硺±³ËŠ~Ûâ0eP®÷Ó=÷U·Ì즃[ï0Pj )´°Ü;¹n“alå¤Ë’>ÝÅÏgû NÅšöVÏÚÖ9º”N¶s tqhܸC ¹?–*dxwIÆ S:h£‰¾–ÅýÌ´Ýj™„£Ž·ŠU¼ð³›:ë±\·DŠOäpÃFˆÒ˜íZžÃŸYÿæ÷ý*ÿÁ?]ÏŸ$(Jdˆ æˆ Œ¦˜Ô-³Z.@U««•LHëü㪾¥Æ=;t=uàêÑ«Jr¬c½Ëò7U¦ Ùò•S£%¢+þ°¡Ñ©>®aÛå).ßúó wœqšÓîQÞùz!®„/¦ãk×_cØ|N‘0iH×[‘￱tõõíY{*úê 5=´Åýèßäîh¶`…T!xäþØyÜÝâm<3å­ÇçøŸãs|ŽÏñ9>ÇçøŸãs|ŽÏñ9>ÇçøŸãs|ŽÏÿÃç8Oï vdr-plugin-epgsearch/doc-src/0000755000175000017500000000000012466747543016004 5ustar tobiastobiasvdr-plugin-epgsearch/doc-src/en/0000755000175000017500000000000012466747543016406 5ustar tobiastobiasvdr-plugin-epgsearch/doc-src/en/epgsearchcats.conf.5.txt0000644000175000017500000001024012466747543023047 0ustar tobiastobias=head1 NAME F - Configuration of the additional EPG information =head1 DESCRIPTION Some EPG providers deliver additional EPG information like the type of event, the video and audio format, cast,... Using tvm2vdr or epg4vdr you can import this into vdr. To use this information with search timers one has to configure it with the file epgsearchcats.conf in your plugins config directory. Sample files for F are delivered with the plugin in the directory 'conf'. Simply copy the one that fits for you to your plugins config directory with filename epgsearchcats.conf and then have a look to the search timers edit menu (after a restart of VDR). Since setting up a new F is a lot of work, I've added a small tool 'createcats', that makes the biggest part of the job. It should have been compiled with the plugin and exists in the sources directory. See C for information about how to use it. B epgsearch scans the summary of an event for the category name followed by ': ' for all categories that have a corresponding value set in the search timer. The search is case sensitive regarding the category name as also the value. =head1 SYNTAX ID|category name(,format)|name in menu|values separated by ','(option)|searchmode(option) - 'ID' should be a unique positive integer (changing the id later on will force you to re-edit your search timers!) - 'category name' is the name as delivered by the EPG provider, e.g. 'Genre' you can optionally provide a format specifier for numeric values, e.g. Episode,%02i - 'name in menu' is the name displayed in epgsearch. - 'values' is an optional list of possible values - 'searchmode' specifies the search mode: text comparison: 0 - the whole term must appear as substring 1 - all single terms (delimiters are ',', ';', '|' or '~') must exist as substrings. This is the default search mode. 2 - at least one term (delimiters are ',', ';', '|' or '~') must exist as substring. 3 - matches exactly 4 - regular expression numerical comparison: 10 - less 11 - less or equal 12 - greater 13 - greater or equal 14 - equal 15 - not equal =head1 EXAMPLE (Lines are shortened for correct displaying) Example for EPG from Hörzu, downloaded from epgdata.com with tvmovie2vdr. 1|Category|Kategorie|Information,Kinder,Musik,Serie,Show,Spielfilm,Sport|2 2|Genre|Genre|Abenteuer,Action,Wirtschaft,Wissen,Zeichentrick|2 3|Format|Video-Format|16:9,4:3|2 4|Audio|Audio|Dolby Surround,Dolby,Hoerfilm,Stereo|2 5|Year|Jahr||2 6|Cast|Besetzung||2 7|Director|Regisseur||2 8|Moderator|Moderation||2 9|Rating|Bewertung|Großartig besonders wertvoll,Annehmbar,Schwach|2 10|FSK|FSK|6,12,16,18|2 11|Country|Land||2 12|Episode|Episode||4 13|Themes|Thema||4 =head1 SEE ALSO C, C, C =head1 AUTHOR (man pages) Mike Constabel =head1 REPORT BUGS Bug reports (german): L Mailing list: L =head1 COPYRIGHT and LICENSE Copyright (C) 2004-2010 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch The MD5 code is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. vdr-plugin-epgsearch/doc-src/en/epgsearchcmds.conf.5.txt0000644000175000017500000000415412466747543023052 0ustar tobiastobias=head1 NAME F - EPG Commands =head1 DESCRIPTION This file contains commands, like the file commands.conf or reccmds.conf, which can be applied to the selected event in one of the EPG menues. (It does not support the nested commands as introduced in vdr-1.7.12) Internal epgsearch has 8 not changeable commands. If there is a F, the commands in it will be appended to the list of the internal commands, starting with 9. =head2 Language You can use different files for each language. For example F will be loaded if the, in VDR selected, language is english. If there is no file for the selected language, epgsearch tries to load F. =head1 SYNTAX Description : Command =head1 EXAMPLE epg2taste (de): /usr/local/vdr/epg2taste.sh =head1 SEE ALSO C =head1 AUTHOR (man pages) Mike Constabel =head1 REPORT BUGS Bug reports (german): L Mailing list: L =head1 COPYRIGHT and LICENSE Copyright (C) 2004-2010 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch The MD5 code is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. vdr-plugin-epgsearch/doc-src/en/epgsearchmenu.conf.5.txt0000644000175000017500000001364612466747543023076 0ustar tobiastobias=head1 NAME F - Customizing the EPG menus =head1 DESCRIPTION The file F in your epgsearch config directory is used to store the entries for customizing the EPG menus. You specify the look of each menu (What's on now, What's on next, What's on at ..., Schedule, Search results, Favorites) with a separate line. =head1 EXAMPLE MenuWhatsOnNow=%chnr%:3|%progrt2s%:5| %time% %t_status%:8|%category%:6| %title% ~ %subtitle%:35 MenuWhatsOnNext=%chnr%:3|%time% %t_status%:8|%category%:8| %title% ~ %subtitle%:35 MenuWhatsOnElse=%chnr%:3|%time% %t_status%:8|%category%:8| %title% ~ %subtitle%:35 MenuSchedule=%time% %t_status%:8|%genre%:14| %title% ~ %subtitle%:35 MenuSearchResults=%chnr%:3|%datesh% %time% %t_status%:14|%genre%:8| %title%%colon% %subtitle%:35 MenuFavorites=%chnr%:3|%datesh% %time% %t_status%:14|%genre%:8| %title%%colon%%subtitle%:35 =head1 SYNTAX E.g. the entry 'MenuWhatsOnNow' tells epgsearch how you would like to build a line for the menu 'What's on now'. This would create a menu line starting with the channel number, followed by a progress bar in text2skin style, a space of one char, the start time, the timer status, the EPG category (like "movie") and finally the title and subtitle. The values for MenuWhatsOnNext, MenuWhatsOnElse, MenuSchedule, MenuSearchResults, MenuFavorites specify the menu 'What's on next', 'What's on at ...', 'Schedule', 'Search results' and 'Favorites' respectively. If you do not specify one entry, epgsearch uses its default menu look. 'MenuSearchResults' has something special: If you want to have different layouts for your search results depending on the search, you can use more then one menu template. Simply define e.g. an additional MenuSearchResultsTip of the Day=%chnr%:3|%time_w%:4|%t_status%:3|%genre%:10|%title%%colon% %subtitle%:35 This will produce an additional menu item "Result menu layout" in the edit menu of a search where you can choose between the default menu template and your own templates. In the example above you will get "Tip of the Day" as selection entry, since epgsearch simply cuts the leading "MenuSearchResults". When you display the search results the chosen template will be used instead of the default one. The following variables exist: %time% - start time in format HH:MM %date% - start date in format TT.MM.YY %datesh% - start date in format TT.MM. %time_w% - weekday name %time_d% - start day in format TT %time_lng% - start time in seconds since 1970-01-01 00:00 %title% - title %subtitle% - subtitle %t_status% - timer status ('T', 't', 'R') %v_status% - VPS status %r_status% - running status %status% - complete status, the same as '%t_status%%v_status%%r_status%' %colon% - the sign ':' %% - a value from the extended EPG categories, specified in epgsearchcats.conf, like %genre% or %category% for the 'Whats on...' and 'Search results' menu there is also: %chnr% - channel number %chsh% - the short channel name %chlng% - the 'normal' channel name %chdata% - VDR's internal channel representation (e.g. 'S19.2E-1-1101-28106') %progr% - graphical progress bar (not for menu 'Search results') %progrT2S% - progress bar in text2skin style (not for menu 'Search results') the variables are not case sensitive. An entry consists of up to 6 tables separated with '|'. The last entry of each table should declare the table width in chars, separated with ':'. If you use a separator like '~', '-' or '#' to separate items like title or subtitle, e.g. %title% ~ %subtitle%, and the subtitle is empty, then epgsearch will try to fix this automatically to avoid a trailing separator. You should vary the tab width values to fit your needs, since the look often depends on the selected skin. epgsearchmenu.conf is not reloaded with every plugin call, since this is only useful when testing the conf file. To activate the permanent reload for testing your conf, pass the new start parameter '-r' or '--reloadmenuconf' in your runvdr. There's a sample F in the subdirectory "conf". For a quick try copy it to your epgsearch config directory (e.g. /etc/vdr/plugins/epgsearch). To enable icons from the VDRSymbols font simply put the line WarEagleIcons=1 to F. The VDRSymbols font is available at +http://andreas.vdr-developer.org/fonts/download.html NOTE: As long as there is a file epgsearchmenu.conf with an entry for a special menu, all setup settings regarding the look of this menu are ignored. =head1 SEE ALSO C =head1 AUTHOR (man pages) Mike Constabel =head1 REPORT BUGS Bug reports (german): L Mailing list: L =head1 COPYRIGHT and LICENSE Copyright (C) 2004-2010 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch The MD5 code is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. vdr-plugin-epgsearch/doc-src/en/timersdone.conf.5.txt0000644000175000017500000000375012466747543022414 0ustar tobiastobias=head1 NAME F - list of current timers created by search timers =head1 DESCRIPTION This file contains the current timers that were created by search timers. If the setup option 'Recreate timers after deletion' is set to 'no', epgsearch uses this list to determine if a timer was already created and cancels further timer creations. If a corresponding recording was made for any timer in this list, the timer is automatically removed from it. =head1 FORMAT Timers are stored one per line, where the fields are separated with ':'. The following fields exists: 1 - channel-ID 2 - start time 3 - stop time 4 - search timer ID 5 - event title 6 - event episode =head1 SEE ALSO C =head1 AUTHOR (man pages) Mike Constabel =head1 REPORT BUGS Bug reports (german): L Mailing list: L =head1 COPYRIGHT and LICENSE Copyright (c) 2005-2006 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch The MD5 code is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. vdr-plugin-epgsearch/doc-src/en/epgsearch.4.txt0000644000175000017500000011341112466747543021253 0ustar tobiastobias=head1 NAME F - Searchtimer and replacement of the VDR program menu =head1 OVERVIEW Since the README get bigger and bigger this man page shall be used to explain some things in detail. So it's not really a manual, but an extended README. =head1 CONTENT 1. Using variables in the directory entry of a search timer 2. The format of epgsearch.conf 3. Description of the search process 4. How do Search Timers work? 5. How to trigger a search timer update? 6. The sources of the 'Select directory' menu 7. Language dependent commands for EPG 8. Usage from other plugins or scripts 9. SVDRP interface 10. Customizing the EPG menus 11. Working with the timer conflict menu 12. User defined variables 13. Email notifications 14. The conf.d subdirectory =head1 1. Using variables in the directory entry of a search timer If you are using extended EPG information, you can use variables as part of a directory entry of a search timer. These variables always have the form '%variable%'. The name of a variable corresponds with the internal name of an extended EPG info, as specified in the file epgsearchcats.conf (samples can be found in subdirectory 'conf'). Example: 1|Category|Kategorie|Information,Kinder,Musik,Serie,Show,Spielfilm,Sport|3 The category with ID 1 has the internal name 'Category'. So you could use it with '%Category%'. The names are not case sensitive. Sample directory entries could look like this: My Movies~%Category% Childrens Movies~%category% %CATEGORY%~%genre% There are also three other variables: %Title%, %Subtitle% and %chlng%. If you don't use %Title%, the title is always automatically appended to the directory entry, when a timer will be created. If you set 'serial recording' to 'yes' in your search timer then also the subtitle will be automatically appended. So the directory entry %Category%~%Genre%~%Title%~%Subtitle% is the same as %Category%~%Genre% (with 'serial recording' set to 'yes'). The %chlng% variable gets replaced with the name of the channel. Attention: Automatically appending title and subtitle will not be done, if you use the variables %Title% or %Subtitle% in the directory entry. This allows one to form directory entries like this one: %Category%~%Genre%~%Title%~%Episode%~%Subtitle% There are also the following search variables: %search.query% that will be replaced with the query of the search timer %search.series% that is '1', if the search has its 'Series recording' flag set, else '0'. See also C. =head1 2. The format of epgsearch.conf Due to some new features there was a change in the format. The format is now signed with a comment in the first line. The field delimiter is B<':'>: 1 - unique search timer id 2 - the search term 3 - use time? 0/1 4 - start time in HHMM 5 - stop time in HHMM 6 - use channel? 0 = no, 1 = Interval, 2 = Channel group, 3 = FTA only 7 - if 'use channel' = 1 then channel id[|channel id] in vdr format, one entry or min/max entry separated with |, if 'use channel' = 2 then the channel group name 8 - match case? 0/1 9 - search mode: 0 - the whole term must appear as substring 1 - all single terms (delimiters are blank,',', ';', '|' or '~') must exist as substrings. 2 - at least one term (delimiters are blank, ',', ';', '|' or '~') must exist as substring. 3 - matches exactly 4 - regular expression 5 - fuzzy searching (specify tolerance in parameter 42, not available for EPG categories) 10 - use title? 0/1 11 - use subtitle? 0/1 12 - use description? 0/1 13 - use duration? 0/1 14 - min duration in minutes 15 - max duration in minutes 16 - use as search timer? 0/1/2 (with 2 one can specify time margins in parameter 48/49 where the search timer is active) 17 - use day of week? 0/1 18 - day of week (0 = Sunday, 1 = Monday...; -1 Sunday, -2 Monday, -4 Tuesday, ...; -7 Sun, Mon, Tue) 19 - use series recording? 0/1 20 - directory for recording 21 - priority of recording 22 - lifetime of recording 23 - time margin for start in minutes 24 - time margin for stop in minutes 25 - use VPS? 0/1 26 - action: 0 = create a timer 1 = announce only via OSD (no timer) 2 = switch only (no timer) 27 - use extended EPG info? 0/1 28 - extended EPG info values. This entry has the following format (delimiter is '|' for each category, '#' separates id and value): 1 - the id of the extended EPG info category as specified in epgsearchcats.conf 2 - the value of the extended EPG info category (a ':' will be translated to "!^colon^!", e.g. in "16:9") 29 - avoid repeats? 0/1 30 - allowed repeats 31 - compare title when testing for a repeat? 0/1 32 - compare subtitle when testing for a repeat? 0=no/1=yes/2=yes-if present 33 - compare description when testing for a repeat? 0/1 34 - compare extended EPG info when testing for a repeat? This entry is a bit field of the category IDs. 35 - accepts repeats only within x days 36 - delete a recording automatically after x days 37 - but keep this number of recordings anyway 38 - minutes before switch (if action = 2) 39 - pause if x recordings already exist 40 - blacklist usage mode (0 none, 1 selection, 2 all) 41 - selected blacklist IDs separated with '|' 42 - fuzzy tolerance value for fuzzy searching 43 - use this search in favorites menu (0 no, 1 yes) 44 - number of the search menu template to use (only available if multiple search result templates are defined in epgsearchmenu.conf) 45 - auto deletion mode (0 don't delete search timer, 1 delete after given count of recordings, 2 delete after given days after first recording) 46 - count of recordings after which to delete the search timer 47 - count of days after the first recording after which to delete the search timer 48 - first day where the search timer is active (see parameter 16) 49 - last day where the search timer is active (see parameter 16) 50 - ignore missing EPG categories? 0/1 51 - unmute sound if off when used as switch timer 52 - the minimum required match in percent when descriptions are compared to avoid repeats (-> 33) A ':' in the search term or the directory entry will be translated in a '|'. If a '|' exists in the search term, e.g. when using regular expressions, it will be translated to "!^pipe^!" (I know it's ugly ;-)) See also C. =head1 3. Description of the search process First, for each broadcasting a search text divided by '~' is created, depending on the settings of 'Use title', 'Use subtitle' and 'Use description': title~subtitle~description If "Match case" is not set, the search text and the search term are transformed to lower case. Now depending on the search mode, the search term will be looked up in the search text: =over 4 =item - 'Phrase' matches if the search term is found anywhere in the search text. =item - 'at least one word', 'all words' first the search term will be split in single words. Delimiters are a blank and the characters ',' ';' '|' '~'. Then we check if at least one or all words appear in the search text. =item - 'match exactly' matches if search term and search text are identical. =item - 'regular expression' the search is done with a regular expression. You don't need a leading and trailing '/' in your search term. Two standards of regular expression are supported: extended POSIX and Perl compatible regular expressions (PCRE) (see F). =back If the search was successful until now, the other criterions (start time, duration, week day) are checked. =head1 4. How do Search Timers work? With each update, the plugin first sorts the search timers by timer priority (descending) and search term and then searches for new matches of your search timers. If a new match is found then a new timer is created. For serial recordings, the subtitle is appended to the recording directory. Many providers deliver the subtitle just 1-2 days before the event. The plugin uses then a date/time string for the subtitle, but replaces this one later if the subtitle is present. Start and end times of a broadcasting often vary a little bit. To avoid getting many different timers for the same event, the plugin checks before adding a new timer, if there is one, that has start and end times which only differ by a maximum of 10 minutes (or the events duration if this is less then 10 minutes). If so, the present timer is modified, else a new timer is created. If the timer was set to inactive there will be no update. Also manually corrected priority or lifetime will not be changed when updating. If you have set 'Announce only (no timer)' to yes, no timer is created. Instead you get an OSD message about the event. This message is displayed at each scan, but only if there is no timer for the event. =head1 5. How to trigger a search timer update? the update of search timers runs in its own thread. There are several ways to trigger it: =over 4 =item - automatically after VDR starts there is always an update (after a few seconds). After this, the setup option 'Update interval' tells epgsearch when the next update should be done repeatedly (in minutes). =item - manually extern the thread observes the file '.epgsearchupdate' in the plugins config directory. When you touch /path_to_file/.epgsearchupdate this will also trigger an update. So this is a simple solution to make an update e.g. by a script. =item - manually intern calling actions or pressing '3' in the menu of searches asks also for an update. =item - from other plugins =back there's a service 'Epgsearch-updatesearchtimers-v1.0' that can be used with the service interface of VDR from other plugins with the option to inform via OSD when the update has finished =head1 6. The sources of the 'Select directory' menu This menu displays directories, that can be used for search timers or ordinary timers. The items displayed are read from the following sources: * current recording directories * current timer directories * directories used in search timers * directories specified in F, see C * entries in VDR's folders.conf The menu merges theses directories and displays only distinct directories. With key 'yellow' one can change the depth of the directories shown. If there are items, that contain category variables like '%genre%', these entries are always shown before any other directories. They are also not level dependent, but are always shown with their full directory. If this menu is called from the timer edit menu and an item is selected that contains the variables "%title%" or "%subtitle" then the 'file' item of the timer gets cleared, since title or subtitle already exist in the 'directory' item. This list can also be accessed via the SVDRP command 'LSRD'. =head1 7. Language dependent commands for EPG If you like to have a language dependent list of commands simply translate your present F to your preferred OSD language and store it with the filename epgsearchcmds-XXX.conf, where XXX is the language code from i18n.c: { "eng,dos", "deu,ger", "slv", "ita", "dut,nla,nld", "por", "fra,fre", "nor", "fin,smi", "pol", "esl,spa", "ell,gre", "sve,swe", "rom,rum", "hun", "cat,cln", "rus", "hrv", "est", "dan", } If there are more codes for one language (e.g. "deu,ger") choose one of them. If there is no language dependent file, epgsearch loads the file F. See also C. =head1 8. Usage from other plugins or scripts Searching the EPG and other functionality can be used by other plugins or scripts. There are two approaches: =head2 8.1. File-based (intended for use in scripts) Therefore simply create the file '.epgsearchrc' in the plugins config directory with the following lines in it: Search=your search term Searchmode=x // 0=phrase, 1=and, 2=or, 3=regular expression ChannelNr=x // add this line, to search on a specific channel UseTitle=x // 1(default) or 0 UseSubtitle=x // 1(default) or 0 UseDescr=x // 1(default) or 0 Then call Epgsearch via svdrpsend (you must have assigned a key to it), e.g. svdrpsend HITK green At startup Epgsearch will look for this file and give you the search results for your search, if it exists. After that the file is removed. A sample script F, that searches for the repeats of a recording exists in the scripts subdirectory of Epgsearch. =head2 8.2. via Plugin-Interface (intended for use in plugins) A plugin can directly call two functions of epgsearch with only some lines of source code: - searching the EPG for some criteria and display the result list - extended timer edit menu I have added a quick and dirty dummy plugin (source/vdr-epgsearchclient-0.0.1.tgz), that demonstrates the usage. =head1 9. SVDRP interface epgsearch implements a SVDRP interface, that can be accessed for example like this svdrpsend PLUG epgsearch LSTS the following commands are available: =head2 search management: * 'LSTS [ID]' to list all searches, or the one with the passed ID (format is the same as epgsearch.conf) * 'NEWS ' to add a new search REMARK: the value of element ID is ignored. epgsearch will always assign the next free ID * 'DELS ' to delete the search with ID * 'EDIS ' to modify an existing search * 'UPDS [OSD]' to update the search timers. Passing the optional keyword 'OSD' pops up an OSD message after the update has finished. * 'MODS ID ON|OFF' turns on/off the option 'Use as search timer'. * 'UPDD' to reload the file epgsearchdone.data, e.g. after an external tool has modified it. * 'SETS ' to temporarily activate or cancel the search timer background thread. * 'FIND ' for searching the EPG input is the same as with 'NEWS'. output is a list of found events formatted as 'NEWT' lines. So they can be immediately used to create a new timer for an event. * 'QRYS < ID(s) >' to get the results for a search with the given ID. Multiple IDs can also be passed and have to be separated with '|'. The results are formatted like this: search ID : // the ID of the corresponding search timer event ID : // VDR event ID title : // event title, any ':' will be converted to '|' episode name : // event short text, any ':' will be converted to '|' event start : // event start in seconds since 1970-01-01 event stop : // event stop in seconds since 1970-01-01 channel : // channel ID in VDR's internal representation (e.g. 'S19.2E-1-1101-28106') timer start : // timer start in seconds since 1970-01-01 (only valid if timer flag is > 0) timer stop : // timer stop in seconds since 1970-01-01 (only valid if timer flag is > 0) timer file : // timer file (only valid if timer flag is > 0) timer flag : // 0 = no timer needed, 1 = has timer, 2 timer planned for next update) * 'QRYS ' to get the results for a search with the given search settings. * 'QRYF [hours]' to get the results for the favorites menu, see QRYS for result format. The optional parameter specifies the number of hours to evaluate and defaults to 24h. * 'MENU [PRG|NOW|SUM]' calls one of the main menus of epgsearch or the summary of the current event. * 'UPDT' reloads the search timers from epgsearch.conf =head2 channel group management: * 'LSTC [channel group name]' list all channel groups or if given the one with name 'group name' * 'NEWC ' create a new channel group, format as in epgsearchchangrps.conf * 'EDIC ' modify an existing channel group, format as in epgsearchchangrps.conf * 'DELC ' delete an existing channel group * 'RENC ' rename an existing channel group =head2 blacklist management: * 'LSTB [ID]' to list all blacklists, or the one with the passed ID (format is the same as epgsearchblacklists.conf) * 'NEWB ' to add a new blacklist REMARK: the value of element ID is ignored. epgsearch will always assign the next free ID * 'DELB ' to delete the blacklist with ID * 'EDIB ' to modify an existing blacklist =head2 search template management: * 'LSTT [ID]' to list all search templates, or the one with the passed ID (format is the same as epgsearch.conf) * 'NEWT ' to add a new search template REMARK: the value of element ID is ignored. epgsearch will always assign the next free ID * 'DELT ' to delete the search template with ID * 'EDIT ' to modify an existing search template * 'DEFT [ID]' returns the ID of the default search template. When passing an ID it activates the corresponding template as default. =head2 extended EPG categories: * 'LSTE [ID] to get the extended EPG categories defined in epgsearchcats.conf or the one with the given ID. (format is the same as epgsearchcats.conf) =head2 misc: * 'SETP [option]' returns the current value of the given setup option or a list of all options with their current values. The following options can be accessed: - ShowFavoritesMenu - UseSearchTimers =head2 timer conflicts: * 'LSCC [REL]' returns the current timer conflicts. With the option 'REL' only relevant conflicts are listed. The result list looks like this for example when we have 2 timer conflicts at one time: 1190232780:152|30|50#152#45:45|10|50#152#45 '1190232780' is the time of the conflict in seconds since 1970-01-01. It's followed by list of timers that have a conflict at this time: '152|30|50#152#45' is the description of the first conflicting timer. Here: '152' is VDR's timer id of this timer as returned from VDR's LSTT command '30' is the percentage of recording that would be done (0...100) '50#152#45' is the list of concurrent timers at this conflict '45|10|50#152#45' describes the next conflict =head1 10. Customizing the EPG menus The file F in your epgsearch config directory is used to store the entries for customizing the EPG menus. You specify the look of each menu (What's on now, What's on next, What's on at ..., Schedule, Search results, Favorites) with a separate line. Here's a sample: MenuWhatsOnNow=%chnr%:3|%progrt2s%:5| %time% %t_status%:8|%category%:6| %title% ~ %subtitle%:35 MenuWhatsOnNext=%chnr%:3|%time% %t_status%:8|%category%:8| %title% ~ %subtitle%:35 MenuWhatsOnElse=%chnr%:3|%time% %t_status%:8|%category%:8| %title% ~ %subtitle%:35 MenuSchedule=%time% %t_status%:8|%genre%:14| %title% ~ %subtitle%:35 MenuSearchResults=%chnr%:3|%datesh% %time% %t_status%:14|%genre%:8| %title%%colon% %subtitle%:35 MenuFavorites=%chnr%:3|%time%:6|%timespan%:7|%t_status%:14|%genre%:8| %title%%colon%%subtitle%:35 E.g. the entry 'MenuWhatsOnNow' tells epgsearch how you would like to build a line for the menu 'What's on now'. This would create a menu line starting with the channel number, followed by a progress bar in text2skin style, a space of one char, the start time, the timer status, the EPG category (like "movie") and finally the title and subtitle. The values for MenuWhatsOnNext, MenuWhatsOnElse, MenuSchedule, MenuSearchResults, MenuFavorites specify the menu 'What's on next', 'What's on at ...', 'Schedule', 'Search results' and 'Favorites' respectively. If you do not specify one entry, epgsearch uses its default menu look. 'MenuSearchResults' has something special: If you want to have different layouts for your search results depending on the search, you can use more then one menu template. Simply define e.g. an additional MenuSearchResultsTip of the Day=%chnr%:3|%time_w%:4|%t_status%:3|%genre%:10|%title%%colon% %subtitle%:35 This will produce an additional menu item "Result menu layout" in the edit menu of a search where you can choose between the default menu template and your own templates. In the example above you will get "Tip of the Day" as selection entry, since epgsearch simply cuts the leading "MenuSearchResults". When you display the search results the chosen template will be used instead of the default one. The following variables exist: %time% - start time in format HH:MM %timeend% - end time in format HH:MM %date% - start date in format DD.MM.YY %datesh% - start date in format DD.MM. %date_iso% - start date in format YYYY-MM-DD. %year% - year with century %month% - month (1-12) %day% - day (1-31) %week% - week number of the year (Monday as the first day of the week) as a decimal number [01,53] %time_w% - weekday name %time_d% - start day in format TT %time_lng% - start time in seconds since 1970-01-01 00:00 %timespan% - timespan from now to the beginning of an event, e.g. 'in 15m' or the time an event is already running, e.g. '10m'. %length% - length in seconds %title% - title %subtitle% - subtitle %summary% - summary %htmlsummary% - summary, where all CR are replaced with '
' %eventid% - numeric event ID %liveeventid% - encoded event ID as used in the frontend 'live' %t_status% - timer status ('T', 't', 'R') %v_status% - VPS status %r_status% - running status %status% - complete status, the same as '%t_status%%v_status%%r_status%' %% - a value from the extended EPG categories, specified in epgsearchcats.conf, like %genre% or %category% for the 'Whats on...' and 'Search results' menu there are also: %chnr% - channel number %chsh% - the short channel name %chlng% - the 'normal' channel name %chdata% - VDR's internal channel representation (e.g. 'S19.2E-1-1101-28106') %progr% - graphical progress bar (not for menu 'Search results'), requires VDRSymbols font %progrT2S% - progress bar in text2skin style (not for menu 'Search results') some independent variables: %colon% - the sign ':' %datenow% - current date in format DD.MM.YY %dateshnow% - current date in format DD.MM. %date_iso_now% - current date in format YYYY-MM-DD %timenow% - current time in format HH:MM %videodir% - VDR video directory (e.g. /video) %plugconfdir% - VDR plugin config directory (e.g. /etc/vdr/plugins) %epgsearchdir% - epgsearch config directory (e.g. /etc/vdr/plugins/epgsearch) The variables are not case sensitive. You can also use variables for extended EPG categories defined in F or use your own user defined variables defined in F An entry consists of up to 6 tables separated with '|'. The last entry of each table should declare the table width in chars, separated with ':'. If you use a separator like '~', '-' or '#' to separate items like title or subtitle, e.g. %title% ~ %subtitle%, and the subtitle is empty, then epgsearch will try to fix this automatically to avoid a trailing separator. You should vary the tab width values to fit your needs, since the look often depends on the selected skin. epgsearchmenu.conf is not reloaded with every plugin call, since this is only useful when testing the conf file. To activate the permanent reload for testing your conf, pass the new start parameter '-r' or '--reloadmenuconf' in your runvdr. There's a sample F in the subdirectory "conf". For a quick try copy it to your epgsearch config directory (e.g. /etc/vdr/plugins/epgsearch). To enable icons from the VDRSymbols font simply put the line WarEagleIcons=1 to F. The VDRSymbols font is available at http://andreas.vdr-developer.org/fonts/download.html NOTE: As long as there is a file epgsearchmenu.conf with an entry for a special menu, all setup settings regarding the look of this menu are ignored. See also C. =head1 11. Working with the timer conflict menu If a conflict is detected within the periodic conflict background check you get an OSD message which informs you about it. Pressing 'Ok' you will get a menu that displays all relevant conflicts. You can manually call this menu in epgsearch in the menu 'Search/Actions'. Besides the relevant conflicts (relevance is controlled via the setup options of epgsearch) there may also be conflicts which are not classified as important. If so, you can press 'Show all' to get the complete list. The menu title always displays the number of relevant conflicts and the total number. The list displays first the time when a conflict appears and then all timers that will fail here. A timer entry consists of the channel number and its name followed by the timer priority and the percentage value that shows how much of the timer will be recorded. Finally the timer's file entry is displayed. When you select a timer entry and press 'Ok' or 'Details' you get a new menu which displays all concurrent timers. This menu allows you to resolve the conflict by - searching a repeat for an event - disabling a timer - deleting a timer - changing the timers start- or stop-time or its priority - executing any other commands on this timer An entry of this menu consists of the sign '>' to indicate an active timer, the channel number, the start and stop time, the priority, the number of the device that will do the recording (or 'C' for conflict) and the timer's file entry. Pressing 'Ok' on a timer entry will show you its event description if present. If one returns from this menu to the conflict overview menu there will be an automatic update to see if a conflict was really resolved. Some changes to a timer (like modifying start/stop or deleting a timer) in the conflict details menu also cause an immediate return to the overview menu and produce an update. Note: There's a 'hidden' setup option epgsearch.ConflCheckCmd, that allows executing a command for each timer causing a conflict. You have to set this directly in VDRs setup.conf like this: epgsearch.ConflCheckCmd = system(your_script_handling_the_conflict.sh, any_arguments like %timer.file%) (Please have a look at 'Calling a system command' below for the possible arguments) One could use this for example to forward a timer to another VDR machine in case of a conflict. This command is evaluated for each timer causing a conflict whenever an automatic conflict check is running. When calling the conflict check via OSD the command is not evaluated. =head1 12. User defined variables You can create your own variables to be used in any place that supports variables, like the default recording directory for manually created timers, the recording directory of a search timer or in your customized EPG menus. Put them in the file F. Variables looks like %Variablename%. "Variablename" can be consist of any alphanumerical character. Space and special characters are not allowed. The variable names are case-insensitive. Examples for possible names: %Series% %DocuVar1% %ThemesSubtitleDate1% =head2 Assignment %Series%=New series~Thriller The variable %Series% will be assigned with the string "New series~Thriller". Assignments are always strings. Spaces stay spaces. %Path%=%Series% The variable %Path% gets the content of the variable %Series%. You can do nearly everything: %Path%=%Serie%~Lost The variable %Path% contains now the string "New series~Thriller~Lost". =head2 Control structures You can use simple "if then else" constructions. These constructions cannot contain strings, only variables. Spaces are ignored. %Foo%=Other %Variable%=%Path% ? %Path% : %Foo% If %Path% is not empty, assign the content of %Path% to %Variable%, otherwise the content of %Foo%. "%Path% ?" means "not empty?". You can use other checks. %Variable%=%Path%!=5 ? %Path% : %Foo% "%Path%!=5 ?" means "is %Path% equal 5?" You can also compare variables. %Five%=5 %Variable%=%Path%!=%Five% ? %Path% : %Foo% Other possible checks: == equal != not equal =head2 Calling a system command You can call external commands. The returned string will be assigned to a variable %uservar%=system(scriptname[, parameters]) Calls the script "scriptname" with the parameters defined in the optional list of 'parameters'. This can be an arbitrary expression containing other user variables, but not again a system call or a conditional expression. Sample: %myVar%=system(/usr/local/bin/myscript.sh, -t %title% -s %subtitle% -u %myOtherVar%) The script must return a string B line break! If the script returns nothing, an empty string will be assigned to the Variable %Result%. =head2 Calling a TCP service You can call a TCP service with the following syntax: %uservar%=connect(, , []) This will connect to through the given port and pass the optional given data. can be an IP address or the domain name of the TCP service. The result returned by the service must be terminated with a line feed. =head2 Get the length of an argument When passing any values to the connect or system command it can be helpful to have the length of an argument for simple parsing. This can be done with %uservar%=length() Sample: %length_title%=length(%title%) =head2 Possible variables for a list of already builtin variables refer to the section "Customizing the EPG menus" Furthermore you can use every variable defined in F. See C. =head2 EXAMPLES # Weekday, Date, Time %DateStr%=%time_w% %date% %time% # Themes or Subtitle or Date %ThemesSubtitleDate1%=%Subtitle% ? %Subtitle% : %DateStr% %ThemesSubtitleDate%=%Themes% ? %Themes% : %ThemesSubtitleDate1% # Calls this script to get a recording path %DocuScript%=system(doku.pl, -t %Title% -s %Subtitle% -e %Episode% -th %Themes% -c %Category% -g %Genre%) %Docu%=%DocuScript% =head1 13. Email notification If you want to get email notifications about timers added/modified/removed by the search timer thread or about timer conflicts, first copy the script 'sendEmail.pl' to the place where your executables are (e.g. /usr/local/bin) and then configure your email account in the setup. Press 'Test' to check if it works. There should be something like 'Email successfully sent' at the end of the output. The content of the mails is defined by the files - epgsearchupdmail.templ (for search timer update notifications) - epgsearchconflmail.templ (for timer conflict notifications) You can find sample files in the 'conf' directory. Copy them to the epgsearch config directory (e.g. /etc/vdr/plugins/epgsearch). =head2 Customizing the notifications mails The content of the mails can be customized in many ways. You can use plain text or HTML (see the sample conf/epgsearchupdmail-html.templ). For an update mail you have to define the following sections: - "subject" to be used as mail subject - "mailbody" the body of the mail: put %update.newtimers% in the place where the list of new timers should appear. The same for %update.modtimers%, %update.deltimers% and %update.newevents% for the list of changed or deleted timers and event announcements. - "timer" the description of one timer and "event" with the description of one event. This section is used to display one timer within a timer list, e.g. in %update.newtimers%. The same for "event". All sections are optional, e.g. if you don't use event announcements you can drop "%update.newevents%" in the mailbody and the "event" section. But of course you should have at least a mailbody ;-) Each section is enclosed in a pseudo XML tag. The following variables can be used in the section : - %update.newtimers% - will be replaced with the list of new timers created with this update. The timers are displayed as defined in the section '' - %update.countnewtimers% - the number of new timers - %update.modtimers% - same as %update.newtimers% but for modified timers. - %update.countmodtimers% - the number of modified timers - %update.deltimers% - same as %update.newtimers% but for deleted timers. (Note: a deleted timer has eventually no event assigned to it. So all event variables within the timer section will be substituted to an empty string.) - %update.countdeltimers% - the number of deleted timers - %update.newevents% - will be replaced with the list of events to announce. These events are the search result of search timers with the action "announce by mail". The events are displayed as defined in the section '' - %update.countnewevents% - the number of new events - %colon% - the sign ':' - %datenow% - current date in format TT.MM.YY - %dateshnow% - current date in format TT.MM. - %timenow% - current time in format HH:MM The following variables can be used in the section : - %timer.date% - date of the timer - %timer.start% - start time of the timer - %timer.stop% - stop time of the timer - %timer.file% - recording directory of the timer - %timer.chnr% - channel number - %timer.chsh% - short channel name - %timer.chlng% - channel name - %timer.search% - name of the search timer, that created the timer - %timer.searchid% - id of the search timer, that created the timer - %timer.modreason% - the reason for a timer modification in plain text - %timer.liveid% - encoded timer ID as used in the frontend 'live' - any event variable (as in '10. Customizing the EPG menus') - any extended EPG variable as defined in epgsearchcats.conf - any user variable (as in '12. User defined variables') The following variables can be used in the section : - any event variable (as in '10. Customizing the EPG menus') - %search% - the name of the search timer that triggered this event - %searchid% - the ID of the corresponding search timer - any extended EPG variable as defined in epgsearchcats.conf - any user variable (as in '12. User defined variables') For a conflict notification mail the following sections exist: - "subject" to be used as mail subject - "mailbody" the body of the mail. Put %conflict.conflicts% in the place where the list of conflict times should appear (Note: there can be more than one timer conflict at the same time!). A conflict time uses the section 'conflictsat' to display its content. - "conflictsat" the description of one time where one or more conflicts exists. Put %conflict.confltimers% in the place where the list of conflict timers should appear. - "confltimer" the description of one conflicting timer The following variables can be used in the section : - %conflict.count% - complete number of timer conflicts - %conflict.conflicts% - list of times with conflicting timers The following variables can be used in the section : - %conflict.date% - date of the conflict - %conflict.time% - time of the conflict - %conflict.confltimers% - list of conflicting timers for this time The section can use the same variables as the section in an update mail (see above). =head1 14. The conf.d subdirectory epgsearch supports a configuration mechanism well-known in linux. The settings of the configuration files - epgsearchuservars.conf - epgsearchdirs.conf - epgsearchmenu.conf - epgsearchcats.conf can also be given in a file with arbitrary name in the subdirectory conf.d in /epgsearch. This allows one to quickly test different setups only by exchanging files instead of editing them. The format of these files is [
] ... [
] ... where is one of the following: - epgsearchuservars - epgsearchdirs - epgsearchmenu - epgsearchcats The format follows the one in the corresponding configuration file. Comments beginning with # are allowed, also blank lines. At startup epgsearch first reads its 'regular' configuration files and then the conf.d subdirectory. It's allowed to overwrite variables already defined in other files (although this is signaled with a warning in epgsearch's log file.). =head1 SEE ALSO C, C, C, C, C, C =head1 AUTHOR (man pages) Mike Constabel =head1 REPORT BUGS Bug reports (german): L Mailing list: L =head1 COPYRIGHT and LICENSE Copyright (C) 2004-2010 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch The MD5 code is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. vdr-plugin-epgsearch/doc-src/en/epgsearchchangrps.conf.5.txt0000644000175000017500000000352312466747543023730 0ustar tobiastobias=head1 NAME F - Channel groups =head1 DESCRIPTION You can define channel groups in epgsearch which can be used in searchtimers. In this file the groups will be saved. =head1 SYNTAX Each line contains one channel group. The line begins with the group name, after the name, split by '|', the list of channels. =head1 EXAMPLE (Lines are shortened for clean displaying) Private|S19.2E-133-33-46|S19.2E-133-33-51 ProsiebenSat.1|S19.2E-133-33-46|S19.2E-133-33-47 RTL World|S19.2E-1-1089-12003||S19.2E-1-1089-12090 =head1 SEE ALSO C =head1 AUTHOR (man pages) Mike Constabel =head1 REPORT BUGS Bug reports (german): L Mailing list: L =head1 COPYRIGHT and LICENSE Copyright (C) 2004-2010 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch The MD5 code is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. vdr-plugin-epgsearch/doc-src/en/noannounce.conf.5.txt0000644000175000017500000000406512466747543022406 0ustar tobiastobias=head1 NAME F - list of events that have been marked to not be announced via OSD =head1 DESCRIPTION This file contains a list of events that have been marked to not be announced via OSD by the search timer background thread. If the user presses one of the keys 'Ok', '0', ... '9' while the announcement of an event is displayed, he will be asked if further announcements of this event should be disabled for ever (user hit '0' or 'Ok') or for the next 'x' days (user hit '1' to '9'). After pressing 'Ok' again, this setting will be stored. =head1 FORMAT Events are stored one per line, where the fields are separated with ':'. The following fields exists: 1 - title 2 - short text 3 - channel ID 4 - start time 5 - next announce time =head1 SEE ALSO C =head1 AUTHOR (man pages) Mike Constabel =head1 REPORT BUGS Bug reports (german): L Mailing list: L =head1 COPYRIGHT and LICENSE Copyright (C) 2004-2010 Christian Wieninger This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html The author can be reached at cwieninger@gmx.de The project's page is at http://winni.vdr-developer.org/epgsearch The MD5 code is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. vdr-plugin-epgsearch/doc-src/en/epgsearch.1.txt0000644000175000017500000011503212466747543021251 0ustar tobiastobias=head1 NAME F - Searchtimer and replacement of the VDR program menu =head1 OVERVIEW EPG-Search can be used as a replacement for the default schedules menu entry. It looks like the standard schedules menu, but adds some additional functions: - Commands for EPG entries with 5 built-in commands like 'show repeats', 'create search'. One can add own commands for other needs, like adding a VDRAdmin auto-timer. - Add up to 4 user-defined times to 'now' and 'next' and an optional favorites menu - Searching the EPG: Create reusable queries, which can also be used as 'search timers'. - Search timers: Search for broadcasts in the background and add a timer if one matches (similar to VDRAdmin's auto-timers) or simply make an announcement about it via OSD - Avoid double recordings of the same event * timer preview * recognition of broken recordings * fuzzy event comparison - Progress bar in 'What's on now' and 'What's on next' - Shift the time displayed by key press, e.g. 'What's on now' + 30 minutes - Start menu can be setup between 'Schedule' or 'What's on now' - background check for timer conflicts with a timer conflict manager - detailed EPG menu (summary) allows jumping to the next/previous event - support for extended EPG info for search timers - extension of the timer edit menu with a directory item, user defined weekday selection and a subtitle completion. - Timer conflict check, informs you over the OSD about conflicts - Timer conflict menu, show detailed information about the conflicts and let you resolve them - Email notifications about search timer updates and timer conflicts Parts of the sources are based on the repeating-ECG patch from Gerhard Steiner, who gave me the permission to use them. Thanks for his work! =head1 OPTIONS =over 4 =item -f file, --svdrpsendcmd=file the path to svdrpsend for external SVDRP communication (default is internal communication, so this is usually not needed anymore) =item -c path, --config=path to specify a specific config directory for all epgsearch config files, default is '/epgsearch' =item -l file, --logfile=file to specify a specific log file for epgsearch (default log file is epgsearch.log in the epgsearch config directory) =item -v n, --verbose=n verbose level for log file. Value 0 means no logging. Other values are 1 (general messages), 2 (detailed messages), 3 (planned for extra detailed info for debugging purposes) =item -r, --reloadmenuconf reload epgsearchmenu.conf with plugin call. This can be useful when testing customized menu layouts. =item -m file, --mailcmd=file the external command to be used for mail delivery. The default uses 'sendEmail.pl'. If you are using a different command or script make sure that it has the same parameter interface as sendEmail.pl. =back =head1 CONTENT 1. Description 1.1 Menu commands 1.2 Menu search 1.2.1 Menu edit search 1.2.2 Menu search results 1.3 Extended 'now' and 'next' 1.4 Menu setup 2. Search timers 2.1 'Avoid repeats' - internals 2.2 How do we compare two events? 2.3 How and when do we compare? 3. Usage from other plugins or scripts 4. Using extended EPG info 5. Replacing the standard schedule menu 6. Add-ons =head1 1. Description At first glance EPG-Search looks like the schedules menu entry of VDR. By pressing the key '0', one can toggle the bottom color keys to access additional functions (the default assignment of the color keys can be adjusted by setup): =head2 1.1 Menu Commands This menu displays commands that can be executed on the current item. There are 8 built-in commands: - Repeats: Searches for repeats - Record - Switch - Create search Switches to search menu and adds a new search with the name of the current item (to avoid editing the name manually) - Search in recordings: Search the recordings for a broadcast with the same name - Mark as 'already recorded': This puts the selected event in the file epgsearchdone.data and instructs epgsearch to avoid recording this event if an according search timer is set to "avoid repeats". An already created timer will be automatically removed with the next search timer update. - Add/Remove to/from switch list?: Controls the switch list. If there is an event in the switch list, epgsearch will announce it and switch to the event before it starts. To access the complete switch list, call 'Search/Actions/Switch list'. - Create blacklist: A blacklist is used to ignore events when using search timers. A search timer can be setup to ignore events from arbitrary blacklists. You can add your own commands to this menu by editing the file epgsearchcmds.conf in the epgsearch config directory. There's a sample conf file with some sample commands (see directory 'scripts', taken from vdr-wiki.de, thanks to the authors). The format of the file is the same as VDR's commands.conf or reccmds.conf. When a command is executed the following parameters are passed to it: $1: the title of the EPG entry $2: the start time of the EPG entry as time_t value (like in the shutdown script) $3: the end time $4: the channel number of the EPG entry $5: the long channel name of the EPG entry $6: the subtitle of the EPG entry, "" if not present To execute a command from the main menu you can also press its associated number without opening the commands menu. =head2 1.2 Menu search Here you can add, edit, delete and execute your own queries on the EPG. The usage and behavior of this menu is similar to VDR's timer menu. =head3 1.2.1 Menu edit search Most things in this menu are quite clear, so only some notes on: =over 4 =item - B The term to search for. If you like to search for more words, separate them by blanks. Leaving this empty (combined with search mode 'Phrase') will match anything. This is useful, if you search e.g. for anything that starts between some times on a specific channel. With 'blue' you can also select a template for the new search. If one of the templates is set to default, new searches will automatically get the settings of the default template. Note: fuzzy searching is limited to 32 chars! =item - B 'Phrase' searches for the expression within the EPG. 'All words' requires, that each word of the expression occurs in the EPG item. 'at least one word' requires, that only one word occurs in the EPG item. 'Match exactly' requires, that your search term matches exactly the found title, subtitle or description. With 'Regular expression' you can setup a regular expression as search term. You don't need a leading and trailing '/' in the expression. By default these are POSIX extended regular expressions. If you like to have Herl compatible regular expression, simply edit the plugins Makefile and uncomment '#REGEXLIB = pcre' to 'REGEXLIB = pcre' (you will need pcreposix installed, comes with libpcre from www.pcre.org, but it's already part of most distributions). See also C 'Description of the search process'. =item - B Some providers deliver content descriptors in their EPG, like "Movie/Drama", "Documentation",...(available with vdr-1.7.11) Select here the descriptors to search for. Multiple choice is possible, that must match with all given descriptors (AND operator). =item - B Only available if configured, see below 'Using extended EPG info'. =item - B If set to 'Yes' this tells epgsearch that a missing EPG category should not exclude an event from the results. Caution: Using this without any other criterions could flood your timers. =item - B Search only for events in the given channels interval, channel groups or FTA channels only. Channel groups (e.g. sport channels or Pay-TV channels) can be managed with a sub-menu called with 'blue'. ATTENTION: After changing the channels order please check the settings of your search timers! =item - B Besides the weekdays you can also set up a user-defined selection, e.g. search only on Monday and Friday. You'll find the user-defined selection in the list after Friday. =item - B Blacklists are a way to exclude unwanted events. Select only global, one, more or all blacklists here. If any search result is also contained in one of the selected blacklists it will be skipped. =item - B Only available if turned on in setup. With this option you can mark a search to be used in the favorites menu. The search results of all these searches are listed in the favorites menu. =item - B Only available if you have defined more than one menu template for search results in epgsearchmenu.conf. This option is used to assign a different menu layout for the search results of this search. =item - B If set to yes, the plugin will do a background scan of the EPG in certain intervals and add a timer, if there is a match. You have to activate the 'search timers' in the setup. If set to "user defined" one can specify time margins with key 'blue' where the search timer is active or not. =item - B Default action is creating a timer for the search results. But you can also choose to simply announce the found event via OSD as soon as it is found or to automatically switch to the event before it starts. It's also possible to get an announcement via OSD before the event starts and to switch to its channel with 'Ok'. =item - B If set to yes, the recordings will be stored in a folder with the name of the broadcasting and the recordings itself will have the name of the episode. If there is no episode name, the date and time of the recording will be used. =item - B Here you can assign a directory, where the recording should be stored, e.g. 'SciFi'. Use the key 'blue' to select directory entries already used in other search entries or given by entries in the file epgsearchdirs.conf (simply place your directories here one at each line without the leading video directory, also see MANUAL). If your provider delivers extended EPG infos you can also use variables like "%Genre%" or "%Category%" in your directory entry. These are replaced with the current EPG info, when a timer is created. See also C 'Using variables in the directory entry of a search timer'. =item - B Some recordings should only be kept for a few days, like news. With this feature you can tell epgsearch to delete them automatically after ... days. =item - B If the given numbers of recordings currently exists, then epgsearch will not create further timers. After deleting one or more recordings it will go on generating new timers. =item - B If you don't want to record repeats, this feature tries to check if an event was already recorded/programmed and skips it. Please refer to the section 'Avoid repeats - internals' below before using it. =item - B If you like to accept a certain amount of repeats you can give here their number. =item - B Give here the number of days a repeat has to follow its first broadcast. 0 is equal to no restriction. =item - B When comparing to events then specify here if the title should be compared. =item - B When comparing to events then specify here if the subtitle should be compared. With 'if present' epgsearch will classify two events only as equal if their episode names match and are not empty. =item - B When comparing to events then specify here if the description should be compared. For comparison all parts of the description, that look like a category value, are removed first. The remaining text will be compared. If this is similar at the value of the next option (regarding the Levinshtein-Distance algorithm) then it will be accepted as equal. =item - C The needed minimum match of descriptions in percent. =item - B Sometimes an event is repeated many times within some period (day, week, month,...), but one cannot distinguish the repeats based on the EPG contents. So the only information is its time. To use this for comparison select the appropriate period. =item - B With the button 'setup' you can also specify which categories should be compared. As with subtitles an event is different if it has no according category value. =item - B Each search timer can have its own settings for these parameters. Defaults can be adjusted in the plugins setup. =item - B If set to yes, VPS is used, but only, if activated in VDR's setup menu and if the broadcasting has VPS information. =item - B to automatically delete a search timer if the following is true: * after x recordings, or * after x days after the first recording Only complete recordings are counted. The deletion is executed directly after the correspondig recording =back To toggle the flag 'Use as search timer' without editing the search entry you can use the key '2'. This will call directly the second command of the command menu. =head3 1.2.2 Menu search results This menu displays the search results. A 'T' lets you know, that there is already a timer for the event. A 't' means that there's only a partial timer for it, as in standard schedules menu. =head2 1.3 Extended 'now' and 'next' and favorites By setup, one can add up to 4 additional times to extend the green button, e.g. 'afternoon', 'prime time', 'late night'. Times, that are already passed, are skipped (you will not get 'afternoon' at evening) with the exception that a time will be displayed for the next day, if it is less then 20h in the future. In these menus you can shift the currently displayed time by pressing FastRew or FastFwd to move back and forward in time. If you don't have these keys on your remote, you can access this function by pressing '0' to toggle the green and yellow button to '<<' and '>>'. This toggling can be adjusted by setup. You can display a progress bar in 'now' and 'next'. Furthermore you can enable in the setup an favorites list. You can configure your searchtimers ("Use in favorite list") to display their results in you favorite list. This list display event in the next 24 hours ordered by time. =head2 1.4 Menu setup =head3 1.4.1 General =over 4 =item - B This hides the main menu entry 'search'. Attention: when the plugin is assigned to key 'green' then hiding the plugin will give you VDR's standard schedule menu (see below to avoid this). =item - B
If not hidden, the name of main menu entry can be set here. Default is 'Program guide'. Note: If you set it to something different from the default then the main menu entry is no longer dependent on the OSD language. Setting it back to default or empty restores this behavior again. =item - B Select the starting menu 'Schedules' or 'Now' =back =head3 1.4.2 EPG menus =over 4 =item - B Choose here the behavior of key 'Ok'. You can use it to display the summary or to switch to the corresponding channel. Note: the functionality of key 'blue' (Switch/Info/Search) depends on this setting. =item - B Select if you like to have Standard ('Record') or 'Commands' as assignment for key 'red'. =item - B select if you like to have Standard ('Switch') or 'Search' as assignment for key 'blue'. =item - B In the menu 'what's on now' you can display a progress bar, that displays the progress of the current item. =item - B Select this if you like to have a leading channel number before each item in the EPG menus. =item - B Display channel group separators between channel in the menus 'Overview now',... =item - B Display a day separator between events on different days in the schedule menu. =item - B Also list radio channels. =item - B If you have a large channel set you can speed up things when you limit the displayed channels with this setting. Use '0' to disable the limit. If the current channel is above the limit, the limit is ignored and all channels will be displayed again. =item - B<'One press' timer creation:> If set to 'yes' a timer is immediately created when pressing 'Record', else the timer edit menu is displayed. =item - B Display channels without EPG to allow switching or create a timer. =item - B