1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

add mic to header

This commit is contained in:
Luke Pulverenti 2015-06-02 01:46:06 -04:00
parent 962908d145
commit 99f5167804
36 changed files with 715 additions and 106 deletions

View file

@ -908,6 +908,26 @@ span.itemCommunityRating:not(:empty) + .userDataIcons {
background: rgba(248, 58, 34, .8);
}
.syncIndicator {
display: block;
position: absolute;
top: 32px;
right: 5px;
text-align: center;
vertical-align: middle;
width: 24px;
height: 19px;
padding-top: 3px;
border-radius: 50%;
color: #fff;
background: rgba(51, 136, 204, .8);
line-height: 16px;
}
.syncWorkingIndicator {
background: rgba(255, 106, 0, .8);
}
.playedIndicator {
display: block;
position: absolute;
@ -1387,7 +1407,7 @@ span.itemCommunityRating:not(:empty) + .userDataIcons {
}
.ui-page-theme-b .listItem:hover a {
background-color: #333 !important;
background-color: rgba(51,51,51,.6) !important;
}
@media all and (max-width: 600px) {

View file

@ -282,7 +282,7 @@
}
}
@media all and (max-width: 1000px) {
@media all and (max-width: 1440px) {
/* They can use the left menu */
.dashboardEntryHeaderButton {

View file

@ -12,8 +12,8 @@
font-weight: 300;
display: none;
position: relative;
top: -6px;
padding: 5px 10px;
top: -4px;
padding: 3px 8px;
border-radius: 1000px;
}

View file

@ -0,0 +1,51 @@
.voiceInputHelp {
background-image: url(images/splash.jpg);
top: 50px;
left: 0;
right: 0;
bottom: 0;
position: fixed;
background-position: center center;
background-size: 100% 100%;
background-repeat: no-repeat;
z-index: 999999;
}
.voiceInputHelpInner {
background: rgba(10,10,10,.8);
width: 100%;
height: 100%;
color: #eee;
}
.voiceHelpContent {
max-width: 600px;
margin: auto;
padding: 1em 1em 0;
}
.exampleCommands {
font-size: 15px;
}
.exampleCommand {
margin: 1em 0;
}
.exampleCommand .fa {
vertical-align: middle;
color: #3388cc;
}
.exampleCommandText {
margin: 0 1em;
}
.defaultVoiceHelp {
margin-bottom: 2em;
}
.voiceInputContainer {
margin: 1.5em 0;
font-size: 15px;
}

View file

@ -27,7 +27,7 @@
<div class="selectionCommandsControlGroup">
<button class="btnAddToPlaylist" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToPlaylist}">${ButtonAddToPlaylist}</button>
<button class="btnMergeVersions" data-mini="true" data-icon="recycle" data-inline="true" title="${ButtonGroupVersions}">${ButtonGroupVersions}</button>
<button class="btnSyncItems" data-mini="true" data-icon="cloud" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
<button class="btnSyncItems" data-mini="true" data-icon="refresh" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
</div>
</div>
</div>

View file

@ -137,7 +137,7 @@
<p id="itemLinks"></p>
<div class="detailButtonsContainer desktopDetailButtons" style="text-align: left;">
<button class="btnPlay hide" type="button" data-icon="play" data-inline="true" data-mini="true">${ButtonPlay}</button>
<a class="btnSync hide" data-role="button" data-icon="cloud" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<a class="btnSync hide" data-role="button" data-icon="refresh" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<button class="btnMoreCommands hide jqmButtonNoText" type="button" data-icon="ellipsis-v" data-inline="true" data-mini="true" data-iconpos="notext">${ButtonMore}</button>
</div>
</td>
@ -146,7 +146,7 @@
</div>
<div class="detailButtonsContainer mobileDetailButtons">
<button class="btnPlay hide" type="button" data-icon="play" data-inline="true" data-mini="true">${ButtonPlay}</button>
<a class="btnSync hide" data-role="button" data-icon="cloud" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<a class="btnSync hide" data-role="button" data-icon="refresh" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<button class="btnMoreCommands hide jqmButtonNoText" type="button" data-icon="ellipsis-v" data-inline="true" data-mini="true" data-iconpos="notext">${ButtonMore}</button>
</div>
<p class="itemOverview mobileOverview"></p>

View file

@ -145,7 +145,7 @@
<button class="btnPlayTrailer hide" type="button" data-icon="video" data-inline="true" data-mini="true">${ButtonPlayTrailer}</button>
<a class="btnPlayExternalTrailer hide" data-role="button" data-icon="video" data-inline="true" data-mini="true" href="#" target="_blank">${ButtonPlayTrailer}</a>
<a class="btnPlayExternal hide" data-role="button" data-icon="play" data-inline="true" data-mini="true" href="#" target="_blank">${ButtonPlay}</a>
<a class="btnSync hide" data-role="button" data-icon="cloud" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<a class="btnSync hide" data-role="button" data-icon="refresh" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<button class="btnMoreCommands hide jqmButtonNoText" type="button" data-icon="ellipsis-v" data-inline="true" data-mini="true" data-iconpos="notext">${ButtonMore}</button>
</div>
</div>
@ -172,7 +172,7 @@
<button class="btnPlayTrailer hide" type="button" data-icon="video" data-inline="true" data-mini="true">${ButtonPlayTrailer}</button>
<a class="btnPlayExternalTrailer hide" data-role="button" data-icon="video" data-inline="true" data-mini="true" href="#" target="_blank">${ButtonPlayTrailer}</a>
<a class="btnPlayExternal hide" data-role="button" data-icon="play" data-inline="true" data-mini="true" href="#" target="_blank">${ButtonPlay}</a>
<a class="btnSync hide" data-role="button" data-icon="cloud" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<a class="btnSync hide" data-role="button" data-icon="refresh" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<button class="btnMoreCommands hide jqmButtonNoText" type="button" data-icon="ellipsis-v" data-inline="true" data-mini="true" data-iconpos="notext">${ButtonMore}</button>
</div>
<p id="artist"></p>

View file

@ -5,7 +5,7 @@
</head>
<body>
<div class="backdropContainer kidsBackdropContainer" style="top:0;"></div>
<div id="kidsPage" data-role="page" class="page standalonePage noHeaderPage backdropPage staticBackdropPage" style="background-color: rgba(255,255,255,.6)!important;">
<div id="kidsPage" data-role="page" class="page standalonePage noHeaderPage backdropPage staticBackdropPage" style="background-color: rgba(255,255,255,.6)!important;" data-require="scripts/kids">
<div data-role="content" style="padding-left: 0;padding-right:0;">
<div class="kidsWelcome" style="position:absolute;width:100%;">
@ -75,11 +75,6 @@
<i class="fa fa-lock"></i>
</button>
</div>
<script type="text/javascript">
$('.kidPinForm').off('submit', KidsPage.onPinSubmit).on('submit', KidsPage.onPinSubmit);
$('.kidsOptionsForm').off('submit', KidsPage.onOptionsSubmit).on('submit', KidsPage.onOptionsSubmit);
</script>
</div>
</body>
</html>

View file

@ -41,7 +41,7 @@
<span id="playButtonContainer" style="display: none;">
<button id="btnPlay" type="button" data-icon="play" data-inline="true" data-mini="true">${ButtonPlay}</button>
</span>
<a class="btnSync hide" data-role="button" data-icon="cloud" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<a class="btnSync hide" data-role="button" data-icon="refresh" data-inline="true" data-mini="true" href="#">${ButtonSync}</a>
<span id="deleteButtonContainer" style="display: none;">
<button id="btnDelete" type="button" data-icon="delete" data-inline="true" data-mini="true">${ButtonDelete}</button>
</span>

View file

@ -23,7 +23,7 @@
<div id="latestRecordings" style="display: none;">
<div>
<h1 class="listHeader" style="display:inline-block;vertical-align:middle;">${HeaderLatestRecordings}</h1>
<a href="#" class="accentButton categorySyncButton" data-category="Latest"><i class="fa fa-cloud"></i>${ButtonSync}</a>
<a href="#" class="accentButton categorySyncButton" data-category="Latest"><i class="fa fa-refresh"></i>${ButtonSync}</a>
</div>
<div class="recordingItems itemsContainer"></div>
<br />

View file

@ -4,7 +4,7 @@
<title>${TitleLiveTV}</title>
</head>
<body>
<div id="liveTvStatusPage" data-role="page" class="page type-interior liveTvSettingsPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV">
<div id="liveTvStatusPage" data-role="page" class="page type-interior liveTvSettingsPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvstatus">
<div data-role="content">
<div class="content-primary">

View file

@ -28,7 +28,7 @@
<button class="btnAddToPlaylist" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToPlaylist}">${ButtonAddToPlaylist}</button>
<button class="btnMergeVersions" data-mini="true" data-icon="recycle" data-inline="true" title="${ButtonGroupVersions}">${ButtonGroupVersions}</button>
<button class="btnAddToCollection" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToCollection}">${ButtonAddToCollection}</button>
<button class="btnSyncItems" data-mini="true" data-icon="cloud" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
<button class="btnSyncItems" data-mini="true" data-icon="refresh" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
</div>
</div>
</div>

