From 70393a9136508c387a8b97670c56f3a41d64c62f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 6 May 2016 14:17:02 -0400 Subject: [PATCH] update recordings --- dashboard-ui/livetv.html | 17 +-- dashboard-ui/scripts/librarybrowser.js | 140 ++++++++++++++--------- dashboard-ui/scripts/librarylist.js | 2 +- dashboard-ui/scripts/livetvcomponents.js | 17 +++ dashboard-ui/scripts/livetvrecordings.js | 69 ++++++++++- dashboard-ui/scripts/livetvsuggested.js | 4 - dashboard-ui/scripts/livetvtimers.js | 58 ---------- dashboard-ui/scripts/nowplayingbar.js | 2 +- dashboard-ui/scripts/playlistmanager.js | 3 + dashboard-ui/strings/en-US.json | 3 +- 10 files changed, 188 insertions(+), 127 deletions(-) delete mode 100644 dashboard-ui/scripts/livetvtimers.js diff --git a/dashboard-ui/livetv.html b/dashboard-ui/livetv.html index 982b40302..87845c4e5 100644 --- a/dashboard-ui/livetv.html +++ b/dashboard-ui/livetv.html @@ -6,7 +6,6 @@ ${TabGuide} ${TabChannels} ${TabRecordings} - ${TabScheduled} ${TabSeries}
@@ -14,8 +13,7 @@ ${TabGuide} ${TabChannels} ${TabRecordings} - ${TabScheduled} - ${TabSeries} + ${TabSeries}
@@ -79,6 +77,13 @@

+
+
+

${HeaderUpcomingRecordings}

+
+
+
+
-
-
-
-
-
+
diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index a0da6e86e..365638fc7 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 2eb4a5e62..5dae5e7c1 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 7224c3f01..cbd3ede7e 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 9bd11972c..1844c9abc 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 0b70aaf1f..c42977dc3 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 e6d082d5f..000000000 --- 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 9e4378398..14e10f4e8 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 8878712b4..a97624832 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 0cdfc90eb..b2eabf60c 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" }