public JsonResult Asap20HLS()
        {
            var ReturnCode = new ServiceReturnType()
            {
                StatusCode = (int)ErrorCodes.UnknownError,
                StatusMessage = String.Empty
            };

            try
            {
                if (!Request.IsLocal)
                {
                    Regex rx = new Regex(GlobalConfig.Asap20InLondonAllowedDomains);
                    if (!rx.IsMatch(Request.Url.Host))
                    {
                        ReturnCode.StatusMessage = String.Format("Unauthorized: {0}", Request.Url.Host);
                        return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                    }
                }
            }
            catch (Exception) { }
            //if (!Request.IsLocal)
            //    if (!GlobalConfig.isUAT)
            //        if (!Request.IsAjaxRequest())
            //        {
            //            ReturnCode.StatusCode = (int)ErrorCodes.IsInvalidRequest;
            //            ReturnCode.StatusMessage = "Request is not valid.";
            //            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
            //        }

            int id = GlobalConfig.Asap20InLondonEpisodeId;
            DateTime registDt = DateTime.Now;
            try
            {
                string CountryCode = MyUtility.GetCountryCodeViaIpAddressWithoutProxy();
                using (var context = new IPTV2Entities())
                {
                    Episode episode = context.Episodes.FirstOrDefault(e => e.EpisodeId == id);
                    if (episode != null)
                    {
                        if (episode.OnlineStatusId == GlobalConfig.Visible && episode.OnlineStartDate < registDt && episode.OnlineEndDate > registDt)
                        {
                            Offering offering = context.Offerings.Find(GlobalConfig.offeringId);
                            AkamaiFlowPlayerPluginClipDetails clipDetails = null;
                            var HasActiveSubscriptionBasedOnCategoryId = new CheckSubscriptionReturnObject() { HasSubscription = true, Within5DaysOrLess = false };
                            if (HasActiveSubscriptionBasedOnCategoryId.HasSubscription)
                            {
                                var premiumAsset = episode.PremiumAssets.LastOrDefault();
                                if (premiumAsset != null)
                                {
                                    Asset asset = premiumAsset.Asset;
                                    if (asset != null)
                                    {
                                        int assetId = asset == null ? 0 : asset.AssetId;
                                        if (episode.IsLiveChannelActive == true) //isLiveEvent
                                        {
                                            if (!ContextHelper.DoesEpisodeHaveIosCdnReferenceBasedOAsset(premiumAsset))
                                            {
                                                if (Request.Browser.IsMobileDevice)
                                                {
                                                    ReturnCode.StatusCode = (int)ErrorCodes.IsNotAvailableOnMobileDevices;
                                                    ReturnCode.StatusMessage = "This stream is not available on this device";
                                                    return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                                                }
                                            }

                                            //clipDetails = Helpers.Akamai.GetAkamaiLiveEventClipDetails(episode.EpisodeId, assetId, Request, User, true, removeIpFromToken: true);
                                            clipDetails = Helpers.Akamai.GetAkamaiLiveEventClipDetails_M3U8(episode.EpisodeId, assetId, Request, User, true, CountryCodeOverride: String.Empty, RemoveIpFromToken: true);
                                            if (clipDetails != null)
                                                if (!String.IsNullOrEmpty(clipDetails.Url))
                                                {
                                                    ReturnCode.StatusCode = (int)ErrorCodes.Success;
                                                    ReturnCode.StatusMessage = "OK";
                                                    ReturnCode.info = clipDetails.Url;
                                                    return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                                                }
                                        }
                                        ReturnCode.StatusMessage = "Clip not available.";
                                        return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                                    }
                                    ReturnCode.StatusMessage = "Asset not available.";
                                    return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                                }
                            }
                            ReturnCode.StatusMessage = "Access to this clip is restricted.";
                            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                        }
                    }
                    ReturnCode.StatusMessage = "Episode does not exist.";
                }
            }
            catch (Exception e) { ReturnCode.StatusMessage = e.Message; }
            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
        }
        //[RequireHttps]
        public JsonResult Feed01()
        {
            var ReturnCode = new ServiceReturnType()
            {
                StatusCode = (int)ErrorCodes.UnknownError,
                StatusMessage = String.Empty
            };

            //if (!Request.IsLocal)
            //    if (!GlobalConfig.isUAT)
            //        if (!Request.IsAjaxRequest())
            //        {
            //            ReturnCode.StatusCode = (int)ErrorCodes.IsInvalidRequest;
            //            ReturnCode.StatusMessage = "Request is not valid.";
            //            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
            //        }

            int id = GlobalConfig.TFCtvMobileAirEpisodeId;
            DateTime registDt = DateTime.Now;
            try
            {
                string CountryCode = MyUtility.GetCountryCodeViaIpAddressWithoutProxy();

                if (MyUtility.IsWhiteListed(String.Empty))
                    CountryCode = "HK";
                else
                {
                    try
                    {
                        var requestingIp = Request.GetUserHostAddressFromCloudflare();
                        var whiteListedIp = GlobalConfig.IpWhiteList.Split(',');
                        if (whiteListedIp.Contains(requestingIp) && GlobalConfig.isUAT)
                            CountryCode = "HK";
                    }
                    catch (Exception) { }
                }

                using (var context = new IPTV2Entities())
                {
                    Episode episode = context.Episodes.FirstOrDefault(e => e.EpisodeId == id);
                    if (episode != null)
                    {
                        if (episode.OnlineStatusId == GlobalConfig.Visible && episode.OnlineStartDate < registDt && episode.OnlineEndDate > registDt)
                        {
                            var CacheDuration = new TimeSpan(0, GlobalConfig.GetParentShowsForEpisodeCacheDuration, 0);
                            var parentCategories = episode.GetParentShows(CacheDuration);
                            Offering offering = context.Offerings.Find(GlobalConfig.offeringId);
                            AkamaiFlowPlayerPluginClipDetails clipDetails = null;
                            //var ShowListBasedOnCountryCode = ContextHelper.GetAllShowsBasedOnCountryCode(context, CountryCode, true, offering);
                            var HasActiveSubscriptionBasedOnCategoryId = new CheckSubscriptionReturnObject() { HasSubscription = false, Within5DaysOrLess = false };
                            if (parentCategories != null)
                                HasActiveSubscriptionBasedOnCategoryId = ContextHelper.HasActiveSubscriptionBasedOnCategoryId(null, parentCategories, registDt, CountryCode);
                            if (HasActiveSubscriptionBasedOnCategoryId.HasSubscription)
                            {
                                var premiumAsset = episode.PremiumAssets.LastOrDefault();
                                if (premiumAsset != null)
                                {
                                    Asset asset = premiumAsset.Asset;
                                    if (asset != null)
                                    {
                                        int assetId = asset == null ? 0 : asset.AssetId;
                                        if (episode.IsLiveChannelActive == true) //isLiveEvent
                                        {
                                            if (!ContextHelper.DoesEpisodeHaveIosCdnReferenceBasedOAsset(premiumAsset))
                                            {
                                                if (Request.Browser.IsMobileDevice)
                                                {
                                                    ReturnCode.StatusCode = (int)ErrorCodes.IsNotAvailableOnMobileDevices;
                                                    ReturnCode.StatusMessage = "This stream is not available on this device";
                                                    return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                                                }
                                            }

                                            clipDetails = Helpers.Akamai.GetAkamaiLiveEventClipDetails_M3U8(episode.EpisodeId, assetId, Request, User, true, CountryCodeOverride: CountryCode, RemoveIpFromToken: true);
                                            if (clipDetails != null)
                                                if (!String.IsNullOrEmpty(clipDetails.Url))
                                                {
                                                    ReturnCode.StatusCode = (int)ErrorCodes.Success;
                                                    ReturnCode.StatusMessage = "OK";
                                                    ReturnCode.info = clipDetails.Url;
                                                    return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                                                }
                                        }
                                        ReturnCode.StatusMessage = "Clip not available.";
                                        return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                                    }
                                    ReturnCode.StatusMessage = "Asset not available.";
                                    return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                                }
                            }
                            ReturnCode.StatusMessage = "Access to this clip is restricted.";
                            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                        }
                    }
                    ReturnCode.StatusMessage = "Episode does not exist.";
                }
            }
            catch (Exception e) { ReturnCode.StatusMessage = e.Message; }
            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
        }
        //[RequireHttps]
        public JsonResult _MobileForgotPassword(FormCollection fc)
        {
            var ReturnCode = new ServiceReturnType()
            {
                StatusCode = (int)ErrorCodes.UnknownError,
                StatusMessage = String.Empty
            };

            try
            {

                DateTime registDt = DateTime.Now;
                Dictionary<string, string> tmpCollection = fc.AllKeys.ToDictionary(k => k, v => fc[v]);
                bool isMissingRequiredFields = false;
                foreach (var x in tmpCollection)
                {
                    if (String.IsNullOrEmpty(x.Value))
                    {
                        isMissingRequiredFields = true;
                        break;
                    }
                }

                if (!isMissingRequiredFields)
                {
                    string EmailAddress = fc["login_email"];

                    RegexUtilities util = new RegexUtilities();
                    //if (!MyUtility.isEmail(EmailAddress))
                    if (!util.IsValidEmail(EmailAddress))
                    {
                        ReturnCode.StatusMessage = "Email address is invalid.";
                    }
                    else
                    {
                        var context = new IPTV2Entities();
                        User user = context.Users.FirstOrDefault(u => String.Compare(u.EMail, EmailAddress, true) == 0);
                        if (user != null)
                        {
                            if (user.StatusId != GlobalConfig.Visible)
                            {
                                ReturnCode.StatusMessage = "Email address is not verified.";
                                return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
                            }
                            user.LastUpdated = registDt;
                            if (context.SaveChanges() > 0)
                            {
                                string oid = MyUtility.GetSHA1(String.Format("{0}{1}", user.UserId, user.LastUpdated));
                                string reset_pwd_email = String.Format("{0}/User/ResetPassword?key={1}&oid={2}", GlobalConfig.baseUrl, user.ActivationKey, oid.ToLower());
                                string emailBody = String.Format(GlobalConfig.ResetPasswordBodyTextOnly, user.FirstName, registDt.ToString("MM/dd/yyyy hh:mm:ss tt"), reset_pwd_email);
                                try
                                {
                                    if (!Request.IsLocal)
                                        MyUtility.SendEmailViaSendGrid(user.EMail, GlobalConfig.NoReplyEmail, "Reset your TFC.tv Password", emailBody, MailType.TextOnly, emailBody);

                                    ReturnCode.StatusCode = (int)ErrorCodes.Success;
                                    ReturnCode.StatusMessage = "Instructions on how to reset your password have been sent to your email address.";
                                }
                                catch (Exception)
                                {
                                    ReturnCode.StatusCode = (int)ErrorCodes.UnknownError;
                                    ReturnCode.StatusMessage = "The system encountered an unspecified error. Please contact Customer Support.";
                                }
                            }
                            else
                                ReturnCode.StatusMessage = "The system encountered an unidentified error. Please try again.";
                        }
                        else
                        {
                            ReturnCode.StatusCode = (int)ErrorCodes.UserDoesNotExist;
                            ReturnCode.StatusMessage = "Email does not exist.";
                        }
                    }
                }
                else
                    ReturnCode.StatusMessage = "Please fill in all required fields.";
            }
            catch (Exception e) { ReturnCode.StatusMessage = e.Message; }
            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
        }
        public ActionResult DisableFeed()
        {
            var ReturnCode = new ServiceReturnType()
            {
                StatusCode = (int)ErrorCodes.UnknownError,
                StatusMessage = String.Empty
            };

            try
            {
                if (GlobalConfig.isUAT)
                {
                    var context = new IPTV2Entities();
                    var restrictions = context.CategoryCountryRestrictions.Where(c => String.Compare(c.CountryCode, "US", true) == 0 && c.CategoryId == 2554);
                    if (restrictions != null)
                    {
                        foreach (var item in restrictions)
                        {
                            item.StatusId = 5;
                        }

                        if (context.SaveChanges() > 0)
                        {
                            ReturnCode.StatusCode = (int)ErrorCodes.Success;
                            ReturnCode.StatusMessage = "FEED DISABLED FOR US";
                        }
                        else
                            ReturnCode.StatusMessage = "UNABLE TO SAVE";
                    }
                    else
                        ReturnCode.StatusMessage = "NO RESTRICTIONS FOUND";
                }
                else
                    ReturnCode.StatusMessage = "FUNCTION NOT ALLOWED";
            }
            catch (Exception) { }
            return this.Json(ReturnCode, JsonRequestBehavior.AllowGet);
        }