Ejemplo n.º 1
0
 public static string GenerateToken(string url, string param, AkamaiTokenConfig tokenConfig)
 {
     string token = GenerateToken(tokenConfig);
     if (url.IndexOf("?") > 0)
     {
         return string.Format("{0}&{1}={2}", url, param, token);
     }
     else
     {
         return string.Format("{0}?{1}={2}", url, param, token);
     }
 }
Ejemplo n.º 2
0
        public static string GenerateToken(string url, string param, AkamaiTokenConfig tokenConfig)
        {
            string token = GenerateToken(tokenConfig);

            if (url.IndexOf("?") > 0)
            {
                return(string.Format("{0}&{1}={2}", url, param, token));
            }
            else
            {
                return(string.Format("{0}?{1}={2}", url, param, token));
            }
        }
Ejemplo n.º 3
0
        public static string GenerateToken(AkamaiTokenConfig tokenConfig)
        {
            string mToken = tokenConfig.IPField + tokenConfig.StartTimeField
                + tokenConfig.ExpirationField + tokenConfig.AclField
                + tokenConfig.SessionIDField + tokenConfig.PayloadField;

            string digest = mToken + tokenConfig.UrlField + tokenConfig.SaltField;

            // calculate hmac
            string hmac = CalculateHMAC(digest.TrimEnd(tokenConfig.FieldDelimiter), tokenConfig.Key, tokenConfig.TokenAlgorithm);

            return tokenConfig.PreEscapeAcl
                ? string.Format("{0}hmac={1}", mToken, hmac)
                : Uri.EscapeUriString(string.Format("{0}hmac={1}", mToken, hmac));
        }
Ejemplo n.º 4
0
        public static string GenerateToken(AkamaiTokenConfig tokenConfig)
        {
            string mToken = tokenConfig.IPField + tokenConfig.StartTimeField
                            + tokenConfig.ExpirationField + tokenConfig.AclField
                            + tokenConfig.SessionIDField + tokenConfig.PayloadField;

            string digest = mToken + tokenConfig.UrlField + tokenConfig.SaltField;

            // calculate hmac
            string hmac = CalculateHMAC(digest.TrimEnd(tokenConfig.FieldDelimiter), tokenConfig.Key, tokenConfig.TokenAlgorithm);

            string token = tokenConfig.PreEscapeAcl
                ? string.Format("{0}hmac={1}", mToken, hmac)
                : Uri.EscapeUriString(string.Format("{0}hmac={1}", mToken, hmac));

            return("hdnts=" + token);
        }
Ejemplo n.º 5
0
        public static void GenToken()
        {
            TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
            double unixTime = ts.TotalSeconds;

            var tokenConfig = new AkamaiTokenConfig();
            tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
            tokenConfig.StartTime = Convert.ToUInt32(unixTime);
            tokenConfig.Window = 60 * 60 * 48; // 48 hours
            tokenConfig.Key = "1cb57a04160477a119e57791f27a0706";// Helpers.GlobalConfig.AkamaiTokenKey;
            tokenConfig.Acl = "/*";
            tokenConfig.IP = string.Empty;
            tokenConfig.PreEscapeAcl = false;
            tokenConfig.IsUrl = false;
            tokenConfig.SessionID = string.Empty;
            tokenConfig.Salt = string.Empty;
            tokenConfig.FieldDelimiter = '~';

            var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);

            var videoUrl = "http://o1-f.akamaihd.net/z/heaven/20110509/20110509-heaven-,300000,500000,800000,1000000,1300000,1500000,.mp4.csmil/manifest.f4m";
            videoUrl += "?hdnea=" + token;

        }
Ejemplo n.º 6
0
        public static AkamaiFlowPlayerPluginClipDetails GetAkamaiClipDetails(int episodeId, int assetId, HttpRequestBase req, System.Security.Principal.IPrincipal thisUser, bool isIosAllowed)
        {
            AkamaiFlowPlayerPluginClipDetails clipDetails = null;

            var offeringId = Helpers.GlobalConfig.offeringId;
            var videoUrl = string.Empty;
            var canPlay = false;
            var countryCode = Helpers.MyUtility.getCountry(req.GetUserHostAddressFromCloudflare()).getCode();

            var context = new IPTV2Entities();
            var offering = context.Offerings.Find(offeringId);

            var episode = context.Episodes.Find(episodeId);
            var asset = context.Assets.Find(assetId);

            var cdnId = 2; // akamai's cdn id

            if ((episode != null) & (asset != null))
            {
                clipDetails = new AkamaiFlowPlayerPluginClipDetails { EpisodeId = episodeId, AssetId = assetId, UserId = (thisUser.Identity.IsAuthenticated ? thisUser.Identity.Name : null) };

                canPlay = clipDetails.IsFree = (episode.PreviewAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null) | (episode.FreeAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null);
                // check with anonymous default package
                var packageId = GlobalConfig.AnonymousDefaultPackageId;
                if (!canPlay)
                {
                    canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);
                }
                else
                {
                    clipDetails.IsFree = true;
                }

                // check user's access rights
                if (!canPlay && thisUser.Identity.IsAuthenticated)
                {
                    var user = context.Users.FirstOrDefault(u => u.UserId == new System.Guid(thisUser.Identity.Name));
                    if (user != null)
                    {
                        // check access from default logged in user package
                        packageId = Helpers.GlobalConfig.LoggedInDefaultPackageId;
                        canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);

                        if (!canPlay)
                        {
                            // check if user has entitlements that can play the video
                            canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                        }
                        else
                        {
                            clipDetails.IsFree = true;
                        }
                    }
                }

                // get asset URL
                var assetCdn = asset.AssetCdns.FirstOrDefault(a => a.CdnId == cdnId);
                if (assetCdn != null)
                {
                    var hlsPrefixPattern = GlobalConfig.hlsPrefixPattern;
                    var hlsSuffixPattern = GlobalConfig.hlsSuffixPattern;
                    var zeriPrefixPattern = GlobalConfig.zeriPrefixPattern;
                    var zeriSuffixPattern = GlobalConfig.zeriSuffixPattern;
                    var httpPrefixPatternMobile = GlobalConfig.httpPrefixPatternMobile;
                    bool isIpad = IsIpad(req);
                    bool isIos = IsIos(req);

                    if (isIos)
                    {
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);
                        //string limitUrl = "b=-" + (isIpad ? "5000,1100" : "5000,700") + "-"; // iPad up to 1Mbps, iPhone/iPod up to 500Kbps
                        //videoUrl = (videoUrl.EndsWith(".m3u8") ? "?" : "&") + limitUrl;
                        if (isIpad)
                            videoUrl = videoUrl.Replace(",1300000,1500000,", ","); // max 1Mbps
                        else
                            videoUrl = videoUrl.Replace(",800000,1000000,1300000,1500000,", ","); // max 500kbps
                    }
                    else
                    {
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern);
                    }

                    // videoUrl = !isMobileUse ? assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern) : assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);
                    //videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern);

                    string ipAddress = string.Empty;
                    if (!req.IsLocal)
                        ipAddress = req.GetUserHostAddressFromCloudflare();

                    int snippetStart = 0;
                    int snippetEnd = 0;

                    if (!canPlay)
                    {
                        if ((asset.SnippetStart != null) && (asset.SnippetEnd != null) && (asset.SnippetEnd > asset.SnippetStart))
                        {
                            //DateTime baseTime = new DateTime(1900, 1, 1, 0, 0, 0);
                            //DateTime startTime = new DateTime(1900, 1, 1, asset.SnippetStart.Value.Hours, asset.SnippetStart.Value.Minutes, asset.SnippetStart.Value.Seconds);
                            //DateTime endTime = new DateTime(1900, 1, 1, asset.SnippetEnd.Value.Hours, asset.SnippetEnd.Value.Minutes, asset.SnippetEnd.Value.Seconds);
                            //snippetStart = Convert.ToInt32(Microsoft.VisualBasic.DateAndTime.DateDiff(Microsoft.VisualBasic.DateInterval.Second, baseTime, startTime));
                            //snippetEnd = Convert.ToInt32(Microsoft.VisualBasic.DateAndTime.DateDiff(Microsoft.VisualBasic.DateInterval.Second, baseTime, endTime));
                            snippetStart = Convert.ToInt32(asset.SnippetStart.Value.TotalSeconds);
                            snippetEnd = Convert.ToInt32(asset.SnippetEnd.Value.TotalSeconds);
                        }
                        else
                        {
                            snippetStart = 0;
                            snippetEnd = GlobalConfig.snippetEnd;
                        }
                        clipDetails.PromptToSubscribe = true;

                        // don't pass a URL if iOS, no preview yet
                        // UNCOMMENT
                        //if (isIos)
                        //    videoUrl = string.Empty;
                    }
                    else
                    {
                        clipDetails.PromptToSubscribe = false;
                    }

                    clipDetails.SubClip = (snippetStart + snippetEnd > 0) ? new SubClip { Start = snippetStart, End = snippetEnd } : null;

                    TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(GlobalConfig.AkamaiAddSeconds));
                    double unixTime = ts.TotalSeconds;

                    var tokenConfig = new AkamaiTokenConfig();
                    tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
                    tokenConfig.StartTime = Convert.ToUInt32(unixTime);
                    tokenConfig.Window = 300;
                    tokenConfig.Key = Helpers.GlobalConfig.AkamaiTokenKey;
                    tokenConfig.Acl = "/*";
                    tokenConfig.IP = ipAddress;
                    tokenConfig.PreEscapeAcl = false;
                    tokenConfig.IsUrl = false;
                    tokenConfig.SessionID = string.Empty;
                    tokenConfig.Payload = asset.AssetId.ToString() + ((clipDetails.SubClip == null) ? string.Empty : ":" + snippetStart.ToString() + ":" + snippetEnd.ToString());
                    tokenConfig.Salt = string.Empty;
                    tokenConfig.FieldDelimiter = '~';

                    var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);

                    if (!String.IsNullOrEmpty(videoUrl))
                        videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "hdnea=" + token;

                    if (!isIosAllowed)
                        if (isIos) //Apple devices
                            if (clipDetails.SubClip != null) // isPreview
                                videoUrl = String.Empty;

                    clipDetails.Url = videoUrl;
                    // clipDetails.PromptToSubscribe = (clipDetails != null);
                }
            }
            return (clipDetails);
        }
