Пример #1
0
        AMFObject getViewerExperience(string contentRefId, string videoUrl)
        {
            AMFObject contentOverride = new AMFObject("com.brightcove.experience.ContentOverride");

            contentOverride.Add("contentId", double.NaN);
            contentOverride.Add("target", "videoPlayer");
            contentOverride.Add("contentRefId", contentRefId);
            contentOverride.Add("featuredRefId", null);
            contentOverride.Add("contentRefIds", null);
            contentOverride.Add("featuredId", double.NaN);
            contentOverride.Add("contentIds", null);
            contentOverride.Add("contentType", 0);
            AMFArray array = new AMFArray();

            array.Add(contentOverride);

            AMFObject ViewerExperienceRequest = new AMFObject("com.brightcove.experience.ViewerExperienceRequest");

            ViewerExperienceRequest.Add("TTLToken", String.Empty);
            ViewerExperienceRequest.Add("playerKey", String.Empty);
            ViewerExperienceRequest.Add("deliveryType", double.NaN);
            ViewerExperienceRequest.Add("contentOverrides", array);
            ViewerExperienceRequest.Add("URL", videoUrl);

            ViewerExperienceRequest.Add("experienceId", playerId);

            AMFSerializer ser = new AMFSerializer();

            byte[] data = ser.Serialize(ViewerExperienceRequest, hashValue);

            string requestUrl = "http://c.brightcove.com/services/messagebroker/amf?playerid=" + playerId;

            return(GetResponse(requestUrl, data));
        }
Пример #2
0
        public override Dictionary <string, string> GetPlaybackOptions(string url)
        {
            Log.Info("!!" + url);
            url = url.TrimEnd('/');
            int    ii      = url.LastIndexOf('/');
            int    p       = url.IndexOf('&', ii);
            string videoId = url.Substring(ii + 1, p - ii - 1);

            Dictionary <string, string> options = new Dictionary <string, string>();

            AMFSerializer ser = new AMFSerializer();

            object[] values = new object[4];
            values[0] = videoId;
            values[1] = null;
            values[2] = null;
            values[3] = "false";
            byte[]    data = ser.Serialize2("viddlerGateway.getVideoInfo", values);
            AMFObject obj  = AMFObject.GetResponse(@"http://www.viddler.com/amfgateway.action", data);

            AMFArray files = obj.GetArray("files");

            for (int i = 0; i < files.Count; i++)
            {
                AMFObject file = files.GetObject(i);
                string    nm   = String.Format("{0}x{1} {2}K",
                                               file.GetDoubleProperty("width"), file.GetDoubleProperty("height"),
                                               file.GetDoubleProperty("bitrate"));
                string filename = file.GetStringProperty("filename");
                string path     = file.GetStringProperty("path");
                options.Add(nm, decryptPath(path));
            }
            return(options);
        }
        protected AMFArray GetResultsFromViewerExperienceRequest(Match m, string videoUrl)
        {
            AMFObject contentOverride = new AMFObject("com.brightcove.experience.ContentOverride");
            System.Text.RegularExpressions.Group g;
            if ((g = m.Groups["contentId"]).Success)
            {
                Log.Debug("param contentId=" + g.Value);
                contentOverride.Add("contentId", (double)Int64.Parse(g.Value));
            }
            else
                contentOverride.Add("contentId", double.NaN);
            contentOverride.Add("target", "videoPlayer");
            if ((g = m.Groups["contentRefId"]).Success)
            {
                Log.Debug("param contentRefId=" + g.Value);
                contentOverride.Add("contentRefId", g.Value);
            }
            else
                contentOverride.Add("contentRefId", null);

            contentOverride.Add("featuredRefId", null);
            contentOverride.Add("contentRefIds", null);
            contentOverride.Add("featuredId", double.NaN);
            contentOverride.Add("contentIds", null);
            contentOverride.Add("contentType", 0);
            AMFArray array = new AMFArray();
            array.Add(contentOverride);

            AMFObject ViewerExperienceRequest = new AMFObject("com.brightcove.experience.ViewerExperienceRequest");
            ViewerExperienceRequest.Add("TTLToken", String.Empty);
            if ((g = m.Groups["playerKey"]).Success)
            {
                Log.Debug("param playerKey=" + g.Value);
                ViewerExperienceRequest.Add("playerKey", g.Value);
            }
            else
                ViewerExperienceRequest.Add("playerKey", playerKey);
            ViewerExperienceRequest.Add("deliveryType", double.NaN);
            ViewerExperienceRequest.Add("contentOverrides", array);
            ViewerExperienceRequest.Add("URL", videoUrl);
            Log.Debug("param URL=" + videoUrl);

            if ((g = m.Groups["experienceId"]).Success)
            {
                Log.Debug("param experienceId=" + g.Value);
                ViewerExperienceRequest.Add("experienceId", (double)Int64.Parse(g.Value));
            }
            else
                ViewerExperienceRequest.Add("experienceId", double.NaN);

            AMFSerializer ser = new AMFSerializer();
            byte[] data = ser.Serialize(ViewerExperienceRequest, "com.brightcove.experience.ExperienceRuntimeFacade.getDataForExperience", hashValue);

            AMFObject response = AMFObject.GetResponse(requestUrl, data);
            return response.GetArray("programmedContent").GetObject("videoPlayer").GetObject("mediaDTO").GetArray("renditions");
        }
Пример #4
0
        protected new string GetFileUrl(VideoInfo video, string data)
        {
            Match m = regEx_FileUrl.Match(data);

            if (!m.Success)
            {
                return(String.Empty);
            }

            AMFArray renditions = GetResultsFromFindByMediaId(m, video.VideoUrl);

            return(FillPlaybackOptions(video, renditions, m));
        }
