From 1aa7eb4c6276ac80b3a77f66afb244083bdb77a4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 28 Mar 2014 22:28:02 -0400 Subject: implement direct play profile edit --- MediaBrowser.Server.Implementations/Dto/DtoService.cs | 4 ++-- MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 1833b708f..2e0b3cb17 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -1297,7 +1297,7 @@ namespace MediaBrowser.Server.Implementations.Dto { var result = new List { - GetVersionInfo(item, true) + GetVersionInfo(item) }; return result; @@ -1321,7 +1321,7 @@ namespace MediaBrowser.Server.Implementations.Dto }; } - private MediaSourceInfo GetVersionInfo(Audio i, bool isPrimary) + private MediaSourceInfo GetVersionInfo(Audio i) { return new MediaSourceInfo { diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index db8786d62..b828dc0de 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -134,6 +134,14 @@ namespace MediaBrowser.Server.Implementations.LiveTv return number; }); + + if (query.IsFavorite.HasValue) + { + var val = query.IsFavorite.Value; + + channels = channels + .Where(i => _userDataManager.GetUserData(user.Id, i.GetUserDataKey()).IsFavorite == val); + } } channels = channels.OrderBy(i => -- cgit v1.2.3 From 0c32267717e1b7885addf132fe70adde787dbcd2 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 29 Mar 2014 11:40:32 -0400 Subject: stub out web client media controller --- MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs | 12 ++---------- MediaBrowser.WebDashboard/Api/DashboardService.cs | 8 ++++---- MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj | 3 +++ 3 files changed, 9 insertions(+), 14 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs index 9279fd8d7..08add952a 100644 --- a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs +++ b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs @@ -349,13 +349,13 @@ namespace MediaBrowser.Server.Implementations.IO { try { - Logger.Debug("Watcher sees change of type " + e.ChangeType + " to " + e.FullPath); + Logger.Debug("Changed detected of type " + e.ChangeType + " to " + e.FullPath); ReportFileSystemChanged(e.FullPath); } catch (Exception ex) { - Logger.ErrorException("Exception in watcher changed. Path: {0}", ex, e.FullPath); + Logger.ErrorException("Exception in ReportFileSystemChanged. Path: {0}", ex, e.FullPath); } } @@ -397,14 +397,6 @@ namespace MediaBrowser.Server.Implementations.IO Logger.Debug("Ignoring change to {0}", path); return true; } - - // Go up another level - parent = Path.GetDirectoryName(i); - if (string.Equals(parent, path, StringComparison.OrdinalIgnoreCase)) - { - Logger.Debug("Ignoring change to {0}", path); - return true; - } } return false; diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs index 99afbbdd7..f102dddaa 100644 --- a/MediaBrowser.WebDashboard/Api/DashboardService.cs +++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs @@ -404,6 +404,10 @@ namespace MediaBrowser.WebDashboard.Api //"chromecast.js", "contextmenu.js", + "mediacontroller.js", + "mediaplayer.js", + "mediaplayer-video.js", + "ratingdialog.js", "aboutpage.js", "allusersettings.js", @@ -461,10 +465,6 @@ namespace MediaBrowser.WebDashboard.Api "loginpage.js", "logpage.js", "medialibrarypage.js", - "mediaplayer.js", - - "mediaplayer-video.js", - "metadataconfigurationpage.js", "metadataimagespage.js", "moviegenres.js", diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 6a8cc49b1..6c6487cc2 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -587,6 +587,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest -- cgit v1.2.3 From 9f5101dee2641f99a7a4945475ebb0aa49fb1913 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 29 Mar 2014 14:20:42 -0400 Subject: add shuffle and instant mix commands --- MediaBrowser.Model/Session/PlayRequest.cs | 14 +++++-- .../Session/SessionManager.cs | 45 ++++++++++++++++++---- 2 files changed, 49 insertions(+), 10 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Model/Session/PlayRequest.cs b/MediaBrowser.Model/Session/PlayRequest.cs index 949274a5d..74d7a70a3 100644 --- a/MediaBrowser.Model/Session/PlayRequest.cs +++ b/MediaBrowser.Model/Session/PlayRequest.cs @@ -39,14 +39,22 @@ namespace MediaBrowser.Model.Session /// /// The play now /// - PlayNow, + PlayNow = 0, /// /// The play next /// - PlayNext, + PlayNext = 1, /// /// The play last /// - PlayLast + PlayLast = 2, + /// + /// The play instant mix + /// + PlayInstantMix = 3, + /// + /// The play shuffle + /// + PlayShuffle = 4 } } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index 9d405a175..4f748a6a8 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -3,6 +3,8 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Session; @@ -564,7 +566,7 @@ namespace MediaBrowser.Server.Implementations.Session return playedToCompletion; } - + /// /// Updates playstate position for an item but does not save /// @@ -666,7 +668,7 @@ namespace MediaBrowser.Server.Implementations.Session var controllingSession = GetSession(controllingSessionId); AssertCanControl(session, controllingSession); - + return session.SessionController.SendSystemCommand(command, cancellationToken); } @@ -676,7 +678,7 @@ namespace MediaBrowser.Server.Implementations.Session var controllingSession = GetSession(controllingSessionId); AssertCanControl(session, controllingSession); - + return session.SessionController.SendMessageCommand(command, cancellationToken); } @@ -684,14 +686,22 @@ namespace MediaBrowser.Server.Implementations.Session { var session = GetSessionForRemoteControl(sessionId); - var items = command.ItemIds.Select(i => _libraryManager.GetItemById(new Guid(i))) + var user = session.UserId.HasValue ? _userManager.GetUserById(session.UserId.Value) : null; + + var items = command.ItemIds.SelectMany(i => TranslateItemForPlayback(i, user)) .Where(i => i.LocationType != LocationType.Virtual) .ToList(); - if (session.UserId.HasValue) + if (command.PlayCommand == PlayCommand.PlayShuffle) { - var user = _userManager.GetUserById(session.UserId.Value); + items = items.OrderBy(i => Guid.NewGuid()).ToList(); + command.PlayCommand = PlayCommand.PlayNow; + } + + command.ItemIds = items.Select(i => i.Id.ToString("N")).ToArray(); + if (user != null) + { if (items.Any(i => i.GetPlayAccess(user) != PlayAccess.Full)) { throw new ArgumentException(string.Format("{0} is not allowed to play media.", user.Name)); @@ -723,13 +733,34 @@ namespace MediaBrowser.Server.Implementations.Session return session.SessionController.SendPlayCommand(command, cancellationToken); } + private IEnumerable TranslateItemForPlayback(string id, User user) + { + var item = _libraryManager.GetItemById(new Guid(id)); + + if (item.IsFolder) + { + var folder = (Folder)item; + + var items = user == null ? folder.RecursiveChildren: + folder.GetRecursiveChildren(user); + + items = items.Where(i => !i.IsFolder); + + items = items.OrderBy(i => i.SortName); + + return items; + } + + return new[] { item }; + } + public Task SendBrowseCommand(Guid controllingSessionId, Guid sessionId, BrowseRequest command, CancellationToken cancellationToken) { var session = GetSessionForRemoteControl(sessionId); var controllingSession = GetSession(controllingSessionId); AssertCanControl(session, controllingSession); - + return session.SessionController.SendBrowseCommand(command, cancellationToken); } -- cgit v1.2.3 From c34521538a1303f1ab918a052a41c3f1e2a1ff11 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 29 Mar 2014 15:02:43 -0400 Subject: support folder playback --- MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs b/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs index d806db1e0..7c8d71b4f 100644 --- a/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs +++ b/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs @@ -30,7 +30,7 @@ namespace MediaBrowser.Server.Implementations.Roku public bool SupportsMediaRemoteControl { - get { return true; } + get { return false; } } public bool IsSessionActive -- cgit v1.2.3 From f756e39b9d5b461e6bcaa4e71006038983d28213 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 30 Mar 2014 12:49:40 -0400 Subject: restored live tv playback in the web client --- MediaBrowser.Api/MediaBrowser.Api.csproj | 1 + MediaBrowser.Api/Music/InstantMixService.cs | 75 ++--- MediaBrowser.Api/Playback/BaseStreamingService.cs | 50 +--- .../Playback/ProgressiveStreamService.cs | 73 +++++ MediaBrowser.Api/Playback/StreamRequest.cs | 5 - MediaBrowser.Api/Playback/StreamState.cs | 2 - MediaBrowser.Controller/Dto/IDtoService.cs | 7 + MediaBrowser.Controller/Library/IMusicManager.cs | 38 +++ MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs | 4 +- .../MediaBrowser.Controller.csproj | 4 + .../MediaEncoding/EncodingOptions.cs | 79 +++++ .../MediaEncoding/EncodingResult.cs | 13 + .../MediaEncoding/VideoEncodingOptions.cs | 26 ++ MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs | 91 ++++++ .../Encoder/EncodingUtils.cs | 233 +++++++++++++++ .../Encoder/FFMpegProcess.cs | 168 +++++++++++ .../Encoder/InternalEncodingTask.cs | 95 ++++++ .../Encoder/InternalEncodingTaskFactory.cs | 323 +++++++++++++++++++++ MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs | 64 +--- .../MediaBrowser.MediaEncoding.csproj | 5 + MediaBrowser.Model/LiveTv/ChannelInfoDto.cs | 3 + MediaBrowser.Model/LiveTv/RecordingInfoDto.cs | 11 +- .../Dto/DtoService.cs | 48 ++- .../Library/MusicManager.cs | 67 +++++ .../Library/Resolvers/Audio/AudioResolver.cs | 3 +- .../LiveTv/LiveTvDtoService.cs | 11 +- .../MediaBrowser.Server.Implementations.csproj | 1 + .../Session/SessionManager.cs | 59 +++- MediaBrowser.ServerApplication/ApplicationHost.cs | 2 + MediaBrowser.WebDashboard/ApiClient.js | 2 +- MediaBrowser.WebDashboard/packages.config | 2 +- 31 files changed, 1373 insertions(+), 192 deletions(-) create mode 100644 MediaBrowser.Api/Playback/ProgressiveStreamService.cs create mode 100644 MediaBrowser.Controller/Library/IMusicManager.cs create mode 100644 MediaBrowser.Controller/MediaEncoding/EncodingOptions.cs create mode 100644 MediaBrowser.Controller/MediaEncoding/EncodingResult.cs create mode 100644 MediaBrowser.Controller/MediaEncoding/VideoEncodingOptions.cs create mode 100644 MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs create mode 100644 MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs create mode 100644 MediaBrowser.MediaEncoding/Encoder/FFMpegProcess.cs create mode 100644 MediaBrowser.MediaEncoding/Encoder/InternalEncodingTask.cs create mode 100644 MediaBrowser.MediaEncoding/Encoder/InternalEncodingTaskFactory.cs create mode 100644 MediaBrowser.Server.Implementations/Library/MusicManager.cs (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 18559a68d..c03eddf99 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -103,6 +103,7 @@ + diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs index 9b9df3a92..c39811bb6 100644 --- a/MediaBrowser.Api/Music/InstantMixService.cs +++ b/MediaBrowser.Api/Music/InstantMixService.cs @@ -1,9 +1,9 @@ using MediaBrowser.Controller.Dto; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Querying; using ServiceStack; -using System; using System.Collections.Generic; using System.Linq; @@ -36,103 +36,74 @@ namespace MediaBrowser.Api.Music public class InstantMixService : BaseApiService { private readonly IUserManager _userManager; - private readonly ILibraryManager _libraryManager; private readonly IDtoService _dtoService; + private readonly IMusicManager _musicManager; - public InstantMixService(IUserManager userManager, ILibraryManager libraryManager, IDtoService dtoService) + public InstantMixService(IUserManager userManager, IDtoService dtoService, IMusicManager musicManager) { _userManager = userManager; - _libraryManager = libraryManager; _dtoService = dtoService; + _musicManager = musicManager; } public object Get(GetInstantMixFromSong request) { - var item = _dtoService.GetItemByDtoId(request.Id); + var item = (Audio)_dtoService.GetItemByDtoId(request.Id); - var result = GetInstantMixResult(request, item.Genres); + var user = _userManager.GetUserById(request.UserId.Value); - return ToOptimizedSerializedResultUsingCache(result); + var items = _musicManager.GetInstantMixFromSong(item, user); + + return GetResult(items, user, request); } public object Get(GetInstantMixFromAlbum request) { var album = (MusicAlbum)_dtoService.GetItemByDtoId(request.Id); - var genres = album - .RecursiveChildren - .OfType