Ejemplo n.º 7
0
        public static AkamaiFlowPlayerPluginClipDetails GetAkamaiLiveEventClipDetails(int episodeId, int assetId, HttpRequestBase req, System.Security.Principal.IPrincipal thisUser, bool isMobileAllowed, bool removeIpFromToken = false)
        {
            AkamaiFlowPlayerPluginClipDetails clipDetails = null;

            var offeringId = Helpers.GlobalConfig.offeringId;
            var videoUrl = string.Empty;
            var canPlay = false;
            var countryCode = Helpers.MyUtility.getCountry(req.GetUserHostAddressFromCloudflare()).getCode();

            var context = new IPTV2Entities();
            var offering = context.Offerings.Find(offeringId);

            var episode = context.Episodes.Find(episodeId);
            var asset = context.Assets.Find(assetId);

            var cdnId = 2; // akamai's cdn id

            if (!req.Browser.IsMobileDevice)
                cdnId = 3; // akamai hdn
            if (GlobalConfig.IsIosHLSCdnEnabled)
            {
                if (!req.Browser.IsMobileDevice && !MyUtility.IsDeviceHtml5Capable(req))
                    cdnId = 3; // akamai hdn
                else // get IOS stream
                {
                    if (MyUtility.IsAndroid(req) && !MyUtility.IsDeviceHtml5Capable(req)) { cdnId = 3; }
                    else { cdnId = 5; }
                }
            }


            if ((episode != null) & (asset != null))
            {
                clipDetails = new AkamaiFlowPlayerPluginClipDetails { EpisodeId = episodeId, AssetId = assetId, UserId = (thisUser.Identity.IsAuthenticated ? thisUser.Identity.Name : null) };

                canPlay = clipDetails.IsFree = (episode.PreviewAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null) | (episode.FreeAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null);
                // check with anonymous default package
                var packageId = GlobalConfig.AnonymousDefaultPackageId;
                if (!canPlay)
                {
                    canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);
                }
                else
                {
                    clipDetails.IsFree = true;
                }

                // check user's access rights
                if (!canPlay && thisUser.Identity.IsAuthenticated)
                {
                    var user = context.Users.FirstOrDefault(u => u.UserId == new System.Guid(thisUser.Identity.Name));
                    if (user != null)
                    {
                        // check access from default logged in user package
                        packageId = Helpers.GlobalConfig.LoggedInDefaultPackageId;
                        canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);

                        if (!canPlay)
                        {
                            // check if user has entitlements that can play the video
                            canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                        }
                        else
                        {
                            clipDetails.IsFree = true;
                        }
                    }
                }

                // get asset URL
                var assetCdn = asset.AssetCdns.FirstOrDefault(a => a.CdnId == cdnId);
                if (assetCdn != null)
                {
                    var hlsPrefixPattern = GlobalConfig.hlsLiveStreamPrefixPattern;
                    var hlsSuffixPattern = GlobalConfig.hlsLiveStreamSuffixPattern;
                    var zeriPrefixPattern = GlobalConfig.zeriLiveStreamPrefixPattern;
                    var zeriSuffixPattern = GlobalConfig.zeriLiveStreamSuffixPattern;
                    var httpPrefixPatternMobile = GlobalConfig.httpLiveStreamPrefixPatternMobile;

                    //if (req.Browser.IsMobileDevice)
                    //{
                    //    videoUrl = assetCdn.CdnReference.Replace(zeriPrefixPattern, httpPrefixPatternMobile);
                    //}
                    //else
                    //{
                    //    videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern);
                    //}

                    if (cdnId == 3) //Akamai HDN means Flash based.
                        videoUrl = assetCdn.CdnReference;
                    else
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);


                    string ipAddress = string.Empty;
                    if (!req.IsLocal)
                        ipAddress = req.GetUserHostAddressFromCloudflare();

                    int snippetStart = 0;
                    int snippetEnd = 0;

                    if (!canPlay)
                        clipDetails.PromptToSubscribe = true;
                    else
                        clipDetails.PromptToSubscribe = false;

                    clipDetails.SubClip = (snippetStart + snippetEnd > 0) ? new SubClip { Start = snippetStart, End = snippetEnd } : null;

                    TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(GlobalConfig.AkamaiAddSeconds));
                    double unixTime = ts.TotalSeconds;

                    var tokenConfig = new AkamaiTokenConfig();
                    tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
                    tokenConfig.StartTime = Convert.ToUInt32(unixTime);
                    tokenConfig.Window = 300;
                    tokenConfig.Key = Helpers.GlobalConfig.AkamaiTokenKey;
                    if (IsIos(req, true))
                        tokenConfig.Key = Helpers.GlobalConfig.AkamaiIosTokenKey;

                    //check if episode id should use the new ios token key
                    var episodeIdList = MyUtility.StringToIntList(GlobalConfig.LiveEpisodeIdsToUseIosTokenKey2);
                    if (episodeIdList.Contains(episode.EpisodeId))
                        tokenConfig.Key = Helpers.GlobalConfig.AkamaiIosTokenKey2;
                    var episodeIdList2 = MyUtility.StringToIntList(GlobalConfig.EpisodeIdsToUseIosTokenKey3);
                    if (episodeIdList2.Contains(episode.EpisodeId))
                        tokenConfig.Key = Helpers.GlobalConfig.AkamaiIosTokenKey3;

                    tokenConfig.Acl = "/*";
                    if (!removeIpFromToken)
                        tokenConfig.IP = ipAddress;
                    tokenConfig.PreEscapeAcl = false;
                    tokenConfig.IsUrl = false;
                    tokenConfig.SessionID = string.Empty;
                    tokenConfig.Payload = asset.AssetId.ToString() + ((clipDetails.SubClip == null) ? string.Empty : ":" + snippetStart.ToString() + ":" + snippetEnd.ToString());
                    tokenConfig.Salt = string.Empty;
                    tokenConfig.FieldDelimiter = '~';

                    var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);

                    if (!String.IsNullOrEmpty(videoUrl))
                        videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "hdnea=" + token;

                    if (!isMobileAllowed)
                        if (req.Browser.IsMobileDevice) //Apple devices
                            if (clipDetails.SubClip != null) // isPreview
                                videoUrl = String.Empty;

                    clipDetails.Url = videoUrl;
                }
            }
            return (clipDetails);
        }
