define(['libraryBrowser', 'cardBuilder', 'appSettings', 'components/groupedcards', 'dom', 'scrollStyles', 'emby-button', 'paper-icon-button-light', 'emby-itemscontainer'], function (libraryBrowser, cardBuilder, appSettings, groupedcards, dom) { function getUserViews(userId) { return ApiClient.getUserViews({}, userId).then(function (result) { return result.Items; }); } function enableScrollX() { return browserInfo.mobile && AppInfo.enableAppLayouts; } function getThumbShape() { return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function getPortraitShape() { return enableScrollX() ? 'overflowPortrait' : 'portrait'; } function getLibraryButtonsHtml(items) { var html = ""; // "My Library" backgrounds for (var i = 0, length = items.length; i < length; i++) { var item = items[i]; var icon; switch (item.CollectionType) { case "movies": icon = "local_movies"; break; case "music": icon = "library_music"; break; case "photos": icon = "photo"; break; case "livetv": icon = "live_tv"; break; case "tvshows": icon = "live_tv"; break; case "games": icon = "folder"; break; case "trailers": icon = "local_movies"; break; case "homevideos": icon = "video_library"; break; case "musicvideos": icon = "video_library"; break; case "books": icon = "folder"; break; case "channels": icon = "folder"; break; case "playlists": icon = "folder"; break; default: icon = "folder"; break; } var cssClass = 'card smallBackdropCard buttonCard'; if (item.CollectionType) { cssClass += ' ' + item.CollectionType + 'buttonCard'; } var href = item.url || libraryBrowser.getHref(item); var onclick = item.onclick ? ' onclick="' + item.onclick + '"' : ''; icon = item.icon || icon; html += ''; html += '
'; html += "
"; html += '' + icon + ''; html += '' + item.Name + ''; html += "
"; html += "
"; html += ""; } return html; } function loadlibraryButtons(elem, userId, index) { return getUserViews(userId).then(function (items) { var html = '
'; if (index) { html += '

' + Globalize.translate('HeaderMyMedia') + '

'; } html += '
'; html += getLibraryButtonsHtml(items); html += '
'; return getAppInfo().then(function (infoHtml) { elem.innerHTML = html + infoHtml; }); }); } /** * Returns a random integer between min (inclusive) and max (inclusive) * Using Math.round() will give you a non-uniform distribution! */ function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function getAppInfo() { var frequency = 86400000; if (AppInfo.isNativeApp) { frequency = 172800000; } var cacheKey = 'lastappinfopresent5'; var lastDatePresented = parseInt(appSettings.get(cacheKey) || '0'); // Don't show the first time, right after installation if (!lastDatePresented) { appSettings.set(cacheKey, new Date().getTime()); return Promise.resolve(''); } if ((new Date().getTime() - lastDatePresented) < frequency) { return Promise.resolve(''); } return Dashboard.getPluginSecurityInfo().then(function (pluginSecurityInfo) { appSettings.set(cacheKey, new Date().getTime()); if (pluginSecurityInfo.IsMBSupporter) { return ''; } var infos = [getPremiereInfo]; if (!browserInfo.safari || !AppInfo.isNativeApp) { infos.push(getTheaterInfo); } if (!AppInfo.enableAppLayouts) { infos.push(getUpgradeMobileLayoutsInfo); } appSettings.set(cacheKey, new Date().getTime()); return infos[getRandomInt(0, infos.length - 1)](); }); } function getCard(img, target, shape) { shape = shape || 'backdropCard'; var html = '
'; if (target) { html += ''; } else { html += ''; } html += '
'; return html; } function getTheaterInfo() { var html = ''; html += '
'; html += '

Try Emby Theater

'; var nameText = AppInfo.isNativeApp ? 'Emby Theater' : 'Emby Theater'; html += '

A beautiful app for your TV and large screen tablet. ' + nameText + ' runs on Windows, Xbox One, Google Chrome, FireFox, Microsoft Edge and Opera.

'; html += '
'; html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png', 'https://emby.media/download'); html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png', 'https://emby.media/download'); html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png', 'https://emby.media/download'); html += '
'; html += '
'; html += '
'; return html; } function getPremiereInfo() { var html = ''; html += '
'; html += '

Try Emby Premiere

'; var cardTarget = AppInfo.isNativeApp ? '' : 'https://emby.media/premiere'; var learnMoreText = AppInfo.isNativeApp ? '' : 'Learn more'; html += '

Design beautiful Cover Art, enjoy free access to Emby apps, and more. ' + learnMoreText + '

'; html += '
'; html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png', cardTarget); html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png', cardTarget); html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png', cardTarget); html += '
'; html += '
'; html += '
'; return html; } function getUpgradeMobileLayoutsInfo() { var html = ''; html += '
'; html += '

Unlock Improved Layouts with Emby Premiere

'; var cardTarget = AppInfo.isNativeApp ? '' : 'https://emby.media/premiere'; var learnMoreText = AppInfo.isNativeApp ? '' : 'Learn more'; html += '

Combined horizontal and vertical swiping, better detail layouts, and more. ' + learnMoreText + '

'; html += '
'; html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/ms1.png', cardTarget, 'portraitCard'); html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/ms2.png', cardTarget, 'portraitCard'); html += '
'; html += '
'; html += '
'; return html; } function loadRecentlyAdded(elem, user) { var options = { Limit: 20, Fields: "PrimaryImageAspectRatio,BasicSyncInfo", ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Thumb" }; return ApiClient.getJSON(ApiClient.getUrl('Users/' + user.Id + '/Items/Latest', options)).then(function (items) { var html = ''; var cardLayout = false; if (items.length) { html += '
'; html += '

