Browse Source

Removed guids from the model project

Luke Pulverenti 11 năm trước cách đây
mục cha
commit
f02c326027
72 tập tin đã thay đổi với 380 bổ sung503 xóa
  1. 3 3
      MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs
  2. 1 1
      MediaBrowser.Api/DefaultTheme/Models.cs
  3. 6 5
      MediaBrowser.Api/DisplayPreferencesService.cs
  4. 1 1
      MediaBrowser.Api/Images/ImageService.cs
  5. 2 2
      MediaBrowser.Api/PackageService.cs
  6. 6 6
      MediaBrowser.Api/SearchService.cs
  7. 1 3
      MediaBrowser.Api/UserLibrary/UserLibraryService.cs
  8. 1 0
      MediaBrowser.Common.Implementations/BaseApplicationHost.cs
  9. 1 1
      MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
  10. 1 0
      MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs
  11. 5 3
      MediaBrowser.Common.Implementations/Updates/InstallationManager.cs
  12. 2 2
      MediaBrowser.Common/IApplicationHost.cs
  13. 0 1
      MediaBrowser.Common/MediaBrowser.Common.csproj
  14. 1 1
      MediaBrowser.Common/ScheduledTasks/ITaskManager.cs
  15. 1 1
      MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
  16. 2 2
      MediaBrowser.Common/Updates/IInstallationManager.cs
  17. 1 1
      MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
  18. 4 4
      MediaBrowser.Controller/Drawing/IImageProcessor.cs
  19. 2 2
      MediaBrowser.Controller/Library/IUserManager.cs
  20. 1 1
      MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs
  21. 0 8
      MediaBrowser.Controller/Session/ISessionController.cs
  22. 2 4
      MediaBrowser.Dlna/Didl/DidlBuilder.cs
  23. 0 5
      MediaBrowser.Dlna/PlayTo/DlnaController.cs
  24. 3 0
      MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
  25. 3 0
      MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
  26. 35 3
      MediaBrowser.Model/ApiClient/IApiClient.cs
  27. 39 16
      MediaBrowser.Model/ApiClient/IServerEvents.cs
  28. 1 147
      MediaBrowser.Model/ApiClient/ServerEventArgs.cs
  29. 3 3
      MediaBrowser.Model/Configuration/MetadataOptions.cs
  30. 2 3
      MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs
  31. 59 59
      MediaBrowser.Model/Dlna/StreamBuilder.cs
  32. 36 36
      MediaBrowser.Model/Dlna/StreamInfo.cs
  33. 27 8
      MediaBrowser.Model/Drawing/DrawingUtils.cs
  34. 10 10
      MediaBrowser.Model/Dto/BaseItemDto.cs
  35. 2 2
      MediaBrowser.Model/Dto/BaseItemPerson.cs
  36. 2 2
      MediaBrowser.Model/Dto/ChapterInfoDto.cs
  37. 1 1
      MediaBrowser.Model/Dto/ImageInfo.cs
  38. 1 1
      MediaBrowser.Model/Dto/ImageOptions.cs
  39. 1 1
      MediaBrowser.Model/Dto/ItemByNameCounts.cs
  40. 2 2
      MediaBrowser.Model/Dto/StudioDto.cs
  41. 2 2
      MediaBrowser.Model/Dto/UserDto.cs
  42. 5 5
      MediaBrowser.Model/Entities/BaseItemInfo.cs
  43. 2 2
      MediaBrowser.Model/Entities/DisplayPreferences.cs
  44. 10 10
      MediaBrowser.Model/Entities/LibraryUpdateInfo.cs
  45. 1 1
      MediaBrowser.Model/Events/GenericEventArgs.cs
  46. 2 2
      MediaBrowser.Model/LiveTv/ChannelInfoDto.cs
  47. 3 3
      MediaBrowser.Model/LiveTv/ProgramInfoDto.cs
  48. 3 3
      MediaBrowser.Model/LiveTv/RecordingInfoDto.cs
  49. 2 2
      MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs
  50. 1 0
      MediaBrowser.Model/MediaBrowser.Model.csproj
  51. 3 3
      MediaBrowser.Model/Search/SearchHint.cs
  52. 2 1
      MediaBrowser.Model/Session/GeneralCommand.cs
  53. 1 1
      MediaBrowser.Model/Session/SessionInfoDto.cs
  54. 1 1
      MediaBrowser.Model/Tasks/TaskInfo.cs
  55. 1 1
      MediaBrowser.Model/Tasks/TaskResult.cs
  56. 1 1
      MediaBrowser.Model/Updates/InstallationInfo.cs
  57. 2 2
      MediaBrowser.Model/Updates/PackageVersionInfo.cs
  58. 0 44
      MediaBrowser.Model/Web/QueryStringDictionary.cs
  59. 10 1
      MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs
  60. 2 2
      MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs
  61. 1 0
      MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
  62. 4 4
      MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs
  63. 11 12
      MediaBrowser.Server.Implementations/Dto/DtoService.cs
  64. 5 5
      MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
  65. 1 0
      MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs
  66. 1 0
      MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs
  67. 1 0
      MediaBrowser.Server.Implementations/Library/UserManager.cs
  68. 7 7
      MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs
  69. 6 6
      MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs
  70. 0 10
      MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs
  71. 18 9
      MediaBrowser.Server.Implementations/Session/SessionManager.cs
  72. 0 12
      MediaBrowser.Server.Implementations/Session/WebSocketController.cs

+ 3 - 3
MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs

@@ -556,7 +556,7 @@ namespace MediaBrowser.Api.DefaultTheme
 
             // Avoid implicitly captured closure
             var currentUserId1 = user.Id;
-            
+
             view.LatestMovies = movies
                 .OrderByDescending(i => i.DateCreated)
                 .Where(i => !_userDataManager.GetUserData(currentUserId1, i.GetUserDataKey()).Played)
@@ -622,9 +622,9 @@ namespace MediaBrowser.Api.DefaultTheme
             {
                 var tag = _imageProcessor.GetImageCacheTag(item, imageType);
 
-                if (tag.HasValue)
+                if (tag != null)
                 {
-                    stub.ImageTag = tag.Value;
+                    stub.ImageTag = tag;
                 }
             }
             catch (Exception ex)

+ 1 - 1
MediaBrowser.Api/DefaultTheme/Models.cs

@@ -9,7 +9,7 @@ namespace MediaBrowser.Api.DefaultTheme
     {
         public string Name { get; set; }
         public string Id { get; set; }
-        public Guid ImageTag { get; set; }
+        public string ImageTag { get; set; }
         public ImageType ImageType { get; set; }
     }
 

+ 6 - 5
MediaBrowser.Api/DisplayPreferencesService.cs

@@ -77,15 +77,16 @@ namespace MediaBrowser.Api
         /// <param name="request">The request.</param>
         public object Get(GetDisplayPreferences request)
         {
-            Guid displayPreferencesId;
+            var result = _displayPreferencesManager.GetDisplayPreferences(request.Id, request.UserId, request.Client);
 
-            if (!Guid.TryParse(request.Id, out displayPreferencesId))
+            if (result == null)
             {
-                displayPreferencesId = request.Id.GetMD5();
+                result = new DisplayPreferences
+                {
+                    Id = request.Id
+                };
             }
 
-            var result = _displayPreferencesManager.GetDisplayPreferences(displayPreferencesId, request.UserId, request.Client);
-
             return ToOptimizedSerializedResultUsingCache(result);
         }
 

+ 1 - 1
MediaBrowser.Api/Images/ImageService.cs

@@ -548,7 +548,7 @@ namespace MediaBrowser.Api.Images
 
             var contentType = GetMimeType(request.Format, imageInfo.Path);
 
-            var cacheGuid = _imageProcessor.GetImageCacheTag(item, request.Type, imageInfo.Path, originalFileImageDateModified, supportedImageEnhancers);
+            var cacheGuid = new Guid(_imageProcessor.GetImageCacheTag(item, request.Type, imageInfo.Path, originalFileImageDateModified, supportedImageEnhancers));
 
             TimeSpan? cacheDuration = null;
 

+ 2 - 2
MediaBrowser.Api/PackageService.cs

