private static List <NameValuePair> BuildParams(StreamInfo item, string accessToken, bool isDlna) { List <NameValuePair> list = new List <NameValuePair>(); string audioCodecs = item.AudioCodecs.Length == 0 ? string.Empty : string.Join(",", item.AudioCodecs); string videoCodecs = item.VideoCodecs.Length == 0 ? string.Empty : string.Join(",", item.VideoCodecs); list.Add(new NameValuePair("DeviceProfileId", item.DeviceProfileId ?? string.Empty)); list.Add(new NameValuePair("DeviceId", item.DeviceId ?? string.Empty)); list.Add(new NameValuePair("MediaSourceId", item.MediaSourceId ?? string.Empty)); list.Add(new NameValuePair("Static", item.IsDirectStream.ToString().ToLower())); list.Add(new NameValuePair("VideoCodec", videoCodecs)); list.Add(new NameValuePair("AudioCodec", audioCodecs)); list.Add(new NameValuePair("AudioStreamIndex", item.AudioStreamIndex.HasValue ? item.AudioStreamIndex.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); list.Add(new NameValuePair("SubtitleStreamIndex", item.SubtitleStreamIndex.HasValue && item.SubtitleDeliveryMethod != SubtitleDeliveryMethod.External ? item.SubtitleStreamIndex.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); list.Add(new NameValuePair("VideoBitrate", item.VideoBitrate.HasValue ? item.VideoBitrate.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); list.Add(new NameValuePair("AudioBitrate", item.AudioBitrate.HasValue ? item.AudioBitrate.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); list.Add(new NameValuePair("MaxAudioChannels", item.MaxAudioChannels.HasValue ? item.MaxAudioChannels.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); list.Add(new NameValuePair("MaxFramerate", item.MaxFramerate.HasValue ? item.MaxFramerate.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); list.Add(new NameValuePair("MaxWidth", item.MaxWidth.HasValue ? item.MaxWidth.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); list.Add(new NameValuePair("MaxHeight", item.MaxHeight.HasValue ? item.MaxHeight.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); long startPositionTicks = item.StartPositionTicks; var isHls = StringHelper.EqualsIgnoreCase(item.SubProtocol, "hls"); if (isHls) { list.Add(new NameValuePair("StartTimeTicks", string.Empty)); } else { list.Add(new NameValuePair("StartTimeTicks", startPositionTicks.ToString(CultureInfo.InvariantCulture))); } if (isDlna) { // hack alert // dlna needs to be update to support the qualified params var level = item.GetTargetVideoLevel("h264"); list.Add(new NameValuePair("Level", level.HasValue ? level.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); } if (isDlna) { // hack alert // dlna needs to be update to support the qualified params var refframes = item.GetTargetRefFrames("h264"); list.Add(new NameValuePair("MaxRefFrames", refframes.HasValue ? refframes.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); } list.Add(new NameValuePair("MaxVideoBitDepth", item.MaxVideoBitDepth.HasValue ? item.MaxVideoBitDepth.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); if (isDlna) { // hack alert // dlna needs to be update to support the qualified params var profile = item.GetOption("h264", "profile"); // Avoid having to encode profile = (profile ?? string.Empty).Replace(" ", ""); list.Add(new NameValuePair("Profile", profile)); } // no longer used list.Add(new NameValuePair("Cabac", string.Empty)); list.Add(new NameValuePair("PlaySessionId", item.PlaySessionId ?? string.Empty)); list.Add(new NameValuePair("api_key", accessToken ?? string.Empty)); string liveStreamId = item.MediaSource == null ? null : item.MediaSource.LiveStreamId; list.Add(new NameValuePair("LiveStreamId", liveStreamId ?? string.Empty)); if (isDlna) { list.Add(new NameValuePair("ItemId", item.ItemId)); } list.Add(new NameValuePair("CopyTimestamps", item.CopyTimestamps.ToString().ToLower())); list.Add(new NameValuePair("SubtitleMethod", item.SubtitleStreamIndex.HasValue && item.SubtitleDeliveryMethod != SubtitleDeliveryMethod.External ? item.SubtitleDeliveryMethod.ToString() : string.Empty)); list.Add(new NameValuePair("TranscodingMaxAudioChannels", item.TranscodingMaxAudioChannels.HasValue ? item.TranscodingMaxAudioChannels.Value.ToString(CultureInfo.InvariantCulture) : string.Empty)); list.Add(new NameValuePair("EnableSubtitlesInManifest", item.EnableSubtitlesInManifest.ToString().ToLower())); list.Add(new NameValuePair("Tag", item.MediaSource.ETag ?? string.Empty)); list.Add(new NameValuePair("RequireAvc", item.RequireAvc.ToString().ToLower())); string subtitleCodecs = item.SubtitleCodecs.Length == 0 ? string.Empty : string.Join(",", item.SubtitleCodecs); list.Add(new NameValuePair("SubtitleCodec", item.SubtitleStreamIndex.HasValue && item.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Embed ? subtitleCodecs : string.Empty)); list.Add(new NameValuePair("RequireNonAnamorphic", item.RequireNonAnamorphic.ToString().ToLower())); if (isDlna) { // hack alert // dlna needs to be update to support the qualified params var deinterlace = string.Equals(item.GetOption("h264", "deinterlace"), "true", StringComparison.OrdinalIgnoreCase) || string.Equals(item.GetOption("mpeg2video", "deinterlace"), "true", StringComparison.OrdinalIgnoreCase); list.Add(new NameValuePair("DeInterlace", deinterlace.ToString().ToLower())); } if (!isDlna && isHls) { list.Add(new NameValuePair("SegmentContainer", item.Container ?? string.Empty)); if (item.SegmentLength.HasValue) { list.Add(new NameValuePair("SegmentLength", item.SegmentLength.Value.ToString(CultureInfo.InvariantCulture))); } if (item.MinSegments.HasValue) { list.Add(new NameValuePair("MinSegments", item.MinSegments.Value.ToString(CultureInfo.InvariantCulture))); } list.Add(new NameValuePair("BreakOnNonKeyFrames", item.BreakOnNonKeyFrames.ToString())); } if (isDlna || !item.IsDirectStream) { list.Add(new NameValuePair("TranscodeReasons", string.Join(",", item.TranscodeReasons.Distinct().Select(i => i.ToString()).ToArray()))); } if (!isDlna) { foreach (var pair in item.StreamOptions) { if (string.IsNullOrWhiteSpace(pair.Value)) { continue; } // strip spaces to avoid having to encode h264 profile names list.Add(new NameValuePair(pair.Key, pair.Value.Replace(" ", ""))); } } return(list); }