コード例 #1
0
        public async Task Get()
        {
            Response.Headers.Add("Content-Type", "text/event-stream");

            Microsoft.AspNetCore.Http.Headers.RequestHeaders headers = Request.GetTypedHeaders();
            bool returnEmpty = true;

            if (headers.Referer.OriginalString.Contains("TicketBuy", StringComparison.InvariantCultureIgnoreCase))
            {
                int eventId = 0;
                if (Int32.TryParse(headers.Referer.Segments[headers.Referer.Segments.Length - 1], out eventId))
                {
                    if (eventId > 0)
                    {
                        bool isTicketBooked = false;

                        using (var db = new dbInterviewContext())
                        {
                            for (int i = 0; i < 4; i++)
                            {
                                await Task.Delay(TimeSpan.FromSeconds(2));

                                bool IsBuy = db.Buyer.Any(p => p.EventId == eventId);
                                if (IsBuy == true)
                                {
                                    //ticket booked

                                    returnEmpty = false;
                                    string dataItem = $"data: {"TICKET_BOOKED"}\n\n";

                                    byte[] dataItemBytes = ASCIIEncoding.ASCII.GetBytes(dataItem);
                                    await Response.Body.WriteAsync(dataItemBytes, 0, dataItemBytes.Length);

                                    await Response.Body.FlushAsync();

                                    break;
                                }
                            }
                        }
                    }
                }
            }

            if (returnEmpty)
            {
                string dataItem = $"data: {""}\n\n";

                byte[] dataItemBytes = ASCIIEncoding.ASCII.GetBytes(dataItem);
                await Response.Body.WriteAsync(dataItemBytes, 0, dataItemBytes.Length);

                await Response.Body.FlushAsync();
            }
        }
 public static (bool isRangeRequest, Microsoft.Net.Http.Headers.RangeItemHeaderValue range) ParseRange(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Http.Headers.RequestHeaders requestHeaders, long length, Microsoft.Extensions.Logging.ILogger logger)
 {
     throw null;
 }
コード例 #3
0
        public async Task <IActionResult> OnPostReadAsync()
        {
            var videoId = Helpers.GetVideoId(VideoUrl);

            if (videoId == null || !videoId.IsAbsolutelySafe())
            {
                throw new Exception("Invalid URL format");
            }

            var(vtts, title) = await Helpers.GetManifestDataAsync(videoId, HttpContext.RequestAborted);

            if (UseLang == null || UseLang == "*")
            {
                do
                {
                    var videoDataUrl = $"https://www.googleapis.com/youtube/v3/videos?id={videoId}&key={m_config["GoogleApiKey"]}&part=snippet&fields=items/snippet/defaultAudioLanguage";

                    using (var client = new HttpClient())
                        using (HttpContext.RequestAborted.Register(client.CancelPendingRequests))
                            using (var stream = await client.GetStreamAsync(videoDataUrl))
                                using (var reader = new Newtonsoft.Json.JsonTextReader(new System.IO.StreamReader(stream)))
                                {
                                    var videoData = JsonSerializer.Deserialize <YoutubeVideoData> (reader);
                                    var defLang1  = videoData?.Infos?.FirstOrDefault()?.Snippet?.DefaultAudioLanguage;
                                    if (defLang1 != null)
                                    {
                                        var defLang2 = defLang1.Split('-')[0];
                                        if (Lang1.Prefer && (Lang1.Code == defLang1 || Lang1.Code == defLang2))
                                        {
                                            UseLang = Lang1.Code;
                                            break;
                                        }

                                        if (Lang2.Prefer && (Lang2.Code == defLang1 || Lang2.Code == defLang2))
                                        {
                                            UseLang = Lang2.Code;
                                            break;
                                        }

                                        if (Lang3.Prefer && (Lang3.Code == defLang1 || Lang3.Code == defLang2))
                                        {
                                            UseLang = Lang3.Code;
                                            break;
                                        }
                                    }
                                }

                    if (Lang1.Code != null && vtts.ContainsKey(Lang1.Code))
                    {
                        UseLang = Lang1.Code;
                        break;
                    }

                    if (Lang2.Code != null && vtts.ContainsKey(Lang2.Code))
                    {
                        UseLang = Lang2.Code;
                        break;
                    }

                    if (Lang3.Code != null && vtts.ContainsKey(Lang3.Code))
                    {
                        UseLang = Lang3.Code;
                        break;
                    }

                    // no language could be selected based on preferences, try Accept-Language
                    if (Request.Headers.TryGetValue("Accept-Language", out var acceptLangs))
                    {
                        var list    = new List <KeyValuePair <double, string> > ();
                        var headers = new Microsoft.AspNetCore.Http.Headers.RequestHeaders(Request.Headers);
                        foreach (var acceptLang in headers.AcceptLanguage)
                        {
                            if (acceptLang.Value.HasValue)
                            {
                                list.Add(new KeyValuePair <double, string> (acceptLang.Quality ?? 1, acceptLang.Value.Value));
                            }
                        }

                        list.Sort((a, b) => b.Key.CompareTo(a.Key));

                        foreach (var kv in list)
                        {
                            if (vtts.ContainsKey(kv.Value))
                            {
                                UseLang = kv.Value;
                                goto selected;
                            }
                        }
                    }

                    // no language could be selected based on preferences or Accept-Language, fall back
                    if (vtts.ContainsKey("en"))
                    {
                        UseLang = "en";
                    }
                    else
                    {
                        UseLang = vtts.First().Key;
                    }
                }while (false);
            }
            else
            if (!vtts.ContainsKey(UseLang))
            {
                throw new Exception("This video has no subtitles in " + UseLang);
            }

selected:
            AdjustVttCookies(vtts, videoId, UseLang, title);
            return(RedirectToPage("Subtitles", new { VideoId = videoId, Lang = UseLang }));
        }