Ejemplo n.º 8
0
        public static AkamaiFlowPlayerPluginClipDetails GetAkamaiProgressiveClipDetails_M3U8(int episodeId, int assetId, HttpRequestBase req, System.Security.Principal.IPrincipal thisUser, Progressive progressive, VideoQualityCdnReference? quality = null)
        {
            AkamaiFlowPlayerPluginClipDetails clipDetails = null;

            var offeringId = Helpers.GlobalConfig.offeringId;
            var videoUrl = string.Empty;
            var canPlay = false;
            var countryCode = Helpers.MyUtility.getCountry(req.GetUserHostAddressFromCloudflare()).getCode();
            string uCountryCode = countryCode;

            var context = new IPTV2Entities();
            var offering = context.Offerings.Find(offeringId);

            var episode = context.Episodes.Find(episodeId);
            var asset = context.Assets.Find(assetId);

            var cdnId = 2; // akamai's cdn id
            if (quality != null)
                cdnId = (int)quality;

            if ((episode != null) & (asset != null))
            {
                clipDetails = new AkamaiFlowPlayerPluginClipDetails { EpisodeId = episodeId, AssetId = assetId, UserId = (thisUser.Identity.IsAuthenticated ? thisUser.Identity.Name : null) };

                canPlay = clipDetails.IsFree = (episode.PreviewAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null) | (episode.FreeAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null);
                // check with anonymous default package
                var packageId = GlobalConfig.AnonymousDefaultPackageId;
                if (!canPlay)
                {
                    canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);
                }
                else
                {
                    clipDetails.IsFree = true;
                }

                // check user's access rights
                if (!canPlay && thisUser.Identity.IsAuthenticated)
                {
                    var user = context.Users.FirstOrDefault(u => u.UserId == new System.Guid(thisUser.Identity.Name));
                    if (user != null)
                    {
                        uCountryCode = user.CountryCode;
                        // check access from default logged in user package
                        packageId = Helpers.GlobalConfig.LoggedInDefaultPackageId;
                        canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);

                        if (!canPlay)
                        {
                            // check if user has entitlements that can play the video
                            //canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                            if (GlobalConfig.IsTVERegionBlockingEnabled)
                            {
                                var userCountryCode = MyUtility.GetCountryCodeViaIp();
                                int GomsSubsidiaryId = 0;
                                if (GlobalConfig.UseGomsSubsidiaryForTVECheck)
                                    GomsSubsidiaryId = ContextHelper.GetGomsSubsidiaryIdOfCountry(context, userCountryCode);
                                else
                                    GomsSubsidiaryId = -1;
                                //var GomsSubsidiaryId = ContextHelper.GetGomsSubsidiaryIdOfCountry(context, userCountryCode);
                                var IncludePackageIds = MyUtility.StringToIntList(GlobalConfig.CanPlayIncludedPackageIds);
                                var ExcludePackageIds = MyUtility.StringToIntList(GlobalConfig.CanPlayExcludedPackageIds);
                                canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online, ExcludePackageIds, IncludePackageIds, userCountryCode, GomsSubsidiaryId);
                                if (GlobalConfig.IsTVEIpCheckEnabled)
                                {
                                    try
                                    {
                                        string ip = GlobalConfig.IpWhiteList;
                                        string[] IpAddresses = ip.Split(';');
                                        //if (IpAddresses.Contains(req.GetUserHostAddressFromCloudflare()))
                                        canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                                    }
                                    catch (Exception e) { MyUtility.LogException(e, "AkamaiToken canPlay IP Whitelisting"); }
                                }
                            }
                            else
                                canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                        }
                        else
                        {
                            clipDetails.IsFree = true;
                        }
                    }
                }

                // get asset URL
                var assetCdn = asset.AssetCdns.FirstOrDefault(a => a.CdnId == cdnId);
                if (assetCdn != null)
                {
                    var hlsPrefixPattern = GlobalConfig.hlsProgressivePrefixPattern;
                    var hlsSuffixPattern = GlobalConfig.hlsProgressiveSuffixPattern;
                    var zeriPrefixPattern = GlobalConfig.zeriProgressivePrefixPattern;
                    var zeriSuffixPattern = GlobalConfig.zeriProgressiveSuffixPattern;
                    var httpPrefixPatternMobile = GlobalConfig.httpProgressivePrefixPatternMobile;
                    bool isIpad = IsIpad(req);
                    bool isIos = IsIos(req);

                    videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, String.Empty).Replace(hlsSuffixPattern, zeriSuffixPattern);

                    var ProgressiveHDBitrate = GlobalConfig.PMDHDBitrate;
                    var ProgressiveHighBitrate = GlobalConfig.PMDHighBitrate;
                    var ProgressiveLowBitrate = GlobalConfig.PMDLowBitrate;
                    try
                    {
                        var mp4capableObj = MyUtility.CheckIfMp4Compatible(req, episode.EpisodeId, "4.4");
                        if (mp4capableObj.UseMp4ForPlayback)
                        {
                            int platform = req.Browser.IsMobileDevice ? (int)Platform.Mobile : (int)Platform.Desktop;
                            var bitrate = context.CountryBitrates.FirstOrDefault(c => String.Compare(uCountryCode, c.CountryCode, true) == 0 && c.Platform == platform);
                            if (bitrate != null)
                            {
                                if (bitrate.ProgressiveHDBitrate != null)
                                    ProgressiveHDBitrate = String.Format("{0}", bitrate.ProgressiveHDBitrate);
                                if (bitrate.ProgressiveHighBitrate != null)
                                    ProgressiveHighBitrate = String.Format("{0}", bitrate.ProgressiveHighBitrate);
                                if (bitrate.ProgressiveLowBitrate != null)
                                    ProgressiveLowBitrate = String.Format("{0}", bitrate.ProgressiveLowBitrate); ;
                            }
                        }
                    }
                    catch (Exception) { }

                    if (progressive == Progressive.High)
                    {
                        //videoUrl = videoUrl.Replace(",150000,300000,500000,800000,1000000,1300000,1500000,", GlobalConfig.PMDHighBitrate); // max 800Kbps
                        //videoUrl = videoUrl.Replace(",300000,500000,800000,1000000,1300000,1500000,", GlobalConfig.PMDHighBitrate); // max 800Kbps
                        if (episode.EpisodeId == GlobalConfig.JDCEpisodeId)
                            videoUrl = ReplaceWithPMDBitRate(videoUrl, ProgressiveHDBitrate);
                        else
                            videoUrl = ReplaceWithPMDBitRate(videoUrl, ProgressiveHighBitrate);
                    }
                    else
                    {
                        //videoUrl = videoUrl.Replace(",150000,300000,500000,800000,1000000,1300000,1500000,", GlobalConfig.PMDLowBitrate); // max 500Kbps
                        //videoUrl = videoUrl.Replace(",300000,500000,800000,1000000,1300000,1500000,", GlobalConfig.PMDLowBitrate); // max 500Kbps
                        videoUrl = ReplaceWithPMDBitRate(videoUrl, ProgressiveLowBitrate);
                    }


                    string ipAddress = string.Empty;
                    if (!req.IsLocal)
                        ipAddress = req.GetUserHostAddressFromCloudflare();

                    int snippetStart = 0;
                    int snippetEnd = 0;

                    if (!canPlay)
                    {
                        if ((asset.SnippetStart != null) && (asset.SnippetEnd != null) && (asset.SnippetEnd > asset.SnippetStart))
                        {
                            snippetStart = Convert.ToInt32(asset.SnippetStart.Value.TotalSeconds);
                            snippetEnd = Convert.ToInt32(asset.SnippetEnd.Value.TotalSeconds);
                        }
                        else
                        {
                            snippetStart = 0;
                            snippetEnd = GlobalConfig.snippetEnd;
                        }
                        clipDetails.PromptToSubscribe = true;
                    }
                    else
                    {
                        clipDetails.PromptToSubscribe = false;
                    }

                    clipDetails.SubClip = (snippetStart + snippetEnd > 0) ? new SubClip { Start = snippetStart, End = snippetEnd } : null;

                    TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(GlobalConfig.AkamaiAddSeconds));
                    double unixTime = ts.TotalSeconds;

                    var tokenConfig = new AkamaiTokenConfig();
                    tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
                    tokenConfig.StartTime = Convert.ToUInt32(unixTime);
                    tokenConfig.Window = 300;
                    tokenConfig.Key = Helpers.GlobalConfig.AkamaiTokenKey;
                    tokenConfig.Acl = "/*";
                    tokenConfig.IP = ipAddress;
                    tokenConfig.PreEscapeAcl = false;
                    tokenConfig.IsUrl = false;
                    tokenConfig.SessionID = string.Empty;
                    tokenConfig.Payload = asset.AssetId.ToString() + ((clipDetails.SubClip == null) ? string.Empty : ":" + snippetStart.ToString() + ":" + snippetEnd.ToString());
                    tokenConfig.Salt = string.Empty;
                    tokenConfig.FieldDelimiter = '~';

                    var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);

                    TimeSpan tsPMD = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));

                    if (!String.IsNullOrEmpty(videoUrl))
                        videoUrl = new AkamaiPMDTokenGenerator(videoUrl, (long)GlobalConfig.AkamaiPMDAddSeconds, GlobalConfig.PMDSalt, "", (long)ts.TotalSeconds, "").AuthUrl;
                    //videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "hdnea=" + token;

                    if (isIos) //Apple devices
                        if (clipDetails.SubClip != null) // isPreview
                            videoUrl = String.Empty;

                    if (!canPlay && (progressive == Progressive.High || progressive == Progressive.Low)) // If user is not entitled, and cannot play, remove PMDlink
                        videoUrl = String.Empty;

                    if (!String.IsNullOrEmpty(videoUrl))
                    {
                        if (isIos)
                            videoUrl = String.Format("{0}{1}", httpPrefixPatternMobile, videoUrl);
                        else
                            videoUrl = String.Format("{0}{1}", zeriPrefixPattern, videoUrl);
                    }
                    clipDetails.Url = videoUrl;
                }
            }
            return (clipDetails);
        }
