Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge remote-tracking branch 'origin/pr/257'
  • Loading branch information
adamsutton committed Mar 8, 2013
2 parents 288edf7 + 4b7ffc0 commit 666e595
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 2 deletions.
6 changes: 6 additions & 0 deletions docs/html/config_epggrab.html
Expand Up @@ -61,6 +61,12 @@ <h3>General Config</h3>
<dt>Update channel name
<dd>Automatically update channel icons using information provided
by the enabled EPG providers.
<dt>Periodic save EPG to disk Interval
<dd>Writes the current in-memory EPG database to disk every x Hours
(user defined), so should a crash/unexpected shutdown occur EPG
data is saved periodically to the database (Re-read on
next startup)
Set to 0 to disable.
</dl>

<h3>Internal Grabber</h3>
Expand Down
34 changes: 34 additions & 0 deletions src/epgdb.c
Expand Up @@ -20,6 +20,7 @@
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pthread.h>

#include "tvheadend.h"
#include "queue.h"
Expand All @@ -35,6 +36,9 @@ extern epg_object_tree_t epg_brands;
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
Expand Down Expand Up @@ -135,6 +139,29 @@ static void _epgdb_v2_process ( htsmsg_t *m, epggrab_stats_t *stats )
}
}

/*
* 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 != 0) {
tvhlog(LOG_DEBUG, "epgdb", "epgdbsave setting: %i",
epggrab_epgdb_periodicsave);
epg_save();
};
pthread_mutex_lock(&epgdbsave_mutex);
time(&ts.tv_sec);
ts.tv_sec += epggrab_epgdb_periodicsave * 3600; /* User defined in hours */
pthread_cond_timedwait(&_epgdbsave_cond, &epgdbsave_mutex, &ts);
pthread_mutex_unlock(&epgdbsave_mutex);
};
return NULL;
}

/*
* Load data
*/
Expand Down Expand Up @@ -226,6 +253,13 @@ void epg_init ( void )
/* Close file */
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);
}

/* **************************************************************************
Expand Down
16 changes: 16 additions & 0 deletions src/epggrab.c
Expand Up @@ -49,6 +49,7 @@ epggrab_module_list_t epggrab_modules;
uint32_t epggrab_channel_rename;
uint32_t epggrab_channel_renumber;
uint32_t epggrab_channel_reicon;
uint32_t epggrab_epgdb_periodicsave;

/* **************************************************************************
* Internal Grab Thread
Expand Down Expand Up @@ -138,6 +139,7 @@ static void _epggrab_load ( void )
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;
Expand Down Expand Up @@ -234,6 +236,7 @@ void epggrab_save ( void )
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);
Expand Down Expand Up @@ -299,6 +302,19 @@ int epggrab_set_channel_renumber ( uint32_t e )
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;
Expand Down
2 changes: 2 additions & 0 deletions src/epggrab.h
Expand Up @@ -226,6 +226,7 @@ extern epggrab_module_int_t* epggrab_module;
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
Expand All @@ -236,6 +237,7 @@ int epggrab_set_module_by_id ( const char *id );
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 );

Expand Down
3 changes: 3 additions & 0 deletions src/webui/extjs.c
Expand Up @@ -589,6 +589,7 @@ extjs_epggrab(http_connection_t *hc, const char *remain, void *opaque)
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");
Expand Down Expand Up @@ -619,6 +620,8 @@ extjs_epggrab(http_connection_t *hc, const char *remain, void *opaque)
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);
if ( (str = http_arg_get(&hc->hc_req_args, "epgdb_periodicsave")) )
save |= epggrab_set_periodicsave(atoi(str));
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")) )
Expand Down
20 changes: 20 additions & 0 deletions src/webui/simpleui.c
Expand Up @@ -471,6 +471,25 @@ page_status(http_connection_t *hc,
return 0;
}

/**
* flush epgdb to disk on call
*/
static int
page_epgsave(http_connection_t *hc,
const char *remain, void *opaque)
{
htsbuf_queue_t *hq = &hc->hc_reply;

htsbuf_qprintf(hq, "<?xml version=\"1.0\"?>\n"
"<epgflush>1</epgflush>\n");

epg_save();

http_output_content(hc, "text/xml");

return 0;
}



/**
Expand All @@ -483,4 +502,5 @@ simpleui_start(void)
http_path_add("/eventinfo", NULL, page_einfo, ACCESS_SIMPLE);
http_path_add("/pvrinfo", NULL, page_pvrinfo, ACCESS_SIMPLE);
http_path_add("/status.xml", NULL, page_status, ACCESS_SIMPLE);
http_path_add("/epgsave", NULL, page_epgsave, ACCESS_SIMPLE);
}
15 changes: 13 additions & 2 deletions src/webui/static/app/epggrab.js
Expand Up @@ -82,7 +82,7 @@ tvheadend.epggrab = function() {
var confreader = new Ext.data.JsonReader({
root : 'epggrabSettings'
}, [ 'module', 'interval', 'channel_rename', 'channel_renumber',
'channel_reicon' ]);
'channel_reicon', 'epgdb_periodicsave' ]);

/* ****************************************************************
* Basic Fields
Expand Down Expand Up @@ -184,6 +184,17 @@ tvheadend.epggrab = function() {
fieldLabel : 'Update channel icon'
});

var epgPeriodicSave = new Ext.form.NumberField({
width : 30,
allowNegative : false,
allowDecimals : false,
minValue : 0,
maxValue : 24,
value : 0,
fieldLabel : 'Periodic save EPG to disk',
name : 'epgdb_periodicsave',
});

/*
* Simple fields
*/
Expand All @@ -192,7 +203,7 @@ tvheadend.epggrab = function() {
width : 700,
autoHeight : true,
collapsible : true,
items : [ channelRename, channelRenumber, channelReicon ]
items : [ channelRename, channelRenumber, channelReicon, epgPeriodicSave ]
});

/*
Expand Down

0 comments on commit 666e595

Please sign in to comment.