Пример #5
0
        public override string GetVideoUrl(VideoInfo video)
        {
            string[] parts   = video.VideoUrl.Split('/');
            string   url     = @"http://embed.kijk.nl/?width=868&height=491&video=" + parts[parts.Length - 2];
            string   webdata = GetWebData(url, referer: video.VideoUrl);
            Match    m       = regEx_FileUrl.Match(webdata);

            if (m.Success)
            {
                //regular gemist
                AMFArray renditions = GetResultsFromViewerExperienceRequest(m, url);
                return(FillPlaybackOptions(video, renditions));
            }
            else
            {
                //upload and some gemist videos
                //should have automatically redirected so not needed: to webdata = GetWebData(@"http://embed.kijk.nl/video/" + parts[parts.Length - 2]);
                m = Regex.Match(webdata, @"""postfix"":""(?<postfix>[^""]*)""");
                if (m.Success)
                {
                    webdata = GetWebData(@"http://embed.kijk.nl/api/roll/" + parts[parts.Length - 2] + m.Groups["postfix"].Value + "?");
                    JToken data    = JObject.Parse(webdata) as JToken;
                    JArray streams = data["streams"] as JArray;
                    video.PlaybackOptions = new Dictionary <string, string>();
                    foreach (var stream in streams)
                    {
                        video.PlaybackOptions.Add(stream.Value <String>("name"), stream.Value <String>("url"));
                    }

                    if (video.PlaybackOptions.Count == 0)
                    {
                        return(null);
                    }
                    else
                    if (video.PlaybackOptions.Count == 1)
                    {
                        string resultUrl = video.PlaybackOptions.First().Value;
                        video.PlaybackOptions = null;    // only one url found, PlaybackOptions not needed
                        return(resultUrl);
                    }
                    else
                    {
                        return(video.PlaybackOptions.First().Value);
                    }
                }
                return(null);
            }
        }
Пример #6
0
        public override string GetVideoUrl(VideoInfo video)
        {
            string[] parts   = video.VideoUrl.Split('/');
            string   url     = @"http://embed.kijk.nl/?width=868&height=491&video=" + parts[parts.Length - 2];
            string   webdata = GetWebData(url, referer: video.VideoUrl);
            Match    m       = regEx_FileUrl.Match(webdata);

            if (!m.Success)
            {
                return(String.Empty);
            }

            AMFArray renditions = GetResultsFromViewerExperienceRequest(m, url);

            return(FillPlaybackOptions(video, renditions));
        }
Пример #7
0
        public override string GetVideoUrl(VideoInfo video)
        {
            Match m = Regex.Match("exp=2575783636001 " + (string)video.Other, @"exp=(?<experienceId>[^\s]+)\s(?<contentId>[^$]+)$");

            AMFArray renditions = GetResultsFromViewerExperienceRequest(m, video.VideoUrl);

            string res       = FillPlaybackOptions(video, renditions);
            int    firstDiff = int.MaxValue;
            int    lastDiff  = int.MaxValue;

            if (video.PlaybackOptions != null)
            {
                foreach (KeyValuePair <string, string> kv in video.PlaybackOptions)
                {
                    string url = kv.Value;
                    int    i   = 0;
                    while (i < url.Length && i < res.Length && url[i] == res[i])
                    {
                        i++;
                    }
                    if (i < firstDiff)
                    {
                        firstDiff = i;
                    }

                    i = 0;
                    while (i < url.Length && i < res.Length && url[url.Length - 1 - i] == res[res.Length - i - 1])
                    {
                        i++;
                    }
                    if (i < lastDiff)
                    {
                        lastDiff = i;
                    }
                }

                video.PlaybackOptions = video.PlaybackOptions.ToDictionary(u => u.Key, u => format(firstDiff, lastDiff, u.Value));
            }
            if (firstDiff > 0)
            {
                return(format(firstDiff, lastDiff, res));
            }
            else
            {
                return(res);
            }
        }
Пример #8
0
        protected string FillPlaybackOptions(VideoInfo video, AMFArray renditions)
        {
            video.PlaybackOptions = new Dictionary <string, string>();

            foreach (AMFObject rendition in renditions.OrderBy(u => u.GetIntProperty("encodingRate")))
            {
                string nm = String.Format("{0}x{1} {2}K",
                                          rendition.GetIntProperty("frameWidth"), rendition.GetIntProperty("frameHeight"),
                                          rendition.GetIntProperty("encodingRate") / 1024);
                string url = HttpUtility.UrlDecode(rendition.GetStringProperty("defaultURL"));
                if (url.StartsWith("rtmp"))
                {
                    //tested with ztele
                    string auth = String.Empty;
                    if (url.Contains('?'))
                    {
                        auth = '?' + url.Split('?')[1];
                    }
                    string[] parts = url.Split('&');

                    string rtmp     = parts[0] + auth;
                    string playpath = parts[1].Split('?')[0] + auth;
                    url = new MPUrlSourceFilter.RtmpUrl(rtmp)
                    {
                        PlayPath = playpath
                    }.ToString();
                }
                video.PlaybackOptions.Add(nm, url);
            }

            if (video.PlaybackOptions.Count == 0)
            {
                return("");                                 // if no match, return empty url -> error
            }
            else
            if (video.PlaybackOptions.Count == 1)
            {
                string resultUrl = video.PlaybackOptions.Last().Value;
                video.PlaybackOptions = null;    // only one url found, PlaybackOptions not needed
                return(resultUrl);
            }
            else
            {
                return(video.PlaybackOptions.Last().Value);
            }
        }
