(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 || words.indexOf('go') != -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'); result.removeWords.push('go to'); 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 '