From 327af0fe62bb3a055e4286154e9ba6104969af24 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 21 Mar 2014 23:35:03 -0400 Subject: rework media versions to be based on original item id --- .../Dto/DtoService.cs | 93 +++++++++++----------- .../IO/LibraryMonitor.cs | 4 +- .../Roku/RokuControllerFactory.cs | 5 ++ .../Session/SessionManager.cs | 56 +++++++++++-- .../Session/SessionWebSocketListener.cs | 15 ++++ 5 files changed, 117 insertions(+), 56 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index c94cdda846..520b01af22 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -267,12 +267,14 @@ namespace MediaBrowser.Server.Implementations.Dto PlayableMediaTypes = session.PlayableMediaTypes, RemoteEndPoint = session.RemoteEndPoint, AdditionalUsers = session.AdditionalUsers, - SupportsFullscreenToggle = session.SupportsFullscreenToggle + SupportsFullscreenToggle = session.SupportsFullscreenToggle, + SupportsNavigationControl = session.SupportsNavigationControl, + SupportsOsdToggle = session.SupportsOsdToggle }; if (session.NowPlayingItem != null) { - dto.NowPlayingItem = GetBaseItemInfo(session.NowPlayingItem); + dto.NowPlayingItem = GetNowPlayingInfo(session.NowPlayingItem, session.NowPlayingMediaVersionId, session.NowPlayingRunTimeTicks); } if (session.UserId.HasValue) @@ -288,9 +290,11 @@ namespace MediaBrowser.Server.Implementations.Dto /// Converts a BaseItem to a BaseItemInfo /// /// The item. + /// The media version identifier. + /// The now playing runtime ticks. /// BaseItemInfo. /// item - public BaseItemInfo GetBaseItemInfo(BaseItem item) + private BaseItemInfo GetNowPlayingInfo(BaseItem item, string mediaVersionId, long? nowPlayingRuntimeTicks) { if (item == null) { @@ -303,7 +307,8 @@ namespace MediaBrowser.Server.Implementations.Dto Name = item.Name, MediaType = item.MediaType, Type = item.GetClientTypeName(), - RunTimeTicks = item.RunTimeTicks + RunTimeTicks = nowPlayingRuntimeTicks, + MediaVersionId = mediaVersionId }; info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary); @@ -1103,9 +1108,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (dto.MediaVersions != null && dto.MediaVersions.Count > 0) { - chapters = dto.MediaVersions.Where(i => i.IsPrimaryVersion) - .SelectMany(i => i.Chapters) - .ToList(); + chapters = _itemRepo.GetChapters(item.Id).Select(c => GetChapterInfoDto(c, item)).ToList(); } else { @@ -1292,24 +1295,25 @@ namespace MediaBrowser.Server.Implementations.Dto private List GetMediaVersions(Audio item) { - var result = new List(); - - result.Add(GetVersionInfo(item, true)); + var result = new List + { + GetVersionInfo(item, true) + }; return result; } private MediaVersionInfo GetVersionInfo(Video i, bool isPrimary) { + var mediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery {ItemId = i.Id}).ToList(); + return new MediaVersionInfo { - Chapters = _itemRepo.GetChapters(i.Id).Select(c => GetChapterInfoDto(c, i)).ToList(), - - ItemId = i.Id.ToString("N"), + Id = i.Id.ToString("N"), IsoType = i.IsoType, LocationType = i.LocationType, - MediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(), - Name = GetAlternateVersionName(i), + MediaStreams = mediaStreams, + Name = GetAlternateVersionName(i, mediaStreams), Path = GetMappedPath(i), RunTimeTicks = i.RunTimeTicks, Video3DFormat = i.Video3DFormat, @@ -1322,7 +1326,7 @@ namespace MediaBrowser.Server.Implementations.Dto { return new MediaVersionInfo { - ItemId = i.Id.ToString("N"), + Id = i.Id.ToString("N"), LocationType = i.LocationType, MediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(), Name = i.Name, @@ -1351,32 +1355,29 @@ namespace MediaBrowser.Server.Implementations.Dto return path; } - private string GetAlternateVersionName(Video video) + private string GetAlternateVersionName(Video video, List mediaStreams) { - var name = ""; + var terms = new List(); - var videoStream = video.GetDefaultVideoStream(); + var videoStream = mediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video); + var audioStream = mediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); if (video.Video3DFormat.HasValue) { - name = "3D " + name; - name = name.Trim(); + terms.Add("3D"); } if (video.VideoType == VideoType.BluRay) { - name = name + " " + "Bluray"; - name = name.Trim(); + terms.Add("Bluray"); } else if (video.VideoType == VideoType.Dvd) { - name = name + " " + "DVD"; - name = name.Trim(); + terms.Add("DVD"); } else if (video.VideoType == VideoType.HdDvd) { - name = name + " " + "HD-DVD"; - name = name.Trim(); + terms.Add("HD-DVD"); } else if (video.VideoType == VideoType.Iso) { @@ -1384,18 +1385,17 @@ namespace MediaBrowser.Server.Implementations.Dto { if (video.IsoType.Value == IsoType.BluRay) { - name = name + " " + "Bluray"; + terms.Add("Bluray"); } else if (video.IsoType.Value == IsoType.Dvd) { - name = name + " " + "DVD"; + terms.Add("DVD"); } } else { - name = name + " " + "ISO"; + terms.Add("ISO"); } - name = name.Trim(); } if (videoStream != null) @@ -1404,44 +1404,45 @@ namespace MediaBrowser.Server.Implementations.Dto { if (videoStream.Width.Value >= 3800) { - name = name + " " + "4K"; - name = name.Trim(); + terms.Add("4K"); } else if (videoStream.Width.Value >= 1900) { - name = name + " " + "1080P"; - name = name.Trim(); + terms.Add("1080P"); } else if (videoStream.Width.Value >= 1270) { - name = name + " " + "720P"; - name = name.Trim(); + terms.Add("720P"); } else if (videoStream.Width.Value >= 700) { - name = name + " " + "480p"; - name = name.Trim(); + terms.Add("480P"); } else { - name = name + " " + "SD"; - name = name.Trim(); + terms.Add("SD"); } } } if (videoStream != null && !string.IsNullOrWhiteSpace(videoStream.Codec)) { - name = name + " " + videoStream.Codec.ToUpper(); - name = name.Trim(); + terms.Add(videoStream.Codec.ToUpper()); } - if (string.IsNullOrWhiteSpace(name)) + if (audioStream != null) { - return video.Name; + var audioCodec = string.Equals(audioStream.Codec, "dca", StringComparison.OrdinalIgnoreCase) + ? audioStream.Profile + : audioStream.Codec; + + if (!string.IsNullOrEmpty(audioCodec)) + { + terms.Add(audioCodec.ToUpper()); + } } - return name; + return string.Join("/", terms.ToArray()); } private string GetMappedPath(string path) diff --git a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs index 65bbb35bac..0a0b3f4bcd 100644 --- a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs +++ b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs @@ -427,11 +427,11 @@ namespace MediaBrowser.Server.Implementations.IO { if (_updateTimer == null) { - _updateTimer = new Timer(TimerStopped, null, TimeSpan.FromSeconds(ConfigurationManager.Configuration.RealtimeWatcherDelay), TimeSpan.FromMilliseconds(-1)); + _updateTimer = new Timer(TimerStopped, null, TimeSpan.FromSeconds(ConfigurationManager.Configuration.RealtimeMonitorDelay), TimeSpan.FromMilliseconds(-1)); } else { - _updateTimer.Change(TimeSpan.FromSeconds(ConfigurationManager.Configuration.RealtimeWatcherDelay), TimeSpan.FromMilliseconds(-1)); + _updateTimer.Change(TimeSpan.FromSeconds(ConfigurationManager.Configuration.RealtimeMonitorDelay), TimeSpan.FromMilliseconds(-1)); } } } diff --git a/MediaBrowser.Server.Implementations/Roku/RokuControllerFactory.cs b/MediaBrowser.Server.Implementations/Roku/RokuControllerFactory.cs index 71f70421a9..53f28e7ae7 100644 --- a/MediaBrowser.Server.Implementations/Roku/RokuControllerFactory.cs +++ b/MediaBrowser.Server.Implementations/Roku/RokuControllerFactory.cs @@ -1,8 +1,10 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Session; +using MediaBrowser.Model.Entities; using MediaBrowser.Model.Serialization; using System; +using System.Collections.Generic; namespace MediaBrowser.Server.Implementations.Roku { @@ -23,6 +25,9 @@ namespace MediaBrowser.Server.Implementations.Roku { if (string.Equals(session.Client, "roku", StringComparison.OrdinalIgnoreCase)) { + session.PlayableMediaTypes = new List { MediaType.Video, MediaType.Audio }; + session.SupportsFullscreenToggle = false; + return new RokuSessionController(_httpClient, _json, _appHost, session); } diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index 1fb5af127c..c895062617 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -218,15 +218,29 @@ namespace MediaBrowser.Server.Implementations.Session /// /// The session. /// The item. + /// The media version identifier. /// if set to true [is paused]. + /// if set to true [is muted]. /// The current position ticks. - private void UpdateNowPlayingItem(SessionInfo session, BaseItem item, bool isPaused, bool isMuted, long? currentPositionTicks = null) + private void UpdateNowPlayingItem(SessionInfo session, BaseItem item, string mediaVersionId, bool isPaused, bool isMuted, long? currentPositionTicks = null) { session.IsMuted = isMuted; session.IsPaused = isPaused; session.NowPlayingPositionTicks = currentPositionTicks; session.NowPlayingItem = item; session.LastActivityDate = DateTime.UtcNow; + session.NowPlayingMediaVersionId = mediaVersionId; + + if (string.IsNullOrWhiteSpace(mediaVersionId)) + { + session.NowPlayingRunTimeTicks = item.RunTimeTicks; + } + else + { + var version = _libraryManager.GetItemById(new Guid(mediaVersionId)); + + session.NowPlayingRunTimeTicks = version.RunTimeTicks; + } } /// @@ -246,6 +260,8 @@ namespace MediaBrowser.Server.Implementations.Session session.NowPlayingItem = null; session.NowPlayingPositionTicks = null; session.IsPaused = false; + session.NowPlayingRunTimeTicks = null; + session.NowPlayingMediaVersionId = null; } } @@ -352,7 +368,9 @@ namespace MediaBrowser.Server.Implementations.Session var item = info.Item; - UpdateNowPlayingItem(session, item, false, false); + var mediaVersionId = GetMediaVersionId(item, info.MediaVersionId); + + UpdateNowPlayingItem(session, item, mediaVersionId, false, false); session.CanSeek = info.CanSeek; session.QueueableMediaTypes = info.QueueableMediaTypes; @@ -371,7 +389,8 @@ namespace MediaBrowser.Server.Implementations.Session EventHelper.QueueEventIfNotNull(PlaybackStart, this, new PlaybackProgressEventArgs { Item = item, - Users = users + Users = users, + MediaVersionId = info.MediaVersionId }, _logger); } @@ -405,7 +424,7 @@ namespace MediaBrowser.Server.Implementations.Session /// Task. /// /// positionTicks - public async Task OnPlaybackProgress(PlaybackProgressInfo info) + public async Task OnPlaybackProgress(Controller.Session.PlaybackProgressInfo info) { if (info == null) { @@ -419,7 +438,9 @@ namespace MediaBrowser.Server.Implementations.Session var session = Sessions.First(i => i.Id.Equals(info.SessionId)); - UpdateNowPlayingItem(session, info.Item, info.IsPaused, info.IsMuted, info.PositionTicks); + var mediaVersionId = GetMediaVersionId(info.Item, info.MediaVersionId); + + UpdateNowPlayingItem(session, info.Item, mediaVersionId, info.IsPaused, info.IsMuted, info.PositionTicks); var key = info.Item.GetUserDataKey(); @@ -434,7 +455,8 @@ namespace MediaBrowser.Server.Implementations.Session { Item = info.Item, Users = users, - PlaybackPositionTicks = info.PositionTicks + PlaybackPositionTicks = info.PositionTicks, + MediaVersionId = mediaVersionId }, _logger); } @@ -458,7 +480,7 @@ namespace MediaBrowser.Server.Implementations.Session /// Task. /// info /// positionTicks - public async Task OnPlaybackStopped(PlaybackStopInfo info) + public async Task OnPlaybackStopped(Controller.Session.PlaybackStopInfo info) { if (info == null) { @@ -494,16 +516,32 @@ namespace MediaBrowser.Server.Implementations.Session playedToCompletion = await OnPlaybackStopped(user.Id, key, info.Item, info.PositionTicks).ConfigureAwait(false); } + var mediaVersionId = GetMediaVersionId(info.Item, info.MediaVersionId); + EventHelper.QueueEventIfNotNull(PlaybackStopped, this, new PlaybackStopEventArgs { Item = info.Item, Users = users, PlaybackPositionTicks = info.PositionTicks, - PlayedToCompletion = playedToCompletion + PlayedToCompletion = playedToCompletion, + MediaVersionId = mediaVersionId }, _logger); } + private string GetMediaVersionId(BaseItem item, string reportedMediaVersionId) + { + if (string.IsNullOrWhiteSpace(reportedMediaVersionId)) + { + if (item is Video || item is Audio) + { + reportedMediaVersionId = item.Id.ToString("N"); + } + } + + return reportedMediaVersionId; + } + private async Task OnPlaybackStopped(Guid userId, string userDataKey, BaseItem item, long? positionTicks) { var data = _userDataRepository.GetUserData(userId, userDataKey); @@ -899,6 +937,8 @@ namespace MediaBrowser.Server.Implementations.Session session.PlayableMediaTypes = capabilities.PlayableMediaTypes.ToList(); session.SupportsFullscreenToggle = capabilities.SupportsFullscreenToggle; + session.SupportsOsdToggle = capabilities.SupportsOsdToggle; + session.SupportsNavigationControl = capabilities.SupportsNavigationControl; } } } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs index e5fbc7d9fa..5c4c00e7d2 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs @@ -223,6 +223,11 @@ namespace MediaBrowser.Server.Implementations.Session QueueableMediaTypes = queueableMediaTypes.Split(',').ToList() }; + if (vals.Length > 3) + { + info.MediaVersionId = vals[3]; + } + _sessionManager.OnPlaybackStart(info); } } @@ -265,6 +270,11 @@ namespace MediaBrowser.Server.Implementations.Session SessionId = session.Id }; + if (vals.Length > 4) + { + info.MediaVersionId = vals[4]; + } + _sessionManager.OnPlaybackProgress(info); } } @@ -304,6 +314,11 @@ namespace MediaBrowser.Server.Implementations.Session SessionId = session.Id }; + if (vals.Length > 2) + { + info.MediaVersionId = vals[2]; + } + _sessionManager.OnPlaybackStopped(info); } } -- cgit v1.2.3 From e2dee00cc0d48f2aa60001237c6cc092849f7222 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 22 Mar 2014 12:16:43 -0400 Subject: rename MediaVersions to MediaSources --- MediaBrowser.Api/ItemUpdateService.cs | 2 +- MediaBrowser.Api/Playback/BaseStreamingService.cs | 4 +- MediaBrowser.Api/Playback/StreamRequest.cs | 4 +- MediaBrowser.Api/UserLibrary/UserLibraryService.cs | 18 ++++---- MediaBrowser.Api/VideosService.cs | 29 +++++++++---- MediaBrowser.Controller/Entities/Video.cs | 4 +- .../Library/PlaybackProgressEventArgs.cs | 2 +- MediaBrowser.Controller/Session/PlaybackInfo.cs | 2 +- .../Session/PlaybackProgressInfo.cs | 2 +- .../Session/PlaybackStopInfo.cs | 2 +- MediaBrowser.Controller/Session/SessionInfo.cs | 2 +- MediaBrowser.Model/Dto/BaseItemDto.cs | 4 +- MediaBrowser.Model/Dto/MediaVersionInfo.cs | 2 +- MediaBrowser.Model/Entities/BaseItemInfo.cs | 2 +- MediaBrowser.Model/Querying/ItemFields.cs | 2 +- MediaBrowser.Model/Session/PlaybackReports.cs | 6 +-- MediaBrowser.Providers/Savers/XmlSaverHelpers.cs | 2 +- .../Dto/DtoService.cs | 50 +++++++++++----------- .../Library/ResolverHelper.cs | 2 +- .../Library/Resolvers/Movies/MovieResolver.cs | 8 ++-- .../Session/SessionManager.cs | 36 ++++++++-------- .../Session/SessionWebSocketListener.cs | 6 +-- .../Sorting/AlphanumComparator.cs | 3 +- MediaBrowser.WebDashboard/ApiClient.js | 26 +++++------ MediaBrowser.WebDashboard/packages.config | 2 +- 25 files changed, 117 insertions(+), 105 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index b15e67ffa7..1e9f2f7a2f 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -94,7 +94,7 @@ namespace MediaBrowser.Api var item = _dtoService.GetItemByDtoId(request.ItemId); var newLockData = request.LockData ?? false; - var dontFetchMetaChanged = item.DontFetchMeta != newLockData; + var dontFetchMetaChanged = item.IsLocked != newLockData; UpdateItem(request, item); diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 5f86c71ece..1001980ec1 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1308,9 +1308,9 @@ namespace MediaBrowser.Api.Playback RequestedUrl = url }; - var item = string.IsNullOrEmpty(request.MediaVersionId) ? + var item = string.IsNullOrEmpty(request.MediaSourceId) ? DtoService.GetItemByDtoId(request.Id) : - DtoService.GetItemByDtoId(request.MediaVersionId); + DtoService.GetItemByDtoId(request.MediaSourceId); if (user != null && item.GetPlayAccess(user) != PlayAccess.Full) { diff --git a/MediaBrowser.Api/Playback/StreamRequest.cs b/MediaBrowser.Api/Playback/StreamRequest.cs index 89e38711fe..df52e5e3ee 100644 --- a/MediaBrowser.Api/Playback/StreamRequest.cs +++ b/MediaBrowser.Api/Playback/StreamRequest.cs @@ -15,8 +15,8 @@ namespace MediaBrowser.Api.Playback [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] public string Id { get; set; } - [ApiMember(Name = "MediaVersionId", Description = "The media version id, if playing an alternate version", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] - public string MediaVersionId { get; set; } + [ApiMember(Name = "MediaSourceId", Description = "The media version id, if playing an alternate version", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")] + public string MediaSourceId { get; set; } [ApiMember(Name = "DeviceId", Description = "The device id of the client requesting. Used to stop encoding processes when needed.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string DeviceId { get; set; } diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs index 5173008f9f..c6051c02cc 100644 --- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs +++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs @@ -241,8 +241,8 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public string Id { get; set; } - [ApiMember(Name = "MediaVersionId", Description = "The id of the MediaVersion", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] - public string MediaVersionId { get; set; } + [ApiMember(Name = "MediaSourceId", Description = "The id of the MediaSource", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] + public string MediaSourceId { get; set; } /// /// Gets or sets a value indicating whether this is likes. @@ -280,8 +280,8 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] public string Id { get; set; } - [ApiMember(Name = "MediaVersionId", Description = "The id of the MediaVersion", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] - public string MediaVersionId { get; set; } + [ApiMember(Name = "MediaSourceId", Description = "The id of the MediaSource", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] + public string MediaSourceId { get; set; } /// /// Gets or sets the position ticks. @@ -318,8 +318,8 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] public string Id { get; set; } - [ApiMember(Name = "MediaVersionId", Description = "The id of the MediaVersion", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")] - public string MediaVersionId { get; set; } + [ApiMember(Name = "MediaSourceId", Description = "The id of the MediaSource", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")] + public string MediaSourceId { get; set; } /// /// Gets or sets the position ticks. @@ -746,7 +746,7 @@ namespace MediaBrowser.Api.UserLibrary Item = item, SessionId = GetSession().Id, QueueableMediaTypes = queueableMediaTypes.Split(',').ToList(), - MediaVersionId = request.MediaVersionId + MediaSourceId = request.MediaSourceId }; _sessionManager.OnPlaybackStart(info); @@ -769,7 +769,7 @@ namespace MediaBrowser.Api.UserLibrary IsMuted = request.IsMuted, IsPaused = request.IsPaused, SessionId = GetSession().Id, - MediaVersionId = request.MediaVersionId + MediaSourceId = request.MediaSourceId }; var task = _sessionManager.OnPlaybackProgress(info); @@ -794,7 +794,7 @@ namespace MediaBrowser.Api.UserLibrary Item = item, PositionTicks = request.PositionTicks, SessionId = session.Id, - MediaVersionId = request.MediaVersionId + MediaSourceId = request.MediaSourceId }; var task = _sessionManager.OnPlaybackStopped(info); diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs index 380f89bc73..94432871c6 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -27,8 +27,8 @@ namespace MediaBrowser.Api public string Id { get; set; } } - [Route("/Videos/{Id}/AlternateVersions", "DELETE", Summary = "Assigns videos as alternates of another.")] - public class DeleteAlternateVersions : IReturnVoid + [Route("/Videos/{Id}/AlternateSources", "DELETE", Summary = "Removes alternate video sources.")] + public class DeleteAlternateSources : IReturnVoid { [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")] public string Id { get; set; } @@ -95,14 +95,14 @@ namespace MediaBrowser.Api return ToOptimizedSerializedResultUsingCache(result); } - public void Delete(DeleteAlternateVersions request) + public void Delete(DeleteAlternateSources request) { var task = RemoveAlternateVersions(request); Task.WaitAll(task); } - private async Task RemoveAlternateVersions(DeleteAlternateVersions request) + private async Task RemoveAlternateVersions(DeleteAlternateSources request) { var video = (Video)_dtoService.GetItemByDtoId(request.Id); @@ -143,7 +143,7 @@ namespace MediaBrowser.Api var videos = items.Cast /// The media version identifier. - public string MediaVersionId { get; set; } + public string MediaSourceId { get; set; } } } diff --git a/MediaBrowser.Controller/Session/PlaybackProgressInfo.cs b/MediaBrowser.Controller/Session/PlaybackProgressInfo.cs index 0c825932c8..3d402aa6ff 100644 --- a/MediaBrowser.Controller/Session/PlaybackProgressInfo.cs +++ b/MediaBrowser.Controller/Session/PlaybackProgressInfo.cs @@ -39,6 +39,6 @@ namespace MediaBrowser.Controller.Session /// Gets or sets the media version identifier. /// /// The media version identifier. - public string MediaVersionId { get; set; } + public string MediaSourceId { get; set; } } } diff --git a/MediaBrowser.Controller/Session/PlaybackStopInfo.cs b/MediaBrowser.Controller/Session/PlaybackStopInfo.cs index 3391c96cf7..063abf78c0 100644 --- a/MediaBrowser.Controller/Session/PlaybackStopInfo.cs +++ b/MediaBrowser.Controller/Session/PlaybackStopInfo.cs @@ -27,6 +27,6 @@ namespace MediaBrowser.Controller.Session /// Gets or sets the media version identifier. /// /// The media version identifier. - public string MediaVersionId { get; set; } + public string MediaSourceId { get; set; } } } diff --git a/MediaBrowser.Controller/Session/SessionInfo.cs b/MediaBrowser.Controller/Session/SessionInfo.cs index 953d186e84..9dd57d12a1 100644 --- a/MediaBrowser.Controller/Session/SessionInfo.cs +++ b/MediaBrowser.Controller/Session/SessionInfo.cs @@ -123,7 +123,7 @@ namespace MediaBrowser.Controller.Session /// Gets or sets the now playing media version identifier. /// /// The now playing media version identifier. - public string NowPlayingMediaVersionId { get; set; } + public string NowPlayingMediaSourceId { get; set; } /// diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs index 379e757bb6..780f936be2 100644 --- a/MediaBrowser.Model/Dto/BaseItemDto.cs +++ b/MediaBrowser.Model/Dto/BaseItemDto.cs @@ -92,7 +92,7 @@ namespace MediaBrowser.Model.Dto /// Gets or sets the media versions. /// /// The media versions. - public List MediaVersions { get; set; } + public List MediaSources { get; set; } /// /// Gets or sets the critic rating. @@ -500,7 +500,7 @@ namespace MediaBrowser.Model.Dto /// /// The part count. public int? PartCount { get; set; } - public int? MediaVersionCount { get; set; } + public int? MediaSourceCount { get; set; } /// /// Determines whether the specified type is type. diff --git a/MediaBrowser.Model/Dto/MediaVersionInfo.cs b/MediaBrowser.Model/Dto/MediaVersionInfo.cs index c2e0d83b2b..4dfb32dd57 100644 --- a/MediaBrowser.Model/Dto/MediaVersionInfo.cs +++ b/MediaBrowser.Model/Dto/MediaVersionInfo.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace MediaBrowser.Model.Dto { - public class MediaVersionInfo + public class MediaSourceInfo { public string Id { get; set; } diff --git a/MediaBrowser.Model/Entities/BaseItemInfo.cs b/MediaBrowser.Model/Entities/BaseItemInfo.cs index 0fac979490..16a08d6937 100644 --- a/MediaBrowser.Model/Entities/BaseItemInfo.cs +++ b/MediaBrowser.Model/Entities/BaseItemInfo.cs @@ -74,7 +74,7 @@ namespace MediaBrowser.Model.Entities /// Gets or sets the media version identifier. /// /// The media version identifier. - public string MediaVersionId { get; set; } + public string MediaSourceId { get; set; } /// /// Gets a value indicating whether this instance has primary image. diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs index 65509fd6d3..398be3c7b1 100644 --- a/MediaBrowser.Model/Querying/ItemFields.cs +++ b/MediaBrowser.Model/Querying/ItemFields.cs @@ -84,7 +84,7 @@ namespace MediaBrowser.Model.Querying /// /// The media versions /// - MediaVersions, + MediaSources, /// /// The metadata settings diff --git a/MediaBrowser.Model/Session/PlaybackReports.cs b/MediaBrowser.Model/Session/PlaybackReports.cs index 662dc57805..75dd3346ce 100644 --- a/MediaBrowser.Model/Session/PlaybackReports.cs +++ b/MediaBrowser.Model/Session/PlaybackReports.cs @@ -10,7 +10,7 @@ namespace MediaBrowser.Model.Session public string ItemId { get; set; } - public string MediaVersionId { get; set; } + public string MediaSourceId { get; set; } public bool IsSeekable { get; set; } @@ -31,7 +31,7 @@ namespace MediaBrowser.Model.Session public string ItemId { get; set; } - public string MediaVersionId { get; set; } + public string MediaSourceId { get; set; } public long? PositionTicks { get; set; } @@ -49,7 +49,7 @@ namespace MediaBrowser.Model.Session public string ItemId { get; set; } - public string MediaVersionId { get; set; } + public string MediaSourceId { get; set; } public long? PositionTicks { get; set; } } diff --git a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs index 03fe5c8029..391ab7cfd9 100644 --- a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs +++ b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs @@ -213,7 +213,7 @@ namespace MediaBrowser.Providers.Savers builder.Append("" + SecurityElement.Escape(item.DateCreated.ToLocalTime().ToString("G")) + ""); - builder.Append("" + item.DontFetchMeta.ToString().ToLower() + ""); + builder.Append("" + item.IsLocked.ToString().ToLower() + ""); if (item.LockedFields.Count > 0) { diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 520b01af22..2c8069880a 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -127,7 +127,7 @@ namespace MediaBrowser.Server.Implementations.Dto public BaseItemDto GetItemByNameDto(T item, List fields, User user = null) where T : BaseItem, IItemByName { - var libraryItems = user != null ? user.RootFolder.GetRecursiveChildren(user) : + var libraryItems = user != null ? user.RootFolder.GetRecursiveChildren(user) : _libraryManager.RootFolder.RecursiveChildren; return GetItemByNameDto(item, fields, item.GetTaggedItems(libraryItems).ToList(), user); @@ -274,7 +274,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (session.NowPlayingItem != null) { - dto.NowPlayingItem = GetNowPlayingInfo(session.NowPlayingItem, session.NowPlayingMediaVersionId, session.NowPlayingRunTimeTicks); + dto.NowPlayingItem = GetNowPlayingInfo(session.NowPlayingItem, session.NowPlayingMediaSourceId, session.NowPlayingRunTimeTicks); } if (session.UserId.HasValue) @@ -290,11 +290,11 @@ namespace MediaBrowser.Server.Implementations.Dto /// Converts a BaseItem to a BaseItemInfo /// /// The item. - /// The media version identifier. + /// The media version identifier. /// The now playing runtime ticks. /// BaseItemInfo. /// item - private BaseItemInfo GetNowPlayingInfo(BaseItem item, string mediaVersionId, long? nowPlayingRuntimeTicks) + private BaseItemInfo GetNowPlayingInfo(BaseItem item, string mediaSourceId, long? nowPlayingRuntimeTicks) { if (item == null) { @@ -308,7 +308,7 @@ namespace MediaBrowser.Server.Implementations.Dto MediaType = item.MediaType, Type = item.GetClientTypeName(), RunTimeTicks = nowPlayingRuntimeTicks, - MediaVersionId = mediaVersionId + MediaSourceId = mediaSourceId }; info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary); @@ -740,7 +740,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (fields.Contains(ItemFields.Settings)) { dto.LockedFields = item.LockedFields; - dto.LockData = item.DontFetchMeta; + dto.LockData = item.IsLocked; } var hasBudget = item as IHasBudget; @@ -1046,7 +1046,7 @@ namespace MediaBrowser.Server.Implementations.Dto { dto.IsPlaceHolder = supportsPlaceHolders.IsPlaceHolder; } - + // Add audio info var audio = item as Audio; if (audio != null) @@ -1063,8 +1063,8 @@ namespace MediaBrowser.Server.Implementations.Dto dto.AlbumPrimaryImageTag = GetImageCacheTag(albumParent, ImageType.Primary); } - dto.MediaVersions = GetMediaVersions(audio); - dto.MediaVersionCount = 1; + dto.MediaSources = GetMediaSources(audio); + dto.MediaSourceCount = 1; } var album = item as MusicAlbum; @@ -1095,18 +1095,18 @@ namespace MediaBrowser.Server.Implementations.Dto dto.IsHD = video.IsHD; dto.PartCount = video.AdditionalPartIds.Count + 1; - dto.MediaVersionCount = video.AlternateVersionCount + 1; + dto.MediaSourceCount = video.MediaSourceCount; - if (fields.Contains(ItemFields.MediaVersions)) + if (fields.Contains(ItemFields.MediaSources)) { - dto.MediaVersions = GetMediaVersions(video); + dto.MediaSources = GetMediaSources(video); } if (fields.Contains(ItemFields.Chapters)) { List chapters; - if (dto.MediaVersions != null && dto.MediaVersions.Count > 0) + if (dto.MediaSources != null && dto.MediaSources.Count > 0) { chapters = _itemRepo.GetChapters(item.Id).Select(c => GetChapterInfoDto(c, item)).ToList(); } @@ -1130,9 +1130,9 @@ namespace MediaBrowser.Server.Implementations.Dto { List mediaStreams; - if (dto.MediaVersions != null && dto.MediaVersions.Count > 0) + if (dto.MediaSources != null && dto.MediaSources.Count > 0) { - mediaStreams = dto.MediaVersions.Where(i => i.IsPrimaryVersion) + mediaStreams = dto.MediaSources.Where(i => i.IsPrimaryVersion) .SelectMany(i => i.MediaStreams) .ToList(); } @@ -1267,7 +1267,7 @@ namespace MediaBrowser.Server.Implementations.Dto } } - private List GetMediaVersions(Video item) + private List GetMediaSources(Video item) { var result = item.GetAlternateVersions().Select(i => GetVersionInfo(i, false)).ToList(); @@ -1293,9 +1293,9 @@ namespace MediaBrowser.Server.Implementations.Dto .ToList(); } - private List GetMediaVersions(Audio item) + private List GetMediaSources(Audio item) { - var result = new List + var result = new List { GetVersionInfo(item, true) }; @@ -1303,17 +1303,17 @@ namespace MediaBrowser.Server.Implementations.Dto return result; } - private MediaVersionInfo GetVersionInfo(Video i, bool isPrimary) + private MediaSourceInfo GetVersionInfo(Video i, bool isPrimary) { - var mediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery {ItemId = i.Id}).ToList(); + var mediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(); - return new MediaVersionInfo + return new MediaSourceInfo { Id = i.Id.ToString("N"), IsoType = i.IsoType, LocationType = i.LocationType, MediaStreams = mediaStreams, - Name = GetAlternateVersionName(i, mediaStreams), + Name = GetMediaSourceName(i, mediaStreams), Path = GetMappedPath(i), RunTimeTicks = i.RunTimeTicks, Video3DFormat = i.Video3DFormat, @@ -1322,9 +1322,9 @@ namespace MediaBrowser.Server.Implementations.Dto }; } - private MediaVersionInfo GetVersionInfo(Audio i, bool isPrimary) + private MediaSourceInfo GetVersionInfo(Audio i, bool isPrimary) { - return new MediaVersionInfo + return new MediaSourceInfo { Id = i.Id.ToString("N"), LocationType = i.LocationType, @@ -1355,7 +1355,7 @@ namespace MediaBrowser.Server.Implementations.Dto return path; } - private string GetAlternateVersionName(Video video, List mediaStreams) + private string GetMediaSourceName(Video video, List mediaStreams) { var terms = new List(); diff --git a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs index ad2db5abb0..3097495e35 100644 --- a/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs +++ b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs @@ -47,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.Library EnsureName(item, args); item.DontFetchMeta = item.Path.IndexOf("[dontfetchmeta]", StringComparison.OrdinalIgnoreCase) != -1 || - item.Parents.Any(i => i.DontFetchMeta); + item.Parents.Any(i => i.IsLocked); // Make sure DateCreated and DateModified have values EntityResolutionHelper.EnsureDates(fileSystem, item, args, true); diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index d7b2b1321d..13a1e8f165 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -190,7 +190,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies /// The directory service. /// if set to true [support multi file items]. /// Movie. - private T FindMovie(string path, Folder parent, IEnumerable fileSystemEntries, IDirectoryService directoryService, bool supportMultiFileItems, bool supportsAlternateVersions) + private T FindMovie(string path, Folder parent, IEnumerable fileSystemEntries, IDirectoryService directoryService, bool supportMultiFileItems, bool supportsMultipleSources) where T : Video, new() { var movies = new List(); @@ -262,9 +262,9 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies return result; } } - if (supportsAlternateVersions) + if (supportsMultipleSources) { - var result = GetMovieWithAlternateVersions(movies); + var result = GetMovieWithMultipleSources(movies); if (result != null) { @@ -393,7 +393,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies return null; } - private T GetMovieWithAlternateVersions(IEnumerable movies) + private T GetMovieWithMultipleSources(IEnumerable movies) where T : Video, new() { var sortedMovies = movies.OrderBy(i => i.Path).ToList(); diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index c895062617..9d405a1751 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -218,26 +218,26 @@ namespace MediaBrowser.Server.Implementations.Session /// /// The session. /// The item. - /// The media version identifier. + /// The media version identifier. /// if set to true [is paused]. /// if set to true [is muted]. /// The current position ticks. - private void UpdateNowPlayingItem(SessionInfo session, BaseItem item, string mediaVersionId, bool isPaused, bool isMuted, long? currentPositionTicks = null) + private void UpdateNowPlayingItem(SessionInfo session, BaseItem item, string mediaSourceId, bool isPaused, bool isMuted, long? currentPositionTicks = null) { session.IsMuted = isMuted; session.IsPaused = isPaused; session.NowPlayingPositionTicks = currentPositionTicks; session.NowPlayingItem = item; session.LastActivityDate = DateTime.UtcNow; - session.NowPlayingMediaVersionId = mediaVersionId; + session.NowPlayingMediaSourceId = mediaSourceId; - if (string.IsNullOrWhiteSpace(mediaVersionId)) + if (string.IsNullOrWhiteSpace(mediaSourceId)) { session.NowPlayingRunTimeTicks = item.RunTimeTicks; } else { - var version = _libraryManager.GetItemById(new Guid(mediaVersionId)); + var version = _libraryManager.GetItemById(new Guid(mediaSourceId)); session.NowPlayingRunTimeTicks = version.RunTimeTicks; } @@ -261,7 +261,7 @@ namespace MediaBrowser.Server.Implementations.Session session.NowPlayingPositionTicks = null; session.IsPaused = false; session.NowPlayingRunTimeTicks = null; - session.NowPlayingMediaVersionId = null; + session.NowPlayingMediaSourceId = null; } } @@ -368,9 +368,9 @@ namespace MediaBrowser.Server.Implementations.Session var item = info.Item; - var mediaVersionId = GetMediaVersionId(item, info.MediaVersionId); + var mediaSourceId = GetMediaSourceId(item, info.MediaSourceId); - UpdateNowPlayingItem(session, item, mediaVersionId, false, false); + UpdateNowPlayingItem(session, item, mediaSourceId, false, false); session.CanSeek = info.CanSeek; session.QueueableMediaTypes = info.QueueableMediaTypes; @@ -390,7 +390,7 @@ namespace MediaBrowser.Server.Implementations.Session { Item = item, Users = users, - MediaVersionId = info.MediaVersionId + MediaSourceId = info.MediaSourceId }, _logger); } @@ -438,9 +438,9 @@ namespace MediaBrowser.Server.Implementations.Session var session = Sessions.First(i => i.Id.Equals(info.SessionId)); - var mediaVersionId = GetMediaVersionId(info.Item, info.MediaVersionId); + var mediaSourceId = GetMediaSourceId(info.Item, info.MediaSourceId); - UpdateNowPlayingItem(session, info.Item, mediaVersionId, info.IsPaused, info.IsMuted, info.PositionTicks); + UpdateNowPlayingItem(session, info.Item, mediaSourceId, info.IsPaused, info.IsMuted, info.PositionTicks); var key = info.Item.GetUserDataKey(); @@ -456,7 +456,7 @@ namespace MediaBrowser.Server.Implementations.Session Item = info.Item, Users = users, PlaybackPositionTicks = info.PositionTicks, - MediaVersionId = mediaVersionId + MediaSourceId = mediaSourceId }, _logger); } @@ -516,7 +516,7 @@ namespace MediaBrowser.Server.Implementations.Session playedToCompletion = await OnPlaybackStopped(user.Id, key, info.Item, info.PositionTicks).ConfigureAwait(false); } - var mediaVersionId = GetMediaVersionId(info.Item, info.MediaVersionId); + var mediaSourceId = GetMediaSourceId(info.Item, info.MediaSourceId); EventHelper.QueueEventIfNotNull(PlaybackStopped, this, new PlaybackStopEventArgs { @@ -524,22 +524,22 @@ namespace MediaBrowser.Server.Implementations.Session Users = users, PlaybackPositionTicks = info.PositionTicks, PlayedToCompletion = playedToCompletion, - MediaVersionId = mediaVersionId + MediaSourceId = mediaSourceId }, _logger); } - private string GetMediaVersionId(BaseItem item, string reportedMediaVersionId) + private string GetMediaSourceId(BaseItem item, string reportedMediaSourceId) { - if (string.IsNullOrWhiteSpace(reportedMediaVersionId)) + if (string.IsNullOrWhiteSpace(reportedMediaSourceId)) { if (item is Video || item is Audio) { - reportedMediaVersionId = item.Id.ToString("N"); + reportedMediaSourceId = item.Id.ToString("N"); } } - return reportedMediaVersionId; + return reportedMediaSourceId; } private async Task OnPlaybackStopped(Guid userId, string userDataKey, BaseItem item, long? positionTicks) diff --git a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs index 5c4c00e7d2..fe32e23281 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs @@ -225,7 +225,7 @@ namespace MediaBrowser.Server.Implementations.Session if (vals.Length > 3) { - info.MediaVersionId = vals[3]; + info.MediaSourceId = vals[3]; } _sessionManager.OnPlaybackStart(info); @@ -272,7 +272,7 @@ namespace MediaBrowser.Server.Implementations.Session if (vals.Length > 4) { - info.MediaVersionId = vals[4]; + info.MediaSourceId = vals[4]; } _sessionManager.OnPlaybackProgress(info); @@ -316,7 +316,7 @@ namespace MediaBrowser.Server.Implementations.Session if (vals.Length > 2) { - info.MediaVersionId = vals[2]; + info.MediaSourceId = vals[2]; } _sessionManager.OnPlaybackStopped(info); diff --git a/MediaBrowser.Server.Implementations/Sorting/AlphanumComparator.cs b/MediaBrowser.Server.Implementations/Sorting/AlphanumComparator.cs index 39a68b3f6b..b76bf0a9cd 100644 --- a/MediaBrowser.Server.Implementations/Sorting/AlphanumComparator.cs +++ b/MediaBrowser.Server.Implementations/Sorting/AlphanumComparator.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Text; namespace MediaBrowser.Server.Implementations.Sorting diff --git a/MediaBrowser.WebDashboard/ApiClient.js b/MediaBrowser.WebDashboard/ApiClient.js index 47719df8d2..765cae6128 100644 --- a/MediaBrowser.WebDashboard/ApiClient.js +++ b/MediaBrowser.WebDashboard/ApiClient.js @@ -3791,7 +3791,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi * @param {String} userId * @param {String} itemId */ - self.reportPlaybackStart = function (userId, itemId, mediaVersionId, canSeek, queueableMediaTypes) { + self.reportPlaybackStart = function (userId, itemId, mediaSourceId, canSeek, queueableMediaTypes) { if (!userId) { throw new Error("null userId"); @@ -3810,8 +3810,8 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi var msg = [itemId, canSeek, queueableMediaTypes]; - if (mediaVersionId) { - msg.push(mediaVersionId); + if (mediaSourceId) { + msg.push(mediaSourceId); } self.sendWebSocketMessage("PlaybackStart", msg.join('|')); @@ -3825,8 +3825,8 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi QueueableMediaTypes: queueableMediaTypes }; - if (mediaVersionId) { - params.mediaVersionId = mediaVersionId; + if (mediaSourceId) { + params.mediaSourceId = mediaSourceId; } var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, params); @@ -3842,7 +3842,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi * @param {String} userId * @param {String} itemId */ - self.reportPlaybackProgress = function (userId, itemId, mediaVersionId, positionTicks, isPaused, isMuted) { + self.reportPlaybackProgress = function (userId, itemId, mediaSourceId, positionTicks, isPaused, isMuted) { if (!userId) { throw new Error("null userId"); @@ -3861,7 +3861,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi msgData += "|" + (positionTicks == null ? "" : positionTicks); msgData += "|" + (isPaused == null ? "" : isPaused); msgData += "|" + (isMuted == null ? "" : isMuted); - msgData += "|" + (mediaVersionId == null ? "" : mediaVersionId); + msgData += "|" + (mediaSourceId == null ? "" : mediaSourceId); self.sendWebSocketMessage("PlaybackProgress", msgData); @@ -3878,8 +3878,8 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi params.positionTicks = positionTicks; } - if (mediaVersionId) { - params.mediaVersionId = mediaVersionId; + if (mediaSourceId) { + params.mediaSourceId = mediaSourceId; } var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId + "/Progress", params); @@ -3895,7 +3895,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi * @param {String} userId * @param {String} itemId */ - self.reportPlaybackStopped = function (userId, itemId, mediaVersionId, positionTicks) { + self.reportPlaybackStopped = function (userId, itemId, mediaSourceId, positionTicks) { if (!userId) { throw new Error("null userId"); @@ -3911,7 +3911,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi var msg = itemId; msg += "|" + (positionTicks == null ? "" : positionTicks); - msg += "|" + (mediaVersionId == null ? "" : mediaVersionId); + msg += "|" + (mediaSourceId == null ? "" : mediaSourceId); self.sendWebSocketMessage("PlaybackStopped", msg); @@ -3925,8 +3925,8 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi params.positionTicks = positionTicks; } - if (mediaVersionId) { - params.mediaVersionId = mediaVersionId; + if (mediaSourceId) { + params.mediaSourceId = mediaSourceId; } var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, params); diff --git a/MediaBrowser.WebDashboard/packages.config b/MediaBrowser.WebDashboard/packages.config index bbc2c0f068..7396527bb3 100644 --- a/MediaBrowser.WebDashboard/packages.config +++ b/MediaBrowser.WebDashboard/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file -- cgit v1.2.3 From 662929fe8b544346de688dfe4c9626db128c7b6b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 22 Mar 2014 12:31:21 -0400 Subject: remove primary version flag --- MediaBrowser.Model/Dto/MediaVersionInfo.cs | 2 -- MediaBrowser.Server.Implementations/Dto/DtoService.cs | 15 ++++++--------- 2 files changed, 6 insertions(+), 11 deletions(-) (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Model/Dto/MediaVersionInfo.cs b/MediaBrowser.Model/Dto/MediaVersionInfo.cs index 4dfb32dd57..ddb3407877 100644 --- a/MediaBrowser.Model/Dto/MediaVersionInfo.cs +++ b/MediaBrowser.Model/Dto/MediaVersionInfo.cs @@ -22,7 +22,5 @@ namespace MediaBrowser.Model.Dto public Video3DFormat? Video3DFormat { get; set; } public List MediaStreams { get; set; } - - public bool IsPrimaryVersion { get; set; } } } diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 2c8069880a..66a9284d73 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -1132,7 +1132,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (dto.MediaSources != null && dto.MediaSources.Count > 0) { - mediaStreams = dto.MediaSources.Where(i => i.IsPrimaryVersion) + mediaStreams = dto.MediaSources.Where(i => new Guid(i.Id) == item.Id) .SelectMany(i => i.MediaStreams) .ToList(); } @@ -1269,9 +1269,9 @@ namespace MediaBrowser.Server.Implementations.Dto private List GetMediaSources(Video item) { - var result = item.GetAlternateVersions().Select(i => GetVersionInfo(i, false)).ToList(); + var result = item.GetAlternateVersions().Select(GetVersionInfo).ToList(); - result.Add(GetVersionInfo(item, true)); + result.Add(GetVersionInfo(item)); return result.OrderBy(i => { @@ -1289,7 +1289,6 @@ namespace MediaBrowser.Server.Implementations.Dto return stream == null || stream.Width == null ? 0 : stream.Width.Value; }) - .ThenBy(i => i.IsPrimaryVersion ? 0 : 1) .ToList(); } @@ -1303,7 +1302,7 @@ namespace MediaBrowser.Server.Implementations.Dto return result; } - private MediaSourceInfo GetVersionInfo(Video i, bool isPrimary) + private MediaSourceInfo GetVersionInfo(Video i) { var mediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(); @@ -1317,8 +1316,7 @@ namespace MediaBrowser.Server.Implementations.Dto Path = GetMappedPath(i), RunTimeTicks = i.RunTimeTicks, Video3DFormat = i.Video3DFormat, - VideoType = i.VideoType, - IsPrimaryVersion = isPrimary + VideoType = i.VideoType }; } @@ -1331,8 +1329,7 @@ namespace MediaBrowser.Server.Implementations.Dto MediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(), Name = i.Name, Path = GetMappedPath(i), - RunTimeTicks = i.RunTimeTicks, - IsPrimaryVersion = isPrimary + RunTimeTicks = i.RunTimeTicks }; } -- cgit v1.2.3 From 24246ba85fef0e7667b9ab624874a91c28df8419 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 22 Mar 2014 14:25:03 -0400 Subject: support conditions with direct play profiles --- MediaBrowser.Controller/Dlna/DirectPlayProfile.cs | 6 +- MediaBrowser.Dlna/MediaBrowser.Dlna.csproj | 1 + MediaBrowser.Dlna/PlayTo/DlnaController.cs | 35 ++- MediaBrowser.Dlna/PlayTo/PlaylistItem.cs | 78 +----- MediaBrowser.Dlna/PlayTo/PlaylistItemFactory.cs | 278 +++++++++++++++++++++ MediaBrowser.Dlna/PlayTo/StreamHelper.cs | 2 +- .../FileOrganization/EpisodeFileOrganizer.cs | 26 +- .../FileOrganization/NameUtils.cs | 1 + 8 files changed, 332 insertions(+), 95 deletions(-) create mode 100644 MediaBrowser.Dlna/PlayTo/PlaylistItemFactory.cs (limited to 'MediaBrowser.Server.Implementations') diff --git a/MediaBrowser.Controller/Dlna/DirectPlayProfile.cs b/MediaBrowser.Controller/Dlna/DirectPlayProfile.cs index 68e25e2f7b..4b9a43867f 100644 --- a/MediaBrowser.Controller/Dlna/DirectPlayProfile.cs +++ b/MediaBrowser.Controller/Dlna/DirectPlayProfile.cs @@ -68,13 +68,15 @@ namespace MediaBrowser.Controller.Dlna public class ProfileCondition { public ProfileConditionType Condition { get; set; } - public ProfileConditionValue Value { get; set; } + public ProfileConditionValue Property { get; set; } + public string Value { get; set; } } public enum DlnaProfileType { Audio = 0, - Video = 1 + Video = 1, + Photo = 2 } public enum ProfileConditionType diff --git a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj index a7ee05cf32..800fb1b236 100644 --- a/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj +++ b/MediaBrowser.Dlna/MediaBrowser.Dlna.csproj @@ -66,6 +66,7 @@ Code + diff --git a/MediaBrowser.Dlna/PlayTo/DlnaController.cs b/MediaBrowser.Dlna/PlayTo/DlnaController.cs index bda737ad2d..e94663802f 100644 --- a/MediaBrowser.Dlna/PlayTo/DlnaController.cs +++ b/MediaBrowser.Dlna/PlayTo/DlnaController.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller; using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Session; @@ -263,7 +264,7 @@ namespace MediaBrowser.Dlna.PlayTo case PlaystateCommand.Seek: var playlistItem = Playlist.FirstOrDefault(p => p.PlayState == 1); - if (playlistItem != null && playlistItem.Transcode && playlistItem.IsVideo && _currentItem != null) + if (playlistItem != null && playlistItem.Transcode && playlistItem.MediaType == DlnaProfileType.Video && _currentItem != null) { var newItem = CreatePlaylistItem(_currentItem, command.SeekPositionTicks ?? 0, GetServerAddress()); playlistItem.StartPositionTicks = newItem.StartPositionTicks; @@ -394,11 +395,13 @@ namespace MediaBrowser.Dlna.PlayTo var deviceInfo = _device.Properties; - var playlistItem = PlaylistItem.Create(item, _dlnaManager.GetProfile(deviceInfo.ToDeviceIdentification())); + var playlistItem = GetPlaylistItem(item, _dlnaManager.GetProfile(deviceInfo.ToDeviceIdentification())); playlistItem.StartPositionTicks = startPostionTicks; - if (playlistItem.IsAudio) + if (playlistItem.MediaType == DlnaProfileType.Audio) + { playlistItem.StreamUrl = StreamHelper.GetAudioUrl(playlistItem, serverAddress); + } else { playlistItem.StreamUrl = StreamHelper.GetVideoUrl(_device.Properties, playlistItem, streams, serverAddress); @@ -412,6 +415,32 @@ namespace MediaBrowser.Dlna.PlayTo return playlistItem; } + private PlaylistItem GetPlaylistItem(BaseItem item, DeviceProfile profile) + { + var video = item as Video; + + if (video != null) + { + return new PlaylistItemFactory(_itemRepository).Create(video, profile); + } + + var audio = item as Audio; + + if (audio != null) + { + return new PlaylistItemFactory(_itemRepository).Create(audio, profile); + } + + var photo = item as Photo; + + if (photo != null) + { + return new PlaylistItemFactory(_itemRepository).Create(photo, profile); + } + + throw new ArgumentException("Unrecognized item type."); + } + /// /// Plays the items. /// diff --git a/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs b/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs index 4f776807e2..3524575631 100644 --- a/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs +++ b/MediaBrowser.Dlna/PlayTo/PlaylistItem.cs @@ -1,9 +1,4 @@ using MediaBrowser.Controller.Dlna; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Entities; -using System; -using System.IO; -using System.Linq; namespace MediaBrowser.Dlna.PlayTo { @@ -11,11 +6,11 @@ namespace MediaBrowser.Dlna.PlayTo { public string ItemId { get; set; } + public string MediaSourceId { get; set; } + public bool Transcode { get; set; } - public bool IsVideo { get; set; } - - public bool IsAudio { get; set; } + public DlnaProfileType MediaType { get; set; } public string FileFormat { get; set; } @@ -30,72 +25,5 @@ namespace MediaBrowser.Dlna.PlayTo public string Didl { get; set; } public long StartPositionTicks { get; set; } - - public static PlaylistItem Create(BaseItem item, DeviceProfile profile) - { - var playlistItem = new PlaylistItem - { - ItemId = item.Id.ToString() - }; - - DlnaProfileType profileType; - if (string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase)) - { - playlistItem.IsVideo = true; - profileType = DlnaProfileType.Video; - } - else - { - playlistItem.IsAudio = true; - profileType = DlnaProfileType.Audio; - } - - var path = item.Path; - - var directPlay = profile.DirectPlayProfiles.FirstOrDefault(i => i.Type == profileType && IsSupported(i, path)); - - if (directPlay != null) - { - playlistItem.Transcode = false; - playlistItem.FileFormat = Path.GetExtension(path); - playlistItem.MimeType = directPlay.MimeType; - return playlistItem; - } - - var transcodingProfile = profile.TranscodingProfiles.FirstOrDefault(i => i.Type == profileType && IsSupported(profile, i, path)); - - if (transcodingProfile != null) - { - playlistItem.Transcode = true; - //Just to make sure we have a "." for the url, remove it in case a user adds it or not - playlistItem.FileFormat = "." + transcodingProfile.Container.TrimStart('.'); - - playlistItem.MimeType = transcodingProfile.MimeType; - } - - return playlistItem; - } - - private static bool IsSupported(DirectPlayProfile profile, string path) - { - var mediaContainer = Path.GetExtension(path); - - if (!profile.Containers.Any(i => string.Equals("." + i.TrimStart('.'), mediaContainer, StringComparison.OrdinalIgnoreCase))) - { - return false; - } - - // Placeholder for future conditions - - // TODO: Support codec list as additional restriction - - return true; - } - - private static bool IsSupported(DeviceProfile profile, TranscodingProfile transcodingProfile, string path) - { - // Placeholder for future conditions - return true; - } } } \ No newline at end of file diff --git a/MediaBrowser.Dlna/PlayTo/PlaylistItemFactory.cs b/MediaBrowser.Dlna/PlayTo/PlaylistItemFactory.cs new file mode 100644 index 0000000000..2eb51e2149 --- /dev/null +++ b/MediaBrowser.Dlna/PlayTo/PlaylistItemFactory.cs @@ -0,0 +1,278 @@ +using MediaBrowser.Controller.Dlna; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Model.Entities; +using System; +using System.Globalization; +using System.IO; +using System.Linq; + +namespace MediaBrowser.Dlna.PlayTo +{ + public class PlaylistItemFactory + { + private readonly IItemRepository _itemRepo; + private readonly CultureInfo _usCulture = new CultureInfo("en-US"); + + public PlaylistItemFactory(IItemRepository itemRepo) + { + _itemRepo = itemRepo; + } + + public PlaylistItem Create(Audio item, DeviceProfile profile) + { + var playlistItem = new PlaylistItem + { + ItemId = item.Id.ToString("N"), + MediaType = DlnaProfileType.Audio + }; + + var mediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery + { + ItemId = item.Id, + Type = MediaStreamType.Audio + }); + + var audioStream = mediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); + + var directPlay = profile.DirectPlayProfiles + .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsSupported(i, item, audioStream)); + + if (directPlay != null) + { + playlistItem.Transcode = false; + playlistItem.FileFormat = Path.GetExtension(item.Path); + playlistItem.MimeType = directPlay.MimeType; + + return playlistItem; + } + + var transcodingProfile = profile.TranscodingProfiles + .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsSupported(profile, i, item)); + + if (transcodingProfile != null) + { + playlistItem.Transcode = true; + + playlistItem.FileFormat = "." + transcodingProfile.Container.TrimStart('.'); + playlistItem.MimeType = transcodingProfile.MimeType; + } + + return playlistItem; + } + + public PlaylistItem Create(Photo item, DeviceProfile profile) + { + var playlistItem = new PlaylistItem + { + ItemId = item.Id.ToString("N"), + MediaType = DlnaProfileType.Photo + }; + + var directPlay = profile.DirectPlayProfiles + .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsSupported(i, item)); + + if (directPlay != null) + { + playlistItem.Transcode = false; + playlistItem.FileFormat = Path.GetExtension(item.Path); + playlistItem.MimeType = directPlay.MimeType; + + return playlistItem; + } + + var transcodingProfile = profile.TranscodingProfiles + .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsSupported(profile, i, item)); + + if (transcodingProfile != null) + { + playlistItem.Transcode = true; + + playlistItem.FileFormat = "." + transcodingProfile.Container.TrimStart('.'); + playlistItem.MimeType = transcodingProfile.MimeType; + } + + return playlistItem; + } + + public PlaylistItem Create(Video item, DeviceProfile profile) + { + var playlistItem = new PlaylistItem + { + ItemId = item.Id.ToString("N"), + MediaType = DlnaProfileType.Video + }; + + var mediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery + { + ItemId = item.Id + + }).ToList(); + + var audioStream = mediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); + var videoStream = mediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video); + + var directPlay = profile.DirectPlayProfiles + .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsSupported(i, item, videoStream, audioStream)); + + if (directPlay != null) + { + playlistItem.Transcode = false; + playlistItem.FileFormat = Path.GetExtension(item.Path); + playlistItem.MimeType = directPlay.MimeType; + + return playlistItem; + } + + var transcodingProfile = profile.TranscodingProfiles + .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsSupported(profile, i, item)); + + if (transcodingProfile != null) + { + playlistItem.Transcode = true; + + playlistItem.FileFormat = "." + transcodingProfile.Container.TrimStart('.'); + playlistItem.MimeType = transcodingProfile.MimeType; + } + + return playlistItem; + } + + private bool IsSupported(DirectPlayProfile profile, Photo item) + { + var mediaPath = item.Path; + + var mediaContainer = Path.GetExtension(mediaPath); + + if (!profile.Containers.Any(i => string.Equals("." + i.TrimStart('.'), mediaContainer, StringComparison.OrdinalIgnoreCase))) + { + return false; + } + + if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, null, null))) + { + return false; + } + + return true; + } + + private bool IsSupported(DirectPlayProfile profile, Audio item, MediaStream audioStream) + { + var mediaPath = item.Path; + + var mediaContainer = Path.GetExtension(mediaPath); + + if (!profile.Containers.Any(i => string.Equals("." + i.TrimStart('.'), mediaContainer, StringComparison.OrdinalIgnoreCase))) + { + return false; + } + + if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, null, audioStream))) + { + return false; + } + + return true; + } + + private bool IsSupported(DirectPlayProfile profile, Video item, MediaStream videoStream, MediaStream audioStream) + { + if (item.VideoType != VideoType.VideoFile) + { + return false; + } + + var mediaPath = item.Path; + + var mediaContainer = Path.GetExtension(mediaPath); + + if (!profile.Containers.Any(i => string.Equals("." + i.TrimStart('.'), mediaContainer, StringComparison.OrdinalIgnoreCase))) + { + return false; + } + + if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, videoStream, audioStream))) + { + return false; + } + + return true; + } + + private bool IsSupported(DeviceProfile profile, TranscodingProfile transcodingProfile, Audio item) + { + // Placeholder for future conditions + return true; + } + + private bool IsSupported(DeviceProfile profile, TranscodingProfile transcodingProfile, Photo item) + { + // Placeholder for future conditions + return true; + } + + private bool IsSupported(DeviceProfile profile, TranscodingProfile transcodingProfile, Video item) + { + // Placeholder for future conditions + return true; + } + + private bool IsConditionSatisfied(ProfileCondition condition, string mediaPath, MediaStream videoStream, MediaStream audioStream) + { + var actualValue = GetConditionValue(condition, mediaPath, videoStream, audioStream); + + if (actualValue.HasValue) + { + long expected; + if (long.TryParse("", NumberStyles.Any, _usCulture, out expected)) + { + switch (condition.Condition) + { + case ProfileConditionType.Equals: + return actualValue.Value == expected; + case ProfileConditionType.GreaterThanEqual: + return actualValue.Value >= expected; + case ProfileConditionType.LessThanEqual: + return actualValue.Value <= expected; + case ProfileConditionType.NotEquals: + return actualValue.Value != expected; + default: + throw new InvalidOperationException("Unexpected ProfileConditionType"); + } + } + } + + return false; + } + + private long? GetConditionValue(ProfileCondition condition, string mediaPath, MediaStream videoStream, MediaStream audioStream) + { + switch (condition.Property) + { + case ProfileConditionValue.AudioBitrate: + return audioStream == null ? null : audioStream.BitRate; + case ProfileConditionValue.AudioChannels: + return audioStream == null ? null : audioStream.Channels; + case ProfileConditionValue.Filesize: + return new FileInfo(mediaPath).Length; + case ProfileConditionValue.VideoBitrate: + return videoStream == null ? null : videoStream.BitRate; + case ProfileConditionValue.VideoFramerate: + return videoStream == null ? null : (ConvertToLong(videoStream.AverageFrameRate ?? videoStream.RealFrameRate)); + case ProfileConditionValue.VideoHeight: + return videoStream == null ? null : videoStream.Height; + case ProfileConditionValue.VideoWidth: + return videoStream == null ? null : videoStream.Width; + default: + throw new InvalidOperationException("Unexpected Property"); + } + } + + private long? ConvertToLong(float? val) + { + return val.HasValue ? Convert.ToInt64(val.Value) : (long?)null; + } + } +} diff --git a/MediaBrowser.Dlna/PlayTo/StreamHelper.cs b/MediaBrowser.Dlna/PlayTo/StreamHelper.cs index 97d208aa37..f5025fdd61 100644 --- a/MediaBrowser.Dlna/PlayTo/StreamHelper.cs +++ b/MediaBrowser.Dlna/PlayTo/StreamHelper.cs @@ -60,7 +60,7 @@ namespace MediaBrowser.Dlna.PlayTo { contentFeatures = "DLNA.ORG_PN=MPEG_PS_PAL"; } - else if (item.IsVideo) + else if (item.MediaType == Controller.Dlna.DlnaProfileType.Video) { //Default to AVI for video contentFeatures = "DLNA.ORG_PN=AVI"; diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs index 5d326f1caa..d448118860 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs @@ -180,7 +180,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization result.StatusMessage = string.Empty; return; } - + if (fileExists || otherDuplicatePaths.Count > 0) { result.Status = FileSortingStatus.SkippedExisting; @@ -453,24 +453,22 @@ namespace MediaBrowser.Server.Implementations.FileOrganization private bool IsSameEpisode(string sourcePath, string newPath) { + var sourceFileInfo = new FileInfo(sourcePath); + var destinationFileInfo = new FileInfo(newPath); - FileInfo sourceFileInfo = new FileInfo(sourcePath); - FileInfo destinationFileInfo = new FileInfo(newPath); - - try - { - if (sourceFileInfo.Length == destinationFileInfo.Length) - { - return true; - } - } - catch (FileNotFoundException) + try + { + if (sourceFileInfo.Length == destinationFileInfo.Length) { - return false; + return true; } - + } + catch (FileNotFoundException) + { return false; + } + return false; } } } diff --git a/MediaBrowser.Server.Implementations/FileOrganization/NameUtils.cs b/MediaBrowser.Server.Implementations/FileOrganization/NameUtils.cs index 23d0363cb8..7f936791a7 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/NameUtils.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/NameUtils.cs @@ -67,6 +67,7 @@ namespace MediaBrowser.Server.Implementations.FileOrganization .Replace("!", " ") .Replace("(", " ") .Replace(")", " ") + .Replace(":", " ") .Replace(",", " ") .Replace("-", " ") .Replace(" a ", String.Empty, StringComparison.OrdinalIgnoreCase) -- cgit v1.2.3