Ejemplo n.º 9
0
        public static AkamaiFlowPlayerPluginClipDetails GetAkamaiClipDetailsHD_M3U8(int episodeId, int assetId, HttpRequestBase req, System.Security.Principal.IPrincipal thisUser)
        {
            AkamaiFlowPlayerPluginClipDetails clipDetails = null;

            var offeringId = Helpers.GlobalConfig.offeringId;
            var videoUrl = string.Empty;
            var canPlay = false;
            var countryCode = Helpers.MyUtility.getCountry(req.GetUserHostAddressFromCloudflare()).getCode();
            string uCountryCode = countryCode;

            var context = new IPTV2Entities();
            var offering = context.Offerings.Find(offeringId);

            var episode = context.Episodes.Find(episodeId);
            var asset = context.Assets.Find(assetId);

            var cdnId = 6; // akamaiHD cdn id

            if ((episode != null) & (asset != null))
            {
                clipDetails = new AkamaiFlowPlayerPluginClipDetails { EpisodeId = episodeId, AssetId = assetId, UserId = (thisUser.Identity.IsAuthenticated ? thisUser.Identity.Name : null) };

                canPlay = clipDetails.IsFree = (episode.PreviewAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null) | (episode.FreeAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null);
                // check with anonymous default package
                var packageId = GlobalConfig.AnonymousDefaultPackageId;
                if (!canPlay)
                {
                    canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);
                }
                else
                {
                    clipDetails.IsFree = true;
                }

                // check user's access rights
                if (!canPlay && thisUser.Identity.IsAuthenticated)
                {
                    var user = context.Users.FirstOrDefault(u => u.UserId == new System.Guid(thisUser.Identity.Name));
                    if (user != null)
                    {
                        uCountryCode = user.CountryCode;
                        // check access from default logged in user package
                        packageId = Helpers.GlobalConfig.LoggedInDefaultPackageId;
                        canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);

                        if (!canPlay)
                        {
                            // check if user has entitlements that can play the video
                            //canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                            if (GlobalConfig.IsTVERegionBlockingEnabled)
                            {
                                var userCountryCode = MyUtility.GetCountryCodeViaIp();
                                int GomsSubsidiaryId = 0;
                                if (GlobalConfig.UseGomsSubsidiaryForTVECheck)
                                    GomsSubsidiaryId = ContextHelper.GetGomsSubsidiaryIdOfCountry(context, userCountryCode);
                                else
                                    GomsSubsidiaryId = -1;
                                //var GomsSubsidiaryId = ContextHelper.GetGomsSubsidiaryIdOfCountry(context, userCountryCode);
                                var IncludePackageIds = MyUtility.StringToIntList(GlobalConfig.CanPlayIncludedPackageIds);
                                var ExcludePackageIds = MyUtility.StringToIntList(GlobalConfig.CanPlayExcludedPackageIds);
                                canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online, ExcludePackageIds, IncludePackageIds, userCountryCode, GomsSubsidiaryId);

                                if (GlobalConfig.IsTVEIpCheckEnabled)
                                {
                                    try
                                    {
                                        string ip = GlobalConfig.IpWhiteList;
                                        string[] IpAddresses = ip.Split(';');
                                        if (IpAddresses.Contains(req.GetUserHostAddressFromCloudflare()))
                                            canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                                    }
                                    catch (Exception e) { MyUtility.LogException(e, "AkamaiToken canPlay IP Whitelisting"); }
                                }
                            }
                            else
                                canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                        }
                        else
                        {
                            clipDetails.IsFree = true;
                        }
                    }
                }

                // get asset URL
                var assetCdn = asset.AssetCdns.FirstOrDefault(a => a.CdnId == cdnId);
                if (assetCdn != null)
                {
                    var hlsPrefixPattern = GlobalConfig.hlsPrefixPattern;
                    var hlsSuffixPattern = GlobalConfig.hlsSuffixPattern;
                    var zeriPrefixPattern = GlobalConfig.zeriPrefixPattern;
                    var zeriSuffixPattern = GlobalConfig.zeriSuffixPattern;
                    var httpPrefixPatternMobile = GlobalConfig.httpPrefixPatternMobile;
                    bool isIpad = IsIpad(req);
                    bool isIos = IsIos(req);

                    //if (req.Browser.IsMobileDevice)
                    //{
                    //    if ((String.Compare(uCountryCode, "HK", true) == 0) || (String.Compare(countryCode, "HK", true) == 0))
                    //        videoUrl = videoUrl.Replace(",500000,800000,1000000,1300000,1500000,", ","); // If HK, maximum of 300kbps only
                    //}

                    if (isIos)
                    {
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);
                        if (isIpad)
                            videoUrl = videoUrl.Replace(",1300000,1500000,", ","); // max 1Mbps
                        else
                            videoUrl = videoUrl.Replace(",800000,1000000,1300000,1500000,", ","); // max 500kbps
                    }
                    else
                    {
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);
                    }

                    if (!String.IsNullOrEmpty(videoUrl))
                        videoUrl = videoUrl.Trim();

                    string ipAddress = string.Empty;
                    if (!req.IsLocal)
                        ipAddress = req.GetUserHostAddressFromCloudflare();

                    int snippetStart = 0;
                    int snippetEnd = 0;

                    if (!canPlay)
                    {
                        if ((asset.SnippetStart != null) && (asset.SnippetEnd != null) && (asset.SnippetEnd > asset.SnippetStart))
                        {
                            snippetStart = Convert.ToInt32(asset.SnippetStart.Value.TotalSeconds);
                            snippetEnd = Convert.ToInt32(asset.SnippetEnd.Value.TotalSeconds);
                        }
                        else
                        {
                            snippetStart = 0;
                            snippetEnd = GlobalConfig.snippetEnd;
                        }
                        clipDetails.PromptToSubscribe = true;
                    }
                    else
                    {
                        clipDetails.PromptToSubscribe = false;
                    }

                    clipDetails.SubClip = (snippetStart + snippetEnd > 0) ? new SubClip { Start = snippetStart, End = snippetEnd } : null;

                    TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(GlobalConfig.AkamaiAddSeconds));
                    double unixTime = ts.TotalSeconds;

                    var tokenConfig = new AkamaiTokenConfig();
                    tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
                    tokenConfig.StartTime = Convert.ToUInt32(unixTime);
                    tokenConfig.Window = req.IsLocal ? 259200 : 300;
                    tokenConfig.Key = Helpers.GlobalConfig.AkamaiTokenKey;
                    tokenConfig.Acl = "/*";
                    tokenConfig.IP = ipAddress;
                    tokenConfig.PreEscapeAcl = false;
                    tokenConfig.IsUrl = false;
                    tokenConfig.SessionID = string.Empty;
                    tokenConfig.Payload = asset.AssetId.ToString() + ((clipDetails.SubClip == null) ? string.Empty : ":" + snippetStart.ToString() + ":" + snippetEnd.ToString());
                    tokenConfig.Salt = string.Empty;
                    tokenConfig.FieldDelimiter = '~';

                    var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);

                    if (!String.IsNullOrEmpty(videoUrl))
                    {
                        //if (req.Browser.IsMobileDevice)
                        //{                           
                        //    //videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "__b__=150";
                        //}
                        int platform = req.Browser.IsMobileDevice ? (int)Platform.Mobile : (int)Platform.Desktop;
                        var bitrate = context.CountryBitrates.FirstOrDefault(c => String.Compare(uCountryCode, c.CountryCode, true) == 0 && c.Platform == platform);
                        if (bitrate != null)
                            if (bitrate.LowerLimit != null && bitrate.UpperLimit != null)
                                videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + String.Format("b={0}-{1}", bitrate.LowerLimit, bitrate.UpperLimit);
                        videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "hdnea=" + token;
                    }

                    if (isIos) //Apple devices
                        if (clipDetails.SubClip != null) // isPreview
                            videoUrl = String.Empty;

                    clipDetails.Url = videoUrl;
                }
            }
            return (clipDetails);
        }
