Jelajahi Sumber

fixes #552 - Add parental control usage limits

Luke Pulverenti 10 tahun lalu
induk
melakukan
bd1bd5e87e
34 mengubah file dengan 326 tambahan dan 94 penghapusan
  1. 16 2
      MediaBrowser.Api/Images/ImageService.cs
  2. 6 17
      MediaBrowser.Controller/Entities/BaseItem.cs
  3. 0 4
      MediaBrowser.Controller/Entities/ItemImageInfo.cs
  4. 37 0
      MediaBrowser.Controller/Entities/User.cs
  5. 23 0
      MediaBrowser.Controller/Entities/Video.cs
  6. 0 1
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  7. 9 12
      MediaBrowser.Dlna/Didl/DidlBuilder.cs
  8. 21 0
      MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
  9. 21 0
      MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
  10. 2 2
      MediaBrowser.Model/ApiClient/IApiClient.cs
  11. 22 1
      MediaBrowser.Model/ApiClient/IConnectionManager.cs
  12. 23 0
      MediaBrowser.Model/Configuration/AccessSchedule.cs
  13. 5 2
      MediaBrowser.Model/Configuration/UserConfiguration.cs
  14. 17 0
      MediaBrowser.Model/Connect/ConnectAuthenticationResult.cs
  15. 1 8
      MediaBrowser.Model/Connect/ConnectUser.cs
  16. 10 0
      MediaBrowser.Model/Connect/ConnectUserQuery.cs
  17. 11 0
      MediaBrowser.Model/Connect/PinCreationResult.cs
  18. 10 0
      MediaBrowser.Model/Connect/PinExchangeResult.cs
  19. 10 0
      MediaBrowser.Model/Connect/PinStatusResult.cs
  20. 2 3
      MediaBrowser.Model/Dto/ImageInfo.cs
  21. 7 0
      MediaBrowser.Model/MediaBrowser.Model.csproj
  22. 2 1
      MediaBrowser.Model/MediaInfo/MediaProtocol.cs
  23. 14 2
      MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs
  24. 16 4
      MediaBrowser.Providers/Photos/PhotoProvider.cs
  25. 1 0
      MediaBrowser.Server.Implementations/Connect/ConnectManager.cs
  26. 10 24
      MediaBrowser.Server.Implementations/Dto/DtoService.cs
  27. 11 3
      MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
  28. 1 0
      MediaBrowser.Server.Implementations/Library/UserManager.cs
  29. 4 1
      MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
  30. 8 1
      MediaBrowser.Server.Implementations/Localization/Server/server.json
  31. 2 2
      Nuget/MediaBrowser.Common.Internal.nuspec
  32. 1 1
      Nuget/MediaBrowser.Common.nuspec
  33. 1 1
      Nuget/MediaBrowser.Model.Signed.nuspec
  34. 2 2
      Nuget/MediaBrowser.Server.Core.nuspec

+ 16 - 2
MediaBrowser.Api/Images/ImageService.cs

@@ -321,6 +321,20 @@ namespace MediaBrowser.Api.Images
             {
                 var fileInfo = new FileInfo(info.Path);
 
+                int? width = null;
+                int? height = null;
+
+                try
+                {
+                    var size = _imageProcessor.GetImageSize(info.Path, info.DateModified);
+
+                    width = Convert.ToInt32(size.Width);
+                    height = Convert.ToInt32(size.Height);
+                }
+                catch
+                {
+
+                }
                 return new ImageInfo
                 {
                     Path = info.Path,
@@ -328,8 +342,8 @@ namespace MediaBrowser.Api.Images
                     ImageType = info.Type,
                     ImageTag = _imageProcessor.GetImageCacheTag(item, info),
                     Size = fileInfo.Length,
-                    Width = info.Width ?? 0,
-                    Height = info.Height ?? 0
+                    Width = width,
+                    Height = height
                 };
             }
             catch (Exception ex)

+ 6 - 17
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -564,6 +564,11 @@ namespace MediaBrowser.Controller.Entities
                 return PlayAccess.None;
             }
 
+            //if (!user.IsParentalScheduleAllowed())
+            //{
+            //    return PlayAccess.None;
+            //}
+
             return PlayAccess.Full;
         }
 