Пример #9
0
        private string FillPlaybackOptions(VideoInfo video, AMFArray renditions)
        {
            SortedList <string, string> options = new SortedList <string, string>(new StreamComparer());

            for (int i = 0; i < renditions.Count; i++)
            {
                AMFObject rendition    = renditions.GetObject(i);
                int       encodingRate = rendition.GetIntProperty("encodingRate");
                string    nm           = String.Format("{0}x{1} | {2} kbps",
                                                       rendition.GetIntProperty("frameWidth"), rendition.GetIntProperty("frameHeight"),
                                                       encodingRate / 1000);
                string url = HttpUtility.UrlDecode(rendition.GetStringProperty("defaultURL"));
                if (url.StartsWith("rtmp"))
                {
                    string auth = String.Empty;
                    if (url.Contains('?'))
                    {
                        auth = '?' + url.Split('?')[1];
                    }
                    string[] parts = url.Split('&');

                    string rtmp     = parts[0] + auth;
                    string playpath = parts[1].Split('?')[0] + auth;

                    url = new MPUrlSourceFilter.RtmpUrl(rtmp)
                    {
                        PlayPath  = playpath,
                        SwfUrl    = "http://admin.brightcove.com/viewer/us20111207.0737/connection/ExternalConnection_2.swf",
                        SwfVerify = true
                    }.ToString();
                }
                if (!options.ContainsKey(nm))
                {
                    options.Add(nm, url);
                }
            }

            video.PlaybackOptions = new Dictionary <string, string>();
            foreach (KeyValuePair <string, string> key in options)
            {
                video.PlaybackOptions.Add(key.Key, key.Value);
            }

            return(StreamComparer.GetBestPlaybackUrl(video.PlaybackOptions, StreamQualityPref, AutoSelectStream));
        }
Пример #10
0
        public override string GetVideoUrl(VideoInfo video)
        {
            Log.Info("SBSUtil: video.VideoUrl: " + video.VideoUrl);
            string[] parts = video.VideoUrl.Split('=');
            string   vidId = parts[parts.Length - 1];

            Log.Debug("id: " + vidId);
            string url     = @"http://embed.kijk.nl/?width=868&height=491&video=" + vidId;
            string webdata = GetWebData(url, referer: video.VideoUrl);

            //string webdataBody = Regex.Split(webdata, "<body")[1];

            Match m = regEx_FileUrl.Match(webdata);

            if (!m.Success)
            {
                return(String.Empty);
            }

            AMFArray renditions = GetResultsFromViewerExperienceRequest(m, url);

            return(FillPlaybackOptions(video, renditions));
        }
Пример #11
0
        protected AMFArray GetResultsFromViewerExperienceRequest(Match m, string videoUrl)
        {
            AMFObject contentOverride = new AMFObject("com.brightcove.experience.ContentOverride");

            System.Text.RegularExpressions.Group g;
            if ((g = m.Groups["contentId"]).Success)
            {
                Log.Debug("param contentId=" + g.Value);
                contentOverride.Add("contentId", (double)Int64.Parse(g.Value));
            }
            else
            {
                contentOverride.Add("contentId", double.NaN);
            }
            contentOverride.Add("target", "videoPlayer");
            if ((g = m.Groups["contentRefId"]).Success)
            {
                Log.Debug("param contentRefId=" + g.Value);
                contentOverride.Add("contentRefId", g.Value);
            }
            else
            {
                contentOverride.Add("contentRefId", null);
            }

            contentOverride.Add("featuredRefId", null);
            contentOverride.Add("contentRefIds", null);
            contentOverride.Add("featuredId", double.NaN);
            contentOverride.Add("contentIds", null);
            contentOverride.Add("contentType", 0);
            AMFArray array = new AMFArray();

            array.Add(contentOverride);

            AMFObject ViewerExperienceRequest = new AMFObject("com.brightcove.experience.ViewerExperienceRequest");

            ViewerExperienceRequest.Add("TTLToken", String.Empty);
            if ((g = m.Groups["playerKey"]).Success)
            {
                Log.Debug("param playerKey=" + g.Value);
                ViewerExperienceRequest.Add("playerKey", g.Value);
            }
            else
            {
                ViewerExperienceRequest.Add("playerKey", playerKey);
            }
            ViewerExperienceRequest.Add("deliveryType", double.NaN);
            ViewerExperienceRequest.Add("contentOverrides", array);
            ViewerExperienceRequest.Add("URL", videoUrl);
            Log.Debug("param URL=" + videoUrl);

            if ((g = m.Groups["experienceId"]).Success)
            {
                Log.Debug("param experienceId=" + g.Value);
                ViewerExperienceRequest.Add("experienceId", (double)Int64.Parse(g.Value));
            }
            else
            {
                ViewerExperienceRequest.Add("experienceId", double.NaN);
            }

            AMFSerializer ser = new AMFSerializer();

            byte[] data = ser.Serialize(ViewerExperienceRequest, "com.brightcove.experience.ExperienceRuntimeFacade.getDataForExperience", hashValue);

            lastResponse = AMFObject.GetResponse(requestUrl, data);
            return(lastResponse.GetArray("programmedContent").GetObject("videoPlayer").GetObject("mediaDTO").GetArray("renditions"));
        }
