2013-02-20 18:33:05 -07:00
var MediaLibraryPage = {
onPageShow : function ( ) {
2013-12-25 20:44:26 -07:00
var page = this ;
2013-02-20 18:33:05 -07:00
MediaLibraryPage . lastVirtualFolderName = "" ;
2013-07-06 10:20:53 -07:00
2014-02-20 22:04:11 -07:00
MediaLibraryPage . reloadLibrary ( page ) ;
2013-12-25 20:44:26 -07:00
} ,
2013-04-16 21:21:24 -07:00
reloadLibrary : function ( page ) {
2013-02-20 18:33:05 -07:00
Dashboard . showLoadingMsg ( ) ;
2014-02-20 22:04:11 -07:00
ApiClient . getVirtualFolders ( ) . done ( function ( result ) {
MediaLibraryPage . reloadVirtualFolders ( page , result ) ;
} ) ;
2013-02-20 18:33:05 -07:00
2014-02-20 22:04:11 -07:00
$ ( '#divMediaLibrary' , page ) . show ( ) ;
Dashboard . setPageTitle ( "Media Library" ) ;
2013-02-20 18:33:05 -07:00
} ,
2013-09-05 10:05:39 -07:00
shouldRefreshLibraryAfterChanges : function ( ) {
2013-12-01 13:17:40 -07:00
2013-09-05 10:05:39 -07:00
return $ ( $ . mobile . activePage ) . is ( '#mediaLibraryPage' ) ;
} ,
2013-04-16 21:21:24 -07:00
reloadVirtualFolders : function ( page , virtualFolders ) {
2013-02-20 18:33:05 -07:00
if ( virtualFolders ) {
MediaLibraryPage . virtualFolders = virtualFolders ;
} else {
virtualFolders = MediaLibraryPage . virtualFolders ;
}
var html = '' ;
2014-01-30 14:23:54 -07:00
var addPathMappingInfo = $ ( page ) . is ( '#mediaLibraryPage' ) ;
2013-02-20 18:33:05 -07:00
for ( var i = 0 , length = virtualFolders . length ; i < length ; i ++ ) {
var virtualFolder = virtualFolders [ i ] ;
2013-07-06 10:20:53 -07:00
2013-02-20 18:33:05 -07:00
var isCollapsed = MediaLibraryPage . lastVirtualFolderName != virtualFolder . Name ;
2014-01-30 14:23:54 -07:00
html += MediaLibraryPage . getVirtualFolderHtml ( virtualFolder , isCollapsed , i , addPathMappingInfo ) ;
2013-02-20 18:33:05 -07:00
}
$ ( '#divVirtualFolders' , page ) . html ( html ) . trigger ( 'create' ) ;
Dashboard . hideLoadingMsg ( ) ;
} ,
2013-12-01 13:17:40 -07:00
changeCollectionType : function ( ) {
2013-12-26 19:23:57 -07:00
Dashboard . alert ( {
2013-12-27 19:46:32 -07:00
message : "To change the folder type, please remove and rebuild the collection with the new type." ,
title : "Change Folder Type"
2013-12-26 19:23:57 -07:00
} ) ;
2013-12-01 13:17:40 -07:00
} ,
2014-01-30 14:23:54 -07:00
getVirtualFolderHtml : function ( virtualFolder , isCollapsed , index , addPathMappingInfo ) {
2013-02-20 18:33:05 -07:00
isCollapsed = isCollapsed ? "true" : "false" ;
2013-12-24 11:37:29 -07:00
var html = '<div class="collapsibleVirtualFolder" data-mini="true" data-role="collapsible" data-collapsed="' + isCollapsed + '">' ;
2013-02-20 18:33:05 -07:00
html += '<h3>' + virtualFolder . Name + '</h3>' ;
2013-09-05 10:05:39 -07:00
var typeName = MediaLibraryPage . getCollectionTypeOptions ( ) . filter ( function ( t ) {
2013-07-12 12:56:40 -07:00
return t . value == virtualFolder . CollectionType ;
} ) [ 0 ] ;
2014-04-19 10:43:12 -07:00
typeName = typeName ? typeName . name : "Mixed movies & tv" ;
2013-07-12 12:56:40 -07:00
2013-12-27 19:46:32 -07:00
html += '<p style="padding-left:.5em;">Folder type: <b>' + typeName + '</b></p>' ;
2013-07-12 12:56:40 -07:00
2013-02-20 18:33:05 -07:00
html += '<ul class="mediaFolderLocations" data-inset="true" data-role="listview" data-split-icon="minus">' ;
html += '<li data-role="list-divider" class="mediaLocationsHeader">Media Locations' ;
2013-12-24 11:37:29 -07:00
html += '<button type="button" data-icon="plus" data-mini="true" data-inline="true" data-iconpos="notext" onclick="MediaLibraryPage.addMediaLocation(' + index + ');"></button>' ;
2013-02-20 18:33:05 -07:00
html += '</li>' ;
for ( var i = 0 , length = virtualFolder . Locations . length ; i < length ; i ++ ) {
var location = virtualFolder . Locations [ i ] ;
html += '<li>' ;
2014-02-20 22:04:11 -07:00
html += '<a style="font-size:14px;" class="lnkMediaLocation" href="#">' + location + '</a>' ;
2013-02-20 18:33:05 -07:00
html += '<a href="#" data-index="' + i + '" data-folderindex="' + index + '" onclick="MediaLibraryPage.deleteMediaLocation(this);"></a>' ;
html += '</li>' ;
}
html += '</ul>' ;
2014-01-30 14:23:54 -07:00
if ( addPathMappingInfo ) {
2014-02-20 22:04:11 -07:00
html += '<p style="margin:1.5em 0;">Optional: <a href="librarypathmapping.html">Path substitution</a> can map server paths to network shares that clients can access for direct playback.</p>' ;
2014-01-30 14:23:54 -07:00
}
2014-01-29 22:20:18 -07:00
2013-02-20 18:33:05 -07:00
html += '<p>' ;
2013-12-01 13:17:40 -07:00
html += '<button type="button" data-inline="true" data-icon="minus" data-folderindex="' + index + '" onclick="MediaLibraryPage.deleteVirtualFolder(this);" data-mini="true">Remove</button>' ;
2013-12-24 11:37:29 -07:00
html += '<button type="button" data-inline="true" data-icon="edit" data-folderindex="' + index + '" onclick="MediaLibraryPage.renameVirtualFolder(this);" data-mini="true">Rename</button>' ;
html += '<button type="button" data-inline="true" data-icon="edit" data-folderindex="' + index + '" onclick="MediaLibraryPage.changeCollectionType(this);" data-mini="true">Change type</button>' ;
2013-02-20 18:33:05 -07:00
html += '</p>' ;
html += '</div>' ;
return html ;
} ,
addVirtualFolder : function ( ) {
2013-09-04 12:16:41 -07:00
$ ( '.collectionTypeFieldDescription' ) . show ( ) ;
2013-12-27 19:46:32 -07:00
MediaLibraryPage . getTextValue ( "Add Media Folder" , "Name (Movies, Music, TV, etc):" , "" , true , function ( name , type ) {
2013-02-20 18:33:05 -07:00
MediaLibraryPage . lastVirtualFolderName = name ;
2013-07-06 10:20:53 -07:00
2013-09-05 10:05:39 -07:00
var refreshAfterChange = MediaLibraryPage . shouldRefreshLibraryAfterChanges ( ) ;
2014-02-20 22:04:11 -07:00
ApiClient . addVirtualFolder ( name , type , refreshAfterChange ) . done ( MediaLibraryPage . processOperationResult ) ;
2013-02-20 18:33:05 -07:00
} ) ;
} ,
addMediaLocation : function ( virtualFolderIndex ) {
MediaLibraryPage . selectDirectory ( function ( path ) {
if ( path ) {
var virtualFolder = MediaLibraryPage . virtualFolders [ virtualFolderIndex ] ;
MediaLibraryPage . lastVirtualFolderName = virtualFolder . Name ;
2013-09-05 10:05:39 -07:00
var refreshAfterChange = MediaLibraryPage . shouldRefreshLibraryAfterChanges ( ) ;
2014-02-20 22:04:11 -07:00
ApiClient . addMediaPath ( virtualFolder . Name , path , refreshAfterChange ) . done ( MediaLibraryPage . processOperationResult ) ;
2013-02-20 18:33:05 -07:00
}
} ) ;
} ,
selectDirectory : function ( callback ) {
2013-07-06 10:20:53 -07:00
var picker = new DirectoryBrowser ( $ . mobile . activePage ) ;
picker . show ( { callback : callback } ) ;
MediaLibraryPage . directoryPicker = picker ;
2013-02-20 18:33:05 -07:00
} ,
2013-07-12 12:56:40 -07:00
getTextValue : function ( header , label , initialValue , showCollectionType , callback ) {
2013-02-20 18:33:05 -07:00
var page = $ . mobile . activePage ;
var popup = $ ( '#popupEnterText' , page ) ;
$ ( 'h3' , popup ) . html ( header ) ;
2013-07-12 12:56:40 -07:00
$ ( '#lblValue' , popup ) . html ( label ) ;
2013-02-20 18:33:05 -07:00
$ ( '#txtValue' , popup ) . val ( initialValue ) ;
2013-07-12 12:56:40 -07:00
if ( showCollectionType ) {
$ ( '#fldCollectionType' , popup ) . show ( ) ;
2013-10-18 12:47:57 -07:00
$ ( '#selectCollectionType' , popup ) . attr ( 'required' , 'required' ) . selectmenu ( 'refresh' ) ;
2013-07-12 12:56:40 -07:00
} else {
$ ( '#fldCollectionType' , popup ) . hide ( ) ;
2013-10-18 12:47:57 -07:00
$ ( '#selectCollectionType' , popup ) . removeAttr ( 'required' ) . selectmenu ( 'refresh' ) ;
2013-07-12 12:56:40 -07:00
}
2013-10-18 12:47:57 -07:00
$ ( '#selectCollectionType' , popup ) . html ( MediaLibraryPage . getCollectionTypeOptionsHtml ( ) ) . val ( '' ) . selectmenu ( 'refresh' ) ;
2013-07-12 12:56:40 -07:00
2013-07-06 10:20:53 -07:00
popup . on ( "popupafteropen" , function ( ) {
2013-03-28 20:50:46 -07:00
$ ( '#textEntryForm input:first' , this ) . focus ( ) ;
} ) . on ( "popupafterclose" , function ( ) {
2013-02-20 18:33:05 -07:00
$ ( this ) . off ( "popupafterclose" ) . off ( "click" ) ;
$ ( '#textEntryForm' , this ) . off ( "submit" ) ;
2013-03-28 20:50:46 -07:00
} ) . popup ( "open" ) ;
2013-02-20 18:33:05 -07:00
$ ( '#textEntryForm' , popup ) . on ( 'submit' , function ( ) {
if ( callback ) {
2013-07-12 12:56:40 -07:00
if ( showCollectionType ) {
2013-10-18 12:47:57 -07:00
var collectionType = $ ( '#selectCollectionType' , popup ) . val ( ) ;
2013-12-01 13:17:40 -07:00
2013-10-18 12:47:57 -07:00
// The server expects an empty value for mixed
if ( collectionType == 'mixed' ) {
collectionType = '' ;
}
callback ( $ ( '#txtValue' , popup ) . val ( ) , collectionType ) ;
2013-07-12 12:56:40 -07:00
} else {
callback ( $ ( '#txtValue' , popup ) . val ( ) ) ;
}
2013-02-20 18:33:05 -07:00
}
return false ;
} ) ;
} ,
2013-07-12 12:56:40 -07:00
getCollectionTypeOptionsHtml : function ( ) {
2013-12-01 13:17:40 -07:00
return MediaLibraryPage . getCollectionTypeOptions ( ) . filter ( function ( i ) {
2013-10-26 15:01:21 -07:00
return i . isSelectable !== false ;
} ) . map ( function ( i ) {
2013-07-12 12:56:40 -07:00
return '<option value="' + i . value + '">' + i . name + '</option>' ;
} ) . join ( "" ) ;
} ,
getCollectionTypeOptions : function ( ) {
return [
2013-10-18 12:47:57 -07:00
{ name : "" , value : "" } ,
{ name : "Movies" , value : "movies" } ,
{ name : "Music" , value : "music" } ,
{ name : "TV shows" , value : "tvshows" } ,
2013-09-02 16:17:10 -07:00
{ name : "Books*" , value : "books" } ,
2014-01-03 13:43:44 -07:00
{ name : "Collections" , value : "boxsets" } ,
2013-07-20 13:37:00 -07:00
{ name : "Games*" , value : "games" } ,
2013-07-12 12:56:40 -07:00
{ name : "Home videos" , value : "homevideos" } ,
{ name : "Music videos" , value : "musicvideos" } ,
2014-02-12 22:11:54 -07:00
{ name : "Photos" , value : "photos" } ,
2013-07-12 12:56:40 -07:00
{ name : "Trailers" , value : "trailers" } ,
2013-10-18 12:47:57 -07:00
{ name : "Adult videos" , value : "adultvideos" } ,
2014-04-03 15:50:04 -07:00
{ name : "Mixed movies & tv" , value : "mixed" }
2013-07-12 12:56:40 -07:00
] ;
} ,
2013-02-20 18:33:05 -07:00
renameVirtualFolder : function ( button ) {
var folderIndex = button . getAttribute ( 'data-folderindex' ) ;
var virtualFolder = MediaLibraryPage . virtualFolders [ folderIndex ] ;
MediaLibraryPage . lastVirtualFolderName = virtualFolder . Name ;
2013-07-06 10:20:53 -07:00
2013-09-04 12:16:41 -07:00
$ ( '.collectionTypeFieldDescription' ) . hide ( ) ;
2014-03-31 14:04:22 -07:00
MediaLibraryPage . getTextValue ( "Rename Media Folder" , "New name:" , virtualFolder . Name , false , function ( newName ) {
2013-02-20 18:33:05 -07:00
if ( virtualFolder . Name != newName ) {
2013-09-05 10:05:39 -07:00
var refreshAfterChange = MediaLibraryPage . shouldRefreshLibraryAfterChanges ( ) ;
2014-02-20 22:04:11 -07:00
ApiClient . renameVirtualFolder ( virtualFolder . Name , newName , refreshAfterChange ) . done ( MediaLibraryPage . processOperationResult ) ;
2013-02-20 18:33:05 -07:00
}
} ) ;
} ,
deleteVirtualFolder : function ( button ) {
var folderIndex = button . getAttribute ( 'data-folderindex' ) ;
var virtualFolder = MediaLibraryPage . virtualFolders [ folderIndex ] ;
var parent = $ ( button ) . parents ( '.collapsibleVirtualFolder' ) ;
2013-07-06 10:20:53 -07:00
2013-02-20 18:33:05 -07:00
var locations = $ ( '.lnkMediaLocation' , parent ) . map ( function ( ) {
return this . innerHTML ;
} ) . get ( ) ;
var msg = "Are you sure you wish to remove " + virtualFolder . Name + "?" ;
2013-07-06 10:20:53 -07:00
2013-02-20 18:33:05 -07:00
if ( locations . length ) {
msg += "<br/><br/>The following media locations will be removed from your library:<br/><br/>" ;
msg += locations . join ( "<br/>" ) ;
}
2013-07-06 10:20:53 -07:00
2013-02-20 18:33:05 -07:00
MediaLibraryPage . lastVirtualFolderName = virtualFolder . Name ;
2013-07-06 10:20:53 -07:00
2013-02-20 18:33:05 -07:00
Dashboard . confirm ( msg , "Remove Media Folder" , function ( confirmResult ) {
if ( confirmResult ) {
2013-09-05 10:05:39 -07:00
var refreshAfterChange = MediaLibraryPage . shouldRefreshLibraryAfterChanges ( ) ;
2014-02-20 22:04:11 -07:00
ApiClient . removeVirtualFolder ( virtualFolder . Name , refreshAfterChange ) . done ( MediaLibraryPage . processOperationResult ) ;
2013-02-20 18:33:05 -07:00
}
} ) ;
} ,
deleteMediaLocation : function ( button ) {
var folderIndex = button . getAttribute ( 'data-folderindex' ) ;
var index = parseInt ( button . getAttribute ( 'data-index' ) ) ;
var virtualFolder = MediaLibraryPage . virtualFolders [ folderIndex ] ;
MediaLibraryPage . lastVirtualFolderName = virtualFolder . Name ;
var location = virtualFolder . Locations [ index ] ;
2014-05-30 12:23:56 -07:00
Dashboard . confirm ( "Are you sure you wish to remove this location?" , "Remove Media Location" , function ( confirmResult ) {
2013-02-20 18:33:05 -07:00
if ( confirmResult ) {
2013-09-05 10:05:39 -07:00
var refreshAfterChange = MediaLibraryPage . shouldRefreshLibraryAfterChanges ( ) ;
2014-02-20 22:04:11 -07:00
ApiClient . removeMediaPath ( virtualFolder . Name , location , refreshAfterChange ) . done ( MediaLibraryPage . processOperationResult ) ;
2013-02-20 18:33:05 -07:00
}
} ) ;
} ,
processOperationResult : function ( result ) {
Dashboard . hideLoadingMsg ( ) ;
var page = $ . mobile . activePage ;
$ ( '#popupEnterText' , page ) . popup ( "close" ) ;
2013-07-12 12:56:40 -07:00
2013-07-06 10:20:53 -07:00
if ( MediaLibraryPage . directoryPicker ) {
MediaLibraryPage . directoryPicker . close ( ) ;
MediaLibraryPage . directoryPicker = null ;
}
2013-04-16 21:21:24 -07:00
MediaLibraryPage . reloadLibrary ( page ) ;
2013-02-20 18:33:05 -07:00
}
} ;
2014-03-16 12:39:58 -07:00
$ ( document ) . on ( 'pageshow' , ".mediaLibraryPage" , MediaLibraryPage . onPageShow ) ;
( function ( $ , document , window ) {
function pollTasks ( page ) {
ApiClient . getScheduledTasks ( ) . done ( function ( tasks ) {
updateTasks ( page , tasks ) ;
} ) ;
}
function updateTasks ( page , tasks ) {
$ ( '.refreshLibraryPanel' , page ) . removeClass ( 'hide' ) ;
var task = tasks . filter ( function ( t ) {
return t . Name == 'Scan media library' ;
} ) [ 0 ] ;
$ ( '.btnRefresh' , page ) . buttonEnabled ( task . State == 'Idle' ) . attr ( 'data-taskid' , task . Id ) ;
var progress = ( task . CurrentProgressPercentage || 0 ) . toFixed ( 1 ) ;
2014-03-16 15:08:23 -07:00
var progressElem = $ ( '.refreshProgress' , page ) . val ( progress ) ;
if ( task . State == 'Running' ) {
progressElem . show ( ) ;
} else {
progressElem . hide ( ) ;
}
2014-03-16 12:39:58 -07:00
var lastResult = task . LastExecutionResult ? task . LastExecutionResult . Status : '' ;
if ( lastResult == "Failed" ) {
$ ( '.lastRefreshResult' , page ) . html ( '<span style="color:#FF0000;">(failed)</span>' ) ;
}
else if ( lastResult == "Cancelled" ) {
$ ( '.lastRefreshResult' , page ) . html ( '<span style="color:#0026FF;">(cancelled)</span>' ) ;
}
else if ( lastResult == "Aborted" ) {
$ ( '.lastRefreshResult' , page ) . html ( '<span style="color:#FF0000;">(Aborted by server shutdown)</span>' ) ;
} else {
$ ( '.lastRefreshResult' , page ) . html ( lastResult ) ;
}
}
function onWebSocketMessage ( e , msg ) {
if ( msg . MessageType == "ScheduledTasksInfo" ) {
var tasks = msg . Data ;
var page = $ . mobile . activePage ;
updateTasks ( page , tasks ) ;
}
}
$ ( document ) . on ( 'pageinit' , "#mediaLibraryPage" , function ( ) {
var page = this ;
$ ( '.btnRefresh' , page ) . on ( 'click' , function ( ) {
var button = this ;
var id = button . getAttribute ( 'data-taskid' ) ;
ApiClient . startScheduledTask ( id ) . done ( function ( ) {
pollTasks ( page ) ;
} ) ;
} ) ;
} ) . on ( 'pageshow' , "#mediaLibraryPage" , function ( ) {
var page = this ;
$ ( '.refreshLibraryPanel' , page ) . addClass ( 'hide' ) ;
pollTasks ( page ) ;
if ( ApiClient . isWebSocketOpen ( ) ) {
2014-05-10 10:28:03 -07:00
ApiClient . sendWebSocketMessage ( "ScheduledTasksInfoStart" , "1000,1000" ) ;
2014-03-16 12:39:58 -07:00
}
$ ( ApiClient ) . on ( "websocketmessage" , onWebSocketMessage ) . on ( 'websocketopen' , function ( ) {
if ( ApiClient . isWebSocketOpen ( ) ) {
2014-05-10 10:28:03 -07:00
ApiClient . sendWebSocketMessage ( "ScheduledTasksInfoStart" , "1000,1000" ) ;
2014-03-16 12:39:58 -07:00
}
} ) ;
} ) . on ( 'pagehide' , "#mediaLibraryPage" , function ( ) {
var page = this ;
if ( ApiClient . isWebSocketOpen ( ) ) {
ApiClient . sendWebSocketMessage ( "ScheduledTasksInfoStop" ) ;
}
$ ( ApiClient ) . off ( "websocketmessage" , onWebSocketMessage ) ;
} ) ;
} ) ( jQuery , document , window ) ;