' + Globalize.translate('HeaderLatestMedia') + '

'; html += '
'; html += '
'; html += cardBuilder.getCardsHtml({ items: items, preferThumb: true, shape: 'backdrop', showUnplayedIndicator: false, showChildCountIndicator: true, lazy: true, cardLayout: cardLayout, showTitle: cardLayout, showYear: cardLayout, showDetailsMenu: true, context: 'home' }); html += '
'; } elem.innerHTML = html; elem.addEventListener('click', groupedcards.onItemsContainerClick); ImageLoader.lazyChildren(elem); }); } function loadLatestMovies(elem, user) { var options = { Limit: 12, Fields: "PrimaryImageAspectRatio,BasicSyncInfo", ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Thumb", IncludeItemTypes: "Movie" }; return ApiClient.getJSON(ApiClient.getUrl('Users/' + user.Id + '/Items/Latest', options)).then(function (items) { var html = ''; var scrollX = enableScrollX(); if (items.length) { html += '

' + Globalize.translate('HeaderLatestMovies') + '

'; if (scrollX) { html += '
'; } else { html += '
'; } html += cardBuilder.getCardsHtml({ items: items, shape: getPortraitShape(), showUnplayedIndicator: false, showChildCountIndicator: true, lazy: true, context: 'home', centerText: true, overlayPlayButton: true, allowBottomPadding: !enableScrollX() }); html += '
'; } elem.innerHTML = html; ImageLoader.lazyChildren(elem); }); } function loadLatestEpisodes(elem, user) { var options = { Limit: 12, Fields: "PrimaryImageAspectRatio,BasicSyncInfo", ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Thumb", IncludeItemTypes: "Episode" }; return ApiClient.getJSON(ApiClient.getUrl('Users/' + user.Id + '/Items/Latest', options)).then(function (items) { var html = ''; var scrollX = enableScrollX(); if (items.length) { html += '

' + Globalize.translate('HeaderLatestEpisodes') + '

'; if (scrollX) { html += '
'; } else { html += '
'; } html += cardBuilder.getCardsHtml({ items: items, preferThumb: true, shape: getThumbShape(), showUnplayedIndicator: false, showChildCountIndicator: true, lazy: true, context: 'home', overlayPlayButton: true, allowBottomPadding: !enableScrollX() }); html += '
'; } elem.innerHTML = html; ImageLoader.lazyChildren(elem); }); } function loadLatestChannelMedia(elem, userId) { var screenWidth = dom.getWindowSize().innerWidth; var options = { Limit: screenWidth >= 2400 ? 10 : (screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 8 : (screenWidth >= 800 ? 7 : 6))), Fields: "PrimaryImageAspectRatio,BasicSyncInfo", Filters: "IsUnplayed", UserId: userId }; return ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).then(function (result) { var html = ''; if (result.Items.length) { html += '

' + Globalize.translate('HeaderLatestChannelMedia') + '

'; html += '
'; html += cardBuilder.getCardsHtml({ items: result.Items, shape: 'auto', showTitle: true, centerText: true, lazy: true, showDetailsMenu: true, overlayPlayButton: true }); html += '
'; } elem.innerHTML = html; ImageLoader.lazyChildren(elem); }); } function loadLibraryTiles(elem, user, shape, index, autoHideOnMobile, showTitles) { return getUserViews(user.Id).then(function (items) { var html = ''; if (autoHideOnMobile) { html += '
'; } else { html += '
'; } if (items.length) { html += '
'; html += '

' + Globalize.translate('HeaderMyMedia') + '

'; html += '
'; var scrollX = enableScrollX() && dom.getWindowSize().innerWidth >= 600; if (scrollX) { html += '
'; } else { html += '
'; } html += cardBuilder.getCardsHtml({ items: items, shape: scrollX ? 'overflowBackdrop' : shape, showTitle: showTitles, centerText: true, overlayText: false, lazy: true, transition: false, allowBottomPadding: !enableScrollX() }); html += '
'; } html += '
'; if (autoHideOnMobile) { html += '
'; html += getLibraryButtonsHtml(items); html += '
'; } return getAppInfo().then(function (infoHtml) { elem.innerHTML = html + infoHtml; ImageLoader.lazyChildren(elem); }); }); } function loadResume(elem, userId) { var screenWidth = dom.getWindowSize().innerWidth; var options = { SortBy: "DatePlayed", SortOrder: "Descending", MediaTypes: "Video", Filters: "IsResumable", Limit: screenWidth >= 1920 ? 8 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 9 : 6)), Recursive: true, Fields: "PrimaryImageAspectRatio,BasicSyncInfo", CollapseBoxSetItems: false, ExcludeLocationTypes: "Virtual", ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableTotalRecordCount: false }; return ApiClient.getItems(userId, options).then(function (result) { var html = ''; if (result.Items.length) { html += '

