private void ProxyHttpLiveIndex(string identifier, string source) { Log.Debug("HLS: Using Proxied streaming mode with playlist at {0}", source); WebRequest request = WebRequest.Create(source); request.Headers.Add("X-Forwarded-For", HttpContext.Request.UserHostAddress); WebResponse response = request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream()); string playlistContents = reader.ReadToEnd(); string prefix = HttpLiveUrls[identifier].Substring(0, HttpLiveUrls[identifier].IndexOf("/stream/") + 8); string newPlaylist = playlistContents.Split('\n') .Select(line => { if (!line.Trim().StartsWith(prefix)) { return(line.Trim()); } var queryString = HttpUtility.ParseQueryString(new Uri(line.Trim()).Query); return(Url.Action("ProxyHttpLiveSegment", "Stream", new RouteValueDictionary(new { identifier = identifier, ctdAction = queryString["action"], parameters = queryString["parameters"] }), ExternalUrl.GetScheme(Request.Url), ExternalUrl.GetHost(Request.Url))); }) .Join(Environment.NewLine); Response.ContentType = response.ContentType; Response.Write(newPlaylist); Response.Flush(); }
public static string AbsoluteAction(this UrlHelper helper, string actionName, string controllerName = null, RouteValueDictionary routeValues = null) { var request = helper.RequestContext.HttpContext.Request; var path = helper.Action(actionName, controllerName, routeValues); return(String.Format("{0}://{1}{2}", ExternalUrl.GetScheme(request), ExternalUrl.GetHost(request), path)); }
public ActionResult Playlist(WebMediaType type, string itemId, string transcoder = null) { if (!PlayerOpenedBy.Contains(Request.UserHostAddress)) { PlayerOpenedBy.Add(Request.UserHostAddress); } var profile = GetProfile(GetStreamControl(type), transcoder ?? GetDefaultProfile(type)); StringBuilder m3u = new StringBuilder(); m3u.AppendLine("#EXTM3U"); RouteValueDictionary parameters; string continuationId = "playlist-" + randomGenerator.Next(10000, 99999); string url; int filecount = 1; switch (type) { case WebMediaType.MusicAlbum: // add all album tracks foreach (WebMusicTrackBasic track in Connections.Current.MAS.GetMusicTracksBasicForAlbum(Settings.ActiveSettings.MusicProvider, itemId, sort: WebSortField.MusicTrackNumber)) { parameters = new RouteValueDictionary(); parameters["item"] = track.Id; parameters["transcoder"] = profile.Name; parameters["continuationId"] = continuationId; m3u.AppendLine(String.Format("#EXTINF:{0},{1}", track.Duration, track.Title)); url = Url.Action(Enum.GetName(typeof(WebMediaType), WebMediaType.MusicTrack), "Stream", parameters, ExternalUrl.GetScheme(Request.Url), ExternalUrl.GetHost(Request.Url)); m3u.AppendLine(url); } break; case WebMediaType.MusicTrack: case WebMediaType.TVEpisode: case WebMediaType.Movie: var mediaItem = Connections.Current.MAS.GetMediaItem(GetProvider(type), type, itemId); filecount = mediaItem.Path.Count; goto case WebMediaType.Recording; // really, Microsoft? Fall-through cases are useful. case WebMediaType.TV: case WebMediaType.Recording: for (int i = 0; i < filecount; i++) { parameters = new RouteValueDictionary(); parameters["item"] = itemId; parameters["transcoder"] = profile.Name; parameters["continuationId"] = continuationId; parameters["fileindex"] = i; url = Url.Action(Enum.GetName(typeof(WebMediaType), type), "Stream", parameters, ExternalUrl.GetScheme(Request.Url), ExternalUrl.GetHost(Request.Url)); m3u.AppendLine("#EXTINF:-1, " + MediaName.GetMediaName(type, itemId)); m3u.AppendLine(url); } break; default: Log.Error("Requested playlist for non-supported media type {0} with id {1}", type, itemId); break; } // return it byte[] data = Encoding.UTF8.GetBytes(m3u.ToString()); return(File(data, "audio/x-mpegurl", "stream.m3u")); }