summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--epg_events.cpp1
-rw-r--r--epg_events.h8
-rw-r--r--epgsearch.cpp20
-rw-r--r--epgsearch.h3
-rw-r--r--filecache.h1
-rw-r--r--pages/whats_on.ecpp157
-rw-r--r--po/ca_ES.po3
-rw-r--r--po/cs_CZ.po3
-rw-r--r--po/da_DK.po3
-rw-r--r--po/de_DE.po12
-rw-r--r--po/el_GR.po3
-rw-r--r--po/es_ES.po3
-rw-r--r--po/et_EE.po3
-rw-r--r--po/fi_FI.po10
-rw-r--r--po/fr_FR.po10
-rw-r--r--po/hr_HR.po3
-rw-r--r--po/hu_HU.po3
-rw-r--r--po/it_IT.po10
-rw-r--r--po/nl_NL.po6
-rw-r--r--po/nn_NO.po3
-rw-r--r--po/pl_PL.po3
-rw-r--r--po/pt_PT.po3
-rw-r--r--po/ro_RO.po3
-rw-r--r--po/ru_RU.po3
-rw-r--r--po/sl_SI.po3
-rw-r--r--po/sv_SE.po3
-rw-r--r--po/tr_TR.po3
-rw-r--r--recman.cpp1
-rw-r--r--setup.h1
29 files changed, 209 insertions, 79 deletions
diff --git a/epg_events.cpp b/epg_events.cpp
index 2302827..7d22cdf 100644
--- a/epg_events.cpp
+++ b/epg_events.cpp
@@ -1,5 +1,6 @@
#include <time.h>
#include <glob.h>
+#include <algorithm>
#include "tools.h"
#include "recman.h"
diff --git a/epg_events.h b/epg_events.h
index 15e4b36..8678eef 100644
--- a/epg_events.h
+++ b/epg_events.h
@@ -35,6 +35,8 @@ namespace vdrlive
virtual std::string const LongDescr() const = 0;
+ virtual cChannel const * Channel() const { return 0; }
+
virtual std::string const Archived() const { return ""; }
virtual std::string const StartTime(const char* format) const;
@@ -95,7 +97,7 @@ namespace vdrlive
protected:
EpgEvent(std::string const &id,
cEvent const *event,
- char const *channelName = "");
+ char const *channelName);
public:
virtual ~EpgEvent();
@@ -110,8 +112,10 @@ namespace vdrlive
virtual time_t GetEndTime() const { return m_event->EndTime(); }
+ virtual cChannel const * Channel() const { return Channels.GetByChannelID(m_event->ChannelID());}
+
private:
- const cEvent* m_event;
+ cEvent const * m_event;
};
// -------------------------------------------------------------------------
diff --git a/epgsearch.cpp b/epgsearch.cpp
index e905bd9..622ef21 100644
--- a/epgsearch.cpp
+++ b/epgsearch.cpp
@@ -557,10 +557,10 @@ Blacklists::Blacklists()
SearchResult::SearchResult( string const& data )
{
- vector< string > parts = StringSplit( data, ':' );
- try {
- vector< string >::const_iterator part = parts.begin();
- for ( int i = 0; part != parts.end(); ++i, ++part ) {
+ vector< string > parts = StringSplit( data, ':' );
+ try {
+ vector< string >::const_iterator part = parts.begin();
+ for ( int i = 0; part != parts.end(); ++i, ++part ) {
switch ( i ) {
case 0: m_searchId = lexical_cast< int >( *part ); break;
case 1: m_eventId = lexical_cast< u_int32_t >( *part ); break;
@@ -580,6 +580,18 @@ SearchResult::SearchResult( string const& data )
}
}
+const cEvent* SearchResult::GetEvent()
+{
+ cSchedulesLock schedulesLock;
+ const cSchedules* Schedules = cSchedules::Schedules(schedulesLock);
+ if (!Schedules) return NULL;
+ const cChannel *Channel = GetChannel();
+ if (!Channel) return NULL;
+ const cSchedule *Schedule = Schedules->GetSchedule(Channel);
+ if (!Schedule) return NULL;
+ return Schedule->GetEvent(m_eventId);
+}
+
std::set<std::string> SearchResults::querySet;
void SearchResults::GetByID(int id)
diff --git a/epgsearch.h b/epgsearch.h
index 4519490..b63f109 100644
--- a/epgsearch.h
+++ b/epgsearch.h
@@ -339,6 +339,8 @@ public:
time_t TimerStopTime() const { return m_timerstop; }
int TimerMode() const { return m_timerMode; }
bool operator<( SearchResult const& other ) const { return m_starttime < other.m_starttime; }
+ const cEvent* GetEvent();
+ const cChannel* GetChannel() { return Channels.GetByChannelID(m_channel); }
private:
int m_searchId;
@@ -375,6 +377,7 @@ public:
iterator end() { return m_list.end(); }
const_iterator end() const { return m_list.end(); }
+ void merge(SearchResults& r) {m_list.merge(r.m_list); m_list.sort();}
static std::string AddQuery(std::string const& query);
static std::string PopQuery(std::string const& md5);
private:
diff --git a/filecache.h b/filecache.h
index eaf9739..6833193 100644
--- a/filecache.h
+++ b/filecache.h
@@ -1,6 +1,7 @@
#ifndef VDR_LIVE_FILECACHE_H
#define VDR_LIVE_FILECACHE_H
+#include <limits>
#include <numeric>
#include <string>
#include <vector>
diff --git a/pages/whats_on.ecpp b/pages/whats_on.ecpp
index 7331adc..7744b4d 100644
--- a/pages/whats_on.ecpp
+++ b/pages/whats_on.ecpp
@@ -8,6 +8,7 @@
#include "setup.h"
#include "tools.h"
#include "epg_events.h"
+#include "epgsearch.h"
using namespace std;
using namespace vdrlive;
@@ -69,6 +70,8 @@ if (type == "now") {
if (seektime - time(0) + 3600 < 0) // if wanted time is past more then 1h, then use tomorrow
seektime += SECSINDAY;
head = tr("What's running at") + string(" ") + FormatDateTime(tr("%I:%M %p"), seektime) +string(" (") +FormatDateTime(tr("%a, %b %d"), seektime) + string(")");
+} else if (type == "favs") {
+ head = tr("Favorites");
}
</%cpp>
@@ -103,89 +106,121 @@ if (type == "now") {
% }
<%cpp>
EpgEvents epgEvents;
+ std::list<EpgInfoPtr> eventList;
- ReadLock channelsLock( Channels );
- if (channelsLock) {
- // int evntNr = 0;
- for (cChannel *Channel = Channels.First(); Channel && Channel->Number() <= LiveSetup().GetLastChannel(); Channel = Channels.Next(Channel)) {
- if (Channel->GroupSep()) {
- continue;
- }
- const cSchedule *Schedule = Schedules->GetSchedule(Channel);
- if (!Schedule) {
- continue;
- }
- const cEvent *Event = NULL;
- if (type == "now")
- Event = Schedule->GetPresentEvent();
- else if (type == "next")
- Event = Schedule->GetFollowingEvent();
- else if (type == "at")
- Event = Schedule->GetEventAround(seektime);
- if (!Event) {
- continue;
+ // collect the broadcasts
+ if (type != "favs")
+ {
+ ReadLock channelsLock( Channels );
+ if (channelsLock) {
+ // int evntNr = 0;
+ for (cChannel *Channel = Channels.First(); Channel && Channel->Number() <= LiveSetup().GetLastChannel(); Channel = Channels.Next(Channel)) {
+ if (Channel->GroupSep()) {
+ continue;
+ }
+ const cSchedule *Schedule = Schedules->GetSchedule(Channel);
+ if (!Schedule) {
+ continue;
+ }
+ const cEvent *Event = NULL;
+ if (type == "now")
+ Event = Schedule->GetPresentEvent();
+ else if (type == "next")
+ Event = Schedule->GetFollowingEvent();
+ else if (type == "at")
+ Event = Schedule->GetEventAround(seektime);
+ if (!Event) {
+ continue;
+ }
+
+ EpgInfoPtr epgEvent = EpgEvents::CreateEpgInfo(Channel, Event);
+ eventList.push_back(epgEvent);
}
+ }
+ }
+ else // get favorite broadcasts from epgsearch
+ {
+ SearchResults results;
+ SearchTimers timers;
+ for (SearchTimers::iterator timer = timers.begin(); timer != timers.end(); ++timer) {
+ if (!timer->UseInFavorites()) continue;
+ SearchResults curresults;
+ curresults.GetByID(timer->Id());
+ results.merge(curresults);
+ }
+ time_t now = time(NULL);
+ for (SearchResults::iterator result = results.begin(); result != results.end(); ++result) {
+ long diff = result->StartTime() - now;
+ if (labs(diff) >= 24*60*60) continue; // skip broadcasts more than a day away
+ EpgInfoPtr epgEvent = EpgEvents::CreateEpgInfo(result->GetChannel(), result->GetEvent());
+ eventList.push_back(epgEvent);
+ }
+ }
- EpgInfoPtr epgEvent = EpgEvents::CreateEpgInfo(Channel, Event);
+ // display broadcasts
+ for(std::list<EpgInfoPtr>::iterator i = eventList.begin(); i != eventList.end(); ++i ) {
+ EpgInfoPtr epgEvent = *i;
- bool truncated = false;
- string truncDescription = StringWordTruncate(epgEvent->LongDescr(), maximumTooltipHintLength, truncated);
- string longDescription = StringEscapeAndBreak(StringWordTruncate(epgEvent->LongDescr(), maximumDescriptionLength))
- + "<br/><br/>" + tr("Click to view details.");
- bool lastCurrentChanel = true;
+ bool truncated = false;
+ string truncDescription = StringWordTruncate(epgEvent->LongDescr(), maximumTooltipHintLength, truncated);
+ string longDescription = StringEscapeAndBreak(StringWordTruncate(epgEvent->LongDescr(), maximumDescriptionLength))
+ + "<br/><br/>" + tr("Click to view details.");
+ bool lastCurrentChanel = true;
+ const cChannel* Channel = epgEvent->Channel();
+ if (!Channel) continue;
+ int chNumber = Channel->Number();
- if (mode == "detail") {
+ if (mode == "detail") {
</%cpp>
<div class="event">
<div class="station">
- <div><div><div><a href="schedule.html?channel=<$ Channel->Number() $>" <& tooltip.hint text=(tr("View the schedule of this channel")) &>><$ (epgEvent->Caption()) $></a></div></div></div>
+ <div><div><div><a href="schedule.html?channel=<$ chNumber $>" <& tooltip.hint text=(tr("View the schedule of this channel")) &>><$ (epgEvent->Caption()) $></a></div></div></div>
</div>
<div class="content">
<div class="tools">
<& pageelems.epg_tool_box detail=(1) epgid=(epgEvent->Id()) title=(epgEvent->Title()) startTime=(epgEvent->GetStartTime()) endTime=(epgEvent->GetEndTime()) &>
</div>
- <div>
+ <div>
<div class="info"><$ (epgEvent->StartTime(tr("%I:%M %p"))) $> - <$ (epgEvent->EndTime(tr("%I:%M %p"))) $></div>
-% if (epgEvent->Elapsed() >= 0) {
- <div class="progress"><div><& pageelems.progressbar progress=(epgEvent->Elapsed()) &></div></div>
-% }
+% if (epgEvent->Elapsed() >= 0) {
+ <div class="progress"><div><& pageelems.progressbar progress=(epgEvent->Elapsed()) &></div></div>
+% }
<div class="title withmargin"><$ (epgEvent->Title()) $></div>
<div class="short withmargin"><$ (epgEvent->ShortDescr()) $></div>
<div class="description withmargin"><$ truncDescription $></div>
-% if (truncated) {
- <div class="more withmargin"><a <& tooltip.hint text=(longDescription) &><& tooltip.display domId=(epgEvent->Id()) &>><$ tr("more") $> ...</a></div>
-% }
- </div>
+% if (truncated) {
+ <div class="more withmargin"><a <& tooltip.hint text=(longDescription) &><& tooltip.display domId=(epgEvent->Id()) &>><$ tr("more") $> ...</a></div>
+% }
+ </div>
</div>
</div>
<%cpp>
- }
- else { // mode == "list"
- lastCurrentChanel = ((Channel->Number() == LiveSetup().GetLastChannel())
- || (!Channels.Next(Channel)));
+ } else { // mode == "list"
+ lastCurrentChanel = ((chNumber == LiveSetup().GetLastChannel()) || (!Channels.Next(Channel)));
</%cpp>
- <tr>
- <& pageelems.epg_tool_box detail=(0) epgid=(epgEvent->Id()) title=(epgEvent->Title()) startTime=(epgEvent->GetStartTime()) endTime=(epgEvent->GetEndTime()) lastCurrentChanel=(lastCurrentChanel ? 1 : 0) &>
- <td class="topaligned <? lastCurrentChanel ? "bottomrow"?>">
- <div class="withmargin">
- <div class="nomargin"><$ (epgEvent->StartTime(tr("%I:%M %p"))) $> - <$ (epgEvent->EndTime(tr("%I:%M %p"))) $></div>
-% if (epgEvent->Elapsed() >= 0) {
+ <tr>
+ <& pageelems.epg_tool_box detail=(0) epgid=(epgEvent->Id()) title=(epgEvent->Title()) startTime=(epgEvent->GetStartTime()) endTime=(epgEvent->GetEndTime()) lastCurrentChanel=(lastCurrentChanel ? 1 : 0) &>
+ <td class="topaligned <? lastCurrentChanel ? "bottomrow"?>">
+ <div class="withmargin">
+ <div class="nomargin"><$ (epgEvent->StartTime(tr("%I:%M %p"))) $> - <$ (epgEvent->EndTime(tr("%I:%M %p"))) $></div>
+% if (epgEvent->Elapsed() >= 0) {
<div class="progress"><div><& pageelems.progressbar progress=(epgEvent->Elapsed()) &></div></div>
-% }
- </div>
- </td>
- <td class="topaligned <? lastCurrentChanel ? "bottomrow"?>">
- <div class="more withmargin"><a
-% if (!longDescription.empty()) {
+% }
+ </div>
+ </td>
+ <td class="topaligned <? lastCurrentChanel ? "bottomrow"?>">
+ <div class="more withmargin"><a
+% if (!longDescription.empty()) {
<& tooltip.hint text=(longDescription) &><& tooltip.display domId=(epgEvent->Id()) &>
-% }
- ><span class="title"><$ (epgEvent->Title()) $></span><br /><span class="short"><$ (epgEvent->ShortDescr()) $></span></a></div>
- </td>
- <td class="topaligned rightcol <? lastCurrentChanel ? "bottomrow"?>"><div class="station withmargin"><a href="schedule.html?channel=<$ Channel->Number() $>" <& tooltip.hint text=(tr("View the schedule of this channel")) &>><$ (epgEvent->Caption()) $></a></div></td>
- </tr>
-% }
+% }
+ ><span class="title"><$ (epgEvent->Title()) $></span><br /><span class="short"><$ (epgEvent->ShortDescr()) $></span></a>
+ </div>
+ </td>
+ <td class="topaligned rightcol <? lastCurrentChanel ? "bottomrow"?>"><div class="station withmargin"><a href="schedule.html?channel=<$ chNumber $>" <& tooltip.hint text=(tr("View the schedule of this channel")) &>><$ (epgEvent->Caption()) $></a></div>
+ </td>
+ </tr>
+% }
<%cpp>
- }
}
</%cpp>
% if (mode == "list") {
@@ -220,6 +255,10 @@ if (type == "now") {
<span class="<? current_type == "at" && current_fixtime == "" ? "active" ?>"><$ tr("at") $></span>
<input type="text" size="6" name="spectime" id="spectime" value = "<? current_attime != "" ? current_displaytime ?>" onchange="showspectime(this)"/>
<span class="sep">|</span>
+% if ( LiveFeatures< features::epgsearch >().Recent() ) {
+<a class="<? current_type == "favs" ? "active" ?>" href="whats_on.html?type=favs&amp;mode=<$ current_mode $>"><$ tr("Favorites") $></a>
+<span class="sep">|</span>
+% }
% if ( current_mode == "list" ) {
<a href="whats_on.html?mode=detail&amp;type=<$ current_type $>&amp;attime=<$ current_attime $>&amp;fixtime=<$ current_fixtime $>"><$ tr("Details view") $></a>
% } else {
diff --git a/po/ca_ES.po b/po/ca_ES.po
index 0550b9b..14ce49c 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
@@ -727,6 +727,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index eac3ec5..03f55f9 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/da_DK.po b/po/da_DK.po
index 493269c..4e49989 100644
--- a/po/da_DK.po
+++ b/po/da_DK.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/de_DE.po b/po/de_DE.po
index 027c1f9..aca8929 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -109,8 +109,9 @@ msgstr ""
msgid "Couldn't grab image from primary device"
msgstr ""
+#, fuzzy
msgid "channels"
-msgstr "Kanäle"
+msgstr "Kanal"
msgid "Couldn't aquire access to channels, please try again later."
msgstr ""
@@ -566,7 +567,7 @@ msgid "If you encounter any bugs or would like to suggest new features, please u
msgstr "Für Fehler oder Verbesserungsvorschläge steht unser Bugtracker bereit"
msgid "RecDate"
-msgstr "Aufnahmedatum"
+msgstr ""
msgid "List of recordings"
msgstr "Liste der Aufnahmen"
@@ -727,6 +728,9 @@ msgstr "Was läuft als nächstes?"
msgid "%a, %b %d"
msgstr "%a, %d.%m."
+msgid "Favorites"
+msgstr "Favoriten"
+
msgid "View the schedule of this channel"
msgstr "Zeige Programm dieses Kanals"
@@ -750,7 +754,3 @@ msgstr "Ausführliche Ansicht"
msgid "List view"
msgstr "Listenansicht"
-
-#, fuzzy
-#~ msgid "Watch channel"
-#~ msgstr "bis Kanal"
diff --git a/po/el_GR.po b/po/el_GR.po
index bdd434b..ad18553 100644
--- a/po/el_GR.po
+++ b/po/el_GR.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/es_ES.po b/po/es_ES.po
index 8c5b283..626c3b2 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/et_EE.po b/po/et_EE.po
index f397711..53b2f6e 100644
--- a/po/et_EE.po
+++ b/po/et_EE.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/fi_FI.po b/po/fi_FI.po
index af98e7d..664b2e0 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -107,8 +107,9 @@ msgstr "Ensisijaisen DVB-sovittimen käyttäminen epäonnistui!"
msgid "Couldn't grab image from primary device"
msgstr "Kuvan kaappaus ensisijaiselta DVB-sovittimelta epäonnistui!"
+#, fuzzy
msgid "channels"
-msgstr "kanavat"
+msgstr "Kanava"
msgid "Couldn't aquire access to channels, please try again later."
msgstr "Kanavien käyttäminen epäonnistui! Yritä myöhemmin uudelleen."
@@ -725,6 +726,9 @@ msgstr "Tulossa seuraavaksi?"
msgid "%a, %b %d"
msgstr "%a, %d.%m."
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr "Näytä ohjelmisto kanavalta"
@@ -750,5 +754,5 @@ msgid "List view"
msgstr "Listanäkymä"
#, fuzzy
-#~ msgid "Watch channel"
-#~ msgstr "Katso kanavaa"
+#~ msgid "hours"
+#~ msgstr "Tekijät"
diff --git a/po/fr_FR.po b/po/fr_FR.po
index 50c41c8..878eb36 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -111,8 +111,9 @@ msgstr ""
msgid "Couldn't grab image from primary device"
msgstr ""
+#, fuzzy
msgid "channels"
-msgstr ""
+msgstr "à la chaîne"
msgid "Couldn't aquire access to channels, please try again later."
msgstr ""
@@ -730,6 +731,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr "%a, %d.%m."
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr "Regarder le programme de cette chaîne"
@@ -755,5 +759,9 @@ msgid "List view"
msgstr "Vue en liste"
#, fuzzy
+#~ msgid "hours"
+#~ msgstr "Auteur"
+
+#, fuzzy
#~ msgid "Watch channel"
#~ msgstr "à la chaîne"
diff --git a/po/hr_HR.po b/po/hr_HR.po
index 5747739..cd7c9a7 100644
--- a/po/hr_HR.po
+++ b/po/hr_HR.po
@@ -726,6 +726,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 88095e4..b184d56 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -726,6 +726,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/it_IT.po b/po/it_IT.po
index 9a2ef99..b8cab02 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -110,8 +110,9 @@ msgstr "Impossibile identificare scheda primaria"
msgid "Couldn't grab image from primary device"
msgstr "Impossibile ottenere immagine da scheda primaria"
+#, fuzzy
msgid "channels"
-msgstr "canali"
+msgstr "Canale"
msgid "Couldn't aquire access to channels, please try again later."
msgstr "Impossibile avere accesso ai canali, per favore riprova più tardi."
@@ -728,6 +729,9 @@ msgstr "Cosa c'è dopo?"
msgid "%a, %b %d"
msgstr "%a, %b %d"
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr "Visualizza scheda programmi del canale"
@@ -753,5 +757,5 @@ msgid "List view"
msgstr "Vedi come elenco"
#, fuzzy
-#~ msgid "Watch channel"
-#~ msgstr "a canale"
+#~ msgid "hours"
+#~ msgstr "Autori"
diff --git a/po/nl_NL.po b/po/nl_NL.po
index 971c65d..b20f4c7 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
@@ -110,8 +110,9 @@ msgstr ""
msgid "Couldn't grab image from primary device"
msgstr ""
+#, fuzzy
msgid "channels"
-msgstr ""
+msgstr "tot kanaal"
msgid "Couldn't aquire access to channels, please try again later."
msgstr ""
@@ -729,6 +730,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/nn_NO.po b/po/nn_NO.po
index 49e8364..011a4d9 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
@@ -726,6 +726,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/pl_PL.po b/po/pl_PL.po
index 35b36e6..032af70 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/pt_PT.po b/po/pt_PT.po
index ad1849e..05c1fd3 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/ro_RO.po b/po/ro_RO.po
index 613f83b..3344a02 100644
--- a/po/ro_RO.po
+++ b/po/ro_RO.po
@@ -726,6 +726,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 38bf7e6..be5b7f5 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/sl_SI.po b/po/sl_SI.po
index b098bf9..201075d 100644
--- a/po/sl_SI.po
+++ b/po/sl_SI.po
@@ -726,6 +726,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/sv_SE.po b/po/sv_SE.po
index 261fe07..5e4e142 100644
--- a/po/sv_SE.po
+++ b/po/sv_SE.po
@@ -726,6 +726,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/po/tr_TR.po b/po/tr_TR.po
index a9fd8eb..7f55001 100644
--- a/po/tr_TR.po
+++ b/po/tr_TR.po
@@ -725,6 +725,9 @@ msgstr ""
msgid "%a, %b %d"
msgstr ""
+msgid "Favorites"
+msgstr ""
+
msgid "View the schedule of this channel"
msgstr ""
diff --git a/recman.cpp b/recman.cpp
index eb993d5..153e9dd 100644
--- a/recman.cpp
+++ b/recman.cpp
@@ -4,6 +4,7 @@
#include <sstream>
#include <fstream>
#include <stack>
+#include <algorithm>
#include "stdext.h"
#include "tools.h"
diff --git a/setup.h b/setup.h
index 6fffa80..17edf4e 100644
--- a/setup.h
+++ b/setup.h
@@ -2,6 +2,7 @@
#define VDR_LIVE_SETUP_H
#include <list>
+#include <limits>
#include <numeric>
#include <string>
#include "live.h"