2019-01-10 15:39:37 +03:00
define ( [ 'connectionManager' , 'cardBuilder' , 'registrationServices' , 'appSettings' , 'dom' , 'apphost' , 'layoutManager' , 'imageLoader' , 'globalize' , 'itemShortcuts' , 'itemHelper' , 'appRouter' , 'emby-button' , 'paper-icon-button-light' , 'emby-itemscontainer' , 'emby-scroller' , 'emby-linkbutton' , 'css!./homesections' ] , function ( connectionManager , cardBuilder , registrationServices , appSettings , dom , appHost , layoutManager , imageLoader , globalize , itemShortcuts , itemHelper , appRouter ) {
'use strict' ;
2018-10-23 01:05:09 +03:00
function getDefaultSection ( index ) {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
switch ( index ) {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
case 0 :
2019-01-10 15:39:37 +03:00
return 'smalllibrarytiles' ;
2018-10-23 01:05:09 +03:00
case 1 :
2019-01-10 15:39:37 +03:00
return 'resume' ;
2018-10-23 01:05:09 +03:00
case 2 :
2019-01-10 15:39:37 +03:00
return 'resumeaudio' ;
2018-10-23 01:05:09 +03:00
case 3 :
2019-01-10 15:39:37 +03:00
return 'livetv' ;
2018-10-23 01:05:09 +03:00
case 4 :
2019-01-10 15:39:37 +03:00
return 'nextup' ;
2018-10-23 01:05:09 +03:00
case 5 :
2019-01-10 15:39:37 +03:00
return 'latestmedia' ;
2018-10-23 01:05:09 +03:00
case 6 :
2019-01-10 15:39:37 +03:00
return 'none' ;
2018-10-23 01:05:09 +03:00
default :
2019-01-10 15:39:37 +03:00
return '' ;
2018-10-23 01:05:09 +03:00
}
}
function getAllSectionsToShow ( userSettings , sectionCount ) {
2019-01-10 15:39:37 +03:00
var sections = [ ] ;
for ( var i = 0 , length = sectionCount ; i < length ; i ++ ) {
var section = userSettings . get ( 'homesection' + i ) || getDefaultSection ( i ) ;
if ( section === 'folders' ) {
section = getDefaultSection ( 0 ) ;
}
sections . push ( section ) ;
2018-10-23 01:05:09 +03:00
}
2019-01-10 15:39:37 +03:00
return sections ;
2018-10-23 01:05:09 +03:00
}
function loadSections ( elem , apiClient , user , userSettings ) {
2019-01-10 15:39:37 +03:00
return getUserViews ( apiClient , user . Id ) . then ( function ( userViews ) {
var i , length ;
var sectionCount = 7 ;
var html = '' ;
for ( i = 0 , length = sectionCount ; i < length ; i ++ ) {
html += '<div class="verticalSection section' + i + '"></div>' ;
}
elem . innerHTML = html ;
elem . classList . add ( 'homeSectionsContainer' ) ;
var promises = [ ] ;
var sections = getAllSectionsToShow ( userSettings , sectionCount ) ;
for ( i = 0 , length = sections . length ; i < length ; i ++ ) {
promises . push ( loadSection ( elem , apiClient , user , userSettings , userViews , sections , i ) ) ;
}
return Promise . all ( promises ) . then ( function ( ) {
html = '' ;
var style = 'margin-top:4em;' ;
if ( layoutManager . tv ) {
style += 'padding: 0 7.5%;' ;
}
html += '<div class="verticalSection padded-left padded-right customizeSection hide" style="' + style + '">' ;
html += '<a href="' + appRouter . getRouteUrl ( 'settings' ) + '" is="emby-linkbutton" class="raised block"><span>' + globalize . translate ( 'sharedcomponents#HeaderCustomizeHomeScreen' ) + '</span></a>' ;
html += '</div>' ;
elem . insertAdjacentHTML ( 'beforeend' , html ) ;
return resume ( elem , {
refresh : true ,
returnPromise : false
} ) ;
} ) ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function destroySections ( elem ) {
2019-01-10 15:39:37 +03:00
var elems = elem . querySelectorAll ( '.itemsContainer' ) ;
var i , length ;
for ( i = 0 , length = elems . length ; i < length ; i ++ ) {
elems [ i ] . fetchData = null ;
elems [ i ] . parentContainer = null ;
elems [ i ] . getItemsHtml = null ;
}
elem . innerHTML = '' ;
2018-10-23 01:05:09 +03:00
}
function pause ( elem ) {
2019-01-10 15:39:37 +03:00
var elems = elem . querySelectorAll ( '.itemsContainer' ) ;
var i , length ;
for ( i = 0 , length = elems . length ; i < length ; i ++ ) {
elems [ i ] . pause ( ) ;
}
2018-10-23 01:05:09 +03:00
}
function resume ( elem , options ) {
2019-01-10 15:39:37 +03:00
var elems = elem . querySelectorAll ( '.itemsContainer' ) ;
var i , length ;
var promises = [ ] ;
for ( i = 0 , length = elems . length ; i < length ; i ++ ) {
promises . push ( elems [ i ] . resume ( options ) ) ;
}
var promise = Promise . all ( promises ) . then ( function ( ) {
elem . querySelector ( '.customizeSection' ) . classList . remove ( 'hide' ) ;
2018-10-23 01:05:09 +03:00
} ) ;
2019-01-10 15:39:37 +03:00
if ( ! options || options . returnPromise !== false ) {
return promise ;
}
2018-10-23 01:05:09 +03:00
}
function loadSection ( page , apiClient , user , userSettings , userViews , allSections , index ) {
2019-01-10 15:39:37 +03:00
var section = allSections [ index ] ;
var userId = user . Id ;
var elem = page . querySelector ( '.section' + index ) ;
if ( section === 'latestmedia' ) {
loadRecentlyAdded ( elem , apiClient , user , userViews ) ;
}
else if ( section === 'librarytiles' || section === 'smalllibrarytiles' || section === 'smalllibrarytiles-automobile' || section === 'librarytiles-automobile' ) {
return loadLibraryTiles ( elem , apiClient , user , userSettings , 'smallBackdrop' , userViews , allSections ) ;
}
else if ( section === 'librarybuttons' ) {
return loadlibraryButtons ( elem , apiClient , user , userSettings , userViews , allSections ) ;
}
else if ( section === 'resume' ) {
loadResumeVideo ( elem , apiClient , userId ) ;
}
else if ( section === 'resumeaudio' ) {
loadResumeAudio ( elem , apiClient , userId ) ;
}
else if ( section === 'activerecordings' ) {
loadLatestLiveTvRecordings ( elem , true , apiClient , userId ) ;
}
else if ( section === 'nextup' ) {
loadNextUp ( elem , apiClient , userId ) ;
}
else if ( section === 'onnow' || section === 'livetv' ) {
return loadOnNow ( elem , apiClient , user ) ;
}
2018-10-23 01:05:09 +03:00
else {
2019-01-10 15:39:37 +03:00
elem . innerHTML = '' ;
return Promise . resolve ( ) ;
2018-10-23 01:05:09 +03:00
}
2019-01-10 15:39:37 +03:00
return Promise . resolve ( ) ;
2018-10-23 01:05:09 +03:00
}
function getUserViews ( apiClient , userId ) {
2019-01-10 15:39:37 +03:00
return apiClient . getUserViews ( { } , userId || apiClient . getCurrentUserId ( ) ) . then ( function ( result ) {
return result . Items ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function enableScrollX ( ) {
2019-01-10 15:39:37 +03:00
return true ;
2018-10-23 01:05:09 +03:00
}
function getSquareShape ( ) {
2019-01-10 15:39:37 +03:00
return enableScrollX ( ) ? 'overflowSquare' : 'square' ;
2018-10-23 01:05:09 +03:00
}
function getThumbShape ( ) {
2019-01-10 15:39:37 +03:00
return enableScrollX ( ) ? 'overflowBackdrop' : 'backdrop' ;
2018-10-23 01:05:09 +03:00
}
function getPortraitShape ( ) {
2019-01-10 15:39:37 +03:00
return enableScrollX ( ) ? 'autooverflow' : 'auto' ;
2018-10-23 01:05:09 +03:00
}
function getLibraryButtonsHtml ( items ) {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
var html = "" ;
2019-01-10 15:39:37 +03:00
html += '<div class="verticalSection verticalSection-extrabottompadding">' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">' ;
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize . translate ( 'sharedcomponents#HeaderMyMedia' ) + '</h2>' ;
if ( ! layoutManager . tv ) {
html += '<button type="button" is="paper-icon-button-light" class="sectionTitleIconButton btnHomeScreenSettings"><i class="md-icon"></i></button>' ;
}
html += '</div>' ;
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-multiselect="false">' ;
// "My Library" backgrounds
2018-10-23 01:05:09 +03:00
for ( var i = 0 , length = items . length ; i < length ; i ++ ) {
2019-01-10 15:39:37 +03:00
var item = items [ i ] ;
var icon ;
2018-10-23 01:05:09 +03:00
switch ( item . CollectionType ) {
case "movies" :
icon = "local_movies" ;
break ;
case "music" :
icon = "library_music" ;
break ;
case "photos" :
icon = "photo" ;
break ;
case "livetv" :
2019-01-10 15:39:37 +03:00
icon = "live_tv" ;
break ;
2018-10-23 01:05:09 +03:00
case "tvshows" :
icon = "live_tv" ;
break ;
case "games" :
icon = "folder" ;
break ;
case "trailers" :
icon = "local_movies" ;
break ;
case "homevideos" :
2019-01-10 15:39:37 +03:00
icon = "video_library" ;
break ;
2018-10-23 01:05:09 +03:00
case "musicvideos" :
icon = "video_library" ;
break ;
case "books" :
2019-01-10 15:39:37 +03:00
icon = "folder" ;
break ;
2018-10-23 01:05:09 +03:00
case "channels" :
2019-01-10 15:39:37 +03:00
icon = "folder" ;
break ;
2018-10-23 01:05:09 +03:00
case "playlists" :
2019-01-10 15:39:37 +03:00
icon = "folder" ;
break ;
2018-10-23 01:05:09 +03:00
default :
2019-01-10 15:39:37 +03:00
icon = "folder" ;
break ;
2018-10-23 01:05:09 +03:00
}
2019-01-10 15:39:37 +03:00
html += '<a is="emby-linkbutton" href="' + appRouter . getRouteUrl ( item ) + '" class="raised homeLibraryButton"><i class="md-icon">' + icon + '</i><span>' + item . Name + '</span></a>' ;
2018-10-23 01:05:09 +03:00
}
2019-01-10 15:39:37 +03:00
html += '</div>' ;
html += '</div>' ;
return html ;
2018-10-23 01:05:09 +03:00
}
function loadlibraryButtons ( elem , apiClient , user , userSettings , userViews ) {
2019-01-10 15:39:37 +03:00
return Promise . all ( [ getAppInfo ( apiClient ) , getDownloadsSectionHtml ( apiClient , user , userSettings ) ] ) . then ( function ( responses ) {
var infoHtml = responses [ 0 ] ;
var downloadsHtml = responses [ 1 ] ;
elem . classList . remove ( 'verticalSection' ) ;
2018-10-23 01:05:09 +03:00
var html = getLibraryButtonsHtml ( userViews ) ;
2019-01-10 15:39:37 +03:00
elem . innerHTML = html + downloadsHtml + infoHtml ;
bindHomeScreenSettingsIcon ( elem , apiClient , user . Id , userSettings ) ;
if ( infoHtml ) {
bindAppInfoEvents ( elem ) ;
}
imageLoader . lazyChildren ( elem ) ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function bindAppInfoEvents ( elem ) {
2019-01-10 15:39:37 +03:00
elem . querySelector ( '.appInfoSection' ) . addEventListener ( 'click' , function ( e ) {
if ( dom . parentWithClass ( e . target , 'card' ) ) {
registrationServices . showPremiereInfo ( ) ;
}
} ) ;
2018-10-23 01:05:09 +03:00
}
2019-01-10 15:39:37 +03:00
/ * *
* Returns a random integer between min ( inclusive ) and max ( inclusive )
* Using Math . round ( ) will give you a non - uniform distribution !
* /
2018-10-23 01:05:09 +03:00
function getRandomInt ( min , max ) {
2019-01-10 15:39:37 +03:00
return Math . floor ( Math . random ( ) * ( max - min + 1 ) ) + min ;
2018-10-23 01:05:09 +03:00
}
function getAppInfo ( apiClient ) {
2019-01-10 15:39:37 +03:00
var 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 registrationServices . validateFeature ( 'dvr' , {
showDialog : false ,
viewOnly : true
} ) . then ( function ( ) {
appSettings . set ( cacheKey , new Date ( ) . getTime ( ) ) ;
return '' ;
} , function ( ) {
appSettings . set ( cacheKey , new Date ( ) . getTime ( ) ) ;
2018-10-23 01:05:09 +03:00
var infos = [ getPremiereInfo ] ;
2019-01-10 15:39:37 +03:00
if ( appHost . supports ( 'otherapppromotions' ) ) {
infos . push ( getTheaterInfo ) ;
}
return infos [ getRandomInt ( 0 , infos . length - 1 ) ] ( ) ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function getCard ( img , shape ) {
2019-01-10 15:39:37 +03:00
shape = shape || 'backdropCard' ;
var html = '<div class="card scalableCard ' + shape + ' ' + shape + '-scalable"><div class="cardBox"><div class="cardScalable"><div class="cardPadder cardPadder-backdrop"></div>' ;
html += '<div class="cardContent">' ;
html += '<div class="cardImage lazy" data-src="' + img + '"></div>' ;
html += '</div>' ;
html += '</div></div></div>' ;
return html ;
2018-10-23 01:05:09 +03:00
}
function getTheaterInfo ( ) {
2019-01-10 15:39:37 +03:00
var html = '' ;
html += '<div class="verticalSection appInfoSection">' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">' ;
2019-01-10 15:41:25 +03:00
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">Discover Jellyfin Theater</h2>' ;
2019-01-10 15:39:37 +03:00
html += '<button is="paper-icon-button-light" class="sectionTitleButton" onclick="this.parentNode.parentNode.remove();" class="autoSize"><i class="md-icon">close</i></button>' ;
html += '</div>' ;
2019-01-10 15:41:25 +03:00
var nameText = 'Jellyfin Theater' ;
2019-01-10 15:39:37 +03:00
html += '<div class="padded-left padded-right">' ;
html += '<p class="sectionTitle-cards">A beautiful app for your TV and large screen tablet. ' + nameText + ' runs on Windows, Xbox One, Raspberry Pi, Samsung Smart TVs, Sony PS4, Web Browsers, and more.</p>' ;
html += '<div class="itemsContainer vertical-wrap" is="emby-itemscontainer">' ;
html += getCard ( 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png' ) ;
html += getCard ( 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png' ) ;
html += getCard ( 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png' ) ;
html += '</div>' ;
html += '</div>' ;
html += '</div>' ;
return html ;
2018-10-23 01:05:09 +03:00
}
function getPremiereInfo ( ) {
2019-01-10 15:39:37 +03:00
var html = '' ;
html += '<div class="verticalSection appInfoSection">' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">' ;
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">Discover Emby Premiere</h2>' ;
html += '<button is="paper-icon-button-light" class="sectionTitleButton" onclick="this.parentNode.parentNode.remove();" class="autoSize"><i class="md-icon">close</i></button>' ;
html += '</div>' ;
html += '<div class="padded-left padded-right">' ;
html += '<p class="sectionTitle-cards">Enjoy Emby DVR, get free access to Emby apps, and more.</p>' ;
html += '<div class="itemsContainer vertical-wrap" is="emby-itemscontainer">' ;
html += getCard ( 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png' ) ;
html += getCard ( 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png' ) ;
html += getCard ( 'https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater3.png' ) ;
html += '</div>' ;
html += '</div>' ;
html += '</div>' ;
return html ;
2018-10-23 01:05:09 +03:00
}
function getFetchLatestItemsFn ( serverId , parentId , collectionType ) {
2019-01-10 15:39:37 +03:00
return function ( ) {
var apiClient = connectionManager . getApiClient ( serverId ) ;
var limit = 16 ;
if ( enableScrollX ( ) ) {
if ( collectionType === 'music' ) {
limit = 30 ;
}
}
else {
if ( collectionType === 'tvshows' ) {
limit = 5 ;
} else if ( collectionType === 'music' ) {
limit = 9 ;
} else {
limit = 8 ;
}
}
2018-10-23 01:05:09 +03:00
var options = {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
Limit : limit ,
Fields : "PrimaryImageAspectRatio,BasicSyncInfo" ,
ImageTypeLimit : 1 ,
EnableImageTypes : "Primary,Backdrop,Thumb" ,
ParentId : parentId
} ;
2019-01-10 15:39:37 +03:00
return apiClient . getLatestItems ( options ) ;
} ;
2018-10-23 01:05:09 +03:00
}
function getLatestItemsHtmlFn ( itemType , viewType ) {
2019-01-10 15:39:37 +03:00
return function ( items ) {
var shape = itemType === 'Channel' || viewType === 'movies' ?
getPortraitShape ( ) :
viewType === 'music' ?
getSquareShape ( ) :
getThumbShape ( ) ;
var cardLayout = false ;
2018-10-23 01:05:09 +03:00
return cardBuilder . getCardsHtml ( {
items : items ,
shape : shape ,
2019-01-10 15:39:37 +03:00
preferThumb : viewType !== 'movies' && itemType !== 'Channel' && viewType !== 'music' ? 'auto' : null ,
showUnplayedIndicator : false ,
showChildCountIndicator : true ,
context : 'home' ,
overlayText : false ,
centerText : ! cardLayout ,
overlayPlayButton : viewType !== 'photos' ,
allowBottomPadding : ! enableScrollX ( ) && ! cardLayout ,
cardLayout : cardLayout ,
showTitle : viewType !== 'photos' ,
showYear : viewType === 'movies' || viewType === 'tvshows' || ! viewType ,
showParentTitle : viewType === 'music' || viewType === 'tvshows' || ! viewType || ( cardLayout && ( viewType === 'tvshows' ) ) ,
2018-10-23 01:05:09 +03:00
lines : 2
2019-01-10 15:39:37 +03:00
} ) ;
} ;
2018-10-23 01:05:09 +03:00
}
function renderLatestSection ( elem , apiClient , user , parent ) {
2019-01-10 15:39:37 +03:00
var html = '' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">' ;
if ( ! layoutManager . tv ) {
html += '<a is="emby-linkbutton" href="' + appRouter . getRouteUrl ( parent , {
section : 'latest'
} ) + '" class="more button-flat button-flat-mini sectionTitleTextButton">' ;
html += '<h2 class="sectionTitle sectionTitle-cards">' ;
html += globalize . translate ( 'sharedcomponents#LatestFromLibrary' , parent . Name ) ;
html += '</h2>' ;
html += '<i class="md-icon"></i>' ;
html += '</a>' ;
} else {
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize . translate ( 'sharedcomponents#LatestFromLibrary' , parent . Name ) + '</h2>' ;
}
html += '</div>' ;
if ( enableScrollX ( ) ) {
html += '<div is="emby-scroller" data-mousewheel="false" data-centerfocus="true" class="padded-top-focusscale padded-bottom-focusscale"><div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x padded-left padded-right">' ;
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x">' ;
}
if ( enableScrollX ( ) ) {
html += '</div>' ;
}
html += '</div>' ;
elem . innerHTML = html ;
var itemsContainer = elem . querySelector ( '.itemsContainer' ) ;
itemsContainer . fetchData = getFetchLatestItemsFn ( apiClient . serverId ( ) , parent . Id , parent . CollectionType ) ;
itemsContainer . getItemsHtml = getLatestItemsHtmlFn ( parent . Type , parent . CollectionType ) ;
itemsContainer . parentContainer = elem ;
2018-10-23 01:05:09 +03:00
}
function loadRecentlyAdded ( elem , apiClient , user , userViews ) {
2019-01-10 15:39:37 +03:00
elem . classList . remove ( 'verticalSection' ) ;
var excludeViewTypes = [ 'playlists' , 'livetv' , 'boxsets' , 'channels' ] ;
for ( var i = 0 , length = userViews . length ; i < length ; i ++ ) {
2018-10-23 01:05:09 +03:00
var item = userViews [ i ] ;
2019-01-10 15:39:37 +03:00
if ( user . Configuration . LatestItemsExcludes . indexOf ( item . Id ) !== - 1 ) {
continue ;
2018-10-23 01:05:09 +03:00
}
2019-01-10 15:39:37 +03:00
if ( excludeViewTypes . indexOf ( item . CollectionType || [ ] ) !== - 1 ) {
continue ;
}
var frag = document . createElement ( 'div' ) ;
frag . classList . add ( 'verticalSection' ) ;
frag . classList . add ( 'hide' ) ;
elem . appendChild ( frag ) ;
renderLatestSection ( frag , apiClient , user , item ) ;
2018-10-23 01:05:09 +03:00
}
}
function getRequirePromise ( deps ) {
2019-01-10 15:39:37 +03:00
return new Promise ( function ( resolve , reject ) {
require ( deps , resolve ) ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function showHomeScreenSettings ( elem , options ) {
2019-01-10 15:39:37 +03:00
return getRequirePromise ( [ 'homescreenSettingsDialog' ] ) . then ( function ( homescreenSettingsDialog ) {
return homescreenSettingsDialog . show ( options ) . then ( function ( ) {
dom . parentWithClass ( elem , 'homeSectionsContainer' ) . dispatchEvent ( new CustomEvent ( 'settingschange' , {
cancelable : false
} ) ) ;
} ) ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function bindHomeScreenSettingsIcon ( elem , apiClient , userId , userSettings ) {
2019-01-10 15:39:37 +03:00
var btnHomeScreenSettings = elem . querySelector ( '.btnHomeScreenSettings' ) ;
if ( ! btnHomeScreenSettings ) {
return ;
}
btnHomeScreenSettings . addEventListener ( 'click' , function ( ) {
2018-10-23 01:05:09 +03:00
showHomeScreenSettings ( elem , {
serverId : apiClient . serverId ( ) ,
userId : userId ,
userSettings : userSettings
2019-01-10 15:39:37 +03:00
} ) ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function getDownloadsSectionHtml ( apiClient , user , userSettings ) {
2019-01-10 15:39:37 +03:00
if ( ! appHost . supports ( 'sync' ) || ! user . Policy . EnableContentDownloading ) {
return Promise . resolve ( '' ) ;
}
var promise = apiClient . getLatestOfflineItems ? apiClient . getLatestOfflineItems ( {
2018-10-23 01:05:09 +03:00
Limit : 20 ,
2019-01-10 15:39:37 +03:00
Filters : 'IsNotFolder'
} ) : Promise . resolve ( [ ] ) ;
return promise . then ( function ( items ) {
var html = '' ;
html += '<div class="verticalSection">' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">' ;
if ( ! layoutManager . tv ) {
html += '<a is="emby-linkbutton" href="' + appRouter . getRouteUrl ( 'downloads' ) + '" class="more button-flat button-flat-mini sectionTitleTextButton">' ;
html += '<h2 class="sectionTitle sectionTitle-cards">' ;
html += globalize . translate ( 'sharedcomponents#HeaderMyDownloads' ) ;
html += '</h2>' ;
html += '<i class="md-icon"></i>' ;
html += '</a>' ;
html += '<a is="emby-linkbutton" href="' + appRouter . getRouteUrl ( 'managedownloads' ) + '" class="sectionTitleIconButton"><i class="md-icon"></i></a>' ;
} else {
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize . translate ( 'sharedcomponents#HeaderMyDownloads' ) + '</h2>' ;
}
html += '</div>' ;
html += '<div is="emby-scroller" data-mousewheel="false" data-centerfocus="true" class="padded-top-focusscale padded-bottom-focusscale"><div is="emby-itemscontainer" class="scrollSlider focuscontainer-x padded-left padded-right">' ;
var cardLayout = false ;
html += cardBuilder . getCardsHtml ( {
2018-10-23 01:05:09 +03:00
items : items ,
2019-01-10 15:39:37 +03:00
preferThumb : 'auto' ,
shape : 'autooverflow' ,
overlayText : false ,
showTitle : true ,
showParentTitle : true ,
lazy : true ,
showDetailsMenu : true ,
overlayPlayButton : true ,
context : 'home' ,
centerText : ! cardLayout ,
allowBottomPadding : false ,
cardLayout : cardLayout ,
showYear : true ,
2018-10-23 01:05:09 +03:00
lines : 2
2019-01-10 15:39:37 +03:00
} ) ;
html += '</div>' ;
html += '</div>' ;
return html ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function loadLibraryTiles ( elem , apiClient , user , userSettings , shape , userViews , allSections ) {
2019-01-10 15:39:37 +03:00
elem . classList . remove ( 'verticalSection' ) ;
var html = '' ;
var scrollX = ! layoutManager . desktop ;
if ( userViews . length ) {
html += '<div class="verticalSection">' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">' ;
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize . translate ( 'sharedcomponents#HeaderMyMedia' ) + '</h2>' ;
if ( ! layoutManager . tv ) {
html += '<button type="button" is="paper-icon-button-light" class="sectionTitleIconButton btnHomeScreenSettings"><i class="md-icon"></i></button>' ;
}
html += '</div>' ;
if ( scrollX ) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-mousewheel="false" data-centerfocus="true"><div is="emby-itemscontainer" class="scrollSlider focuscontainer-x padded-left padded-right">' ;
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x">' ;
}
html += cardBuilder . getCardsHtml ( {
items : userViews ,
shape : scrollX ? 'overflowSmallBackdrop' : shape ,
showTitle : true ,
centerText : true ,
overlayText : false ,
lazy : true ,
transition : false ,
allowBottomPadding : ! scrollX
} ) ;
if ( scrollX ) {
html += '</div>' ;
}
html += '</div>' ;
html += '</div>' ;
}
return Promise . all ( [ getAppInfo ( apiClient ) , getDownloadsSectionHtml ( apiClient , user , userSettings ) ] ) . then ( function ( responses ) {
var infoHtml = responses [ 0 ] ;
var downloadsHtml = responses [ 1 ] ;
elem . innerHTML = html + downloadsHtml + infoHtml ;
bindHomeScreenSettingsIcon ( elem , apiClient , user . Id , userSettings ) ;
if ( infoHtml ) {
bindAppInfoEvents ( elem ) ;
}
imageLoader . lazyChildren ( elem ) ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function getContinueWatchingFetchFn ( serverId ) {
2019-01-10 15:39:37 +03:00
return function ( ) {
var apiClient = connectionManager . getApiClient ( serverId ) ;
var screenWidth = dom . getWindowSize ( ) . innerWidth ;
var limit ;
if ( enableScrollX ( ) ) {
limit = 12 ;
} else {
limit = screenWidth >= 1920 ? 8 : ( screenWidth >= 1600 ? 8 : ( screenWidth >= 1200 ? 9 : 6 ) ) ;
limit = Math . min ( limit , 5 ) ;
}
2018-10-23 01:05:09 +03:00
var options = {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
Limit : limit ,
2019-01-10 15:39:37 +03:00
Recursive : true ,
2018-10-23 01:05:09 +03:00
Fields : "PrimaryImageAspectRatio,BasicSyncInfo" ,
ImageTypeLimit : 1 ,
EnableImageTypes : "Primary,Backdrop,Thumb" ,
2019-01-10 15:39:37 +03:00
EnableTotalRecordCount : false ,
MediaTypes : 'Video'
2018-10-23 01:05:09 +03:00
} ;
2019-01-10 15:39:37 +03:00
return apiClient . getResumableItems ( apiClient . getCurrentUserId ( ) , options ) ;
} ;
2018-10-23 01:05:09 +03:00
}
function getContinueWatchingItemsHtml ( items ) {
2019-01-10 15:39:37 +03:00
var cardLayout = false ;
2018-10-23 01:05:09 +03:00
return cardBuilder . getCardsHtml ( {
items : items ,
2019-01-10 15:39:37 +03:00
preferThumb : true ,
2018-10-23 01:05:09 +03:00
shape : getThumbShape ( ) ,
2019-01-10 15:39:37 +03:00
overlayText : false ,
showTitle : true ,
showParentTitle : true ,
lazy : true ,
showDetailsMenu : true ,
overlayPlayButton : true ,
context : 'home' ,
centerText : ! cardLayout ,
allowBottomPadding : false ,
cardLayout : cardLayout ,
showYear : true ,
2018-10-23 01:05:09 +03:00
lines : 2
2019-01-10 15:39:37 +03:00
} ) ;
2018-10-23 01:05:09 +03:00
}
function loadResumeVideo ( elem , apiClient , userId ) {
2019-01-10 15:39:37 +03:00
var html = '' ;
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize . translate ( 'sharedcomponents#HeaderContinueWatching' ) + '</h2>' ;
if ( enableScrollX ( ) ) {
html += '<div is="emby-scroller" data-mousewheel="false" data-centerfocus="true" class="padded-top-focusscale padded-bottom-focusscale"><div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x padded-left padded-right" data-monitor="videoplayback,markplayed">' ;
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-monitor="videoplayback,markplayed">' ;
}
if ( enableScrollX ( ) ) {
html += '</div>' ;
}
html += '</div>' ;
elem . classList . add ( 'hide' ) ;
elem . innerHTML = html ;
var itemsContainer = elem . querySelector ( '.itemsContainer' ) ;
itemsContainer . fetchData = getContinueWatchingFetchFn ( apiClient . serverId ( ) ) ;
itemsContainer . getItemsHtml = getContinueWatchingItemsHtml ;
itemsContainer . parentContainer = elem ;
2018-10-23 01:05:09 +03:00
}
function getContinueListeningFetchFn ( serverId ) {
2019-01-10 15:39:37 +03:00
return function ( ) {
var apiClient = connectionManager . getApiClient ( serverId ) ;
var screenWidth = dom . getWindowSize ( ) . innerWidth ;
var limit ;
if ( enableScrollX ( ) ) {
limit = 12 ;
} else {
limit = screenWidth >= 1920 ? 8 : ( screenWidth >= 1600 ? 8 : ( screenWidth >= 1200 ? 9 : 6 ) ) ;
limit = Math . min ( limit , 5 ) ;
}
2018-10-23 01:05:09 +03:00
var options = {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
Limit : limit ,
2019-01-10 15:39:37 +03:00
Recursive : true ,
2018-10-23 01:05:09 +03:00
Fields : "PrimaryImageAspectRatio,BasicSyncInfo" ,
ImageTypeLimit : 1 ,
EnableImageTypes : "Primary,Backdrop,Thumb" ,
2019-01-10 15:39:37 +03:00
EnableTotalRecordCount : false ,
MediaTypes : 'Audio'
2018-10-23 01:05:09 +03:00
} ;
2019-01-10 15:39:37 +03:00
return apiClient . getResumableItems ( apiClient . getCurrentUserId ( ) , options ) ;
} ;
2018-10-23 01:05:09 +03:00
}
function getContinueListeningItemsHtml ( items ) {
2019-01-10 15:39:37 +03:00
var cardLayout = false ;
2018-10-23 01:05:09 +03:00
return cardBuilder . getCardsHtml ( {
items : items ,
2019-01-10 15:39:37 +03:00
preferThumb : true ,
2018-10-23 01:05:09 +03:00
shape : getThumbShape ( ) ,
2019-01-10 15:39:37 +03:00
overlayText : false ,
showTitle : true ,
showParentTitle : true ,
lazy : true ,
showDetailsMenu : true ,
overlayPlayButton : true ,
context : 'home' ,
centerText : ! cardLayout ,
allowBottomPadding : false ,
cardLayout : cardLayout ,
showYear : true ,
2018-10-23 01:05:09 +03:00
lines : 2
2019-01-10 15:39:37 +03:00
} ) ;
2018-10-23 01:05:09 +03:00
}
function loadResumeAudio ( elem , apiClient , userId ) {
2019-01-10 15:39:37 +03:00
var html = '' ;
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize . translate ( 'sharedcomponents#HeaderContinueWatching' ) + '</h2>' ;
if ( enableScrollX ( ) ) {
html += '<div is="emby-scroller" data-mousewheel="false" data-centerfocus="true" class="padded-top-focusscale padded-bottom-focusscale"><div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x padded-left padded-right" data-monitor="audioplayback,markplayed">' ;
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-monitor="audioplayback,markplayed">' ;
}
if ( enableScrollX ( ) ) {
html += '</div>' ;
}
html += '</div>' ;
elem . classList . add ( 'hide' ) ;
elem . innerHTML = html ;
var itemsContainer = elem . querySelector ( '.itemsContainer' ) ;
itemsContainer . fetchData = getContinueListeningFetchFn ( apiClient . serverId ( ) ) ;
itemsContainer . getItemsHtml = getContinueListeningItemsHtml ;
itemsContainer . parentContainer = elem ;
2018-10-23 01:05:09 +03:00
}
function bindUnlockClick ( elem ) {
2019-01-10 15:39:37 +03:00
var btnUnlock = elem . querySelector ( '.btnUnlock' ) ;
if ( btnUnlock ) {
btnUnlock . addEventListener ( 'click' , function ( e ) {
registrationServices . validateFeature ( 'livetv' , {
viewOnly : true
} ) . then ( function ( ) {
dom . parentWithClass ( elem , 'homeSectionsContainer' ) . dispatchEvent ( new CustomEvent ( 'settingschange' , {
cancelable : false
} ) ) ;
} ) ;
} ) ;
}
2018-10-23 01:05:09 +03:00
}
function getOnNowFetchFn ( serverId ) {
2019-01-10 15:39:37 +03:00
return function ( ) {
2018-10-23 01:05:09 +03:00
var apiClient = connectionManager . getApiClient ( serverId ) ;
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
return apiClient . getLiveTvRecommendedPrograms ( {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
userId : apiClient . getCurrentUserId ( ) ,
2019-01-10 15:39:37 +03:00
IsAiring : true ,
2018-10-23 01:05:09 +03:00
limit : 24 ,
ImageTypeLimit : 1 ,
EnableImageTypes : "Primary,Thumb,Backdrop" ,
2019-01-10 15:39:37 +03:00
EnableTotalRecordCount : false ,
2018-10-23 01:05:09 +03:00
Fields : "ChannelInfo,PrimaryImageAspectRatio"
2019-01-10 15:39:37 +03:00
} ) ;
} ;
2018-10-23 01:05:09 +03:00
}
function getOnNowItemsHtml ( items ) {
2019-01-10 15:39:37 +03:00
var cardLayout = false ;
2018-10-23 01:05:09 +03:00
return cardBuilder . getCardsHtml ( {
items : items ,
2019-01-10 15:39:37 +03:00
preferThumb : 'auto' ,
inheritThumb : false ,
shape : ( enableScrollX ( ) ? 'autooverflow' : 'auto' ) ,
showParentTitleOrTitle : true ,
showTitle : true ,
centerText : true ,
coverImage : true ,
overlayText : false ,
2018-10-23 01:05:09 +03:00
allowBottomPadding : ! enableScrollX ( ) ,
2019-01-10 15:39:37 +03:00
showAirTime : true ,
showChannelName : false ,
showAirDateTime : false ,
showAirEndTime : true ,
2018-10-23 01:05:09 +03:00
defaultShape : getThumbShape ( ) ,
lines : 3 ,
2019-01-10 15:39:37 +03:00
overlayPlayButton : true
} ) ;
2018-10-23 01:05:09 +03:00
}
function loadOnNow ( elem , apiClient , user ) {
2019-01-10 15:39:37 +03:00
if ( ! user . Policy . EnableLiveTvAccess ) {
return Promise . resolve ( ) ;
}
2018-10-23 01:05:09 +03:00
var promises = [ ] ;
2019-01-10 15:39:37 +03:00
promises . push ( registrationServices . validateFeature ( 'livetv' ,
{
viewOnly : true ,
showDialog : false
} ) . then ( function ( ) {
return true ;
} , function ( ) {
return false ;
} ) ) ;
var userId = user . Id ;
promises . push ( apiClient . getLiveTvRecommendedPrograms ( {
2018-10-23 01:05:09 +03:00
userId : apiClient . getCurrentUserId ( ) ,
2019-01-10 15:39:37 +03:00
IsAiring : true ,
2018-10-23 01:05:09 +03:00
limit : 1 ,
ImageTypeLimit : 1 ,
EnableImageTypes : "Primary,Thumb,Backdrop" ,
2019-01-10 15:39:37 +03:00
EnableTotalRecordCount : false ,
2018-10-23 01:05:09 +03:00
Fields : "ChannelInfo,PrimaryImageAspectRatio"
2019-01-10 15:39:37 +03:00
} ) ) ;
return Promise . all ( promises ) . then ( function ( responses ) {
var registered = responses [ 0 ] ;
var result = responses [ 1 ] ;
var html = '' ;
2018-10-23 01:05:09 +03:00
if ( result . Items . length && registered ) {
2019-01-10 15:39:37 +03:00
elem . classList . remove ( 'padded-left' ) ;
elem . classList . remove ( 'padded-right' ) ;
elem . classList . remove ( 'padded-bottom' ) ;
elem . classList . remove ( 'verticalSection' ) ;
html += '<div class="verticalSection">' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">' ;
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize . translate ( 'sharedcomponents#LiveTV' ) + '</h2>' ;
html += '</div>' ;
if ( enableScrollX ( ) ) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-mousewheel="false" data-centerfocus="true" data-scrollbuttons="false">' ;
html += '<div class="scrollSlider padded-left padded-right padded-top padded-bottom focuscontainer-x">' ;
}
else {
html += '<div class="padded-left padded-right padded-top focuscontainer-x">' ;
}
html += '<a style="margin-left:.8em;margin-right:0;" is="emby-linkbutton" href="' + appRouter . getRouteUrl ( 'livetv' , {
2018-10-23 01:05:09 +03:00
serverId : apiClient . serverId ( )
2019-01-10 15:39:37 +03:00
} ) + '" class="raised"><span>' + globalize . translate ( 'sharedcomponents#Programs' ) + '</span></a>' ;
html += '<a style="margin-left:.5em;margin-right:0;" is="emby-linkbutton" href="' + appRouter . getRouteUrl ( 'livetv' , {
2018-10-23 01:05:09 +03:00
serverId : apiClient . serverId ( ) ,
2019-01-10 15:39:37 +03:00
section : 'guide'
} ) + '" class="raised"><span>' + globalize . translate ( 'sharedcomponents#Guide' ) + '</span></a>' ;
html += '<a style="margin-left:.5em;margin-right:0;" is="emby-linkbutton" href="' + appRouter . getRouteUrl ( 'recordedtv' , {
2018-10-23 01:05:09 +03:00
serverId : apiClient . serverId ( )
2019-01-10 15:39:37 +03:00
} ) + '" class="raised"><span>' + globalize . translate ( 'sharedcomponents#Recordings' ) + '</span></a>' ;
html += '<a style="margin-left:.5em;margin-right:0;" is="emby-linkbutton" href="' + appRouter . getRouteUrl ( 'livetv' , {
2018-10-23 01:05:09 +03:00
serverId : apiClient . serverId ( ) ,
2019-01-10 15:39:37 +03:00
section : 'dvrschedule'
} ) + '" class="raised"><span>' + globalize . translate ( 'sharedcomponents#Schedule' ) + '</span></a>' ;
html += '</div>' ;
if ( enableScrollX ( ) ) {
html += '</div>' ;
}
html += '</div>' ;
html += '</div>' ;
html += '<div class="verticalSection">' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">' ;
if ( ! layoutManager . tv ) {
html += '<a is="emby-linkbutton" href="' + appRouter . getRouteUrl ( 'livetv' , {
serverId : apiClient . serverId ( ) ,
section : 'onnow'
} ) + '" class="more button-flat button-flat-mini sectionTitleTextButton">' ;
html += '<h2 class="sectionTitle sectionTitle-cards">' ;
html += globalize . translate ( 'sharedcomponents#HeaderOnNow' ) ;
html += '</h2>' ;
html += '<i class="md-icon"></i>' ;
html += '</a>' ;
} else {
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize . translate ( 'sharedcomponents#HeaderOnNow' ) + '</h2>' ;
}
html += '</div>' ;
if ( enableScrollX ( ) ) {
html += '<div is="emby-scroller" data-mousewheel="false" data-centerfocus="true" class="padded-top-focusscale padded-bottom-focusscale"><div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x padded-left padded-right" data-refreshinterval="300000">' ;
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-refreshinterval="300000">' ;
}
if ( enableScrollX ( ) ) {
html += '</div>' ;
}
html += '</div>' ;
html += '</div>' ;
elem . innerHTML = html ;
var itemsContainer = elem . querySelector ( '.itemsContainer' ) ;
itemsContainer . parentContainer = elem ;
itemsContainer . fetchData = getOnNowFetchFn ( apiClient . serverId ( ) ) ;
itemsContainer . getItemsHtml = getOnNowItemsHtml ;
} else if ( result . Items . length && ! registered ) {
elem . classList . add ( 'padded-left' ) ;
elem . classList . add ( 'padded-right' ) ;
elem . classList . add ( 'padded-bottom' ) ;
html += '<h2 class="sectionTitle">' + globalize . translate ( 'sharedcomponents#LiveTvRequiresUnlock' ) + '</h2>' ;
html += '<button is="emby-button" type="button" class="raised button-submit block btnUnlock">' ;
html += '<span>' + globalize . translate ( 'sharedcomponents#HeaderBecomeProjectSupporter' ) + '</span>' ;
html += '</button>' ;
elem . innerHTML = html ;
}
bindUnlockClick ( elem ) ;
} ) ;
2018-10-23 01:05:09 +03:00
}
function getNextUpFetchFn ( serverId ) {
2019-01-10 15:39:37 +03:00
return function ( ) {
2018-10-23 01:05:09 +03:00
var apiClient = connectionManager . getApiClient ( serverId ) ;
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
return apiClient . getNextUpEpisodes ( {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
Limit : enableScrollX ( ) ? 24 : 15 ,
Fields : "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo" ,
UserId : apiClient . getCurrentUserId ( ) ,
ImageTypeLimit : 1 ,
EnableImageTypes : "Primary,Backdrop,Banner,Thumb" ,
2019-01-10 15:39:37 +03:00
EnableTotalRecordCount : false
} ) ;
} ;
2018-10-23 01:05:09 +03:00
}
function getNextUpItemsHtml ( items ) {
2019-01-10 15:39:37 +03:00
var cardLayout = false ;
2018-10-23 01:05:09 +03:00
return cardBuilder . getCardsHtml ( {
items : items ,
2019-01-10 15:39:37 +03:00
preferThumb : true ,
2018-10-23 01:05:09 +03:00
shape : getThumbShape ( ) ,
2019-01-10 15:39:37 +03:00
overlayText : false ,
showTitle : true ,
showParentTitle : true ,
lazy : true ,
overlayPlayButton : true ,
context : 'home' ,
centerText : ! cardLayout ,
2018-10-23 01:05:09 +03:00
allowBottomPadding : ! enableScrollX ( ) ,
2019-01-10 15:39:37 +03:00
cardLayout : cardLayout
} ) ;
2018-10-23 01:05:09 +03:00
}
function loadNextUp ( elem , apiClient , userId ) {
2019-01-10 15:39:37 +03:00
var html = '' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">' ;
if ( ! layoutManager . tv ) {
html += '<a is="emby-linkbutton" href="' + appRouter . getRouteUrl ( 'nextup' , {
serverId : apiClient . serverId ( )
} ) + '" class="button-flat button-flat-mini sectionTitleTextButton">' ;
html += '<h2 class="sectionTitle sectionTitle-cards">' ;
html += globalize . translate ( 'sharedcomponents#HeaderNextUp' ) ;
html += '</h2>' ;
html += '<i class="md-icon"></i>' ;
html += '</a>' ;
} else {
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize . translate ( 'sharedcomponents#HeaderNextUp' ) + '</h2>' ;
}
html += '</div>' ;
if ( enableScrollX ( ) ) {
html += '<div is="emby-scroller" data-mousewheel="false" data-centerfocus="true" class="padded-top-focusscale padded-bottom-focusscale"><div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x padded-left padded-right" data-monitor="videoplayback,markplayed">' ;
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-monitor="videoplayback,markplayed">' ;
}
if ( enableScrollX ( ) ) {
html += '</div>' ;
}
html += '</div>' ;
elem . classList . add ( 'hide' ) ;
elem . innerHTML = html ;
var itemsContainer = elem . querySelector ( '.itemsContainer' ) ;
itemsContainer . fetchData = getNextUpFetchFn ( apiClient . serverId ( ) ) ;
itemsContainer . getItemsHtml = getNextUpItemsHtml ;
itemsContainer . parentContainer = elem ;
2018-10-23 01:05:09 +03:00
}
function getLatestRecordingsFetchFn ( serverId , activeRecordingsOnly ) {
2019-01-10 15:39:37 +03:00
return function ( ) {
2018-10-23 01:05:09 +03:00
var apiClient = connectionManager . getApiClient ( serverId ) ;
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
return apiClient . getLiveTvRecordings ( {
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
userId : apiClient . getCurrentUserId ( ) ,
Limit : enableScrollX ( ) ? 12 : 5 ,
Fields : "PrimaryImageAspectRatio,BasicSyncInfo" ,
2019-01-10 15:39:37 +03:00
EnableTotalRecordCount : false ,
IsLibraryItem : activeRecordingsOnly ? null : false ,
IsInProgress : activeRecordingsOnly ? true : null
} ) ;
} ;
2018-10-23 01:05:09 +03:00
}
function getLatestRecordingItemsHtml ( activeRecordingsOnly ) {
2019-01-10 15:39:37 +03:00
return function ( items ) {
var cardLayout = false ;
2018-10-23 01:05:09 +03:00
return cardBuilder . getCardsHtml ( {
items : items ,
2019-01-10 15:39:37 +03:00
shape : enableScrollX ( ) ? 'autooverflow' : 'auto' ,
showTitle : true ,
showParentTitle : true ,
coverImage : true ,
lazy : true ,
showDetailsMenu : true ,
centerText : true ,
overlayText : false ,
showYear : true ,
2018-10-23 01:05:09 +03:00
lines : 2 ,
overlayPlayButton : ! activeRecordingsOnly ,
allowBottomPadding : ! enableScrollX ( ) ,
2019-01-10 15:39:37 +03:00
preferThumb : true ,
cardLayout : false ,
2018-10-23 01:05:09 +03:00
overlayMoreButton : activeRecordingsOnly ,
2019-01-10 15:39:37 +03:00
action : activeRecordingsOnly ? 'none' : null ,
2018-10-23 01:05:09 +03:00
centerPlayButton : activeRecordingsOnly
2019-01-10 15:39:37 +03:00
} ) ;
} ;
2018-10-23 01:05:09 +03:00
}
function loadLatestLiveTvRecordings ( elem , activeRecordingsOnly , apiClient , userId ) {
2019-01-10 15:39:37 +03:00
var title = activeRecordingsOnly ?
globalize . translate ( 'sharedcomponents#HeaderActiveRecordings' ) :
globalize . translate ( 'sharedcomponents#HeaderLatestRecordings' ) ;
var html = '' ;
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">' ;
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + '</h2>' ;
if ( ! layoutManager . tv ) {
//html += '<a href="livetv.html?tab=3" class="clearLink" style="margin-left:2em;"><button is="emby-button" type="button" class="raised more mini"><span>' + globalize.translate('sharedcomponents#More') + '</span></button></a>';
//html += '<button data-href="" type="button" is="emby-button" class="raised raised-mini sectionTitleButton btnMore">';
//html += '<span>' + globalize.translate('sharedcomponents#More') + '</span>';
//html += '</button>';
}
html += '</div>' ;
if ( enableScrollX ( ) ) {
html += '<div is="emby-scroller" data-mousewheel="false" data-centerfocus="true" class="padded-top-focusscale padded-bottom-focusscale"><div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x padded-left padded-right">' ;
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x">' ;
}
if ( enableScrollX ( ) ) {
html += '</div>' ;
}
html += '</div>' ;
elem . classList . add ( 'hide' ) ;
elem . innerHTML = html ;
var itemsContainer = elem . querySelector ( '.itemsContainer' ) ;
itemsContainer . fetchData = getLatestRecordingsFetchFn ( apiClient . serverId ( ) , activeRecordingsOnly ) ;
itemsContainer . getItemsHtml = getLatestRecordingItemsHtml ( activeRecordingsOnly ) ;
itemsContainer . parentContainer = elem ;
2018-10-23 01:05:09 +03:00
}
2019-01-10 15:39:37 +03:00
2018-10-23 01:05:09 +03:00
return {
loadLibraryTiles : loadLibraryTiles ,
getDefaultSection : getDefaultSection ,
loadSections : loadSections ,
destroySections : destroySections ,
pause : pause ,
resume : resume
2019-01-10 15:39:37 +03:00
} ;
} ) ;