' + Globalize.translate('HeaderResume') + '

'; if (enableScrollX()) { html += '
'; } else { html += '
'; } html += cardBuilder.getCardsHtml({ items: result.Items, preferThumb: true, shape: getThumbShape(), overlayText: false, showTitle: true, showParentTitle: true, lazy: true, showDetailsMenu: true, overlayPlayButton: true, context: 'home', centerText: true, allowBottomPadding: !enableScrollX() }); html += '
'; } elem.innerHTML = html; ImageLoader.lazyChildren(elem); }); } function loadNextUp(elem, userId) { var query = { Limit: 20, Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo", UserId: userId, ImageTypeLimit: 1, EnableImageTypes: "Primary,Backdrop,Banner,Thumb" }; ApiClient.getNextUpEpisodes(query).then(function (result) { var html = ''; if (result.Items.length) { html += '

' + Globalize.translate('HeaderNextUp') + '

'; if (enableScrollX()) { html += '
'; } else { html += '
'; } html += cardBuilder.getCardsHtml({ items: result.Items, preferThumb: true, shape: getThumbShape(), overlayText: false, showTitle: true, showParentTitle: true, lazy: true, overlayPlayButton: true, context: 'home', centerText: true, allowBottomPadding: !enableScrollX() }); html += '
'; } elem.innerHTML = html; ImageLoader.lazyChildren(elem); }); } function loadLatestChannelItems(elem, userId, options) { options = Object.assign(options || {}, { UserId: userId, SupportsLatestItems: true }); return ApiClient.getJSON(ApiClient.getUrl("Channels", options)).then(function (result) { var channels = result.Items; var channelsHtml = channels.map(function (c) { return '
'; }).join(''); elem.innerHTML = channelsHtml; for (var i = 0, length = channels.length; i < length; i++) { var channel = channels[i]; loadLatestChannelItemsFromChannel(elem, channel, i); } }); } function loadLatestChannelItemsFromChannel(page, channel, index) { var screenWidth = dom.getWindowSize().innerWidth; var options = { Limit: screenWidth >= 1600 ? 10 : (screenWidth >= 1440 ? 5 : (screenWidth >= 800 ? 6 : 6)), Fields: "PrimaryImageAspectRatio,BasicSyncInfo", Filters: "IsUnplayed", UserId: Dashboard.getCurrentUserId(), ChannelIds: channel.Id }; ApiClient.getJSON(ApiClient.getUrl("Channels/Items/Latest", options)).then(function (result) { var html = ''; if (result.Items.length) { html += '
'; html += '
'; var text = Globalize.translate('HeaderLatestFromChannel').replace('{0}', channel.Name); html += '

' + text + '

'; html += ''; html += '
'; html += '
'; html += cardBuilder.getCardsHtml({ items: result.Items, shape: 'autohome', defaultShape: 'square', showTitle: true, centerText: true, lazy: true, showDetailsMenu: true, overlayPlayButton: true }); html += '
'; html += '
'; } var elem = page.querySelector('#channel' + channel.Id + ''); elem.innerHTML = html; ImageLoader.lazyChildren(elem); }); } function loadLatestLiveTvRecordings(elem, userId, index) { return ApiClient.getLiveTvRecordings({ userId: userId, limit: 5, Fields: "PrimaryImageAspectRatio,BasicSyncInfo", IsInProgress: false, EnableTotalRecordCount: false }).then(function (result) { var html = ''; if (result.Items.length) { var cssClass = index !== 0 ? 'listHeader' : 'listHeader'; html += '
'; html += '

' + Globalize.translate('HeaderLatestTvRecordings') + '

'; html += ''; html += '
'; } if (enableScrollX()) { html += '
'; } else { html += '
'; } html += cardBuilder.getCardsHtml({ items: result.Items, shape: enableScrollX() ? 'autooverflow' : 'auto', showTitle: true, showParentTitle: true, coverImage: true, lazy: true, showDetailsMenu: true, centerText: true, overlayPlayButton: true, allowBottomPadding: !enableScrollX() }); html += '
'; elem.innerHTML = html; ImageLoader.lazyChildren(elem); }); } window.Sections = { loadRecentlyAdded: loadRecentlyAdded, loadLatestChannelMedia: loadLatestChannelMedia, loadLibraryTiles: loadLibraryTiles, loadResume: loadResume, loadNextUp: loadNextUp, loadLatestChannelItems: loadLatestChannelItems, loadLatestLiveTvRecordings: loadLatestLiveTvRecordings, loadlibraryButtons: loadlibraryButtons, loadLatestMovies: loadLatestMovies, loadLatestEpisodes: loadLatestEpisodes }; return window.Sections; });