add mic to header
This commit is contained in:
parent
962908d145
commit
99f5167804
36 changed files with 715 additions and 106 deletions
|
@ -47,7 +47,35 @@
|
|||
|
||||
}
|
||||
|
||||
$(document).on('pageshow', "#kidsPage", function () {
|
||||
function onPinSubmit() {
|
||||
var page = $(this).parents('.page');
|
||||
|
||||
if (validatePin(page)) {
|
||||
|
||||
$('.kidsOptionsLogin', page).hide();
|
||||
$('.kidsOptions', page).fadeIn();
|
||||
|
||||
} else {
|
||||
Dashboard.alert({
|
||||
message: 'Invalid pin code entered. Please try again.',
|
||||
title: 'Input Error'
|
||||
});
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function onOptionsSubmit() {
|
||||
var page = $(this).parents('.page');
|
||||
|
||||
$('.kidsOptions', page).fadeOut();
|
||||
$('.btnOptions', page).show();
|
||||
$('.kidContent', page).show();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$(document).on('pageshowready', "#kidsPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
|
@ -63,7 +91,7 @@
|
|||
|
||||
$('.kidsBackdropContainer').css('background-image', 'url(css/images/kids/bg.jpg)');
|
||||
|
||||
}).on('pageinit', "#kidsPage", function () {
|
||||
}).on('pageinitdepends', "#kidsPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
|
@ -87,39 +115,9 @@
|
|||
$('.btnOptions', page).show();
|
||||
$('.kidContent', page).show();
|
||||
});
|
||||
|
||||
$('.kidPinForm').off('submit', onPinSubmit).on('submit', onPinSubmit);
|
||||
$('.kidsOptionsForm').off('submit', onOptionsSubmit).on('submit', onOptionsSubmit);
|
||||
});
|
||||
|
||||
window.KidsPage = {
|
||||
|
||||
onPinSubmit: function () {
|
||||
|
||||
var page = $(this).parents('.page');
|
||||
|
||||
if (validatePin(page)) {
|
||||
|
||||
$('.kidsOptionsLogin', page).hide();
|
||||
$('.kidsOptions', page).fadeIn();
|
||||
|
||||
} else {
|
||||
Dashboard.alert({
|
||||
message: 'Invalid pin code entered. Please try again.',
|
||||
title: 'Input Error'
|
||||
});
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
onOptionsSubmit: function () {
|
||||
|
||||
var page = $(this).parents('.page');
|
||||
|
||||
$('.kidsOptions', page).fadeOut();
|
||||
$('.btnOptions', page).show();
|
||||
$('.kidContent', page).show();
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery, document, window);
|
||||
|
|
|
@ -1480,6 +1480,8 @@
|
|||
html += LibraryBrowser.getGroupCountIndicator(item);
|
||||
}
|
||||
|
||||
html += LibraryBrowser.getSyncIndicator(item);
|
||||
|
||||
if (mediaSourceCount > 1) {
|
||||
html += '<div class="mediaSourceIndicator">' + mediaSourceCount + '</div>';
|
||||
}
|
||||
|
@ -1848,6 +1850,23 @@
|
|||
return '';
|
||||
},
|
||||
|
||||
getSyncIndicator: function (item) {
|
||||
|
||||
if (item.SyncStatus) {
|
||||
if (item.SyncStatus == 'Queued' || item.SyncStatus == 'Converting' || item.SyncStatus == 'ReadyToTransfer' || item.SyncStatus == 'Transferring') {
|
||||
|
||||
return '<div class="syncIndicator syncWorkingIndicator"><i class="fa fa-refresh"></i></div>';
|
||||
}
|
||||
|
||||
if (item.SyncStatus == 'Synced') {
|
||||
|
||||
return '<div class="syncIndicator"><i class="fa fa-refresh"></i></div>';
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
},
|
||||
|
||||
getAveragePrimaryImageAspectRatio: function (items) {
|
||||
|
||||
var values = [];
|
||||
|
|
|
@ -450,7 +450,7 @@
|
|||
}
|
||||
|
||||
if (commands.indexOf('sync') != -1) {
|
||||
html += '<li data-icon="cloud"><a href="#" class="btnSync" data-itemId="' + itemId + '">' + Globalize.translate('ButtonSync') + '</a></li>';
|
||||
html += '<li data-icon="refresh"><a href="#" class="btnSync" data-itemId="' + itemId + '">' + Globalize.translate('ButtonSync') + '</a></li>';
|
||||
}
|
||||
|
||||
html += '</ul>';
|
||||
|
@ -707,7 +707,7 @@
|
|||
if (SyncManager.isAvailable(item, user)) {
|
||||
contentHtml += '<div class="detailsMenuButtonContainer">';
|
||||
contentHtml += '<a href="#" class="btn btnSync">';
|
||||
contentHtml += '<i class="fa fa-cloud"></i>';
|
||||
contentHtml += '<i class="fa fa-refresh"></i>';
|
||||
contentHtml += '<span>' + Globalize.translate('ButtonSync') + '</span>';
|
||||
contentHtml += '</a>';
|
||||
contentHtml += '</div>';
|
||||
|
|
|
@ -31,7 +31,11 @@
|
|||
html += '</form>';
|
||||
html += '</div>';
|
||||
|
||||
html += '<a href="dashboard.html" class="headerButton headerButtonRight dashboardEntryHeaderButton" style="display:none;"><i class="material-icons">settings</i></a>';
|
||||
html += '<button onclick="VoiceInputManager.startListening();" type="button" data-role="none" class="headerButton headerButtonRight headerVoiceButton" style="display:none;"><i class="material-icons">mic</i></button>';
|
||||
|
||||
if (!$.browser.mobile) {
|
||||
html += '<a href="dashboard.html" class="headerButton headerButtonRight dashboardEntryHeaderButton" style="display:none;"><i class="material-icons">settings</i></a>';
|
||||
}
|
||||
|
||||
html += '</div>';
|
||||
|
||||
|
@ -51,8 +55,20 @@
|
|||
if (user.localUser) {
|
||||
$('.btnCast', header).show();
|
||||
$('.headerSearchButton', header).show();
|
||||
|
||||
requirejs(['scripts/voice'], function () {
|
||||
|
||||
if (VoiceInputManager.isSupported()) {
|
||||
$('.headerVoiceButton', header).show();
|
||||
} else {
|
||||
$('.headerVoiceButton', header).hide();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
$('.btnCast', header).hide();
|
||||
$('.headerVoiceButton', header).hide();
|
||||
$('.headerSearchButton', header).hide();
|
||||
}
|
||||
|
||||
|
@ -324,7 +340,7 @@
|
|||
|
||||
html += '<a class="sidebarLink lnkMediaFolder" data-itemid="remote" href="nowplaying.html"><span class="fa fa-tablet sidebarLinkIcon"></span>' + Globalize.translate('ButtonRemote') + '</a>';
|
||||
|
||||
html += '<a class="sidebarLink lnkMediaFolder syncViewMenu" data-itemid="mysync" href="mysync.html"><span class="fa fa-cloud sidebarLinkIcon"></span>' + Globalize.translate('ButtonSync') + '</a>';
|
||||
html += '<a class="sidebarLink lnkMediaFolder syncViewMenu" data-itemid="mysync" href="mysync.html"><span class="fa fa-refresh sidebarLinkIcon"></span>' + Globalize.translate('ButtonSync') + '</a>';
|
||||
|
||||
html += '<div class="sidebarDivider"></div>';
|
||||
|
||||
|
|
|
@ -176,7 +176,7 @@
|
|||
});
|
||||
}
|
||||
|
||||
$(document).on('pageshow', "#liveTvStatusPage", function () {
|
||||
$(document).on('pageshowready', "#liveTvStatusPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
|
|
|
@ -1110,12 +1110,12 @@
|
|||
|
||||
// Can't autoplay in these browsers so we need to use the full controls
|
||||
if (requiresNativeControls) {
|
||||
html += '<video class="itemVideo" id="itemVideo" preload="metadata" autoplay="autoplay" crossorigin="anonymous" controls="controls"' + posterCode + ' webkit-playsinline>';
|
||||
html += '<video data-viblast-key="N8FjNTQ3NDdhZqZhNGI5NWU5ZTI=" class="itemVideo" id="itemVideo" preload="metadata" autoplay="autoplay" crossorigin="anonymous" controls="controls"' + posterCode + ' webkit-playsinline>';
|
||||
}
|
||||
else {
|
||||
|
||||
// Chrome 35 won't play with preload none
|
||||
html += '<video class="itemVideo" id="itemVideo" preload="metadata" crossorigin="anonymous" autoplay' + posterCode + '>';
|
||||
html += '<video data-viblast-key="N8FjNTQ3NDdhZqZhNGI5NWU5ZTI=" class="itemVideo" id="itemVideo" preload="metadata" crossorigin="anonymous" autoplay' + posterCode + '>';
|
||||
}
|
||||
|
||||
html += '<source type="' + contentType + '" src="' + videoUrl + '" />';
|
||||
|
|
|
@ -447,7 +447,7 @@
|
|||
return currentSrc.substring(currentSrc.lastIndexOf('.'));
|
||||
};
|
||||
|
||||
self.canPlayHls = function () {
|
||||
self.canPlayNativeHls = function () {
|
||||
|
||||
var media = testableVideoElement;
|
||||
|
||||
|
@ -460,6 +460,16 @@
|
|||
return false;
|
||||
};
|
||||
|
||||
self.canPlayHls = function () {
|
||||
|
||||
if (self.canPlayNativeHls()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
//return $.browser.chrome || $.browser.msie;
|
||||
return false;
|
||||
};
|
||||
|
||||
self.changeStream = function (ticks, params) {
|
||||
|
||||
var element = self.currentMediaElement;
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
});
|
||||
}
|
||||
|
||||
$('#items', page).html(html).trigger('create');
|
||||
$('#items', page).html(html).trigger('create').lazyChildren();
|
||||
|
||||
$('.btnNextPage', page).on('click', function () {
|
||||
query.StartIndex += query.Limit;
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
var promise2 = ApiClient.getInstalledPlugins();
|
||||
|
||||
$.when(promise1, promise2).done(function (response1, response2) {
|
||||
|
||||
populateList({
|
||||
|
||||
catalogElement: $('#pluginTiles', page),
|
||||
|
@ -33,8 +34,13 @@
|
|||
});
|
||||
});
|
||||
}
|
||||
|
||||
function populateList(options) {
|
||||
requirejs(['scripts/ratingdialog'], function () {
|
||||
populateListInternal(options);
|
||||
});
|
||||
}
|
||||
|
||||
function populateListInternal(options) {
|
||||
|
||||
var availablePlugins = options.availablePlugins;
|
||||
var installedPlugins = options.installedPlugins;
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
|
||||
var html = LibraryBrowser.getPosterViewHtml({
|
||||
items: hints,
|
||||
shape: "square",
|
||||
shape: "auto",
|
||||
lazy: true,
|
||||
overlayText: false,
|
||||
showTitle: true,
|
||||
|
|
|
@ -843,7 +843,7 @@ var Dashboard = {
|
|||
name: Globalize.translate('TabSync'),
|
||||
href: "syncactivity.html",
|
||||
selected: page.hasClass('syncConfigurationPage') || (isServicesPage && context == 'sync'),
|
||||
icon: 'fa-cloud'
|
||||
icon: 'fa-refresh'
|
||||
}, {
|
||||
divider: true,
|
||||
name: Globalize.translate('TabExtras')
|
||||
|
@ -1839,6 +1839,8 @@ var AppInfo = {};
|
|||
return jQuery;
|
||||
});
|
||||
|
||||
//requirejs(['http://viblast.com/player/free-version/qy2fdwajo1/viblast.js']);
|
||||
|
||||
setAppInfo();
|
||||
|
||||
$.extend(AppInfo, Dashboard.getAppInfo(appName, deviceId, deviceName));
|
||||
|
|
|
@ -234,7 +234,7 @@
|
|||
|
||||
html += '<br/>';
|
||||
html += '<p>';
|
||||
html += '<button type="submit" data-icon="cloud" data-theme="b">' + Globalize.translate('ButtonSync') + '</button>';
|
||||
html += '<button type="submit" data-icon="refresh" data-theme="b">' + Globalize.translate('ButtonSync') + '</button>';
|
||||
html += '</p>';
|
||||
|
||||
html += '</form>';
|
||||
|
|
|
@ -10,7 +10,26 @@
|
|||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
$(document).on('pageinit', "#syncSettingsPage", function () {
|
||||
function onSubmit() {
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var form = this;
|
||||
|
||||
ApiClient.getNamedConfiguration("sync").done(function (config) {
|
||||
|
||||
config.TemporaryPath = $('#txtSyncTempPath', form).val();
|
||||
config.UploadSpeedLimitBytes = parseInt(parseFloat(($('#txtUploadSpeedLimit', form).val() || '0')) * 1000000);
|
||||
config.TranscodingCpuCoreLimit = parseInt($('#txtCpuCoreLimit', form).val());
|
||||
config.EnableFullSpeedTranscoding = $('#chkEnableFullSpeedConversion', form).checked();
|
||||
|
||||
ApiClient.updateNamedConfiguration("sync", config).done(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
|
||||
// Disable default form submission
|
||||
return false;
|
||||
}
|
||||
|
||||
$(document).on('pageinitdepends', "#syncSettingsPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
|
@ -30,7 +49,10 @@
|
|||
});
|
||||
});
|
||||
|
||||
}).on('pageshow', "#syncSettingsPage", function () {
|
||||
$('.syncSettingsForm').off('submit', onSubmit).on('submit', onSubmit);
|
||||
|
||||
|
||||
}).on('pageshowready', "#syncSettingsPage", function () {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
|
@ -43,27 +65,4 @@
|
|||
});
|
||||
});
|
||||
|
||||
window.SyncSettingsPage = {
|
||||
|
||||
onSubmit: function () {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var form = this;
|
||||
|
||||
ApiClient.getNamedConfiguration("sync").done(function (config) {
|
||||
|
||||
config.TemporaryPath = $('#txtSyncTempPath', form).val();
|
||||
config.UploadSpeedLimitBytes = parseInt(parseFloat(($('#txtUploadSpeedLimit', form).val() || '0')) * 1000000);
|
||||
config.TranscodingCpuCoreLimit = parseInt($('#txtCpuCoreLimit', form).val());
|
||||
config.EnableFullSpeedTranscoding = $('#chkEnableFullSpeedConversion', form).checked();
|
||||
|
||||
ApiClient.updateNamedConfiguration("sync", config).done(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
|
||||
// Disable default form submission
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery, document, window);
|
||||
|
|
495
dashboard-ui/scripts/voice.js
Normal file
495
dashboard-ui/scripts/voice.js
Normal file
|
@ -0,0 +1,495 @@
|
|||
(function () {
|
||||
|
||||
var currentRecognition;
|
||||
|
||||
function shuffleArray(array) {
|
||||
var currentIndex = array.length, temporaryValue, randomIndex;
|
||||
|
||||
// While there remain elements to shuffle...
|
||||
while (0 !== currentIndex) {
|
||||
|
||||
// Pick a remaining element...
|
||||
randomIndex = Math.floor(Math.random() * currentIndex);
|
||||
currentIndex -= 1;
|
||||
|
||||
// And swap it with the current element.
|
||||
temporaryValue = array[currentIndex];
|
||||
array[currentIndex] = array[randomIndex];
|
||||
array[randomIndex] = temporaryValue;
|
||||
}
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
function getSampleCommands() {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
|
||||
var commands = [];
|
||||
|
||||
//commands.push('show my movies');
|
||||
//commands.push('pull up my tv shows');
|
||||
|
||||
commands.push('play my latest episodes');
|
||||
commands.push('play next up');
|
||||
commands.push('shuffle my favorite songs');
|
||||
|
||||
commands.push('show my tv guide');
|
||||
commands.push('pull up my recordings');
|
||||
|
||||
deferred.resolveWith(null, [shuffleArray(commands)]);
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function processText(text) {
|
||||
|
||||
var deferred = DeferredBuilder.Deferred();
|
||||
|
||||
processTextInternal(text, deferred);
|
||||
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
function parseContext(text, result) {
|
||||
|
||||
text = text.toLowerCase();
|
||||
|
||||
var i, length;
|
||||
|
||||
for (i = 0, length = result.removeWords.length; i < length; i++) {
|
||||
|
||||
text = text.replace(result.removeWords[i], '');
|
||||
}
|
||||
|
||||
text = text.trim();
|
||||
|
||||
var removeAtStart = [
|
||||
'my'
|
||||
];
|
||||
|
||||
for (i = 0, length = removeAtStart.length; i < length; i++) {
|
||||
|
||||
if (text.indexOf(removeAtStart[i]) == 0) {
|
||||
text = text.substring(removeAtStart[i].length);
|
||||
}
|
||||
}
|
||||
|
||||
text = text.trim();
|
||||
var words = text.toLowerCase().split(' ');
|
||||
|
||||
if (words.indexOf('favorite') != -1) {
|
||||
result.filters.push('favorite');
|
||||
}
|
||||
|
||||
if (text.indexOf('latest movies') != -1 || text.indexOf('latest films') != -1) {
|
||||
|
||||
result.sortby = 'datecreated';
|
||||
result.sortorder = 'Descending';
|
||||
result.filters.push('unplayed');
|
||||
result.itemType = 'Movie';
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (text.indexOf('latest episodes') != -1) {
|
||||
|
||||
result.sortby = 'datecreated';
|
||||
result.sortorder = 'Descending';
|
||||
result.filters.push('unplayed');
|
||||
result.itemType = 'Episode';
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (text.indexOf('next up') != -1) {
|
||||
|
||||
result.category = 'nextup';
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (text.indexOf('movies') != -1 || text.indexOf('films') != -1) {
|
||||
|
||||
result.itemType = 'Movie';
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (text.indexOf('shows') != -1 || text.indexOf('series') != -1) {
|
||||
|
||||
result.itemType = 'Series';
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (text.indexOf('songs') != -1) {
|
||||
|
||||
result.itemType = 'Audio';
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function parseText(text) {
|
||||
|
||||
var result = {
|
||||
action: '',
|
||||
itemName: '',
|
||||
itemType: '',
|
||||
category: '',
|
||||
filters: [],
|
||||
removeWords: [],
|
||||
sortby: '',
|
||||
sortorder: 'Ascending',
|
||||
limit: null,
|
||||
userId: Dashboard.getCurrentUserId()
|
||||
};
|
||||
|
||||
var words = text.toLowerCase().split(' ');
|
||||
|
||||
if (words.indexOf('show') != -1 || words.indexOf('pull') != -1 || words.indexOf('display') != -1) {
|
||||
|
||||
if (words.indexOf('guide') != -1) {
|
||||
result.action = 'show';
|
||||
result.category = 'tvguide';
|
||||
}
|
||||
|
||||
if (words.indexOf('recordings') != -1) {
|
||||
result.action = 'show';
|
||||
result.category = 'recordings';
|
||||
}
|
||||
|
||||
result.removeWords.push('show');
|
||||
result.removeWords.push('pull up');
|
||||
result.removeWords.push('pull');
|
||||
result.removeWords.push('display');
|
||||
return result;
|
||||
}
|
||||
|
||||
if (words.indexOf('search') != -1 || words.indexOf('find') != -1) {
|
||||
|
||||
// Search
|
||||
result.action = 'search';
|
||||
|
||||
result.removeWords.push('search for');
|
||||
result.removeWords.push('search');
|
||||
result.removeWords.push('find');
|
||||
return result;
|
||||
}
|
||||
|
||||
if (words.indexOf('play') != -1) {
|
||||
|
||||
// Play
|
||||
result.action = 'play';
|
||||
|
||||
result.removeWords.push('play');
|
||||
return result;
|
||||
}
|
||||
|
||||
if (words.indexOf('shuffle') != -1) {
|
||||
|
||||
// Play
|
||||
result.action = 'shuffle';
|
||||
|
||||
result.removeWords.push('shuffle');
|
||||
return result;
|
||||
}
|
||||
|
||||
if (words.indexOf('record') != -1) {
|
||||
|
||||
// Record
|
||||
result.action = 'record';
|
||||
|
||||
result.removeWords.push('record');
|
||||
return result;
|
||||
}
|
||||
|
||||
if (words.indexOf('guide') != -1) {
|
||||
result.action = 'show';
|
||||
result.category = 'tvguide';
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function processTextInternal(text, deferred) {
|
||||
|
||||
var result = parseText(text);
|
||||
|
||||
switch (result.action) {
|
||||
|
||||
case 'show':
|
||||
parseContext(text, result);
|
||||
showCommand(result);
|
||||
break;
|
||||
case 'play':
|
||||
parseContext(text, result);
|
||||
playCommand(result);
|
||||
break;
|
||||
case 'shuffle':
|
||||
parseContext(text, result);
|
||||
playCommand(result, true);
|
||||
break;
|
||||
case 'search':
|
||||
parseContext(text, result);
|
||||
playCommand(result);
|
||||
break;
|
||||
default:
|
||||
deferred.reject();
|
||||
return;
|
||||
}
|
||||
|
||||
deferred.resolve();
|
||||
}
|
||||
|
||||
function showCommand(result) {
|
||||
|
||||
if (result.category == 'tvguide') {
|
||||
Dashboard.navigate('livetvguide.html');
|
||||
return;
|
||||
}
|
||||
|
||||
if (result.category == 'recordings') {
|
||||
Dashboard.navigate('livetvrecordings.html');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function playCommand(result, shuffle) {
|
||||
|
||||
var query = {
|
||||
|
||||
Limit: result.limit || 100,
|
||||
UserId: result.userId,
|
||||
ExcludeLocationTypes: "Virtual"
|
||||
};
|
||||
|
||||
if (result.category == 'nextup') {
|
||||
|
||||
ApiClient.getNextUpEpisodes(query).done(function (queryResult) {
|
||||
|
||||
playItems(queryResult.Items, shuffle);
|
||||
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (shuffle) {
|
||||
result.sortby = result.sortby ? 'Random,' + result.sortby : 'Random';
|
||||
}
|
||||
|
||||
query.SortBy = result.sortby;
|
||||
query.SortOrder = result.sortorder;
|
||||
query.Recursive = true;
|
||||
|
||||
if (result.filters.indexOf('unplayed') != -1) {
|
||||
query.IsPlayed = false;
|
||||
}
|
||||
if (result.filters.indexOf('played') != -1) {
|
||||
query.IsPlayed = true;
|
||||
}
|
||||
if (result.filters.indexOf('favorite') != -1) {
|
||||
query.Filters = 'IsFavorite';
|
||||
}
|
||||
|
||||
if (result.itemType) {
|
||||
query.IncludeItemTypes = result.itemType;
|
||||
}
|
||||
|
||||
ApiClient.getItems(Dashboard.getCurrentUserId(), query).done(function (queryResult) {
|
||||
|
||||
playItems(queryResult.Items, shuffle);
|
||||
});
|
||||
}
|
||||
|
||||
function playItems(items, shuffle) {
|
||||
|
||||
if (shuffle) {
|
||||
items = shuffleArray(items);
|
||||
}
|
||||
|
||||
items = items.map(function(i) {
|
||||
return i.Id;
|
||||
});
|
||||
|
||||
if (items.length) {
|
||||
MediaController.play({
|
||||
ids: items
|
||||
});
|
||||
} else {
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate('MessageNoItemsFound')
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function searchCommand(result) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
function renderSampleCommands(elem, commands) {
|
||||
|
||||
commands.length = Math.min(commands.length, 4);
|
||||
|
||||
commands = commands.map(function (c) {
|
||||
|
||||
return '<div class="exampleCommand"><i class="fa fa-quote-left"></i><span class="exampleCommandText">' + c + '</span><i class="fa fa-quote-right"></i></div>';
|
||||
|
||||
}).join('');
|
||||
|
||||
$('.exampleCommands', elem).html(commands);
|
||||
}
|
||||
|
||||
function showVoiceHelp() {
|
||||
|
||||
var elem = $('.voiceInputHelp');
|
||||
|
||||
if (elem.length) {
|
||||
$('.unrecognizedCommand').hide();
|
||||
$('.defaultVoiceHelp').show();
|
||||
return;
|
||||
}
|
||||
|
||||
var html = '';
|
||||
|
||||
var getCommandsPromise = getSampleCommands();
|
||||
|
||||
html += '<div class="voiceInputHelp">';
|
||||
html += '<div class="voiceInputHelpInner">';
|
||||
|
||||
html += '<div class="voiceHelpContent">';
|
||||
|
||||
html += '<div class="defaultVoiceHelp">';
|
||||
|
||||
html += '<h1>' + Globalize.translate('HeaderSaySomethingLike') + '</h1>';
|
||||
|
||||
html += '<div class="exampleCommands">';
|
||||
html += '</div>';
|
||||
|
||||
// defaultVoiceHelp
|
||||
html += '</div>';
|
||||
|
||||
html += '<div class="unrecognizedCommand" style="display:none;">';
|
||||
html += '<h1>' + Globalize.translate('HeaderYouSaid') + '</h1>';
|
||||
html += '<p class="exampleCommand voiceInputContainer"><i class="fa fa-quote-left"></i><span class="voiceInputText exampleCommandText"></span><i class="fa fa-quote-right"></i></p>';
|
||||
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 += '<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>';
|
||||
|
||||
// voiceHelpContent
|
||||
html += '</div>';
|
||||
|
||||
// voiceInputHelpInner
|
||||
html += '</div>';
|
||||
|
||||
// voiceInputHelp
|
||||
html += '</div>';
|
||||
|
||||
$(document.body).append(html);
|
||||
|
||||
elem = $('.voiceInputHelp');
|
||||
|
||||
getCommandsPromise.done(function (commands) {
|
||||
renderSampleCommands(elem, commands);
|
||||
});
|
||||
|
||||
$('.btnCancel', elem).on('click', cancelListener);
|
||||
$('.btnRetry', elem).on('click', startListening);
|
||||
}
|
||||
|
||||
function showUnrecognizedCommandHelp() {
|
||||
|
||||
$('.unrecognizedCommand').show();
|
||||
$('.defaultVoiceHelp').hide();
|
||||
}
|
||||
|
||||
function hideVoiceHelp() {
|
||||
|
||||
$('.voiceInputHelp').remove();
|
||||
}
|
||||
|
||||
function cancelListener() {
|
||||
|
||||
destroyCurrentRecognition();
|
||||
hideVoiceHelp();
|
||||
}
|
||||
|
||||
function destroyCurrentRecognition() {
|
||||
|
||||
var recognition = currentRecognition;
|
||||
if (recognition) {
|
||||
recognition.abort();
|
||||
currentRecognition = null;
|
||||
}
|
||||
}
|
||||
|
||||
function processTranscript(text) {
|
||||
|
||||
$('.voiceInputText').html(text);
|
||||
|
||||
if (text) {
|
||||
$('.blockedMessage').hide();
|
||||
} else {
|
||||
$('.blockedMessage').show();
|
||||
}
|
||||
|
||||
processText(text).done(hideVoiceHelp).fail(showUnrecognizedCommandHelp);
|
||||
}
|
||||
|
||||
function startListening() {
|
||||
|
||||
destroyCurrentRecognition();
|
||||
|
||||
require([
|
||||
'css!/web/css/voice'
|
||||
], function () {
|
||||
|
||||
startListeningInternal();
|
||||
});
|
||||
}
|
||||
|
||||
function startListeningInternal() {
|
||||
|
||||
var recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
|
||||
|
||||
//recognition.continuous = true;
|
||||
//recognition.interimResults = true;
|
||||
|
||||
recognition.onresult = function (event) {
|
||||
if (event.results.length > 0) {
|
||||
processTranscript(event.results[0][0].transcript || '');
|
||||
}
|
||||
};
|
||||
|
||||
recognition.onerror = function () {
|
||||
processTranscript('');
|
||||
};
|
||||
|
||||
recognition.onnomatch = function () {
|
||||
processTranscript('');
|
||||
};
|
||||
|
||||
recognition.start();
|
||||
currentRecognition = recognition;
|
||||
showVoiceHelp();
|
||||
}
|
||||
|
||||
window.VoiceInputManager = {
|
||||
|
||||
isSupported: function () {
|
||||
return window.SpeechRecognition || window.webkitSpeechRecognition;
|
||||
},
|
||||
|
||||
startListening: startListening
|
||||
};
|
||||
|
||||
})();
|
Loading…
Add table
Add a link
Reference in a new issue