@@ -112,7 +112,7 @@ namespace MediaBrowser.Api
         /// </summary>
         /// <value>The id.</value>
         [ApiMember(Name = "Id", Description = "Installation Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
-        public Guid Id { get; set; }
+        public string Id { get; set; }
     }
 
     /// <summary>
@@ -221,7 +221,7 @@ namespace MediaBrowser.Api
         /// <param name="request">The request.</param>
         public void Delete(CancelPackageInstallation request)
         {
-            var info = _installationManager.CurrentInstallations.FirstOrDefault(i => i.Item1.Id == request.Id);
+            var info = _installationManager.CurrentInstallations.FirstOrDefault(i => string.Equals(i.Item1.Id, request.Id));
 
             if (info != null)
             {

+ 6 - 6
MediaBrowser.Api/SearchService.cs

@@ -171,9 +171,9 @@ namespace MediaBrowser.Api
 
             var primaryImageTag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary);
 
-            if (primaryImageTag.HasValue)
+            if (primaryImageTag != null)
             {
-                result.PrimaryImageTag = primaryImageTag.Value;
+                result.PrimaryImageTag = primaryImageTag;
             }
 
             SetThumbImageInfo(result, item);
@@ -250,9 +250,9 @@ namespace MediaBrowser.Api
             {
                 var tag = _imageProcessor.GetImageCacheTag(itemWithImage, ImageType.Thumb);
 
-                if (tag.HasValue)
+                if (tag != null)
                 {
-                    hint.ThumbImageTag = tag.Value;
+                    hint.ThumbImageTag = tag;
                     hint.ThumbImageItemId = itemWithImage.Id.ToString("N");
                 }
             }
@@ -271,9 +271,9 @@ namespace MediaBrowser.Api
             {
                 var tag = _imageProcessor.GetImageCacheTag(itemWithImage, ImageType.Backdrop);
 
-                if (tag.HasValue)
+                if (tag != null)
                 {
-                    hint.BackdropImageTag = tag.Value;
+                    hint.BackdropImageTag = tag;
                     hint.BackdropImageItemId = itemWithImage.Id.ToString("N");
                 }
             }

+ 1 - 3
MediaBrowser.Api/UserLibrary/UserLibraryService.cs

@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Controller.Dto;
+using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
@@ -8,7 +7,6 @@ using MediaBrowser.Controller.Session;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
-using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Session;
 using ServiceStack;
 using System;

+ 1 - 0
MediaBrowser.Common.Implementations/BaseApplicationHost.cs

@@ -13,6 +13,7 @@ using MediaBrowser.Common.Progress;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Common.Security;
 using MediaBrowser.Common.Updates;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;

+ 1 - 1
MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs

@@ -531,7 +531,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
                 EndTimeUtc = endTime,
                 Status = status,
                 Name = Name,
-                Id = Id
+                Id = Id.ToString("N")
             };
 
             if (ex != null)

+ 1 - 0
MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs

@@ -1,6 +1,7 @@
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Events;
 using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Tasks;

+ 5 - 3
MediaBrowser.Common.Implementations/Updates/InstallationManager.cs

@@ -5,6 +5,7 @@ using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Progress;
 using MediaBrowser.Common.Security;
 using MediaBrowser.Common.Updates;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Model.Updates;
@@ -367,7 +368,7 @@ namespace MediaBrowser.Common.Implementations.Updates
 
             var installationInfo = new InstallationInfo
             {
-                Id = Guid.NewGuid(),
+                Id = Guid.NewGuid().ToString("N"),
                 Name = package.name,
                 AssemblyGuid = package.guid,
                 UpdateClass = package.classification,
@@ -510,13 +511,14 @@ namespace MediaBrowser.Common.Implementations.Updates
             cancellationToken.ThrowIfCancellationRequested();
 
             // Validate with a checksum
-            if (package.checksum != Guid.Empty) // support for legacy uploads for now
+            var packageChecksum = string.IsNullOrWhiteSpace(package.checksum) ? Guid.Empty : new Guid(package.checksum);
+            if (packageChecksum != Guid.Empty) // support for legacy uploads for now
             {
                 using (var crypto = new MD5CryptoServiceProvider())
                 using (var stream = new BufferedStream(File.OpenRead(tempFile), 100000))
                 {
                     var check = Guid.Parse(BitConverter.ToString(crypto.ComputeHash(stream)).Replace("-", String.Empty));
-                    if (check != package.checksum)
+                    if (check != packageChecksum)
                     {
                         throw new ApplicationException(string.Format("Download validation failed for {0}.  Probably corrupted during transfer.", package.name));
                     }

+ 2 - 2
MediaBrowser.Common/IApplicationHost.cs

@@ -1,5 +1,5 @@
-using MediaBrowser.Common.Events;
-using MediaBrowser.Common.Plugins;
+using MediaBrowser.Common.Plugins;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Updates;
 using System;
 using System.Collections.Generic;

+ 0 - 1
MediaBrowser.Common/MediaBrowser.Common.csproj

@@ -59,7 +59,6 @@
     <Compile Include="Constants\Constants.cs" />
     <Compile Include="Events\EventHelper.cs" />
     <Compile Include="Extensions\BaseExtensions.cs" />
-    <Compile Include="Events\GenericEventArgs.cs" />
     <Compile Include="Extensions\ResourceNotFoundException.cs" />
     <Compile Include="IO\FileSystemRepository.cs" />
     <Compile Include="IO\IFileSystem.cs" />

+ 1 - 1
MediaBrowser.Common/ScheduledTasks/ITaskManager.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Events;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Tasks;
 using System;
 using System.Collections.Generic;

+ 1 - 1
MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs

@@ -38,7 +38,7 @@ namespace MediaBrowser.Common.ScheduledTasks
                 Name = task.Name,
                 CurrentProgressPercentage = task.CurrentProgress,
                 State = task.State,
-                Id = task.Id,
+                Id = task.Id.ToString("N"),
                 LastExecutionResult = task.LastExecutionResult,
                 Triggers = task.Triggers.Select(GetTriggerInfo).ToList(),
                 Description = task.Description,

+ 2 - 2
MediaBrowser.Common/Updates/IInstallationManager.cs

@@ -1,5 +1,5 @@
-using MediaBrowser.Common.Events;
-using MediaBrowser.Common.Plugins;
+using MediaBrowser.Common.Plugins;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Updates;
 using System;
 using System.Collections.Concurrent;

+ 1 - 1
MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs

@@ -1,6 +1,6 @@
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Events;
 using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Events;
 using System;
 
 namespace MediaBrowser.Controller.Configuration

+ 4 - 4
MediaBrowser.Controller/Drawing/IImageProcessor.cs

@@ -55,7 +55,7 @@ namespace MediaBrowser.Controller.Drawing
         /// <param name="item">The item.</param>
         /// <param name="image">The image.</param>
         /// <returns>Guid.</returns>
-        Guid GetImageCacheTag(IHasImages item, ItemImageInfo image);
+        string GetImageCacheTag(IHasImages item, ItemImageInfo image);
 
         /// <summary>
         /// Gets the image cache tag.
@@ -66,7 +66,7 @@ namespace MediaBrowser.Controller.Drawing
         /// <param name="dateModified">The date modified.</param>
         /// <param name="imageEnhancers">The image enhancers.</param>
         /// <returns>Guid.</returns>
-        Guid GetImageCacheTag(IHasImages item, ImageType imageType, string originalImagePath, DateTime dateModified,
+        string GetImageCacheTag(IHasImages item, ImageType imageType, string originalImagePath, DateTime dateModified,
                               List<IImageEnhancer> imageEnhancers);
 
         /// <summary>
@@ -89,12 +89,12 @@ namespace MediaBrowser.Controller.Drawing
 
     public static class ImageProcessorExtensions
     {
-        public static Guid? GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType)
+        public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType)
         {
             return processor.GetImageCacheTag(item, imageType, 0);
         }
         
-        public static Guid? GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType, int imageIndex)
+        public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType, int imageIndex)
         {
             var imageInfo = item.GetImageInfo(imageType, imageIndex);
 

+ 2 - 2
MediaBrowser.Controller/Library/IUserManager.cs

@@ -1,5 +1,5 @@
-using MediaBrowser.Common.Events;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Events;
 using System;
 using System.Collections.Generic;
 using System.Threading;

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

@@ -34,6 +34,6 @@ namespace MediaBrowser.Controller.Persistence
         /// <param name="userId">The user id.</param>
         /// <param name="client">The client.</param>
         /// <returns>Task{DisplayPreferences}.</returns>
-        DisplayPreferences GetDisplayPreferences(Guid displayPreferencesId, Guid userId, string client);
+        DisplayPreferences GetDisplayPreferences(string displayPreferencesId, Guid userId, string client);
     }
 }

+ 0 - 8
MediaBrowser.Controller/Session/ISessionController.cs

@@ -19,14 +19,6 @@ namespace MediaBrowser.Controller.Session
         /// <value><c>true</c> if this instance is session active; otherwise, <c>false</c>.</value>
         bool IsSessionActive { get; }
 
-        /// <summary>
-        /// Sends the message command.
-        /// </summary>
-        /// <param name="command">The command.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken);
-
         /// <summary>
         /// Sends the play command.
         /// </summary>

+ 2 - 4
MediaBrowser.Dlna/Didl/DidlBuilder.cs

@@ -623,9 +623,7 @@ namespace MediaBrowser.Dlna.Didl
 
             try
             {
-                var guid = _imageProcessor.GetImageCacheTag(item, ImageType.Primary);
-
-                tag = guid.HasValue ? guid.Value.ToString("N") : null;
+                tag = _imageProcessor.GetImageCacheTag(item, ImageType.Primary);
             }
             catch
             {
@@ -712,7 +710,7 @@ namespace MediaBrowser.Dlna.Didl
                         Height = height.Value,
                         Width = width.Value
 
-                    }, maxWidth: maxWidth, maxHeight: maxHeight);
+                    }, null, null, maxWidth, maxHeight);
 
                     width = Convert.ToInt32(newSize.Width);
                     height = Convert.ToInt32(newSize.Height);

+ 0 - 5
MediaBrowser.Dlna/PlayTo/DlnaController.cs

@@ -355,11 +355,6 @@ namespace MediaBrowser.Dlna.PlayTo
             return Task.FromResult(true);
         }
 
-        public Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken)
-        {
-            return Task.FromResult(true);
-        }
-
         #endregion
 
         #region Playlist

+ 3 - 0
MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj

@@ -278,6 +278,9 @@
     <Compile Include="..\MediaBrowser.Model\Entities\VirtualFolderInfo.cs">
       <Link>Entities\VirtualFolderInfo.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Events\GenericEventArgs.cs">
+      <Link>Events\GenericEventArgs.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\FileOrganization\FileOrganizationQuery.cs">
       <Link>FileOrganization\FileOrganizationQuery.cs</Link>
     </Compile>

+ 3 - 0
MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj

@@ -265,6 +265,9 @@
     <Compile Include="..\MediaBrowser.Model\Entities\VirtualFolderInfo.cs">
       <Link>Entities\VirtualFolderInfo.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Events\GenericEventArgs.cs">
+      <Link>Events\GenericEventArgs.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\FileOrganization\FileOrganizationQuery.cs">
       <Link>FileOrganization\FileOrganizationQuery.cs</Link>
     </Compile>

+ 35 - 3
MediaBrowser.Model/ApiClient/IApiClient.cs

@@ -138,7 +138,7 @@ namespace MediaBrowser.Model.ApiClient
         /// <param name="notificationIdList">The notification id list.</param>
         /// <param name="isRead">if set to <c>true</c> [is read].</param>
         /// <returns>Task.</returns>
-        Task MarkNotificationsRead(string userId, IEnumerable<Guid> notificationIdList, bool isRead);
+        Task MarkNotificationsRead(string userId, IEnumerable<string> notificationIdList, bool isRead);
 
         /// <summary>
         /// Gets the notifications summary.
@@ -447,7 +447,7 @@ namespace MediaBrowser.Model.ApiClient
         /// <param name="id">The id.</param>
         /// <returns>Task{TaskInfo}.</returns>
         /// <exception cref="ArgumentNullException">id</exception>
-        Task<TaskInfo> GetScheduledTaskAsync(Guid id);
+        Task<TaskInfo> GetScheduledTaskAsync(string id);
 
         /// <summary>
         /// Gets a user by id
@@ -581,6 +581,38 @@ namespace MediaBrowser.Model.ApiClient
         /// <returns>Task.</returns>
         Task SendCommandAsync(string sessionId, GeneralCommand command);
 
+        /// <summary>
+        /// Sends the string.
+        /// </summary>
+        /// <param name="sessionId">The session identifier.</param>
+        /// <param name="text">The text.</param>
+        /// <returns>Task.</returns>
+        Task SendString(string sessionId, string text);
+
+        /// <summary>
+        /// Sets the volume.
+        /// </summary>
+        /// <param name="sessionId">The session identifier.</param>
+        /// <param name="volume">The volume.</param>
+        /// <returns>Task.</returns>
+        Task SetVolume(string sessionId, int volume);
+
+        /// <summary>
+        /// Sets the index of the audio stream.
+        /// </summary>
+        /// <param name="sessionId">The session identifier.</param>
+        /// <param name="volume">The volume.</param>
+        /// <returns>Task.</returns>
+        Task SetAudioStreamIndex(string sessionId, int? volume);
+
+        /// <summary>
+        /// Sets the index of the subtitle stream.
+        /// </summary>
+        /// <param name="sessionId">The session identifier.</param>
+        /// <param name="volume">The volume.</param>
+        /// <returns>Task.</returns>
+        Task SetSubtitleStreamIndex(string sessionId, int? volume);
+        
         /// <summary>
         /// Instructs the client to display a message to the user
         /// </summary>
@@ -632,7 +664,7 @@ namespace MediaBrowser.Model.ApiClient
         /// <param name="triggers">The triggers.</param>
         /// <returns>Task{RequestResult}.</returns>
         /// <exception cref="ArgumentNullException">id</exception>
-        Task UpdateScheduledTaskTriggersAsync(Guid id, TaskTriggerInfo[] triggers);
+        Task UpdateScheduledTaskTriggersAsync(string id, TaskTriggerInfo[] triggers);
 
         /// <summary>
         /// Gets the display preferences.

+ 39 - 16
MediaBrowser.Model/ApiClient/IServerEvents.cs