@@ -1465,8 +1470,6 @@ namespace MediaBrowser.Controller.Entities
 
                 image.Path = file.FullName;
                 image.DateModified = imageInfo.DateModified;
-                image.Width = imageInfo.Width;
-                image.Height = imageInfo.Height;
             }
         }
 
@@ -1639,26 +1642,12 @@ namespace MediaBrowser.Controller.Entities
 
         private ItemImageInfo GetImageInfo(FileSystemInfo file, ImageType type)
         {
-            var info = new ItemImageInfo
+            return new ItemImageInfo
             {
                 Path = file.FullName,
                 Type = type,
                 DateModified = FileSystem.GetLastWriteTimeUtc(file)
             };
-
-            try
-            {
-                var size = ImageProcessor.GetImageSize(info.Path);
-
-                info.Width = Convert.ToInt32(size.Width);
-                info.Height = Convert.ToInt32(size.Height);
-            }
-            catch
-            {
-                
-            }
-
-            return info;
         }
 
         /// <summary>

+ 0 - 4
MediaBrowser.Controller/Entities/ItemImageInfo.cs

@@ -10,9 +10,5 @@ namespace MediaBrowser.Controller.Entities
         public ImageType Type { get; set; }
 
         public DateTime DateModified { get; set; }
-
-        public int? Width { get; set; }
-
-        public int? Height { get; set; }
     }
 }

+ 37 - 0
MediaBrowser.Controller/Entities/User.cs

@@ -6,6 +6,7 @@ using MediaBrowser.Model.Connect;
 using MediaBrowser.Model.Serialization;
 using System;
 using System.IO;
+using System.Linq;
 using System.Runtime.Serialization;
 using System.Threading;
 using System.Threading.Tasks;
@@ -259,5 +260,41 @@ namespace MediaBrowser.Controller.Entities
             Configuration = config;
             UserManager.UpdateConfiguration(this, Configuration);
         }
+
+        public bool IsParentalScheduleAllowed()
+        {
+            return IsParentalScheduleAllowed(DateTime.UtcNow);
+        }
+
+        public bool IsParentalScheduleAllowed(DateTime date)
+        {
+            var schedules = Configuration.AccessSchedules;
+
+            if (schedules.Length == 0)
+            {
+                return true;
+            }
+
+            return schedules.Any(i => IsParentalScheduleAllowed(i, date));
+        }
+
+        private bool IsParentalScheduleAllowed(AccessSchedule schedule, DateTime date)
+        {
+            if (date.Kind != DateTimeKind.Utc)
+            {
+                throw new ArgumentException("Utc date expected");
+            }
+
+            var localTime = date.ToLocalTime();
+
+            return localTime.DayOfWeek == schedule.DayOfWeek && IsWithinTime(schedule, localTime);
+        }
+
+        private bool IsWithinTime(AccessSchedule schedule, DateTime localTime)
+        {
+            var hour = localTime.TimeOfDay.TotalHours;
+
+            return hour >= schedule.StartHour && hour <= schedule.EndHour;
+        }
     }
 }

+ 23 - 0
MediaBrowser.Controller/Entities/Video.cs

@@ -129,6 +129,7 @@ namespace MediaBrowser.Controller.Entities
 
         public bool IsPlaceHolder { get; set; }
         public bool IsShortcut { get; set; }
+        public string ShortcutPath { get; set; }
 
         /// <summary>
         /// Gets or sets the tags.
@@ -578,6 +579,28 @@ namespace MediaBrowser.Controller.Entities
                 PlayableStreamFileNames = i.PlayableStreamFileNames.ToList()
             };
 