View file

@ -21,7 +21,7 @@
<div id="resumableSection" style="display: none;" class="homePageSection">
<div>
<h1 class="listHeader" style="display:inline-block;vertical-align:middle;">${HeaderResume}</h1>
<a href="#" class="accentButton categorySyncButton" data-category="Resume"><i class="fa fa-cloud"></i>${ButtonSync}</a>
<a href="#" class="accentButton categorySyncButton" data-category="Resume"><i class="fa fa-refresh"></i>${ButtonSync}</a>
</div>
<div id="resumableItems" class="itemsContainer">
@ -31,7 +31,7 @@
<div class="homePageSection">
<div>
<h1 class="listHeader" style="display:inline-block;vertical-align:middle;">${HeaderLatestMovies}</h1>
<a href="#" class="accentButton categorySyncButton" data-category="Latest"><i class="fa fa-cloud"></i>${ButtonSync}</a>
<a href="#" class="accentButton categorySyncButton" data-category="Latest"><i class="fa fa-refresh"></i>${ButtonSync}</a>
</div>
<div id="recentlyAddedItems" class="itemsContainer">

View file

@ -24,7 +24,7 @@
<div class="selectionCommands" style="display: none;">
<div class="selectionCommandsControlGroup">
<button class="btnAddToPlaylist" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToPlaylist}">${ButtonAddToPlaylist}</button>
<button class="btnSyncItems" data-mini="true" data-icon="cloud" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
<button class="btnSyncItems" data-mini="true" data-icon="refresh" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
</div>
</div>
</div>

