public async Task ReceiveInternalAsync(YtInitialData ytInitialData1, YtCfg ytCfg, CookieContainer cc, ILoginState loginInfo)
        {
            var    dataToPost = new DataToPost(ytCfg);
            string initialContinuation;

            if (_siteOptions.IsAllChat)
            {
                initialContinuation = ytInitialData1.AllChatContinuation;// ytInitialData.ChatContinuation().AllChatContinuation;
            }
            else
            {
                initialContinuation = ytInitialData1.JouiChatContinuation;// ytInitialData.ChatContinuation().JouiChatContinuation;
            }
            dataToPost.SetContinuation(initialContinuation);

            while (!_cts.IsCancellationRequested)
            {
                //例外はここではcatchしない。
                var getLiveChat = await Tools.GetGetLiveChat(dataToPost, ytCfg.InnertubeApiKey, cc, loginInfo, _logger);

                var actions      = getLiveChat.Actions;
                var continuation = getLiveChat.Continuation;// s.GetContinuation();
                if (continuation is null)
                {
                    throw new ContinuationNotExistsException();
                }
                if (continuation is ReloadContinuationData reload)
                {
                    throw new ReloadException();
                }
                else if (continuation is TimedContinuationData timed)
                {
                    dataToPost.SetContinuation(timed.Continaution);
                    await ProcessAction(actions, timed.TimeoutMs);
                }
                else if (continuation is InvalidationContinuationData invalid)
                {
                    dataToPost.SetContinuation(invalid.Continaution);
                    await ProcessAction(actions, invalid.TimeoutMs);
                }
                else if (continuation is UnknownContinuationData unknown)
                {
                    throw new SpecChangedException(unknown.Raw);
                }
                else
                {
                    //ここには来ない予定
                    throw new SpecChangedException("");
                }
                //if (continuation is ReloadContinuation reload)
                //{
                //    throw new ReloadException();
                //}
                //else if (continuation is UnknownContinuation unknown)
                //{
                //    throw new SpecChangedException(unknown.Raw);
                //}
                //dataToPost.SetContinuation(continuation.Continuation);
                //var timeoutMs = Math.Max(continuation.TimeoutMs, 1000);
                //if (actions.Count > 0)
                //{
                //    var waitTime = timeoutMs / actions.Count;
                //    foreach (var action in actions)
                //    {
                //        ProcessAction(action);
                //        try
                //        {
                //            await Task.Delay(waitTime, _cts.Token);
                //        }
                //        catch (TaskCanceledException)
                //        {
                //            return;
                //        }
                //    }
                //}
                //else
                //{
                //    var waitTime = timeoutMs;
                //    try
                //    {
                //        await Task.Delay(waitTime, _cts.Token);
                //    }
                //    catch (TaskCanceledException)
                //    {
                //        return;
                //    }
                //}
            }
        }
Ejemplo n.º 2
0
 public void Init(ILoginState state)
 {
     State = state;
 }