+            if (i.IsShortcut)
+            {
+                info.Path = i.ShortcutPath;
+
+                if (info.Path.StartsWith("Http", StringComparison.OrdinalIgnoreCase))
+                {
+                    info.Protocol = MediaProtocol.Http;
+                }
+                else if (info.Path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase))
+                {
+                    info.Protocol = MediaProtocol.Rtmp;
+                }
+                else if (info.Path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase))
+                {
+                    info.Protocol = MediaProtocol.Rtsp;
+                }
+                else
+                {
+                    info.Protocol = MediaProtocol.File;
+                }
+            }
+
             if (string.IsNullOrEmpty(info.Container))
             {
                 if (i.VideoType == VideoType.VideoFile || i.VideoType == VideoType.Iso)

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

@@ -99,7 +99,6 @@
     <Compile Include="Collections\CollectionCreationOptions.cs" />
     <Compile Include="Collections\CollectionEvents.cs" />
     <Compile Include="Collections\ICollectionManager.cs" />
-    <Compile Include="Connect\ConnectUser.cs" />
     <Compile Include="Connect\IConnectManager.cs" />
     <Compile Include="Connect\UserLinkResult.cs" />
     <Compile Include="Devices\IDeviceManager.cs" />

+ 9 - 12
MediaBrowser.Dlna/Didl/DidlBuilder.cs

@@ -869,22 +869,19 @@ namespace MediaBrowser.Dlna.Didl
 
             }
 
-            int? width = imageInfo.Width;
-            int? height = imageInfo.Height;
+            int? width = null;
+            int? height = null;
 
-            if (!height.HasValue && !width.HasValue)
+            try
             {
-                try
-                {
-                    var size = _imageProcessor.GetImageSize(imageInfo.Path, imageInfo.DateModified);
+                var size = _imageProcessor.GetImageSize(imageInfo.Path, imageInfo.DateModified);
 
-                    width = Convert.ToInt32(size.Width);
-                    height = Convert.ToInt32(size.Height);
-                }
-                catch
-                {
+                width = Convert.ToInt32(size.Width);
+                height = Convert.ToInt32(size.Height);
+            }
+            catch
+            {
 
-                }
             }
 
             return new ImageDownloadInfo

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

@@ -158,6 +158,9 @@
     <Compile Include="..\MediaBrowser.Model\Collections\CollectionCreationResult.cs">
       <Link>Collections\CollectionCreationResult.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Configuration\AccessSchedule.cs">
+      <Link>Configuration\AccessSchedule.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Configuration\BaseApplicationConfiguration.cs">
       <Link>Configuration\BaseApplicationConfiguration.cs</Link>
     </Compile>
@@ -215,9 +218,27 @@
     <Compile Include="..\MediaBrowser.Model\Configuration\XbmcMetadataOptions.cs">
       <Link>Configuration\XbmcMetadataOptions.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\ConnectAuthenticationResult.cs">
+      <Link>Connect\ConnectAuthenticationResult.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Connect\ConnectAuthorization.cs">
       <Link>Connect\ConnectAuthorization.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\ConnectUser.cs">
+      <Link>Connect\ConnectUser.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\ConnectUserQuery.cs">
+      <Link>Connect\ConnectUserQuery.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\PinCreationResult.cs">
+      <Link>Connect\PinCreationResult.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\PinExchangeResult.cs">
+      <Link>Connect\PinExchangeResult.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\PinStatusResult.cs">
+      <Link>Connect\PinStatusResult.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Connect\UserLinkType.cs">
       <Link>Connect\UserLinkType.cs</Link>
     </Compile>

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

@@ -124,6 +124,9 @@
     <Compile Include="..\MediaBrowser.Model\Collections\CollectionCreationResult.cs">
       <Link>Collections\CollectionCreationResult.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Configuration\AccessSchedule.cs">
+      <Link>Configuration\AccessSchedule.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Configuration\BaseApplicationConfiguration.cs">
       <Link>Configuration\BaseApplicationConfiguration.cs</Link>
     </Compile>
@@ -181,9 +184,27 @@
     <Compile Include="..\MediaBrowser.Model\Configuration\XbmcMetadataOptions.cs">
       <Link>Configuration\XbmcMetadataOptions.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\ConnectAuthenticationResult.cs">
+      <Link>Connect\ConnectAuthenticationResult.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Connect\ConnectAuthorization.cs">
       <Link>Connect\ConnectAuthorization.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\ConnectUser.cs">
+      <Link>Connect\ConnectUser.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\ConnectUserQuery.cs">
+      <Link>Connect\ConnectUserQuery.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\PinCreationResult.cs">
+      <Link>Connect\PinCreationResult.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\PinExchangeResult.cs">
+      <Link>Connect\PinExchangeResult.cs</Link>
+    </Compile>
+    <Compile Include="..\MediaBrowser.Model\Connect\PinStatusResult.cs">
+      <Link>Connect\PinStatusResult.cs</Link>
+    </Compile>
     <Compile Include="..\mediabrowser.model\connect\UserLinkType.cs">
       <Link>Connect\UserLinkType.cs</Link>
     </Compile>

