Example #1
0
        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();
        }
Example #2
0
        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));
        }
Example #3
0
        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"));
        }