コード例 #1
0
        private async Task <string> WaitForBroadcastRunning(ChannelUrl channelUrl, CancellationToken ct)
        {
            string liveId;

            while (true)
            {
                var html = await _server.GetAsync(channelUrl.Url);

                var json       = Tools.ExtractChannelPageJson(html);
                var d          = DynamicJson.Parse(json);
                var broadcasts = ((object[])d.BroadcastCache.broadcasts);
                if (broadcasts.Length > 0)
                {
                    var broadcastJson = (string)((dynamic)((KeyValuePair <string, object>)broadcasts[0]).Value).broadcast.ToString();
                    var broadcast     = Tools.Deserialize <Low.Broadcast.RootObject>(broadcastJson);
                    if (broadcast.State == "RUNNING")
                    {
                        liveId = broadcast.Id;
                        _messageSetter.Set($"{channelUrl.ChannelId}は配信中です。放送ID:{liveId}", InfoType.Debug);
                        break;
                    }
                }
                //待機する旨通知する。
                _messageSetter.Set("配信していないため1分待機します。", InfoType.Notice);
                await Task.Delay(60 * 1000, ct);//設定で変更できるようにする
            }
            return(liveId);
        }
コード例 #2
0
        public async Task AutoReconnectAsync()
        {
            _isDisconnectedByUser = false;
            _generateGroupCts     = new CancellationTokenSource();
            while (true)
            {
                if (_url is UnknownUrl unknown)
                {
                    _messageUntara.Set($"入力されたURLは無効です。({unknown.Url})", InfoType.Error);
                    break;
                }
                if (_url is ChannelUrl channelUrl)
                {
                    //チャンネル
                    //配信中か確認
                    //配信中であればLiveIdを取得
                    //配信してなかったら始まるまで待機
                    try
                    {
                        var group = await _dummy.GenerateGroupAsync(_generateGroupCts.Token);

                        var reason = await _connectionManager.ConnectAsync(group);

                        System.Diagnostics.Debug.WriteLine($"接続が切れました。原因:{reason}");
                    }
                    catch (TaskCanceledException) { }
                }
                else if (_url is LivePageUrl livePageUrl)
                {
                    var(_, broadcastInfo) = await Api.GetAccessVideoPublicAsync(_server, livePageUrl.LiveId);

                    if (!IsBroadcastRunning(broadcastInfo))
                    {
                        _messageUntara.Set($"この放送は終了しています。({livePageUrl.Url})", InfoType.Error);
                        break;
                    }
                    try
                    {
                        var group = await _dummy.GenerateGroupAsync(_generateGroupCts.Token);

                        var reason = await _connectionManager.ConnectAsync(group);
                    }
                    catch (TaskCanceledException) { }
                    //~の理由により接続が切断されました。
                    //配信が終了している場合でもcontinueでおk。
                }
                if (_isDisconnectedByUser)
                {
                    break;
                }
            }
            _generateGroupCts = null;
        }
コード例 #3
0
 private void SendInfo(string message, InfoType type)
 {
     _messenger.Set(message, type);
 }