aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
authorTim Hobbs <jesus.tesh@gmail.com>2014-03-24 05:22:11 -0700
committerTim Hobbs <jesus.tesh@gmail.com>2014-03-24 05:22:11 -0700
commit543ce24c1051d10b32c0dae5277ee37c27daceae (patch)
treea45f20a51af3842097e1ca98ff7653a6a8523675 /MediaBrowser.Server.Implementations
parentcf5e89d045c616db8a4e83beae0a38c94fcb3e42 (diff)
parent9b294c8bc96b31f6c458cc47fa8d330be2df086a (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs138
-rw-r--r--MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs26
-rw-r--r--MediaBrowser.Server.Implementations/FileOrganization/NameUtils.cs1
-rw-r--r--MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Library/ResolverHelper.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs8
-rw-r--r--MediaBrowser.Server.Implementations/Roku/RokuControllerFactory.cs5
-rw-r--r--MediaBrowser.Server.Implementations/Session/SessionManager.cs56
-rw-r--r--MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs15
-rw-r--r--MediaBrowser.Server.Implementations/Sorting/AlphanumComparator.cs3
10 files changed, 157 insertions, 101 deletions
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index c94cdda84..66a9284d7 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>(T item, List<ItemFields> 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);
@@ -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.NowPlayingMediaSourceId, session.NowPlayingRunTimeTicks);
}
if (session.UserId.HasValue)
@@ -288,9 +290,11 @@ namespace MediaBrowser.Server.Implementations.Dto
/// Converts a BaseItem to a BaseItemInfo
/// </summary>
/// <param name="item">The item.</param>
+ /// <param name="mediaSourceId">The media version identifier.</param>
+ /// <param name="nowPlayingRuntimeTicks">The now playing runtime ticks.</param>
/// <returns>BaseItemInfo.</returns>
/// <exception cref="System.ArgumentNullException">item</exception>
- public BaseItemInfo GetBaseItemInfo(BaseItem item)
+ private BaseItemInfo GetNowPlayingInfo(BaseItem item, string mediaSourceId, 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,
+ MediaSourceId = mediaSourceId
};
info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary);
@@ -735,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;
@@ -1041,7 +1046,7 @@ namespace MediaBrowser.Server.Implementations.Dto
{
dto.IsPlaceHolder = supportsPlaceHolders.IsPlaceHolder;
}
-
+
// Add audio info
var audio = item as Audio;
if (audio != null)
@@ -1058,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;
@@ -1090,22 +1095,20 @@ 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<ChapterInfoDto> chapters;
- if (dto.MediaVersions != null && dto.MediaVersions.Count > 0)
+ if (dto.MediaSources != null && dto.MediaSources.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
{
@@ -1127,9 +1130,9 @@ namespace MediaBrowser.Server.Implementations.Dto
{
List<MediaStream> 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 => new Guid(i.Id) == item.Id)
.SelectMany(i => i.MediaStreams)
.ToList();
}
@@ -1264,11 +1267,11 @@ namespace MediaBrowser.Server.Implementations.Dto
}
}
- private List<MediaVersionInfo> GetMediaVersions(Video item)
+ private List<MediaSourceInfo> 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 =>
{
@@ -1286,49 +1289,47 @@ namespace MediaBrowser.Server.Implementations.Dto
return stream == null || stream.Width == null ? 0 : stream.Width.Value;
})
- .ThenBy(i => i.IsPrimaryVersion ? 0 : 1)
.ToList();
}
- private List<MediaVersionInfo> GetMediaVersions(Audio item)
+ private List<MediaSourceInfo> GetMediaSources(Audio item)
{
- var result = new List<MediaVersionInfo>();
-
- result.Add(GetVersionInfo(item, true));
+ var result = new List<MediaSourceInfo>
+ {
+ GetVersionInfo(item, true)
+ };
return result;
}
- private MediaVersionInfo GetVersionInfo(Video i, bool isPrimary)
+ private MediaSourceInfo GetVersionInfo(Video i)
{
- return new MediaVersionInfo
- {
- Chapters = _itemRepo.GetChapters(i.Id).Select(c => GetChapterInfoDto(c, i)).ToList(),
+ var mediaStreams = _itemRepo.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList();
- ItemId = i.Id.ToString("N"),
+ return new MediaSourceInfo
+ {
+ 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 = GetMediaSourceName(i, mediaStreams),
Path = GetMappedPath(i),
RunTimeTicks = i.RunTimeTicks,
Video3DFormat = i.Video3DFormat,
- VideoType = i.VideoType,
- IsPrimaryVersion = isPrimary
+ VideoType = i.VideoType
};
}
- private MediaVersionInfo GetVersionInfo(Audio i, bool isPrimary)
+ private MediaSourceInfo GetVersionInfo(Audio i, bool isPrimary)
{
- return new MediaVersionInfo
+ return new MediaSourceInfo
{
- 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,
Path = GetMappedPath(i),
- RunTimeTicks = i.RunTimeTicks,
- IsPrimaryVersion = isPrimary
+ RunTimeTicks = i.RunTimeTicks
};
}
@@ -1351,32 +1352,29 @@ namespace MediaBrowser.Server.Implementations.Dto
return path;
}
- private string GetAlternateVersionName(Video video)
+ private string GetMediaSourceName(Video video, List<MediaStream> mediaStreams)
{
- var name = "";
+ var terms = new List<string>();
- 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 +1382,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 +1401,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/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
index 5d326f1ca..d44811886 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 23d0363cb..7f936791a 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)
diff --git a/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs b/MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
index 65bbb35ba..0a0b3f4bc 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/Library/ResolverHelper.cs b/MediaBrowser.Server.Implementations/Library/ResolverHelper.cs
index ad2db5abb..3097495e3 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 d7b2b1321..13a1e8f16 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
/// <param name="directoryService">The directory service.</param>
/// <param name="supportMultiFileItems">if set to <c>true</c> [support multi file items].</param>
/// <returns>Movie.</returns>
- private T FindMovie<T>(string path, Folder parent, IEnumerable<FileSystemInfo> fileSystemEntries, IDirectoryService directoryService, bool supportMultiFileItems, bool supportsAlternateVersions)
+ private T FindMovie<T>(string path, Folder parent, IEnumerable<FileSystemInfo> fileSystemEntries, IDirectoryService directoryService, bool supportMultiFileItems, bool supportsMultipleSources)
where T : Video, new()
{
var movies = new List<T>();
@@ -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<T>(IEnumerable<T> movies)
+ private T GetMovieWithMultipleSources<T>(IEnumerable<T> movies)
where T : Video, new()
{
var sortedMovies = movies.OrderBy(i => i.Path).ToList();
diff --git a/MediaBrowser.Server.Implementations/Roku/RokuControllerFactory.cs b/MediaBrowser.Server.Implementations/Roku/RokuControllerFactory.cs
index 71f70421a..53f28e7ae 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<string> { 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 1fb5af127..9d405a175 100644
--- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs
+++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs
@@ -218,15 +218,29 @@ namespace MediaBrowser.Server.Implementations.Session
/// </summary>
/// <param name="session">The session.</param>
/// <param name="item">The item.</param>
+ /// <param name="mediaSourceId">The media version identifier.</param>
/// <param name="isPaused">if set to <c>true</c> [is paused].</param>
+ /// <param name="isMuted">if set to <c>true</c> [is muted].</param>
/// <param name="currentPositionTicks">The current position ticks.</param>
- private void UpdateNowPlayingItem(SessionInfo session, BaseItem item, 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.NowPlayingMediaSourceId = mediaSourceId;
+
+ if (string.IsNullOrWhiteSpace(mediaSourceId))
+ {
+ session.NowPlayingRunTimeTicks = item.RunTimeTicks;
+ }
+ else
+ {
+ var version = _libraryManager.GetItemById(new Guid(mediaSourceId));
+
+ session.NowPlayingRunTimeTicks = version.RunTimeTicks;
+ }
}
/// <summary>
@@ -246,6 +260,8 @@ namespace MediaBrowser.Server.Implementations.Session
session.NowPlayingItem = null;
session.NowPlayingPositionTicks = null;
session.IsPaused = false;
+ session.NowPlayingRunTimeTicks = null;
+ session.NowPlayingMediaSourceId = null;
}
}
@@ -352,7 +368,9 @@ namespace MediaBrowser.Server.Implementations.Session
var item = info.Item;
- UpdateNowPlayingItem(session, item, false, false);
+ var mediaSourceId = GetMediaSourceId(item, info.MediaSourceId);
+
+ UpdateNowPlayingItem(session, item, mediaSourceId, 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,
+ MediaSourceId = info.MediaSourceId
}, _logger);
}
@@ -405,7 +424,7 @@ namespace MediaBrowser.Server.Implementations.Session
/// <returns>Task.</returns>
/// <exception cref="System.ArgumentNullException"></exception>
/// <exception cref="System.ArgumentOutOfRangeException">positionTicks</exception>
- 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 mediaSourceId = GetMediaSourceId(info.Item, info.MediaSourceId);
+
+ UpdateNowPlayingItem(session, info.Item, mediaSourceId, 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,
+ MediaSourceId = mediaSourceId
}, _logger);
}
@@ -458,7 +480,7 @@ namespace MediaBrowser.Server.Implementations.Session
/// <returns>Task.</returns>
/// <exception cref="System.ArgumentNullException">info</exception>
/// <exception cref="System.ArgumentOutOfRangeException">positionTicks</exception>
- 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 mediaSourceId = GetMediaSourceId(info.Item, info.MediaSourceId);
+
EventHelper.QueueEventIfNotNull(PlaybackStopped, this, new PlaybackStopEventArgs
{
Item = info.Item,
Users = users,
PlaybackPositionTicks = info.PositionTicks,
- PlayedToCompletion = playedToCompletion
+ PlayedToCompletion = playedToCompletion,
+ MediaSourceId = mediaSourceId
}, _logger);
}
+ private string GetMediaSourceId(BaseItem item, string reportedMediaSourceId)
+ {
+ if (string.IsNullOrWhiteSpace(reportedMediaSourceId))
+ {
+ if (item is Video || item is Audio)
+ {
+ reportedMediaSourceId = item.Id.ToString("N");
+ }
+ }
+
+ return reportedMediaSourceId;
+ }
+
private async Task<bool> 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 e5fbc7d9f..fe32e2328 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.MediaSourceId = vals[3];
+ }
+
_sessionManager.OnPlaybackStart(info);
}
}
@@ -265,6 +270,11 @@ namespace MediaBrowser.Server.Implementations.Session
SessionId = session.Id
};
+ if (vals.Length > 4)
+ {
+ info.MediaSourceId = vals[4];
+ }
+
_sessionManager.OnPlaybackProgress(info);
}
}
@@ -304,6 +314,11 @@ namespace MediaBrowser.Server.Implementations.Session
SessionId = session.Id
};
+ if (vals.Length > 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 39a68b3f6..b76bf0a9c 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