<img src="docresources/dvrlog2.png">
<p>
-Once the recording is completed there will be a clickable link to a playlist
+Once the recording is completed there will be a clickable link to a playlist
for the recorded file (XSPF or M3U as per your startup options) so you can watch
it.</p>
<div class="hts-doc-text">
-<p>Tvheadend has a built in Electronic Program Guide. The EPG is an in-memory
+<p>Tvheadend has a built-in Electronic Program Guide. The EPG is an in-memory
database populated with all the information about events received from
the DVB networks over-the-air or from external grabbers such as XMLTV.</p>
<p></p>
configured by the administrator. You can start typing a tag name to filter the list.</dd>
<dt>[Filter content type...]</dt>
<dd>
- Only display events that match the given content type tag. Most DVB networks
+ Only display events that match the given content type tag. Most DVB networks
classify their events into content groups. This field allows you to filter based
on content type (e.g. "Sports" or "Game Show"). Supported tags are determined by
your broadcaster. Again, simply start typing to filter the entries if you have a
rolling broadcasts.</dd>
<dd> </dd>
<dd>Options are:</dd>
-
+
<table class="hts-doc-text" border="0">
<tr><td>00:00:01 to 00:15:00 - for very short news bulletins, children's programmes, etc.</td></tr>
<tr><td>00:15:01 to 00:30:00 - for short programmes, e.g. daily soap operas</td></tr>
</table>
</dl>
-
+
<p>So, if you only want to see Movies from your available HD channels, you
would select 'HDTV' in the <i>[Filter tag...]</i> field, and select
'Movie / Drama' in the <i>[Filter content type...]</i> field. If you wish, you
htsmsg_t *l = NULL, *e;
int min_duration;
int max_duration;
-
+
*resp = htsmsg_create_map();
/* Query params */
min_duration = htsmsg_get_u32_or_default(args, "minduration", 0);
max_duration = htsmsg_get_u32_or_default(args, "maxduration", INT_MAX);
-
+
/* Pagination settings */
start = htsmsg_get_u32_or_default(args, "start", 0);
limit = htsmsg_get_u32_or_default(args, "limit", 50);
if(abs(mktime(&a_time) - mktime(&ev_time)) > 900)
return 0;
}
-
+
duration = difftime(e->stop,e->start);
-
+
if(dae->dae_minduration) {
if(duration < dae->dae_minduration) return 0;
}
-
+
if(dae->dae_maxduration) {
if(duration > dae->dae_maxduration) return 0;
}
-
+
if(dae->dae_weekdays != 0x7f) {
struct tm tm;
localtime_r(&e->start, &tm);
if (max_duration)
dae->dae_maxduration = max_duration;
-
+
if(serieslink) {
serieslink->getref(serieslink);
dae->dae_serieslink = serieslink;
if ( !(title = epg_episode_get_title(e->episode, lang)) ) return;
if ( genre && !epg_genre_list_contains(&e->episode->genre, genre, 1) ) return;
if ( preg && regexec(preg, title, 0, NULL, 0)) return;
-
+
duration = difftime(e->stop,e->start);
if ( duration < min_duration || duration > max_duration ) return;
-
+
/* More space */
if ( eqr->eqr_entries == eqr->eqr_alloced ) {
eqr->eqr_alloced = MAX(100, eqr->eqr_alloced * 2);
const char *tag = http_arg_get(&hc->hc_req_args, "tag");
const char *title = http_arg_get(&hc->hc_req_args, "title");
const char *lang = http_arg_get(&hc->hc_args, "Accept-Language");
-
+
int min_duration;
int max_duration;
if((s = http_arg_get(&hc->hc_req_args, "minduration")) != NULL)
min_duration = atoi(s);
else
- min_duration = 0;
+ min_duration = 0;
if((s = http_arg_get(&hc->hc_req_args, "maxduration")) != NULL)
max_duration = atoi(s);
int min_duration;
int max_duration;
epg_genre_t genre, *eg = NULL;
-
+
if ((s = http_arg_get(&hc->hc_req_args, "contenttype"))) {
genre.code = atoi(s);
eg = &genre;
if((s = http_arg_get(&hc->hc_req_args, "minduration")) != NULL)
min_duration = atoi(s);
else
- min_duration = 0;
+ min_duration = 0;
if((s = http_arg_get(&hc->hc_req_args, "maxduration")) != NULL)
max_duration = atoi(s);
if (record.isModified('channel') && record.data.channel == -1)
record.set('channel',"");
-
+
if (record.isModified('tag') && record.data.tag == '(Clear filter)')
record.set('tag',"");
-
+
if (record.isModified('contenttype') && record.data.contenttype == -1)
record.set('contenttype',"");
}
});
-
+
return new tvheadend.tableEditor('Automatic Recorder', 'autorec', cm,
tvheadend.autorecRecord, [], tvheadend.autorecStore,
'autorec.html', 'wand');
tvheadend.channelLookupName = function(key) {
channelString = "";
-
+
var index = tvheadend.channels.find('key', key);
-
+
if (index !== -1)
var channelString = tvheadend.channels.getAt(index).get('val');
-
+
return channelString;
-};
+};
// Store for duration filters - EPG, autorec dialog and autorec rules in the DVR grid
// NB: 'no max' is defined as 9999999s, or about 3 months...
});
// Function to convert numeric duration to corresponding label string
-// Note: triggered by minimum duration only. This would fail if ranges
+// Note: triggered by minimum duration only. This would fail if ranges
// had the same minimum (e.g. 15-30 mins and 15-60 minutes) (which we don't have).
tvheadend.durationLookupRange = function(value) {
durationString = "";
- var index = tvheadend.DurationStore.find('minvalue', value);
+ var index = tvheadend.DurationStore.find('minvalue', value);
if (index !== -1)
var durationString = tvheadend.DurationStore.getAt(index).data.label;
-
+
return durationString;
-};
+};
tvheadend.epgDetails = function(event) {
});
-/*
+/*
* Clear filter functions
*/
delete epgStore.baseParams.maxduration;
epgFilterDuration.setValue("");
};
-
+
function epgQueryClear() {
clearTitleFilter();
clearChannelFilter();
/*
* Filter selection event handlers
*/
-
+
epgFilterChannels.on('select', function(c, r) {
- if (r.data.key == -1)
+ if (r.data.key == -1)
clearChannelFilter();
else if (epgStore.baseParams.channel !== r.data.key)
epgStore.baseParams.channel = r.data.key;
epgStore.baseParams.tag = r.data.name;
epgStore.reload();
});
-
+
epgFilterContentGroup.on('select', function(c, r) {
if (r.data.code == -1)
clearContentGroupFilter();
}
epgStore.reload();
});
-
+
epgFilterTitle.on('valid', function(c) {
var value = c.getValue();