aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs393
-rw-r--r--MediaBrowser.Dlna/Main/DlnaEntryPoint.cs4
-rw-r--r--MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs3
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs33
4 files changed, 225 insertions, 208 deletions
diff --git a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
index b6ee3d434..a8e778751 100644
--- a/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
+++ b/MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
@@ -1,37 +1,190 @@
-namespace MediaBrowser.Dlna.Channels
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Channels;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Dlna.ContentDirectory;
+using MediaBrowser.Dlna.PlayTo;
+using MediaBrowser.Model.Channels;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
+
+namespace MediaBrowser.Dlna.Channels
{
- //public class DlnaChannelFactory : IChannelFactory, IDisposable
+ //public class DlnaChannel : IChannel, IDisposable
//{
- // private readonly IServerConfigurationManager _config;
// private readonly ILogger _logger;
// private readonly IHttpClient _httpClient;
+ // private readonly IServerConfigurationManager _config;
+ // private List<Device> _servers = new List<Device>();
// private readonly IDeviceDiscovery _deviceDiscovery;
-
// private readonly SemaphoreSlim _syncLock = new SemaphoreSlim(1, 1);
- // private List<Device> _servers = new List<Device>();
-
- // public static DlnaChannelFactory Instance;
-
// private Func<List<string>> _localServersLookup;
- // public DlnaChannelFactory(IServerConfigurationManager config, IHttpClient httpClient, ILogger logger, IDeviceDiscovery deviceDiscovery)
+ // public static DlnaChannel Current;
+
+ // public DlnaChannel(ILogger logger, IHttpClient httpClient, IDeviceDiscovery deviceDiscovery, IServerConfigurationManager config)
// {
- // _config = config;
- // _httpClient = httpClient;
// _logger = logger;
+ // _httpClient = httpClient;
// _deviceDiscovery = deviceDiscovery;
- // Instance = this;
+ // _config = config;
+ // Current = this;
+ // }
+
+ // public string Name
+ // {
+ // get { return "Devices"; }
+ // }
+
+ // public string Description
+ // {
+ // get { return string.Empty; }
+ // }
+
+ // public string DataVersion
+ // {
+ // get { return DateTime.UtcNow.Ticks.ToString(); }
+ // }
+
+ // public string HomePageUrl
+ // {
+ // get { return string.Empty; }
+ // }
+
+ // public ChannelParentalRating ParentalRating
+ // {
+ // get { return ChannelParentalRating.GeneralAudience; }
+ // }
+
+ // public InternalChannelFeatures GetChannelFeatures()
+ // {
+ // return new InternalChannelFeatures
+ // {
+ // ContentTypes = new List<ChannelMediaContentType>
+ // {
+ // ChannelMediaContentType.Song,
+ // ChannelMediaContentType.Clip
+ // },
+
+ // MediaTypes = new List<ChannelMediaType>
+ // {
+ // ChannelMediaType.Audio,
+ // ChannelMediaType.Video,
+ // ChannelMediaType.Photo
+ // }
+ // };
+ // }
+
+ // public bool IsEnabledFor(string userId)
+ // {
+ // return true;
+ // }
+
+ // public Task<DynamicImageResponse> GetChannelImage(ImageType type, CancellationToken cancellationToken)
+ // {
+ // throw new NotImplementedException();
+ // }
+
+ // public IEnumerable<ImageType> GetSupportedChannelImages()
+ // {
+ // return new List<ImageType>
+ // {
+ // ImageType.Primary
+ // };
// }
- // internal void Start(Func<List<string>> localServersLookup)
+ // public void Start(Func<List<string>> localServersLookup)
// {
// _localServersLookup = localServersLookup;
- // //deviceDiscovery.DeviceDiscovered += deviceDiscovery_DeviceDiscovered;
+ // _deviceDiscovery.DeviceDiscovered -= deviceDiscovery_DeviceDiscovered;
+ // _deviceDiscovery.DeviceLeft -= deviceDiscovery_DeviceLeft;
+
+ // _deviceDiscovery.DeviceDiscovered += deviceDiscovery_DeviceDiscovered;
// _deviceDiscovery.DeviceLeft += deviceDiscovery_DeviceLeft;
// }
+ // public async Task<ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
+ // {
+ // if (string.IsNullOrWhiteSpace(query.FolderId))
+ // {
+ // return await GetServers(query, cancellationToken).ConfigureAwait(false);
+ // }
+
+ // return new ChannelItemResult();
+
+ // //var idParts = query.FolderId.Split('|');
+ // //var folderId = idParts.Length == 2 ? idParts[1] : null;
+
+ // //var result = await new ContentDirectoryBrowser(_httpClient, _logger).Browse(new ContentDirectoryBrowseRequest
+ // //{
+ // // Limit = query.Limit,
+ // // StartIndex = query.StartIndex,
+ // // ParentId = folderId,
+ // // ContentDirectoryUrl = ControlUrl
+
+ // //}, cancellationToken).ConfigureAwait(false);
+
+ // //items = result.Items.ToList();
+
+ // //var list = items.ToList();
+ // //var count = list.Count;
+
+ // //list = ApplyPaging(list, query).ToList();
+
+ // //return new ChannelItemResult
+ // //{
+ // // Items = list,
+ // // TotalRecordCount = count
+ // //};
+ // }
+
+ // public async Task<ChannelItemResult> GetServers(InternalChannelItemQuery query, CancellationToken cancellationToken)
+ // {
+ // await _syncLock.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+ // try
+ // {
+ // var items = _servers.Select(i =>
+ // {
+ // var service = i.Properties.Services
+ // .FirstOrDefault(s => string.Equals(s.ServiceType, "urn:schemas-upnp-org:service:ContentDirectory:1", StringComparison.OrdinalIgnoreCase));
+
+ // var controlUrl = service == null ? null : (_servers[0].Properties.BaseUrl.TrimEnd('/') + "/" + service.ControlUrl.TrimStart('/'));
+
+ // if (string.IsNullOrWhiteSpace(controlUrl))
+ // {
+ // return null;
+ // }
+
+ // return new ChannelItemInfo
+ // {
+ // Id = i.Properties.UUID,
+ // Name = i.Properties.Name,
+ // Type = ChannelItemType.Folder
+ // };
+
+ // }).Where(i => i != null).ToList();
+
+ // return new ChannelItemResult
+ // {
+ // TotalRecordCount = items.Count,
+ // Items = items
+ // };
+ // }
+ // finally
+ // {
+ // _syncLock.Release();
+ // }
+ // }
+
// async void deviceDiscovery_DeviceDiscovered(object sender, SsdpMessageEventArgs e)
// {
// string usn;
@@ -57,16 +210,13 @@
// }
// }
- // if (GetExistingServers(usn).Any())
- // {
- // return;
- // }
-
// await _syncLock.WaitAsync().ConfigureAwait(false);
+ // var serverList = _servers.ToList();
+
// try
// {
- // if (GetExistingServers(usn).Any())
+ // if (GetExistingServers(serverList, usn).Any())
// {
// return;
// }
@@ -74,9 +224,9 @@
// var device = await Device.CreateuPnpDeviceAsync(new Uri(location), _httpClient, _config, _logger)
// .ConfigureAwait(false);
- // if (!_servers.Any(i => string.Equals(i.Properties.UUID, device.Properties.UUID, StringComparison.OrdinalIgnoreCase)))
+ // if (!serverList.Any(i => string.Equals(i.Properties.UUID, device.Properties.UUID, StringComparison.OrdinalIgnoreCase)))
// {
- // _servers.Add(device);
+ // serverList.Add(device);
// }
// }
// catch (Exception ex)
@@ -102,23 +252,22 @@
// return;
// }
- // if (!GetExistingServers(usn).Any())
- // {
- // return;
- // }
-
// await _syncLock.WaitAsync().ConfigureAwait(false);
// try
// {
- // var list = _servers.ToList();
+ // var serverList = _servers.ToList();
- // foreach (var device in GetExistingServers(usn).ToList())
+ // var matchingServers = GetExistingServers(serverList, usn);
+ // if (matchingServers.Count > 0)
// {
- // list.Remove(device);
- // }
+ // foreach (var device in matchingServers)
+ // {
+ // serverList.Remove(device);
+ // }
- // _servers = list;
+ // _servers = serverList;
+ // }
// }
// finally
// {
@@ -140,185 +289,17 @@
// return true;
// }
- // private IEnumerable<Device> GetExistingServers(string usn)
- // {
- // return _servers
- // .Where(i => usn.IndexOf(i.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1);
- // }
-
- // public IEnumerable<IChannel> GetChannels()
+ // private List<Device> GetExistingServers(List<Device> allDevices, string usn)
// {
- // //if (_servers.Count > 0)
- // //{
- // // var service = _servers[0].Properties.Services
- // // .FirstOrDefault(i => string.Equals(i.ServiceType, "urn:schemas-upnp-org:service:ContentDirectory:1", StringComparison.OrdinalIgnoreCase));
-
- // // var controlUrl = service == null ? null : (_servers[0].Properties.BaseUrl.TrimEnd('/') + "/" + service.ControlUrl.TrimStart('/'));
-
- // // if (!string.IsNullOrEmpty(controlUrl))
- // // {
- // // return new List<IChannel>
- // // {
- // // new ServerChannel(_servers.ToList(), _httpClient, _logger, controlUrl)
- // // };
- // // }
- // //}
-
- // return new List<IChannel>();
+ // return allDevices
+ // .Where(i => usn.IndexOf(i.Properties.UUID, StringComparison.OrdinalIgnoreCase) != -1)
+ // .ToList();
// }
// public void Dispose()
// {
- // if (_deviceDiscovery != null)
- // {
- // _deviceDiscovery.DeviceDiscovered -= deviceDiscovery_DeviceDiscovered;
- // _deviceDiscovery.DeviceLeft -= deviceDiscovery_DeviceLeft;
- // }
- // }
- //}
-
- //public class ServerChannel : IChannel, IFactoryChannel
- //{
- // private readonly IHttpClient _httpClient;
- // private readonly ILogger _logger;
- // public string ControlUrl { get; set; }
- // public List<Device> Servers { get; set; }
-
- // public ServerChannel(IHttpClient httpClient, ILogger logger)
- // {
- // _httpClient = httpClient;
- // _logger = logger;
- // Servers = new List<Device>();
- // }
-
- // public string Name
- // {
- // get { return "Devices"; }
- // }
-
- // public string Description
- // {
- // get { return string.Empty; }
- // }
-
- // public string DataVersion
- // {
- // get { return DateTime.UtcNow.Ticks.ToString(); }
- // }
-
- // public string HomePageUrl
- // {
- // get { return string.Empty; }
- // }
-
- // public ChannelParentalRating ParentalRating
- // {
- // get { return ChannelParentalRating.GeneralAudience; }
- // }
-
- // public InternalChannelFeatures GetChannelFeatures()
- // {
- // return new InternalChannelFeatures
- // {
- // ContentTypes = new List<ChannelMediaContentType>
- // {
- // ChannelMediaContentType.Song,
- // ChannelMediaContentType.Clip
- // },
-
- // MediaTypes = new List<ChannelMediaType>
- // {
- // ChannelMediaType.Audio,
- // ChannelMediaType.Video,
- // ChannelMediaType.Photo
- // }
- // };
- // }
-
- // public bool IsEnabledFor(string userId)
- // {
- // return true;
- // }
-
- // public async Task<ChannelItemResult> GetChannelItems(InternalChannelItemQuery query, CancellationToken cancellationToken)
- // {
- // IEnumerable<ChannelItemInfo> items;
-
- // if (string.IsNullOrWhiteSpace(query.FolderId))
- // {
- // items = Servers.Select(i => new ChannelItemInfo
- // {
- // FolderType = ChannelFolderType.Container,
- // Id = GetServerId(i),
- // Name = i.Properties.Name,
- // Overview = i.Properties.ModelDescription,
- // Type = ChannelItemType.Folder
- // });
- // }
- // else
- // {
- // var idParts = query.FolderId.Split('|');
- // var folderId = idParts.Length == 2 ? idParts[1] : null;
-
- // var result = await new ContentDirectoryBrowser(_httpClient, _logger).Browse(new ContentDirectoryBrowseRequest
- // {
- // Limit = query.Limit,
- // StartIndex = query.StartIndex,
- // ParentId = folderId,
- // ContentDirectoryUrl = ControlUrl
-
- // }, cancellationToken).ConfigureAwait(false);
-
- // items = result.Items.ToList();
- // }
-
- // var list = items.ToList();
- // var count = list.Count;
-
- // list = ApplyPaging(list, query).ToList();
-
- // return new ChannelItemResult
- // {
- // Items = list,
- // TotalRecordCount = count
- // };
- // }
-
- // private string GetServerId(Device device)
- // {
- // return device.Properties.UUID.GetMD5().ToString("N");
- // }
-
- // private IEnumerable<T> ApplyPaging<T>(IEnumerable<T> items, InternalChannelItemQuery query)
- // {
- // if (query.StartIndex.HasValue)
- // {
- // items = items.Skip(query.StartIndex.Value);
- // }
-
- // if (query.Limit.HasValue)
- // {
- // items = items.Take(query.Limit.Value);
- // }
-
- // return items;
- // }
-
- // public Task<DynamicImageResponse> GetChannelImage(ImageType type, CancellationToken cancellationToken)
- // {
- // // TODO: Implement
- // return Task.FromResult(new DynamicImageResponse
- // {
- // HasImage = false
- // });
- // }
-
- // public IEnumerable<ImageType> GetSupportedChannelImages()
- // {
- // return new List<ImageType>
- // {
- // ImageType.Primary
- // };
+ // _deviceDiscovery.DeviceDiscovered -= deviceDiscovery_DeviceDiscovered;
+ // _deviceDiscovery.DeviceLeft -= deviceDiscovery_DeviceLeft;
// }
//}
}
diff --git a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
index a2e9cd60e..22f308979 100644
--- a/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
+++ b/MediaBrowser.Dlna/Main/DlnaEntryPoint.cs
@@ -14,7 +14,9 @@ using MediaBrowser.Dlna.Ssdp;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
+using System.Linq;
using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Dlna.Channels;
namespace MediaBrowser.Dlna.Main
{
@@ -167,6 +169,8 @@ namespace MediaBrowser.Dlna.Main
try
{
((DeviceDiscovery)_deviceDiscovery).Start(_ssdpHandler);
+
+ //DlnaChannel.Current.Start(() => _registeredServerIds.ToList());
}
catch (Exception ex)
{
diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
index 1a95bdf9d..44c69d4c1 100644
--- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
+++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
@@ -548,7 +548,8 @@ namespace MediaBrowser.MediaEncoding.Probing
private void NormalizeStreamTitle(MediaStream stream)
{
- if (string.Equals(stream.Title, "sdh", StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(stream.Title, "sdh", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(stream.Title, "cc", StringComparison.OrdinalIgnoreCase))
{
stream.Title = null;
}
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index f85be5100..99ab07648 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -1383,6 +1383,28 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
}
+ private QueryResult<BaseItem> GetEmbyRecordings(RecordingQuery query, User user)
+ {
+ var folders = EmbyTV.EmbyTV.Current.GetRecordingFolders()
+ .SelectMany(i => i.Locations)
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .Select(i => _libraryManager.FindByPath(i, true))
+ .Where(i => i != null)
+ .Where(i => i.IsVisibleStandalone(user))
+ .ToList();
+
+ var items = _libraryManager.GetItemsResult(new InternalItemsQuery(user)
+ {
+ MediaTypes = new[] { MediaType.Video },
+ Recursive = true,
+ AncestorIds = folders.Select(i => i.Id.ToString("N")).ToArray(),
+ ExcludeLocationTypes = new[] { LocationType.Virtual },
+ Limit = Math.Min(10, query.Limit ?? int.MaxValue)
+ });
+
+ return items;
+ }
+
public async Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, CancellationToken cancellationToken)
{
var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId);
@@ -1391,6 +1413,15 @@ namespace MediaBrowser.Server.Implementations.LiveTv
return new QueryResult<BaseItem>();
}
+ if (user != null && !(query.IsInProgress ?? false))
+ {
+ var initialResult = GetEmbyRecordings(query, user);
+ if (initialResult.TotalRecordCount > 0)
+ {
+ return initialResult;
+ }
+ }
+
await RefreshRecordings(cancellationToken).ConfigureAwait(false);
var internalQuery = new InternalItemsQuery(user)
@@ -2060,7 +2091,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}, cancellationToken).ConfigureAwait(false);
- var recordings = recordingResult.Items.Cast<ILiveTvRecording>().ToList();
+ var recordings = recordingResult.Items.OfType<ILiveTvRecording>().ToList();
var groups = new List<BaseItemDto>();