+ 2 - 2
MediaBrowser.Model/ApiClient/IApiClient.cs

@@ -715,10 +715,10 @@ namespace MediaBrowser.Model.ApiClient
         /// Authenticates a user and returns the result
         /// </summary>
         /// <param name="username">The username.</param>
-        /// <param name="sha1Hash">The sha1 hash.</param>
+        /// <param name="password">The password.</param>
         /// <returns>Task.</returns>
         /// <exception cref="ArgumentNullException">userId</exception>
-        Task<AuthenticationResult> AuthenticateUserAsync(string username, byte[] sha1Hash);
+        Task<AuthenticationResult> AuthenticateUserAsync(string username, string password);
 
         /// <summary>
         /// Updates the server configuration async.

+ 22 - 1
MediaBrowser.Model/ApiClient/IConnectionManager.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Connect;
+using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Events;
 using System;
 using System.Threading;
@@ -65,5 +66,25 @@ namespace MediaBrowser.Model.ApiClient
         /// </summary>
         [Obsolete]
         IApiClient CurrentApiClient { get; }
+
+        /// <summary>
+        /// Creates the pin.
+        /// </summary>
+        /// <returns>Task&lt;PinCreationResult&gt;.</returns>
+        Task<PinCreationResult> CreatePin();
+
+        /// <summary>
+        /// Gets the pin status.
+        /// </summary>
+        /// <param name="pin">The pin.</param>
+        /// <returns>Task&lt;PinStatusResult&gt;.</returns>
+        Task<PinStatusResult> GetPinStatus(PinCreationResult pin);
+
+        /// <summary>
+        /// Exchanges the pin.
+        /// </summary>
+        /// <param name="pin">The pin.</param>
+        /// <returns>Task.</returns>
+        Task ExchangePin(PinCreationResult pin);
     }
 }

+ 23 - 0
MediaBrowser.Model/Configuration/AccessSchedule.cs

@@ -0,0 +1,23 @@
+using System;
+
+namespace MediaBrowser.Model.Configuration
+{
+    public class AccessSchedule
+    {
+        /// <summary>
+        /// Gets or sets the day of week.
+        /// </summary>
+        /// <value>The day of week.</value>
+        public DayOfWeek DayOfWeek { get; set; }
+        /// <summary>
+        /// Gets or sets the start hour.
+        /// </summary>
+        /// <value>The start hour.</value>
+        public double StartHour { get; set; }
+        /// <summary>
+        /// Gets or sets the end hour.
+        /// </summary>
+        /// <value>The end hour.</value>
+        public double EndHour { get; set; }
+    }
+}

+ 5 - 2
MediaBrowser.Model/Configuration/UserConfiguration.cs

@@ -66,7 +66,7 @@ namespace MediaBrowser.Model.Configuration
         public string[] BlockedChannels { get; set; }
 
         public string[] DisplayChannelsWithinViews { get; set; }
-        
+
         public string[] ExcludeFoldersFromGrouping { get; set; }
 
         public UnratedItem[] BlockUnratedItems { get; set; }
@@ -86,13 +86,14 @@ namespace MediaBrowser.Model.Configuration
 
         public bool EnableCinemaMode { get; set; }
 
+        public AccessSchedule[] AccessSchedules { get; set; }
+
         /// <summary>
         /// Initializes a new instance of the <see cref="UserConfiguration" /> class.
         /// </summary>
         public UserConfiguration()
         {
             PlayDefaultAudioTrack = true;
-            EnableRemoteControlOfOtherUsers = true;
             EnableLiveTvManagement = true;
             EnableMediaPlayback = true;
             EnableLiveTvAccess = true;
@@ -111,6 +112,8 @@ namespace MediaBrowser.Model.Configuration
             SyncConnectImage = true;
             IncludeTrailersInSuggestions = true;
             EnableCinemaMode = true;
+
+            AccessSchedules = new AccessSchedule[] { };
         }
     }
 }

+ 17 - 0
MediaBrowser.Model/Connect/ConnectAuthenticationResult.cs

