Browse Source

consolidate slideout panels

Luke Pulverenti 10 years ago
parent
commit
4e04d31c7d
34 changed files with 171 additions and 135 deletions
  1. 6 6
      MediaBrowser.Api/BaseApiService.cs
  2. 2 2
      MediaBrowser.Api/DisplayPreferencesService.cs
  3. 3 3
      MediaBrowser.Api/GamesService.cs
  4. 14 14
      MediaBrowser.Api/Library/LibraryService.cs
  5. 8 8
      MediaBrowser.Api/Movies/CollectionService.cs
  6. 4 4
      MediaBrowser.Api/Movies/MoviesService.cs
  7. 2 2
      MediaBrowser.Api/Movies/TrailersService.cs
  8. 7 7
      MediaBrowser.Api/Music/InstantMixService.cs
  9. 7 5
      MediaBrowser.Api/PluginService.cs
  10. 4 5
      MediaBrowser.Api/Reports/ReportRequests.cs
  11. 1 1
      MediaBrowser.Api/Reports/ReportsService.cs
  12. 6 6
      MediaBrowser.Api/Session/SessionsService.cs
  13. 3 3
      MediaBrowser.Api/SimilarItemsHelper.cs
  14. 5 5
      MediaBrowser.Api/TvShowsService.cs
  15. 3 3
      MediaBrowser.Api/UserLibrary/ArtistsService.cs
  16. 4 4
      MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
  17. 3 3
      MediaBrowser.Api/UserLibrary/GameGenresService.cs
  18. 3 3
      MediaBrowser.Api/UserLibrary/GenresService.cs
  19. 2 2
      MediaBrowser.Api/UserLibrary/ItemsService.cs
  20. 3 3
      MediaBrowser.Api/UserLibrary/MusicGenresService.cs
  21. 3 3
      MediaBrowser.Api/UserLibrary/PersonsService.cs
  22. 5 5
      MediaBrowser.Api/UserLibrary/PlaystateService.cs
  23. 3 3
      MediaBrowser.Api/UserLibrary/StudiosService.cs
  24. 11 13
      MediaBrowser.Api/UserLibrary/UserLibraryService.cs
  25. 3 3
      MediaBrowser.Api/UserLibrary/YearsService.cs
  26. 3 3
      MediaBrowser.Api/VideosService.cs
  27. 8 0
      MediaBrowser.Controller/Library/IUserDataManager.cs
  28. 3 3
      MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs
  29. 2 2
      MediaBrowser.Controller/Session/ISessionManager.cs
  30. 6 2
      MediaBrowser.Server.Implementations/Library/UserDataManager.cs
  31. 5 2
      MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
  32. 10 0
      MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs
  33. 7 7
      MediaBrowser.Server.Implementations/Session/SessionManager.cs
  34. 12 0
      MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

+ 6 - 6
MediaBrowser.Api/BaseApiService.cs

@@ -198,15 +198,15 @@ namespace MediaBrowser.Api
             return libraryManager.GetPerson(DeSlugPersonName(name, libraryManager));
         }
 
