diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index ec7b1f0b35..06d8e0478e 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/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; /// /// Initializes a new instance of the class. /// 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); diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index bc6cba5b9f..dae3790990 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -79,6 +79,7 @@ + diff --git a/MediaBrowser.Api/Playback/MediaInfoService.cs b/MediaBrowser.Api/Playback/MediaInfoService.cs new file mode 100644 index 0000000000..b9973df40b --- /dev/null +++ b/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 + { + [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 Get(GetLiveMediaInfo request) + { + var item = _libraryManager.GetItemById(request.Id); + IEnumerable 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() + }); + } + } +} diff --git a/MediaBrowser.Api/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs index 4d68cbf393..7721107942 100644 --- a/MediaBrowser.Api/Session/SessionsService.cs +++ b/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); } } diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj index b2d0a3d704..292bad943a 100644 --- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj +++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj @@ -764,6 +764,9 @@ MediaInfo\IBlurayExaminer.cs + + MediaInfo\LiveMediaInfoResult.cs + MediaInfo\MediaProtocol.cs diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj index 8b5ee0d4d0..96a3a21a5d 100644 --- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj +++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj @@ -723,6 +723,9 @@ MediaInfo\IBlurayExaminer.cs + + MediaInfo\LiveMediaInfoResult.cs + MediaInfo\MediaProtocol.cs diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index 114dd30953..731143f897 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/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 /// Task{BaseItemDto[]}. Task GetAdditionalParts(string itemId, string userId); + /// + /// Gets the live media information. + /// + /// The item identifier. + /// Task<LiveMediaInfoResult>. + Task GetLiveMediaInfo(string itemId); + /// /// Gets the users async. /// diff --git a/MediaBrowser.Model/Configuration/UserConfiguration.cs b/MediaBrowser.Model/Configuration/UserConfiguration.cs index 51802a0fc6..3397d5d208 100644 --- a/MediaBrowser.Model/Configuration/UserConfiguration.cs +++ b/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[] { }; diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index af5b8f07e3..b09f694c64 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -126,6 +126,7 @@ + diff --git a/MediaBrowser.Model/MediaInfo/LiveMediaInfoResult.cs b/MediaBrowser.Model/MediaInfo/LiveMediaInfoResult.cs new file mode 100644 index 0000000000..afd5c890f4 --- /dev/null +++ b/MediaBrowser.Model/MediaInfo/LiveMediaInfoResult.cs @@ -0,0 +1,25 @@ +using MediaBrowser.Model.Dto; +using System.Collections.Generic; + +namespace MediaBrowser.Model.MediaInfo +{ + public class LiveMediaInfoResult + { + /// + /// Gets or sets the media sources. + /// + /// The media sources. + public List MediaSources { get; set; } + + /// + /// Gets or sets the live stream identifier. + /// + /// The live stream identifier. + public string LiveStreamId { get; set; } + + public LiveMediaInfoResult() + { + MediaSources = new List(); + } + } +} diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index b164b74983..0055d38e4f 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -53,8 +53,9 @@ False ..\packages\MediaBrowser.BdInfo.1.0.0.10\lib\net35\DvdLib.dll - - ..\packages\MediaBrowser.Naming.1.0.0.6\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll + + False + ..\packages\MediaBrowser.Naming.1.0.0.7\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll False diff --git a/MediaBrowser.Providers/packages.config b/MediaBrowser.Providers/packages.config index a09acf8517..4c33ac2e55 100644 --- a/MediaBrowser.Providers/packages.config +++ b/MediaBrowser.Providers/packages.config @@ -1,7 +1,7 @@  - + \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs b/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs index f0d3b76e5a..cff49df10f 100644 --- a/MediaBrowser.Server.Implementations/Connect/ConnectManager.cs +++ b/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) diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index 21658f3ff6..e6dadc4a54 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/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." } diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 7bc77dbf04..84494f8bd7 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/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", diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index 51482451f3..7da62b894a 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -51,7 +51,7 @@ False - ..\packages\MediaBrowser.Naming.1.0.0.6\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll + ..\packages\MediaBrowser.Naming.1.0.0.7\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll False diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config index 98454bec0a..d762998e4c 100644 --- a/MediaBrowser.Server.Implementations/packages.config +++ b/MediaBrowser.Server.Implementations/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 0360949c54..1a0b144b02 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.509 + 3.0.510 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index b228adceba..717d3c9347 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.509 + 3.0.510 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index 9b4d06766b..74126bbbf7 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Model.Signed - 3.0.509 + 3.0.510 MediaBrowser.Model - Signed Edition Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index d833a46d6d..ce0baf19e7 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.509 + 3.0.510 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - +