diff --git a/.gitignore b/.gitignore
index 9bccd32fb8..36b843f022 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,3 @@
-# config
-config.json
-
# npm
dist
web
@@ -10,5 +7,5 @@ node_modules
.idea
.vscode
-#log
+# log
yarn-error.log
diff --git a/package.json b/package.json
index 01e852762c..3cb2318ac3 100644
--- a/package.json
+++ b/package.json
@@ -111,10 +111,10 @@
"src/components/playmenu.js",
"src/components/sanatizefilename.js",
"src/components/scrollManager.js",
- "src/components/syncplay/groupSelectionMenu.js",
- "src/components/syncplay/playbackPermissionManager.js",
- "src/components/syncplay/syncPlayManager.js",
- "src/components/syncplay/timeSyncManager.js",
+ "src/components/syncPlay/groupSelectionMenu.js",
+ "src/components/syncPlay/playbackPermissionManager.js",
+ "src/components/syncPlay/syncPlayManager.js",
+ "src/components/syncPlay/timeSyncManager.js",
"src/plugins/bookPlayer/plugin.js",
"src/plugins/bookPlayer/tableOfContent.js",
"src/plugins/photoPlayer/plugin.js",
diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css
index 494a6c523d..baea885a02 100644
--- a/src/assets/css/librarybrowser.css
+++ b/src/assets/css/librarybrowser.css
@@ -597,6 +597,7 @@
.detailImageContainer {
position: relative;
margin-top: -25vh;
+ margin-bottom: 10vh;
float: left;
width: 25vw;
z-index: 3;
@@ -641,7 +642,8 @@ div.itemDetailGalleryLink.defaultCardBackground {
}
.itemDetailGalleryLink.defaultCardBackground {
- height: 23vw; /* Dirty hack to get it to look somewhat square. Less than ideal. */
+ /* Dirty hack to get it to look somewhat square. Less than ideal. */
+ height: 23vw;
}
.itemDetailGalleryLink.defaultCardBackground > .material-icons {
diff --git a/src/components/packagemanager.js b/src/components/packageManager.js
similarity index 100%
rename from src/components/packagemanager.js
rename to src/components/packageManager.js
diff --git a/src/components/syncplay/groupSelectionMenu.js b/src/components/syncPlay/groupSelectionMenu.js
similarity index 100%
rename from src/components/syncplay/groupSelectionMenu.js
rename to src/components/syncPlay/groupSelectionMenu.js
diff --git a/src/components/syncplay/playbackPermissionManager.js b/src/components/syncPlay/playbackPermissionManager.js
similarity index 100%
rename from src/components/syncplay/playbackPermissionManager.js
rename to src/components/syncPlay/playbackPermissionManager.js
diff --git a/src/components/syncplay/syncPlayManager.js b/src/components/syncPlay/syncPlayManager.js
similarity index 99%
rename from src/components/syncplay/syncPlayManager.js
rename to src/components/syncPlay/syncPlayManager.js
index f04d1aeb8c..6116884d7c 100644
--- a/src/components/syncplay/syncPlayManager.js
+++ b/src/components/syncPlay/syncPlayManager.js
@@ -1,6 +1,6 @@
/**
* Module that manages the SyncPlay feature.
- * @module components/syncplay/syncPlayManager
+ * @module components/syncPlay/syncPlayManager
*/
import events from 'events';
diff --git a/src/components/syncplay/timeSyncManager.js b/src/components/syncPlay/timeSyncManager.js
similarity index 99%
rename from src/components/syncplay/timeSyncManager.js
rename to src/components/syncPlay/timeSyncManager.js
index ca92939576..6c151b3683 100644
--- a/src/components/syncplay/timeSyncManager.js
+++ b/src/components/syncPlay/timeSyncManager.js
@@ -1,6 +1,6 @@
/**
* Module that manages time syncing with server.
- * @module components/syncplay/timeSyncManager
+ * @module components/syncPlay/timeSyncManager
*/
import events from 'events';
diff --git a/src/components/viewsettings/viewsettings.js b/src/components/viewSettings/viewSettings.js
similarity index 98%
rename from src/components/viewsettings/viewsettings.js
rename to src/components/viewSettings/viewSettings.js
index 441c35157b..087ba3e373 100644
--- a/src/components/viewsettings/viewsettings.js
+++ b/src/components/viewSettings/viewSettings.js
@@ -57,7 +57,7 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne
return new Promise(function (resolve, reject) {
- require(['text!./viewsettings.template.html'], function (template) {
+ require(['text!./viewSettings.template.html'], function (template) {
var dialogOptions = {
removeOnClose: true,
diff --git a/src/components/viewsettings/viewsettings.template.html b/src/components/viewSettings/viewSettings.template.html
similarity index 100%
rename from src/components/viewsettings/viewsettings.template.html
rename to src/components/viewSettings/viewSettings.template.html
diff --git a/src/config.json b/src/config.json
new file mode 120000
index 0000000000..f1bd2db71e
--- /dev/null
+++ b/src/config.json
@@ -0,0 +1 @@
+config.template.json
\ No newline at end of file
diff --git a/src/config.template.json b/src/config.template.json
index 1e79270943..4b22a699d6 100644
--- a/src/config.template.json
+++ b/src/config.template.json
@@ -1,3 +1,3 @@
{
- "multiserver": true
+ "multiserver": false
}
diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js
index e9ae599b92..54d30c0c37 100644
--- a/src/controllers/movies/moviecollections.js
+++ b/src/controllers/movies/moviecollections.js
@@ -171,7 +171,12 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB
}
if (!result.Items.length) {
- html = '
' + globalize.translate('MessageNoCollectionsAvailable') + '
';
+ html = '';
+
+ html += '';
+ html += '
' + globalize.translate('MessageNothingHere') + '
';
+ html += '
' + globalize.translate('MessageNoCollectionsAvailable') + '
';
+ html += '
';
}
var itemsContainer = tabContent.querySelector('.itemsContainer');
diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js
index e8e49ff9da..ab410c1bd4 100644
--- a/src/controllers/movies/moviegenres.js
+++ b/src/controllers/movies/moviegenres.js
@@ -165,6 +165,15 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
html += '';
}
+ if (!result.Items.length) {
+ html = '';
+
+ html += '';
+ html += '
' + globalize.translate('MessageNothingHere') + '
';
+ html += '
' + globalize.translate('MessageNoGenresAvailable') + '
';
+ html += '
';
+ }
+
elem.innerHTML = html;
lazyLoader.lazyChildren(elem, fillItemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js
index 99152275b9..5daad8d7c3 100644
--- a/src/controllers/movies/movietrailers.js
+++ b/src/controllers/movies/movietrailers.js
@@ -158,7 +158,12 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', '
}
if (!result.Items.length) {
- html = '' + globalize.translate('MessageNoTrailersFound') + '
';
+ html = '';
+
+ html += '';
+ html += '
' + globalize.translate('MessageNothingHere') + '
';
+ html += '
' + globalize.translate('MessageNoTrailersFound') + '
';
+ html += '
';
}
var itemsContainer = tabContent.querySelector('.itemsContainer');
diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js
index de38763e99..7d09307fc2 100644
--- a/src/controllers/shows/tvgenres.js
+++ b/src/controllers/shows/tvgenres.js
@@ -161,6 +161,15 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader
html += '';
}
+ if (!result.Items.length) {
+ html = '';
+
+ html += '';
+ html += '
' + globalize.translate('MessageNothingHere') + '
';
+ html += '
' + globalize.translate('MessageNoGenresAvailable') + '
';
+ html += '
';
+ }
+
elem.innerHTML = html;
lazyLoader.lazyChildren(elem, fillItemsContainer);
libraryBrowser.saveQueryValues(getSavedQueryKey(), query);
diff --git a/src/legacy/dashboard.js b/src/legacy/dashboard.js
deleted file mode 100644
index 08c5e8330b..0000000000
--- a/src/legacy/dashboard.js
+++ /dev/null
@@ -1,24 +0,0 @@
-Dashboard.confirm = function(message, title, callback) {
- 'use strict';
- require(['confirm'], function(confirm) {
- confirm(message, title).then(function() {
- callback(!0);
- }).catch(function() {
- callback(!1);
- });
- });
-};
-
-Dashboard.showLoadingMsg = function() {
- 'use strict';
- require(['loading'], function(loading) {
- loading.show();
- });
-};
-
-Dashboard.hideLoadingMsg = function() {
- 'use strict';
- require(['loading'], function(loading) {
- loading.hide();
- });
-};
diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js
index 41c651cebf..5e8732e97f 100644
--- a/src/plugins/bookPlayer/plugin.js
+++ b/src/plugins/bookPlayer/plugin.js
@@ -7,7 +7,7 @@ import 'css!./style';
import 'material-icons';
import 'paper-icon-button-light';
-import TableOfContent from './tableOfContent';
+import TableOfContents from './tableOfContents';
export class BookPlayer {
constructor() {
@@ -163,7 +163,7 @@ export class BookPlayer {
openTableOfContents() {
if (this._loaded) {
- this._tocElement = new TableOfContent(this);
+ this._tocElement = new TableOfContents(this);
}
}
@@ -277,6 +277,7 @@ export class BookPlayer {
if (item.Path && (item.Path.endsWith('epub'))) {
return true;
}
+
return false;
}
}
diff --git a/src/plugins/bookPlayer/tableOfContent.js b/src/plugins/bookPlayer/tableOfContents.js
similarity index 98%
rename from src/plugins/bookPlayer/tableOfContent.js
rename to src/plugins/bookPlayer/tableOfContents.js
index 6a35966b1b..23e288aff5 100644
--- a/src/plugins/bookPlayer/tableOfContent.js
+++ b/src/plugins/bookPlayer/tableOfContents.js
@@ -1,6 +1,6 @@
import dialogHelper from 'dialogHelper';
-export default class TableOfContent {
+export default class TableOfContents {
constructor(bookPlayer) {
this._bookPlayer = bookPlayer;
this._rendition = bookPlayer._rendition;
@@ -59,6 +59,7 @@ export default class TableOfContent {
autoFocus: false,
removeOnClose: true
});
+
elem.id = 'dialogToc';
let tocHtml = '';
@@ -72,6 +73,7 @@ export default class TableOfContent {
tocHtml += `
${chapter.label}`;
tocHtml += '';
});
+
tocHtml += '';
elem.innerHTML = tocHtml;
@@ -84,7 +86,6 @@ export default class TableOfContent {
this._elem = elem;
this.bindEvents();
-
dialogHelper.open(elem);
}
}
diff --git a/src/plugins/photoPlayer/plugin.js b/src/plugins/photoPlayer/plugin.js
index d8d4ee70ef..d8e55fa67e 100644
--- a/src/plugins/photoPlayer/plugin.js
+++ b/src/plugins/photoPlayer/plugin.js
@@ -9,17 +9,12 @@ export default class PhotoPlayer {
}
play(options) {
-
return new Promise(function (resolve, reject) {
-
import('slideshow').then(({default: slideshow}) => {
-
var index = options.startIndex || 0;
var apiClient = connectionManager.currentApiClient();
-
apiClient.getCurrentUser().then(function(result) {
-
var newSlideShow = new slideshow({
showTitle: false,
cover: false,
@@ -31,7 +26,6 @@ export default class PhotoPlayer {
});
newSlideShow.show();
-
resolve();
});
});
@@ -39,7 +33,6 @@ export default class PhotoPlayer {
}
canPlayMediaType(mediaType) {
-
return (mediaType || '').toLowerCase() === 'photo';
}
}
diff --git a/src/scripts/site.js b/src/scripts/site.js
index e60efc757d..65ecfd1b09 100644
--- a/src/scripts/site.js
+++ b/src/scripts/site.js
@@ -228,6 +228,28 @@ var Dashboard = {
} else {
Dashboard.navigate('selectserver.html');
}
+ },
+ hideLoadingMsg: function() {
+ 'use strict';
+ require(['loading'], function(loading) {
+ loading.hide();
+ });
+ },
+ showLoadingMsg: function() {
+ 'use strict';
+ require(['loading'], function(loading) {
+ loading.show();
+ });
+ },
+ confirm: function(message, title, callback) {
+ 'use strict';
+ require(['confirm'], function(confirm) {
+ confirm(message, title).then(function() {
+ callback(!0);
+ }).catch(function() {
+ callback(!1);
+ });
+ });
}
};
@@ -653,7 +675,7 @@ var AppInfo = {};
playQueueManager: componentsPath + '/playback/playqueuemanager',
nowPlayingHelper: componentsPath + '/playback/nowplayinghelper',
pluginManager: componentsPath + '/pluginManager',
- packageManager: componentsPath + '/packagemanager',
+ packageManager: componentsPath + '/packageManager',
screensaverManager: componentsPath + '/screensavermanager',
chromecastHelper: 'plugins/chromecastPlayer/chromecastHelpers'
};
@@ -737,7 +759,6 @@ var AppInfo = {};
// define legacy features
// TODO delete the rest of these
define('fnchecked', ['legacy/fnchecked'], returnFirstDependency);
- define('legacyDashboard', ['legacy/dashboard'], returnFirstDependency);
define('legacySelectMenu', ['legacy/selectmenu'], returnFirstDependency);
// there are several objects that need to be instantiated
@@ -820,10 +841,10 @@ var AppInfo = {};
define('playbackSettings', [componentsPath + '/playbackSettings/playbackSettings'], returnFirstDependency);
define('homescreenSettings', [componentsPath + '/homeScreenSettings/homeScreenSettings'], returnFirstDependency);
define('playbackManager', [componentsPath + '/playback/playbackmanager'], getPlaybackManager);
- define('timeSyncManager', [componentsPath + '/syncplay/timeSyncManager'], returnDefault);
- define('groupSelectionMenu', [componentsPath + '/syncplay/groupSelectionMenu'], returnFirstDependency);
- define('syncPlayManager', [componentsPath + '/syncplay/syncPlayManager'], returnDefault);
- define('playbackPermissionManager', [componentsPath + '/syncplay/playbackPermissionManager'], returnDefault);
+ define('timeSyncManager', [componentsPath + '/syncPlay/timeSyncManager'], returnDefault);
+ define('groupSelectionMenu', [componentsPath + '/syncPlay/groupSelectionMenu'], returnFirstDependency);
+ define('syncPlayManager', [componentsPath + '/syncPlay/syncPlayManager'], returnDefault);
+ define('playbackPermissionManager', [componentsPath + '/syncPlay/playbackPermissionManager'], returnDefault);
define('layoutManager', [componentsPath + '/layoutManager', 'apphost'], getLayoutManager);
define('homeSections', [componentsPath + '/homesections/homesections'], returnFirstDependency);
define('playMenu', [componentsPath + '/playmenu'], returnFirstDependency);
@@ -847,7 +868,7 @@ var AppInfo = {};
define('userdataButtons', [componentsPath + '/userdatabuttons/userdatabuttons'], returnFirstDependency);
define('listView', [componentsPath + '/listview/listview'], returnFirstDependency);
define('indicators', [componentsPath + '/indicators/indicators'], returnFirstDependency);
- define('viewSettings', [componentsPath + '/viewsettings/viewsettings'], returnFirstDependency);
+ define('viewSettings', [componentsPath + '/viewSettings/viewSettings'], returnFirstDependency);
define('filterMenu', [componentsPath + '/filtermenu/filtermenu'], returnFirstDependency);
define('sortMenu', [componentsPath + '/sortmenu/sortmenu'], returnFirstDependency);
define('sanitizefilename', [componentsPath + '/sanitizeFilename'], returnFirstDependency);
diff --git a/src/strings/en-us.json b/src/strings/en-us.json
index f75d7003b3..b8e081a588 100644
--- a/src/strings/en-us.json
+++ b/src/strings/en-us.json
@@ -1024,10 +1024,11 @@
"MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.",
"MessageNoAvailablePlugins": "No available plugins.",
"MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, and Albums. Click the + button to start creating collections.",
+ "MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.",
"MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
"MessageNoPluginsInstalled": "You have no plugins installed.",
"MessageNoServersAvailable": "No servers have been found using the automatic server discovery.",
- "MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.",
+ "MessageNoTrailersFound": "Install the trailers channel to enhance your movie experience by adding a library of internet trailers.",
"MessageNothingHere": "Nothing here.",
"MessagePasswordResetForUsers": "The following users have had their passwords reset. They can now sign in with the pin codes that were used to perform the reset.",
"MessagePlayAccessRestricted": "Playback of this content is currently restricted. Please contact your server administrator for more information.",