-        protected IList<BaseItem> GetAllLibraryItems(Guid? userId, IUserManager userManager, ILibraryManager libraryManager, string parentId, Func<BaseItem,bool> filter)
+        protected IList<BaseItem> GetAllLibraryItems(string userId, IUserManager userManager, ILibraryManager libraryManager, string parentId, Func<BaseItem,bool> filter)
         {
             if (!string.IsNullOrEmpty(parentId))
             {
                 var folder = (Folder)libraryManager.GetItemById(new Guid(parentId));
 
-                if (userId.HasValue)
+                if (!string.IsNullOrWhiteSpace(userId))
                 {
-                    var user = userManager.GetUserById(userId.Value);
+                    var user = userManager.GetUserById(userId);
 
                     if (user == null)
                     {
@@ -221,9 +221,9 @@ namespace MediaBrowser.Api
                 return folder
                     .GetRecursiveChildren(filter);
             }
-            if (userId.HasValue)
+            if (!string.IsNullOrWhiteSpace(userId))
             {
-                var user = userManager.GetUserById(userId.Value);
+                var user = userManager.GetUserById(userId);
 
                 if (user == null)
                 {
@@ -231,7 +231,7 @@ namespace MediaBrowser.Api
                 }
 
                 return userManager
-                    .GetUserById(userId.Value)
+                    .GetUserById(userId)
                     .RootFolder
                     .GetRecursiveChildren(user, filter)
                     .ToList();

+ 2 - 2
MediaBrowser.Api/DisplayPreferencesService.cs

@@ -23,7 +23,7 @@ namespace MediaBrowser.Api
         public string DisplayPreferencesId { get; set; }
 
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     [Route("/DisplayPreferences/{Id}", "GET", Summary = "Gets a user's display preferences for an item")]
@@ -37,7 +37,7 @@ namespace MediaBrowser.Api
         public string Id { get; set; }
 
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         [ApiMember(Name = "Client", Description = "Client", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string Client { get; set; }

+ 3 - 3
MediaBrowser.Api/GamesService.cs

@@ -32,7 +32,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -46,7 +46,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -106,7 +106,7 @@ namespace MediaBrowser.Api
                 .Cast<GameSystem>()
                 .ToList();
 
-            var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId.Value);
+            var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId);
 
             var result = gameSystems
                 .Select(i => GetSummary(i, user))

+ 14 - 14
MediaBrowser.Api/Library/LibraryService.cs

@@ -77,7 +77,7 @@ namespace MediaBrowser.Api.Library
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -102,7 +102,7 @@ namespace MediaBrowser.Api.Library
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -127,7 +127,7 @@ namespace MediaBrowser.Api.Library
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -159,7 +159,7 @@ namespace MediaBrowser.Api.Library
     public class GetItemCounts : IReturn<ItemCounts>
     {
         [ApiMember(Name = "UserId", Description = "Optional. Get counts from a specific user's library.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         [ApiMember(Name = "IsFavorite", Description = "Optional. Get counts of favorite items", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
         public bool? IsFavorite { get; set; }
@@ -174,7 +174,7 @@ namespace MediaBrowser.Api.Library
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -193,7 +193,7 @@ namespace MediaBrowser.Api.Library
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         [ApiMember(Name = "IncludeItemTypes", Description = "Optional. If specified, results will be filtered based on item type. This allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
         public string IncludeItemTypes { get; set; }
@@ -412,7 +412,7 @@ namespace MediaBrowser.Api.Library
 
             var baseItemDtos = new List<BaseItemDto>();
 
-            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+            var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
 
             var dtoOptions = GetDtoOptions(request);
 
@@ -483,15 +483,15 @@ namespace MediaBrowser.Api.Library
             return ToOptimizedSerializedResultUsingCache(counts);
         }
 
-        private bool FilterItem(BaseItem item, GetItemCounts request, Guid? userId)
+        private bool FilterItem(BaseItem item, GetItemCounts request, string userId)
         {
-            if (userId.HasValue)
+            if (!string.IsNullOrWhiteSpace(userId))
             {
                 if (request.IsFavorite.HasValue)
                 {
                     var val = request.IsFavorite.Value;
 
-                    if (_userDataManager.GetUserData(userId.Value, item.GetUserDataKey()).IsFavorite != val)
+                    if (_userDataManager.GetUserData(userId, item.GetUserDataKey()).IsFavorite != val)
                     {
                         return false;
                     }
@@ -609,10 +609,10 @@ namespace MediaBrowser.Api.Library
 
         private ThemeMediaResult GetThemeSongs(GetThemeSongs request)
         {
-            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+            var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
 
             var item = string.IsNullOrEmpty(request.Id)
-                           ? (request.UserId.HasValue
+                           ? (!string.IsNullOrWhiteSpace(request.UserId)
                                   ? user.RootFolder
                                   : (Folder)_libraryManager.RootFolder)
                            : _libraryManager.GetItemById(request.Id);
@@ -652,10 +652,10 @@ namespace MediaBrowser.Api.Library
 
         public ThemeMediaResult GetThemeVideos(GetThemeVideos request)
         {
-            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+            var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
 
             var item = string.IsNullOrEmpty(request.Id)
-                           ? (request.UserId.HasValue
+                           ? (!string.IsNullOrWhiteSpace(request.UserId)
                                   ? user.RootFolder
                                   : (Folder)_libraryManager.RootFolder)
                            : _libraryManager.GetItemById(request.Id);

+ 8 - 8
MediaBrowser.Api/Movies/CollectionService.cs

@@ -2,8 +2,6 @@
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Collections;
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Querying;
 using ServiceStack;
 using System;
 using System.Collections.Generic;
@@ -22,7 +20,7 @@ namespace MediaBrowser.Api.Movies
         public string Name { get; set; }
 
         [ApiMember(Name = "ParentId", Description = "Optional - create the collection within a specific folder", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
-        public Guid? ParentId { get; set; }
+        public string ParentId { get; set; }
 
         [ApiMember(Name = "Ids", Description = "Item Ids to add to the collection", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST", AllowMultiple = true)]
         public string Ids { get; set; }
@@ -35,7 +33,7 @@ namespace MediaBrowser.Api.Movies
         public string Ids { get; set; }
 
         [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid Id { get; set; }
+        public string Id { get; set; }
     }
 
     [Route("/Collections/{Id}/Items", "DELETE", Summary = "Removes items from a collection")]
@@ -45,7 +43,7 @@ namespace MediaBrowser.Api.Movies
         public string Ids { get; set; }
 
         [ApiMember(Name = "Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
-        public Guid Id { get; set; }
+        public string Id { get; set; }
     }
 
     [Authenticated]
@@ -64,11 +62,13 @@ namespace MediaBrowser.Api.Movies
         {
             var userId = AuthorizationContext.GetAuthorizationInfo(Request).UserId;
 
+            var parentId = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId);
+
             var item = await _collectionManager.CreateCollection(new CollectionCreationOptions
             {
                 IsLocked = request.IsLocked,
                 Name = request.Name,
-                ParentId = request.ParentId,
+                ParentId = parentId,
                 ItemIdList = (request.Ids ?? string.Empty).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => new Guid(i)).ToList(),
                 UserIds = new List<Guid> { new Guid(userId) }
 
@@ -86,14 +86,14 @@ namespace MediaBrowser.Api.Movies
 
         public void Post(AddToCollection request)
         {
-            var task = _collectionManager.AddToCollection(request.Id, request.Ids.Split(',').Select(i => new Guid(i)));
+            var task = _collectionManager.AddToCollection(new Guid(request.Id), request.Ids.Split(',').Select(i => new Guid(i)));
 
             Task.WaitAll(task);
         }
 
         public void Delete(RemoveFromCollection request)
         {
-            var task = _collectionManager.RemoveFromCollection(request.Id, request.Ids.Split(',').Select(i => new Guid(i)));
+            var task = _collectionManager.RemoveFromCollection(new Guid(request.Id), request.Ids.Split(',').Select(i => new Guid(i)));
 
             Task.WaitAll(task);
         }

+ 4 - 4
MediaBrowser.Api/Movies/MoviesService.cs

@@ -42,7 +42,7 @@ namespace MediaBrowser.Api.Movies
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Specify this to localize the search to a specific item or folder. Omit to use the root.
@@ -119,7 +119,7 @@ namespace MediaBrowser.Api.Movies
 
         public async Task<object> Get(GetMovieRecommendations request)
         {
-            var user = _userManager.GetUserById(request.UserId.Value);
+            var user = _userManager.GetUserById(request.UserId);
 
             IEnumerable<BaseItem> movies = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId, i => i is Movie);
 
@@ -167,10 +167,10 @@ namespace MediaBrowser.Api.Movies
 
         private async Task<ItemsResult> GetSimilarItemsResult(BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, int> getSimilarityScore)
         {
-            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+            var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
 
             var item = string.IsNullOrEmpty(request.Id) ?
-                (request.UserId.HasValue ? user.RootFolder :
+                (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder :
                 _libraryManager.RootFolder) : _libraryManager.GetItemById(request.Id);
 
             Func<BaseItem, bool> filter = i => i.Id != item.Id && includeInSearch(i);

+ 2 - 2
MediaBrowser.Api/Movies/TrailersService.cs

@@ -34,7 +34,7 @@ namespace MediaBrowser.Api.Movies
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -103,7 +103,7 @@ namespace MediaBrowser.Api.Movies
 
         public async Task<object> Get(Getrailers request)
         {
-            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+            var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
             var result = await GetAllTrailers(user).ConfigureAwait(false);
 
             IEnumerable<BaseItem> items = result.Items;

+ 7 - 7
MediaBrowser.Api/Music/InstantMixService.cs

@@ -75,7 +75,7 @@ namespace MediaBrowser.Api.Music
         {
             var item = _libraryManager.GetItemById(request.Id);
 
-            var user = _userManager.GetUserById(request.UserId.Value);
+            var user = _userManager.GetUserById(request.UserId);
 
             var items = _musicManager.GetInstantMixFromItem(item, user);
 
@@ -86,7 +86,7 @@ namespace MediaBrowser.Api.Music
         {
             var item = _libraryManager.GetItemById(request.Id);
 
-            var user = _userManager.GetUserById(request.UserId.Value);
+            var user = _userManager.GetUserById(request.UserId);
 
             var items = _musicManager.GetInstantMixFromItem(item, user);
 
@@ -97,7 +97,7 @@ namespace MediaBrowser.Api.Music
         {
             var item = _libraryManager.GetItemById(request.Id);
 
-            var user = _userManager.GetUserById(request.UserId.Value);
+            var user = _userManager.GetUserById(request.UserId);
 
             var items = _musicManager.GetInstantMixFromItem(item, user);
 
@@ -108,7 +108,7 @@ namespace MediaBrowser.Api.Music
         {
             var album = _libraryManager.GetItemById(request.Id);
 
-            var user = _userManager.GetUserById(request.UserId.Value);
+            var user = _userManager.GetUserById(request.UserId);
 
             var items = _musicManager.GetInstantMixFromItem(album, user);
 
@@ -119,7 +119,7 @@ namespace MediaBrowser.Api.Music
         {
             var playlist = (Playlist)_libraryManager.GetItemById(request.Id);
 
-            var user = _userManager.GetUserById(request.UserId.Value);
+            var user = _userManager.GetUserById(request.UserId);
 
             var items = _musicManager.GetInstantMixFromItem(playlist, user);
 
@@ -128,7 +128,7 @@ namespace MediaBrowser.Api.Music
 
         public object Get(GetInstantMixFromMusicGenre request)
         {
-            var user = _userManager.GetUserById(request.UserId.Value);
+            var user = _userManager.GetUserById(request.UserId);
 
             var items = _musicManager.GetInstantMixFromGenres(new[] { request.Name }, user);
 
@@ -137,7 +137,7 @@ namespace MediaBrowser.Api.Music
 
         public object Get(GetInstantMixFromArtist request)
         {
-            var user = _userManager.GetUserById(request.UserId.Value);
+            var user = _userManager.GetUserById(request.UserId);
 
             var items = _musicManager.GetInstantMixFromArtist(request.Name, user);
 

+ 7 - 5
MediaBrowser.Api/PluginService.cs

@@ -42,7 +42,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The id.</value>
         [ApiMember(Name = "Id", Description = "Plugin Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
-        public Guid Id { get; set; }
+        public string Id { get; set; }
     }
 
     /// <summary>
@@ -57,7 +57,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The id.</value>
         [ApiMember(Name = "Id", Description = "Plugin Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid Id { get; set; }
+        public string Id { get; set; }
     }
 
     /// <summary>
@@ -72,7 +72,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The id.</value>
         [ApiMember(Name = "Id", Description = "Plugin Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid Id { get; set; }
+        public string Id { get; set; }
 
         /// <summary>
         /// The raw Http Request Input Stream
@@ -239,7 +239,8 @@ namespace MediaBrowser.Api
         /// <returns>System.Object.</returns>
         public object Get(GetPluginConfiguration request)
         {
-            var plugin = _appHost.Plugins.First(p => p.Id == request.Id);
+            var guid = new Guid(request.Id);
+            var plugin = _appHost.Plugins.First(p => p.Id == guid);
 
             var dateModified = plugin.ConfigurationDateLastModified;
 
@@ -298,7 +299,8 @@ namespace MediaBrowser.Api
         /// <param name="request">The request.</param>
         public void Delete(UninstallPlugin request)
         {
-            var plugin = _appHost.Plugins.First(p => p.Id == request.Id);
+            var guid = new Guid(request.Id);
+            var plugin = _appHost.Plugins.First(p => p.Id == guid);
 
             _installationManager.UninstallPlugin(plugin);
         }

+ 4 - 5
MediaBrowser.Api/Reports/ReportRequests.cs

@@ -1,10 +1,9 @@
-using System;
-using System.Linq;
-using MediaBrowser.Api.UserLibrary;
-using MediaBrowser.Controller.Net;
+using MediaBrowser.Api.UserLibrary;
 using MediaBrowser.Model.Entities;
 using ServiceStack;
+using System;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace MediaBrowser.Api.Reports
 {
@@ -15,7 +14,7 @@ namespace MediaBrowser.Api.Reports
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Limit results to items containing a specific person

+ 1 - 1
MediaBrowser.Api/Reports/ReportsService.cs

@@ -175,7 +175,7 @@ namespace MediaBrowser.Api.Reports
 		{
 			// Placeholder in case needed later
 			request.Recursive = true;
-			var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+			var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
 			request.Fields = "MediaSources,DateCreated,Settings,Studios,SyncInfo,ItemCounts";
 
 			var parentItem = string.IsNullOrEmpty(request.ParentId) ?

+ 6 - 6
MediaBrowser.Api/Session/SessionsService.cs

@@ -21,7 +21,7 @@ namespace MediaBrowser.Api.Session
     public class GetSessions : IReturn<List<SessionInfoDto>>
     {
         [ApiMember(Name = "ControllableByUserId", Description = "Optional. Filter by sessions that a given user is allowed to remote control.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? ControllableByUserId { get; set; }
+        public string ControllableByUserId { get; set; }
 
         [ApiMember(Name = "DeviceId", Description = "Optional. Filter by device id.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string DeviceId { get; set; }
@@ -200,7 +200,7 @@ namespace MediaBrowser.Api.Session
         public string Id { get; set; }
 
         [ApiMember(Name = "UserId", Description = "UserId Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     [Route("/Sessions/{Id}/Users/{UserId}", "DELETE", Summary = "Removes an additional user from a session")]
@@ -211,7 +211,7 @@ namespace MediaBrowser.Api.Session
         public string Id { get; set; }
 
         [ApiMember(Name = "UserId", Description = "UserId Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     [Route("/Sessions/Capabilities", "POST", Summary = "Updates capabilities for a device")]
@@ -375,15 +375,15 @@ namespace MediaBrowser.Api.Session
                 result = result.Where(i => string.Equals(i.DeviceId, request.DeviceId, StringComparison.OrdinalIgnoreCase));
             }
 
-            if (request.ControllableByUserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.ControllableByUserId))
             {
                 result = result.Where(i => i.SupportsMediaControl);
 
-                var user = _userManager.GetUserById(request.ControllableByUserId.Value);
+                var user = _userManager.GetUserById(request.ControllableByUserId);
 
                 if (!user.Policy.EnableRemoteControlOfOtherUsers)
                 {
-                    result = result.Where(i => !i.UserId.HasValue || i.ContainsUser(request.ControllableByUserId.Value));
+                    result = result.Where(i => !i.UserId.HasValue || i.ContainsUser(request.ControllableByUserId));
                 }
 
                 if (!user.Policy.EnableSharedDeviceControl)

+ 3 - 3
MediaBrowser.Api/SimilarItemsHelper.cs

@@ -32,7 +32,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// The maximum number of items to return
@@ -70,10 +70,10 @@ namespace MediaBrowser.Api
         /// <returns>ItemsResult.</returns>
         internal static ItemsResult GetSimilarItemsResult(DtoOptions dtoOptions, IUserManager userManager, IItemRepository itemRepository, ILibraryManager libraryManager, IUserDataManager userDataRepository, IDtoService dtoService, ILogger logger, BaseGetSimilarItemsFromItem request, Func<BaseItem, bool> includeInSearch, Func<BaseItem, BaseItem, int> getSimilarityScore)
         {
-            var user = request.UserId.HasValue ? userManager.GetUserById(request.UserId.Value) : null;
+            var user = !string.IsNullOrWhiteSpace(request.UserId) ? userManager.GetUserById(request.UserId) : null;
 
             var item = string.IsNullOrEmpty(request.Id) ?
-                (request.UserId.HasValue ? user.RootFolder :
+                (!string.IsNullOrWhiteSpace(request.UserId) ? user.RootFolder :
                 libraryManager.RootFolder) : libraryManager.GetItemById(request.Id);
 
             Func<BaseItem, bool> filter = i => i.Id != item.Id && includeInSearch(i);

+ 5 - 5
MediaBrowser.Api/TvShowsService.cs

@@ -77,7 +77,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Skips over a given number of items within the results. Use for paging.
@@ -130,7 +130,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Fields to return within the items, in addition to basic information
@@ -140,7 +140,7 @@ namespace MediaBrowser.Api
         public string Fields { get; set; }
 
         [ApiMember(Name = "Id", Description = "The series id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid Id { get; set; }
+        public string Id { get; set; }
 
         [ApiMember(Name = "Season", Description = "Optional filter by season number.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public int? Season { get; set; }
@@ -183,7 +183,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Fields to return within the items, in addition to basic information
@@ -193,7 +193,7 @@ namespace MediaBrowser.Api
         public string Fields { get; set; }
 
         [ApiMember(Name = "Id", Description = "The series id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid Id { get; set; }
+        public string Id { get; set; }
 
         [ApiMember(Name = "IsSpecialSeason", Description = "Optional. Filter by special season.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
         public bool? IsSpecialSeason { get; set; }

+ 3 - 3
MediaBrowser.Api/UserLibrary/ArtistsService.cs

@@ -40,7 +40,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -84,9 +84,9 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoOptions = GetDtoOptions(request);
 
-            if (request.UserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.UserId))
             {
-                var user = UserManager.GetUserById(request.UserId.Value);
+                var user = UserManager.GetUserById(request.UserId);
 
                 return DtoService.GetBaseItemDto(item, dtoOptions, user);
             }

+ 4 - 4
MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs

@@ -61,9 +61,9 @@ namespace MediaBrowser.Api.UserLibrary
             BaseItem parentItem;
             List<BaseItem> libraryItems = null;
 
-            if (request.UserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.UserId))
             {
-                user = UserManager.GetUserById(request.UserId.Value);
+                user = UserManager.GetUserById(request.UserId);
                 parentItem = string.IsNullOrEmpty(request.ParentId) ? user.RootFolder : LibraryManager.GetItemById(request.ParentId);
 
                 if (RequiresLibraryItems(request, dtoOptions))
@@ -92,7 +92,7 @@ namespace MediaBrowser.Api.UserLibrary
             {
                 var folder = (Folder)parentItem;
 
-                if (request.UserId.HasValue)
+                if (!string.IsNullOrWhiteSpace(request.UserId))
                 {
                     items = request.Recursive ?
                         folder.GetRecursiveChildren(user, filter) :
@@ -388,7 +388,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         [ApiMember(Name = "NameStartsWithOrGreater", Description = "Optional filter by items whose name is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
         public string NameStartsWithOrGreater { get; set; }

+ 3 - 3
MediaBrowser.Api/UserLibrary/GameGenresService.cs

@@ -37,7 +37,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     [Authenticated]
@@ -71,9 +71,9 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoOptions = GetDtoOptions(request);
 
-            if (request.UserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.UserId))
             {
-                var user = UserManager.GetUserById(request.UserId.Value);
+                var user = UserManager.GetUserById(request.UserId);
 
                 return DtoService.GetBaseItemDto(item, dtoOptions, user);
             }

+ 3 - 3
MediaBrowser.Api/UserLibrary/GenresService.cs

@@ -39,7 +39,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -76,9 +76,9 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoOptions = GetDtoOptions(request);
 
-            if (request.UserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.UserId))
             {
-                var user = UserManager.GetUserById(request.UserId.Value);
+                var user = UserManager.GetUserById(request.UserId);
 
                 return DtoService.GetBaseItemDto(item, dtoOptions, user);
             }

+ 2 - 2
MediaBrowser.Api/UserLibrary/ItemsService.cs

@@ -30,7 +30,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Limit results to items containing a specific person
@@ -325,7 +325,7 @@ namespace MediaBrowser.Api.UserLibrary
         private async Task<ItemsResult> GetItems(GetItems request)
         {
             var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
-            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+            var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
 
             var result = await GetItemsToSerialize(request, user, parentItem).ConfigureAwait(false);
 

+ 3 - 3
MediaBrowser.Api/UserLibrary/MusicGenresService.cs

@@ -37,7 +37,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     [Authenticated]
@@ -71,9 +71,9 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoOptions = GetDtoOptions(request);
 
-            if (request.UserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.UserId))
             {
-                var user = UserManager.GetUserById(request.UserId.Value);
+                var user = UserManager.GetUserById(request.UserId);
 
                 return DtoService.GetBaseItemDto(item, dtoOptions, user);
             }

+ 3 - 3
MediaBrowser.Api/UserLibrary/PersonsService.cs

@@ -43,7 +43,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -87,9 +87,9 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoOptions = GetDtoOptions(request);
 
-            if (request.UserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.UserId))
             {
-                var user = UserManager.GetUserById(request.UserId.Value);
+                var user = UserManager.GetUserById(request.UserId);
 
                 return DtoService.GetBaseItemDto(item, dtoOptions, user);
             }

+ 5 - 5
MediaBrowser.Api/UserLibrary/PlaystateService.cs

@@ -23,7 +23,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         [ApiMember(Name = "DatePlayed", Description = "The date the item was played (if any). Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
         public string DatePlayed { get; set; }
@@ -47,7 +47,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -90,7 +90,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -143,7 +143,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -198,7 +198,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.

+ 3 - 3
MediaBrowser.Api/UserLibrary/StudiosService.cs

@@ -38,7 +38,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -75,9 +75,9 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoOptions = GetDtoOptions(request);
 
-            if (request.UserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.UserId))
             {
-                var user = UserManager.GetUserById(request.UserId.Value);
+                var user = UserManager.GetUserById(request.UserId);
 
                 return DtoService.GetBaseItemDto(item, dtoOptions, user);
             }

+ 11 - 13
MediaBrowser.Api/UserLibrary/UserLibraryService.cs

@@ -5,9 +5,7 @@ using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Library;
 using MediaBrowser.Model.Querying;
-using MoreLinq;
 using ServiceStack;
 using System;
 using System.Collections.Generic;
@@ -28,7 +26,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -49,7 +47,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -63,7 +61,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the item id.
@@ -84,7 +82,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -105,7 +103,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -126,7 +124,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -147,7 +145,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -175,7 +173,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -196,7 +194,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -515,7 +513,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <param name="itemId">The item id.</param>
         /// <param name="isFavorite">if set to <c>true</c> [is favorite].</param>
         /// <returns>Task{UserItemDataDto}.</returns>
-        private async Task<UserItemDataDto> MarkFavorite(Guid userId, string itemId, bool isFavorite)
+        private async Task<UserItemDataDto> MarkFavorite(string userId, string itemId, bool isFavorite)
         {
             var user = _userManager.GetUserById(userId);
 
@@ -563,7 +561,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <param name="itemId">The item id.</param>
         /// <param name="likes">if set to <c>true</c> [likes].</param>
         /// <returns>Task{UserItemDataDto}.</returns>
-        private async Task<UserItemDataDto> UpdateUserItemRating(Guid userId, string itemId, bool? likes)
+        private async Task<UserItemDataDto> UpdateUserItemRating(string userId, string itemId, bool? likes)
         {
             var user = _userManager.GetUserById(userId);
 

+ 3 - 3
MediaBrowser.Api/UserLibrary/YearsService.cs

@@ -38,7 +38,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// </summary>
         /// <value>The user id.</value>
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
     }
 
     /// <summary>
@@ -75,9 +75,9 @@ namespace MediaBrowser.Api.UserLibrary
 
             var dtoOptions = GetDtoOptions(request);
 
-            if (request.UserId.HasValue)
+            if (!string.IsNullOrWhiteSpace(request.UserId))
             {
-                var user = UserManager.GetUserById(request.UserId.Value);
+                var user = UserManager.GetUserById(request.UserId);
 
                 return DtoService.GetBaseItemDto(item, dtoOptions, user);
             }

+ 3 - 3
MediaBrowser.Api/VideosService.cs

@@ -19,7 +19,7 @@ namespace MediaBrowser.Api
     public class GetAdditionalParts : IReturn<ItemsResult>
     {
         [ApiMember(Name = "UserId", Description = "Optional. Filter by user id, and attach user data", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
-        public Guid? UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the id.
@@ -71,10 +71,10 @@ namespace MediaBrowser.Api
         /// <returns>System.Object.</returns>
         public object Get(GetAdditionalParts request)
         {
-            var user = request.UserId.HasValue ? _userManager.GetUserById(request.UserId.Value) : null;
+            var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
 
             var item = string.IsNullOrEmpty(request.Id)
-                           ? (request.UserId.HasValue
+                           ? (!string.IsNullOrWhiteSpace(request.UserId)
                                   ? user.RootFolder
                                   : _libraryManager.RootFolder)
                            : _libraryManager.GetItemById(request.Id);

+ 8 - 0
MediaBrowser.Controller/Library/IUserDataManager.cs

@@ -29,6 +29,14 @@ namespace MediaBrowser.Controller.Library
         /// <returns>Task.</returns>
         Task SaveUserData(Guid userId, IHasUserData item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// Gets the user data.
+        /// </summary>
+        /// <param name="userId">The user id.</param>
+        /// <param name="key">The key.</param>
+        /// <returns>Task{UserItemData}.</returns>
+        UserItemData GetUserData(string userId, string key);
+
         /// <summary>
         /// Gets the user data.
         /// </summary>

+ 3 - 3
MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs

@@ -25,9 +25,9 @@ namespace MediaBrowser.Controller.Persistence
         /// <param name="client">The client.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task.</returns>
-        Task SaveDisplayPreferences(DisplayPreferences displayPreferences, Guid userId, string client,
+        Task SaveDisplayPreferences(DisplayPreferences displayPreferences, string userId, string client,
                                     CancellationToken cancellationToken);
-
+        
         /// <summary>
         /// Saves all display preferences for a user
         /// </summary>
@@ -44,7 +44,7 @@ namespace MediaBrowser.Controller.Persistence
         /// <param name="userId">The user id.</param>
         /// <param name="client">The client.</param>
         /// <returns>Task{DisplayPreferences}.</returns>
-        DisplayPreferences GetDisplayPreferences(string displayPreferencesId, Guid userId, string client);
+        DisplayPreferences GetDisplayPreferences(string displayPreferencesId, string userId, string client);
 
         /// <summary>
         /// Gets all display preferences for the given user.

+ 2 - 2
MediaBrowser.Controller/Session/ISessionManager.cs

@@ -220,14 +220,14 @@ namespace MediaBrowser.Controller.Session
         /// </summary>
         /// <param name="sessionId">The session identifier.</param>
         /// <param name="userId">The user identifier.</param>
-        void AddAdditionalUser(string sessionId, Guid userId);
+        void AddAdditionalUser(string sessionId, string userId);
 
         /// <summary>
         /// Removes the additional user.
         /// </summary>
         /// <param name="sessionId">The session identifier.</param>
         /// <param name="userId">The user identifier.</param>
-        void RemoveAdditionalUser(string sessionId, Guid userId);
+        void RemoveAdditionalUser(string sessionId, string userId);
 
         /// <summary>
         /// Reports the now viewing item.

+ 6 - 2
MediaBrowser.Server.Implementations/Library/UserDataManager.cs

@@ -1,5 +1,4 @@
-using System.Collections.Generic;
-using MediaBrowser.Common.Events;
+using MediaBrowser.Common.Events;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
@@ -10,6 +9,7 @@ using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Logging;
 using System;
 using System.Collections.Concurrent;
+using System.Collections.Generic;
 using System.Threading;
 using System.Threading.Tasks;
 
@@ -262,5 +262,9 @@ namespace MediaBrowser.Server.Implementations.Library
             return playedToCompletion;
         }
 
+        public UserItemData GetUserData(string userId, string key)
+        {
+            return GetUserData(new Guid(userId), key);
+        }
     }
 }

+ 5 - 2
MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json

@@ -723,7 +723,7 @@
     "MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Emby.",
     "HeaderConnectionFailure": "Connection Failure",
     "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.",
-    "ButtonSelectServer": "Select server",
+    "ButtonSelectServer": "Select Server",
     "MessagePluginConfigurationRequiresLocalAccess": "To configure this plugin please sign in to your local server directly.",
     "MessageLoggedOutParentalControl": "Access is currently restricted. Please try again later.",
     "DefaultErrorMessage": "There was an error processing the request. Please try again later.",
@@ -787,5 +787,8 @@
     "MessagePleaseSignInLocalNetwork": "Before proceeding, please ensure that you're connected to your local network using a Wifi or LAN connection.",
     "ButtonUnlockWithPurchase": "Unlock with Purchase",
     "MessageLiveTvGuideRequiresUnlock": "The Live TV Guide is currently limited to {0} channels. Click the unlock button to learn how to enjoy the full experience.",
-    "OptionEnableFullscreen": "Enable Fullscreen"
+    "OptionEnableFullscreen": "Enable Fullscreen",
+    "ButtonServer": "Server",
+    "HeaderAdmin": "Admin",
+    "HeaderLibrary": "Library"
 }

+ 10 - 0
MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs

@@ -309,5 +309,15 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 _connection = null;
             }
         }
+
+        public Task SaveDisplayPreferences(DisplayPreferences displayPreferences, string userId, string client, CancellationToken cancellationToken)
+        {
+            return SaveDisplayPreferences(displayPreferences, new Guid(userId), client, cancellationToken);
+        }
+
+        public DisplayPreferences GetDisplayPreferences(string displayPreferencesId, string userId, string client)
+        {
+            return GetDisplayPreferences(displayPreferencesId, new Guid(userId), client);
+        }
     }
 }

+ 7 - 7
MediaBrowser.Server.Implementations/Session/SessionManager.cs

@@ -1203,22 +1203,22 @@ namespace MediaBrowser.Server.Implementations.Session
         /// <param name="userId">The user identifier.</param>
         /// <exception cref="System.UnauthorizedAccessException">Cannot modify additional users without authenticating first.</exception>
         /// <exception cref="System.ArgumentException">The requested user is already the primary user of the session.</exception>
-        public void AddAdditionalUser(string sessionId, Guid userId)
+        public void AddAdditionalUser(string sessionId, string userId)
         {
             var session = GetSession(sessionId);
 
-            if (session.UserId.HasValue && session.UserId.Value == userId)
+            if (session.UserId.HasValue && session.UserId.Value == new Guid(userId))
             {
                 throw new ArgumentException("The requested user is already the primary user of the session.");
             }
 
-            if (session.AdditionalUsers.All(i => new Guid(i.UserId) != userId))
+            if (session.AdditionalUsers.All(i => new Guid(i.UserId) != new Guid(userId)))
             {
                 var user = _userManager.GetUserById(userId);
 
                 session.AdditionalUsers.Add(new SessionUserInfo
                 {
-                    UserId = userId.ToString("N"),
+                    UserId = userId,
                     UserName = user.Name
                 });
             }
@@ -1231,16 +1231,16 @@ namespace MediaBrowser.Server.Implementations.Session
         /// <param name="userId">The user identifier.</param>
         /// <exception cref="System.UnauthorizedAccessException">Cannot modify additional users without authenticating first.</exception>
         /// <exception cref="System.ArgumentException">The requested user is already the primary user of the session.</exception>
-        public void RemoveAdditionalUser(string sessionId, Guid userId)
+        public void RemoveAdditionalUser(string sessionId, string userId)
         {
             var session = GetSession(sessionId);
 
-            if (session.UserId.HasValue && session.UserId.Value == userId)
+            if (session.UserId.HasValue && session.UserId.Value == new Guid(userId))
             {
                 throw new ArgumentException("The requested user is already the primary user of the session.");
             }
 
-            var user = session.AdditionalUsers.FirstOrDefault(i => new Guid(i.UserId) == userId);
+            var user = session.AdditionalUsers.FirstOrDefault(i => new Guid(i.UserId) == new Guid(userId));
 
             if (user != null)
             {

+ 12 - 0
MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

@@ -234,9 +234,15 @@
     <Content Include="dashboard-ui\thirdparty\cordova\android\androidcredentials.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="dashboard-ui\thirdparty\cordova\android\filesystem.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="dashboard-ui\thirdparty\cordova\android\iap.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="dashboard-ui\thirdparty\cordova\android\imagestore.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="dashboard-ui\thirdparty\cordova\android\immersive.js" />
     <Content Include="dashboard-ui\thirdparty\cordova\chromecast.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -247,6 +253,9 @@
     <Content Include="dashboard-ui\thirdparty\cordova\externalplayer.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="dashboard-ui\thirdparty\cordova\filesystem.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="dashboard-ui\thirdparty\cordova\generaldevice.js" />
     <Content Include="dashboard-ui\thirdparty\cordova\iap.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -1040,6 +1049,9 @@
     <Content Include="dashboard-ui\thirdparty\fastclick.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="dashboard-ui\thirdparty\filesystem.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="dashboard-ui\thirdparty\fontawesome\css\font-awesome.css">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>