Ejemplo n.º 10
0
        public static AkamaiFlowPlayerPluginClipDetails GetAkamaiLiveEventClipDetails_M3U8(int episodeId, int assetId, HttpRequestBase req, System.Security.Principal.IPrincipal thisUser, bool isMobileAllowed, string CountryCodeOverride = "", bool RemoveIpFromToken = false)
        {
            AkamaiFlowPlayerPluginClipDetails clipDetails = null;

            var offeringId = Helpers.GlobalConfig.offeringId;
            var videoUrl = string.Empty;
            var canPlay = false;
            var countryCode = Helpers.MyUtility.getCountry(req.GetUserHostAddressFromCloudflare()).getCode();
            if (!String.IsNullOrEmpty(CountryCodeOverride))
                countryCode = CountryCodeOverride;
            string uCountryCode = countryCode;
            var context = new IPTV2Entities();
            var offering = context.Offerings.Find(offeringId);

            var episode = context.Episodes.Find(episodeId);
            var asset = context.Assets.Find(assetId);

            var cdnId = 3; // akamai LIVE cdnId
            cdnId = GlobalConfig.UseJWPlayer ? 7 : 3;

            //if HLS is enabled, get IOS HLS cdnId
            if (GlobalConfig.IsIosHLSCdnEnabled)
                if (req.Browser.IsMobileDevice)
                    cdnId = 5;

            //Check if asset is available or not. If not revert back to the original cdnId (akamai LIVE)
            try
            {
                if (context.AssetCdns.Count(a => a.AssetId == assetId && a.CdnId == cdnId) <= 0)
                    cdnId = GlobalConfig.UseJWPlayer ? 7 : 3;
            }
            catch (Exception) { }

            if ((episode != null) & (asset != null))
            {
                clipDetails = new AkamaiFlowPlayerPluginClipDetails { EpisodeId = episodeId, AssetId = assetId, UserId = (thisUser.Identity.IsAuthenticated ? thisUser.Identity.Name : null) };

                canPlay = clipDetails.IsFree = (episode.PreviewAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null) | (episode.FreeAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null);
                // check with anonymous default package
                var packageId = GlobalConfig.AnonymousDefaultPackageId;
                if (!canPlay)
                {
                    canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);
                }
                else
                {
                    clipDetails.IsFree = true;
                }

                // check user's access rights
                if (!canPlay && thisUser.Identity.IsAuthenticated)
                {
                    var user = context.Users.FirstOrDefault(u => u.UserId == new System.Guid(thisUser.Identity.Name));
                    if (user != null)
                    {
                        uCountryCode = user.CountryCode;
                        if (!String.IsNullOrEmpty(CountryCodeOverride))
                            uCountryCode = CountryCodeOverride;
                        // check access from default logged in user package
                        packageId = Helpers.GlobalConfig.LoggedInDefaultPackageId;
                        canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);

                        if (!canPlay)
                        {
                            // check if user has entitlements that can play the video
                            canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                        }
                        else
                        {
                            clipDetails.IsFree = true;
                        }
                    }
                }

                // get asset URL
                var assetCdn = asset.AssetCdns.FirstOrDefault(a => a.CdnId == cdnId);
                if (assetCdn != null)
                {
                    var hlsPrefixPattern = GlobalConfig.hlsLiveStreamPrefixPattern;
                    var hlsSuffixPattern = GlobalConfig.hlsLiveStreamSuffixPattern;
                    var zeriPrefixPattern = GlobalConfig.zeriLiveStreamPrefixPattern;
                    var zeriSuffixPattern = GlobalConfig.zeriLiveStreamSuffixPattern;
                    var httpPrefixPatternMobile = GlobalConfig.httpLiveStreamPrefixPatternMobile;

                    if (cdnId == 3) //Akamai HDN means Flash based.
                        videoUrl = assetCdn.CdnReference;
                    else
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);

                    if (!String.IsNullOrEmpty(videoUrl))
                    {
                        videoUrl = videoUrl.Trim();
                    }


                    string ipAddress = string.Empty;
                    if (!req.IsLocal)
                        ipAddress = req.GetUserHostAddressFromCloudflare();

                    int snippetStart = 0;
                    int snippetEnd = 0;

                    if (!canPlay)
                        clipDetails.PromptToSubscribe = true;
                    else
                        clipDetails.PromptToSubscribe = false;

                    clipDetails.SubClip = (snippetStart + snippetEnd > 0) ? new SubClip { Start = snippetStart, End = snippetEnd } : null;

                    TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(GlobalConfig.AkamaiAddSeconds));
                    double unixTime = ts.TotalSeconds;

                    var tokenConfig = new AkamaiTokenConfig();
                    tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
                    tokenConfig.StartTime = Convert.ToUInt32(unixTime);
                    tokenConfig.Window = req.IsLocal ? 259200 : 300;
                    //tokenConfig.Key = Helpers.GlobalConfig.AkamaiTokenKey;
                    //if (IsIos(req, true))
                    //    tokenConfig.Key = Helpers.GlobalConfig.AkamaiIosTokenKey;
                    tokenConfig.Key = Helpers.GlobalConfig.AkamaiIosTokenKey;

                    //check if episode id should use the new ios token key
                    var episodeIdList = MyUtility.StringToIntList(GlobalConfig.LiveEpisodeIdsToUseIosTokenKey2);
                    if (episodeIdList.Contains(episode.EpisodeId))
                        tokenConfig.Key = Helpers.GlobalConfig.AkamaiIosTokenKey2;
                    var episodeIdList2 = MyUtility.StringToIntList(GlobalConfig.EpisodeIdsToUseIosTokenKey3);
                    if (episodeIdList2.Contains(episode.EpisodeId))
                        tokenConfig.Key = Helpers.GlobalConfig.AkamaiIosTokenKey3;

                    tokenConfig.Acl = "/*";
                    if (!RemoveIpFromToken)
                        tokenConfig.IP = ipAddress;
                    tokenConfig.PreEscapeAcl = false;
                    tokenConfig.IsUrl = false;
                    tokenConfig.SessionID = string.Empty;
                    tokenConfig.Payload = asset.AssetId.ToString() + ((clipDetails.SubClip == null) ? string.Empty : ":" + snippetStart.ToString() + ":" + snippetEnd.ToString());
                    tokenConfig.Salt = string.Empty;
                    tokenConfig.FieldDelimiter = '~';

                    var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);

                    if (!String.IsNullOrEmpty(videoUrl))
                    {
                        //if (req.Browser.IsMobileDevice)
                        //{                           
                        //    //videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "__b__=150";
                        //}
                        int platform = req.Browser.IsMobileDevice ? (int)Platform.Mobile : (int)Platform.Desktop;
                        var bitrate = context.CountryBitrates.FirstOrDefault(c => String.Compare(uCountryCode, c.CountryCode, true) == 0 && c.Platform == platform);
                        if (bitrate != null)
                            if (bitrate.LowerLimit != null && bitrate.UpperLimit != null)
                                videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + String.Format("b={0}-{1}", bitrate.LowerLimit, bitrate.UpperLimit);
                        videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "hdnea=" + token;
                    }

                    if (!isMobileAllowed)
                        if (req.Browser.IsMobileDevice) //Apple devices
                            if (clipDetails.SubClip != null) // isPreview
                                videoUrl = String.Empty;
                    clipDetails.Url = videoUrl;
                }
            }
            return (clipDetails);
        }