@@ -0,0 +1,17 @@
+
+namespace MediaBrowser.Model.Connect
+{
+    public class ConnectAuthenticationResult
+    {
+        /// <summary>
+        /// Gets or sets the user identifier.
+        /// </summary>
+        /// <value>The user identifier.</value>
+        public string UserId { get; set; }
+        /// <summary>
+        /// Gets or sets the access token.
+        /// </summary>
+        /// <value>The access token.</value>
+        public string AccessToken { get; set; }
+    }
+}

+ 1 - 8
MediaBrowser.Controller/Connect/ConnectUser.cs → MediaBrowser.Model/Connect/ConnectUser.cs

@@ -1,5 +1,5 @@
 
-namespace MediaBrowser.Controller.Connect
+namespace MediaBrowser.Model.Connect
 {
     public class ConnectUser
     {
@@ -9,11 +9,4 @@ namespace MediaBrowser.Controller.Connect
         public bool IsActive { get; set; }
         public string ImageUrl { get; set; }
     }
-
-    public class ConnectUserQuery
-    {
-        public string Id { get; set; }
-        public string Name { get; set; }
-        public string Email { get; set; }
-    }
 }

+ 10 - 0
MediaBrowser.Model/Connect/ConnectUserQuery.cs

@@ -0,0 +1,10 @@
+
+namespace MediaBrowser.Model.Connect
+{
+    public class ConnectUserQuery
+    {
+        public string Id { get; set; }
+        public string Name { get; set; }
+        public string Email { get; set; }
+    }
+}

+ 11 - 0
MediaBrowser.Model/Connect/PinCreationResult.cs

@@ -0,0 +1,11 @@
+
+namespace MediaBrowser.Model.Connect
+{
+    public class PinCreationResult
+    {
+        public string Pin { get; set; }
+        public string DeviceId { get; set; }
+        public bool IsConfirmed { get; set; }
+        public bool IsExpired { get; set; }
+    }
+}

+ 10 - 0
MediaBrowser.Model/Connect/PinExchangeResult.cs

@@ -0,0 +1,10 @@
+using System;
+
+namespace MediaBrowser.Model.Connect
+{
+    public class PinExchangeResult
+    {
+        public string UserId { get; set; }
+        public string UserAccessToken { get; set; }
+    }
+}

+ 10 - 0
MediaBrowser.Model/Connect/PinStatusResult.cs

@@ -0,0 +1,10 @@
+
+namespace MediaBrowser.Model.Connect
+{
+    public class PinStatusResult
+    {
+        public string Pin { get; set; }
+        public bool IsConfirmed { get; set; }
+        public bool IsExpired { get; set; }
+    }
+}

+ 2 - 3
MediaBrowser.Model/Dto/ImageInfo.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Model.Entities;
-using System;
 
 namespace MediaBrowser.Model.Dto
 {
@@ -35,13 +34,13 @@ namespace MediaBrowser.Model.Dto
         /// Gets or sets the height.
         /// </summary>
         /// <value>The height.</value>
-        public int Height { get; set; }
+        public int? Height { get; set; }
 
         /// <summary>
         /// Gets or sets the width.
         /// </summary>
         /// <value>The width.</value>
-        public int Width { get; set; }
+        public int? Width { get; set; }
 
         /// <summary>
         /// Gets or sets the size.

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

@@ -89,6 +89,7 @@
     <Compile Include="Chapters\RemoteChapterInfo.cs" />
     <Compile Include="Chapters\RemoteChapterResult.cs" />
     <Compile Include="Collections\CollectionCreationResult.cs" />
+    <Compile Include="Configuration\AccessSchedule.cs" />
     <Compile Include="Configuration\ChannelOptions.cs" />
     <Compile Include="Configuration\ChapterOptions.cs" />
     <Compile Include="Configuration\CinemaModeConfiguration.cs" />
@@ -96,7 +97,13 @@
     <Compile Include="Configuration\PeopleMetadataOptions.cs" />
     <Compile Include="Configuration\XbmcMetadataOptions.cs" />
     <Compile Include="Configuration\SubtitlePlaybackMode.cs" />
+    <Compile Include="Connect\ConnectAuthenticationResult.cs" />
     <Compile Include="Connect\ConnectAuthorization.cs" />
+    <Compile Include="Connect\ConnectUser.cs" />
+    <Compile Include="Connect\ConnectUserQuery.cs" />
+    <Compile Include="Connect\PinCreationResult.cs" />
+    <Compile Include="Connect\PinExchangeResult.cs" />
+    <Compile Include="Connect\PinStatusResult.cs" />
     <Compile Include="Connect\UserLinkType.cs" />
     <Compile Include="Devices\DeviceOptions.cs" />
     <Compile Include="Devices\LocalFileInfo.cs" />

+ 2 - 1
MediaBrowser.Model/MediaInfo/MediaProtocol.cs

@@ -4,6 +4,7 @@ namespace MediaBrowser.Model.MediaInfo
     {
         File = 0,
         Http = 1,
-        Rtmp = 2
+        Rtmp = 2,
+        Rtsp = 3
     }
 }

