diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.css
index 5661c64d9..ce49812eb 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 14cf19361..bd73f24a2 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 51a13db39..0e4fc98d1 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 f2a4bce60..3ec22afec 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 5ce0e6038..1e65ba3eb 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 409b31f58..091adcb2d 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 bb33f4904..ba492ca83 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 73cc593d1..3edaeb040 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 8db30628f..ad840a319 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 697a3cf1b..f68735e7a 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 3e2331370..f5084c03e 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 c90464e64..c765a6079 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 afd210b50..52750487d 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 185dcb56d..1a788c833 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 ad932824b..2ec6124ab 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 a146cc3ad..5bec443c7 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 5590ba784..40fa8b82e 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 f325ad891..35ec5d53b 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 9b7acf3b6..693bf57c2 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 97edd83f5..e6452132a 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 c1c081ec8..9903e4a56 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 6e73f0ff6..bc332e17a 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 5a41885f9..a2e5013b8 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 68212b7ae..23474ba8b 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.",