summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--epgsearch.cpp142
-rw-r--r--epgsearch.h23
-rw-r--r--pages/edit_searchtimer.ecpp97
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>