dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint8_t tableid, void *opaque)
{
-#if TODO
+#ifdef TODO_EIT_GRABBER
service_t *t;
channel_t *ch;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
char extitem[5000];
char exttext[5000];
- event_t *e;
-
lock_assert(&global_lock);
// printf("EIT!, tid = %x\n", tableid);
dvr_prio_t de_pri;
- epg_episode_t de_episode;
- uint8_t de_content_type;
-
uint32_t de_dont_reschedule;
+ /**
+ * EPG information / links
+ */
+ epg_broadcast_t *de_bcast;
+
/**
* Major State
*/
char *dae_creator;
char *dae_comment;
+// TODO: EPG linking for proper series recording
+
char *dae_title;
regex_t dae_title_preg;
const char *dvr_entry_schedstatus(dvr_entry_t *de);
-void dvr_entry_create_by_autorec(event_t *e, dvr_autorec_entry_t *dae);
+void dvr_entry_create_by_autorec(epg_broadcast_t *e, dvr_autorec_entry_t *dae);
dvr_entry_t *dvr_entry_create_by_event(const char *dvr_config_name,
- event_t *e, const char *creator,
+ epg_broadcast_t *e, const char *creator,
dvr_autorec_entry_t *dae,
dvr_prio_t pri);
channel_t *ch, time_t start, time_t stop,
const char *title, const char *description,
const char *creator, dvr_autorec_entry_t *dae,
- epg_episode_t *ee, uint8_t content_type,
dvr_prio_t pri);
dvr_entry_t *dvr_entry_update(dvr_entry_t *de, const char* de_title, int de_start, int de_stop);
void dvr_rec_unsubscribe(dvr_entry_t *de, int stopcode);
-void dvr_event_replaced(event_t *e, event_t *new_e);
+void dvr_event_replaced(epg_broadcast_t *e, epg_broadcast_t *new_e);
dvr_entry_t *dvr_entry_find_by_id(int id);
-dvr_entry_t *dvr_entry_find_by_event(event_t *e);
+dvr_entry_t *dvr_entry_find_by_event(epg_broadcast_t *e);
-dvr_entry_t *dvr_entry_find_by_event_fuzzy(event_t *e);
+dvr_entry_t *dvr_entry_find_by_event_fuzzy(epg_broadcast_t *e);
off_t dvr_get_filesize(dvr_entry_t *de);
const char *tag, uint8_t content_type,
const char *creator, const char *comment);
-void dvr_autorec_check_event(event_t *e);
+void dvr_autorec_check_event(epg_broadcast_t *e);
void autorec_destroy_by_channel(channel_t *ch);
* return 1 if the event 'e' is matched by the autorec rule 'dae'
*/
static int
-autorec_cmp(dvr_autorec_entry_t *dae, event_t *e)
+autorec_cmp(dvr_autorec_entry_t *dae, epg_broadcast_t *e)
{
channel_tag_mapping_t *ctm;
+ if (!e->channel || !e->channel->channel) return 0;
if(dae->dae_enabled == 0 || dae->dae_weekdays == 0)
return 0;
return 0; // Avoid super wildcard match
if(dae->dae_channel != NULL &&
- dae->dae_channel != e->e_channel)
+ dae->dae_channel != e->channel->channel)
return 0;
if(dae->dae_channel_tag != NULL) {
LIST_FOREACH(ctm, &dae->dae_channel_tag->ct_ctms, ctm_tag_link)
- if(ctm->ctm_channel == e->e_channel)
+ if(ctm->ctm_channel == e->channel->channel)
break;
if(ctm == NULL)
return 0;
}
-
+#if TODO_GENRE_SUPPORT
if(dae->dae_content_type != 0 &&
dae->dae_content_type != e->e_content_type)
return 0;
+#endif
if(dae->dae_title != NULL) {
- if(e->e_title == NULL ||
- regexec(&dae->dae_title_preg, e->e_title, 0, NULL, 0))
+ if(e->episode->title == NULL ||
+ regexec(&dae->dae_title_preg, e->episode->title, 0, NULL, 0))
return 0;
}
if(dae->dae_approx_time != 0) {
struct tm a_time;
struct tm ev_time;
- localtime_r(&e->e_start, &a_time);
- localtime_r(&e->e_start, &ev_time);
+ localtime_r(&e->start, &a_time);
+ localtime_r(&e->start, &ev_time);
a_time.tm_min = dae->dae_approx_time % 60;
a_time.tm_hour = dae->dae_approx_time / 60;
if(abs(mktime(&a_time) - mktime(&ev_time)) > 900)
if(dae->dae_weekdays != 0x7f) {
struct tm tm;
- localtime_r(&e->e_start, &tm);
+ localtime_r(&e->start, &tm);
if(!((1 << ((tm.tm_wday ?: 7) - 1)) & dae->dae_weekdays))
return 0;
}
*
*/
void
-dvr_autorec_check_event(event_t *e)
+dvr_autorec_check_event(epg_broadcast_t *e)
{
dvr_autorec_entry_t *dae;
dvr_entry_t *existingde;
if(autorec_cmp(dae, e)) {
existingde = dvr_entry_find_by_event_fuzzy(e);
if (existingde != NULL) {
- tvhlog(LOG_DEBUG, "dvr", "Updating existing DVR entry for %s", e->e_title);
- dvr_entry_update(existingde, e->e_title, e->e_start, e->e_stop);
+ tvhlog(LOG_DEBUG, "dvr", "Updating existing DVR entry for %s", e->episode->title);
+ dvr_entry_update(existingde, e->episode->title, e->start, e->stop);
} else
dvr_entry_create_by_autorec(e, dae);
}
static void
dvr_autorec_changed(dvr_autorec_entry_t *dae)
{
-#if TODO_DVR
+#if TODO_DVR_AUTOREC
channel_t *ch;
event_t *e;
#include "htsp.h"
#include "streaming.h"
-//static int de_tally;
+static int de_tally;
int dvr_iov_max;
static void dvr_entry_save(dvr_entry_t *de);
static void dvr_timer_expire(void *aux);
-#if 0
static void dvr_timer_start_recording(void *aux);
-#endif
/**
* Return printable status for a dvr entry
/**
*
*/
-#if TODO
static void
dvr_make_title(char *output, size_t outlen, dvr_entry_t *de)
{
}
if(cfg->dvr_flags & DVR_EPISODE_IN_TITLE) {
-
- if(de->de_episode.ee_season && de->de_episode.ee_episode)
- snprintf(output + strlen(output), outlen - strlen(output),
- ".S%02dE%02d",
- de->de_episode.ee_season, de->de_episode.ee_episode);
-
- else if(de->de_episode.ee_episode)
- snprintf(output + strlen(output), outlen - strlen(output),
- ".E%02d",
- de->de_episode.ee_episode);
+ if(de->de_bcast)
+ epg_episode_number_format(de->de_bcast->episode,
+ output + strlen(output),
+ outlen - strlen(output),
+ ".", "S%02d", NULL, "E%02d", NULL);
}
if(cfg->dvr_flags & DVR_CLEAN_TITLE) {
}
}
}
-#endif
-
/**
*
*/
-#if TODO
static void
dvr_entry_link(dvr_entry_t *de)
{
}
htsp_dvr_entry_add(de);
}
-#endif
-
/**
- *
+ * Create the event
*/
-dvr_entry_t *
-dvr_entry_create(const char *config_name,
- channel_t *ch, time_t start, time_t stop,
- const char *title, const char *description,
- const char *creator, dvr_autorec_entry_t *dae,
- epg_episode_t *ee, uint8_t content_type, dvr_prio_t pri)
+static dvr_entry_t *_dvr_entry_create (
+ const char *config_name, epg_broadcast_t *e,
+ channel_t *ch, time_t start, time_t stop,
+ const char *title, const char *description,
+ const char *creator, dvr_autorec_entry_t *dae,
+ dvr_prio_t pri)
{
-#if TODO
dvr_entry_t *de;
char tbuf[30];
struct tm tm;
de->de_title = strdup(title);
de->de_desc = description ? strdup(description) : NULL;
- if(ee != NULL) {
- de->de_episode.ee_season = ee->ee_season;
- de->de_episode.ee_episode = ee->ee_episode;
- de->de_episode.ee_part = ee->ee_part;
- tvh_str_set(&de->de_episode.ee_onscreen, ee->ee_onscreen);
- }
-
+#if TODO_GENRE_SUPPORT
de->de_content_type = content_type;
+#endif
dvr_entry_link(de);
dvrdb_changed();
dvr_entry_save(de);
return de;
-#endif
- return NULL;
}
/**
*
*/
-#if TODO
-static const char *
-longest_string(const char *a, const char *b)
+dvr_entry_t *
+dvr_entry_create(const char *config_name,
+ channel_t *ch, time_t start, time_t stop,
+ const char *title, const char *description,
+ const char *creator, dvr_autorec_entry_t *dae, dvr_prio_t pri)
{
- if(b == NULL)
- return a;
- if(a == NULL)
- return b;
- return strlen(a) > strlen(b) ? a : b;
+ return _dvr_entry_create(config_name, NULL,
+ ch, start, stop, title, description,
+ creator, dae, pri);
}
-#endif
-
/**
*
*/
dvr_entry_t *
dvr_entry_create_by_event(const char *config_name,
- event_t *e, const char *creator,
- dvr_autorec_entry_t *dae, dvr_prio_t pri)
+ epg_broadcast_t *e, const char *creator,
+ dvr_autorec_entry_t *dae, dvr_prio_t pri)
{
-#if TODO
- const char *desc = NULL;
- if(e->e_channel == NULL || e->e_title == NULL)
+ if(e->channel == NULL || e->channel->channel || e->episode->title == NULL)
return NULL;
- // Try to find best description
-
- desc = longest_string(e->e_desc, e->e_ext_desc);
- desc = longest_string(desc, e->e_ext_item);
- desc = longest_string(desc, e->e_ext_text);
-
- return dvr_entry_create(config_name,
- e->e_channel, e->e_start, e->e_stop,
- e->e_title, desc, creator, dae, &e->e_episode,
- e->e_content_type, pri);
-#endif
- return NULL;
+ return _dvr_entry_create(config_name, e,
+ e->channel->channel, e->start, e->stop,
+ e->episode->title,
+ e->episode->description ? e->episode->description
+ : e->episode->summary,
+ creator, dae, pri);
}
*
*/
void
-dvr_entry_create_by_autorec(event_t *e, dvr_autorec_entry_t *dae)
+dvr_entry_create_by_autorec(epg_broadcast_t *e, dvr_autorec_entry_t *dae)
{
char buf[200];
void
dvr_entry_dec_ref(dvr_entry_t *de)
{
-#if TODO
lock_assert(&global_lock);
if(de->de_refcnt > 1) {
free(de->de_ititle);
free(de->de_desc);
- free(de->de_episode.ee_onscreen);
-
free(de);
-#endif
}
/**
* Used to notify the DVR that an event has been replaced in the EPG
+ *
+ * TODO: I think this will record the title slot event if its now a
+ * completely different episode etc...
*/
void
-dvr_event_replaced(event_t *e, event_t *new_e)
+dvr_event_replaced(epg_broadcast_t *e, epg_broadcast_t *new_e)
{
dvr_entry_t *de, *ude;
+ if ( e == new_e ) return;
de = dvr_entry_find_by_event(e);
if (de != NULL) {
ude = dvr_entry_find_by_event_fuzzy(new_e);
if (ude == NULL && de->de_sched_state == DVR_SCHEDULED)
dvr_entry_cancel(de);
- else if(new_e->e_title != NULL)
- dvr_entry_update(de, new_e->e_title, new_e->e_start, new_e->e_stop);
+ else if(new_e->episode->title != NULL)
+ dvr_entry_update(de, new_e->episode->title, new_e->start, new_e->stop);
+ // TODO: need to actually replace the event?
}
/**
*
*/
-#if TODO
static void
dvr_timer_stop_recording(void *aux)
{
dvr_stop_recording(aux, 0);
}
-#endif
/**
*
*/
-#if 0
static void
dvr_timer_start_recording(void *aux)
{
gtimer_arm_abs(&de->de_timer, dvr_timer_stop_recording, de,
de->de_stop + (60 * de->de_stop_extra));
}
-#endif
/**
*
*/
dvr_entry_t *
-dvr_entry_find_by_event(event_t *e)
+dvr_entry_find_by_event(epg_broadcast_t *e)
{
dvr_entry_t *de;
- LIST_FOREACH(de, &e->e_channel->ch_dvrs, de_channel_link)
- if(de->de_start == e->e_start &&
- de->de_stop == e->e_stop)
- return de;
+ LIST_FOREACH(de, &e->channel->channel->ch_dvrs, de_channel_link)
+ if(de->de_bcast == e) return de;
return NULL;
}
* Find dvr entry using 'fuzzy' search
*/
dvr_entry_t *
-dvr_entry_find_by_event_fuzzy(event_t *e)
+dvr_entry_find_by_event_fuzzy(epg_broadcast_t *e)
{
dvr_entry_t *de;
- if (e->e_title == NULL)
+ if (e->episode->title == NULL)
return NULL;
- LIST_FOREACH(de, &e->e_channel->ch_dvrs, de_channel_link)
- if ((abs(de->de_start - e->e_start) < 600) && (abs(de->de_stop - e->e_stop) < 600)) {
+ LIST_FOREACH(de, &e->channel->channel->ch_dvrs, de_channel_link)
+ if ((abs(de->de_start - e->start) < 600) && (abs(de->de_stop - e->stop) < 600)) {
return de;
}
return NULL;
/**
*
*/
+#if TODO_EP_NUMBER
static htsbuf_queue_t *
build_tag_int(const char *name, int value,
int targettype, const char *targettypename)
snprintf(str, sizeof(str), "%d", value);
return build_tag_string(name, str, targettype, targettypename);
}
+#endif
/**
htsbuf_queue_t *q = htsbuf_queue_alloc(0);
char datestr[64];
struct tm tm;
-#if TODO
+#if TODO_GENRE_SUPPORT
const char *ctype;
#endif
localtime_r(&de->de_start, &tm);
addtag(q, build_tag_string("ORIGINAL_MEDIA_TYPE", "TV", 0, NULL));
-#if TODO
+#if TODO_GENRE_SUPPORT
if(de->de_content_type) {
ctype = epg_content_group_get_name(de->de_content_type);
if(ctype != NULL)
if(de->de_channel != NULL)
addtag(q, build_tag_string("TVCHANNEL", de->de_channel->ch_name, 0, NULL));
-#if TODO
+#if TODO_EP_NUMBER
if(de->de_episode.ee_onscreen)
addtag(q, build_tag_string("SYNOPSIS",
de->de_episode.ee_onscreen, 0, NULL));
if(de->de_desc != NULL)
addtag(q, build_tag_string("SUMMARY", de->de_desc, 0, NULL));
-#if TODO
+#if TODO_EP_NUMBER
if(de->de_episode.ee_season)
addtag(q, build_tag_int("PART_NUMBER", de->de_episode.ee_season,
60, "SEASON"));
static htsbuf_queue_t *
-mk_build_metadata2(const event_t *e)
+mk_build_metadata2(const epg_broadcast_t *e)
{
htsbuf_queue_t *q = htsbuf_queue_alloc(0);
+ epg_episode_t *ee = e->episode;
char datestr[64];
struct tm tm;
-#if TODO
+#if TODO_GENRE_SUPPORT
const char *ctype;
#endif
- localtime_r(&e->e_start, &tm);
+ localtime_r(&e->start, &tm);
snprintf(datestr, sizeof(datestr),
"%04d-%02d-%02d %02d:%02d:%02d",
addtag(q, build_tag_string("ORIGINAL_MEDIA_TYPE", "TV", 0, NULL));
-#if TODO
+#if TODO_GENRE_SUPPORT
if(e->e_content_type) {
ctype = epg_content_group_get_name(e->e_content_type);
if(ctype != NULL)
}
#endif
- if(e->e_channel != NULL)
- addtag(q, build_tag_string("TVCHANNEL", e->e_channel->ch_name, 0, NULL));
+ if(e->channel->channel != NULL)
+ addtag(q, build_tag_string("TVCHANNEL", e->channel->channel->ch_name, 0, NULL));
+
+ if(ee->title != NULL)
+ addtag(q, build_tag_string("TITLE", ee->title, 0, NULL));
- if(e->e_title != NULL)
- addtag(q, build_tag_string("TITLE", e->e_title, 0, NULL));
+ if(ee->description)
+ addtag(q, build_tag_string("SUMMARY", ee->description, 0, NULL));
+ else if(ee->summary)
+ addtag(q, build_tag_string("SUMMARY", ee->summary, 0, NULL));
+#if TODO_EP_NUMBER
if(e->e_episode.ee_onscreen)
addtag(q, build_tag_string("SYNOPSIS",
e->e_episode.ee_onscreen, 0, NULL));
- if(e->e_desc != NULL)
- addtag(q, build_tag_string("SUMMARY", e->e_desc, 0, NULL));
-
if(e->e_episode.ee_season)
addtag(q, build_tag_int("PART_NUMBER", e->e_episode.ee_season,
60, "SEASON"));
if(e->e_episode.ee_part)
addtag(q, build_tag_int("PART_NUMBER", e->e_episode.ee_part,
40, "PART"));
+#endif
return q;
}
*
*/
int
-mk_mux_append_meta(mk_mux_t *mkm, event_t *e)
+mk_mux_append_meta(mk_mux_t *mkm, epg_broadcast_t *e)
{
htsbuf_queue_t q;
int mk_mux_write_pkt(mk_mux_t *mkm, struct th_pkt *pkt);
-int mk_mux_append_meta(mk_mux_t *mkm, struct event *e);
+int mk_mux_append_meta(mk_mux_t *mkm, struct epg_broadcast *e);
void mk_mux_close(mk_mux_t *mk_mux);
RB_REMOVE(&episode->broadcasts, broadcast, elink);
}
-int epg_episode_get_number_onscreen
- ( epg_episode_t *episode, char *buf, int len )
+
+size_t epg_episode_number_format
+ ( epg_episode_t *episode, char *buf, size_t len,
+ const char *pre, const char *sfmt,
+ const char *sep, const char *efmt,
+ const char *cfmt )
{
- int i = 0;
+ size_t i = 0;
if ( episode->number ) {
- // TODO: add counts
- if ( episode->season && episode->season->number ) {
- i += snprintf(&buf[i], len-i, "Season %d ",
- episode->season->number);
+ if (pre) i += snprintf(&buf[i], len-i, "%s", pre);
+ if ( sfmt && episode->season && episode->season->number ) {
+ i += snprintf(&buf[i], len-i, sfmt, episode->season->number);
+ if ( cfmt && episode->brand && episode->brand->season_count )
+ i += snprintf(&buf[i], len-i, cfmt,
+ episode->brand->season_count);
+ if (sep) i += snprintf(&buf[i], len-i, "%s", sep);
}
- i += snprintf(&buf[i], len-i, "Episode %d", episode->number);
+ i += snprintf(&buf[i], len-i, efmt, episode->number);
+ if ( cfmt && episode->season && episode->season->episode_count)
+ i+= snprintf(&buf[i], len-i, cfmt, episode->season->episode_count);
}
return i;
}
int epg_episode_set_season ( epg_episode_t *e, epg_season_t *s )
__attribute__((warn_unused_result));
-/* Acessors */
-int epg_episode_get_number_onscreen ( epg_episode_t *e, char *b, int c );
+/* EpNum format helper */
+// output string will be:
+// if (episode_num)
+// ret = pre
+// if (season_num) ret += sprintf(sfmt, season_num)
+// if (season_cnt && cnt) ret += sprintf(cnt, season_cnt)
+// ret += sep
+// ret += sprintf(efmt, episode_num)
+// if (episode_cnt) ret += sprintf(cfmt, episode_cnt)
+// and will return num chars written
+size_t epg_episode_number_format
+ ( epg_episode_t *e, char *buf, size_t len,
+ const char *pre, const char *sfmt,
+ const char *sep, const char *efmt,
+ const char *cfmt );
/* Serialization */
htsmsg_t *epg_episode_serialize ( epg_episode_t *b );
* Compatibility code
* ***********************************************************************/
-#ifndef TODO_REMOVE_EPG_COMPAT
+//#define TODO_EPG_COMPAT
+#ifdef TODO_EPG_COMPAT
typedef struct _epg_episode {
RB_HEAD(channel_tree, channel);
TAILQ_HEAD(channel_queue, channel);
LIST_HEAD(channel_list, channel);
-LIST_HEAD(event_list, event);
-RB_HEAD(event_tree, event);
LIST_HEAD(dvr_config_list, dvr_config);
LIST_HEAD(dvr_entry_list, dvr_entry);
TAILQ_HEAD(ref_update_queue, ref_update);
else if(ee->summary != NULL)
htsmsg_add_str(m, "description", ee->summary);
- if (epg_episode_get_number_onscreen(ee, buf, 100))
- htsmsg_add_str(m, "episode", strdup(buf));
-
-#if TODO_REMOVE_THIS_QQ
- if(e->e_ext_desc != NULL)
- htsmsg_add_str(m, "ext_desc", e->e_ext_desc);
-
- if(e->e_ext_item != NULL)
- htsmsg_add_str(m, "ext_item", e->e_ext_item);
-
- if(e->e_ext_text != NULL)
- htsmsg_add_str(m, "ext_text", e->e_ext_text);
-#endif
+ if (epg_episode_number_format(ee, buf, 100, NULL, "Season %d", ".", "Episode %d", "/%d"))
+ htsmsg_add_str(m, "episode", buf);
htsmsg_add_u32(m, "id", e->_.id);
htsmsg_add_u32(m, "start", e->start);
htsmsg_add_str(m, "contentgrp", s);
#endif
-#if TODO_UPDATE_DVR_CODE
dvr_entry_t *de;
if((de = dvr_entry_find_by_event(e)) != NULL)
htsmsg_add_str(m, "schedstate", dvr_entry_schedstatus(de));
-#endif
htsmsg_add_msg(array, NULL, m);
}
htsmsg_add_str(m, "uri", ee2->_.uri);
htsmsg_add_str(m, "title", ee2->title);
if (ee2->subtitle) htsmsg_add_str(m, "title", ee2->subtitle);
- if (epg_episode_get_number_onscreen(ee2, buf, 100))
- htsmsg_add_str(m, "episode", strdup(buf));
+ if (epg_episode_number_format(ee, buf, 100, NULL, "Season %d", ".", "Episode %d", "/%d"))
+ htsmsg_add_str(m, "episode", buf);
htsmsg_add_msg(array, NULL, m);
}
} else if (ee->season) {
htsmsg_add_str(m, "uri", ee2->_.uri);
htsmsg_add_str(m, "title", ee2->title);
if (ee2->subtitle) htsmsg_add_str(m, "title", ee2->subtitle);
- if (epg_episode_get_number_onscreen(ee2, buf, 100))
- htsmsg_add_str(m, "episode", strdup(buf));
+ if (epg_episode_number_format(ee, buf, 100, NULL, "Season %d", ".", "Episode %d", "/%d"))
+ htsmsg_add_str(m, "episode", buf);
htsmsg_add_msg(array, NULL, m);
}
}
htsbuf_queue_t *hq = &hc->hc_reply;
const char *op = http_arg_get(&hc->hc_req_args, "op");
htsmsg_t *out, *r;
- //TODO:event_t *e;
dvr_entry_t *de;
const char *s;
int flags = 0;
dvr_config_t *cfg;
+ epg_broadcast_t *e;
if(op == NULL)
op = "loadSettings";
if(!strcmp(op, "recordEvent")) {
-#if TODO_DVR
const char *config_name = http_arg_get(&hc->hc_req_args, "config_name");
s = http_arg_get(&hc->hc_req_args, "eventId");
- if((e = epg_event_find_by_id(atoi(s))) == NULL) {
+ if((e = epg_broadcast_find_by_id(atoi(s), NULL)) == NULL) {
pthread_mutex_unlock(&global_lock);
return HTTP_STATUS_BAD_REQUEST;
}
dvr_entry_create_by_event(config_name,
e, hc->hc_representative, NULL, DVR_PRIO_NORMAL);
-#endif
out = htsmsg_create_map();
htsmsg_add_u32(out, "success", 1);
dvr_entry_create(config_name,
ch, start, stop, title, NULL, hc->hc_representative,
- NULL, NULL, 0, dvr_pri2val(pri));
+ NULL, dvr_pri2val(pri));
out = htsmsg_create_map();
htsmsg_add_u32(out, "success", 1);
} else if(!strcmp(op, "createAutoRec")) {
-#if TODO_DVR
+#if TODO_DVR_AUTOREC
const char *cgrp = http_arg_get(&hc->hc_req_args, "contentgrp");
return 404;
}
-#if TODO_DVR
de = dvr_entry_find_by_event(e);
if((http_arg_get(&hc->hc_req_args, "rec")) != NULL) {
} else if(de != NULL && (http_arg_get(&hc->hc_req_args, "cancel")) != NULL) {
de = dvr_entry_cancel(de);
}
-#endif
htsbuf_qprintf(hq, "<html>");
htsbuf_qprintf(hq, "<body>");