Пример #12
0
        public override List <VideoInfo> GetVideos(Category category)
        {
            List <VideoInfo> result = new List <VideoInfo>();

            /*
             * sample AMF input for findPagingMediaCollectionByReferenceId (expressed in pretty-printed JSON for clarity - captured using Firebug)
             *
             *  ["1ddf0ed58803c0533b0f82a8ff68ae50e0e12f52",1706768404001,"cn-johnny-test-playlist-clip",0,50,1873145815]
             */

            object[] amfInput = new object[6];
            amfInput[0] = hashValue;
            amfInput[1] = Convert.ToDouble(playerId);
            amfInput[2] = string.Format(@"cn-{0}-playlist-clip", ((RssLink)category).Url);
            amfInput[3] = Convert.ToDouble(@"0");
            amfInput[4] = Convert.ToDouble(@"50");
            amfInput[5] = Convert.ToDouble(publisherId);

            AMFSerializer serializer = new AMFSerializer();
            AMFObject     response   = AMFObject.GetResponse(brightcoveUrl, serializer.Serialize2("com.brightcove.player.runtime.PlayerMediaFacade.findPagingMediaCollectionByReferenceId", amfInput));

            //Log.Debug("AMF Response: {0}", response.ToString());
            string lineUpId = response.GetDoubleProperty("id").ToString();

            Log.Debug("LineUpId: {0}", lineUpId);

            AMFArray videoDTOs = response.GetArray("videoDTOs");

            if (videoDTOs != null)
            {
                for (int i = 0; i < videoDTOs.Count; i++)
                {
                    AMFObject videoDTO = videoDTOs.GetObject(i);

                    string url = videoDTO.GetStringProperty("FLVFullLengthURL");

                    // typical URL from FLVFullLengthURL
                    // rtmpe://cp102794.edgefcs.net/ondemand/&tv/johnnyTest/video/johnnyTest_clip2_eps19_en
                    //
                    // following rtmpdump style command works
                    // rtmpdump
                    // --rtmp 'rtmpe://cp102794.edgefcs.net:1935/ondemand?videoId=3066558001&lineUpId=1664607936001&pubId=1873145815&playerId=1706768404001&affiliateId='
                    // --flv 'johnnyTest_clip2_eps19_en.mp4'
                    // --playpath 'tv/johnnyTest/video/johnnyTest_clip2_eps19_en?videoId=3066558001&lineUpId=1664607936001&pubId=1873145815&playerId=1706768404001&affiliateId='

                    Match rtmpUrlMatch = rtmpUrlRegex.Match(url);

                    if (rtmpUrlMatch.Success)
                    {
                        string videoId = videoDTO.GetDoubleProperty("id").ToString();
                        string query   = string.Format(@"videoId={0}&lineUpId={1}&pubId={2}&playerId={3}&affiliateId=",
                                                       videoId, lineUpId, publisherId, playerId);
                        string rtmpUrl = String.Format("{0}://{1}/{2}?{3}",
                                                       rtmpUrlMatch.Groups["rtmp"].Value,
                                                       rtmpUrlMatch.Groups["host"].Value,
                                                       rtmpUrlMatch.Groups["app"].Value,
                                                       query);
                        string playPath = string.Format(@"{0}?{1}", rtmpUrlMatch.Groups["leftover"].Value, query);
                        Log.Debug(@"RTMP URL: {0}, playPath: {1}", rtmpUrl, playPath);

                        VideoInfo video = new VideoInfo()
                        {
                            Title       = videoDTO.GetStringProperty("displayName"),
                            Thumb       = videoDTO.GetStringProperty("thumbnailURL"),
                            Description = videoDTO.GetStringProperty("longDescription"),
                            Length      = TimeSpan.FromSeconds(videoDTO.GetDoubleProperty("length") / 1000).ToString(),
                            VideoUrl    = new RtmpUrl(rtmpUrl)
                            {
                                PlayPath = playPath
                            }.ToString()
                        };

                        result.Add(video);
                    }
                }
            }
            else
            {
                Log.Error(@"No videos found for {0}", category.Name);
            }
            return(result);
        }
        protected string FillPlaybackOptions(VideoInfo video, AMFArray renditions)
        {
            video.PlaybackOptions = new Dictionary<string, string>();

            foreach (AMFObject rendition in renditions.OrderBy(u => u.GetIntProperty("encodingRate")))
            {
                string nm = String.Format("{0}x{1} {2}K",
                    rendition.GetIntProperty("frameWidth"), rendition.GetIntProperty("frameHeight"),
                    rendition.GetIntProperty("encodingRate") / 1024);
                string url = HttpUtility.UrlDecode(rendition.GetStringProperty("defaultURL"));
                if (url.StartsWith("rtmp"))
                {
                    //tested with ztele
                    string auth = String.Empty;
                    if (url.Contains('?'))
                        auth = '?' + url.Split('?')[1];
                    string[] parts = url.Split('&');

                    string rtmp = parts[0] + auth;
                    string playpath = parts[1].Split('?')[0] + auth;
                    url = new MPUrlSourceFilter.RtmpUrl(rtmp) { PlayPath = playpath }.ToString();

                }
                video.PlaybackOptions.Add(nm, url);
            }

            if (video.PlaybackOptions.Count == 0) return "";// if no match, return empty url -> error
            else
                if (video.PlaybackOptions.Count == 1)
                {
                    string resultUrl = video.PlaybackOptions.Last().Value;
                    video.PlaybackOptions = null;// only one url found, PlaybackOptions not needed
                    return resultUrl;
                }
                else
                {
                    return video.PlaybackOptions.Last().Value;
                }
        }
Пример #14
0
        AMFObject getViewerExperience(string contentRefId, string videoUrl)
        {
            AMFObject contentOverride = new AMFObject("com.brightcove.experience.ContentOverride");
            contentOverride.Add("contentId", double.NaN);
            contentOverride.Add("target", "videoPlayer");
            contentOverride.Add("contentRefId", contentRefId);
            contentOverride.Add("featuredRefId", null);
            contentOverride.Add("contentRefIds", null);
            contentOverride.Add("featuredId", double.NaN);
            contentOverride.Add("contentIds", null);
            contentOverride.Add("contentType", 0);
            AMFArray array = new AMFArray();
            array.Add(contentOverride);

            AMFObject ViewerExperienceRequest = new AMFObject("com.brightcove.experience.ViewerExperienceRequest");
            ViewerExperienceRequest.Add("TTLToken", String.Empty);
            ViewerExperienceRequest.Add("playerKey", String.Empty);
            ViewerExperienceRequest.Add("deliveryType", double.NaN);
            ViewerExperienceRequest.Add("contentOverrides", array);
            ViewerExperienceRequest.Add("URL", videoUrl);

            ViewerExperienceRequest.Add("experienceId", playerId);

            AMFSerializer ser = new AMFSerializer();
            byte[] data = ser.Serialize(ViewerExperienceRequest, hashValue);

            string requestUrl = "http://c.brightcove.com/services/messagebroker/amf?playerid=" + playerId;

            return GetResponse(requestUrl, data);
        }
