diff options
-rw-r--r-- | epgsearch.cpp | 142 | ||||
-rw-r--r-- | epgsearch.h | 23 | ||||
-rw-r--r-- | pages/edit_searchtimer.ecpp | 97 |
3 files changed, 211 insertions, 51 deletions
diff --git a/epgsearch.cpp b/epgsearch.cpp index 9a4314c..94d1722 100644 --- a/epgsearch.cpp +++ b/epgsearch.cpp @@ -43,36 +43,50 @@ SearchTimer::SearchTimer() void SearchTimer::Init() { - m_id = -1; - m_useTime = false; - m_startTime = 0; - m_stopTime = 0; - m_useChannel = NoChannel; - m_useCase = false; - m_mode = 0; - m_useTitle = true; - m_useSubtitle = true; - m_useDescription = true; - m_useDuration = false; - m_minDuration = 0; - m_maxDuration = 0; - m_useDayOfWeek = false; - m_dayOfWeek = 0; - m_useEpisode = false; - m_priority = lexical_cast< int >(EPGSearchSetupValues::ReadValue("DefPriority")); - m_lifetime = lexical_cast< int >(EPGSearchSetupValues::ReadValue("DefLifetime")); - m_fuzzytolerance = 1; - m_useInFavorites = false; - m_useAsSearchtimer = false; - m_action = 0; - m_delAfterDays = 0; - m_recordingsKeep = 0; - m_pauseOnNrRecordings = 0; - m_switchMinBefore = 1; - m_useExtEPGInfo = false; - m_useVPS = false; - m_marginstart = lexical_cast< int >(EPGSearchSetupValues::ReadValue("DefMarginStart")); - m_marginstop = lexical_cast< int >(EPGSearchSetupValues::ReadValue("DefMarginStop")); + m_id = -1; + m_useTime = false; + m_startTime = 0; + m_stopTime = 0; + m_useChannel = NoChannel; + m_useCase = false; + m_mode = 0; + m_useTitle = true; + m_useSubtitle = true; + m_useDescription = true; + m_useDuration = false; + m_minDuration = 0; + m_maxDuration = 0; + m_useDayOfWeek = false; + m_dayOfWeek = 0; + m_useEpisode = false; + m_priority = lexical_cast< int >(EPGSearchSetupValues::ReadValue("DefPriority")); + m_lifetime = lexical_cast< int >(EPGSearchSetupValues::ReadValue("DefLifetime")); + m_fuzzytolerance = 1; + m_useInFavorites = false; + m_useAsSearchtimer = 0; + m_action = 0; + m_delAfterDays = 0; + m_recordingsKeep = 0; + m_pauseOnNrRecordings = 0; + m_switchMinBefore = 1; + m_useExtEPGInfo = false; + m_useVPS = false; + m_marginstart = lexical_cast< int >(EPGSearchSetupValues::ReadValue("DefMarginStart")); + m_marginstop = lexical_cast< int >(EPGSearchSetupValues::ReadValue("DefMarginStop")); + m_avoidrepeats = false; + m_allowedrepeats = 0; + m_compareTitle = false; + m_compareSubtitle = false; + m_compareSummary = false; + m_repeatsWithinDays = 0; + m_blacklistmode = 0; + m_menuTemplate = 0; + m_delMode = 0; + m_delAfterCountRecs = 0; + m_delAfterDaysOfFirstRec = 0; + m_useAsSearchTimerFrom = 0; + m_useAsSearchTimerTil = 0; + m_catvaluesAvoidRepeat = 0; } SearchTimer::SearchTimer( string const& data ) @@ -98,7 +112,7 @@ SearchTimer::SearchTimer( string const& data ) case 12: m_useDuration = lexical_cast< bool >( *part ); break; case 13: if ( m_useDuration ) m_minDuration = lexical_cast< int >( *part ); break; case 14: if ( m_useDuration ) m_maxDuration = lexical_cast< int >( *part ); break; - case 15: m_useAsSearchtimer = lexical_cast< bool >( *part ); break; + case 15: m_useAsSearchtimer = lexical_cast< int >( *part ); break; case 16: m_useDayOfWeek = lexical_cast< bool >( *part ); break; case 17: m_dayOfWeek = lexical_cast< int >( *part ); break; case 18: m_useEpisode = lexical_cast< bool >( *part ); break; @@ -116,7 +130,7 @@ SearchTimer::SearchTimer( string const& data ) case 30: m_compareTitle = lexical_cast< bool >( *part ); break; case 31: m_compareSubtitle = lexical_cast< bool >( *part ); break; case 32: m_compareSummary = lexical_cast< bool >( *part ); break; - case 33: m_catvaluesAvoidRepeat = lexical_cast< unsigned long >( *part ); break; + case 33: m_catvaluesAvoidRepeat = lexical_cast< long >( *part ); break; case 34: m_repeatsWithinDays = lexical_cast< int >( *part ); break; case 35: m_delAfterDays = lexical_cast< int >( *part ); break; case 36: m_recordingsKeep = lexical_cast< int >( *part ); break; @@ -127,6 +141,11 @@ SearchTimer::SearchTimer( string const& data ) case 41: m_fuzzytolerance = lexical_cast< int >( *part ); break; case 42: m_useInFavorites = lexical_cast< bool >( *part ); break; case 43: m_menuTemplate = lexical_cast< int >( *part ); break; + case 44: m_delMode = lexical_cast< int >( *part ); break; + case 45: m_delAfterCountRecs = lexical_cast< int >( *part ); break; + case 46: m_delAfterDaysOfFirstRec = lexical_cast< int >( *part ); break; + case 47: m_useAsSearchTimerFrom = lexical_cast< time_t >( *part ); break; + case 48: m_useAsSearchTimerTil = lexical_cast< time_t >( *part ); break; } } } catch ( bad_lexical_cast const& ex ) { @@ -209,7 +228,7 @@ std::string SearchTimer::ToText() << (m_useDuration?1:0) << ":" << tmp_minDuration << ":" << tmp_maxDuration << ":" - << (m_useAsSearchtimer?1:0) << ":" + << m_useAsSearchtimer << ":" << (m_useDayOfWeek?1:0) << ":" << m_dayOfWeek << ":" << (m_useEpisode?1:0) << ":" @@ -237,7 +256,12 @@ std::string SearchTimer::ToText() << tmp_blacklists << ":" << m_fuzzytolerance << ":" << (m_useInFavorites?1:0) << ":" - << m_menuTemplate << ":"; + << m_menuTemplate << ":" + << m_delMode << ":" + << m_delAfterCountRecs << ":" + << m_delAfterDaysOfFirstRec << ":" + << (long) m_useAsSearchTimerFrom << ":" + << (long) m_useAsSearchTimerTil; return os.str(); } @@ -293,6 +317,54 @@ string SearchTimer::StopTimeFormatted() return FormatDateTime(tr("%I:%M %p"), stop); } +// format is in datepicker format ('mm' for month, 'dd' for day, 'yyyy' for year) +string DatePickerToC(time_t date, string const& format) +{ + if (date == 0) return ""; + string cformat = format; + cformat = StringReplace(cformat, "mm", "%m"); + cformat = StringReplace(cformat, "dd", "%d"); + cformat = StringReplace(cformat, "yyyy", "%Y"); + return FormatDateTime(cformat.c_str(), date); +} + +string SearchTimer::UseAsSearchTimerFrom(string const& format) +{ + return DatePickerToC(m_useAsSearchTimerFrom, format); +} + +string SearchTimer::UseAsSearchTimerTil(string const& format) +{ + return DatePickerToC(m_useAsSearchTimerTil, format); +} + +time_t GetDateFromDatePicker(std::string const& datestring, std::string const& format) +{ + if (datestring.empty()) + return 0; + int year = lexical_cast< int >(datestring.substr(format.find("yyyy"), 4)); + int month = lexical_cast< int >(datestring.substr(format.find("mm"), 2)); + int day = lexical_cast< int >(datestring.substr(format.find("dd"), 2)); + struct tm tm_r; + tm_r.tm_year = year - 1900; + tm_r.tm_mon = month -1; + tm_r.tm_mday = day; + tm_r.tm_hour = tm_r.tm_min = tm_r.tm_sec = 0; + tm_r.tm_isdst = -1; // makes sure mktime() will determine the correct DST setting + return mktime(&tm_r); +} + +void SearchTimer::SetUseAsSearchTimerFrom(std::string const& datestring, std::string const& format) +{ + m_useAsSearchTimerFrom = GetDateFromDatePicker(datestring, format); +} + +void SearchTimer::SetUseAsSearchTimerTil(std::string const& datestring, std::string const& format) +{ + m_useAsSearchTimerTil = GetDateFromDatePicker(datestring, format); +} + + SearchTimers::SearchTimers() { Reload(); @@ -344,7 +416,7 @@ bool SearchTimers::ToggleActive(std::string const& id) { SearchTimer* search = GetByTimerId( id ); if (!search) return false; - search->SetUseAsSearchTimer(!search->UseAsSearchTimer()); + search->SetUseAsSearchTimer(search->UseAsSearchTimer()==1?0:1); return Save(search); } diff --git a/epgsearch.h b/epgsearch.h index c882eed..fd47496 100644 --- a/epgsearch.h +++ b/epgsearch.h @@ -63,8 +63,8 @@ public: void SetChannelMax(tChannelID channelMax) { m_channelMax = channelMax; } std::string ChannelText() const { return m_channels; } void SetChannelText(std::string channels) { m_channels = channels; } - bool UseAsSearchTimer() const { return m_useAsSearchtimer; } - void SetUseAsSearchTimer(bool useAsSearchtimer) { m_useAsSearchtimer = useAsSearchtimer; } + int UseAsSearchTimer() const { return m_useAsSearchtimer; } + void SetUseAsSearchTimer(int useAsSearchtimer) { m_useAsSearchtimer = useAsSearchtimer; } bool UseDuration() const { return m_useDuration; } void SetUseDuration(bool useDuration) { m_useDuration = useDuration; } int MinDuration() const { return m_minDuration; } @@ -123,7 +123,17 @@ public: void SetMarginStop(int marginstop) { m_marginstop = marginstop; } bool UseVPS() const { return m_useVPS; } void SetUseVPS(bool useVPS) { m_useVPS = useVPS; } - + int DelMode() const { return m_delMode; } + void SetDelMode(int delMode) { m_delMode = delMode; } + int DelAfterCountRecs() const { return m_delAfterCountRecs; } + void SetDelAfterCountRecs(int delAfterCountRecs) { m_delAfterCountRecs = delAfterCountRecs; } + int DelAfterDaysOfFirstRec() const { return m_delAfterDaysOfFirstRec; } + void SetDelAfterDaysOfFirstRec(int delAfterDaysOfFirstRec) { m_delAfterDaysOfFirstRec = delAfterDaysOfFirstRec; } + std::string UseAsSearchTimerFrom(std::string const& format); + void SetUseAsSearchTimerFrom(std::string const& datestring, std::string const& format); + std::string UseAsSearchTimerTil(std::string const& format); + void SetUseAsSearchTimerTil(std::string const& datestring, std::string const& format); + private: int m_id; std::string m_search; @@ -149,7 +159,7 @@ private: int m_lifetime; int m_fuzzytolerance; bool m_useInFavorites; - bool m_useAsSearchtimer; + int m_useAsSearchtimer; int m_action; std::string m_directory; int m_delAfterDays; @@ -171,6 +181,11 @@ private: std::vector< std::string > m_blacklistIDs; int m_menuTemplate; unsigned long m_catvaluesAvoidRepeat; + int m_delMode; + int m_delAfterCountRecs; + int m_delAfterDaysOfFirstRec; + time_t m_useAsSearchTimerFrom; + time_t m_useAsSearchTimerTil; void ParseChannel( std::string const& data ); void ParseChannelIDs( std::string const& data ); diff --git a/pages/edit_searchtimer.ecpp b/pages/edit_searchtimer.ecpp index 9fd1c02..5f1ab1c 100644 --- a/pages/edit_searchtimer.ecpp +++ b/pages/edit_searchtimer.ecpp @@ -50,7 +50,7 @@ using namespace vdrlive; bool wday_sat = false; bool wday_sun = false; bool useinfavorites = false; - bool useassearchtimer = false; + int useassearchtimer = 0; int searchtimeraction = 0; bool seriesrecording = false; string directory = ""; @@ -74,7 +74,12 @@ using namespace vdrlive; int marginstart = 0; int marginstop = 0; bool usevps = false; + bool delmode = false; + int delaftercountrecs = 0; + int delafterdaysoffirstrec = 0; string blacklistids_internal; + string useassearchtimerfrom; + string useassearchtimerto; </%args> <%session scope="global"> bool logged_in(false); @@ -164,6 +169,11 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); } searchtimer.SetUseInFavorites(useinfavorites); searchtimer.SetUseAsSearchTimer(useassearchtimer); + if (useassearchtimer == 2) + { + searchtimer.SetUseAsSearchTimerFrom(useassearchtimerfrom, tr("mm/dd/yyyy")); + searchtimer.SetUseAsSearchTimerTil(useassearchtimerto, tr("mm/dd/yyyy")); + } searchtimer.SetSearchTimerAction(searchtimeraction); searchtimer.SetUseSeriesRecording(seriesrecording); searchtimer.SetDirectory(directory); @@ -193,7 +203,12 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); searchtimer.SetMarginStart(marginstart); searchtimer.SetMarginStop(marginstop); searchtimer.SetUseVPS(usevps); - + searchtimer.SetDelMode(delmode); + if (delmode) + { + searchtimer.SetDelAfterCountRecs(delaftercountrecs); + searchtimer.SetDelAfterDaysOfFirstRec(delafterdaysoffirstrec); + } if (!testmode) { searchtimers.Save(&searchtimer); @@ -273,6 +288,11 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); } useinfavorites = searchtimer->UseInFavorites(); useassearchtimer = searchtimer->UseAsSearchTimer(); + if (useassearchtimer == 2) + { + useassearchtimerfrom = searchtimer->UseAsSearchTimerFrom(tr("mm/dd/yyyy")); + useassearchtimerto = searchtimer->UseAsSearchTimerTil(tr("mm/dd/yyyy")); + } searchtimeraction = searchtimer->SearchTimerAction(); seriesrecording = searchtimer->UseSeriesRecording(); directory = searchtimer->Directory(); @@ -309,6 +329,10 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); marginstart = searchtimer->MarginStart(); marginstop = searchtimer->MarginStop(); usevps = searchtimer->UseVPS(); + delmode = searchtimer->DelMode(); + delaftercountrecs = searchtimer->DelAfterCountRecs(); + delafterdaysoffirstrec = searchtimer->DelAfterDaysOfFirstRec(); + editsearchtimer = searchtimer; } else @@ -330,10 +354,11 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); <html> <head> <title>VDR Live - <$ editsearchtimer ? tr("Edit search timer") : tr("New search timer") $></title> + <& pageelems.stylesheets &> <& pageelems.ajax_js &> - <script type="text/javascript"><!-- + <script type="text/javascript"> function initform() { changedsearchmode(document.getElementById("search_mode")); @@ -347,6 +372,7 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); % } changedavoidrepeats(document.getElementById("avoidrepeats")); changedblacklistmode(document.getElementById("blacklistmode")); + changeddelmode(document.getElementById("delmode")); } function checksearch() @@ -384,18 +410,23 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); function changeduseassearchtimer(selection) { - document.getElementById("searchtimermodesettings").style.display = (selection.checked ? "block" : "none"); + document.getElementById("searchtimermodesettings").style.display = + (selection.options[selection.selectedIndex].value > 0) ? "block" : "none"; + document.getElementById("useassearchtimeruserdef").style.display = + (selection.options[selection.selectedIndex].value == 2) ? "block" : "none"; changedsearchtimermode(document.getElementById("searchtimer_mode")); } function changedsearchtimermode(selection) { - document.getElementById("searchtimermode1settings").style.display = - (selection.options[selection.selectedIndex].value == 0 & - document.getElementById("useassearchtimer").checked ? "block" : "none"); - document.getElementById("searchtimermode3settings").style.display = - (selection.options[selection.selectedIndex].value == 2 & - document.getElementById("useassearchtimer").checked ? "block" : "none"); + document.getElementById("searchtimermode1settings").style.display = + (selection.options[selection.selectedIndex].value == 0 & + document.getElementById("useassearchtimer").options[document.getElementById("useassearchtimer").selectedIndex].value > 0) ? + "block" : "none"; + document.getElementById("searchtimermode3settings").style.display = + (selection.options[selection.selectedIndex].value == 2 & + document.getElementById("useassearchtimer").options[document.getElementById("useassearchtimer").selectedIndex].value > 0) ? + "block" : "none"; } function changeduseextepginfo(selection) @@ -447,7 +478,12 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); { document.getElementById("directory").value = selection.value; } + function changeddelmode(selection) + { + document.getElementById("delmodesettings").style.display = (selection.checked ? "block" : "none"); + } //--></script> + </head> <body onload="initform()"> <& pageelems.logo &> @@ -642,7 +678,7 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); <div class="dotted"><input type="checkbox" name="wday_fri" value="1" <{ CHECKIF(wday_fri) }> /> <$ tr("Friday") $></div> <div class="dotted"><input type="checkbox" name="wday_sat" value="1" <{ CHECKIF(wday_sat) }> /> <$ tr("Saturday") $></div> <div class="dotted"><input type="checkbox" name="wday_sun" value="1" <{ CHECKIF(wday_sun) }> /> <$ tr("Sunday") $></div> - <br style="clear: both" /><!-- Der muss da sein damit die Höhenberechnung klappt. Glaubt mir, ist so. --> + <br style="clear: both" /><!-- Der muss da sein damit die H�henberechnung klappt. Glaubt mir, ist so. --> </div> </td> </tr> @@ -679,7 +715,23 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); <td class="label leftcol"><div class="withmargin"><$ tr("Use as search timer" ) $>:</div></td> <td class="rightcol"> <div> - <input type="checkbox" name="useassearchtimer" value="1" <{ CHECKIF(useassearchtimer) }> onclick="changeduseassearchtimer(this)" id="useassearchtimer"/> + <select onchange="changeduseassearchtimer(this)" name="useassearchtimer" size="1" id="useassearchtimer"> + <option value="0" <{ SELECTIF(useassearchtimer == 0) }> ><$ tr("no") $></option> + <option value="1" <{ SELECTIF(useassearchtimer == 1) }> ><$ tr("yes") $></option> + <option value="2" <{ SELECTIF(useassearchtimer == 2) }> ><$ tr("user defined") $></option> + </select> + </div> + <div id="useassearchtimeruserdef" style="display: none"> + <table class="dependent" border="0" cellpadding="0" cellspacing="0"> + <tr> + <td class="label"><div class="withmargin"><$ tr("from date") $>:</div></td> + <td><input id="datefrom" name="useassearchtimerfrom" type="text" class="DatePicker" value="<$ useassearchtimerfrom $>" /></td> + </tr> + <tr> + <td class="label"><div class="withmargin"><$ tr("to date") $>:</div></td> + <td><input id="dateto" name="useassearchtimerto" type="text" class="DatePicker"}" value="<$ useassearchtimerto $>" /></td> + </tr> + </table> </div> <div id="searchtimermodesettings" style="display: none"> <select onchange="changedsearchtimermode(this)" name="searchtimeraction" size="1" id="searchtimer_mode"> @@ -785,6 +837,27 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html"); <td class="label"><div class="withmargin"><$ tr("Use VPS") $>:</div></td> <td><input type="checkbox" name="usevps" value="1" <{ CHECKIF(usevps) }>/></td> </tr> + <tr> + <td class="label"><div class="withmargin"><$ tr("Auto-delete search timer") $>:</div></td> + <td><input type="checkbox" name="delmode" value="1" <{ CHECKIF(delmode) }> onclick="changeddelmode(this)" id="delmode"/> + <div id="delmodesettings" style="display: none"> + <table class="dependent" border="0" cellpadding="0" cellspacing="0" class="dependent"> + <tr> + <td class="label"><div class="withmargin"><$ tr("after ... recordings") $>:</div></td> + <td> + <input type="text" size="3" maxlength="3" name="delaftercountrecs" value="<$ delaftercountrecs $>" /> + </td> + </tr> + <tr> + <td class="label"><div class="withmargin"><$ tr("after ... days after first rec.") $>:</div></td> + <td> + <input type="text" size="3" maxlength="3" name="delafterdaysoffirstrec" value="<$ delafterdaysoffirstrec $>" /> + </td> + </tr> + </table> + </div> + </td> + </tr> </table> </div> |