Ejemplo n.º 3
0
        public async Task ReceiveInternalAsync(YtInitialData ytInitialData, YtCfg ytCfg, CookieContainer cc, ILoginState loginInfo)
        {
            var    dataToPost = new DataToPost(ytCfg);
            string initialContinuation;

            if (_siteOptions.IsAllChat)
            {
                initialContinuation = ytInitialData.ChatContinuation().AllChatContinuation;
            }
            else
            {
                initialContinuation = ytInitialData.ChatContinuation().JouiChatContinuation;
            }
            dataToPost.SetContinuation(initialContinuation);

            while (!_cts.IsCancellationRequested)
            {
                //例外はここではcatchしない。
                var s = await Tools.GetGetLiveChat(dataToPost, ytCfg.InnerTubeApiKey, cc, loginInfo);

                var actions      = s.GetActions();
                var continuation = s.GetContinuation();
                if (continuation is ReloadContinuation reload)
                {
                    throw new ReloadException();
                }
                else if (continuation is UnknownContinuation unknown)
                {
                    throw new SpecChangedException(unknown.Raw);
                }
                dataToPost.SetContinuation(continuation.Continuation);
                var count     = actions.Count;
                var timeoutMs = Math.Max(continuation.TimeoutMs, 1000);
                var waitTime  = count > 0 ? timeoutMs / count : 1000;
                foreach (var action in actions)
                {
                    ProcessAction(action);
                    try
                    {
                        await Task.Delay(waitTime, _cts.Token);
                    }
                    catch (TaskCanceledException)
                    {
                        return;
                    }
                }
            }
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="vid"></param>
 /// <param name="ytCfg"></param>
 /// <param name="cc"></param>
 /// <param name="loginInfo"></param>
 /// <returns></returns>
 /// <exception cref="ReloadException"></exception>
 /// <exception cref="SpecChangedException"></exception>
 public async Task ReceiveAsync(string vid, YtInitialData ytInitialData1, YtCfg ytCfg, CookieContainer cc, ILoginState loginInfo)
 {
     if (_cts != null)
     {
         throw new InvalidOperationException("receiving");
     }
     _cts = new CancellationTokenSource();
     try
     {
         await ReceiveInternalAsync(ytInitialData1, ytCfg, cc, loginInfo);
     }
     finally
     {
         _cts = null;
     }
 }
Ejemplo n.º 5
0
 public void pressedLogin(string pass)
 {
     this.state = state.Login(pass);
 }
Ejemplo n.º 6
0
 public void pressedRestart()
 {
     this.state = state.Restart();
 }
Ejemplo n.º 7
0
 public void reStart()
 {
     this.state = state.reStart();
 }
Ejemplo n.º 8
0
 public Context(ILoginState state)
 {
     this.state = state;
 }
Ejemplo n.º 9
0
 public void Login(string password)
 {
     this.state = state.Login(password);
 }
Ejemplo n.º 10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="data"></param>
        /// <param name="innerTubeApiKey"></param>
        /// <param name="cc"></param>
        /// <param name="loginInfo"></param>
        /// <returns></returns>
        /// <exception cref="HttpRequestException">多分500番台のエラーだけ</exception>
        public static async Task <GetLiveChat> GetGetLiveChat(DataToPost data, string innerTubeApiKey, CookieContainer cc, ILoginState loginInfo, ILogger logger)
        {
            //dataの構造
            //context
            //+client
            //+request
            //++sessionId
            //+user
            //++onBehalfOfUser
            //continuation

            var url     = $"https://www.youtube.com/youtubei/v1/live_chat/get_live_chat?key={innerTubeApiKey}";
            var handler = new HttpClientHandler
            {
                UseCookies      = true,
                CookieContainer = cc,
            };
            var client = new HttpClient(handler);
            var c      = new StringContent(data.ToString(), Encoding.UTF8, "application/json");

            if (loginInfo is LoggedIn loggedIn)
            {
                var hash = SapiSidHashGenerator.CreateHash(cc, DateTime.Now);
                client.DefaultRequestHeaders.Add("Authorization", $"SAPISIDHASH {hash}");
            }

            client.DefaultRequestHeaders.Add("Origin", "https://www.youtube.com");
            HttpResponseMessage k;

            try
            {
                k = await client.PostAsync(url, c);
            }
            catch (Exception ex)
            {
                throw new GetGetLiveChatException(ex)
                      {
                          Url        = url,
                          DataToPost = data.ToString(),
                          IsLoggedIn = loginInfo is LoggedIn,
                      };
            }
            var s = await k.Content.ReadAsStringAsync();

            var getLiveChat = new GetLiveChat(s);

            return(getLiveChat);
        }
Ejemplo n.º 11
0
 public void Init(ILoginState state)
 {
     this.State = state;
 }
Ejemplo n.º 12
0
 public void setState(ILoginState newState)
 {
     curState = newState;
 }
Ejemplo n.º 13
0
 public void Restart()
 {
     this.state = new NewLogin(this);
     Console.WriteLine("Restart Succesfully");
 }