Ejemplo n.º 11
0
        public static AkamaiFlowPlayerPluginClipDetails GetAkamaiProgressiveViaAdaptiveClipDetails(int episodeId, int assetId, HttpRequestBase req, System.Security.Principal.IPrincipal thisUser, Progressive progressive, VideoQualityCdnReference? quality = null)
        {
            AkamaiFlowPlayerPluginClipDetails clipDetails = null;

            var offeringId = Helpers.GlobalConfig.offeringId;
            var videoUrl = string.Empty;
            var canPlay = false;
            var countryCode = Helpers.MyUtility.getCountry(req.GetUserHostAddressFromCloudflare()).getCode();

            var context = new IPTV2Entities();
            var offering = context.Offerings.Find(offeringId);

            var episode = context.Episodes.Find(episodeId);
            var asset = context.Assets.Find(assetId);

            var cdnId = 2; // akamai's cdn id
            if (quality != null)
                cdnId = (int)quality;

            if ((episode != null) & (asset != null))
            {
                clipDetails = new AkamaiFlowPlayerPluginClipDetails { EpisodeId = episodeId, AssetId = assetId, UserId = (thisUser.Identity.IsAuthenticated ? thisUser.Identity.Name : null) };

                canPlay = clipDetails.IsFree = (episode.PreviewAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null) | (episode.FreeAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null);
                // check with anonymous default package
                var packageId = GlobalConfig.AnonymousDefaultPackageId;
                if (!canPlay)
                {
                    canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);
                }
                else
                {
                    clipDetails.IsFree = true;
                }

                // check user's access rights
                if (!canPlay && thisUser.Identity.IsAuthenticated)
                {
                    var user = context.Users.FirstOrDefault(u => u.UserId == new System.Guid(thisUser.Identity.Name));
                    if (user != null)
                    {
                        // check access from default logged in user package
                        packageId = Helpers.GlobalConfig.LoggedInDefaultPackageId;
                        canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode, RightsType.Online);

                        if (!canPlay)
                        {
                            // check if user has entitlements that can play the video
                            //canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                            if (GlobalConfig.IsTVERegionBlockingEnabled)
                            {
                                var userCountryCode = MyUtility.GetCountryCodeViaIp();
                                int GomsSubsidiaryId = 0;
                                if (GlobalConfig.UseGomsSubsidiaryForTVECheck)
                                    GomsSubsidiaryId = ContextHelper.GetGomsSubsidiaryIdOfCountry(context, userCountryCode);
                                else
                                    GomsSubsidiaryId = -1;
                                //var GomsSubsidiaryId = ContextHelper.GetGomsSubsidiaryIdOfCountry(context, userCountryCode);
                                var IncludePackageIds = MyUtility.StringToIntList(GlobalConfig.CanPlayIncludedPackageIds);
                                var ExcludePackageIds = MyUtility.StringToIntList(GlobalConfig.CanPlayExcludedPackageIds);
                                canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online, ExcludePackageIds, IncludePackageIds, userCountryCode, GomsSubsidiaryId);

                                if (GlobalConfig.IsTVEIpCheckEnabled)
                                {
                                    try
                                    {
                                        string ip = GlobalConfig.IpWhiteList;
                                        string[] IpAddresses = ip.Split(';');
                                        if (IpAddresses.Contains(req.GetUserHostAddressFromCloudflare()))
                                            canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                                    }
                                    catch (Exception e) { MyUtility.LogException(e, "AkamaiToken canPlay IP Whitelisting"); }
                                }
                            }
                            else
                                canPlay = user.CanPlayVideo(offering, episode, asset, RightsType.Online);
                        }
                        else
                        {
                            clipDetails.IsFree = true;
                        }
                    }
                }

                // get asset URL
                var assetCdn = asset.AssetCdns.FirstOrDefault(a => a.CdnId == cdnId);
                if (assetCdn != null)
                {
                    var hlsPrefixPattern = GlobalConfig.hlsPrefixPattern;
                    var hlsSuffixPattern = GlobalConfig.hlsSuffixPattern;
                    var zeriPrefixPattern = GlobalConfig.zeriPrefixPattern;
                    var zeriSuffixPattern = GlobalConfig.zeriSuffixPattern;
                    var httpPrefixPatternMobile = GlobalConfig.httpPrefixPatternMobile;
                    bool isIpad = IsIpad(req);
                    bool isIos = IsIos(req);

                    if (isIos)
                    {
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);
                        //string limitUrl = "b=-" + (isIpad ? "5000,1100" : "5000,700") + "-"; // iPad up to 1Mbps, iPhone/iPod up to 500Kbps
                        //videoUrl = (videoUrl.EndsWith(".m3u8") ? "?" : "&") + limitUrl;
                        if (isIpad)

                            videoUrl = videoUrl.Replace(",1300000,1500000,", ","); // max 1Mbps
                        else
                            videoUrl = videoUrl.Replace(",800000,1000000,1300000,1500000,", ","); // max 500kbps
                    }
                    else
                    {
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern);
                    }

                    //CHECK IF COUNTRY IS AU or NZ
                    var ipCountryCode = MyUtility.GetCountryCodeViaIpAddressWithoutProxy();
                    if (String.Compare(ipCountryCode, "AU", true) == 0 || String.Compare(ipCountryCode, "NZ", true) == 0)
                        videoUrl = videoUrl.Replace(",1300000,1500000,", ","); // max 1Mbps
                    //END OF CHECK IF COUNTRY IS AU or NZ

                    if (progressive == Progressive.High)
                    {
                        if (episode.EpisodeId == GlobalConfig.JDCEpisodeId)
                            videoUrl = ReplaceWithPMDBitRate(videoUrl, String.Format(",{0},", GlobalConfig.PMDViaAdaptiveHDBitrate));
                        else
                            videoUrl = ReplaceWithPMDBitRate(videoUrl, String.Format(",{0},", GlobalConfig.PMDViaAdaptiveHighBitrate));
                    }
                    else
                    {
                        videoUrl = ReplaceWithPMDBitRate(videoUrl, String.Format(",{0},", GlobalConfig.PMDViaAdaptiveLowBitrate));
                    }

                    // videoUrl = !isMobileUse ? assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern) : assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);
                    //videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern);

                    string ipAddress = string.Empty;
                    if (!req.IsLocal)
                        ipAddress = req.GetUserHostAddressFromCloudflare();

                    int snippetStart = 0;
                    int snippetEnd = 0;

                    if (!canPlay)
                    {
                        if ((asset.SnippetStart != null) && (asset.SnippetEnd != null) && (asset.SnippetEnd > asset.SnippetStart))
                        {
                            //DateTime baseTime = new DateTime(1900, 1, 1, 0, 0, 0);
                            //DateTime startTime = new DateTime(1900, 1, 1, asset.SnippetStart.Value.Hours, asset.SnippetStart.Value.Minutes, asset.SnippetStart.Value.Seconds);
                            //DateTime endTime = new DateTime(1900, 1, 1, asset.SnippetEnd.Value.Hours, asset.SnippetEnd.Value.Minutes, asset.SnippetEnd.Value.Seconds);
                            //snippetStart = Convert.ToInt32(Microsoft.VisualBasic.DateAndTime.DateDiff(Microsoft.VisualBasic.DateInterval.Second, baseTime, startTime));
                            //snippetEnd = Convert.ToInt32(Microsoft.VisualBasic.DateAndTime.DateDiff(Microsoft.VisualBasic.DateInterval.Second, baseTime, endTime));
                            snippetStart = Convert.ToInt32(asset.SnippetStart.Value.TotalSeconds);
                            snippetEnd = Convert.ToInt32(asset.SnippetEnd.Value.TotalSeconds);
                        }
                        else
                        {
                            snippetStart = 0;
                            snippetEnd = GlobalConfig.snippetEnd;
                        }
                        clipDetails.PromptToSubscribe = true;

                        // don't pass a URL if iOS, no preview yet
                        // UNCOMMENT
                        //if (isIos)
                        //    videoUrl = string.Empty;
                    }
                    else
                    {
                        clipDetails.PromptToSubscribe = false;
                    }

                    clipDetails.SubClip = (snippetStart + snippetEnd > 0) ? new SubClip { Start = snippetStart, End = snippetEnd } : null;

                    TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(GlobalConfig.AkamaiAddSeconds));
                    double unixTime = ts.TotalSeconds;

                    var tokenConfig = new AkamaiTokenConfig();
                    tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
                    tokenConfig.StartTime = Convert.ToUInt32(unixTime);
                    tokenConfig.Window = 300;
                    tokenConfig.Key = Helpers.GlobalConfig.AkamaiTokenKey;
                    tokenConfig.Acl = "/*";
                    tokenConfig.IP = ipAddress;
                    tokenConfig.PreEscapeAcl = false;
                    tokenConfig.IsUrl = false;
                    tokenConfig.SessionID = string.Empty;
                    tokenConfig.Payload = asset.AssetId.ToString() + ((clipDetails.SubClip == null) ? string.Empty : ":" + snippetStart.ToString() + ":" + snippetEnd.ToString());
                    tokenConfig.Salt = string.Empty;
                    tokenConfig.FieldDelimiter = '~';

                    var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);

                    if (!String.IsNullOrEmpty(videoUrl))
                        videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "hdnea=" + token;

                    if (isIos) //Apple devices
                        if (clipDetails.SubClip != null) // isPreview
                            videoUrl = String.Empty;

                    clipDetails.Url = videoUrl;
                    // clipDetails.PromptToSubscribe = (clipDetails != null);
                }
            }
            return (clipDetails);
        }
