diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
index 5661c64d9e..ce49812ebb 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
+++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
@@ -231,9 +231,6 @@
.channelTimeslotHeader, .timeslotHeader {
background: transparent;
-}
-
-.timeslotHeader, .channelTimeslotHeader {
height: 2.2em;
}
@@ -259,6 +256,9 @@
/* Needed for Firefox */
text-align: left;
contain: strict;
+ flex-grow: 1;
+ margin: 0 !important;
+ padding: 0 !important;
}
.programAccent {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js
index 14cf193612..bd73f24a24 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/itemcontextmenu.js
@@ -33,6 +33,22 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter',
});
}
+ if (playbackManager.canQueue(item)) {
+ if (options.queue !== false) {
+ commands.push({
+ name: globalize.translate('sharedcomponents#AddToPlayQueue'),
+ id: 'queue'
+ });
+ }
+
+ //if (options.queueAllFromHere) {
+ // commands.push({
+ // name: globalize.translate('sharedcomponents#QueueAllFromHere'),
+ // id: 'queueallfromhere'
+ // });
+ //}
+ }
+
if ((item.Type === 'Timer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) {
commands.push({
name: globalize.translate('sharedcomponents#CancelRecording'),
@@ -152,22 +168,6 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'embyRouter',
id: 'playallfromhere'
});
}
-
- if (playbackManager.canQueue(item)) {
- if (options.queue !== false) {
- commands.push({
- name: globalize.translate('sharedcomponents#Queue'),
- id: 'queue'
- });
- }
-
- if (options.queueAllFromHere) {
- commands.push({
- name: globalize.translate('sharedcomponents#QueueAllFromHere'),
- id: 'queueallfromhere'
- });
- }
- }
}
if (item.Type === 'Program' && options.record !== false) {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js
index 51a13db39f..0e4fc98d1c 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/listview/listview.js
@@ -398,8 +398,8 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
if (!clickEntireItem) {
- if (options.queueButton) {
- html += '';
+ if (options.addToListButton) {
+ html += '';
}
if (options.moreButton !== false) {
diff --git a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackvalidation.js b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackvalidation.js
index f2a4bce60f..3ec22afec9 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/playback/playbackvalidation.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/playback/playbackvalidation.js
@@ -12,8 +12,8 @@ define(['playbackManager'], function (playbackManager) {
self.intercept = function (options) {
- // Don't care about video backdrops or any kind of non-fullscreen playback
- if (!options.fullscreen && options.mediaType === 'Video') {
+ // Don't care about video backdrops, or theme music or any kind of non-fullscreen playback
+ if (!options.fullscreen) {
return Promise.resolve();
}
diff --git a/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js b/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js
index 5ce0e60383..1e65ba3eb7 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/playlisteditor/playlisteditor.js
@@ -1,4 +1,4 @@
-define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'userSettings', 'embyRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, connectionManager, userSettings, embyRouter, globalize) {
+define(['shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackManager', 'connectionManager', 'userSettings', 'embyRouter', 'globalize', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (shell, dialogHelper, loading, layoutManager, playbackManager, connectionManager, userSettings, embyRouter, globalize) {
'use strict';
var currentServerId;
@@ -18,8 +18,6 @@
function onSubmit(e) {
- loading.show();
-
var panel = parentWithClass(this, 'dialog');
var playlistId = panel.querySelector('#selectPlaylistToAddTo').value;
@@ -38,6 +36,8 @@
function createPlaylist(apiClient, dlg) {
+ loading.show();
+
var url = apiClient.getUrl("Playlists", {
Name: dlg.querySelector('#txtNewPlaylistName').value,
@@ -72,9 +72,24 @@
function addToPlaylist(apiClient, dlg, id) {
+ var itemIds = dlg.querySelector('.fldSelectedItemIds').value || '';
+
+ if (id === 'queue') {
+
+ playbackManager.queue({
+ serverId: apiClient.serverId(),
+ ids: itemIds.split(',')
+ });
+ dialogHelper.close(dlg);
+ showToast();
+ return;
+ }
+
+ loading.show();
+
var url = apiClient.getUrl("Playlists/" + id + "/Items", {
- Ids: dlg.querySelector('.fldSelectedItemIds').value || '',
+ Ids: itemIds,
userId: apiClient.getCurrentUserId()
});
@@ -87,10 +102,13 @@
loading.hide();
dialogHelper.close(dlg);
+ showToast();
+ });
+ }
- require(['toast'], function (toast) {
- toast(globalize.translate('sharedcomponents#MessageItemsAdded'));
- });
+ function showToast() {
+ require(['toast'], function (toast) {
+ toast(globalize.translate('sharedcomponents#MessageItemsAdded'));
});
}
@@ -118,6 +136,7 @@
var html = '';
+ html += '';
html += '';
html += result.Items.map(function (i) {
@@ -127,7 +146,7 @@
select.innerHTML = html;
select.value = userSettings.get('playlisteditor-lastplaylistid') || '';
-
+
// If the value is empty set it again, in case we tried to set a lastplaylistid that is no longer valid
if (!select.value) {
select.value = '';
@@ -161,7 +180,7 @@
html += '';
html += '
';
html += '';
diff --git a/dashboard-ui/bower_components/emby-webcomponents/registrationservices/registrationservices.js b/dashboard-ui/bower_components/emby-webcomponents/registrationservices/registrationservices.js
index 409b31f58a..091adcb2de 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/registrationservices/registrationservices.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/registrationservices/registrationservices.js
@@ -36,7 +36,7 @@
require(['listViewStyle', 'emby-button', 'formDialogStyle'], function () {
var dlg = dialogHelper.createDialog({
- size: 'fullscreen-border',
+ size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border',
removeOnClose: true,
scrollY: false
});
@@ -290,7 +290,7 @@
}
var dlg = dialogHelper.createDialog({
- size: 'fullscreen-border',
+ size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border',
removeOnClose: true,
scrollY: false
});
@@ -524,7 +524,7 @@
function restorePurchase(unlockableProductInfo) {
var dlg = dialogHelper.createDialog({
- size: 'fullscreen-border',
+ size: layoutManager.tv ? 'fullscreen' : 'fullscreen-border',
removeOnClose: true,
scrollY: false
});
diff --git a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js
index bb33f49045..ba492ca832 100644
--- a/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js
+++ b/dashboard-ui/bower_components/emby-webcomponents/shortcuts.js
@@ -326,6 +326,21 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g
else if (action === 'playtrailer') {
getItem(target).then(playTrailer);
}
+
+ else if (action === 'addtoplaylist') {
+ getItem(target).then(addToPlaylist);
+ }
+ }
+
+ function addToPlaylist(item) {
+ require(['playlistEditor'], function (playlistEditor) {
+
+ new playlistEditor().show({
+ items: [item.Id],
+ serverId: item.ServerId
+
+ });
+ });
}
function playTrailer(item) {
diff --git a/dashboard-ui/components/favoriteitems.js b/dashboard-ui/components/favoriteitems.js
index 73cc593d19..3edaeb0406 100644
--- a/dashboard-ui/components/favoriteitems.js
+++ b/dashboard-ui/components/favoriteitems.js
@@ -2,7 +2,7 @@
'use strict';
function enableScrollX() {
- return browserInfo.mobile && AppInfo.enableAppLayouts;
+ return browserInfo.mobile;
}
function getThumbShape() {
diff --git a/dashboard-ui/mypreferenceslanguages.html b/dashboard-ui/mypreferenceslanguages.html
index 8db30628ff..ad840a319c 100644
--- a/dashboard-ui/mypreferenceslanguages.html
+++ b/dashboard-ui/mypreferenceslanguages.html
@@ -73,14 +73,13 @@
${OptionPlayNextEpisodeAutomatically}
-
+
-
${LabelExternalPlayersHelp}
-
${LabelNativeExternalPlayersHelp}
+
${LabelNativeExternalPlayersHelp}
diff --git a/dashboard-ui/playlists.html b/dashboard-ui/playlists.html
index 697a3cf1bd..f68735e7a1 100644
--- a/dashboard-ui/playlists.html
+++ b/dashboard-ui/playlists.html
@@ -1,12 +1,14 @@
-
+
+
${MessageNoPlaylistsAvailable}
diff --git a/dashboard-ui/scripts/homeupcoming.js b/dashboard-ui/scripts/homeupcoming.js
index 3e2331370b..f5084c03e2 100644
--- a/dashboard-ui/scripts/homeupcoming.js
+++ b/dashboard-ui/scripts/homeupcoming.js
@@ -38,7 +38,7 @@
}
function enableScrollX() {
- return browserInfo.mobile && AppInfo.enableAppLayouts;
+ return browserInfo.mobile;
}
function getThumbShape() {
diff --git a/dashboard-ui/scripts/itembynamedetailpage.js b/dashboard-ui/scripts/itembynamedetailpage.js
index c90464e64e..c765a60796 100644
--- a/dashboard-ui/scripts/itembynamedetailpage.js
+++ b/dashboard-ui/scripts/itembynamedetailpage.js
@@ -275,7 +275,7 @@
action: 'playallfromhere',
smallIcon: true,
artist: true,
- queueButton: true
+ addToListButton: true
});
break;
diff --git a/dashboard-ui/scripts/itemdetailpage.js b/dashboard-ui/scripts/itemdetailpage.js
index afd210b50a..52750487db 100644
--- a/dashboard-ui/scripts/itemdetailpage.js
+++ b/dashboard-ui/scripts/itemdetailpage.js
@@ -73,7 +73,6 @@
item: item,
open: false,
play: false,
- queue: false,
playAllFromHere: false,
queueAllFromHere: false,
positionTo: button,
@@ -1261,7 +1260,7 @@
image: false,
artist: 'auto',
containerAlbumArtist: item.AlbumArtist,
- queueButton: true
+ addToListButton: true
});
isList = true;
}
@@ -1549,6 +1548,9 @@
case 'games':
type = 'Game';
break;
+ case 'music':
+ type = 'MusicAlbum';
+ break;
default:
type = 'Movie';
break;
diff --git a/dashboard-ui/scripts/livetvcomponents.js b/dashboard-ui/scripts/livetvcomponents.js
index 185dcb56d3..1a788c833c 100644
--- a/dashboard-ui/scripts/livetvcomponents.js
+++ b/dashboard-ui/scripts/livetvcomponents.js
@@ -2,7 +2,7 @@
'use strict';
function enableScrollX() {
- return browserInfo.mobile && AppInfo.enableAppLayouts;
+ return browserInfo.mobile;
}
function getBackdropShape() {
diff --git a/dashboard-ui/scripts/livetvschedule.js b/dashboard-ui/scripts/livetvschedule.js
index ad932824be..2ec6124abf 100644
--- a/dashboard-ui/scripts/livetvschedule.js
+++ b/dashboard-ui/scripts/livetvschedule.js
@@ -2,7 +2,7 @@
'use strict';
function enableScrollX() {
- return browserInfo.mobile && AppInfo.enableAppLayouts;
+ return browserInfo.mobile;
}
function renderRecordings(elem, recordings, cardOptions) {
diff --git a/dashboard-ui/scripts/moviegenres.js b/dashboard-ui/scripts/moviegenres.js
index a146cc3adf..5bec443c7a 100644
--- a/dashboard-ui/scripts/moviegenres.js
+++ b/dashboard-ui/scripts/moviegenres.js
@@ -47,7 +47,7 @@
}
function enableScrollX() {
- return browserInfo.mobile && AppInfo.enableAppLayouts;
+ return browserInfo.mobile;
}
function getThumbShape() {
diff --git a/dashboard-ui/scripts/musicalbums.js b/dashboard-ui/scripts/musicalbums.js
index 5590ba784d..40fa8b82e4 100644
--- a/dashboard-ui/scripts/musicalbums.js
+++ b/dashboard-ui/scripts/musicalbums.js
@@ -99,7 +99,7 @@
items: result.Items,
context: 'music',
sortBy: query.SortBy,
- queueButton: true
+ addToListButton: true
});
}
else if (viewStyle == "PosterCard") {
diff --git a/dashboard-ui/scripts/mypreferenceslanguages.js b/dashboard-ui/scripts/mypreferenceslanguages.js
index f325ad891d..35ec5d53b2 100644
--- a/dashboard-ui/scripts/mypreferenceslanguages.js
+++ b/dashboard-ui/scripts/mypreferenceslanguages.js
@@ -186,14 +186,6 @@
view.querySelector('.fldExternalPlayer').classList.add('hide');
}
- if (AppInfo.supportsExternalPlayerMenu) {
- view.querySelector('.labelNativeExternalPlayers').classList.remove('hide');
- view.querySelector('.labelGenericExternalPlayers').classList.add('hide');
- } else {
- view.querySelector('.labelGenericExternalPlayers').classList.remove('hide');
- view.querySelector('.labelNativeExternalPlayers').classList.add('hide');
- }
-
loadPage(view);
});
diff --git a/dashboard-ui/scripts/nowplayingbar.js b/dashboard-ui/scripts/nowplayingbar.js
index 9b7acf3b6b..693bf57c20 100644
--- a/dashboard-ui/scripts/nowplayingbar.js
+++ b/dashboard-ui/scripts/nowplayingbar.js
@@ -552,26 +552,24 @@
height: imgHeight
})) : null;
- if (url === currentImgUrl) {
- return;
+ if (url !== currentImgUrl) {
+ currentImgUrl = url;
+
+ imageLoader.lazyImage(nowPlayingImageElement, url);
}
- currentImgUrl = url;
-
- imageLoader.lazyImage(nowPlayingImageElement, url);
-
- userdataButtons.destroy({
- element: nowPlayingUserData
- });
-
if (nowPlayingItem.Id) {
- ApiClient.getItem(Dashboard.getCurrentUserId(), nowPlayingItem.Id).then(function (item) {
+ ApiClient.getItem(Dashboard.getCurrentUserId(), nowPlayingItem.Id).then(function(item) {
userdataButtons.fill({
item: item,
includePlayed: false,
element: nowPlayingUserData
});
});
+ } else {
+ userdataButtons.destroy({
+ element: nowPlayingUserData
+ });
}
}
diff --git a/dashboard-ui/scripts/playlists.js b/dashboard-ui/scripts/playlists.js
index 97edd83f55..e6452132a6 100644
--- a/dashboard-ui/scripts/playlists.js
+++ b/dashboard-ui/scripts/playlists.js
@@ -207,6 +207,18 @@
reloadItems();
});
+ view.querySelector('.btnNewPlaylist').addEventListener('click', function () {
+
+ require(['playlistEditor'], function (playlistEditor) {
+
+ var serverId = ApiClient.serverInfo().Id;
+ new playlistEditor().show({
+ items: [],
+ serverId: serverId
+ });
+ });
+ });
+
onViewStyleChange();
};
diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js
index c1c081ec87..9903e4a561 100644
--- a/dashboard-ui/scripts/site.js
+++ b/dashboard-ui/scripts/site.js
@@ -717,7 +717,7 @@ var AppInfo = {};
AppInfo.enableHomeTabs = false;
if (isAndroid) {
- AppInfo.supportsExternalPlayerMenu = true;
+ AppInfo.supportsExternalPlayers = true;
}
}
else {
@@ -1003,12 +1003,6 @@ var AppInfo = {};
paths.hlsjs = bowerPath + "/hlsjs/dist/hls.min";
- if ((window.chrome && window.chrome.sockets) || Dashboard.isRunningInCordova()) {
- paths.serverdiscovery = apiClientBowerPath + "/serverdiscovery-chrome";
- } else {
- paths.serverdiscovery = apiClientBowerPath + "/serverdiscovery";
- }
-
define("webActionSheet", [embyWebComponentsBowerPath + "/actionsheet/actionsheet"], returnFirstDependency);
if (Dashboard.isRunningInCordova()) {
@@ -1367,7 +1361,7 @@ var AppInfo = {};
appSettings.set('externalplayers', val.toString());
}
- return appSettings.get('externalplayers') == 'true';
+ return appSettings.get('externalplayers') === 'true';
};
return appSettings;
@@ -1403,6 +1397,16 @@ var AppInfo = {};
define("registerElement", []);
}
+ if ((window.chrome && window.chrome.sockets)) {
+ define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery-chrome"], returnFirstDependency);
+ } else if (Dashboard.isRunningInCordova() && browser.android) {
+ define("serverdiscovery", ["cordova/serverdiscovery"], returnFirstDependency);
+ } else if (Dashboard.isRunningInCordova() && browser.safari) {
+ define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery-chrome"], returnFirstDependency);
+ } else {
+ define("serverdiscovery", [apiClientBowerPath + "/serverdiscovery"], returnFirstDependency);
+ }
+
if (Dashboard.isRunningInCordova() && browser.safari) {
define("imageFetcher", ['cordova/imagestore'], returnFirstDependency);
} else {
diff --git a/dashboard-ui/scripts/songs.js b/dashboard-ui/scripts/songs.js
index 6e73f0ff6a..bc332e17ac 100644
--- a/dashboard-ui/scripts/songs.js
+++ b/dashboard-ui/scripts/songs.js
@@ -74,7 +74,7 @@
action: 'playallfromhere',
smallIcon: true,
artist: true,
- queueButton: true
+ addToListButton: true
});
var i, length;
diff --git a/dashboard-ui/scripts/tvgenres.js b/dashboard-ui/scripts/tvgenres.js
index 5a41885f99..a2e5013b86 100644
--- a/dashboard-ui/scripts/tvgenres.js
+++ b/dashboard-ui/scripts/tvgenres.js
@@ -47,7 +47,7 @@
}
function enableScrollX() {
- return browserInfo.mobile && AppInfo.enableAppLayouts;
+ return browserInfo.mobile;
}
function getThumbShape() {
diff --git a/dashboard-ui/strings/en-US.json b/dashboard-ui/strings/en-US.json
index 68212b7aee..23474ba8bb 100644
--- a/dashboard-ui/strings/en-US.json
+++ b/dashboard-ui/strings/en-US.json
@@ -981,8 +981,7 @@
"LabelConnectUserNameHelp": "Connect this local user to an online Emby account to enable easy sign-in access from any Emby app without having to know the server ip address.",
"ButtonLearnMoreAboutEmbyConnect": "Learn more about Emby Connect",
"LabelExternalPlayers": "External players:",
- "LabelExternalPlayersHelp": "Display buttons to play content in external players. This is only available on devices that support url schemes, generally Android and iOS. With external players there is generally no support for remote control or resuming.",
- "LabelNativeExternalPlayersHelp": "Display buttons to play content in external players.",
+ "LabelNativeExternalPlayersHelp": "Play videos using external players.",
"HeaderSubtitleProfile": "Subtitle Profile",
"HeaderSubtitleProfiles": "Subtitle Profiles",
"HeaderSubtitleProfilesHelp": "Subtitle profiles describe the subtitle formats supported by the device.",