<dt>Update channel name
<dd>Automatically update channel icons using information provided
by the enabled EPG providers.
+ <dt>Periodic save EPG to disk
+ <dd>Writes the current in-memory EPG database to disk every 8 Hours
+ when checked, so should a crash/unexpected shutdown occur EPG
+ data is saved periodically to the database (Re-read on
+ next startup)
</dl>
<h3>Internal Grabber</h3>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <pthread.h>
#include "tvheadend.h"
#include "queue.h"
extern epg_object_tree_t epg_seasons;
extern epg_object_tree_t epg_episodes;
extern epg_object_tree_t epg_serieslinks;
+static pthread_cond_t _epgdbsave_cond;
+static void* _epgdbsave_thread ( void *p );
+pthread_mutex_t epgdbsave_mutex;
/* **************************************************************************
* Load
}
}
+/*
+ * Thread functions
+ */
+static void *_epgdbsave_thread ( void *p )
+{
+ struct timespec ts;
+ ts.tv_nsec = 0;
+ tvhlog(LOG_DEBUG, "epgdb", "epgdbsave setting: %i", epggrab_epgdb_periodicsave);
+ while (1) {
+ if (epggrab_epgdb_periodicsave) {
+ tvhlog(LOG_DEBUG, "epgdb", "epgdbsave setting: %i",
+ epggrab_epgdb_periodicsave);
+ epg_save();
+ };
+ pthread_mutex_lock(&epgdbsave_mutex);
+ time(&ts.tv_sec);
+ ts.tv_sec += 28800; /* Every 8 hours */
+ pthread_cond_timedwait(&_epgdbsave_cond, &epgdbsave_mutex, &ts);
+ pthread_mutex_unlock(&epgdbsave_mutex);
+ };
+return NULL;
+}
+
/*
* Load data
*/
munmap(mem, st.st_size);
close(fd);
+ /* Create thread */
+ pthread_mutex_init(&epgdbsave_mutex, NULL);
+ pthread_cond_init(&_epgdbsave_cond, NULL);
+ /* Start thread */
+ pthread_t tid;
+ pthread_create(&tid, NULL, _epgdbsave_thread, NULL);
}
/* **************************************************************************
uint32_t epggrab_channel_rename;
uint32_t epggrab_channel_renumber;
uint32_t epggrab_channel_reicon;
+uint32_t epggrab_epgdb_periodicsave;
/* **************************************************************************
* Internal Grab Thread
htsmsg_get_u32(m, "channel_rename", &epggrab_channel_rename);
htsmsg_get_u32(m, "channel_renumber", &epggrab_channel_renumber);
htsmsg_get_u32(m, "channel_reicon", &epggrab_channel_reicon);
+ htsmsg_get_u32(m, "epgdb_periodicsave", &epggrab_epgdb_periodicsave);
if (!htsmsg_get_u32(m, old ? "grab-interval" : "interval",
&epggrab_interval)) {
if (old) epggrab_interval *= 3600;
htsmsg_add_u32(m, "channel_rename", epggrab_channel_rename);
htsmsg_add_u32(m, "channel_renumber", epggrab_channel_renumber);
htsmsg_add_u32(m, "channel_reicon", epggrab_channel_reicon);
+ htsmsg_add_u32(m, "epgdb_periodicsave", epggrab_epgdb_periodicsave);
htsmsg_add_u32(m, "interval", epggrab_interval);
if ( epggrab_module )
htsmsg_add_str(m, "module", epggrab_module->id);
return save;
}
+/*
+ * Config from the webui for period save of db to disk
+ */
+int epggrab_set_periodicsave ( uint32_t e )
+{
+ int save = 0;
+ if ( e != epggrab_epgdb_periodicsave ) {
+ epggrab_epgdb_periodicsave = e;
+ save = 1;
+ }
+ return save;
+}
+
int epggrab_set_channel_reicon ( uint32_t e )
{
int save = 0;
extern uint32_t epggrab_channel_rename;
extern uint32_t epggrab_channel_renumber;
extern uint32_t epggrab_channel_reicon;
+extern uint32_t epggrab_epgdb_periodicsave;
/*
* Set configuration
int epggrab_set_channel_rename ( uint32_t e );
int epggrab_set_channel_renumber ( uint32_t e );
int epggrab_set_channel_reicon ( uint32_t e );
+int epggrab_set_periodicsave ( uint32_t e );
int epggrab_enable_module ( epggrab_module_t *mod, uint8_t e );
int epggrab_enable_module_by_id ( const char *id, uint8_t e );
htsmsg_add_u32(r, "channel_rename", epggrab_channel_rename);
htsmsg_add_u32(r, "channel_renumber", epggrab_channel_renumber);
htsmsg_add_u32(r, "channel_reicon", epggrab_channel_reicon);
+ htsmsg_add_u32(r, "epgdb_periodicsave", epggrab_epgdb_periodicsave);
pthread_mutex_unlock(&epggrab_mutex);
out = json_single_record(r, "epggrabSettings");
save |= epggrab_set_channel_renumber(str ? 1 : 0);
str = http_arg_get(&hc->hc_req_args, "channel_reicon");
save |= epggrab_set_channel_reicon(str ? 1 : 0);
+ str = http_arg_get(&hc->hc_req_args, "epgdb_periodicsave");
+ save |= epggrab_set_periodicsave(str ? 1 : 0);
if ( (str = http_arg_get(&hc->hc_req_args, "interval")) )
save |= epggrab_set_interval(atoi(str));
if ( (str = http_arg_get(&hc->hc_req_args, "module")) )
var confreader = new Ext.data.JsonReader({
root : 'epggrabSettings'
}, [ 'module', 'interval', 'channel_rename', 'channel_renumber',
- 'channel_reicon' ]);
+ 'channel_reicon', 'epgdb_periodicsave' ]);
/* ****************************************************************
* Basic Fields
fieldLabel : 'Update channel icon'
});
+ var epgPeriodicSave = new Ext.form.Checkbox({
+ name : 'epgdb_periodicsave',
+ fieldLabel : 'Periodic save EPG to disk'
+ });
+
/*
* Simple fields
*/
width : 700,
autoHeight : true,
collapsible : true,
- items : [ channelRename, channelRenumber, channelReicon ]
+ items : [ channelRename, channelRenumber, channelReicon, epgPeriodicSave ]
});
/*