Ejemplo n.º 12
0
        public static AkamaiFlowPlayerPluginClipDetails GetAkamaiClipDetails(int episodeId, int assetId, string userId)
        {
            AkamaiFlowPlayerPluginClipDetails clipDetails = null;

            var offeringId = 2; // Helpers.GlobalConfig.offeringId;
            var videoUrl = string.Empty;
            var canPlay = false;
            var countryCode = "US"; // Helpers.MyUtility.getCountry(req.UserHostAddress).getCode();

            var context = new IPTV2Entities();
            var offering = context.Offerings.Find(offeringId);

            var episode = context.Episodes.Find(episodeId);
            var asset = context.Assets.Find(assetId);

            var cdnId = 2; // akamai's cdn id

            if ((episode != null) & (asset != null))
            {
                clipDetails = new AkamaiFlowPlayerPluginClipDetails { EpisodeId = episodeId, AssetId = assetId, UserId = userId };

                canPlay = clipDetails.IsFree = (episode.PreviewAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null) | (episode.FreeAssets.FirstOrDefault(a => a.AssetId == asset.AssetId) != null);
                // check with anonymous default package

                var packageId = 58; // GlobalConfig.AnonymousDefaultPackageId;
                if (!canPlay)
                {
                    canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode,RightsType.Online);
                }

                // check user's access rights
                if (!canPlay && userId != null)
                {
                    var user = context.Users.FirstOrDefault(u => u.UserId == new System.Guid(userId));
                    if (user != null)
                    {
                        // check access from default logged in user package
                        packageId = 50; //  Helpers.GlobalConfig.LoggedInDefaultPackageId;
                        canPlay = User.IsAssetEntitled(context, offeringId, packageId, episodeId, assetId, countryCode,RightsType.Online);

                        if (!canPlay)
                        {
                            // check if user has entitlements that can play the video
                            canPlay = user.CanPlayVideo(offering, episode, asset,RightsType.Online);
                        }
                    }
                }

                // get asset URL
                var assetCdn = asset.AssetCdns.FirstOrDefault(a => a.CdnId == cdnId);
                if (assetCdn != null)
                {
                    var hlsPrefixPattern = "hls://o1-i.akamaihd.net/i/";
                    var hlsSuffixPattern = "/master.m3u8";
                    var zeriPrefixPattern = "http://o1-f.akamaihd.net/z/";
                    var zeriSuffixPattern = "/manifest.f4m";

                    videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern);

                    string ipAddress = string.Empty;
                    //if (!req.IsLocal)
                    //{
                    //    ipAddress = req.UserHostAddress;
                    //}

                    int snippetStart = 0;
                    int snippetEnd = 0;

                    if (!canPlay)
                    {
                        if ((asset.SnippetStart != null) && (asset.SnippetEnd != null) && (asset.SnippetEnd > asset.SnippetStart))
                        {
                            snippetStart = asset.SnippetStart.Value.Seconds;
                            snippetEnd = asset.SnippetEnd.Value.Seconds;
                        }
                        else
                        {
                            snippetStart = 0;
                            snippetEnd = 30;
                        }
                    }

                    clipDetails.SubClip = (snippetStart + snippetEnd > 0) ? new SubClip { Start = snippetStart, End = snippetEnd } : null;

                    TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
                    double unixTime = ts.TotalSeconds;

                    var tokenConfig = new AkamaiTokenConfig();
                    tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
                    tokenConfig.StartTime = Convert.ToUInt32(unixTime);
                    tokenConfig.Window = 300;
                    tokenConfig.Key = "1cb57a04160477a119e57791f27a0706";// Helpers.GlobalConfig.AkamaiTokenKey;
                    tokenConfig.Acl = "/*";
                    tokenConfig.IP = ipAddress;
                    tokenConfig.PreEscapeAcl = false;
                    tokenConfig.IsUrl = false;
                    tokenConfig.SessionID = string.Empty;
                    tokenConfig.Payload = asset.AssetId.ToString() + ((clipDetails.SubClip == null) ? string.Empty : ":" + snippetStart.ToString() + ":" + snippetEnd.ToString());
                    tokenConfig.Salt = string.Empty;
                    tokenConfig.FieldDelimiter = '~';

                    var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);

                    videoUrl += "?hdnea=" + token;
                    clipDetails.Url = videoUrl;
                    clipDetails.PromptToSubscribe = (clipDetails != null);

                }
            }
            return (clipDetails);
        }