+ 14 - 2
MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Configuration;
+using System.IO;
+using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Controller.Chapters;
 using MediaBrowser.Controller.Configuration;
@@ -132,16 +133,27 @@ namespace MediaBrowser.Providers.MediaInfo
                 return _cachedTask;
             }
 
-            if (item.IsPlaceHolder || item.IsShortcut)
+            if (item.IsPlaceHolder)
             {
                 return _cachedTask;
             }
 
+            if (item.IsShortcut)
+            {
+                FetchShortcutInfo(item);
+                return Task.FromResult(ItemUpdateType.MetadataEdit);
+            }
+            
             var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json, _encodingManager, _fileSystem, _config, _subtitleManager, _chapterManager);
 
             return prober.ProbeVideo(item, options, cancellationToken);
         }
 
+        private void FetchShortcutInfo(Video video)
+        {
+            video.ShortcutPath = File.ReadAllText(video.Path);
+        }
+
         public Task<ItemUpdateType> FetchAudioInfo<T>(T item, CancellationToken cancellationToken)
             where T : Audio
         {

+ 16 - 4
MediaBrowser.Providers/Photos/PhotoProvider.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Drawing;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
@@ -17,10 +18,12 @@ namespace MediaBrowser.Providers.Photos
     public class PhotoProvider : ICustomMetadataProvider<Photo>, IHasItemChangeMonitor
     {
         private readonly ILogger _logger;
+        private readonly IImageProcessor _imageProcessor;
 
-        public PhotoProvider(ILogger logger)
+        public PhotoProvider(ILogger logger, IImageProcessor imageProcessor)
         {
             _logger = logger;
+            _imageProcessor = imageProcessor;
         }
 
         public Task<ItemUpdateType> FetchAsync(Photo item, MetadataRefreshOptions options, CancellationToken cancellationToken)
@@ -140,9 +143,18 @@ namespace MediaBrowser.Providers.Photos
             }
 
             var imageInfo = item.GetImageInfo(ImageType.Primary, 0);
+            
+            try
+            {
+                var size = _imageProcessor.GetImageSize(imageInfo.Path, imageInfo.DateModified);
+
+                item.Width = Convert.ToInt32(size.Width);
+                item.Height = Convert.ToInt32(size.Height);
+            }
+            catch
+            {
 
-            item.Height = imageInfo.Height;
-            item.Width = imageInfo.Width;
+            } 
 
             const ItemUpdateType result = ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataImport;
             return Task.FromResult(result);

+ 1 - 0
MediaBrowser.Server.Implementations/Connect/ConnectManager.cs

@@ -634,6 +634,7 @@ namespace MediaBrowser.Server.Implementations.Connect
 
                             user.Configuration.SyncConnectImage = true;
                             user.Configuration.SyncConnectName = true;
+                            user.Configuration.IsHidden = true;
 
                             _userManager.UpdateConfiguration(user, user.Configuration);
                         }

+ 10 - 24
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -1429,35 +1429,21 @@ namespace MediaBrowser.Server.Implementations.Dto
             // See if we can avoid a file system lookup by looking for the file in ResolveArgs
             var dateModified = imageInfo.DateModified;
 
-            double? width = imageInfo.Width;
-            double? height = imageInfo.Height;
-
             ImageSize size;
 
-            if (!width.HasValue || !height.HasValue)
+            try
             {
-                try
-                {
-                    size = _imageProcessor.GetImageSize(path, dateModified);
-                }
-                catch (FileNotFoundException)
-                {
-                    _logger.Error("Image file does not exist: {0}", path);
-                    return;
-                }
-                catch (Exception ex)
-                {
-                    _logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path);
-                    return;
-                }
+                size = _imageProcessor.GetImageSize(path, dateModified);
             }
