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); }
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; }
private void SendInfo(string message, InfoType type) { _messenger.Set(message, type); }