Add backing code for auto recording.

This more or less marks the DVR infrastructure in Tvheadend back to what it once was!

Fixes issue #18
This commit is contained in:
Andreas Öman 2008-09-24 20:45:38 +00:00
parent 3b3a8ce29d
commit 08c0e7a2f4
3 changed files with 70 additions and 2 deletions

View file

@ -166,5 +166,6 @@ void dvr_autorec_add(const char *title, const char *channel,
const char *tag, const char *contentgrp,
const char *creator, const char *comment);
void dvr_autorec_check(event_t *e);
#endif /* DVR_H */

View file

@ -59,9 +59,10 @@ typedef struct dvr_autorec_entry {
} dvr_autorec_entry_t;
static void dvr_autorec_check_just_enabled(dvr_autorec_entry_t *dae);
#if 0
/**
* return 1 if the event 'e' is matched by the autorec rule 'ar'
*/
@ -70,6 +71,9 @@ autorec_cmp(dvr_autorec_entry_t *dae, event_t *e)
{
channel_tag_mapping_t *ctm;
if(dae->dae_enabled == 0)
return 0;
if(dae->dae_channel != NULL &&
dae->dae_channel != e->e_channel)
return 0;
@ -95,7 +99,6 @@ autorec_cmp(dvr_autorec_entry_t *dae, event_t *e)
return 1;
}
#endif
/**
@ -239,6 +242,7 @@ autorec_record_update(void *opaque, const char *id, htsmsg_t *values,
const char *s;
channel_t *ch;
channel_tag_t *ct;
uint32_t u32;
if((dae = autorec_entry_find(id, maycreate)) == NULL)
return NULL;
@ -284,6 +288,12 @@ autorec_record_update(void *opaque, const char *id, htsmsg_t *values,
if((s = htsmsg_get_str(values, "contentgrp")) != NULL)
dae->dae_ecg = epg_content_group_find_by_name(s);
if(!htsmsg_get_u32(values, "enabled", &u32))
dae->dae_enabled = u32;
if(dae->dae_enabled)
dvr_autorec_check_just_enabled(dae);
return autorec_record_build(dae);
}
@ -375,4 +385,57 @@ dvr_autorec_add(const char *title, const char *channel,
m = htsmsg_create();
htsmsg_add_u32(m, "asyncreload", 1);
notify_by_msg("autorec", m);
dvr_autorec_check_just_enabled(dae);
}
/**
*
*/
static void
autorec_schedule(event_t *e, dvr_autorec_entry_t *dae)
{
char buf[200];
snprintf(buf, sizeof(buf), "Auto recording by: %s", dae->dae_creator);
dvr_entry_create_by_event(e, buf);
}
/**
*
*/
void
dvr_autorec_check(event_t *e)
{
dvr_autorec_entry_t *dae;
TAILQ_FOREACH(dae, &autorec_entries, dae_link)
if(autorec_cmp(dae, e))
autorec_schedule(e, dae);
if((e = RB_NEXT(e, e_channel_link)) == NULL)
return;
/* Check next event too */
TAILQ_FOREACH(dae, &autorec_entries, dae_link)
if(autorec_cmp(dae, e))
autorec_schedule(e, dae);
}
/**
*
*/
static void
dvr_autorec_check_just_enabled(dvr_autorec_entry_t *dae)
{
channel_t *ch;
RB_FOREACH(ch, &channel_name_tree, ch_name_link) {
if(ch->ch_epg_current == NULL)
continue;
if(autorec_cmp(dae, ch->ch_epg_current))
autorec_schedule(ch->ch_epg_current, dae);
}
}

4
epg.c
View file

@ -26,6 +26,7 @@
#include "tvhead.h"
#include "channels.h"
#include "epg.h"
#include "dvr/dvr.h"
#define EPG_MAX_AGE 86400
@ -52,6 +53,9 @@ static void
epg_set_current(channel_t *ch, event_t *e)
{
ch->ch_epg_current = e;
if(e != NULL)
dvr_autorec_check(e);
}