-            else
+            catch (FileNotFoundException)
             {
-                size = new ImageSize
-                {
-                    Height = height.Value,
-                    Width = width.Value
-                };
+                _logger.Error("Image file does not exist: {0}", path);
+                return;
+            }
+            catch (Exception ex)
+            {
+                _logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path);
+                return;
             }
 
             dto.OriginalPrimaryImageAspectRatio = size.Width / size.Height;

+ 11 - 3
MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs

@@ -67,7 +67,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
             {
                 if (!_config.Configuration.InsecureApps.Contains(auth.Client ?? string.Empty, StringComparer.OrdinalIgnoreCase))
                 {
-                    //SessionManager.ValidateSecurityToken(auth.Token);
+                    SessionManager.ValidateSecurityToken(auth.Token);
                 }
             }
 
@@ -80,9 +80,17 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
                 throw new ArgumentException("User with Id " + auth.UserId + " not found");
             }
 
-            if (user != null && user.Configuration.IsDisabled)
+            if (user != null)
             {
-                throw new AuthenticationException("User account has been disabled.");
+                if (user.Configuration.IsDisabled)
+                {
+                    throw new AuthenticationException("User account has been disabled.");
+                }
+
+                if (!user.Configuration.IsAdministrator && !user.IsParentalScheduleAllowed())
+                {
+                    throw new AuthenticationException("This user account is not allowed access at this time.");
+                }
             }
 
             if (roles.Contains("admin", StringComparer.OrdinalIgnoreCase))

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

@@ -234,6 +234,7 @@ namespace MediaBrowser.Server.Implementations.Library
                 users.Add(user);
 
                 user.Configuration.IsAdministrator = true;
+                user.Configuration.EnableRemoteControlOfOtherUsers = true;
                 UpdateConfiguration(user, user.Configuration);
             }
 

+ 4 - 1
MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json

@@ -609,5 +609,8 @@
     "DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.",
     "LabelEnableCameraUploadFor": "Enable camera upload for:",
     "HeaderSelectUploadPath": "Select Upload Path",
-    "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser."
+    "LabelEnableCameraUploadForHelp": "Uploads will occur automatically in the background when signed into Media Browser.",
+    "ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.",
+    "ButtonLibraryAccess": "Library access",
+    "ButtonParentalControl":  "Parental control"
 }

+ 8 - 1
MediaBrowser.Server.Implementations/Localization/Server/server.json

@@ -1235,5 +1235,12 @@
     "HeaderGuests": "Guests",
     "HeaderLocalUsers": "Local Users",
     "HeaderPendingInvitations": "Pending Invitations",
-    "TabParentalControl": "Parental Control"
+    "TabParentalControl": "Parental Control",
+    "HeaderAccessSchedule": "Access Schedule",
+    "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.",
+    "ButtonAddSchedule": "Add Schedule",
+    "LabelAccessDay": "Day of week:",
+    "LabelAccessStart": "Start time:",
+    "LabelAccessEnd": "End time:",
+    "HeaderSchedule": "Schedule"
 }

+ 2 - 2
Nuget/MediaBrowser.Common.Internal.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
-        <version>3.0.482</version>
+        <version>3.0.484</version>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.482" />
+            <dependency id="MediaBrowser.Common" version="3.0.484" />
             <dependency id="NLog" version="3.1.0.0" />
             <dependency id="SimpleInjector" version="2.5.2" />
             <dependency id="sharpcompress" version="0.10.2" />

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.482</version>
+        <version>3.0.484</version>
         <title>MediaBrowser.Common</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 1 - 1
Nuget/MediaBrowser.Model.Signed.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Model.Signed</id>
-        <version>3.0.482</version>
+        <version>3.0.484</version>
         <title>MediaBrowser.Model - Signed Edition</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 2 - 2
Nuget/MediaBrowser.Server.Core.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.482</version>
+        <version>3.0.484</version>
         <title>Media Browser.Server.Core</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.482" />
+            <dependency id="MediaBrowser.Common" version="3.0.484" />
         </dependencies>
     </metadata>
     <files>