View file

@ -23,7 +23,7 @@
<div class="selectionCommands" style="display: none;">
<div class="selectionCommandsControlGroup">
<button class="btnAddToPlaylist" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToPlaylist}">${ButtonAddToPlaylist}</button>
<button class="btnSyncItems" data-mini="true" data-icon="cloud" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
<button class="btnSyncItems" data-mini="true" data-icon="refresh" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
</div>
</div>
</div>

View file

@ -24,7 +24,7 @@
<div class="selectionCommands" style="display: none;">
<div class="selectionCommandsControlGroup">
<button class="btnAddToPlaylist" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToPlaylist}">${ButtonAddToPlaylist}</button>
<button class="btnSyncItems" data-mini="true" data-icon="cloud" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
<button class="btnSyncItems" data-mini="true" data-icon="refresh" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
</div>
</div>
</div>

View file

@ -21,7 +21,7 @@
<div class="selectionCommands" style="display: none;">
<div class="selectionCommandsControlGroup">
<button class="btnAddToPlaylist" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToPlaylist}">${ButtonAddToPlaylist}</button>
<button class="btnSyncItems" data-mini="true" data-icon="cloud" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
<button class="btnSyncItems" data-mini="true" data-icon="refresh" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
</div>
</div>
</div>

View file

