diff --git a/dashboard-ui/livetv.html b/dashboard-ui/livetv.html
index 982b403025..87845c4e5a 100644
--- a/dashboard-ui/livetv.html
+++ b/dashboard-ui/livetv.html
@@ -6,7 +6,6 @@
${TabGuide}
${TabChannels}
${TabRecordings}
- ${TabScheduled}
${TabSeries}
+
diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js
index a0da6e86e5..365638fc78 100644
--- a/dashboard-ui/scripts/librarybrowser.js
+++ b/dashboard-ui/scripts/librarybrowser.js
@@ -456,6 +456,9 @@
canShare: function (item, user) {
+ if (item.Type == 'Timer') {
+ return false;
+ }
return user.Policy.EnablePublicSharing;
},
@@ -721,7 +724,7 @@
supportsEditing: function (itemType) {
- if (itemType == "UserRootFolder" || /*itemType == "CollectionFolder" ||*/ itemType == "UserView") {
+ if (itemType == "UserRootFolder" || /*itemType == "CollectionFolder" ||*/ itemType == "UserView" || itemType == 'Timer') {
return false;
}
@@ -756,7 +759,10 @@
if (item.MediaType == 'Video' && item.Type != 'TvChannel' && item.Type != 'Program' && item.LocationType != 'Virtual') {
commands.push('editsubtitles');
}
- commands.push('editimages');
+
+ if (item.Type != 'Timer') {
+ commands.push('editimages');
+ }
}
if (user.Policy.IsAdministrator) {
@@ -1139,6 +1145,9 @@
return "itemdetails.html?id=" + id;
}
+ if (item.Type == "Timer") {
+ return "livetvtimer.html?id=" + id;
+ }
if (item.Type == "BoxSet") {
return "itemdetails.html?id=" + id;
}
@@ -1531,7 +1540,7 @@
});
}
- if (item.UserData.PlaybackPositionTicks) {
+ if (item.UserData && item.UserData.PlaybackPositionTicks) {
atts.push({
name: 'positionticks',
value: (item.UserData.PlaybackPositionTicks || 0)
@@ -1594,7 +1603,7 @@
supportsAddingToCollection: function (item) {
- var invalidTypes = ['Person', 'Genre', 'MusicGenre', 'Studio', 'GameGenre', 'BoxSet', 'Playlist', 'UserView', 'CollectionFolder', 'Audio', 'Episode', 'TvChannel', 'Program', 'MusicAlbum'];
+ var invalidTypes = ['Person', 'Genre', 'MusicGenre', 'Studio', 'GameGenre', 'BoxSet', 'Playlist', 'UserView', 'CollectionFolder', 'Audio', 'Episode', 'TvChannel', 'Program', 'MusicAlbum', 'Timer'];
return !item.CollectionType && invalidTypes.indexOf(item.Type) == -1 && item.MediaType != 'Photo';
},
@@ -1675,7 +1684,10 @@
if (item.MediaType == 'Video' && item.Type != 'TvChannel' && item.Type != 'Program' && item.LocationType != 'Virtual') {
itemCommands.push('editsubtitles');
}
- itemCommands.push('editimages');
+
+ if (item.Type != 'Timer') {
+ itemCommands.push('editimages');
+ }
return itemCommands;
},
@@ -1969,17 +1981,18 @@
showTitle = true;
}
var coverImage = options.coverImage;
+ var imageItem = item.Type == 'Timer' ? (item.ProgramInfo || item) : item;
- if (options.autoThumb && item.ImageTags && item.ImageTags.Primary && item.PrimaryImageAspectRatio && item.PrimaryImageAspectRatio >= 1.34) {
+ if (options.autoThumb && imageItem.ImageTags && imageItem.ImageTags.Primary && imageItem.PrimaryImageAspectRatio && imageItem.PrimaryImageAspectRatio >= 1.34) {
width = posterWidth;
height = primaryImageAspectRatio ? Math.round(posterWidth / primaryImageAspectRatio) : null;
- imgUrl = ApiClient.getImageUrl(item.Id, {
+ imgUrl = ApiClient.getImageUrl(imageItem.Id, {
type: "Primary",
maxHeight: height,
maxWidth: width,
- tag: item.ImageTags.Primary,
+ tag: imageItem.ImageTags.Primary,
enableImageEnhancers: enableImageEnhancers
});
@@ -1991,80 +2004,80 @@
}
}
- } else if (options.autoThumb && item.ImageTags && item.ImageTags.Thumb) {
+ } else if (options.autoThumb && imageItem.ImageTags && imageItem.ImageTags.Thumb) {
- imgUrl = ApiClient.getScaledImageUrl(item.Id, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.Id, {
type: "Thumb",
maxWidth: thumbWidth,
- tag: item.ImageTags.Thumb,
+ tag: imageItem.ImageTags.Thumb,
enableImageEnhancers: enableImageEnhancers
});
- } else if (options.preferBackdrop && item.BackdropImageTags && item.BackdropImageTags.length) {
+ } else if (options.preferBackdrop && imageItem.BackdropImageTags && imageItem.BackdropImageTags.length) {
- imgUrl = ApiClient.getScaledImageUrl(item.Id, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.Id, {
type: "Backdrop",
maxWidth: thumbWidth,
- tag: item.BackdropImageTags[0],
+ tag: imageItem.BackdropImageTags[0],
enableImageEnhancers: enableImageEnhancers
});
- } else if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) {
+ } else if (options.preferThumb && imageItem.ImageTags && imageItem.ImageTags.Thumb) {
- imgUrl = ApiClient.getScaledImageUrl(item.Id, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.Id, {
type: "Thumb",
maxWidth: thumbWidth,
- tag: item.ImageTags.Thumb,
+ tag: imageItem.ImageTags.Thumb,
enableImageEnhancers: enableImageEnhancers
});
- } else if (options.preferBanner && item.ImageTags && item.ImageTags.Banner) {
+ } else if (options.preferBanner && imageItem.ImageTags && imageItem.ImageTags.Banner) {
- imgUrl = ApiClient.getScaledImageUrl(item.Id, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.Id, {
type: "Banner",
maxWidth: bannerWidth,
- tag: item.ImageTags.Banner,
+ tag: imageItem.ImageTags.Banner,
enableImageEnhancers: enableImageEnhancers
});
- } else if (options.preferThumb && item.SeriesThumbImageTag && options.inheritThumb !== false) {
+ } else if (options.preferThumb && imageItem.SeriesThumbImageTag && options.inheritThumb !== false) {
- imgUrl = ApiClient.getScaledImageUrl(item.SeriesId, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.SeriesId, {
type: "Thumb",
maxWidth: thumbWidth,
- tag: item.SeriesThumbImageTag,
+ tag: imageItem.SeriesThumbImageTag,
enableImageEnhancers: enableImageEnhancers
});
- } else if (options.preferThumb && item.ParentThumbItemId && options.inheritThumb !== false) {
+ } else if (options.preferThumb && imageItem.ParentThumbItemId && options.inheritThumb !== false) {
- imgUrl = ApiClient.getThumbImageUrl(item.ParentThumbItemId, {
+ imgUrl = ApiClient.getThumbImageUrl(imageItem.ParentThumbItemId, {
type: "Thumb",
maxWidth: thumbWidth,
enableImageEnhancers: enableImageEnhancers
});
- } else if (options.preferThumb && item.BackdropImageTags && item.BackdropImageTags.length) {
+ } else if (options.preferThumb && imageItem.BackdropImageTags && imageItem.BackdropImageTags.length) {
- imgUrl = ApiClient.getScaledImageUrl(item.Id, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.Id, {
type: "Backdrop",
maxWidth: thumbWidth,
- tag: item.BackdropImageTags[0],
+ tag: imageItem.BackdropImageTags[0],
enableImageEnhancers: enableImageEnhancers
});
forceName = true;
- } else if (item.ImageTags && item.ImageTags.Primary) {
+ } else if (imageItem.ImageTags && imageItem.ImageTags.Primary) {
width = posterWidth;
height = primaryImageAspectRatio ? Math.round(posterWidth / primaryImageAspectRatio) : null;
- imgUrl = ApiClient.getImageUrl(item.Id, {
+ imgUrl = ApiClient.getImageUrl(imageItem.Id, {
type: "Primary",
maxHeight: height,
maxWidth: width,
- tag: item.ImageTags.Primary,
+ tag: imageItem.ImageTags.Primary,
enableImageEnhancers: enableImageEnhancers
});
@@ -2076,25 +2089,25 @@
}
}
}
- else if (item.ParentPrimaryImageTag) {
+ else if (imageItem.ParentPrimaryImageTag) {
- imgUrl = ApiClient.getImageUrl(item.ParentPrimaryImageItemId, {
+ imgUrl = ApiClient.getImageUrl(imageItem.ParentPrimaryImageItemId, {
type: "Primary",
maxWidth: posterWidth,
tag: item.ParentPrimaryImageTag,
enableImageEnhancers: enableImageEnhancers
});
}
- else if (item.AlbumId && item.AlbumPrimaryImageTag) {
+ else if (imageItem.AlbumId && imageItem.AlbumPrimaryImageTag) {
height = squareSize;
width = primaryImageAspectRatio ? Math.round(height * primaryImageAspectRatio) : null;
- imgUrl = ApiClient.getScaledImageUrl(item.AlbumId, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.AlbumId, {
type: "Primary",
maxHeight: height,
maxWidth: width,
- tag: item.AlbumPrimaryImageTag,
+ tag: imageItem.AlbumPrimaryImageTag,
enableImageEnhancers: enableImageEnhancers
});
@@ -2106,46 +2119,46 @@
}
}
}
- else if (item.Type == 'Season' && item.ImageTags && item.ImageTags.Thumb) {
+ else if (imageItem.Type == 'Season' && imageItem.ImageTags && imageItem.ImageTags.Thumb) {
- imgUrl = ApiClient.getScaledImageUrl(item.Id, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.Id, {
type: "Thumb",
maxWidth: thumbWidth,
- tag: item.ImageTags.Thumb,
+ tag: imageItem.ImageTags.Thumb,
enableImageEnhancers: enableImageEnhancers
});
}
- else if (item.BackdropImageTags && item.BackdropImageTags.length) {
+ else if (imageItem.BackdropImageTags && imageItem.BackdropImageTags.length) {
- imgUrl = ApiClient.getScaledImageUrl(item.Id, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.Id, {
type: "Backdrop",
maxWidth: thumbWidth,
- tag: item.BackdropImageTags[0],
+ tag: imageItem.BackdropImageTags[0],
enableImageEnhancers: enableImageEnhancers
});
- } else if (item.ImageTags && item.ImageTags.Thumb) {
+ } else if (imageItem.ImageTags && imageItem.ImageTags.Thumb) {
- imgUrl = ApiClient.getScaledImageUrl(item.Id, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.Id, {
type: "Thumb",
maxWidth: thumbWidth,
- tag: item.ImageTags.Thumb,
+ tag: imageItem.ImageTags.Thumb,
enableImageEnhancers: enableImageEnhancers
});
- } else if (item.SeriesThumbImageTag) {
+ } else if (imageItem.SeriesThumbImageTag) {
- imgUrl = ApiClient.getScaledImageUrl(item.SeriesId, {
+ imgUrl = ApiClient.getScaledImageUrl(imageItem.SeriesId, {
type: "Thumb",
maxWidth: thumbWidth,
- tag: item.SeriesThumbImageTag,
+ tag: imageItem.SeriesThumbImageTag,
enableImageEnhancers: enableImageEnhancers
});
- } else if (item.ParentThumbItemId) {
+ } else if (imageItem.ParentThumbItemId) {
- imgUrl = ApiClient.getThumbImageUrl(item, {
+ imgUrl = ApiClient.getThumbImageUrl(imageItem, {
type: "Thumb",
maxWidth: thumbWidth,
enableImageEnhancers: enableImageEnhancers
@@ -2284,7 +2297,7 @@
html += '
' + mediaSourceCount + '
';
}
- var progressHtml = options.showProgress === false || item.IsFolder ? '' : LibraryBrowser.getItemProgressBarHtml((item.Type == 'Recording' ? item : item.UserData));
+ var progressHtml = options.showProgress === false || item.IsFolder ? '' : LibraryBrowser.getItemProgressBarHtml((item.Type == 'Recording' ? item : item.UserData || {}));
var footerOverlayed = false;
@@ -2412,6 +2425,31 @@
lines.push(item.ProductionYear || '');
}
+ if (options.showAirTime) {
+
+ var airTimeText;
+ if (item.StartDate) {
+
+ try {
+ var date = datetime.parseISO8601Date(item.StartDate);
+
+ airTimeText = date.toLocaleDateString();
+
+ airTimeText += ', ' + datetime.getDisplayTime(date);
+
+ if (item.EndDate) {
+ date = datetime.parseISO8601Date(item.EndDate);
+ airTimeText += ' - ' + datetime.getDisplayTime(date);
+ }
+ }
+ catch (e) {
+ console.log("Error parsing date: " + item.PremiereDate);
+ }
+ }
+
+ lines.push(airTimeText || '');
+ }
+
if (item.Type == 'TvChannel') {
if (item.CurrentProgram) {
diff --git a/dashboard-ui/scripts/librarylist.js b/dashboard-ui/scripts/librarylist.js
index 2eb4a5e62e..5dae5e7c1a 100644
--- a/dashboard-ui/scripts/librarylist.js
+++ b/dashboard-ui/scripts/librarylist.js
@@ -420,7 +420,7 @@
});
}
- if (user.Policy.EnablePublicSharing) {
+ if (user.Policy.EnablePublicSharing && commands.indexOf('share') != -1) {
items.push({
name: Globalize.translate('ButtonShare'),
id: 'share',
diff --git a/dashboard-ui/scripts/livetvcomponents.js b/dashboard-ui/scripts/livetvcomponents.js
index 7224c3f01d..cbd3ede7e2 100644
--- a/dashboard-ui/scripts/livetvcomponents.js
+++ b/dashboard-ui/scripts/livetvcomponents.js
@@ -2,6 +2,23 @@
function getTimersHtml(timers) {
+ var items = timers.map(function (t) {
+ t.Type = 'Timer';
+ return t;
+ });
+
+ var html = LibraryBrowser.getPosterViewHtml({
+ items: items,
+ shape: "square",
+ showTitle: true,
+ showAirTime: true,
+ lazy: true,
+ cardLayout: true,
+ showDetailsMenu: true
+ });
+
+ return Promise.resolve(html);
+
return new Promise(function (resolve, reject) {
require(['paper-fab', 'paper-item-body', 'paper-icon-item'], function () {
diff --git a/dashboard-ui/scripts/livetvrecordings.js b/dashboard-ui/scripts/livetvrecordings.js
index 9bd11972ce..1844c9abc5 100644
--- a/dashboard-ui/scripts/livetvrecordings.js
+++ b/dashboard-ui/scripts/livetvrecordings.js
@@ -78,9 +78,7 @@
ImageLoader.lazyChildren(recordingItems);
}
- function reload(page) {
-
- Dashboard.showLoadingMsg();
+ function renderActiveRecordings(page) {
ApiClient.getLiveTvRecordings({
@@ -93,6 +91,9 @@
renderRecordings(page.querySelector('#activeRecordings'), result.Items);
});
+ }
+
+ function renderLatestRecordings(page) {
ApiClient.getLiveTvRecordings({
@@ -105,6 +106,68 @@
renderRecordings(page.querySelector('#latestRecordings'), result.Items);
});
+ }
+
+ function deleteTimer(page, id) {
+
+ require(['confirm'], function (confirm) {
+
+ confirm(Globalize.translate('MessageConfirmRecordingCancellation'), Globalize.translate('HeaderConfirmRecordingCancellation')).then(function () {
+
+ Dashboard.showLoadingMsg();
+
+ ApiClient.cancelLiveTvTimer(id).then(function () {
+
+ require(['toast'], function (toast) {
+ toast(Globalize.translate('MessageRecordingCancelled'));
+ });
+
+ reload(page);
+ });
+ });
+ });
+ }
+
+ function renderTimers(page, timers) {
+
+ LiveTvHelpers.getTimersHtml(timers).then(function (html) {
+
+ var elem = page.querySelector('#upcomingRecordings');
+
+ if (html) {
+ elem.classList.remove('hide');
+ } else {
+ elem.classList.add('hide');
+ }
+
+ elem.querySelector('.itemsContainer').innerHTML = html;
+
+ ImageLoader.lazyChildren(elem);
+
+ $('.btnDeleteTimer', elem).on('click', function () {
+
+ var id = this.getAttribute('data-timerid');
+
+ deleteTimer(page, id);
+ });
+ });
+ }
+
+ function renderUpcomingRecordings(page) {
+
+ ApiClient.getLiveTvTimers().then(function (result) {
+
+ renderTimers(page, result.Items);
+ });
+ }
+
+ function reload(page) {
+
+ Dashboard.showLoadingMsg();
+
+ renderUpcomingRecordings(page);
+ renderActiveRecordings(page);
+ renderLatestRecordings(page);
ApiClient.getLiveTvRecordingGroups({
diff --git a/dashboard-ui/scripts/livetvsuggested.js b/dashboard-ui/scripts/livetvsuggested.js
index 0b70aaf1fb..c42977dc3b 100644
--- a/dashboard-ui/scripts/livetvsuggested.js
+++ b/dashboard-ui/scripts/livetvsuggested.js
@@ -168,10 +168,6 @@
renderMethod = 'renderRecordingsTab';
break;
case 4:
- depends.push('scripts/livetvtimers');
- renderMethod = 'renderTimersTab';
- break;
- case 5:
depends.push('scripts/livetvseriestimers');
renderMethod = 'renderSeriesTimersTab';
break;
diff --git a/dashboard-ui/scripts/livetvtimers.js b/dashboard-ui/scripts/livetvtimers.js
deleted file mode 100644
index e6d082d5f5..0000000000
--- a/dashboard-ui/scripts/livetvtimers.js
+++ /dev/null
@@ -1,58 +0,0 @@
-define(['jQuery'], function ($) {
-
- function deleteTimer(page, id) {
-
- require(['confirm'], function (confirm) {
-
- confirm(Globalize.translate('MessageConfirmRecordingCancellation'), Globalize.translate('HeaderConfirmRecordingCancellation')).then(function () {
-
- Dashboard.showLoadingMsg();
-
- ApiClient.cancelLiveTvTimer(id).then(function () {
-
- require(['toast'], function (toast) {
- toast(Globalize.translate('MessageRecordingCancelled'));
- });
-
- reload(page);
- });
- });
- });
- }
-
- function renderTimers(page, timers) {
-
- LiveTvHelpers.getTimersHtml(timers).then(function (html) {
- var elem = $('#items', page).html(html)[0];
-
- ImageLoader.lazyChildren(elem);
-
- $('.btnDeleteTimer', elem).on('click', function () {
-
- var id = this.getAttribute('data-timerid');
-
- deleteTimer(page, id);
- });
-
- Dashboard.hideLoadingMsg();
- });
- }
-
- function reload(page) {
-
- Dashboard.showLoadingMsg();
-
- ApiClient.getLiveTvTimers().then(function (result) {
-
- renderTimers(page, result.Items);
- });
- }
-
- window.LiveTvPage.renderTimersTab = function (page, tabContent) {
-
- if (LibraryBrowser.needsRefresh(tabContent)) {
- reload(tabContent);
- }
- };
-
-});
\ No newline at end of file
diff --git a/dashboard-ui/scripts/nowplayingbar.js b/dashboard-ui/scripts/nowplayingbar.js
index 9e43783987..14e10f4e88 100644
--- a/dashboard-ui/scripts/nowplayingbar.js
+++ b/dashboard-ui/scripts/nowplayingbar.js
@@ -1,4 +1,4 @@
-define(['datetime', 'jQuery'], function (datetime, $) {
+define(['datetime', 'jQuery', 'paper-icon-button'], function (datetime, $) {
var currentPlayer;
diff --git a/dashboard-ui/scripts/playlistmanager.js b/dashboard-ui/scripts/playlistmanager.js
index 8878712b4c..a97624832e 100644
--- a/dashboard-ui/scripts/playlistmanager.js
+++ b/dashboard-ui/scripts/playlistmanager.js
@@ -14,6 +14,9 @@
if (item.Type == 'Program') {
return false;
}
+ if (item.Type == 'Timer') {
+ return false;
+ }
return item.RunTimeTicks || item.IsFolder || item.Type == "Genre" || item.Type == "MusicGenre" || item.Type == "MusicArtist";
}
};
diff --git a/dashboard-ui/strings/en-US.json b/dashboard-ui/strings/en-US.json
index 0cdfc90eb8..b2eabf60c5 100644
--- a/dashboard-ui/strings/en-US.json
+++ b/dashboard-ui/strings/en-US.json
@@ -2349,5 +2349,6 @@
"LabelOriginalTitle": "Original title:",
"LabelSortTitle": "Sort title:",
"OptionConvertRecordingPreserveAudio": "Preserve original audio when converting recordings",
- "OptionConvertRecordingPreserveAudioHelp": "This will provide better audio but may require transcoding during playback on some devices."
+ "OptionConvertRecordingPreserveAudioHelp": "This will provide better audio but may require transcoding during playback on some devices.",
+ "HeaderUpcomingRecordings": "Upcoming Recordings"
}