@@ -1,4 +1,11 @@
-using System;
+using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Events;
+using MediaBrowser.Model.Plugins;
+using MediaBrowser.Model.Session;
+using MediaBrowser.Model.Tasks;
+using MediaBrowser.Model.Updates;
+using System;
 
 namespace MediaBrowser.Model.ApiClient
 {
@@ -10,59 +17,59 @@ namespace MediaBrowser.Model.ApiClient
         /// <summary>
         /// Occurs when [user deleted].
         /// </summary>
-        event EventHandler<UserDeletedEventArgs> UserDeleted;
+        event EventHandler<GenericEventArgs<string>> UserDeleted;
         /// <summary>
         /// Occurs when [scheduled task started].
         /// </summary>
-        event EventHandler<ScheduledTaskStartedEventArgs> ScheduledTaskStarted;
+        event EventHandler<GenericEventArgs<string>> ScheduledTaskStarted;
         /// <summary>
         /// Occurs when [scheduled task ended].
         /// </summary>
-        event EventHandler<ScheduledTaskEndedEventArgs> ScheduledTaskEnded;
+        event EventHandler<GenericEventArgs<TaskResult>> ScheduledTaskEnded;
         /// <summary>
         /// Occurs when [package installing].
         /// </summary>
-        event EventHandler<PackageInstallationEventArgs> PackageInstalling;
+        event EventHandler<GenericEventArgs<InstallationInfo>> PackageInstalling;
         /// <summary>
         /// Occurs when [package installation failed].
         /// </summary>
-        event EventHandler<PackageInstallationEventArgs> PackageInstallationFailed;
+        event EventHandler<GenericEventArgs<InstallationInfo>> PackageInstallationFailed;
         /// <summary>
         /// Occurs when [package installation completed].
         /// </summary>
-        event EventHandler<PackageInstallationEventArgs> PackageInstallationCompleted;
+        event EventHandler<GenericEventArgs<InstallationInfo>> PackageInstallationCompleted;
         /// <summary>
         /// Occurs when [package installation cancelled].
         /// </summary>
-        event EventHandler<PackageInstallationEventArgs> PackageInstallationCancelled;
+        event EventHandler<GenericEventArgs<InstallationInfo>> PackageInstallationCancelled;
         /// <summary>
         /// Occurs when [user updated].
         /// </summary>
-        event EventHandler<UserUpdatedEventArgs> UserUpdated;
+        event EventHandler<GenericEventArgs<UserDto>> UserUpdated;
         /// <summary>
         /// Occurs when [plugin uninstalled].
         /// </summary>
-        event EventHandler<PluginUninstallEventArgs> PluginUninstalled;
+        event EventHandler<GenericEventArgs<PluginInfo>> PluginUninstalled;
         /// <summary>
         /// Occurs when [library changed].
         /// </summary>
-        event EventHandler<LibraryChangedEventArgs> LibraryChanged;
+        event EventHandler<GenericEventArgs<LibraryUpdateInfo>> LibraryChanged;
         /// <summary>
         /// Occurs when [browse command].
         /// </summary>
-        event EventHandler<BrowseRequestEventArgs> BrowseCommand;
+        event EventHandler<GenericEventArgs<BrowseRequest>> BrowseCommand;
         /// <summary>
         /// Occurs when [play command].
         /// </summary>
-        event EventHandler<PlayRequestEventArgs> PlayCommand;
+        event EventHandler<GenericEventArgs<PlayRequest>> PlayCommand;
         /// <summary>
         /// Occurs when [playstate command].
         /// </summary>
-        event EventHandler<PlaystateRequestEventArgs> PlaystateCommand;
+        event EventHandler<GenericEventArgs<PlaystateRequest>> PlaystateCommand;
         /// <summary>
         /// Occurs when [message command].
         /// </summary>
-        event EventHandler<MessageCommandEventArgs> MessageCommand;
+        event EventHandler<GenericEventArgs<MessageCommand>> MessageCommand;
         /// <summary>
         /// Occurs when [system command].
         /// </summary>
@@ -88,6 +95,22 @@ namespace MediaBrowser.Model.ApiClient
         /// </summary>
         event EventHandler<EventArgs> ServerShuttingDown;
         /// <summary>
+        /// Occurs when [send text command].
+        /// </summary>
+        event EventHandler<GenericEventArgs<string>> SendTextCommand;
+        /// <summary>
+        /// Occurs when [set volume command].
+        /// </summary>
+        event EventHandler<GenericEventArgs<int>> SetVolumeCommand;
+        /// <summary>
+        /// Occurs when [set audio stream index command].
+        /// </summary>
+        event EventHandler<GenericEventArgs<int>> SetAudioStreamIndexCommand;
+        /// <summary>
+        /// Occurs when [set video stream index command].
+        /// </summary>
+        event EventHandler<GenericEventArgs<int>> SetVideoStreamIndexCommand;
+        /// <summary>
         /// Occurs when [sessions updated].
         /// </summary>
         event EventHandler<SessionUpdatesEventArgs> SessionsUpdated;
@@ -98,7 +121,7 @@ namespace MediaBrowser.Model.ApiClient
         /// <summary>
         /// Occurs when [user data changed].
         /// </summary>
-        event EventHandler<UserDataChangedEventArgs> UserDataChanged;
+        event EventHandler<GenericEventArgs<UserDataChangeInfo>> UserDataChanged;
         /// <summary>
         /// Occurs when [connected].
         /// </summary>

+ 1 - 147
MediaBrowser.Model/ApiClient/ServerEventArgs.cs

@@ -1,154 +1,8 @@
-using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Plugins;
-using MediaBrowser.Model.Session;
-using MediaBrowser.Model.Tasks;
-using MediaBrowser.Model.Updates;
+using MediaBrowser.Model.Session;
 using System;
 
 namespace MediaBrowser.Model.ApiClient
 {
-    /// <summary>
-    /// Class UserDeletedEventArgs
-    /// </summary>
-    public class UserDeletedEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the id.
-        /// </summary>
-        /// <value>The id.</value>
-        public string Id { get; set; }
-    }
-
-    public class UserDataChangedEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the user.
-        /// </summary>
-        /// <value>The user.</value>
-        public UserDataChangeInfo ChangeInfo { get; set; }
-    }
-    
-    /// <summary>
-    /// Class UserUpdatedEventArgs
-    /// </summary>
-    public class UserUpdatedEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the user.
-        /// </summary>
-        /// <value>The user.</value>
-        public UserDto User { get; set; }
-    }
-
-    /// <summary>
-    /// Class ScheduledTaskStartedEventArgs
-    /// </summary>
-    public class ScheduledTaskStartedEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the name.
-        /// </summary>
-        /// <value>The name.</value>
-        public string Name { get; set; }
-    }
-
-    /// <summary>
-    /// Class ScheduledTaskEndedEventArgs
-    /// </summary>
-    public class ScheduledTaskEndedEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the result.
-        /// </summary>
-        /// <value>The result.</value>
-        public TaskResult Result { get; set; }
-    }
-
-    /// <summary>
-    /// Class PackageInstallationEventArgs
-    /// </summary>
-    public class PackageInstallationEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the installation info.
-        /// </summary>
-        /// <value>The installation info.</value>
-        public InstallationInfo InstallationInfo { get; set; }
-    }
-
-    /// <summary>
-    /// Class PluginUninstallEventArgs
-    /// </summary>
-    public class PluginUninstallEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the plugin info.
-        /// </summary>
-        /// <value>The plugin info.</value>
-        public PluginInfo PluginInfo { get; set; }
-    }
-
-    /// <summary>
-    /// Class LibraryChangedEventArgs
-    /// </summary>
-    public class LibraryChangedEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the update info.
-        /// </summary>
-        /// <value>The update info.</value>
-        public LibraryUpdateInfo UpdateInfo { get; set; }
-    }
-
-    /// <summary>
-    /// Class BrowseRequestEventArgs
-    /// </summary>
-    public class BrowseRequestEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the request.
-        /// </summary>
-        /// <value>The request.</value>
-        public BrowseRequest Request { get; set; }
-    }
-
-    /// <summary>
-    /// Class PlayRequestEventArgs
-    /// </summary>
-    public class PlayRequestEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the request.
-        /// </summary>
-        /// <value>The request.</value>
-        public PlayRequest Request { get; set; }
-    }
-
-    /// <summary>
-    /// Class PlaystateRequestEventArgs
-    /// </summary>
-    public class PlaystateRequestEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the request.
-        /// </summary>
-        /// <value>The request.</value>
-        public PlaystateRequest Request { get; set; }
-    }
-
-    /// <summary>
-    /// Class MessageCommandEventArgs
-    /// </summary>
-    public class MessageCommandEventArgs : EventArgs
-    {
-        /// <summary>
-        /// Gets or sets the request.
-        /// </summary>
-        /// <value>The request.</value>
-        public MessageCommand Request { get; set; }
-    }
-
     /// <summary>
     /// Class SystemCommandEventArgs
     /// </summary>

+ 3 - 3
MediaBrowser.Model/Configuration/MetadataOptions.cs