Пример #15
0
        public override string GetVideoUrl(VideoInfo video)
        {
            string webdata = GetWebData(video.VideoUrl);
            //Match m = new Regex(@"playerID=(\d+).*?videoPlayer=ref:(C\d+)").Match(webdata);
            EpisodeInfo info = new EpisodeInfo();
            Match       m;

            if ((m = Regex.Match(webdata, @"<div class=""secondary_nav_header"".*?>.*?<h\d><span.*?>(.*?)<", RegexOptions.Singleline)).Success)
            {
                info.SeriesTitle = m.Groups[1].Value;
            }
            if ((m = Regex.Match(webdata, @"<h3 class=""episode_header""><span.*?>(.*?)<")).Success)
            {
                string result = m.Groups[1].Value;
                if ((m = Regex.Match(result, @"Series (\d+)")).Success)
                {
                    info.SeriesNumber = m.Groups[1].Value;
                }
                if ((m = Regex.Match(result, @"Episode (\d+)")).Success)
                {
                    info.EpisodeNumber = m.Groups[1].Value;
                }
            }
            if ((m = Regex.Match(webdata, @"<p>First broadcast at (.*?)</p>")).Success)
            {
                DateTime airDate;
                if (DateTime.TryParse(m.Groups[1].Value, out airDate))
                {
                    info.AirDate = airDate.ToString("d MMMM");
                    if (string.IsNullOrEmpty(info.SeriesNumber))
                    {
                        info.SeriesNumber = airDate.Year.ToString();
                    }
                }
            }

            video.Other = info;

            m = new Regex(@"videoPlayer=ref:(C\d+)").Match(webdata);
            if (!m.Success)
            {
                return(String.Empty);
            }

            AMFObject viewerExperience = getViewerExperience(m.Groups[1].Value, video.VideoUrl);
            AMFObject mediaDTO         = viewerExperience.GetArray("programmedContent").GetObject("videoPlayer").GetObject("mediaDTO");

            if (!string.IsNullOrEmpty(mediaDTO.GetStringProperty("drmMetadataURL")))
            {
                video.PlaybackOptions = YouTubeShowHandler.GetYouTubePlaybackOptions(video.Other as EpisodeInfo);
                if (video.PlaybackOptions != null && video.PlaybackOptions.Count > 0)
                {
                    return(video.PlaybackOptions.Last().Value);
                }
                return(null);
            }

            AMFArray renditions = mediaDTO.GetArray("renditions");

            return(FillPlaybackOptions(video, renditions));
        }
Пример #16
0
        protected new string FillPlaybackOptions(VideoInfo video, AMFArray renditions, Match m)
        {
            video.PlaybackOptions = new Dictionary <string, string>();

            foreach (AMFObject rendition in renditions.OrderBy(u => u.GetIntProperty("encodingRate")))
            {
                string nm = String.Format("{0}x{1} {2}K",
                                          rendition.GetIntProperty("frameWidth"), rendition.GetIntProperty("frameHeight"),
                                          rendition.GetIntProperty("encodingRate") / 1024);
                string url = HttpUtility.UrlDecode(rendition.GetStringProperty("defaultURL")); //"rtmp://brightcove.fcod.llnwd.net/a500/e1/uds/rtmp/ondemand/&mp4:102076681001/102076681001_986209826001_26930-20110610-122117.mp4&1368558000000&0aa762d184c16de09a21fe533394c3ea"
                if (url.StartsWith("rtmp"))
                {
                    //tested with ztele
                    string auth = String.Empty;
                    if (url.Contains('?'))
                    {
                        auth = '?' + url.Split('?')[1];
                    }
                    string[] parts = url.Split('&');

                    string rtmp     = parts[0] + auth;               //"rtmp://brightcove.fcod.llnwd.net/a500/e1/uds/rtmp/ondemand/"
                    string playpath = parts[1].Split('?')[0] + auth; //"mp4:102076681001/102076681001_986209826001_26930-20110610-122117.mp4"
                    if (url.IndexOf("edgefcs.net") != -1)
                    {
                        /*rtmpdump --rtmp "rtmp://cp150446.edgefcs.net/ondemand/&mp4:102076681001/102076681001_1506435728001_66034-20120314-120404.mp4?__nn__=1497926354001&slist=102076681001/&auth=daEbVc2bZd2bpcZdcbxbVdld6cEdWcpb4dC-brKM2q-bWG-rnBBssvx_ABAo_DDCB_GuD&aifp=bcosuds" --app="ondemand?__nn__=1497926354001&slist=102076681001/&auth=daEbVc2bZd2bpcZdcbxbVdld6cEdWcpb4dC-brKM2q-bWG-rnBBssvx_ABAo_DDCB_GuD&aifp=bcosuds&videoId=1506302142001&lineUpId=&pubId=102076681001&playerId=2202962695001" --swfUrl="http://admin.brightcove.com/viewer/us20121213.1025/federatedVideoUI/BrightcovePlayer.swf?uid=1355746343102" --playpath="mp4:102076681001/102076681001_1506435728001_66034-20120314-120404.mp4?__nn__=1497926354001&slist=102076681001/&auth=daEbVc2bZd2bpcZdcbxbVdld6cEdWcpb4dC-brKM2q-bWG-rnBBssvx_ABAo_DDCB_GuD&aifp=bcosuds&videoId=1506302142001" --pageUrl="http://www.eitb.tv/es/#/video/1506302142001" -o "Aduriz-La_cocina_de_las_palabras_-_Aduriz-Hitzen_sukaldea-.mp4"*/
                        url = new MPUrlSourceFilter.RtmpUrl(rtmp)
                        {
                            PlayPath = playpath
                        }.ToString();
                    }
                    else
                    {
                        /*
                         * rtmpdump --rtmp "rtmp://brightcove.fcod.llnwd.net/a500/e1/uds/rtmp/ondemand/&mp4:102076681001/102076681001_986252687001_26930-20110610-122117.mp4&1368558000000&0aa762d184c16de09a21fe533394c3ea" --app="a500/e1/uds/rtmp/ondemand?videoId=986121629001&lineUpId=&pubId=102076681001&playerId=2202962695001" --swfUrl="http://admin.brightcove.com/viewer/us20121218.1107/federatedVideoUI/BrightcovePlayer.swf?uid=1355158765470" --playpath="mp4:102076681001/102076681001_986252687001_26930-20110610-122117.mp4?videoId=986121629001&lineUpId=&pubId=102076681001&playerId=2202962695001" --pageUrl="http://www.eitb.tv/es/#/video/986121629001" -C "B:0" -C "S:mp4:102076681001/102076681001_986252687001_26930-20110610-122117.mp4&1368558000000&0aa762d184c16de09a21fe533394c3ea" -o "Sukalde_maisuak_-_Aduriz-Hitzen_sukaldea-.mp4"
                         */
                        string cadena = url.Substring(url.IndexOf(".net/") + 5);
                        cadena  = cadena.Remove(cadena.IndexOf("/&"));
                        cadena += "?videoId=" + video.VideoUrl.Substring(video.VideoUrl.LastIndexOf("/") + 1)
                                  + "&lineUpId=&pubId=" + array4 + "&playerId=" + m.Groups["experienceId"].Value;
                        RtmpUrl rtmpUrl = new RtmpUrl(rtmp)
                        {
                            PlayPath = playpath,
                            //App = "a500/e1/uds/rtmp/ondemand?videoId=986121629001&lineUpId=&pubId=102076681001&playerId=2202962695001"
                            App = cadena
                        };
                        RtmpBooleanArbitraryData p1 = new RtmpBooleanArbitraryData(false);
                        RtmpStringArbitraryData  p2 = new RtmpStringArbitraryData(parts[1] + "&" + parts[2] + "&" + parts[3]);
                        rtmpUrl.ArbitraryData.Add(p1);
                        rtmpUrl.ArbitraryData.Add(p2);

                        url = rtmpUrl.ToString();
                    }
                }
                video.PlaybackOptions.Add(nm, url);
            }

            if (video.PlaybackOptions.Count == 0)
            {
                return("");                                 // if no match, return empty url -> error
            }
            else
            if (video.PlaybackOptions.Count == 1)
            {
                string resultUrl = video.PlaybackOptions.Last().Value;
                video.PlaybackOptions = null;    // only one url found, PlaybackOptions not needed
                return(resultUrl);
            }
            else
            {
                return(video.PlaybackOptions.Last().Value);
            }
        }
