Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[htsp] limit updates for active recordings -> send stats only
  • Loading branch information
Glenn-1990 authored and perexg committed Nov 24, 2016
1 parent b9e58b9 commit c6aa155
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 67 deletions.
2 changes: 1 addition & 1 deletion src/dvr/dvr_rec.c
Expand Up @@ -881,7 +881,7 @@ dvr_notify(dvr_entry_t *de)
if (de->de_last_notify + sec2mono(5) < mclk()) {
idnode_notify_changed(&de->de_id);
de->de_last_notify = mclk();
htsp_dvr_entry_update(de);
htsp_dvr_entry_update_stats(de);
}
}

Expand Down
151 changes: 85 additions & 66 deletions src/htsp_server.c
Expand Up @@ -78,6 +78,7 @@ static void *htsp_server, *htsp_server_2;
#define HTSP_ASYNC_AUX_DVR 0x04
#define HTSP_ASYNC_AUX_AUTOREC 0x05
#define HTSP_ASYNC_AUX_TIMEREC 0x06
#define HTSP_ASYNC_AUX_EPG 0x07

#define HTSP_ASYNC_EPG_INTERVAL 30

Expand Down Expand Up @@ -890,7 +891,7 @@ htsp_build_tag(channel_tag_t *ct, const char *method, int include_channels)
*
*/
static htsmsg_t *
htsp_build_dvrentry(htsp_connection_t *htsp, dvr_entry_t *de, const char *method, const char *lang)
htsp_build_dvrentry(htsp_connection_t *htsp, dvr_entry_t *de, const char *method, const char *lang, int statsonly)
{
htsmsg_t *out = htsmsg_create_map(), *l, *m, *e, *info;
htsmsg_field_t *f;
Expand All @@ -900,74 +901,76 @@ htsp_build_dvrentry(htsp_connection_t *htsp, dvr_entry_t *de, const char *method
char ubuf[UUID_HEX_SIZE];

htsmsg_add_u32(out, "id", idnode_get_short_uuid(&de->de_id));
htsmsg_add_u32(out, "enabled", de->de_enabled >= 1 ? 1 : 0);
if (de->de_channel)
htsmsg_add_u32(out, "channel", channel_get_id(de->de_channel));
if (de->de_channel_name) /* stays valid after channel deletion */
htsmsg_add_str(out, "channelName", de->de_channel_name);

if (de->de_bcast)
htsmsg_add_u32(out, "eventId", de->de_bcast->id);
if (!statsonly) {
htsmsg_add_u32(out, "enabled", de->de_enabled >= 1 ? 1 : 0);
if (de->de_channel)
htsmsg_add_u32(out, "channel", channel_get_id(de->de_channel));
if (de->de_channel_name) /* stays valid after channel deletion */
htsmsg_add_str(out, "channelName", de->de_channel_name);

if (de->de_autorec)
htsmsg_add_str(out, "autorecId", idnode_uuid_as_str(&de->de_autorec->dae_id, ubuf));
if (de->de_bcast)
htsmsg_add_u32(out, "eventId", de->de_bcast->id);

if (de->de_timerec)
htsmsg_add_str(out, "timerecId", idnode_uuid_as_str(&de->de_timerec->dte_id, ubuf));
if (de->de_autorec)
htsmsg_add_str(out, "autorecId", idnode_uuid_as_str(&de->de_autorec->dae_id, ubuf));

htsmsg_add_s64(out, "start", de->de_start);
htsmsg_add_s64(out, "stop", de->de_stop);
htsmsg_add_s64(out, "startExtra", dvr_entry_get_extra_time_pre(de)/60);
htsmsg_add_s64(out, "stopExtra", dvr_entry_get_extra_time_post(de)/60);
if (de->de_timerec)
htsmsg_add_str(out, "timerecId", idnode_uuid_as_str(&de->de_timerec->dte_id, ubuf));

if (htsp->htsp_version > 24)
htsmsg_add_u32(out, "retention", dvr_entry_get_retention_days(de));
else
htsmsg_add_u32(out, "retention", dvr_entry_get_retention_days(de) == DVR_RET_ONREMOVE ?
dvr_entry_get_removal_days(de) : dvr_entry_get_retention_days(de));

htsmsg_add_u32(out, "removal", dvr_entry_get_removal_days(de));
htsmsg_add_u32(out, "priority", de->de_pri);
htsmsg_add_u32(out, "contentType", de->de_content_type);

if(de->de_title && (s = lang_str_get(de->de_title, lang)))
htsmsg_add_str(out, "title", s);
if(de->de_subtitle && (s = lang_str_get(de->de_subtitle, lang)))
htsmsg_add_str(out, "subtitle", s);
if(de->de_desc && (s = lang_str_get(de->de_desc, lang)))
htsmsg_add_str(out, "description", s);
if(de->de_episode)
htsmsg_add_str(out, "episode", de->de_episode);
if(de->de_owner)
htsmsg_add_str(out, "owner", de->de_owner);
if(de->de_creator)
htsmsg_add_str(out, "creator", de->de_creator);
if(de->de_comment)
htsmsg_add_str(out, "comment", de->de_comment);


last = NULL;
if (!htsmsg_is_empty(de->de_files) && de->de_config) {
l = htsmsg_create_list();
HTSMSG_FOREACH(f, de->de_files) {
m = htsmsg_field_get_map(f);
if (m == NULL) continue;
s = last = htsmsg_get_str(m, "filename");
if (s && (p = tvh_strbegins(s, de->de_config->dvr_storage)) != NULL) {
e = htsmsg_copy(m);
htsmsg_set_str(e, "filename", p);
info = htsmsg_get_list(m, "info");
if (info)
htsmsg_set_msg(e, "info", htsmsg_copy(info));
htsmsg_add_msg(l, NULL, e);
htsmsg_add_s64(out, "start", de->de_start);
htsmsg_add_s64(out, "stop", de->de_stop);
htsmsg_add_s64(out, "startExtra", dvr_entry_get_extra_time_pre(de)/60);
htsmsg_add_s64(out, "stopExtra", dvr_entry_get_extra_time_post(de)/60);

if (htsp->htsp_version > 24)
htsmsg_add_u32(out, "retention", dvr_entry_get_retention_days(de));
else
htsmsg_add_u32(out, "retention", dvr_entry_get_retention_days(de) == DVR_RET_ONREMOVE ?
dvr_entry_get_removal_days(de) : dvr_entry_get_retention_days(de));

htsmsg_add_u32(out, "removal", dvr_entry_get_removal_days(de));
htsmsg_add_u32(out, "priority", de->de_pri);
htsmsg_add_u32(out, "contentType", de->de_content_type);

if(de->de_title && (s = lang_str_get(de->de_title, lang)))
htsmsg_add_str(out, "title", s);
if(de->de_subtitle && (s = lang_str_get(de->de_subtitle, lang)))
htsmsg_add_str(out, "subtitle", s);
if(de->de_desc && (s = lang_str_get(de->de_desc, lang)))
htsmsg_add_str(out, "description", s);
if(de->de_episode)
htsmsg_add_str(out, "episode", de->de_episode);
if(de->de_owner)
htsmsg_add_str(out, "owner", de->de_owner);
if(de->de_creator)
htsmsg_add_str(out, "creator", de->de_creator);
if(de->de_comment)
htsmsg_add_str(out, "comment", de->de_comment);

last = NULL;
if (!htsmsg_is_empty(de->de_files) && de->de_config) {
l = htsmsg_create_list();
HTSMSG_FOREACH(f, de->de_files) {
m = htsmsg_field_get_map(f);
if (m == NULL) continue;
s = last = htsmsg_get_str(m, "filename");
if (s && (p = tvh_strbegins(s, de->de_config->dvr_storage)) != NULL) {
e = htsmsg_copy(m);
htsmsg_set_str(e, "filename", p);
info = htsmsg_get_list(m, "info");
if (info)
htsmsg_set_msg(e, "info", htsmsg_copy(info));
htsmsg_add_msg(l, NULL, e);
}
}
htsmsg_add_msg(out, "files", l);
}
htsmsg_add_msg(out, "files", l);
}

if(last && de->de_config)
if ((p = tvh_strbegins(last, de->de_config->dvr_storage)))
htsmsg_add_str(out, "path", p);
if(last && de->de_config)
if ((p = tvh_strbegins(last, de->de_config->dvr_storage)))
htsmsg_add_str(out, "path", p);
}

switch(de->de_sched_state) {
case DVR_SCHEDULED:
Expand Down Expand Up @@ -1490,7 +1493,7 @@ htsp_method_async(htsp_connection_t *htsp, htsmsg_t *in)
/* Send all DVR entries */
LIST_FOREACH(de, &dvrentries, de_global_link)
if (!dvr_entry_verify(de, htsp->htsp_granted_access, 1))
htsp_send_message(htsp, htsp_build_dvrentry(htsp, de, "dvrEntryAdd", htsp->htsp_language), NULL);
htsp_send_message(htsp, htsp_build_dvrentry(htsp, de, "dvrEntryAdd", htsp->htsp_language, 0), NULL);

/* Send EPG updates */
if (epg)
Expand Down Expand Up @@ -3518,7 +3521,7 @@ _htsp_dvr_entry_update(dvr_entry_t *de, const char *method, htsmsg_t *msg)
if (htsp->htsp_async_mode & HTSP_ASYNC_ON)
if (!dvr_entry_verify(de, htsp->htsp_granted_access, 1)) {
htsmsg_t *m = msg ? htsmsg_copy(msg)
: htsp_build_dvrentry(htsp, de, method, htsp->htsp_language);
: htsp_build_dvrentry(htsp, de, method, htsp->htsp_language, 0);
htsp_send_message(htsp, m, NULL);
}
}
Expand All @@ -3544,6 +3547,23 @@ htsp_dvr_entry_update(dvr_entry_t *de)
_htsp_dvr_entry_update(de, "dvrEntryUpdate", NULL);
}

/**
* Called from dvr_rec.c when a DVR entry is recording
*/
void
htsp_dvr_entry_update_stats(dvr_entry_t *de)
{
htsp_connection_t *htsp;
LIST_FOREACH(htsp, &htsp_async_connections, htsp_async_link) {
if (htsp->htsp_async_mode & HTSP_ASYNC_ON){
if (!dvr_entry_verify(de, htsp->htsp_granted_access, 1)) {
htsmsg_t *m = htsp_build_dvrentry(htsp, de, "dvrEntryUpdate", htsp->htsp_language, htsp->htsp_version <= 25 ? 0 : 1);
htsp_send_message(htsp, m, NULL);
}
}
}
}


/**
* Called from dvr_db.c when a DVR entry is deleted
Expand Down Expand Up @@ -3720,8 +3740,7 @@ _htsp_event_update(epg_broadcast_t *ebc, const char *method, htsmsg_t *msg)
if (!htsp->htsp_epg_window || ebc->start <= htsp->htsp_epg_lastupdate) {
if (htsp_user_access_channel(htsp,ebc->channel)) {
htsmsg_t *m = msg ? htsmsg_copy(msg)
: htsp_build_event(ebc, method, htsp->htsp_language,
0, htsp);
: htsp_build_event(ebc, method, htsp->htsp_language, 0, htsp);
htsp_send_message(htsp, m, NULL);
}
}
Expand Down Expand Up @@ -3757,7 +3776,7 @@ htsp_event_delete(epg_broadcast_t *ebc)
htsmsg_t *m = htsmsg_create_map();
htsmsg_add_str(m, "method", "eventDelete");
htsmsg_add_u32(m, "eventId", ebc->id);
_htsp_event_update(ebc, NULL, m);
htsp_async_send(m, HTSP_ASYNC_EPG, HTSP_ASYNC_AUX_EPG, ebc);
}

const static char frametypearray[PKT_NTYPES] = {
Expand Down
1 change: 1 addition & 0 deletions src/htsp_server.h
Expand Up @@ -38,6 +38,7 @@ void htsp_tag_delete(channel_tag_t *ct);

void htsp_dvr_entry_add(dvr_entry_t *de);
void htsp_dvr_entry_update(dvr_entry_t *de);
void htsp_dvr_entry_update_stats(dvr_entry_t *de);
void htsp_dvr_entry_delete(dvr_entry_t *de);

void htsp_autorec_entry_add(dvr_autorec_entry_t *dae);
Expand Down

0 comments on commit c6aa155

Please sign in to comment.