@@ -30,7 +30,7 @@ namespace MediaBrowser.Model.Configuration
 
         public MetadataOptions(int backdropLimit, int minBackdropWidth)
         {
-            var imageOptions = new List<ImageOption>
+            List<ImageOption> imageOptions = new List<ImageOption>
             {
                 new ImageOption
                 {
@@ -52,14 +52,14 @@ namespace MediaBrowser.Model.Configuration
 
         public int GetLimit(ImageType type)
         {
-            var option = ImageOptions.FirstOrDefault(i => i.Type == type);
+            ImageOption option = ImageOptions.FirstOrDefault(i => i.Type == type);
 
             return option == null ? 1 : option.Limit;
         }
 
         public int GetMinWidth(ImageType type)
         {
-            var option = ImageOptions.FirstOrDefault(i => i.Type == type);
+            ImageOption option = ImageOptions.FirstOrDefault(i => i.Type == type);
 
             return option == null ? 0 : option.MinWidth;
         }

+ 2 - 3
MediaBrowser.Model/Dlna/MediaFormatProfileResolver.cs

@@ -1,7 +1,6 @@
-using System;
+using MediaBrowser.Model.MediaInfo;
+using System;
 using System.Collections.Generic;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.MediaInfo;
 
 namespace MediaBrowser.Model.Dlna
 {

+ 59 - 59
MediaBrowser.Model/Dlna/StreamBuilder.cs

@@ -16,22 +16,22 @@ namespace MediaBrowser.Model.Dlna
         {
             ValidateAudioInput(options);
 
-            var mediaSources = options.MediaSources;
+            List<MediaSourceInfo> mediaSources = options.MediaSources;
 
             // If the client wants a specific media soure, filter now
             if (!string.IsNullOrEmpty(options.MediaSourceId))
             {
                 // Avoid implicitly captured closure
-                var mediaSourceId = options.MediaSourceId;
+                string mediaSourceId = options.MediaSourceId;
 
                 mediaSources = mediaSources
                     .Where(i => string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase))
                     .ToList();
             }
 
-            var streams = mediaSources.Select(i => BuildAudioItem(i, options)).ToList();
+            List<StreamInfo> streams = mediaSources.Select(i => BuildAudioItem(i, options)).ToList();
 
-            foreach (var stream in streams)
+            foreach (StreamInfo stream in streams)
             {
                 stream.DeviceId = options.DeviceId;
                 stream.DeviceProfileId = options.Profile.Id;
@@ -44,22 +44,22 @@ namespace MediaBrowser.Model.Dlna
         {
             ValidateInput(options);
 
-            var mediaSources = options.MediaSources;
+            List<MediaSourceInfo> mediaSources = options.MediaSources;
 
             // If the client wants a specific media soure, filter now
             if (!string.IsNullOrEmpty(options.MediaSourceId))
             {
                 // Avoid implicitly captured closure
-                var mediaSourceId = options.MediaSourceId;
+                string mediaSourceId = options.MediaSourceId;
 
                 mediaSources = mediaSources
                     .Where(i => string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase))
                     .ToList();
             }
 
-            var streams = mediaSources.Select(i => BuildVideoItem(i, options)).ToList();
+            List<StreamInfo> streams = mediaSources.Select(i => BuildVideoItem(i, options)).ToList();
 
-            foreach (var stream in streams)
+            foreach (StreamInfo stream in streams)
             {
                 stream.DeviceId = options.DeviceId;
                 stream.DeviceProfileId = options.Profile.Id;
@@ -78,7 +78,7 @@ namespace MediaBrowser.Model.Dlna
 
         private StreamInfo BuildAudioItem(MediaSourceInfo item, AudioOptions options)
         {
-            var playlistItem = new StreamInfo
+            StreamInfo playlistItem = new StreamInfo
             {
                 ItemId = options.ItemId,
                 MediaType = DlnaProfileType.Audio,
@@ -86,30 +86,30 @@ namespace MediaBrowser.Model.Dlna
                 RunTimeTicks = item.RunTimeTicks
             };
 
-            var maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate;
+            int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate;
 
-            var audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio);
+            MediaStream audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio);
 
             // Honor the max bitrate setting
             if (IsAudioEligibleForDirectPlay(item, maxBitrateSetting))
             {
-                var directPlay = options.Profile.DirectPlayProfiles
+                DirectPlayProfile directPlay = options.Profile.DirectPlayProfiles
                     .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsAudioDirectPlaySupported(i, item, audioStream));
 
                 if (directPlay != null)
                 {
-                    var audioCodec = audioStream == null ? null : audioStream.Codec;
+                    string audioCodec = audioStream == null ? null : audioStream.Codec;
 
                     // Make sure audio codec profiles are satisfied
                     if (!string.IsNullOrEmpty(audioCodec))
                     {
-                        var conditionProcessor = new ConditionProcessor();
+                        ConditionProcessor conditionProcessor = new ConditionProcessor();
 
-                        var conditions = options.Profile.CodecProfiles.Where(i => i.Type == CodecType.Audio && i.ContainsCodec(audioCodec))
+                        IEnumerable<ProfileCondition> conditions = options.Profile.CodecProfiles.Where(i => i.Type == CodecType.Audio && i.ContainsCodec(audioCodec))
                                 .SelectMany(i => i.Conditions);
 
-                        var audioChannels = audioStream == null ? null : audioStream.Channels;
-                        var audioBitrate = audioStream == null ? null : audioStream.BitRate;
+                        int? audioChannels = audioStream.Channels;
+                        int? audioBitrate = audioStream.BitRate;
 
                         if (conditions.All(c => conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate)))
                         {
@@ -122,7 +122,7 @@ namespace MediaBrowser.Model.Dlna
                 }
             }
 
-            var transcodingProfile = options.Profile.TranscodingProfiles
+            TranscodingProfile transcodingProfile = options.Profile.TranscodingProfiles
                 .FirstOrDefault(i => i.Type == playlistItem.MediaType);
 
             if (transcodingProfile != null)
@@ -134,7 +134,7 @@ namespace MediaBrowser.Model.Dlna
                 playlistItem.AudioCodec = transcodingProfile.AudioCodec;
                 playlistItem.Protocol = transcodingProfile.Protocol;
 
-                var audioTranscodingConditions = options.Profile.CodecProfiles
+                IEnumerable<ProfileCondition> audioTranscodingConditions = options.Profile.CodecProfiles
                     .Where(i => i.Type == CodecType.Audio && i.ContainsCodec(transcodingProfile.AudioCodec))
                     .Take(1)
                     .SelectMany(i => i.Conditions);
@@ -144,7 +144,7 @@ namespace MediaBrowser.Model.Dlna
                 // Honor requested max channels
                 if (options.MaxAudioChannels.HasValue)
                 {
-                    var currentValue = playlistItem.MaxAudioChannels ?? options.MaxAudioChannels.Value;
+                    int currentValue = playlistItem.MaxAudioChannels ?? options.MaxAudioChannels.Value;
 
                     playlistItem.MaxAudioChannels = Math.Min(options.MaxAudioChannels.Value, currentValue);
                 }
@@ -152,7 +152,7 @@ namespace MediaBrowser.Model.Dlna
                 // Honor requested max bitrate
                 if (maxBitrateSetting.HasValue)
                 {
-                    var currentValue = playlistItem.AudioBitrate ?? maxBitrateSetting.Value;
+                    int currentValue = playlistItem.AudioBitrate ?? maxBitrateSetting.Value;
 
                     playlistItem.AudioBitrate = Math.Min(maxBitrateSetting.Value, currentValue);
                 }
@@ -163,7 +163,7 @@ namespace MediaBrowser.Model.Dlna
 
         private StreamInfo BuildVideoItem(MediaSourceInfo item, VideoOptions options)
         {
-            var playlistItem = new StreamInfo
+            StreamInfo playlistItem = new StreamInfo
             {
                 ItemId = options.ItemId,
                 MediaType = DlnaProfileType.Video,
@@ -171,15 +171,15 @@ namespace MediaBrowser.Model.Dlna
                 RunTimeTicks = item.RunTimeTicks
             };
 
-            var audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio);
-            var videoStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video);
+            MediaStream audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio);
+            MediaStream videoStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video);
 
-            var maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate;
+            int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate;
 
             if (IsEligibleForDirectPlay(item, options, maxBitrateSetting))
             {
                 // See if it can be direct played
-                var directPlay = GetVideoDirectPlayProfile(options.Profile, item, videoStream, audioStream);
+                DirectPlayProfile directPlay = GetVideoDirectPlayProfile(options.Profile, item, videoStream, audioStream);
 
                 if (directPlay != null)
                 {
@@ -191,7 +191,7 @@ namespace MediaBrowser.Model.Dlna
             }
 
             // Can't direct play, find the transcoding profile
-            var transcodingProfile = options.Profile.TranscodingProfiles
+            TranscodingProfile transcodingProfile = options.Profile.TranscodingProfiles
                 .FirstOrDefault(i => i.Type == playlistItem.MediaType);
 
             if (transcodingProfile != null)
@@ -206,14 +206,14 @@ namespace MediaBrowser.Model.Dlna
                 playlistItem.AudioStreamIndex = options.AudioStreamIndex;
                 playlistItem.SubtitleStreamIndex = options.SubtitleStreamIndex;
 
-                var videoTranscodingConditions = options.Profile.CodecProfiles
+                IEnumerable<ProfileCondition> videoTranscodingConditions = options.Profile.CodecProfiles
                     .Where(i => i.Type == CodecType.Video && i.ContainsCodec(transcodingProfile.VideoCodec))
                     .Take(1)
                     .SelectMany(i => i.Conditions);
 
                 ApplyTranscodingConditions(playlistItem, videoTranscodingConditions);
 
-                var audioTranscodingConditions = options.Profile.CodecProfiles
+                IEnumerable<ProfileCondition> audioTranscodingConditions = options.Profile.CodecProfiles
                     .Where(i => i.Type == CodecType.VideoAudio && i.ContainsCodec(transcodingProfile.AudioCodec))
                     .Take(1)
                     .SelectMany(i => i.Conditions);
@@ -223,7 +223,7 @@ namespace MediaBrowser.Model.Dlna
                 // Honor requested max channels
                 if (options.MaxAudioChannels.HasValue)
                 {
-                    var currentValue = playlistItem.MaxAudioChannels ?? options.MaxAudioChannels.Value;
+                    int currentValue = playlistItem.MaxAudioChannels ?? options.MaxAudioChannels.Value;
 
                     playlistItem.MaxAudioChannels = Math.Min(options.MaxAudioChannels.Value, currentValue);
                 }
@@ -231,7 +231,7 @@ namespace MediaBrowser.Model.Dlna
                 // Honor requested max bitrate
                 if (options.MaxAudioTranscodingBitrate.HasValue)
                 {
-                    var currentValue = playlistItem.AudioBitrate ?? options.MaxAudioTranscodingBitrate.Value;
+                    int currentValue = playlistItem.AudioBitrate ?? options.MaxAudioTranscodingBitrate.Value;
 
                     playlistItem.AudioBitrate = Math.Min(options.MaxAudioTranscodingBitrate.Value, currentValue);
                 }
@@ -239,14 +239,14 @@ namespace MediaBrowser.Model.Dlna
                 // Honor max rate
                 if (maxBitrateSetting.HasValue)
                 {
-                    var videoBitrate = maxBitrateSetting.Value;
+                    int videoBitrate = maxBitrateSetting.Value;
 
                     if (playlistItem.AudioBitrate.HasValue)
                     {
                         videoBitrate -= playlistItem.AudioBitrate.Value;
                     }
 
-                    var currentValue = playlistItem.VideoBitrate ?? videoBitrate;
+                    int currentValue = playlistItem.VideoBitrate ?? videoBitrate;
 
                     playlistItem.VideoBitrate = Math.Min(videoBitrate, currentValue);
                 }
@@ -261,7 +261,7 @@ namespace MediaBrowser.Model.Dlna
             MediaStream audioStream)
         {
             // See if it can be direct played
-            var directPlay = profile.DirectPlayProfiles
+            DirectPlayProfile directPlay = profile.DirectPlayProfiles
                 .FirstOrDefault(i => i.Type == DlnaProfileType.Video && IsVideoDirectPlaySupported(i, mediaSource, videoStream, audioStream));
 
             if (directPlay == null)
@@ -269,28 +269,28 @@ namespace MediaBrowser.Model.Dlna
                 return null;
             }
 
-            var container = mediaSource.Container;
+            string container = mediaSource.Container;
 
-            var conditions = profile.ContainerProfiles
+            IEnumerable<ProfileCondition> conditions = profile.ContainerProfiles
                 .Where(i => i.Type == DlnaProfileType.Video && i.GetContainers().Contains(container, StringComparer.OrdinalIgnoreCase))
                 .SelectMany(i => i.Conditions);
 
-            var conditionProcessor = new ConditionProcessor();
+            ConditionProcessor conditionProcessor = new ConditionProcessor();
 
-            var width = videoStream == null ? null : videoStream.Width;
-            var height = videoStream == null ? null : videoStream.Height;
-            var bitDepth = videoStream == null ? null : videoStream.BitDepth;
-            var videoBitrate = videoStream == null ? null : videoStream.BitRate;
-            var videoLevel = videoStream == null ? null : videoStream.Level;
-            var videoProfile = videoStream == null ? null : videoStream.Profile;
-            var videoFramerate = videoStream == null ? null : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate;
+            int? width = videoStream == null ? null : videoStream.Width;
+            int? height = videoStream == null ? null : videoStream.Height;
+            int? bitDepth = videoStream == null ? null : videoStream.BitDepth;
+            int? videoBitrate = videoStream == null ? null : videoStream.BitRate;
+            double? videoLevel = videoStream == null ? null : videoStream.Level;
+            string videoProfile = videoStream == null ? null : videoStream.Profile;
+            float? videoFramerate = videoStream == null ? null : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate;
 
-            var audioBitrate = audioStream == null ? null : audioStream.BitRate;
-            var audioChannels = audioStream == null ? null : audioStream.Channels;
-            var audioProfile = audioStream == null ? null : audioStream.Profile;
+            int? audioBitrate = audioStream == null ? null : audioStream.BitRate;
+            int? audioChannels = audioStream == null ? null : audioStream.Channels;
+            string audioProfile = audioStream == null ? null : audioStream.Profile;
 
-            var timestamp = videoStream == null ? TransportStreamTimestamp.None : mediaSource.Timestamp;
-            var packetLength = videoStream == null ? null : videoStream.PacketLength;
+            TransportStreamTimestamp? timestamp = videoStream == null ? TransportStreamTimestamp.None : mediaSource.Timestamp;
+            int? packetLength = videoStream == null ? null : videoStream.PacketLength;
 
             // Check container conditions
             if (!conditions.All(i => conditionProcessor.IsVideoConditionSatisfied(i,
@@ -309,7 +309,7 @@ namespace MediaBrowser.Model.Dlna
                 return null;
             }
 
-            var videoCodec = videoStream == null ? null : videoStream.Codec;
+            string videoCodec = videoStream == null ? null : videoStream.Codec;
 
             if (string.IsNullOrEmpty(videoCodec))
             {
@@ -338,7 +338,7 @@ namespace MediaBrowser.Model.Dlna
 
             if (audioStream != null)
             {
-                var audioCodec = audioStream.Codec;
+                string audioCodec = audioStream.Codec;
 
                 if (string.IsNullOrEmpty(audioCodec))
                 {
@@ -420,10 +420,10 @@ namespace MediaBrowser.Model.Dlna
 
         private void ApplyTranscodingConditions(StreamInfo item, IEnumerable<ProfileCondition> conditions)
         {
-            foreach (var condition in conditions
+            foreach (ProfileCondition condition in conditions
                 .Where(i => !string.IsNullOrEmpty(i.Value)))
             {
-                var value = condition.Value;
+                string value = condition.Value;
 
                 switch (condition.Property)
                 {
@@ -515,7 +515,7 @@ namespace MediaBrowser.Model.Dlna
             if (profile.Container.Length > 0)
             {
                 // Check container type
-                var mediaContainer = item.Container ?? string.Empty;
+                string mediaContainer = item.Container ?? string.Empty;
                 if (!profile.GetContainers().Any(i => string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase)))
                 {
                     return false;
@@ -536,7 +536,7 @@ namespace MediaBrowser.Model.Dlna
             if (profile.Container.Length > 0)
             {
                 // Check container type
-                var mediaContainer = item.Container ?? string.Empty;
+                string mediaContainer = item.Container ?? string.Empty;
                 if (!profile.GetContainers().Any(i => string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase)))
                 {
                     return false;
@@ -544,21 +544,21 @@ namespace MediaBrowser.Model.Dlna
             }
 
             // Check video codec
-            var videoCodecs = profile.GetVideoCodecs();
+            List<string> videoCodecs = profile.GetVideoCodecs();
             if (videoCodecs.Count > 0)
             {
-                var videoCodec = videoStream == null ? null : videoStream.Codec;
+                string videoCodec = videoStream == null ? null : videoStream.Codec;
                 if (string.IsNullOrEmpty(videoCodec) || !videoCodecs.Contains(videoCodec, StringComparer.OrdinalIgnoreCase))
                 {
                     return false;
                 }
             }
 
-            var audioCodecs = profile.GetAudioCodecs();
+            List<string> audioCodecs = profile.GetAudioCodecs();
             if (audioCodecs.Count > 0)
             {
                 // Check audio codecs
-                var audioCodec = audioStream == null ? null : audioStream.Codec;
+                string audioCodec = audioStream == null ? null : audioStream.Codec;
                 if (string.IsNullOrEmpty(audioCodec) || !audioCodecs.Contains(audioCodec, StringComparer.OrdinalIgnoreCase))
                 {
                     return false;

+ 36 - 36
MediaBrowser.Model/Dlna/StreamInfo.cs

@@ -79,9 +79,9 @@ namespace MediaBrowser.Model.Dlna
                 throw new ArgumentNullException(baseUrl);
             }
 
-            var dlnaCommand = BuildDlnaParam(this);
+            string dlnaCommand = BuildDlnaParam(this);
 
-            var extension = string.IsNullOrEmpty(Container) ? string.Empty : "." + Container;
+            string extension = string.IsNullOrEmpty(Container) ? string.Empty : "." + Container;
 
             baseUrl = baseUrl.TrimEnd('/');
 
@@ -98,11 +98,11 @@ namespace MediaBrowser.Model.Dlna
             return string.Format("{0}/videos/{1}/stream{2}?{3}", baseUrl, ItemId, extension, dlnaCommand);
         }
 
+        private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
+
         private static string BuildDlnaParam(StreamInfo item)
         {
-            var usCulture = new CultureInfo("en-US");
-
-            var list = new List<string>
+            List<string> list = new List<string>
             {
                 item.DeviceProfileId ?? string.Empty,
                 item.DeviceId ?? string.Empty,
@@ -110,16 +110,16 @@ namespace MediaBrowser.Model.Dlna
                 (item.IsDirectStream).ToString().ToLower(),
                 item.VideoCodec ?? string.Empty,
                 item.AudioCodec ?? string.Empty,
-                item.AudioStreamIndex.HasValue ? item.AudioStreamIndex.Value.ToString(usCulture) : string.Empty,
-                item.SubtitleStreamIndex.HasValue ? item.SubtitleStreamIndex.Value.ToString(usCulture) : string.Empty,
-                item.VideoBitrate.HasValue ? item.VideoBitrate.Value.ToString(usCulture) : string.Empty,
-                item.AudioBitrate.HasValue ? item.AudioBitrate.Value.ToString(usCulture) : string.Empty,
-                item.MaxAudioChannels.HasValue ? item.MaxAudioChannels.Value.ToString(usCulture) : string.Empty,
-                item.MaxFramerate.HasValue ? item.MaxFramerate.Value.ToString(usCulture) : string.Empty,
-                item.MaxWidth.HasValue ? item.MaxWidth.Value.ToString(usCulture) : string.Empty,
-                item.MaxHeight.HasValue ? item.MaxHeight.Value.ToString(usCulture) : string.Empty,
-                item.StartPositionTicks.ToString(usCulture),
-                item.VideoLevel.HasValue ? item.VideoLevel.Value.ToString(usCulture) : string.Empty
+                item.AudioStreamIndex.HasValue ? item.AudioStreamIndex.Value.ToString(UsCulture) : string.Empty,
+                item.SubtitleStreamIndex.HasValue ? item.SubtitleStreamIndex.Value.ToString(UsCulture) : string.Empty,
+                item.VideoBitrate.HasValue ? item.VideoBitrate.Value.ToString(UsCulture) : string.Empty,
+                item.AudioBitrate.HasValue ? item.AudioBitrate.Value.ToString(UsCulture) : string.Empty,
+                item.MaxAudioChannels.HasValue ? item.MaxAudioChannels.Value.ToString(UsCulture) : string.Empty,
+                item.MaxFramerate.HasValue ? item.MaxFramerate.Value.ToString(UsCulture) : string.Empty,
+                item.MaxWidth.HasValue ? item.MaxWidth.Value.ToString(UsCulture) : string.Empty,
+                item.MaxHeight.HasValue ? item.MaxHeight.Value.ToString(UsCulture) : string.Empty,
+                item.StartPositionTicks.ToString(UsCulture),
+                item.VideoLevel.HasValue ? item.VideoLevel.Value.ToString(UsCulture) : string.Empty
             };
 
             return string.Format("Params={0}", string.Join(";", list.ToArray()));
@@ -134,7 +134,7 @@ namespace MediaBrowser.Model.Dlna
             {
                 if (MediaSource != null)
                 {
-                    var audioStreams = MediaSource.MediaStreams.Where(i => i.Type == MediaStreamType.Audio);
+                    IEnumerable<MediaStream> audioStreams = MediaSource.MediaStreams.Where(i => i.Type == MediaStreamType.Audio);
 
                     if (AudioStreamIndex.HasValue)
                     {
@@ -172,7 +172,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetAudioStream;
+                MediaStream stream = TargetAudioStream;
                 return stream == null ? null : stream.SampleRate;
             }
         }
@@ -184,7 +184,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetVideoStream;
+                MediaStream stream = TargetVideoStream;
                 return stream == null || !IsDirectStream ? null : stream.BitDepth;
             }
         }
@@ -196,7 +196,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetVideoStream;
+                MediaStream stream = TargetVideoStream;
                 return MaxFramerate.HasValue && !IsDirectStream
                     ? MaxFramerate
                     : stream == null ? null : stream.AverageFrameRate ?? stream.RealFrameRate;
@@ -210,7 +210,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetVideoStream;
+                MediaStream stream = TargetVideoStream;
                 return VideoLevel.HasValue && !IsDirectStream
                     ? VideoLevel
                     : stream == null ? null : stream.Level;
@@ -224,7 +224,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetVideoStream;
+                MediaStream stream = TargetVideoStream;
                 return !IsDirectStream
                     ? null
                     : stream == null ? null : stream.PacketLength;
@@ -238,7 +238,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetVideoStream;
+                MediaStream stream = TargetVideoStream;
                 return !string.IsNullOrEmpty(VideoProfile) && !IsDirectStream
                     ? VideoProfile
                     : stream == null ? null : stream.Profile;
@@ -252,7 +252,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetAudioStream;
+                MediaStream stream = TargetAudioStream;
                 return AudioBitrate.HasValue && !IsDirectStream
                     ? AudioBitrate
                     : stream == null ? null : stream.BitRate;
@@ -266,8 +266,8 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetAudioStream;
-                var streamChannels = stream == null ? null : stream.Channels;
+                MediaStream stream = TargetAudioStream;
+                int? streamChannels = stream == null ? null : stream.Channels;
 
                 return MaxAudioChannels.HasValue && !IsDirectStream
                     ? (streamChannels.HasValue ? Math.Min(MaxAudioChannels.Value, streamChannels.Value) : MaxAudioChannels.Value)
@@ -282,7 +282,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetAudioStream;
+                MediaStream stream = TargetAudioStream;
 
                 return IsDirectStream
                  ? (stream == null ? null : stream.Codec)
@@ -304,10 +304,10 @@ namespace MediaBrowser.Model.Dlna
 
                 if (RunTimeTicks.HasValue)
                 {
-                    var totalBitrate = TargetTotalBitrate;
+                    int? totalBitrate = TargetTotalBitrate;
 
                     return totalBitrate.HasValue ?
-                        Convert.ToInt64(totalBitrate * TimeSpan.FromTicks(RunTimeTicks.Value).TotalSeconds) :
+                        Convert.ToInt64(totalBitrate.Value * TimeSpan.FromTicks(RunTimeTicks.Value).TotalSeconds) :
                         (long?)null;
                 }
 
@@ -319,7 +319,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var stream = TargetVideoStream;
+                MediaStream stream = TargetVideoStream;
 
                 return VideoBitrate.HasValue && !IsDirectStream
                     ? VideoBitrate
@@ -331,7 +331,7 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var defaultValue = string.Equals(Container, "m2ts", StringComparison.OrdinalIgnoreCase)
+                TransportStreamTimestamp defaultValue = string.Equals(Container, "m2ts", StringComparison.OrdinalIgnoreCase)
                     ? TransportStreamTimestamp.Valid
                     : TransportStreamTimestamp.None;
 
@@ -353,17 +353,17 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var videoStream = TargetVideoStream;
+                MediaStream videoStream = TargetVideoStream;
 
                 if (videoStream != null && videoStream.Width.HasValue && videoStream.Height.HasValue)
                 {
-                    var size = new ImageSize
+                    ImageSize size = new ImageSize
                     {
                         Width = videoStream.Width.Value,
                         Height = videoStream.Height.Value
                     };
 
-                    var newSize = DrawingUtils.Resize(size,
+                    ImageSize newSize = DrawingUtils.Resize(size,
                         null,
                         null,
                         MaxWidth,
@@ -380,17 +380,17 @@ namespace MediaBrowser.Model.Dlna
         {
             get
             {
-                var videoStream = TargetVideoStream;
+                MediaStream videoStream = TargetVideoStream;
 
                 if (videoStream != null && videoStream.Width.HasValue && videoStream.Height.HasValue)
                 {
-                    var size = new ImageSize
+                    ImageSize size = new ImageSize
                     {
                         Width = videoStream.Width.Value,
                         Height = videoStream.Height.Value
                     };
 
-                    var newSize = DrawingUtils.Resize(size,
+                    ImageSize newSize = DrawingUtils.Resize(size,
                         null,
                         null,
                         MaxWidth,

+ 27 - 8
MediaBrowser.Model/Drawing/DrawingUtils.cs

@@ -16,7 +16,12 @@ namespace MediaBrowser.Model.Drawing
         /// <returns>ImageSize.</returns>
         public static ImageSize Scale(double currentWidth, double currentHeight, double scaleFactor)
         {
-            return Scale(new ImageSize { Width = currentWidth, Height = currentHeight }, scaleFactor);
+            return Scale(new ImageSize
+            {
+                Width = currentWidth, 
+                Height = currentHeight
+
+            }, scaleFactor);
         }
 
         /// <summary>
@@ -29,7 +34,7 @@ namespace MediaBrowser.Model.Drawing
         {
             var newWidth = size.Width * scaleFactor;
 
-            return Resize(size.Width, size.Height, newWidth);
+            return Resize(size.Width, size.Height, newWidth, null, null, null);
         }
 
         /// <summary>
@@ -42,9 +47,19 @@ namespace MediaBrowser.Model.Drawing
         /// <param name="maxWidth">A max fixed width, if desired</param>
         /// <param name="maxHeight">A max fixed height, if desired</param>
         /// <returns>ImageSize.</returns>
-        public static ImageSize Resize(double currentWidth, double currentHeight, double? width = null, double? height = null, double? maxWidth = null, double? maxHeight = null)
+        public static ImageSize Resize(double currentWidth, 
+            double currentHeight, 
+            double? width, 
+            double? height, 
+            double? maxWidth,
+            double? maxHeight)
         {
-            return Resize(new ImageSize { Width = currentWidth, Height = currentHeight }, width, height, maxWidth, maxHeight);
+            return Resize(new ImageSize
+            {
+                Width = currentWidth, 
+                Height = currentHeight
+
+            }, width, height, maxWidth, maxHeight);
         }
 
         /// <summary>
@@ -56,7 +71,11 @@ namespace MediaBrowser.Model.Drawing
         /// <param name="maxWidth">A max fixed width, if desired</param>
         /// <param name="maxHeight">A max fixed height, if desired</param>
         /// <returns>A new size object</returns>
-        public static ImageSize Resize(ImageSize size, double? width = null, double? height = null, double? maxWidth = null, double? maxHeight = null)
+        public static ImageSize Resize(ImageSize size, 
+            double? width, 
+            double? height, 
+            double? maxWidth, 
+            double? maxHeight)
         {
             double newWidth = size.Width;
             double newHeight = size.Height;
@@ -79,13 +98,13 @@ namespace MediaBrowser.Model.Drawing
                 newWidth = width.Value;
             }
 
-            if (maxHeight.HasValue && maxHeight < newHeight)
+            if (maxHeight.HasValue && maxHeight.Value < newHeight)
             {
                 newWidth = GetNewWidth(newHeight, newWidth, maxHeight.Value);
                 newHeight = maxHeight.Value;
             }
 
-            if (maxWidth.HasValue && maxWidth < newWidth)
+            if (maxWidth.HasValue && maxWidth.Value < newWidth)
             {
                 newHeight = GetNewHeight(newHeight, newWidth, maxWidth.Value);
                 newWidth = maxWidth.Value;
@@ -186,7 +205,7 @@ namespace MediaBrowser.Model.Drawing
         {
             if (!string.IsNullOrEmpty(value))
             {
-                var parts = value.Split('-');
+                string[] parts = value.Split('-');
 
                 if (parts.Length == 2)
                 {

+ 10 - 10
MediaBrowser.Model/Dto/BaseItemDto.cs

@@ -311,7 +311,7 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the parent backdrop image tags.
         /// </summary>
         /// <value>The parent backdrop image tags.</value>
-        public List<Guid> ParentBackdropImageTags { get; set; }
+        public List<string> ParentBackdropImageTags { get; set; }
 
         /// <summary>
         /// Gets or sets the local trailer count.
@@ -466,13 +466,13 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the album image tag.
         /// </summary>
         /// <value>The album image tag.</value>
-        public Guid? AlbumPrimaryImageTag { get; set; }
+        public string AlbumPrimaryImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the series primary image tag.
         /// </summary>
         /// <value>The series primary image tag.</value>
-        public Guid? SeriesPrimaryImageTag { get; set; }
+        public string SeriesPrimaryImageTag { get; set; }
         
         /// <summary>
         /// Gets or sets the album artist.
@@ -529,25 +529,25 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the image tags.
         /// </summary>
         /// <value>The image tags.</value>
-        public Dictionary<ImageType, Guid> ImageTags { get; set; }
+        public Dictionary<ImageType, string> ImageTags { get; set; }
 
         /// <summary>
         /// Gets or sets the backdrop image tags.
         /// </summary>
         /// <value>The backdrop image tags.</value>
-        public List<Guid> BackdropImageTags { get; set; }
+        public List<string> BackdropImageTags { get; set; }
 
         /// <summary>
         /// Gets or sets the screenshot image tags.
         /// </summary>
         /// <value>The screenshot image tags.</value>
-        public List<Guid> ScreenshotImageTags { get; set; }
+        public List<string> ScreenshotImageTags { get; set; }
 
         /// <summary>
         /// Gets or sets the parent logo image tag.
         /// </summary>
         /// <value>The parent logo image tag.</value>
-        public Guid? ParentLogoImageTag { get; set; }
+        public string ParentLogoImageTag { get; set; }
 
         /// <summary>
         /// If the item does not have a art, this will hold the Id of the Parent that has one.
@@ -559,13 +559,13 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the parent art image tag.
         /// </summary>
         /// <value>The parent art image tag.</value>
-        public Guid? ParentArtImageTag { get; set; }
+        public string ParentArtImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the series thumb image tag.
         /// </summary>
         /// <value>The series thumb image tag.</value>
-        public Guid? SeriesThumbImageTag { get; set; }
+        public string SeriesThumbImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the series studio.
@@ -583,7 +583,7 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the parent thumb image tag.
         /// </summary>
         /// <value>The parent thumb image tag.</value>
-        public Guid? ParentThumbImageTag { get; set; }
+        public string ParentThumbImageTag { get; set; }
         
         /// <summary>
         /// Gets or sets the chapters.

+ 2 - 2
MediaBrowser.Model/Dto/BaseItemPerson.cs

@@ -33,7 +33,7 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the primary image tag.
         /// </summary>
         /// <value>The primary image tag.</value>
-        public Guid? PrimaryImageTag { get; set; }
+        public string PrimaryImageTag { get; set; }
 
         /// <summary>
         /// Gets a value indicating whether this instance has primary image.
@@ -44,7 +44,7 @@ namespace MediaBrowser.Model.Dto
         {
             get
             {
-                return PrimaryImageTag.HasValue;
+                return PrimaryImageTag != null;
             }
         }
 

+ 2 - 2
MediaBrowser.Model/Dto/ChapterInfoDto.cs

@@ -27,7 +27,7 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the image tag.
         /// </summary>
         /// <value>The image tag.</value>
-        public Guid? ImageTag { get; set; }
+        public string ImageTag { get; set; }
 
         /// <summary>
         /// Gets a value indicating whether this instance has image.
@@ -36,7 +36,7 @@ namespace MediaBrowser.Model.Dto
         [IgnoreDataMember]
         public bool HasImage
         {
-            get { return ImageTag.HasValue; }
+            get { return ImageTag != null; }
         }
 
         public event PropertyChangedEventHandler PropertyChanged;

+ 1 - 1
MediaBrowser.Model/Dto/ImageInfo.cs

@@ -23,7 +23,7 @@ namespace MediaBrowser.Model.Dto
         /// <summary>
         /// The image tag
         /// </summary>
-        public Guid ImageTag;
+        public string ImageTag;
 
         /// <summary>
         /// Gets or sets the path.

+ 1 - 1
MediaBrowser.Model/Dto/ImageOptions.cs

@@ -56,7 +56,7 @@ namespace MediaBrowser.Model.Dto
         /// If set this will result in strong, unconditional response caching
         /// </summary>
         /// <value>The hash.</value>
-        public Guid? Tag { get; set; }
+        public string Tag { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether [crop whitespace].

+ 1 - 1
MediaBrowser.Model/Dto/ItemByNameCounts.cs

@@ -7,7 +7,7 @@ namespace MediaBrowser.Model.Dto
     /// </summary>
     public class ItemByNameCounts
     {
-        public Guid UserId { get; set; }
+        public string UserId { get; set; }
 
         /// <summary>
         /// Gets or sets the total count.

+ 2 - 2
MediaBrowser.Model/Dto/StudioDto.cs

@@ -21,7 +21,7 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the primary image tag.
         /// </summary>
         /// <value>The primary image tag.</value>
-        public Guid? PrimaryImageTag { get; set; }
+        public string PrimaryImageTag { get; set; }
 
         /// <summary>
         /// Gets a value indicating whether this instance has primary image.
@@ -32,7 +32,7 @@ namespace MediaBrowser.Model.Dto
         {
             get
             {
-                return PrimaryImageTag.HasValue;
+                return PrimaryImageTag != null;
             }
         }
 

+ 2 - 2
MediaBrowser.Model/Dto/UserDto.cs

@@ -28,7 +28,7 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the primary image tag.
         /// </summary>
         /// <value>The primary image tag.</value>
-        public Guid? PrimaryImageTag { get; set; }
+        public string PrimaryImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets a value indicating whether this instance has password.
@@ -73,7 +73,7 @@ namespace MediaBrowser.Model.Dto
         [IgnoreDataMember]
         public bool HasPrimaryImage
         {
-            get { return PrimaryImageTag.HasValue; }
+            get { return PrimaryImageTag != null; }
         }
 
         /// <summary>

+ 5 - 5
MediaBrowser.Model/Entities/BaseItemInfo.cs

@@ -46,7 +46,7 @@ namespace MediaBrowser.Model.Entities
         /// Gets or sets the primary image tag.
         /// </summary>
         /// <value>The primary image tag.</value>
-        public Guid? PrimaryImageTag { get; set; }
+        public string PrimaryImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the primary image item identifier.
@@ -58,7 +58,7 @@ namespace MediaBrowser.Model.Entities
         /// Gets or sets the logo image tag.
         /// </summary>
         /// <value>The logo image tag.</value>
-        public Guid? LogoImageTag { get; set; }
+        public string LogoImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the logo item identifier.
@@ -70,7 +70,7 @@ namespace MediaBrowser.Model.Entities
         /// Gets or sets the thumb image tag.
         /// </summary>
         /// <value>The thumb image tag.</value>
-        public Guid? ThumbImageTag { get; set; }
+        public string ThumbImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the thumb item identifier.
@@ -82,7 +82,7 @@ namespace MediaBrowser.Model.Entities
         /// Gets or sets the thumb image tag.
         /// </summary>
         /// <value>The thumb image tag.</value>
-        public Guid? BackdropImageTag { get; set; }
+        public string BackdropImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the thumb item identifier.
@@ -163,7 +163,7 @@ namespace MediaBrowser.Model.Entities
         [IgnoreDataMember]
         public bool HasPrimaryImage
         {
-            get { return PrimaryImageTag.HasValue; }
+            get { return PrimaryImageTag != null; }
         }
 
         public BaseItemInfo()

+ 2 - 2
MediaBrowser.Model/Entities/DisplayPreferences.cs

@@ -36,7 +36,7 @@ namespace MediaBrowser.Model.Entities
         /// Gets or sets the user id.
         /// </summary>
         /// <value>The user id.</value>
-        public Guid Id { get; set; }
+        public string Id { get; set; }
         /// <summary>
         /// Gets or sets the type of the view.
         /// </summary>
@@ -105,7 +105,7 @@ namespace MediaBrowser.Model.Entities
         {
             var newWidth = PrimaryImageWidth / ImageScale;
 
-            var size = DrawingUtils.Resize(PrimaryImageWidth, PrimaryImageHeight, newWidth);
+            var size = DrawingUtils.Resize(PrimaryImageWidth, PrimaryImageHeight, newWidth, null, null, null);
 
             PrimaryImageWidth = Convert.ToInt32(size.Width);
             PrimaryImageHeight = Convert.ToInt32(size.Height);

+ 10 - 10
MediaBrowser.Model/Entities/LibraryUpdateInfo.cs

@@ -12,41 +12,41 @@ namespace MediaBrowser.Model.Entities
         /// Gets or sets the folders added to.
         /// </summary>
         /// <value>The folders added to.</value>
-        public List<Guid> FoldersAddedTo { get; set; }
+        public List<string> FoldersAddedTo { get; set; }
         /// <summary>
         /// Gets or sets the folders removed from.
         /// </summary>
         /// <value>The folders removed from.</value>
-        public List<Guid> FoldersRemovedFrom { get; set; }
+        public List<string> FoldersRemovedFrom { get; set; }
 
         /// <summary>
         /// Gets or sets the items added.
         /// </summary>
         /// <value>The items added.</value>
-        public List<Guid> ItemsAdded { get; set; }
+        public List<string> ItemsAdded { get; set; }
 
         /// <summary>
         /// Gets or sets the items removed.
         /// </summary>
         /// <value>The items removed.</value>
-        public List<Guid> ItemsRemoved { get; set; }
+        public List<string> ItemsRemoved { get; set; }
 
         /// <summary>
         /// Gets or sets the items updated.
         /// </summary>
         /// <value>The items updated.</value>
-        public List<Guid> ItemsUpdated { get; set; }
+        public List<string> ItemsUpdated { get; set; }
 
         /// <summary>
         /// Initializes a new instance of the <see cref="LibraryUpdateInfo"/> class.
         /// </summary>
         public LibraryUpdateInfo()
         {
-            FoldersAddedTo = new List<Guid>();
-            FoldersRemovedFrom = new List<Guid>();
-            ItemsAdded = new List<Guid>();
-            ItemsRemoved = new List<Guid>();
-            ItemsUpdated = new List<Guid>();
+            FoldersAddedTo = new List<string>();
+            FoldersRemovedFrom = new List<string>();
+            ItemsAdded = new List<string>();
+            ItemsRemoved = new List<string>();
+            ItemsUpdated = new List<string>();
         }
     }
 }

+ 1 - 1
MediaBrowser.Common/Events/GenericEventArgs.cs → MediaBrowser.Model/Events/GenericEventArgs.cs

@@ -1,6 +1,6 @@
 using System;
 
-namespace MediaBrowser.Common.Events
+namespace MediaBrowser.Model.Events
 {
     /// <summary>
     /// Provides a generic EventArgs subclass that can hold any kind of object

+ 2 - 2
MediaBrowser.Model/LiveTv/ChannelInfoDto.cs

@@ -39,7 +39,7 @@ namespace MediaBrowser.Model.LiveTv
         /// Gets or sets the image tags.
         /// </summary>
         /// <value>The image tags.</value>
-        public Dictionary<ImageType, Guid> ImageTags { get; set; }
+        public Dictionary<ImageType, string> ImageTags { get; set; }
 
         /// <summary>
         /// Gets or sets the number.
@@ -113,7 +113,7 @@ namespace MediaBrowser.Model.LiveTv
 
         public ChannelInfoDto()
         {
-            ImageTags = new Dictionary<ImageType, Guid>();
+            ImageTags = new Dictionary<ImageType, string>();
             MediaSources = new List<MediaSourceInfo>();
         }
 

+ 3 - 3
MediaBrowser.Model/LiveTv/ProgramInfoDto.cs

@@ -45,7 +45,7 @@ namespace MediaBrowser.Model.LiveTv
         /// Gets or sets the channel primary image tag.
         /// </summary>
         /// <value>The channel primary image tag.</value>
-        public Guid? ChannelPrimaryImageTag { get; set; }
+        public string ChannelPrimaryImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the play access.
@@ -136,7 +136,7 @@ namespace MediaBrowser.Model.LiveTv
         /// Gets or sets the image tags.
         /// </summary>
         /// <value>The image tags.</value>
-        public Dictionary<ImageType, Guid> ImageTags { get; set; }
+        public Dictionary<ImageType, string> ImageTags { get; set; }
         
         /// <summary>
         /// Gets or sets the user data.
@@ -211,7 +211,7 @@ namespace MediaBrowser.Model.LiveTv
         public ProgramInfoDto()
         {
             Genres = new List<string>();
-            ImageTags = new Dictionary<ImageType, Guid>();
+            ImageTags = new Dictionary<ImageType, string>();
         }
 
         public event PropertyChangedEventHandler PropertyChanged;

+ 3 - 3
MediaBrowser.Model/LiveTv/RecordingInfoDto.cs

@@ -50,7 +50,7 @@ namespace MediaBrowser.Model.LiveTv
         /// Gets or sets the channel primary image tag.
         /// </summary>
         /// <value>The channel primary image tag.</value>
-        public Guid? ChannelPrimaryImageTag { get; set; }
+        public string ChannelPrimaryImageTag { get; set; }
 
         /// <summary>
         /// ChannelName of the recording.
@@ -224,7 +224,7 @@ namespace MediaBrowser.Model.LiveTv
         /// Gets or sets the image tags.
         /// </summary>
         /// <value>The image tags.</value>
-        public Dictionary<ImageType, Guid> ImageTags { get; set; }
+        public Dictionary<ImageType, string> ImageTags { get; set; }
         
         /// <summary>
         /// Gets or sets the user data.
@@ -253,7 +253,7 @@ namespace MediaBrowser.Model.LiveTv
         public RecordingInfoDto()
         {
             Genres = new List<string>();
-            ImageTags = new Dictionary<ImageType, Guid>();
+            ImageTags = new Dictionary<ImageType, string>();
             MediaSources = new List<MediaSourceInfo>();
         }
 

+ 2 - 2
MediaBrowser.Model/LiveTv/SeriesTimerInfoDto.cs

@@ -43,7 +43,7 @@ namespace MediaBrowser.Model.LiveTv
         /// Gets or sets the image tags.
         /// </summary>
         /// <value>The image tags.</value>
-        public Dictionary<ImageType, Guid> ImageTags { get; set; }
+        public Dictionary<ImageType, string> ImageTags { get; set; }
 
         /// <summary>
         /// Gets a value indicating whether this instance has primary image.
@@ -57,7 +57,7 @@ namespace MediaBrowser.Model.LiveTv
 
         public SeriesTimerInfoDto()
         {
-            ImageTags = new Dictionary<ImageType, Guid>();
+            ImageTags = new Dictionary<ImageType, string>();
             Days = new List<DayOfWeek>();
         }
     }

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -97,6 +97,7 @@
     <Compile Include="Dto\RecommendationDto.cs" />
     <Compile Include="Dto\MediaVersionInfo.cs" />
     <Compile Include="Entities\PackageReviewInfo.cs" />
+    <Compile Include="Events\GenericEventArgs.cs" />
     <Compile Include="FileOrganization\FileOrganizationResult.cs" />
     <Compile Include="FileOrganization\FileOrganizationQuery.cs" />
     <Compile Include="Library\PlayAccess.cs" />

+ 3 - 3
MediaBrowser.Model/Search/SearchHint.cs

@@ -47,13 +47,13 @@ namespace MediaBrowser.Model.Search
         /// Gets or sets the image tag.
         /// </summary>
         /// <value>The image tag.</value>
-        public Guid? PrimaryImageTag { get; set; }
+        public string PrimaryImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the thumb image tag.
         /// </summary>
         /// <value>The thumb image tag.</value>
-        public Guid? ThumbImageTag { get; set; }
+        public string ThumbImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the thumb image item identifier.
@@ -65,7 +65,7 @@ namespace MediaBrowser.Model.Search
         /// Gets or sets the backdrop image tag.
         /// </summary>
         /// <value>The backdrop image tag.</value>
-        public Guid? BackdropImageTag { get; set; }
+        public string BackdropImageTag { get; set; }
 
         /// <summary>
         /// Gets or sets the backdrop image item identifier.

+ 2 - 1
MediaBrowser.Model/Session/GeneralCommand.cs

@@ -49,6 +49,7 @@ namespace MediaBrowser.Model.Session
         SetSubtitleStreamIndex = 24,
         ToggleFullscreen = 25,
         DisplayContent = 26,
-        GoToSearch = 27
+        GoToSearch = 27,
+        DisplayMessage = 28
     }
 }

+ 1 - 1
MediaBrowser.Model/Session/SessionInfoDto.cs

@@ -55,7 +55,7 @@ namespace MediaBrowser.Model.Session
         /// Gets or sets the user primary image tag.
         /// </summary>
         /// <value>The user primary image tag.</value>
-        public Guid? UserPrimaryImageTag { get; set; }
+        public string UserPrimaryImageTag { get; set; }
         
         /// <summary>
         /// Gets or sets the name of the user.

+ 1 - 1
MediaBrowser.Model/Tasks/TaskInfo.cs

@@ -30,7 +30,7 @@ namespace MediaBrowser.Model.Tasks
         /// Gets or sets the id.
         /// </summary>
         /// <value>The id.</value>
-        public Guid Id { get; set; }
+        public string Id { get; set; }
 
         /// <summary>
         /// Gets or sets the last execution result.

+ 1 - 1
MediaBrowser.Model/Tasks/TaskResult.cs

@@ -35,7 +35,7 @@ namespace MediaBrowser.Model.Tasks
         /// Gets or sets the id.
         /// </summary>
         /// <value>The id.</value>
-        public Guid Id { get; set; }
+        public string Id { get; set; }
 
         /// <summary>
         /// Gets or sets the error message.

+ 1 - 1
MediaBrowser.Model/Updates/InstallationInfo.cs

@@ -11,7 +11,7 @@ namespace MediaBrowser.Model.Updates
         /// Gets or sets the id.
         /// </summary>
         /// <value>The id.</value>
-        public Guid Id { get; set; }
+        public string Id { get; set; }
 
         /// <summary>
         /// Gets or sets the name.

+ 2 - 2
MediaBrowser.Model/Updates/PackageVersionInfo.cs

@@ -47,7 +47,7 @@ namespace MediaBrowser.Model.Updates
         /// <param name="str">The STR.</param>
         /// <param name="def">The def.</param>
         /// <returns>System.String.</returns>
-        private static string ValueOrDefault(string str, string def = "")
+        private static string ValueOrDefault(string str, string def)
         {
             return string.IsNullOrEmpty(str) ? def : str;
         }
@@ -80,7 +80,7 @@ namespace MediaBrowser.Model.Updates
         /// Gets or sets the source URL.
         /// </summary>
         /// <value>The source URL.</value>
-        public Guid checksum { get; set; }
+        public string checksum { get; set; }
 
         /// <summary>
         /// Gets or sets the target filename.

+ 0 - 44
MediaBrowser.Model/Web/QueryStringDictionary.cs

@@ -122,50 +122,6 @@ namespace MediaBrowser.Model.Web
             }
         }
 
-        /// <summary>
-        /// Adds the specified name.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="value">The value.</param>
-        /// <exception cref="System.ArgumentNullException">value</exception>
-        public void Add(string name, Guid value)
-        {
-            if (value == Guid.Empty)
-            {
-                throw new ArgumentNullException("value");
-            }
-
-            Add(name, value.ToString());
-        }
-
-        /// <summary>
-        /// Adds if not empty.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="value">The value.</param>
-        public void AddIfNotEmpty(string name, Guid value)
-        {
-            if (value != Guid.Empty)
-            {
-                Add(name, value);
-            }
-
-            Add(name, value);
-        }
-
-        /// <summary>
-        /// Adds if not null.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="value">The value.</param>
-        public void AddIfNotNull(string name, Guid? value)
-        {
-            if (value.HasValue)
-            {
-                Add(name, value.Value);
-            }
-        }
-
         /// <summary>
         /// Adds the specified name.
         /// </summary>

+ 10 - 1
MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs

@@ -91,9 +91,18 @@ namespace MediaBrowser.Providers.MediaInfo
                 return false;
             }
 
+            var audioStreams = internalMediaStreams.Where(i => i.Type == MediaStreamType.Audio).ToList();
+            var defaultAudioStreams = audioStreams.Where(i => i.IsDefault).ToList();
+
+            // If none are marked as default, just take a guess
+            if (defaultAudioStreams.Count == 0)
+            {
+                defaultAudioStreams = audioStreams.Take(1).ToList();
+            }
+
             // There's already a default audio stream for this language
             if (skipIfAudioTrackMatches &&
-                internalMediaStreams.Any(i => i.Type == MediaStreamType.Audio && i.IsDefault && string.Equals(i.Language, language, StringComparison.OrdinalIgnoreCase)))
+                defaultAudioStreams.Any(i => string.Equals(i.Language, language, StringComparison.OrdinalIgnoreCase)))
             {
                 return false;
             }

+ 2 - 2
MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs

@@ -1,11 +1,11 @@
-using MediaBrowser.Common.Events;
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Security;
 using MediaBrowser.Controller.Subtitles;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Providers;
 using OpenSubtitlesHandler;

+ 1 - 0
MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs

@@ -4,6 +4,7 @@ using MediaBrowser.Common.Implementations.Configuration;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using System;

+ 4 - 4
MediaBrowser.Server.Implementations/Drawing/ImageProcessor.cs

@@ -649,7 +649,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
         /// <param name="image">The image.</param>
         /// <returns>Guid.</returns>
         /// <exception cref="System.ArgumentNullException">item</exception>
-        public Guid GetImageCacheTag(IHasImages item, ItemImageInfo image)
+        public string GetImageCacheTag(IHasImages item, ItemImageInfo image)
         {
             if (item == null)
             {
@@ -676,7 +676,7 @@ namespace MediaBrowser.Server.Implementations.Drawing
         /// <param name="imageEnhancers">The image enhancers.</param>
         /// <returns>Guid.</returns>
         /// <exception cref="System.ArgumentNullException">item</exception>
-        public Guid GetImageCacheTag(IHasImages item, ImageType imageType, string originalImagePath, DateTime dateModified, List<IImageEnhancer> imageEnhancers)
+        public string GetImageCacheTag(IHasImages item, ImageType imageType, string originalImagePath, DateTime dateModified, List<IImageEnhancer> imageEnhancers)
         {
             if (item == null)
             {
@@ -696,14 +696,14 @@ namespace MediaBrowser.Server.Implementations.Drawing
             // Optimization
             if (imageEnhancers.Count == 0)
             {
-                return (originalImagePath + dateModified.Ticks).GetMD5();
+                return (originalImagePath + dateModified.Ticks).GetMD5().ToString("N");
             }
 
             // Cache name is created with supported enhancers combined with the last config change so we pick up new config changes
             var cacheKeys = imageEnhancers.Select(i => i.GetConfigurationCacheKey(item, imageType)).ToList();
             cacheKeys.Add(originalImagePath + dateModified.Ticks);
 
-            return string.Join("|", cacheKeys.ToArray()).GetMD5();
+            return string.Join("|", cacheKeys.ToArray()).GetMD5().ToString("N");
         }
 
         /// <summary>

+ 11 - 12
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -326,7 +326,7 @@ namespace MediaBrowser.Server.Implementations.Dto
         /// </summary>
         /// <param name="item">The item.</param>
         /// <returns>List{System.String}.</returns>
-        private List<Guid> GetBackdropImageTags(BaseItem item)
+        private List<string> GetBackdropImageTags(BaseItem item)
         {
             return GetCacheTags(item, ImageType.Backdrop).ToList();
         }
@@ -336,26 +336,25 @@ namespace MediaBrowser.Server.Implementations.Dto
         /// </summary>
         /// <param name="item">The item.</param>
         /// <returns>List{Guid}.</returns>
-        private List<Guid> GetScreenshotImageTags(BaseItem item)
+        private List<string> GetScreenshotImageTags(BaseItem item)
         {
             var hasScreenshots = item as IHasScreenshots;
             if (hasScreenshots == null)
             {
-                return new List<Guid>();
+                return new List<string>();
             }
             return GetCacheTags(item, ImageType.Screenshot).ToList();
         }
 
-        private IEnumerable<Guid> GetCacheTags(BaseItem item, ImageType type)
+        private IEnumerable<string> GetCacheTags(BaseItem item, ImageType type)
         {
             return item.GetImages(type)
                 .Select(p => GetImageCacheTag(item, p))
-                .Where(i => i.HasValue)
-                .Select(i => i.Value)
+                .Where(i => i != null)
                 .ToList();
         }
 
-        private Guid? GetImageCacheTag(BaseItem item, ImageType type)
+        private string GetImageCacheTag(BaseItem item, ImageType type)
         {
             try
             {
@@ -368,7 +367,7 @@ namespace MediaBrowser.Server.Implementations.Dto
             }
         }
 
-        private Guid? GetImageCacheTag(BaseItem item, ItemImageInfo image)
+        private string GetImageCacheTag(BaseItem item, ItemImageInfo image)
         {
             try
             {
@@ -677,7 +676,7 @@ namespace MediaBrowser.Server.Implementations.Dto
                 dto.Genres = item.Genres;
             }
 
-            dto.ImageTags = new Dictionary<ImageType, Guid>();
+            dto.ImageTags = new Dictionary<ImageType, string>();
 
             // Prevent implicitly captured closure
             var currentItem = item;
@@ -685,9 +684,9 @@ namespace MediaBrowser.Server.Implementations.Dto
             {
                 var tag = GetImageCacheTag(item, image);
 
-                if (tag.HasValue)
+                if (tag != null)
                 {
-                    dto.ImageTags[image.Type] = tag.Value;
+                    dto.ImageTags[image.Type] = tag;
                 }
             }
 
@@ -1216,7 +1215,7 @@ namespace MediaBrowser.Server.Implementations.Dto
                 }
             }
 
-            var bitrate = i.TotalBitrate ?? 
+            var bitrate = i.TotalBitrate ??
                 info.MediaStreams.Where(m => m.Type != MediaStreamType.Subtitle && !string.Equals(m.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase))
                 .Select(m => m.BitRate ?? 0)
                 .Sum();

+ 5 - 5
MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs

@@ -252,15 +252,15 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
 
             return new LibraryUpdateInfo
             {
-                ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(),
+                ItemsAdded = itemsAdded.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(),
 
-                ItemsUpdated = itemsUpdated.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(),
+                ItemsUpdated = itemsUpdated.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(),
 
-                ItemsRemoved = itemsRemoved.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren, true)).Select(i => i.Id).Distinct().ToList(),
+                ItemsRemoved = itemsRemoved.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren, true)).Select(i => i.Id.ToString("N")).Distinct().ToList(),
 
-                FoldersAddedTo = foldersAddedTo.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList(),
+                FoldersAddedTo = foldersAddedTo.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList(),
 
-                FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id).Distinct().ToList()
+                FoldersRemovedFrom = foldersRemovedFrom.SelectMany(i => TranslatePhysicalItemToUserLibrary(i, user, collections, allRecursiveChildren)).Select(i => i.Id.ToString("N")).Distinct().ToList()
             };
         }
 

+ 1 - 0
MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifier.cs

@@ -11,6 +11,7 @@ using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Notifications;
 using MediaBrowser.Model.Tasks;

+ 1 - 0
MediaBrowser.Server.Implementations/EntryPoints/ServerEventNotifier.cs

@@ -9,6 +9,7 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Session;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Tasks;
 using System;
 using System.Threading;

+ 1 - 0
MediaBrowser.Server.Implementations/Library/UserManager.cs

@@ -5,6 +5,7 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Logging;
 using System;
 using System.Collections.Generic;

+ 7 - 7
MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs

@@ -241,9 +241,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
             var imageTag = GetImageTag(recording);
 
-            if (imageTag.HasValue)
+            if (imageTag != null)
             {
-                dto.ImageTags[ImageType.Primary] = imageTag.Value;
+                dto.ImageTags[ImageType.Primary] = imageTag;
             }
 
             if (user != null)
@@ -328,9 +328,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
             var imageTag = GetImageTag(info);
 
-            if (imageTag.HasValue)
+            if (imageTag != null)
             {
-                dto.ImageTags[ImageType.Primary] = imageTag.Value;
+                dto.ImageTags[ImageType.Primary] = imageTag;
             }
 
             if (currentProgram != null)
@@ -389,9 +389,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
             var imageTag = GetImageTag(item);
 
-            if (imageTag.HasValue)
+            if (imageTag != null)
             {
-                dto.ImageTags[ImageType.Primary] = imageTag.Value;
+                dto.ImageTags[ImageType.Primary] = imageTag;
             }
 
             if (user != null)
@@ -404,7 +404,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
             return dto;
         }
 
-        private Guid? GetImageTag(IHasImages info)
+        private string GetImageTag(IHasImages info)
         {
             try
             {

+ 6 - 6
MediaBrowser.Server.Implementations/Persistence/SqliteDisplayPreferencesRepository.cs

@@ -111,7 +111,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
             {
                 throw new ArgumentNullException("displayPreferences");
             }
-            if (displayPreferences.Id == Guid.Empty)
+            if (string.IsNullOrWhiteSpace(displayPreferences.Id))
             {
                 throw new ArgumentNullException("displayPreferences.Id");
             }
@@ -132,7 +132,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 {
                     cmd.CommandText = "replace into userdisplaypreferences (id, userid, client, data) values (@1, @2, @3, @4)";
 
-                    cmd.Parameters.Add(cmd, "@1", DbType.Guid).Value = displayPreferences.Id;
+                    cmd.Parameters.Add(cmd, "@1", DbType.Guid).Value = new Guid(displayPreferences.Id);
                     cmd.Parameters.Add(cmd, "@2", DbType.Guid).Value = userId;
                     cmd.Parameters.Add(cmd, "@3", DbType.String).Value = client;
                     cmd.Parameters.Add(cmd, "@4", DbType.Binary).Value = serialized;
@@ -183,9 +183,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
         /// <param name="client">The client.</param>
         /// <returns>Task{DisplayPreferences}.</returns>
         /// <exception cref="System.ArgumentNullException">item</exception>
-        public DisplayPreferences GetDisplayPreferences(Guid displayPreferencesId, Guid userId, string client)
+        public DisplayPreferences GetDisplayPreferences(string displayPreferencesId, Guid userId, string client)
         {
-            if (displayPreferencesId == Guid.Empty)
+            if (string.IsNullOrWhiteSpace(displayPreferencesId))
             {
                 throw new ArgumentNullException("displayPreferencesId");
             }
@@ -193,7 +193,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
             var cmd = _connection.CreateCommand();
             cmd.CommandText = "select data from userdisplaypreferences where id = @id and userId=@userId and client=@client";
 
-            cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = displayPreferencesId;
+            cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = new Guid(displayPreferencesId);
             cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
             cmd.Parameters.Add(cmd, "@client", DbType.String).Value = client;
 
@@ -208,7 +208,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 }
             }
 
-            return new DisplayPreferences { Id = displayPreferencesId };
+            return null;
         }
 
         /// <summary>

+ 0 - 10
MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs

@@ -56,16 +56,6 @@ namespace MediaBrowser.Server.Implementations.Roku
             return Task.FromResult(true);
         }
 
-        public Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken)
-        {
-            return SendCommand(new WebSocketMessage<MessageCommand>
-            {
-                MessageType = "MessageCommand",
-                Data = command
-
-            }, cancellationToken);
-        }
-
         public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken)
         {
             return SendCommand(new WebSocketMessage<PlayRequest>

+ 18 - 9
MediaBrowser.Server.Implementations/Session/SessionManager.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Events;
+using System.Globalization;
+using MediaBrowser.Common.Events;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Drawing;
@@ -712,12 +713,20 @@ namespace MediaBrowser.Server.Implementations.Session
 
         public Task SendMessageCommand(string controllingSessionId, string sessionId, MessageCommand command, CancellationToken cancellationToken)
         {
-            var session = GetSessionForRemoteControl(sessionId);
+            var generalCommand = new GeneralCommand
+            {
+                Name = GeneralCommandType.DisplayMessage.ToString()
+            };
 
-            var controllingSession = GetSession(controllingSessionId);
-            AssertCanControl(session, controllingSession);
+            generalCommand.Arguments["Header"] = command.Header;
+            generalCommand.Arguments["Text"] = command.Text;
 
-            return session.SessionController.SendMessageCommand(command, cancellationToken);
+            if (command.TimeoutMs.HasValue)
+            {
+                generalCommand.Arguments["TimeoutMs"] = command.TimeoutMs.Value.ToString(CultureInfo.InvariantCulture);
+            }
+
+            return SendGeneralCommand(controllingSessionId, sessionId, generalCommand, cancellationToken);
         }
 
         public Task SendGeneralCommand(string controllingSessionId, string sessionId, GeneralCommand command, CancellationToken cancellationToken)
@@ -1199,7 +1208,7 @@ namespace MediaBrowser.Server.Implementations.Session
             };
 
             info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary);
-            if (info.PrimaryImageTag.HasValue)
+            if (info.PrimaryImageTag != null)
             {
                 info.PrimaryImageItemId = GetDtoId(item);
             }
@@ -1237,14 +1246,14 @@ namespace MediaBrowser.Server.Implementations.Session
                 info.Album = audio.Album;
                 info.Artists = audio.Artists;
 
-                if (!info.PrimaryImageTag.HasValue)
+                if (info.PrimaryImageTag == null)
                 {
                     var album = audio.Parents.OfType<MusicAlbum>().FirstOrDefault();
 
                     if (album != null && album.HasImage(ImageType.Primary))
                     {
                         info.PrimaryImageTag = GetImageCacheTag(album, ImageType.Primary);
-                        if (info.PrimaryImageTag.HasValue)
+                        if (info.PrimaryImageTag != null)
                         {
                             info.PrimaryImageItemId = GetDtoId(album);
                         }
@@ -1345,7 +1354,7 @@ namespace MediaBrowser.Server.Implementations.Session
             return info;
         }
 
-        private Guid? GetImageCacheTag(BaseItem item, ImageType type)
+        private string GetImageCacheTag(BaseItem item, ImageType type)
         {
             try
             {

+ 0 - 12
MediaBrowser.Server.Implementations/Session/WebSocketController.cs

@@ -57,18 +57,6 @@ namespace MediaBrowser.Server.Implementations.Session
             return socket;
         }
 
-        public Task SendMessageCommand(MessageCommand command, CancellationToken cancellationToken)
-        {
-            var socket = GetActiveSocket();
-
-            return socket.SendAsync(new WebSocketMessage<MessageCommand>
-            {
-                MessageType = "MessageCommand",
-                Data = command
-
-            }, cancellationToken);
-        }
-
         public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken)
         {
             var socket = GetActiveSocket();