Пример #17
0
        private string FillPlaybackOptions(VideoInfo video, AMFArray renditions)
        {
            SortedList<string, string> options = new SortedList<string, string>(new StreamComparer());

            for (int i = 0; i < renditions.Count; i++)
            {
                AMFObject rendition = renditions.GetObject(i);
                int encodingRate = rendition.GetIntProperty("encodingRate");
                string nm = String.Format("{0}x{1} | {2} kbps",
                    rendition.GetIntProperty("frameWidth"), rendition.GetIntProperty("frameHeight"),
                    encodingRate / 1000);
                string url = HttpUtility.UrlDecode(rendition.GetStringProperty("defaultURL"));
                if (url.StartsWith("rtmp"))
                {
                    string auth = String.Empty;
                    if (url.Contains('?'))
                        auth = '?' + url.Split('?')[1];
                    string[] parts = url.Split('&');

                    string rtmp = parts[0] + auth;
                    string playpath = parts[1].Split('?')[0] + auth;

                    url = new MPUrlSourceFilter.RtmpUrl(rtmp) 
                    { 
                        PlayPath = playpath,
                        SwfUrl = "http://admin.brightcove.com/viewer/us20111207.0737/connection/ExternalConnection_2.swf",
                        SwfVerify = true
                    }.ToString();
                }
                if (!options.ContainsKey(nm))
                    options.Add(nm, url);
            }

            video.PlaybackOptions = new Dictionary<string, string>();
            foreach (KeyValuePair<string, string> key in options)
                video.PlaybackOptions.Add(key.Key, key.Value);

            return StreamComparer.GetBestPlaybackUrl(video.PlaybackOptions, StreamQualityPref, AutoSelectStream);
        }
