mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-17 19:08:18 -07:00
add new voice commands
This commit is contained in:
parent
ab9c6f4ac2
commit
998cbefa8a
@ -25,14 +25,14 @@
|
||||
"web-component-tester": "*",
|
||||
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
|
||||
},
|
||||
"homepage": "https://github.com/polymerelements/iron-meta",
|
||||
"homepage": "https://github.com/PolymerElements/iron-meta",
|
||||
"_release": "1.0.3",
|
||||
"_resolution": {
|
||||
"type": "version",
|
||||
"tag": "v1.0.3",
|
||||
"commit": "91529259262b0d8f33fed44bc3fd47aedf35cb04"
|
||||
},
|
||||
"_source": "git://github.com/polymerelements/iron-meta.git",
|
||||
"_source": "git://github.com/PolymerElements/iron-meta.git",
|
||||
"_target": "^1.0.0",
|
||||
"_originalSource": "polymerelements/iron-meta"
|
||||
"_originalSource": "PolymerElements/iron-meta"
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "paper-input",
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.7",
|
||||
"description": "Material design text fields",
|
||||
"authors": [
|
||||
"The Polymer Authors"
|
||||
@ -42,11 +42,11 @@
|
||||
"web-component-tester": "*",
|
||||
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
|
||||
},
|
||||
"_release": "1.0.6",
|
||||
"_release": "1.0.7",
|
||||
"_resolution": {
|
||||
"type": "version",
|
||||
"tag": "v1.0.6",
|
||||
"commit": "327605642c1bfa5366c0d3effc638b81f24c3adc"
|
||||
"tag": "v1.0.7",
|
||||
"commit": "b3150c105a4599d50a2da0789789fa50fa73e644"
|
||||
},
|
||||
"_source": "git://github.com/PolymerElements/paper-input.git",
|
||||
"_target": "^1.0.0",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "paper-input",
|
||||
"version": "1.0.6",
|
||||
"version": "1.0.7",
|
||||
"description": "Material design text fields",
|
||||
"authors": [
|
||||
"The Polymer Authors"
|
||||
|
@ -74,6 +74,8 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
|
||||
<paper-textarea label="textarea" char-counter></paper-textarea>
|
||||
|
||||
<paper-textarea label="textarea with maxlength" char-counter maxlength="10"></paper-textarea>
|
||||
|
||||
<paper-textarea label="text area with rows and max-rows" rows="3" max-rows="4"><paper-textarea>
|
||||
</div>
|
||||
|
||||
<h4>Complex inputs</h4>
|
||||
|
@ -48,7 +48,9 @@ style this element.
|
||||
readonly$="[[readonly]]"
|
||||
required$="[[required]]"
|
||||
maxlength$="[[maxlength]]"
|
||||
autocapitalize$="[[autocapitalize]]"></iron-autogrow-textarea>
|
||||
autocapitalize$="[[autocapitalize]]"
|
||||
rows$="[[rows]]"
|
||||
max-rows$="[[maxRows]]"></iron-autogrow-textarea>
|
||||
|
||||
<template is="dom-if" if="[[errorMessage]]">
|
||||
<paper-input-error>[[errorMessage]]</paper-input-error>
|
||||
@ -86,7 +88,32 @@ style this element.
|
||||
_ariaDescribedBy: {
|
||||
observer: '_ariaDescribedByChanged',
|
||||
type: String
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* The initial number of rows.
|
||||
*
|
||||
* @attribute rows
|
||||
* @type number
|
||||
* @default 1
|
||||
*/
|
||||
rows: {
|
||||
type: Number,
|
||||
value: 1
|
||||
},
|
||||
|
||||
/**
|
||||
* The maximum number of rows this element can grow to until it
|
||||
* scrolls. 0 means no maximum.
|
||||
*
|
||||
* @attribute maxRows
|
||||
* @type number
|
||||
* @default 0
|
||||
*/
|
||||
maxRows: {
|
||||
type: Number,
|
||||
value: 0
|
||||
},
|
||||
|
||||
},
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
"tag": "v1.0.11",
|
||||
"commit": "347542e9ebe3e6e5f0830ee10e1c20c12956ff2c"
|
||||
},
|
||||
"_source": "git://github.com/PolymerLabs/paper-styles.git",
|
||||
"_source": "git://github.com/PolymerElements/paper-styles.git",
|
||||
"_target": "^1.0.0",
|
||||
"_originalSource": "PolymerLabs/paper-styles"
|
||||
"_originalSource": "PolymerElements/paper-styles"
|
||||
}
|
@ -51,11 +51,6 @@
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.mainDrawerPanelPreInit #main {
|
||||
left: 0 !important;
|
||||
position: static !important;
|
||||
}
|
||||
|
||||
.mainDrawerPanel #drawer {
|
||||
z-index: 1099 !important;
|
||||
position: fixed !important;
|
||||
|
@ -49,9 +49,9 @@
|
||||
<paper-fab icon="movie" class="btnChapters videoButton btnPlayStateCommand subdued" title="${ButtonScenes}" data-command="GoToSearch"></paper-fab>
|
||||
<paper-fab icon="fullscreen" class="btnToggleFullscreen videoButton btnPlayStateCommand subdued" title="${ButtonFullscreen}" data-command="ToggleFullscreen"></paper-fab>
|
||||
</div>
|
||||
<div class="buttonsRow3">
|
||||
<!--<div class="buttonsRow3">
|
||||
<paper-fab icon="info" class="btnCommand videoButton subdued" title="${ButtonOsd}" data-command="ToggleOsdMenu"></paper-fab>
|
||||
</div>
|
||||
</div>-->
|
||||
<div class="nowPlayingPageVolumeControl">
|
||||
<paper-fab icon="repeat" class="btnCommand subdued repeatToggleButton" title="${ButtonRepeat}" data-command="SetRepeatMode"></paper-fab>
|
||||
<paper-fab icon="volume-off" class="btnCommand subdued volumeButton" title="${ButtonMute}" data-command="ToggleMute"></paper-fab>
|
||||
|
@ -1,16 +1,5 @@
|
||||
(function ($, window) {
|
||||
|
||||
function setMirrorModeEnabled(enabled) {
|
||||
|
||||
var val = enabled ? '1' : '0';
|
||||
|
||||
appStorage.setItem('displaymirror--' + Dashboard.getCurrentUserId(), val);
|
||||
|
||||
}
|
||||
function isMirrorModeEnabled() {
|
||||
return (appStorage.getItem('displaymirror--' + Dashboard.getCurrentUserId()) || '') != '0';
|
||||
}
|
||||
|
||||
var currentDisplayInfo;
|
||||
function mirrorItem(info) {
|
||||
|
||||
@ -25,9 +14,11 @@
|
||||
});
|
||||
}
|
||||
|
||||
function mirrorIfEnabled(info) {
|
||||
function mirrorIfEnabled() {
|
||||
|
||||
if (isMirrorModeEnabled()) {
|
||||
var info = currentDisplayInfo;
|
||||
|
||||
if (info && MediaController.enableDisplayMirroring()) {
|
||||
|
||||
var player = MediaController.getPlayerInfo();
|
||||
|
||||
@ -110,9 +101,9 @@
|
||||
|
||||
html += '<p class="fieldDescription">' + Globalize.translate('LabelAllPlaysSentToPlayer') + '</p>';
|
||||
|
||||
checkedHtml = isMirrorModeEnabled() ? ' checked="checked"' : '';
|
||||
checkedHtml = MediaController.enableDisplayMirroring() ? ' checked="checked"' : '';
|
||||
|
||||
html += '<div style="margin-top:1.5em;" class="fldMirrorMode"><label for="chkEnableMirrorMode">Enable display mirroring</label><input type="checkbox" class="chkEnableMirrorMode" id="chkEnableMirrorMode" data-mini="true"' + checkedHtml + ' /></div>';
|
||||
html += '<div style="margin-top:1.5em;" class="fldMirrorMode"><label for="chkEnableMirrorMode">' + Globalize.translate('OptionEnableDisplayMirroring') + '</label><input type="checkbox" class="chkEnableMirrorMode" id="chkEnableMirrorMode" data-mini="true"' + checkedHtml + ' /></div>';
|
||||
|
||||
html += '</form>';
|
||||
|
||||
@ -146,13 +137,7 @@
|
||||
$('.players', elem).html(getTargetsHtml(targets)).trigger('create');
|
||||
|
||||
$('.chkEnableMirrorMode', elem).on('change', function () {
|
||||
setMirrorModeEnabled(this.checked);
|
||||
|
||||
if (this.checked && currentDisplayInfo) {
|
||||
|
||||
mirrorItem(currentDisplayInfo);
|
||||
|
||||
}
|
||||
MediaController.enableDisplayMirroring(this.checked);
|
||||
|
||||
});
|
||||
|
||||
@ -182,10 +167,7 @@
|
||||
|
||||
});
|
||||
|
||||
if (currentDisplayInfo) {
|
||||
|
||||
mirrorIfEnabled(currentDisplayInfo);
|
||||
}
|
||||
mirrorIfEnabled();
|
||||
|
||||
});
|
||||
|
||||
@ -343,6 +325,27 @@
|
||||
});
|
||||
};
|
||||
|
||||
self.trySetActiveDeviceName = function (name) {
|
||||
|
||||
function normalizeName(t) {
|
||||
return t.toLowerCase().replace(' ', '');
|
||||
}
|
||||
|
||||
name = normalizeName(name);
|
||||
|
||||
self.getTargets().done(function (result) {
|
||||
|
||||
var target = result.filter(function (p) {
|
||||
return normalizeName(p.name) == name;
|
||||
})[0];
|
||||
|
||||
if (target) {
|
||||
self.trySetActivePlayer(target.playerName, target);
|
||||
}
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
self.setDefaultPlayerActive = function () {
|
||||
|
||||
var player = self.getDefaultPlayer();
|
||||
@ -417,6 +420,26 @@
|
||||
});
|
||||
}
|
||||
|
||||
self.toggleDisplayMirroring = function () {
|
||||
self.enableDisplayMirroring(!self.enableDisplayMirroring());
|
||||
};
|
||||
|
||||
self.enableDisplayMirroring = function (enabled) {
|
||||
|
||||
if (enabled != null) {
|
||||
|
||||
var val = enabled ? '1' : '0';
|
||||
appStorage.setItem('displaymirror--' + Dashboard.getCurrentUserId(), val);
|
||||
|
||||
if (enabled) {
|
||||
mirrorIfEnabled();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
return (appStorage.getItem('displaymirror--' + Dashboard.getCurrentUserId()) || '') != '0';
|
||||
};
|
||||
|
||||
self.play = function (options) {
|
||||
|
||||
doWithPlaybackValidation(function () {
|
||||
|
@ -123,13 +123,6 @@
|
||||
var isVlc = AppInfo.isNativeApp && $.browser.android;
|
||||
var bitrateSetting = AppSettings.maxStreamingBitrate();
|
||||
|
||||
if (isVlc) {
|
||||
// Work around vlc 1080p stutter for now
|
||||
if ((maxHeight || 1080) >= 1080) {
|
||||
bitrateSetting = Math.min(bitrateSetting, 4000002);
|
||||
}
|
||||
}
|
||||
|
||||
var canPlayWebm = self.canPlayWebm();
|
||||
|
||||
var profile = {};
|
||||
|
@ -521,10 +521,8 @@
|
||||
|
||||
if (item && item.MediaType == 'Audio') {
|
||||
$('.buttonsRow2', page).hide();
|
||||
$('.buttonsRow3', page).hide();
|
||||
} else {
|
||||
$('.buttonsRow2', page).show();
|
||||
$('.buttonsRow3', page).show();
|
||||
}
|
||||
|
||||
var toggleRepeatButton = page.querySelector('.repeatToggleButton');
|
||||
@ -751,7 +749,7 @@
|
||||
|
||||
$('.requiresJqmCreate', this).trigger('create');
|
||||
|
||||
var tabs = page.querySelectorAll('paper-tabs')[0];
|
||||
var tabs = page.querySelector('paper-tabs');
|
||||
tabs.alignBottom = true;
|
||||
|
||||
LibraryBrowser.configureSwipeTabs(page, tabs, page.querySelectorAll('neon-animated-pages')[0]);
|
||||
|
@ -36,6 +36,11 @@
|
||||
|
||||
commands.push('show my tv guide');
|
||||
commands.push('pull up my recordings');
|
||||
commands.push('control chromecast');
|
||||
commands.push('control [device name]');
|
||||
commands.push('turn on display mirroring');
|
||||
commands.push('turn off display mirroring');
|
||||
commands.push('toggle display mirroring');
|
||||
|
||||
deferred.resolveWith(null, [shuffleArray(commands)]);
|
||||
|
||||
@ -75,6 +80,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
result.what = text;
|
||||
|
||||
text = text.trim();
|
||||
var words = text.toLowerCase().split(' ');
|
||||
|
||||
@ -146,9 +153,18 @@
|
||||
userId: Dashboard.getCurrentUserId()
|
||||
};
|
||||
|
||||
var textLower = text.toLowerCase();
|
||||
var words = text.toLowerCase().split(' ');
|
||||
|
||||
if (words.indexOf('show') != -1 || words.indexOf('pull') != -1 || words.indexOf('display') != -1 || words.indexOf('go') != -1) {
|
||||
var displayWords = [
|
||||
'show',
|
||||
'pull up',
|
||||
'display',
|
||||
'go to',
|
||||
'view'
|
||||
];
|
||||
|
||||
if (displayWords.filter(function (w) { return textLower.indexOf(w) == 0; }).length) {
|
||||
|
||||
if (words.indexOf('guide') != -1) {
|
||||
result.action = 'show';
|
||||
@ -160,31 +176,92 @@
|
||||
result.category = 'recordings';
|
||||
}
|
||||
|
||||
result.removeWords.push('show');
|
||||
result.removeWords.push('pull up');
|
||||
result.removeWords.push('pull');
|
||||
result.removeWords.push('display');
|
||||
result.removeWords.push('go to');
|
||||
result.removeWords = displayWords;
|
||||
return result;
|
||||
}
|
||||
|
||||
if (words.indexOf('search') != -1 || words.indexOf('find') != -1) {
|
||||
var searchWords = [
|
||||
'search',
|
||||
'search for',
|
||||
'find',
|
||||
'query'
|
||||
];
|
||||
|
||||
if (searchWords.filter(function (w) { return textLower.indexOf(w) == 0; }).length) {
|
||||
|
||||
// Search
|
||||
result.action = 'search';
|
||||
|
||||
result.removeWords.push('search for');
|
||||
result.removeWords.push('search');
|
||||
result.removeWords.push('find');
|
||||
result.removeWords = searchWords;
|
||||
return result;
|
||||
}
|
||||
|
||||
if (words.indexOf('play') != -1) {
|
||||
var playWords = [
|
||||
'play',
|
||||
'watch'
|
||||
];
|
||||
|
||||
if (playWords.filter(function (w) { return textLower.indexOf(w) == 0; }).length) {
|
||||
|
||||
// Play
|
||||
result.action = 'play';
|
||||
|
||||
result.removeWords.push('play');
|
||||
result.removeWords = playWords;
|
||||
return result;
|
||||
}
|
||||
|
||||
var controlWords = [
|
||||
'use',
|
||||
'control'
|
||||
];
|
||||
|
||||
if (controlWords.filter(function (w) { return textLower.indexOf(w) == 0; }).length) {
|
||||
|
||||
// Play
|
||||
result.action = 'control';
|
||||
|
||||
result.removeWords = controlWords;
|
||||
return result;
|
||||
}
|
||||
|
||||
var enableWords = [
|
||||
'enable',
|
||||
'turn on'
|
||||
];
|
||||
|
||||
if (enableWords.filter(function (w) { return textLower.indexOf(w) == 0; }).length) {
|
||||
|
||||
// Play
|
||||
result.action = 'enable';
|
||||
|
||||
result.removeWords = enableWords;
|
||||
return result;
|
||||
}
|
||||
|
||||
var disableWords = [
|
||||
'disable',
|
||||
'turn off'
|
||||
];
|
||||
|
||||
if (disableWords.filter(function (w) { return textLower.indexOf(w) == 0; }).length) {
|
||||
|
||||
// Play
|
||||
result.action = 'disable';
|
||||
|
||||
result.removeWords = disableWords;
|
||||
return result;
|
||||
}
|
||||
|
||||
var toggleWords = [
|
||||
'toggle'
|
||||
];
|
||||
|
||||
if (toggleWords.filter(function (w) { return textLower.indexOf(w) == 0; }).length) {
|
||||
|
||||
// Play
|
||||
result.action = 'toggle';
|
||||
|
||||
result.removeWords = toggleWords;
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -237,6 +314,22 @@
|
||||
parseContext(text, result);
|
||||
playCommand(result);
|
||||
break;
|
||||
case 'control':
|
||||
parseContext(text, result);
|
||||
controlCommand(result);
|
||||
break;
|
||||
case 'enable':
|
||||
parseContext(text, result);
|
||||
enableCommand(result);
|
||||
break;
|
||||
case 'disable':
|
||||
parseContext(text, result);
|
||||
disableCommand(result);
|
||||
break;
|
||||
case 'toggle':
|
||||
parseContext(text, result);
|
||||
toggleCommand(result);
|
||||
break;
|
||||
default:
|
||||
deferred.reject();
|
||||
return;
|
||||
@ -258,6 +351,38 @@
|
||||
}
|
||||
}
|
||||
|
||||
function enableCommand(result) {
|
||||
|
||||
var what = result.what.toLowerCase();
|
||||
|
||||
if (what.indexOf('mirror') != -1) {
|
||||
MediaController.enableDisplayMirroring(true);
|
||||
}
|
||||
}
|
||||
|
||||
function disableCommand(result) {
|
||||
|
||||
var what = result.what.toLowerCase();
|
||||
|
||||
if (what.indexOf('mirror') != -1) {
|
||||
MediaController.enableDisplayMirroring(false);
|
||||
}
|
||||
}
|
||||
|
||||
function toggleCommand(result) {
|
||||
|
||||
var what = result.what.toLowerCase();
|
||||
|
||||
if (what.indexOf('mirror') != -1) {
|
||||
MediaController.toggleDisplayMirroring();
|
||||
}
|
||||
}
|
||||
|
||||
function controlCommand(result) {
|
||||
|
||||
MediaController.trySetActiveDeviceName(result.what);
|
||||
}
|
||||
|
||||
function playCommand(result, shuffle) {
|
||||
|
||||
var query = {
|
||||
@ -379,12 +504,12 @@
|
||||
html += '<p>' + Globalize.translate('MessageWeDidntRecognizeCommand') + '</p>';
|
||||
|
||||
html += '<br/>';
|
||||
html += '<button class="btn btnRetry" data-role="none" type="button"><span>' + Globalize.translate('ButtonTryAgain') + '</span><i class="fa fa-microphone"></i></button>';
|
||||
html += '<paper-button raised class="submit block btnRetry"><iron-icon icon="mic"></iron-icon><span>' + Globalize.translate('ButtonTryAgain') + '</span></paper-button>';
|
||||
html += '<p class="blockedMessage" style="display:none;">' + Globalize.translate('MessageIfYouBlockedVoice') + '<br/><br/></p>';
|
||||
|
||||
html += '</div>';
|
||||
|
||||
html += '<button class="btn btnCancel" data-role="none" type="button"><span>' + Globalize.translate('ButtonCancel') + '</span><i class="fa fa-close"></i></button>';
|
||||
html += '<paper-button raised class="block btnCancel" style="background-color:#444;"><iron-icon icon="close"></iron-icon><span>' + Globalize.translate('ButtonCancel') + '</span></paper-button>';
|
||||
|
||||
// voiceHelpContent
|
||||
html += '</div>';
|
||||
|
@ -17765,7 +17765,7 @@ paper-ripple {
|
||||
|
||||
<label hidden$="[[!label]]">[[label]]</label>
|
||||
|
||||
<iron-autogrow-textarea id="input" class="paper-input-input" bind-value="{{value}}" autocomplete$="[[autocomplete]]" autofocus$="[[autofocus]]" inputmode$="[[inputmode]]" name$="[[name]]" placeholder$="[[placeholder]]" readonly$="[[readonly]]" required$="[[required]]" maxlength$="[[maxlength]]" autocapitalize$="[[autocapitalize]]"></iron-autogrow-textarea>
|
||||
<iron-autogrow-textarea id="input" class="paper-input-input" bind-value="{{value}}" autocomplete$="[[autocomplete]]" autofocus$="[[autofocus]]" inputmode$="[[inputmode]]" name$="[[name]]" placeholder$="[[placeholder]]" readonly$="[[readonly]]" required$="[[required]]" maxlength$="[[maxlength]]" autocapitalize$="[[autocapitalize]]" rows$="[[rows]]" max-rows$="[[maxRows]]"></iron-autogrow-textarea>
|
||||
|
||||
<template is="dom-if" if="[[errorMessage]]">
|
||||
<paper-input-error>[[errorMessage]]</paper-input-error>
|
||||
@ -17803,7 +17803,32 @@ paper-ripple {
|
||||
_ariaDescribedBy: {
|
||||
observer: '_ariaDescribedByChanged',
|
||||
type: String
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* The initial number of rows.
|
||||
*
|
||||
* @attribute rows
|
||||
* @type number
|
||||
* @default 1
|
||||
*/
|
||||
rows: {
|
||||
type: Number,
|
||||
value: 1
|
||||
},
|
||||
|
||||
/**
|
||||
* The maximum number of rows this element can grow to until it
|
||||
* scrolls. 0 means no maximum.
|
||||
*
|
||||
* @attribute maxRows
|
||||
* @type number
|
||||
* @default 0
|
||||
*/
|
||||
maxRows: {
|
||||
type: Number,
|
||||
value: 0
|
||||
},
|
||||
|
||||
},
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user