Explorar o código

get channel media info at runtime

Luke Pulverenti %!s(int64=10) %!d(string=hai) anos
pai
achega
dc8c24ed29

+ 28 - 2
MediaBrowser.Api/Library/LibraryService.cs

@@ -5,8 +5,10 @@ using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Controller.Playlists;
 using MediaBrowser.Controller.Session;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
@@ -146,7 +148,7 @@ namespace MediaBrowser.Api.Library
     }
 
     [Route("/Items/{Id}", "DELETE", Summary = "Deletes an item from the library and file system")]
-    [Authenticated(Roles = "Delete")]
+    [Authenticated]
     public class DeleteItem : IReturnVoid
     {
         [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
@@ -241,12 +243,13 @@ namespace MediaBrowser.Api.Library
         private readonly IDtoService _dtoService;
         private readonly IChannelManager _channelManager;
         private readonly ISessionManager _sessionManager;
+        private readonly IAuthorizationContext _authContext;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="LibraryService" /> class.
         /// </summary>
         public LibraryService(IItemRepository itemRepo, ILibraryManager libraryManager, IUserManager userManager,
-                              IDtoService dtoService, IUserDataManager userDataManager, IChannelManager channelManager, ISessionManager sessionManager)
+                              IDtoService dtoService, IUserDataManager userDataManager, IChannelManager channelManager, ISessionManager sessionManager, IAuthorizationContext authContext)
         {
             _itemRepo = itemRepo;
             _libraryManager = libraryManager;
@@ -255,6 +258,7 @@ namespace MediaBrowser.Api.Library
             _userDataManager = userDataManager;
             _channelManager = channelManager;
             _sessionManager = sessionManager;
+            _authContext = authContext;
         }
 
         public object Get(GetMediaFolders request)
@@ -466,6 +470,28 @@ namespace MediaBrowser.Api.Library
         {
             var item = _libraryManager.GetItemById(request.Id);
 
+            var auth = _authContext.GetAuthorizationInfo(Request);
+            var user = _userManager.GetUserById(auth.UserId);
+
+            if (item is Playlist)
+            {
+                // For now this is allowed if user can see the playlist
+            }
+            else if (item is ILiveTvRecording)
+            {
+                if (!user.Configuration.EnableLiveTvManagement)
+                {
+                    throw new UnauthorizedAccessException();
+                }
+            }
+            else
+            {
+                if (!user.Configuration.EnableContentDeletion)
+                {
+                    throw new UnauthorizedAccessException();
+                }
+            }
+
             var task = _libraryManager.DeleteItem(item);
 
             Task.WaitAll(task);

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

@@ -79,6 +79,7 @@
     <Compile Include="FilterService.cs" />
     <Compile Include="Library\ChapterService.cs" />
     <Compile Include="Playback\Hls\MpegDashService.cs" />
+    <Compile Include="Playback\MediaInfoService.cs" />
     <Compile Include="PlaylistService.cs" />
     <Compile Include="StartupWizardService.cs" />
     <Compile Include="Subtitles\SubtitleService.cs" />

+ 64 - 0
MediaBrowser.Api/Playback/MediaInfoService.cs

@@ -0,0 +1,64 @@
+using MediaBrowser.Controller.Channels;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.MediaInfo;
+using ServiceStack;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Api.Playback
+{
+    [Route("/Items/{Id}/MediaInfo", "GET", Summary = "Gets live playback media info for an item")]
+    public class GetLiveMediaInfo : IReturn<LiveMediaInfoResult>
+    {
+        [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+        public string Id { get; set; }
+
+        [ApiMember(Name = "UserId", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")]
+        public string UserId { get; set; }
+    }
+
+    [Authenticated]
+    public class MediaInfoService : BaseApiService
+    {
+        private readonly ILibraryManager _libraryManager;
+        private readonly IChannelManager _channelManager;
+        private readonly IUserManager _userManager;
+
+        public MediaInfoService(ILibraryManager libraryManager, IChannelManager channelManager, IUserManager userManager)
+        {
+            _libraryManager = libraryManager;
+            _channelManager = channelManager;
+            _userManager = userManager;
+        }
+
+        public async Task<object> Get(GetLiveMediaInfo request)
+        {
+            var item = _libraryManager.GetItemById(request.Id);
+            IEnumerable<MediaSourceInfo> mediaSources;
+
+            var channelItem = item as IChannelMediaItem;
+            var user = _userManager.GetUserById(request.UserId);
+
+            if (channelItem != null)
+            {
+                mediaSources = await _channelManager.GetChannelItemMediaSources(request.Id, true, CancellationToken.None)
+                        .ConfigureAwait(false);
+            }
+            else
+            {
+                var hasMediaSources = (IHasMediaSources)item;
+                mediaSources = hasMediaSources.GetMediaSources(true, user);
+            }
+
+            return ToOptimizedResult(new LiveMediaInfoResult
+            {
+                MediaSources = mediaSources.ToList()
+            });
+        }
+    }
+}

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

@@ -357,7 +357,12 @@ namespace MediaBrowser.Api.Session
 
                 if (!user.Configuration.EnableRemoteControlOfOtherUsers)
                 {
-                    result = result.Where(i => !i.UserId.HasValue || i.ContainsUser(request.ControllableByUserId.Value));
+                    result = result.Where(i => i.ContainsUser(request.ControllableByUserId.Value));
+                }
+
+                if (!user.Configuration.EnableSharedDeviceControl)
+                {
+                    result = result.Where(i => !i.UserId.HasValue);
                 }
             }
 

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

@@ -764,6 +764,9 @@
     <Compile Include="..\MediaBrowser.Model\MediaInfo\IBlurayExaminer.cs">
       <Link>MediaInfo\IBlurayExaminer.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\MediaInfo\LiveMediaInfoResult.cs">
+      <Link>MediaInfo\LiveMediaInfoResult.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\MediaInfo\MediaProtocol.cs">
       <Link>MediaInfo\MediaProtocol.cs</Link>
     </Compile>

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

@@ -723,6 +723,9 @@
     <Compile Include="..\MediaBrowser.Model\MediaInfo\IBlurayExaminer.cs">
       <Link>MediaInfo\IBlurayExaminer.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\MediaInfo\LiveMediaInfoResult.cs">
+      <Link>MediaInfo\LiveMediaInfoResult.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\MediaInfo\MediaProtocol.cs">
       <Link>MediaInfo\MediaProtocol.cs</Link>
     </Compile>

+ 8 - 0
MediaBrowser.Model/ApiClient/IApiClient.cs

@@ -6,6 +6,7 @@ using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Events;
 using MediaBrowser.Model.Globalization;
 using MediaBrowser.Model.LiveTv;
+using MediaBrowser.Model.MediaInfo;
 using MediaBrowser.Model.Notifications;
 using MediaBrowser.Model.Playlists;
 using MediaBrowser.Model.Plugins;
@@ -223,6 +224,13 @@ namespace MediaBrowser.Model.ApiClient
         /// <returns>Task{BaseItemDto[]}.</returns>
         Task<ItemsResult> GetAdditionalParts(string itemId, string userId);
 
+        /// <summary>
+        /// Gets the live media information.
+        /// </summary>
+        /// <param name="itemId">The item identifier.</param>
+        /// <returns>Task&lt;LiveMediaInfoResult&gt;.</returns>
+        Task<LiveMediaInfoResult> GetLiveMediaInfo(string itemId);
+
         /// <summary>
         /// Gets the users async.
         /// </summary>

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

@@ -47,6 +47,7 @@ namespace MediaBrowser.Model.Configuration
         public bool DisplayMissingEpisodes { get; set; }
         public bool DisplayUnairedEpisodes { get; set; }
         public bool EnableRemoteControlOfOtherUsers { get; set; }
+        public bool EnableSharedDeviceControl { get; set; }
 
         public bool EnableLiveTvManagement { get; set; }
         public bool EnableLiveTvAccess { get; set; }
@@ -95,6 +96,7 @@ namespace MediaBrowser.Model.Configuration
             EnableLiveTvManagement = true;
             EnableMediaPlayback = true;
             EnableLiveTvAccess = true;
+            EnableSharedDeviceControl = true;
 
             LatestItemsExcludes = new string[] { };
             OrderedViews = new string[] { };

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

@@ -126,6 +126,7 @@
     <Compile Include="Dlna\SubtitleStreamInfo.cs" />
     <Compile Include="Drawing\ImageOrientation.cs" />
     <Compile Include="Dto\IHasServerId.cs" />
+    <Compile Include="MediaInfo\LiveMediaInfoResult.cs" />
     <Compile Include="Dto\MediaSourceType.cs" />
     <Compile Include="Dto\StreamOptions.cs" />
     <Compile Include="Dto\VideoStreamOptions.cs" />

+ 25 - 0
MediaBrowser.Model/MediaInfo/LiveMediaInfoResult.cs

@@ -0,0 +1,25 @@
+using MediaBrowser.Model.Dto;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Model.MediaInfo
+{
+    public class LiveMediaInfoResult
+    {
+        /// <summary>
+        /// Gets or sets the media sources.
+        /// </summary>
+        /// <value>The media sources.</value>
+        public List<MediaSourceInfo> MediaSources { get; set; }
+
+        /// <summary>
+        /// Gets or sets the live stream identifier.
+        /// </summary>
+        /// <value>The live stream identifier.</value>
+        public string LiveStreamId { get; set; }
+
+        public LiveMediaInfoResult()
+        {
+            MediaSources = new List<MediaSourceInfo>();
+        }
+    }
+}

+ 3 - 2
MediaBrowser.Providers/MediaBrowser.Providers.csproj

@@ -53,8 +53,9 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\packages\MediaBrowser.BdInfo.1.0.0.10\lib\net35\DvdLib.dll</HintPath>
     </Reference>
-    <Reference Include="MediaBrowser.Naming">
-      <HintPath>..\packages\MediaBrowser.Naming.1.0.0.6\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
+    <Reference Include="MediaBrowser.Naming, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\packages\MediaBrowser.Naming.1.0.0.7\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
     </Reference>
     <Reference Include="MoreLinq, Version=1.1.17511.0, Culture=neutral, PublicKeyToken=384d532d7e88985d, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>

+ 1 - 1
MediaBrowser.Providers/packages.config

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="MediaBrowser.BdInfo" version="1.0.0.10" targetFramework="net45" />
-  <package id="MediaBrowser.Naming" version="1.0.0.6" targetFramework="net45" />
+  <package id="MediaBrowser.Naming" version="1.0.0.7" targetFramework="net45" />
   <package id="morelinq" version="1.1.0" targetFramework="net45" />
   <package id="taglib" version="2.1.0.0" targetFramework="net45" />
 </packages>

+ 9 - 8
MediaBrowser.Server.Implementations/Connect/ConnectManager.cs

@@ -453,6 +453,14 @@ namespace MediaBrowser.Server.Implementations.Connect
                 throw new ArgumentNullException("ConnectServerId");
             }
 
+            var sendingUser = GetUser(sendingUserId);
+            var requesterUserName = sendingUser.ConnectUserName;
+
+            if (string.IsNullOrWhiteSpace(requesterUserName))
+            {
+                throw new ArgumentException("A Connect account is required in order to send invitations.");
+            }
+
             string connectUserId = null;
             var result = new UserLinkResult();
 
@@ -482,14 +490,6 @@ namespace MediaBrowser.Server.Implementations.Connect
                 }
             }
 
-            var sendingUser = GetUser(sendingUserId);
-            var requesterUserName = sendingUser.ConnectUserName;
-
-            if (string.IsNullOrWhiteSpace(requesterUserName))
-            {
-                requesterUserName = sendingUser.Name;
-            }
-
             if (string.IsNullOrWhiteSpace(connectUserId))
             {
                 return await SendNewUserInvitation(requesterUserName, connectUsername).ConfigureAwait(false);
@@ -781,6 +781,7 @@ namespace MediaBrowser.Server.Implementations.Connect
                             user.Configuration.EnableLiveTvManagement = false;
                             user.Configuration.EnableContentDeletion = false;
                             user.Configuration.EnableRemoteControlOfOtherUsers = false;
+                            user.Configuration.EnableSharedDeviceControl = false;
                             user.Configuration.IsAdministrator = false;
 
                             if (currentPendingEntry != null)

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

@@ -631,5 +631,8 @@
     "MessageForgotPasswordFileCreated": "The following file has been created on your server and contains instructions on how to proceed:",
     "MessageForgotPasswordFileExpiration": "The reset pin will expire at {0}.",
     "MessageInvalidForgotPasswordPin": "An invalid or expired pin was entered. Please try again.",
-    "MessagePasswordResetForUsers":  "Passwords have been reset for the following users:"
+    "MessagePasswordResetForUsers": "Passwords have been reset for the following users:",
+    "HeaderInviteGuest": "Invite Guest",
+    "ButtonLinkMyMediaBrowserAccount": "Link my account now",
+    "MessageConnectAccountRequiredToInviteGuest": "In order to invite guests you need to first link your Media Browser account to this server."
 }

+ 5 - 2
MediaBrowser.Server.Implementations/Localization/Server/server.json

@@ -145,7 +145,7 @@
     "OptionBudget": "Budget",
     "OptionRevenue": "Revenue",
     "OptionPoster": "Poster",
-    "OptionPosterCard":  "Poster card",
+    "OptionPosterCard": "Poster card",
     "OptionBackdrop": "Backdrop",
     "OptionTimeline": "Timeline",
     "OptionThumb": "Thumb",
@@ -234,6 +234,9 @@
     "OptionAllowDeleteLibraryContent": "Allow this user to delete library content",
     "OptionAllowManageLiveTv": "Allow management of live tv recordings",
     "OptionAllowRemoteControlOthers": "Allow this user to remote control other users",
+    "OptionAllowRemoteSharedDevices": "Allow this user to remote control shared devices",
+    "OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
+    "HeaderRemoteControl": "Remote Control",
     "OptionMissingTmdbId": "Missing Tmdb Id",
     "OptionIsHD": "HD",
     "OptionIsSD": "SD",
@@ -1237,7 +1240,7 @@
     "LabelConnectGuestUserNameHelp": "This is the username that your friend uses to sign in to the Media Browser website, or their email address.",
     "HeaderInviteUserHelp": "Sharing your media with friends is easier than ever before with Media Browser Connect.",
     "ButtonSendInvitation": "Send Invitation",
-    "HeaderSignInWithConnect":  "Sign in with Media Browser Connect",
+    "HeaderSignInWithConnect": "Sign in with Media Browser Connect",
     "HeaderGuests": "Guests",
     "HeaderLocalUsers": "Local Users",
     "HeaderPendingInvitations": "Pending Invitations",

+ 1 - 1
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -51,7 +51,7 @@
     </Reference>
     <Reference Include="MediaBrowser.Naming, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\MediaBrowser.Naming.1.0.0.6\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
+      <HintPath>..\packages\MediaBrowser.Naming.1.0.0.7\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
     </Reference>
     <Reference Include="Mono.Nat, Version=1.2.21.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>

+ 1 - 1
MediaBrowser.Server.Implementations/packages.config

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="MediaBrowser.Naming" version="1.0.0.6" targetFramework="net45" />
+  <package id="MediaBrowser.Naming" version="1.0.0.7" targetFramework="net45" />
   <package id="Mono.Nat" version="1.2.21.0" targetFramework="net45" />
   <package id="morelinq" version="1.1.0" targetFramework="net45" />
 </packages>

+ 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.509</version>
+        <version>3.0.510</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.509" />
+            <dependency id="MediaBrowser.Common" version="3.0.510" />
             <dependency id="NLog" version="3.1.0.0" />
             <dependency id="SimpleInjector" version="2.6.1" />
             <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.509</version>
+        <version>3.0.510</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.509</version>
+        <version>3.0.510</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.509</version>
+        <version>3.0.510</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.509" />
+            <dependency id="MediaBrowser.Common" version="3.0.510" />
         </dependencies>
     </metadata>
     <files>