Пример #18
0
        public override string GetVideoUrl(VideoInfo video)
        {
            string   result     = string.Empty;
            string   videoId    = string.Empty;
            AMFArray renditions = null;

            if (RequestType.Equals(BrightCoveType.FindMediaById))
            {
                /*
                 * sample AMF input (expressed as JSON)
                 * ["466faf0229239e70a6df8fe66fc04f25f50e6fa7",48543011001,1401332946001,15364602001]
                 */
                videoId = video.VideoUrl;

                object[] values = new object[4];
                values[0] = hashValue;
                values[1] = Convert.ToDouble(playerId);
                values[2] = Convert.ToDouble(videoId);
                values[3] = Convert.ToDouble(publisherId);

                AMFSerializer serializer = new AMFSerializer();
                AMFObject     response   = AMFObject.GetResponse(brightcoveUrl, serializer.Serialize2("com.brightcove.player.runtime.PlayerMediaFacade.findMediaById", values, AMFVersion.AMF3));
                //Log.Debug("AMF Response: {0}", response.ToString());

                renditions = response.GetArray("renditions");
            }
            else
            {
                /*
                 * sample AMF input for ViewerExperience (expressed in pretty-printed JSON for clarity - captured using Flashbug in Firebug)
                 * [
                 *  {"targetURI":"com.brightcove.experience.ExperienceRuntimeFacade.getDataForExperience",
                 *   "responseURI":"/1",
                 *   "length":"461 B",
                 *   "data":["82c0aa70e540000aa934812f3573fd475d131a63",
                 *      {"contentOverrides":[
                 *          {"contentType":0,
                 *           "target":"videoPlayer",
                 *           "featuredId":null,
                 *           "contentId":1411956407001,
                 *           "featuredRefId":null,
                 *           "contentIds":null,
                 *           "contentRefId":null,
                 *           "contentRefIds":null,
                 *           "__traits":
                 *              {"type":"com.brightcove.experience.ContentOverride",
                 *               "members":["contentType","target","featuredId","contentId","featuredRefId","contentIds","contentRefId","contentRefIds"],
                 *               "count":8,
                 *               "externalizable":false,
                 *               "dynamic":false}}],
                 *        "TTLToken":"",
                 *        "deliveryType":null,
                 *        "playerKey":"AQ~~,AAAABDk7A3E~,xYAUE9lVY9-LlLNVmcdybcRZ8v_nIl00",
                 *        "URL":"http://ww3.tvo.org/video/171480/safe-houses",
                 *        "experienceId":756015080001,
                 *        "__traits":
                 *          {"type":"com.brightcove.experience.ViewerExperienceRequest",
                 *           "members":["contentOverrides","TTLToken","deliveryType","playerKey","URL","experienceId"],
                 *           "count":6,
                 *           "externalizable":false,
                 *           "dynamic":false}}]}]
                 */
                videoId = getBrightCoveVideoIdForViewerExperienceRequest(video.VideoUrl);
                if (!string.IsNullOrEmpty(videoId))
                {
                    // content override
                    AMFObject contentOverride = new AMFObject(@"com.brightcove.experience.ContentOverride");
                    contentOverride.Add("contentId", videoId);
                    contentOverride.Add("contentIds", null);
                    contentOverride.Add("contentRefId", null);
                    contentOverride.Add("contentRefIds", null);
                    contentOverride.Add("contentType", 0);
                    contentOverride.Add("featuredId", double.NaN);
                    contentOverride.Add("featuredRefId", null);
                    contentOverride.Add("target", "videoPlayer");
                    AMFArray contentOverrideArray = new AMFArray();
                    contentOverrideArray.Add(contentOverride);

                    // viewer experience request
                    AMFObject viewerExperenceRequest = new AMFObject(@"com.brightcove.experience.ViewerExperienceRequest");
                    viewerExperenceRequest.Add("contentOverrides", contentOverrideArray);
                    viewerExperenceRequest.Add("experienceId", Convert.ToDouble(playerId));
                    viewerExperenceRequest.Add("deliveryType", null);
                    viewerExperenceRequest.Add("playerKey", string.Empty);
                    viewerExperenceRequest.Add("URL", video.VideoUrl);
                    viewerExperenceRequest.Add("TTLToken", string.Empty);

                    //Log.Debug("About to make AMF call: {0}", viewerExperenceRequest.ToString());
                    AMFSerializer serializer = new AMFSerializer();
                    AMFObject     response   = AMFObject.GetResponse(brightcoveUrl, serializer.Serialize(viewerExperenceRequest, "com.brightcove.experience.ExperienceRuntimeFacade.getDataForExperience", hashValue));
                    //Log.Debug("AMF Response: {0}", response.ToString());

                    renditions = response.GetArray("programmedContent").GetObject("videoPlayer").GetObject("mediaDTO").GetArray("renditions");
                }
            }

            if (renditions == null)
            {
                return(result);
            }

            video.PlaybackOptions = new Dictionary <string, string>();
            // keep track of bitrates and URLs
            Dictionary <string, string> urlsDictionary = new Dictionary <string, string>();

            for (int i = 0; i < renditions.Count; i++)
            {
                AMFObject rendition = renditions.GetObject(i);
                int       bitrate   = rendition.GetIntProperty("encodingRate");
                string    optionKey = String.Format("{0}x{1} {2}K",
                                                    rendition.GetIntProperty("frameWidth"),
                                                    rendition.GetIntProperty("frameHeight"),
                                                    bitrate / 1024);
                string url = HttpUtility.UrlDecode(rendition.GetStringProperty("defaultURL"));
                Log.Debug("Option: {0} URL: {1}", optionKey, url);

                // typical rtmp url from "defaultURL" is:
                // rtmp://brightcove.fcod.llnwd.net/a500/d20/&mp4:media/1351824783/1351824783_1411974095001_109856X-640x360-1500k.mp4&1330020000000&1b163106256f448754aff72969869479
                //
                // following rtmpdump style command works
                // rtmpdump
                // --app 'a500/d20/?videoId=1411956407001&lineUpId=&pubId=18140038001&playerId=756015080001&playerTag=&affiliateId='
                // --auth 'mp4:media/1351824783/1351824783_1411974097001_109856X-400x224-300k.mp4&1330027200000&23498dd8f4659cd07ad1b6c4ee5a013d'
                // --rtmp 'rtmp://brightcove.fcod.llnwd.net/a500/d20/?videoId=1411956407001&lineUpId=&pubId=18140038001&playerId=756015080001&playerTag=&affiliateId='
                // --flv 'TVO_org_-_Safe_as_Houses.flv'
                // --playpath 'mp4:media/1351824783/1351824783_1411974097001_109856X-400x224-300k.mp4'

                Match rtmpUrlMatch = rtmpUrlRegex.Match(url);

                if (rtmpUrlMatch.Success)
                {
                    string leftover = rtmpUrlMatch.Groups["leftover"].Value;
                    string query    = string.Format(@"videoId={0}&lineUpId=&pubId={1}&playerId={2}&playerTag=&affiliateId=",
                                                    videoId, publisherId, playerId);

                    int questionMarkPosition = leftover.IndexOf('?');
                    // use existing query (if present) in the new query string
                    if (questionMarkPosition != -1)
                    {
                        query = string.Format(@"{0}{1}", leftover.Substring(questionMarkPosition + 1, leftover.Length - questionMarkPosition - 1), query);
                    }

                    string app     = String.Format("{0}?{1}", rtmpUrlMatch.Groups["app"], query);
                    string auth    = leftover;
                    string rtmpUrl = String.Format("{0}://{1}/{2}?{3}",
                                                   rtmpUrlMatch.Groups["rtmp"].Value,
                                                   rtmpUrlMatch.Groups["host"].Value,
                                                   rtmpUrlMatch.Groups["app"].Value,
                                                   query);
                    int    ampersandPosition = leftover.IndexOf('&');
                    string playPath          = ampersandPosition == -1 ? leftover : leftover.Substring(0, ampersandPosition);
                    Log.Debug(@"rtmpUrl: {0}, PlayPath: {1}, App: {2}, Auth: {3}", rtmpUrl, playPath, app, auth);
                    urlsDictionary.Add(optionKey, new RtmpUrl(rtmpUrl)
                    {
                        PlayPath = playPath,
                        App      = app,
                        Auth     = auth
                    }.ToString());
                }
            }

            // sort the URLs ascending by bitrate
            foreach (var item in urlsDictionary.OrderBy(u => u.Key, new BitrateComparer()))
            {
                video.PlaybackOptions.Add(item.Key, item.Value);
                // return last URL as the default (will be the highest bitrate)
                result = item.Value;
            }
            return(result);
        }
