/// <summary> /// Gets the video URL. /// </summary> /// <param name="deviceProperties">The device properties.</param> /// <param name="item">The item.</param> /// <param name="streams">The streams.</param> /// <param name="serverAddress">The server address.</param> /// <returns>The url to send to the device</returns> internal static string GetVideoUrl(DeviceProperties deviceProperties, PlaylistItem item, List <MediaStream> streams, string serverAddress) { if (!item.Transcode) { return(string.Format("{0}/Videos/{1}/stream.{2}?Static=True", serverAddress, item.ItemId, item.FileFormat)); } var videostream = streams.Where(m => m.Type == MediaStreamType.Video).OrderBy(m => m.IsDefault).FirstOrDefault(); var audiostream = streams.Where(m => m.Type == MediaStreamType.Audio).OrderBy(m => m.IsDefault).FirstOrDefault(); var videoCodec = GetVideoCodec(videostream); var audioCodec = GetAudioCodec(audiostream); int?videoBitrate = null; int?audioBitrate = null; int?audioChannels = null; if (videoCodec != VideoCodecs.Copy) { videoBitrate = 2000000; } if (audioCodec != AudioCodecs.Copy) { audioBitrate = 128000; audioChannels = 2; } string dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, videoCodec, audioCodec, null, null, videoBitrate, audioChannels, audioBitrate, item.StartPositionTicks, "baseline", "3"); return(string.Format("{0}/Videos/{1}/stream.{2}?{3}", serverAddress, item.ItemId, item.FileFormat, dlnaCommand)); }
public static async Task<Device> CreateuPnpDeviceAsync(Uri url, IHttpClient httpClient, ILogger logger) { var ssdpHttpClient = new SsdpHttpClient(httpClient); var document = await ssdpHttpClient.GetDataAsync(url).ConfigureAwait(false); var deviceProperties = new DeviceProperties(); var name = document.Descendants(uPnpNamespaces.ud.GetName("friendlyName")).FirstOrDefault(); if (name != null) deviceProperties.Name = name.Value; var name2 = document.Descendants(uPnpNamespaces.ud.GetName("roomName")).FirstOrDefault(); if (name2 != null) deviceProperties.Name = name2.Value; var model = document.Descendants(uPnpNamespaces.ud.GetName("modelName")).FirstOrDefault(); if (model != null) deviceProperties.ModelName = model.Value; var modelNumber = document.Descendants(uPnpNamespaces.ud.GetName("modelNumber")).FirstOrDefault(); if (modelNumber != null) deviceProperties.ModelNumber = modelNumber.Value; var uuid = document.Descendants(uPnpNamespaces.ud.GetName("UDN")).FirstOrDefault(); if (uuid != null) deviceProperties.UUID = uuid.Value; var manufacturer = document.Descendants(uPnpNamespaces.ud.GetName("manufacturer")).FirstOrDefault(); if (manufacturer != null) deviceProperties.Manufacturer = manufacturer.Value; var manufacturerUrl = document.Descendants(uPnpNamespaces.ud.GetName("manufacturerURL")).FirstOrDefault(); if (manufacturerUrl != null) deviceProperties.ManufacturerUrl = manufacturerUrl.Value; var presentationUrl = document.Descendants(uPnpNamespaces.ud.GetName("presentationURL")).FirstOrDefault(); if (presentationUrl != null) deviceProperties.PresentationUrl = presentationUrl.Value; deviceProperties.BaseUrl = String.Format("http://{0}:{1}", url.Host, url.Port); var icon = document.Descendants(uPnpNamespaces.ud.GetName("icon")).FirstOrDefault(); if (icon != null) { deviceProperties.Icon = uIcon.Create(icon); } var isRenderer = false; foreach (var services in document.Descendants(uPnpNamespaces.ud.GetName("serviceList"))) { if (services == null) return null; var servicesList = services.Descendants(uPnpNamespaces.ud.GetName("service")); if (servicesList == null) return null; foreach (var element in servicesList) { var service = uService.Create(element); if (service != null) { deviceProperties.Services.Add(service); if (service.ServiceId == ServiceAvtransportId) { isRenderer = true; } } } } if (isRenderer) { var device = new Device(deviceProperties, httpClient, logger); await device.GetRenderingProtocolAsync().ConfigureAwait(false); await device.GetAVProtocolAsync().ConfigureAwait(false); return device; } return null; }
public Device(DeviceProperties deviceProperties, IHttpClient httpClient, ILogger logger) { Properties = deviceProperties; _httpClient = httpClient; _logger = logger; }
/// <summary> /// Gets the video URL. /// </summary> /// <param name="deviceProperties">The device properties.</param> /// <param name="item">The item.</param> /// <param name="streams">The streams.</param> /// <param name="serverAddress">The server address.</param> /// <returns>The url to send to the device</returns> internal static string GetVideoUrl(DeviceProperties deviceProperties, PlaylistItem item, List<MediaStream> streams, string serverAddress) { if (!item.Transcode) return string.Format("{0}/Videos/{1}/stream.{2}?Static=True", serverAddress, item.ItemId, item.FileFormat); var videostream = streams.Where(m => m.Type == MediaStreamType.Video).OrderBy(m => m.IsDefault).FirstOrDefault(); var audiostream = streams.Where(m => m.Type == MediaStreamType.Audio).OrderBy(m => m.IsDefault).FirstOrDefault(); var videoCodec = GetVideoCodec(videostream); var audioCodec = GetAudioCodec(audiostream); int? videoBitrate = null; int? audioBitrate = null; int? audioChannels = null; if (videoCodec != VideoCodecs.Copy) videoBitrate = 2000000; if (audioCodec != AudioCodecs.Copy) { audioBitrate = 128000; audioChannels = 2; } string dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, videoCodec, audioCodec, null, null, videoBitrate, audioChannels, audioBitrate, item.StartPositionTicks, "baseline", "3"); return string.Format("{0}/Videos/{1}/stream.{2}?{3}", serverAddress, item.ItemId, item.FileFormat, dlnaCommand); }
public static async Task <Device> CreateuPnpDeviceAsync(Uri url, IHttpClient httpClient, ILogger logger) { var ssdpHttpClient = new SsdpHttpClient(httpClient); var document = await ssdpHttpClient.GetDataAsync(url).ConfigureAwait(false); var deviceProperties = new DeviceProperties(); var name = document.Descendants(uPnpNamespaces.ud.GetName("friendlyName")).FirstOrDefault(); if (name != null) { deviceProperties.Name = name.Value; } var name2 = document.Descendants(uPnpNamespaces.ud.GetName("roomName")).FirstOrDefault(); if (name2 != null) { deviceProperties.Name = name2.Value; } var model = document.Descendants(uPnpNamespaces.ud.GetName("modelName")).FirstOrDefault(); if (model != null) { deviceProperties.ModelName = model.Value; } var modelNumber = document.Descendants(uPnpNamespaces.ud.GetName("modelNumber")).FirstOrDefault(); if (modelNumber != null) { deviceProperties.ModelNumber = modelNumber.Value; } var uuid = document.Descendants(uPnpNamespaces.ud.GetName("UDN")).FirstOrDefault(); if (uuid != null) { deviceProperties.UUID = uuid.Value; } var manufacturer = document.Descendants(uPnpNamespaces.ud.GetName("manufacturer")).FirstOrDefault(); if (manufacturer != null) { deviceProperties.Manufacturer = manufacturer.Value; } var manufacturerUrl = document.Descendants(uPnpNamespaces.ud.GetName("manufacturerURL")).FirstOrDefault(); if (manufacturerUrl != null) { deviceProperties.ManufacturerUrl = manufacturerUrl.Value; } var presentationUrl = document.Descendants(uPnpNamespaces.ud.GetName("presentationURL")).FirstOrDefault(); if (presentationUrl != null) { deviceProperties.PresentationUrl = presentationUrl.Value; } deviceProperties.BaseUrl = String.Format("http://{0}:{1}", url.Host, url.Port); var icon = document.Descendants(uPnpNamespaces.ud.GetName("icon")).FirstOrDefault(); if (icon != null) { deviceProperties.Icon = uIcon.Create(icon); } var isRenderer = false; foreach (var services in document.Descendants(uPnpNamespaces.ud.GetName("serviceList"))) { if (services == null) { return(null); } var servicesList = services.Descendants(uPnpNamespaces.ud.GetName("service")); if (servicesList == null) { return(null); } foreach (var element in servicesList) { var service = uService.Create(element); if (service != null) { deviceProperties.Services.Add(service); if (service.ServiceId == ServiceAvtransportId) { isRenderer = true; } } } } if (isRenderer) { var device = new Device(deviceProperties, httpClient, logger); await device.GetRenderingProtocolAsync().ConfigureAwait(false); await device.GetAVProtocolAsync().ConfigureAwait(false); return(device); } return(null); }