@ -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);

View file

@ -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 = [];

View file

@ -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>';

View file

@ -31,7 +31,11 @@
html += '</form>';
html += '</div>';
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>';

View file

@ -176,7 +176,7 @@
});
}
$(document).on('pageshow', "#liveTvStatusPage", function () {
$(document).on('pageshowready', "#liveTvStatusPage", function () {
var page = this;

View file

@ -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 + '" />';

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -85,7 +85,7 @@
var html = LibraryBrowser.getPosterViewHtml({
items: hints,
shape: "square",
shape: "auto",
lazy: true,
overlayText: false,
showTitle: true,

View file

@ -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));

View file

@ -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>';

View file

@ -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);

View 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
};
})();

View file

@ -16,7 +16,7 @@
</div>
<div style="text-align:right;margin-top:-30px;">
<button type="button" class="btnSync" data-icon="cloud" data-mini="true" data-inline="true">${ButtonConvertMedia}</button>
<button type="button" class="btnSync" data-icon="refresh" data-mini="true" data-inline="true">${ButtonConvertMedia}</button>
<progress max="100" min="0" style="width:100px;display:none;" class="syncProgress"></progress>
</div>
<br />

View file

@ -4,7 +4,7 @@
<title>${TitleSync}</title>
</head>
<body>
<div id="syncSettingsPage" data-role="page" class="page type-interior syncConfigurationPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Sync">
<div id="syncSettingsPage" data-role="page" class="page type-interior syncConfigurationPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Sync" data-require="scripts/syncsettings">
<div data-role="content">
<div class="content-primary">
@ -58,9 +58,6 @@
</form>
</div>
</div>
<script type="text/javascript">
$('.syncSettingsForm').off('submit', SyncSettingsPage.onSubmit).on('submit', SyncSettingsPage.onSubmit);
</script>
</div>
</body>
</html>

View file

@ -3,6 +3,7 @@
window.FileSystem = {
fileExists: function (path) {
return false;
return NativeFileSystem.fileExists(path);
},

View file

@ -19,7 +19,7 @@
<div class="ehsContent">
<div>
<h1 class="listHeader firstListHeader" style="display:inline-block;vertical-align:middle;">${HeaderLatestEpisodes}</h1>
<a href="#" class="accentButton categorySyncButton" data-category="Latest"><i class="fa fa-cloud"></i>${ButtonSync}</a>
<a href="#" class="accentButton categorySyncButton" data-category="Latest"><i class="fa fa-refresh"></i>${ButtonSync}</a>
</div>
<div id="latestEpisodes" class="itemsContainer">
</div>

View file

@ -29,7 +29,7 @@
<div id="resumableSection" style="display: none;" class="scopedContent homePageSection">
<div>
<h1 class="listHeader firstListHeader" style="display:inline-block;vertical-align:middle;">${HeaderResume}</h1>
<a href="#" class="accentButton categorySyncButton" data-category="Resume"><i class="fa fa-cloud"></i>${ButtonSync}</a>
<a href="#" class="accentButton categorySyncButton" data-category="Resume"><i class="fa fa-refresh"></i>${ButtonSync}</a>
</div>
<div id="resumableItems" class="itemsContainer">
@ -39,7 +39,7 @@
<div class="homePageSection">
<div>
<h1 class="listHeader nextUpHeader" style="display:inline-block;vertical-align:middle;">${HeaderNextUp}</h1>
<a href="#" class="accentButton categorySyncButton" data-category="NextUp"><i class="fa fa-cloud"></i>${ButtonSync}</a>
<a href="#" class="accentButton categorySyncButton" data-category="NextUp"><i class="fa fa-refresh"></i>${ButtonSync}</a>
</div>
<div id="nextUpItems" class="itemsContainer">
</div>