Ejemplo n.º 13
0
        public static AkamaiFlowPlayerPluginClipDetails GetAkamaiClipDetails(int episodeId, int assetId, HttpRequestBase req, System.Security.Principal.IPrincipal thisUser, StreamType streamType = StreamType.ADAPTIVE)
        {
            AkamaiFlowPlayerPluginClipDetails clipDetails = new AkamaiFlowPlayerPluginClipDetails();

            var offeringId = Global.OfferingId;
            var videoUrl = string.Empty;
            var countryCode = Global.DefaultCountry;

            var context = new IPTV2Entities();
            var offering = context.Offerings.Find(offeringId);

            var episode = context.Episodes.Find(episodeId);
            var asset = context.Assets.Find(assetId);

            var cdnId = 2; // akamai's cdn id

            if ((episode != null) & (asset != null))
            {
                // get asset URL
                var assetCdn = asset.AssetCdns.FirstOrDefault(a => a.CdnId == cdnId);
                if (assetCdn != null)
                {
                    var hlsPrefixPattern = streamType == StreamType.ADAPTIVE ? Global.hlsPrefixPattern : Global.hlsProgressivePrefixPattern;
                    var hlsSuffixPattern = streamType == StreamType.ADAPTIVE ? Global.hlsSuffixPattern : Global.hlsProgressiveSuffixPattern;
                    var zeriPrefixPattern = streamType == StreamType.ADAPTIVE ? Global.zeriPrefixPattern : Global.zeriProgressivePrefixPattern;
                    var zeriSuffixPattern = streamType == StreamType.ADAPTIVE ? Global.zeriSuffixPattern : Global.zeriProgressiveSuffixPattern;
                    var httpPrefixPatternMobile = streamType == StreamType.ADAPTIVE ? Global.httpPrefixPatternMobile : Global.httpProgressivePrefixPatternMobile;

                    if (req.Browser.IsMobileDevice)
                    {
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, httpPrefixPatternMobile);
                    }
                    else
                    {
                        videoUrl = assetCdn.CdnReference.Replace(hlsPrefixPattern, zeriPrefixPattern).Replace(hlsSuffixPattern, zeriSuffixPattern);
                    }
                    string ipAddress = string.Empty;
                    if (!req.IsLocal)
                        ipAddress = req.UserHostAddress;

                    int snippetStart = 0;
                    int snippetEnd = 0;

                    clipDetails.IsFree = true;
                    clipDetails.EpisodeId = episode.EpisodeId;
                    clipDetails.AssetId = asset.AssetId;
                    TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(15));
                    if (streamType == StreamType.ADAPTIVE)
                    {
                        clipDetails.SubClip = (snippetStart + snippetEnd > 0) ? new SubClip { Start = snippetStart, End = snippetEnd } : null;
                        double unixTime = ts.TotalSeconds;

                        var tokenConfig = new AkamaiTokenConfig();
                        tokenConfig.TokenAlgorithm = Algorithm.HMACSHA256;
                        tokenConfig.StartTime = Convert.ToUInt32(unixTime);
                        tokenConfig.Window = 300;
                        tokenConfig.Key = Global.AkamaiTokenKey;
                        tokenConfig.Acl = "/*";
                        tokenConfig.IP = ipAddress;
                        tokenConfig.PreEscapeAcl = false;
                        tokenConfig.IsUrl = false;
                        tokenConfig.SessionID = string.Empty;
                        tokenConfig.Payload = asset.AssetId.ToString() + ((clipDetails.SubClip == null) ? string.Empty : ":" + snippetStart.ToString() + ":" + snippetEnd.ToString());
                        tokenConfig.Salt = string.Empty;
                        tokenConfig.FieldDelimiter = '~';

                        var token = AkamaiTokenGenerator.GenerateToken(tokenConfig);
                        if (!String.IsNullOrEmpty(videoUrl))
                            videoUrl += (videoUrl.IndexOf('?') > 0 ? "&" : "?") + "hdnea=" + token;
                    }
                    else
                    {
                        switch (streamType)
                        {
                            case StreamType.PLAY_HIGH:
                                videoUrl = MyUtility.ReplaceWithPMDBitRate(videoUrl, Global.PMDHighBitrate);
                                break;
                            case StreamType.PLAY_LOW:
                                videoUrl = MyUtility.ReplaceWithPMDBitRate(videoUrl, Global.PMDLowBitrate);
                                break;
                            case StreamType.PLAY_IN_HD:
                                videoUrl = MyUtility.ReplaceWithPMDBitRate(videoUrl, Global.PMDHDBitrate);
                                break;
                        }
                        if (!req.Browser.IsMobileDevice)
                            videoUrl = new AkamaiPMDTokenGenerator(videoUrl, (long)Global.AkamaiAddSeconds, Global.PMDSalt, "", (long)ts.TotalSeconds, "").AuthUrl;
                        else
                            videoUrl = String.Empty;

                    }
                    clipDetails.Url = videoUrl;
                }
            }
            return (clipDetails);
        }