Răsfoiți Sursa

update tabs

Luke Pulverenti 9 ani în urmă
părinte
comite
995c34437e

+ 187 - 206
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;
     //    }
     //}
 }

+ 4 - 0
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)
             {

+ 2 - 1
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;
             }

+ 32 - 1
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>();