WebUI: Add programme duration filtering

This commit is contained in:
Ian 2014-06-08 11:46:54 +01:00
parent 423617a426
commit 32ed32e4a4
3 changed files with 97 additions and 49 deletions

View file

@ -283,6 +283,24 @@ autorec_record_build(dvr_autorec_entry_t *dae)
build_weekday_tags(l, dae->dae_weekdays);
htsmsg_add_msg(e, "weekdays", l);
//IH
// This is where we add mindurationstring and maxdurationstring to the proceedings, I think
// Same question as to whether we deal with an offset, and absolute time (s), or the string.
// Increasingly, I think it should be the offset... although look at 'channel', above, that translates on the fly
//
// It also looks like we need to adjust dea to include the min/max fields (offset, absolute, string...)
// dvr_autorec_entry in dvr.h
// More thoughts...
//
// Channel group and contentype jus start from their base values (string/value
// as relevant). Start time (approx) does the same, but changes as soon as you
// select, so it isn't primed with the existing value - we could default to 0
// and max as well, 'you're changing it, here's the full range' sort of logic
//
// This way I don't care what it's set to beyond the string value for
// initial display purposes
htsmsg_add_str(e, "pri", dvr_val2pri(dae->dae_pri));
if (dae->dae_brand)

View file

@ -589,6 +589,33 @@ tvheadend.autoreceditor = function() {
emptyText: 'Only include content...'
})
},
// IH
// This will now bring through the real limit (i.e. seconds). We can look that up from the Store to turn it into an index
// or into a string equivalent, and populate the combobox with the same values so it will automatically match
// see epg.js for the lookup/conversion code
{
header: "Min"
/*dataIndex: minduration,
editor: new Ext.ux.form.ComboBox({
store: tvheadend.DurationStore,
mode: 'local',
valueField: 'value',
displayField: 'label'
})*/
},
{
header: "Max"
/*dataIndex: maxduration
editor: new Ext.ux.form.ComboBox({
store: tvheadend.DurationStore,
mode: 'local',
valueField: 'value',
displayField: 'label'
})*/
},
//
{
header: "Weekdays",
dataIndex: 'weekdays',
@ -786,6 +813,9 @@ tvheadend.dvr = function() {
tvheadend.autorecRecord = Ext.data.Record.create(['enabled', 'title',
'serieslink', 'channel', 'tag', 'creator', 'contenttype', 'comment',
//IH
'mindurationstring', 'maxdurationstring',
//
'weekdays', 'pri', 'approx_time', 'config_name']);
tvheadend.autorecStore = new Ext.data.JsonStore({

View file

@ -29,6 +29,22 @@ tvheadend.contentGroupLookupName = function(code) {
tvheadend.ContentGroupStore.setDefaultSort('code', 'ASC');
//IH
tvheadend.DurationStore = new Ext.data.SimpleStore({
storeId: 'durations',
id: 0,
fields: ['identifier','label','value'],
data: [['0','0 min',0],
['1','20 min', 1200],
['2','45 min', 2700],
['3','90 min', 5400],
['4','3 hrs', 10800],
['5','6 hrs', 21600],
['6','12 hrs', 43200],
['7','24 hrs', 86400]]
});
//
tvheadend.epgDetails = function(event) {
var content = '';
@ -410,13 +426,15 @@ tvheadend.epg = function() {
//IH
// Slider for duration selection, including tooltip function to display the appropriate string
var tip = new Ext.slider.Tip({
getText: function(thumb){
return thumb.slider.durations[thumb.value];
}
});
// Note: is there any way to seed the slider labels in one go, versus with specific lookups?
var durationSlider = new Ext.slider.MultiSlider({
width: 100,
values: [0, 7],
@ -424,47 +442,35 @@ tvheadend.epg = function() {
maxValue: 7,
increment: 1,
durations: {
0: '0 min',
1: '20 min',
2: '45 min',
3: '90 min',
4: '3 hrs',
5: '6 hrs',
6: '12 hrs',
7: '24 hrs'
},
seconds: {
0: 0,
1: 1200,
2: 2700,
3: 5400,
4: 10800,
5: 21600,
6: 43200,
7: 86400
0: tvheadend.DurationStore.getById(0).data.label,
1: tvheadend.DurationStore.getById(1).data.label,
2: tvheadend.DurationStore.getById(2).data.label,
3: tvheadend.DurationStore.getById(3).data.label,
4: tvheadend.DurationStore.getById(4).data.label,
5: tvheadend.DurationStore.getById(5).data.label,
6: tvheadend.DurationStore.getById(6).data.label,
7: tvheadend.DurationStore.getById(7).data.label
},
plugins: tip,
listeners: {
change: function(slider, thumb, value){
// setduration(slider, thumb, value);
setduration(slider);
}}
});
//
function epgQueryClear() {
//IH - reset the pointers before deleting the underlying variables - otherwise they reset to 0/24h not null/null
durationSlider.setValue(0,0);
durationSlider.setValue(1,7);
//
delete epgStore.baseParams.channel;
delete epgStore.baseParams.tag;
delete epgStore.baseParams.contenttype;
//IH
delete epgStore.baseParams.contenttypestring;
//
delete epgStore.baseParams.title;
//IH
delete epgStore.baseParams.minduration;
delete epgStore.baseParams.mindurationstring;
delete epgStore.baseParams.maxduration;
delete epgStore.baseParams.maxdurationstring;
//
epgFilterChannels.setValue("");
@ -472,11 +478,6 @@ tvheadend.epg = function() {
epgFilterContentGroup.setValue("");
epgFilterTitle.setValue("");
//IH
durationSlider.setValue(0,0);
durationSlider.setValue(1,7);
//
epgStore.reload();
}
@ -497,31 +498,30 @@ tvheadend.epg = function() {
epgFilterContentGroup.on('select', function(c, r) {
if (epgStore.baseParams.contenttype !== r.data.code) {
epgStore.baseParams.contenttype = r.data.code;
//IH
epgStore.baseParams.contenttypestring = tvheadend.contentGroupLookupName(r.data.code);
console.log('contentype is',epgStore.baseParams.contenttype,'contenttypestring is',epgStore.baseParams.contenttypestring);
//
epgStore.reload();
}
});
//IH ------------------
// setduration = function(slider, thumb, value) {
setduration = function(slider) {
console.log('durationSlider fired');
var min = slider.getValue(0);
var max = slider.getValue(1);
var minRec = tvheadend.DurationStore.getById(min);
var maxRec = tvheadend.DurationStore.getById(max);
console.log('Min:', min, "Duration:", slider.durations[min], slider.seconds[min]);
console.log('Max:', max, "Duration:", slider.durations[max], slider.seconds[max]);
epgStore.baseParams.minduration = slider.seconds[min];
epgStore.baseParams.mindurationstring = slider.durations[min];
epgStore.baseParams.maxduration = slider.seconds[max];
epgStore.baseParams.maxdurationstring = slider.durations[max];
epgStore.baseParams.minduration = minRec.data.value;
epgStore.baseParams.maxduration = maxRec.data.value;
//Debugging to test set and lookup
var index = tvheadend.DurationStore.find( 'value', epgStore.baseParams.minduration );
var string = tvheadend.DurationStore.getById(index).data.label;
console.log('Min Duration record:', index, 'string:', string);
var index = tvheadend.DurationStore.find( 'value', epgStore.baseParams.maxduration );
var string = tvheadend.DurationStore.getById(index).data.label;
console.log('Max Duration record:', index, 'string:', string);
//
epgStore.reload();
};
//
@ -617,17 +617,17 @@ tvheadend.epg = function() {
var tag = epgStore.baseParams.tag ? epgStore.baseParams.tag
: "<i>Don't care</i>";
//IH - correct to display content type as a string as opposed to the underlying (lookup) code
// var contenttype = epgStore.baseParams.contenttype ? epgStore.baseParams.contenttype
var contenttype = epgStore.baseParams.contenttypestring ? epgStore.baseParams.contenttypestring
var contenttype = epgStore.baseParams.contenttype ? tvheadend.contentGroupLookupName(epgStore.baseParams.contenttype)
//
: "<i>Don't care</i>";
//IH
var minduration = epgStore.baseParams.mindurationstring ? epgStore.baseParams.mindurationstring
var minduration = epgStore.baseParams.minduration ? tvheadend.DurationStore.getById(tvheadend.DurationStore.find('value', epgStore.baseParams.minduration)).data.label
: "<i>Don't care</i>";
var maxduration = epgStore.baseParams.maxdurationstring ? epgStore.baseParams.maxdurationstring
var maxduration = epgStore.baseParams.maxduration ? tvheadend.DurationStore.getById(tvheadend.DurationStore.find('value', epgStore.baseParams.maxduration)).data.label
: "<i>Don't care</i>";
//
Ext.MessageBox.confirm('Auto Recorder', 'This will create an automatic rule that '
+ 'continuously scans the EPG for programmes '
//IH - correct typo
@ -652,7 +652,7 @@ tvheadend.epg = function() {
//
// IH: TO DO
//
// Check that contenttype is still passed correctly (epgStore.baseParams.contenttype) to autorec vs the new contenttypestring
// Check that contenttype is still passed correctly (epgStore.baseParams.contenttype) to autorec vs the new contenttypestring - SHOULDN'T HAVE CHANGED
// Add min/max to autorec rules (C)
// Check they're displayed (js)
//