Пример #19
0
        protected new string FillPlaybackOptions(VideoInfo video, AMFArray renditions, Match m)
        {
            video.PlaybackOptions = new Dictionary<string, string>();

            foreach (AMFObject rendition in renditions.OrderBy(u => u.GetIntProperty("encodingRate")))
            {
                string nm = String.Format("{0}x{1} {2}K",
                    rendition.GetIntProperty("frameWidth"), rendition.GetIntProperty("frameHeight"),
                    rendition.GetIntProperty("encodingRate") / 1024);
                string url = HttpUtility.UrlDecode(rendition.GetStringProperty("defaultURL")); //"rtmp://brightcove.fcod.llnwd.net/a500/e1/uds/rtmp/ondemand/&mp4:102076681001/102076681001_986209826001_26930-20110610-122117.mp4&1368558000000&0aa762d184c16de09a21fe533394c3ea"
                if (url.StartsWith("rtmp"))
                {
                    //tested with ztele
                    string auth = String.Empty;
                    if (url.Contains('?'))
                        auth = '?' + url.Split('?')[1];
                    string[] parts = url.Split('&');

                    string rtmp = parts[0] + auth; //"rtmp://brightcove.fcod.llnwd.net/a500/e1/uds/rtmp/ondemand/"
                    string playpath = parts[1].Split('?')[0] + auth; //"mp4:102076681001/102076681001_986209826001_26930-20110610-122117.mp4"
                    if (url.IndexOf("edgefcs.net") != -1)
                    {
                        /*rtmpdump --rtmp "rtmp://cp150446.edgefcs.net/ondemand/&mp4:102076681001/102076681001_1506435728001_66034-20120314-120404.mp4?__nn__=1497926354001&slist=102076681001/&auth=daEbVc2bZd2bpcZdcbxbVdld6cEdWcpb4dC-brKM2q-bWG-rnBBssvx_ABAo_DDCB_GuD&aifp=bcosuds" --app="ondemand?__nn__=1497926354001&slist=102076681001/&auth=daEbVc2bZd2bpcZdcbxbVdld6cEdWcpb4dC-brKM2q-bWG-rnBBssvx_ABAo_DDCB_GuD&aifp=bcosuds&videoId=1506302142001&lineUpId=&pubId=102076681001&playerId=2202962695001" --swfUrl="http://admin.brightcove.com/viewer/us20121213.1025/federatedVideoUI/BrightcovePlayer.swf?uid=1355746343102" --playpath="mp4:102076681001/102076681001_1506435728001_66034-20120314-120404.mp4?__nn__=1497926354001&slist=102076681001/&auth=daEbVc2bZd2bpcZdcbxbVdld6cEdWcpb4dC-brKM2q-bWG-rnBBssvx_ABAo_DDCB_GuD&aifp=bcosuds&videoId=1506302142001" --pageUrl="http://www.eitb.tv/es/#/video/1506302142001" -o "Aduriz-La_cocina_de_las_palabras_-_Aduriz-Hitzen_sukaldea-.mp4"*/
                        url = new MPUrlSourceFilter.RtmpUrl(rtmp) { PlayPath = playpath }.ToString();
                    }
                    else
                    {
                        /*
                         rtmpdump --rtmp "rtmp://brightcove.fcod.llnwd.net/a500/e1/uds/rtmp/ondemand/&mp4:102076681001/102076681001_986252687001_26930-20110610-122117.mp4&1368558000000&0aa762d184c16de09a21fe533394c3ea" --app="a500/e1/uds/rtmp/ondemand?videoId=986121629001&lineUpId=&pubId=102076681001&playerId=2202962695001" --swfUrl="http://admin.brightcove.com/viewer/us20121218.1107/federatedVideoUI/BrightcovePlayer.swf?uid=1355158765470" --playpath="mp4:102076681001/102076681001_986252687001_26930-20110610-122117.mp4?videoId=986121629001&lineUpId=&pubId=102076681001&playerId=2202962695001" --pageUrl="http://www.eitb.tv/es/#/video/986121629001" -C "B:0" -C "S:mp4:102076681001/102076681001_986252687001_26930-20110610-122117.mp4&1368558000000&0aa762d184c16de09a21fe533394c3ea" -o "Sukalde_maisuak_-_Aduriz-Hitzen_sukaldea-.mp4"
                         */
                        string cadena = url.Substring(url.IndexOf(".net/") + 5);
                        cadena = cadena.Remove(cadena.IndexOf("/&"));
                        cadena += "?videoId=" + video.VideoUrl.Substring(video.VideoUrl.LastIndexOf("/") + 1) 
                            + "&lineUpId=&pubId=" + array4 + "&playerId=" + m.Groups["experienceId"].Value;
                        RtmpUrl rtmpUrl = new RtmpUrl(rtmp)
                        {
                            PlayPath = playpath,
                            //App = "a500/e1/uds/rtmp/ondemand?videoId=986121629001&lineUpId=&pubId=102076681001&playerId=2202962695001"
                            App = cadena
                        };
                        RtmpBooleanArbitraryData p1 = new RtmpBooleanArbitraryData(false);
                        RtmpStringArbitraryData p2 = new RtmpStringArbitraryData(parts[1]+"&"+parts[2]+"&"+parts[3]);
                        rtmpUrl.ArbitraryData.Add(p1);
                        rtmpUrl.ArbitraryData.Add(p2);
                        
                        url = rtmpUrl.ToString();
                    }

                }
                video.PlaybackOptions.Add(nm, url);
            }

            if (video.PlaybackOptions.Count == 0) return "";// if no match, return empty url -> error
            else
                if (video.PlaybackOptions.Count == 1)
                {
                    string resultUrl = video.PlaybackOptions.Last().Value;
                    video.PlaybackOptions = null;// only one url found, PlaybackOptions not needed
                    return resultUrl;
                }
                else
                {
                    return video.PlaybackOptions.Last().Value;
                }
        }