diff --git a/data/cables.xml b/data/cables.xml
index ea6f28f32..6ea231499 100644
--- a/data/cables.xml
+++ b/data/cables.xml
@@ -1417,6 +1417,7 @@
+
diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale
index 584c118b7..22d576738 100644
--- a/data/locale/deutsch.locale
+++ b/data/locale/deutsch.locale
@@ -1039,6 +1039,7 @@ menu.hint_record_data_vtxt Teletext-Spur zu Aufnahme hinzufügen
menu.hint_record_dir Wählen Sie das Aufnahmeverzeichnis
menu.hint_record_end Wählen Sie zwischen maximaler Aufnahmezeit oder einem Aufnahmeende anhand der EPG-Daten
menu.hint_record_slow_warn Zeige Warnung, wenn der Aufnahmepuffer zu überlaufen droht
+menu.hint_record_startstop_msg Schaltet die Meldung bei Aufnahmestart/ende ein oder aus.
menu.hint_record_tdir Wählen Sie ein Verzeichnis für Ihre Timeshift-Aufnahmen im temporären Timeshift-Modus
menu.hint_record_time Geben Sie eine maximale Aufnahmezeit in Stunden ein, wenn Sie die Aufnahme nicht vorzeitig stoppen
menu.hint_record_timeafter Stellen Sie die Nachlaufzeit für Timer-Aufnahmen ein\nEin Wert von 2 beendet die Aufnahme 2 Minuten nach dem Sendungsende
@@ -1657,6 +1658,7 @@ rclock.title Fernbedienung sperren
rclock.unlockmsg Fernbedienung reaktiviert...
recording.is_running Folgende Aufnahme läuft bereits! Neue Aufnahme starten?
recording.start Starte Aufnahme, bitte warten...!
+recording.startstop_msg Meldung bei Aufnahme Start/Ende
recording.stop Beende Aufnahme, bitte warten...!
recording.time_hour Stunde
recording.time_hours Stunden
diff --git a/data/locale/english.locale b/data/locale/english.locale
index 569fd7169..acd442a5c 100644
--- a/data/locale/english.locale
+++ b/data/locale/english.locale
@@ -718,6 +718,7 @@ lcdmenu.dim_brightness Brightness after dim timeout
lcdmenu.dim_time Dim timeout
lcdmenu.head VFD Settings
lcdmenu.lcdcontroler Brightness
+lcdmenu.scroll Enable text scroll
lcdmenu.statusline status line
lcdmenu.statusline.both volume / playtime
lcdmenu.statusline.playtime playtime
@@ -1039,6 +1040,7 @@ menu.hint_record_data_vtxt VideoText stream
menu.hint_record_dir Select directory to store recordings
menu.hint_record_end Stop direct record after maximal time or after current event end time
menu.hint_record_slow_warn Show warning, when record buffer is close to overflow
+menu.hint_record_startstop_msg Turns the message when recording start/end on or off.
menu.hint_record_tdir Select directory to save timeshift recordings\nin temporary timeshift mode
menu.hint_record_time Record time before stop when\nusing direct record with record button
menu.hint_record_timeafter Stop record after event end\nin minutes
@@ -1172,6 +1174,7 @@ menu.hint_vfd_brightnessstandby Brightness in soft-standby mode
menu.hint_vfd_defaults Restore default brightness values
menu.hint_vfd_dimtime Auto-dim time, in seconds
menu.hint_vfd_infoline Choose what to display in main VFD line
+menu.hint_vfd_scroll Enable or disable text scrolling on VFD
menu.hint_vfd_statusline Choose what to display in short\nVFD status line
menu.hint_video Video output, resolution, format\nAspect ratio, fast mode switch options
menu.hint_video_43mode Display mode for 4:3 content\non 16:9 TV
@@ -1657,6 +1660,7 @@ rclock.title Lock Remote Control
rclock.unlockmsg Remote control reactivated.
recording.is_running This channel already recording. Start new record?
recording.start Start recording, please wait...!
+recording.startstop_msg Message when recording is start/stop
recording.stop Stop recording, please wait...!
recording.time_hour hour
recording.time_hours hours
diff --git a/src/driver/record.cpp b/src/driver/record.cpp
index 8962b183d..6d8a8f6b1 100644
--- a/src/driver/record.cpp
+++ b/src/driver/record.cpp
@@ -148,7 +148,7 @@ record_error_msg_t CRecordInstance::Start(CZapitChannel * channel)
time_t msg_start_time = time(0);
CHintBox hintBox(LOCALE_MESSAGEBOX_INFO, g_Locale->getText(LOCALE_RECORDING_START));
- if (!(autoshift && g_settings.auto_timeshift))
+ if ((!(autoshift && g_settings.auto_timeshift)) && g_settings.recording_startstop_msg)
hintBox.paint();
tsfile = std::string(filename) + ".ts";
@@ -255,7 +255,7 @@ bool CRecordInstance::Stop(bool remove_event)
recMovieInfo->length = (end_time - start_time + 30) / 60;
CHintBox hintBox(LOCALE_MESSAGEBOX_INFO, rec_stop_msg.c_str());
- if (!(autoshift && g_settings.auto_timeshift))
+ if ((!(autoshift && g_settings.auto_timeshift)) && g_settings.recording_startstop_msg)
hintBox.paint();
printf("%s: channel %" PRIx64 " recording_id %d\n", __func__, channel_id, recording_id);
@@ -559,7 +559,17 @@ void CRecordInstance::FillMovieInfo(CZapitChannel * channel, APIDList & apid_lis
tmpstring = "not available";
if (epgid != 0) {
CEPGData epgdata;
- if (CEitManager::getInstance()->getEPGid(epgid, epg_time, &epgdata)) {
+ bool epg_ok = CEitManager::getInstance()->getEPGid(epgid, epg_time, &epgdata);
+ if(!epg_ok){//if old epgid removed check currurrent epgid
+ epg_ok = CEitManager::getInstance()->getActualEPGServiceKey(channel_id, &epgdata );
+
+ if(epg_ok && !epgTitle.empty()){
+ std::string tmp_title = epgdata.title;
+ if(epgTitle != tmp_title)
+ epg_ok = false;
+ }
+ }
+ if (epg_ok) {
tmpstring = epgdata.title;
info1 = epgdata.info1;
info2 = epgdata.info2;
@@ -571,6 +581,8 @@ void CRecordInstance::FillMovieInfo(CZapitChannel * channel, APIDList & apid_lis
recMovieInfo->length = epgdata.epg_times.dauer / 60;
printf("fsk:%d, Genre:%d, Dauer: %d\r\n",recMovieInfo->parentalLockAge,recMovieInfo->genreMajor,recMovieInfo->length);
+ } else if (!epgTitle.empty()) {//if old epgid removed
+ tmpstring = epgTitle;
}
} else if (!epgTitle.empty()) {
tmpstring = epgTitle;
diff --git a/src/driver/vfd.cpp b/src/driver/vfd.cpp
index cf7063b78..e6bdd5d8a 100644
--- a/src/driver/vfd.cpp
+++ b/src/driver/vfd.cpp
@@ -41,6 +41,9 @@
#include
#include
+#include
+#include
+
#include
extern CRemoteControl * g_RemoteControl; /* neutrino.cpp */
@@ -697,29 +700,23 @@ void CVFD::ShowIcon(fp_icon icon, bool show)
perror(show ? "IOC_FP_SET_ICON" : "IOC_FP_CLEAR_ICON");
}
-void CVFD::ShowText(const char *str)
+void CVFD::ShowText(const char * str)
{
- int len = strlen(str);
- int i = 0, ret;
+ char flags[2] = { FP_FLAG_ALIGN_LEFT, 0 };
-printf("CVFD::ShowText: [%s]\n", str);
- if (len > 0)
- {
- for (i = len; i > 0; i--) {
- if (str[i - 1] != ' ')
- break;
- }
- }
+ if (g_settings.lcd_scroll)
+ flags[0] |= FP_FLAG_SCROLL_ON | FP_FLAG_SCROLL_SIO | FP_FLAG_SCROLL_DELAY;
- if (((int)strlen(text) == i && !strncmp(str, text, i)) || len > 255)
+ std::string txt = std::string(flags) + str;
+ txt = trim(txt);
+ printf("CVFD::ShowText: [%s]\n", txt.c_str() + 1);
+
+ size_t len = txt.length();
+ if (txt == text || len > 255)
return;
- strncpy(text, str, i);
- text[i] = '\0';
-
-//printf("****************************** CVFD::ShowText: %s\n", str);
- //FIXME !!
- ret = ioctl(fd, IOC_FP_SET_TEXT, len ? str : NULL);
+ text = txt;
+ int ret = ioctl(fd, IOC_FP_SET_TEXT, len > 1 ? txt.c_str() : NULL);
if(ret < 0)
perror("IOC_FP_SET_TEXT");
}
diff --git a/src/driver/vfd.h b/src/driver/vfd.h
index 4b3a5767e..82de21191 100644
--- a/src/driver/vfd.h
+++ b/src/driver/vfd.h
@@ -90,7 +90,7 @@ class CVFD
unsigned int switch_name_time_cnt;
int fd;
int brightness;
- char text[256];
+ std::string text;
void count_down();
diff --git a/src/gui/record_setup.cpp b/src/gui/record_setup.cpp
index 71d000fb9..97812d6d7 100644
--- a/src/gui/record_setup.cpp
+++ b/src/gui/record_setup.cpp
@@ -233,6 +233,10 @@ int CRecordSetup::showRecordSetup()
CMenuOptionChooser* slow_warn = new CMenuOptionChooser(LOCALE_RECORDINGMENU_SLOW_WARN, &g_settings.recording_slow_warning, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true);
slow_warn->setHint("", LOCALE_MENU_HINT_RECORD_SLOW_WARN);
recordingSettings->addItem(slow_warn);
+
+ CMenuOptionChooser* startstop_msg = new CMenuOptionChooser(LOCALE_RECORDING_STARTSTOP_MSG, &g_settings.recording_startstop_msg, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true);
+ startstop_msg->setHint("", LOCALE_MENU_HINT_RECORD_STARTSTOP_MSG);
+ recordingSettings->addItem(startstop_msg);
}
//template
diff --git a/src/gui/scan_setup.cpp b/src/gui/scan_setup.cpp
index 112901e0c..fcaf29faa 100644
--- a/src/gui/scan_setup.cpp
+++ b/src/gui/scan_setup.cpp
@@ -34,6 +34,8 @@
#include
#endif
+#include
+
#include
#include
#include
@@ -261,6 +263,9 @@ int CScanSetup::exec(CMenuTarget* parent, const std::string &actionKey)
if (reloadhintBox)
reloadhintBox->hide();
CNeutrinoApp::getInstance ()->SDTreloadChannels = false;
+ if(file_exists(CURRENTSERVICES_XML)){
+ unlink(CURRENTSERVICES_XML);
+ }
return res;
}
else if(actionKey == "satsetup")
diff --git a/src/gui/vfd_setup.cpp b/src/gui/vfd_setup.cpp
index 38579b051..d631578a3 100644
--- a/src/gui/vfd_setup.cpp
+++ b/src/gui/vfd_setup.cpp
@@ -149,6 +149,10 @@ int CVfdSetup::showSetup()
vfds->addItem(oj);
vfds->addItem(lcd_clock_channelname_menu);
+ oj = new CMenuOptionChooser(LOCALE_LCDMENU_SCROLL, &g_settings.lcd_scroll, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, vfd_enabled);
+ oj->setHint("", LOCALE_MENU_HINT_VFD_SCROLL);
+ vfds->addItem(oj);
+
int res = vfds->exec(NULL, "");
delete vfds;
diff --git a/src/neutrino.cpp b/src/neutrino.cpp
index d33f1cba5..efd9f6d3f 100644
--- a/src/neutrino.cpp
+++ b/src/neutrino.cpp
@@ -410,6 +410,7 @@ int CNeutrinoApp::loadSetup(const char * fname)
g_settings.backlight_tv = configfile.getInt32( "backlight_tv", 1);
g_settings.backlight_standby = configfile.getInt32( "backlight_standby", 0);
g_settings.backlight_deepstandby = configfile.getInt32( "backlight_deepstandby", 0);
+ g_settings.lcd_scroll = configfile.getInt32( "lcd_scroll", 1);
g_settings.hdd_fs = configfile.getInt32( "hdd_fs", 0);
g_settings.hdd_sleep = configfile.getInt32( "hdd_sleep", 120);
@@ -648,6 +649,7 @@ int CNeutrinoApp::loadSetup(const char * fname)
g_settings.recording_epg_for_end = configfile.getBool("recording_epg_for_end" , true);
g_settings.recording_save_in_channeldir = configfile.getBool("recording_save_in_channeldir" , false);
g_settings.recording_slow_warning = configfile.getBool("recording_slow_warning" , true);
+ g_settings.recording_startstop_msg = configfile.getBool("recording_startstop_msg" , true);
// default plugin for movieplayer
g_settings.movieplayer_plugin = configfile.getString( "movieplayer_plugin", "Teletext" );
@@ -947,6 +949,7 @@ void CNeutrinoApp::saveSetup(const char * fname)
configfile.setInt32( "backlight_tv", g_settings.backlight_tv);
configfile.setInt32( "backlight_standby", g_settings.backlight_standby);
configfile.setInt32( "backlight_deepstandby", g_settings.backlight_deepstandby);
+ configfile.setInt32( "lcd_scroll", g_settings.lcd_scroll);
//misc
configfile.setInt32( "power_standby", g_settings.power_standby);
@@ -1134,6 +1137,7 @@ void CNeutrinoApp::saveSetup(const char * fname)
configfile.setBool ("recording_epg_for_end" , g_settings.recording_epg_for_end );
configfile.setBool ("recording_save_in_channeldir" , g_settings.recording_save_in_channeldir );
configfile.setBool ("recording_slow_warning" , g_settings.recording_slow_warning );
+ configfile.setBool ("recording_startstop_msg" , g_settings.recording_startstop_msg );
// default plugin for movieplayer
configfile.setString ( "movieplayer_plugin", g_settings.movieplayer_plugin );
@@ -2953,7 +2957,7 @@ int CNeutrinoApp::handleMsg(const neutrino_msg_t _msg, neutrino_msg_data_t data)
g_Zapit->zapTo_serviceID_NOWAIT(channel_id);
}
}
- if(( mode != mode_scart ) && ( mode != mode_standby )){
+ if(( mode != mode_scart ) && ( mode != mode_standby ) && g_settings.recording_startstop_msg) {
std::string name = g_Locale->getText(LOCALE_RECORDTIMER_ANNOUNCE);
getAnnounceEpgName(eventinfo, name);
ShowHintUTF(LOCALE_MESSAGEBOX_INFO, name.c_str());
@@ -3203,10 +3207,6 @@ void CNeutrinoApp::ExitRun(const bool /*write_si*/, int retcode)
//CVFD::getInstance()->ShowText(g_Locale->getText(LOCALE_MAINMENU_SHUTDOWN));
#if 0
- my_system("/etc/init.d/rcK");
- sync();
- my_system(2,"/bin/umount", "-a");
- sleep(1);
{
fp_standby_data_t standby;
time_t mtime = time(NULL);
@@ -3246,6 +3246,11 @@ void CNeutrinoApp::ExitRun(const bool /*write_si*/, int retcode)
standby.timer_minutes_hi = fp_timer >> 8;;
standby.timer_minutes_lo = fp_timer & 0xFF;
+ my_system("/etc/init.d/rcK");
+ sync();
+ my_system(2,"/bin/umount", "-a");
+ sleep(1);
+
stop_video();
int fd = open("/dev/display", O_RDONLY);
diff --git a/src/nhttpd/tuxboxapi/coolstream/controlapi.cpp b/src/nhttpd/tuxboxapi/coolstream/controlapi.cpp
index 696a9d8bd..70dc544a7 100644
--- a/src/nhttpd/tuxboxapi/coolstream/controlapi.cpp
+++ b/src/nhttpd/tuxboxapi/coolstream/controlapi.cpp
@@ -155,8 +155,10 @@ const CControlAPI::TyCgiCall CControlAPI::yCgiCallList[]=
{"getbouquets", &CControlAPI::GetBouquetsCGI, "+xml"},
{"getmode", &CControlAPI::GetModeCGI, "text/plain"},
{"setmode", &CControlAPI::SetModeCGI, "text/plain"},
- {"epg", &CControlAPI::EpgCGI, ""},
- {"zapto", &CControlAPI::ZaptoCGI, "text/plain"},
+ {"epgsearchxml", &CControlAPI::EpgSearchXMLCGI, ""},
+ {"epgsearch", &CControlAPI::EpgSearchTXTCGI, ""},
+ {"epg", &CControlAPI::EpgCGI, ""},
+ {"zapto", &CControlAPI::ZaptoCGI, "text/plain"},
{"getonidsid", &CControlAPI::GetChannel_IDCGI, "text/plain"},
{"currenttpchannels", &CControlAPI::GetTPChannel_IDCGI, "text/plain"},
// boxcontrol - system
@@ -1285,6 +1287,140 @@ void CControlAPI::epgDetailList(CyhookHandler *hh) {
hh->WriteLn(result);
}
}
+//-------------------------------------------------------------------------------------------------
+inline static bool sortByDateTime (const CChannelEvent& a, const CChannelEvent& b)
+{
+ return a.startTime < b.startTime;
+}
+extern const char * GetGenre(const unsigned char contentClassification); // UTF-8
+void CControlAPI::EpgSearchXMLCGI(CyhookHandler *hh)
+{
+ EpgSearchCGI(hh, true);//xml_forat = true
+}
+void CControlAPI::EpgSearchTXTCGI(CyhookHandler *hh)
+{
+ EpgSearchCGI(hh, false);//xml_forat = false
+}
+
+void CControlAPI::EpgSearchCGI(CyhookHandler *hh, bool xml_forat )
+{
+ t_channel_id channel_id;
+ CChannelEventList evtlist;
+ bool param_empty = hh->ParamList.empty();
+ const int m_search_epg_item = 5;
+ if(!param_empty){
+ if(xml_forat){
+ hh->SetHeader(HTTP_OK, "text/xml; charset=UTF-8");
+ hh->WriteLn("");
+ hh->WriteLn("");
+ }
+ else{
+ hh->SetHeader(HTTP_OK, "text/plain; charset=UTF-8"); // default
+ }
+
+ std::string m_search_keyword =hh->ParamList["1"];
+
+ std::vector v;
+ int channel_nr = CNeutrinoApp::getInstance ()->channelList->getSize();//unique channelList TV or Radio
+ for(int channel = 0; channel < channel_nr; channel++){
+ channel_id = CNeutrinoApp::getInstance ()->channelList->getChannelFromIndex(channel)->channel_id;
+ v.push_back(channel_id);
+ }
+ std::map ch_id_map;
+ std::vector::iterator it;
+ for (it = v.begin(); it != v.end(); ++it){
+ ch_id_map[*it & 0xFFFFFFFFFFFFULL] = *it;
+ }
+ CEitManager::getInstance()->getEventsServiceKey(0,evtlist, m_search_epg_item,m_search_keyword, true);//all_chann
+
+ if(!evtlist.empty()){
+ std::map::iterator map_it;
+ CChannelEventList::iterator e;
+ for ( e=evtlist.begin(); e!=evtlist.end();++e){
+ map_it = ch_id_map.find(e->channelID);
+ if (map_it != ch_id_map.end()){
+ e->channelID = map_it->second;//map channelID48 to channelID
+ }
+ else{
+ evtlist.erase(e--);// remove event for not found channels in channelList
+ }
+ }
+ }
+ if(!evtlist.empty()){
+ sort(evtlist.begin(),evtlist.end(),sortByDateTime);
+ }
+
+ time_t azeit=time(NULL);
+ CShortEPGData epg;
+ CEPGData longepg;
+ char tmpstr[256] ={0};
+ std::string genere;
+ CChannelEventList::iterator eventIterator;
+ unsigned int u_azeit = ( azeit > -1)? azeit:0;
+ for (eventIterator = evtlist.begin(); eventIterator != evtlist.end(); ++eventIterator){
+ if (CEitManager::getInstance()->getEPGidShort(eventIterator->eventID, &epg)) {
+ if( (eventIterator->startTime+eventIterator->duration) < u_azeit)
+ continue;
+ struct tm *tmStartZeit = localtime(&eventIterator->startTime);
+ if(xml_forat){
+ hh->printf("\t");
+ hh->printf("\t\t%s\n",NeutrinoAPI->GetServiceName(eventIterator->channelID).c_str());
+ hh->printf("\t\t%s\n",ZapitTools::UTF8_to_UTF8XML(epg.title.c_str()).c_str());
+ hh->printf("\t\t%s\n",ZapitTools::UTF8_to_UTF8XML(epg.info1.c_str()).c_str());
+ hh->printf("\t\t%s\n",ZapitTools::UTF8_to_UTF8XML(epg.info2.c_str()).c_str());
+ if (CEitManager::getInstance()->getEPGid(eventIterator->eventID, eventIterator->startTime, &longepg)) {
+ hh->printf("\t\t%u\n", longepg.fsk);
+ if (longepg.contentClassification.length()> 0){
+ genere = GetGenre(longepg.contentClassification[0]);
+ genere = ZapitTools::UTF8_to_UTF8XML(genere.c_str());
+ hh->printf("\t\t%s\n", genere.c_str());
+ }
+ }
+ strftime(tmpstr, sizeof(tmpstr), "%Y-%m-%d", tmStartZeit );
+ hh->printf("\t\t%s\n", tmpstr);
+ strftime(tmpstr, sizeof(tmpstr), "%H:%M", tmStartZeit );
+ hh->printf("\t\t\n", tmpstr);
+ hh->printf("\t\t%d\n", eventIterator->duration);
+ hh->printf("\t\t\t" PRINTF_CHANNEL_ID_TYPE_NO_LEADING_ZEROS "\n",eventIterator->channelID);
+ hh->printf("\t\t\t%ld\n",eventIterator->eventID);
+ hh->printf("\t");
+ }else{
+ std::string datetimer_str ;
+ strftime(tmpstr, sizeof(tmpstr), "%Y-%m-%d %H:%M", tmStartZeit );
+ datetimer_str = tmpstr;
+ datetimer_str += " ";
+ datetimer_str += g_Locale->getText(CLocaleManager::getMonth(tmStartZeit));
+ datetimer_str += " ";
+ datetimer_str += g_Locale->getText(CLocaleManager::getWeekday(tmStartZeit));
+ snprintf(tmpstr, sizeof(tmpstr)," [%d min]",eventIterator->duration / 60);
+ datetimer_str += tmpstr;
+
+ hh->WriteLn(datetimer_str);
+ hh->WriteLn(NeutrinoAPI->GetServiceName(eventIterator->channelID));
+ hh->WriteLn(epg.title);
+ if(!epg.info1.empty())
+ hh->WriteLn(epg.info1);
+ if(!epg.info2.empty())
+ hh->WriteLn(epg.info2);
+ if (CEitManager::getInstance()->getEPGid(eventIterator->eventID, eventIterator->startTime, &longepg)) {
+ hh->printf("fsk:%u\n", longepg.fsk);
+ if (longepg.contentClassification.length()> 0){
+ genere = GetGenre(longepg.contentClassification[0]);
+ genere = ZapitTools::UTF8_to_UTF8XML(genere.c_str());
+ hh->WriteLn(genere);
+ }
+ }
+ hh->WriteLn("----------------------------------------------------------");
+
+ }
+ }
+ }
+ if(xml_forat)
+ hh->printf("");
+ }else
+ hh->SendError();
+
+}
//-------------------------------------------------------------------------
/** Return EPG data
@@ -1302,6 +1438,7 @@ void CControlAPI::epgDetailList(CyhookHandler *hh) {
* stoptime : show only items until stoptime reached
* @endcode
*/
+
//-------------------------------------------------------------------------
void CControlAPI::EpgCGI(CyhookHandler *hh) {
NeutrinoAPI->eList.clear();
diff --git a/src/nhttpd/tuxboxapi/coolstream/controlapi.h b/src/nhttpd/tuxboxapi/coolstream/controlapi.h
index 151dbf160..33d969ae6 100644
--- a/src/nhttpd/tuxboxapi/coolstream/controlapi.h
+++ b/src/nhttpd/tuxboxapi/coolstream/controlapi.h
@@ -40,7 +40,9 @@ private:
void SendTimers(CyhookHandler *hh);
void SendTimersXML(CyhookHandler *hh);
void epgDetailList(CyhookHandler *hh);
-
+ void EpgSearchXMLCGI(CyhookHandler *hh);
+ void EpgSearchTXTCGI(CyhookHandler *hh);
+ void EpgSearchCGI(CyhookHandler *hh, bool xml_forat = false);
// subs
friend class CNeutrinoWebserver; // for timer /fb/ compatibility
void doModifyTimer(CyhookHandler *hh);
diff --git a/src/system/locals.h b/src/system/locals.h
index e0bf849a1..de3214792 100644
--- a/src/system/locals.h
+++ b/src/system/locals.h
@@ -745,6 +745,7 @@ typedef enum
LOCALE_LCDMENU_DIM_TIME,
LOCALE_LCDMENU_HEAD,
LOCALE_LCDMENU_LCDCONTROLER,
+ LOCALE_LCDMENU_SCROLL,
LOCALE_LCDMENU_STATUSLINE,
LOCALE_LCDMENU_STATUSLINE_BOTH,
LOCALE_LCDMENU_STATUSLINE_PLAYTIME,
@@ -1066,6 +1067,7 @@ typedef enum
LOCALE_MENU_HINT_RECORD_DIR,
LOCALE_MENU_HINT_RECORD_END,
LOCALE_MENU_HINT_RECORD_SLOW_WARN,
+ LOCALE_MENU_HINT_RECORD_STARTSTOP_MSG,
LOCALE_MENU_HINT_RECORD_TDIR,
LOCALE_MENU_HINT_RECORD_TIME,
LOCALE_MENU_HINT_RECORD_TIMEAFTER,
@@ -1199,6 +1201,7 @@ typedef enum
LOCALE_MENU_HINT_VFD_DEFAULTS,
LOCALE_MENU_HINT_VFD_DIMTIME,
LOCALE_MENU_HINT_VFD_INFOLINE,
+ LOCALE_MENU_HINT_VFD_SCROLL,
LOCALE_MENU_HINT_VFD_STATUSLINE,
LOCALE_MENU_HINT_VIDEO,
LOCALE_MENU_HINT_VIDEO_43MODE,
@@ -1684,6 +1687,7 @@ typedef enum
LOCALE_RCLOCK_UNLOCKMSG,
LOCALE_RECORDING_IS_RUNNING,
LOCALE_RECORDING_START,
+ LOCALE_RECORDING_STARTSTOP_MSG,
LOCALE_RECORDING_STOP,
LOCALE_RECORDING_TIME_HOUR,
LOCALE_RECORDING_TIME_HOURS,
diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h
index 5391c24bf..d0ab34f5a 100644
--- a/src/system/locals_intern.h
+++ b/src/system/locals_intern.h
@@ -745,6 +745,7 @@ const char * locale_real_names[] =
"lcdmenu.dim_time",
"lcdmenu.head",
"lcdmenu.lcdcontroler",
+ "lcdmenu.scroll",
"lcdmenu.statusline",
"lcdmenu.statusline.both",
"lcdmenu.statusline.playtime",
@@ -1066,6 +1067,7 @@ const char * locale_real_names[] =
"menu.hint_record_dir",
"menu.hint_record_end",
"menu.hint_record_slow_warn",
+ "menu.hint_record_startstop_msg",
"menu.hint_record_tdir",
"menu.hint_record_time",
"menu.hint_record_timeafter",
@@ -1199,6 +1201,7 @@ const char * locale_real_names[] =
"menu.hint_vfd_defaults",
"menu.hint_vfd_dimtime",
"menu.hint_vfd_infoline",
+ "menu.hint_vfd_scroll",
"menu.hint_vfd_statusline",
"menu.hint_video",
"menu.hint_video_43mode",
@@ -1684,6 +1687,7 @@ const char * locale_real_names[] =
"rclock.unlockmsg",
"recording.is_running",
"recording.start",
+ "recording.startstop_msg",
"recording.stop",
"recording.time_hour",
"recording.time_hours",
diff --git a/src/system/settings.h b/src/system/settings.h
index baef4b2a1..68a2fe47f 100644
--- a/src/system/settings.h
+++ b/src/system/settings.h
@@ -367,6 +367,7 @@ struct SNeutrinoSettings
int recording_save_in_channeldir;
int recording_zap_on_announce;
int recording_slow_warning;
+ int recording_startstop_msg;
int shutdown_timer_record_type;
int filesystem_is_utf8;
@@ -582,6 +583,7 @@ struct SNeutrinoSettings
int backlight_tv;
int backlight_standby;
int backlight_deepstandby;
+ int lcd_scroll;
//#define FILESYSTEM_ENCODING_TO_UTF8(a) (g_settings.filesystem_is_utf8 ? (a) : ZapitTools::Latin1_to_UTF8(a).c_str())
#define FILESYSTEM_ENCODING_TO_UTF8(a) (isUTF8(a) ? (a) : ZapitTools::Latin1_to_UTF8(a).c_str())
#define UTF8_TO_FILESYSTEM_ENCODING(a) (g_settings.filesystem_is_utf8 ? (a) : ZapitTools::UTF8_to_Latin1(a).c_str())