/// <summary> /// publishstatusの取得を開始します。 /// </summary> private static void BeginGetPublishStatus(long liveId, InternalData internalData, AutoResetEvent ev) { WebUtil.RequestHttpAsync( NicoString.GetPublishStatusUrl(liveId), null, internalData.Cookie, (result, data) => { try { // publishstatusは放送主でないと取得できません。 var v = PublishStatus.CreateFromXml(liveId, NicoUtil.GetXml(data)); internalData.LiveStreamInfo.PublishStatus = v; } catch (Exception ex) { internalData.Exception = ex; } ev.Set(); }); }
/// <summary> /// コメントサーバーに接続します。 /// </summary> /// <remarks> /// 接続失敗時には例外が返されます。 /// </remarks> public void Connect(PlayerStatus playerStatus, CookieContainer cc, bool currentRoomOnly, TimeSpan timeout) { lock (ConnectLock) { if (playerStatus == null) { throw new ArgumentNullException("playerStatus"); } // 例外が発生する可能性があります。 var streamInfo = LiveUtil.GetLiveStreamInfo(playerStatus, cc); // 各コメントルームの情報を取得します。 var roomInfoList = GetAllRoomInfo( streamInfo.PlayerStatus, streamInfo.LiveInfo.CommunityLevel); var currentRoomIndex = FindRoomIndex( playerStatus.MS.Port, roomInfoList); var roomList = new List <CommentRoom>(); // 各コメントルームに接続します。 for (var i = 0; i < roomInfoList.Count(); ++i) { if (currentRoomOnly && i != currentRoomIndex) { roomList.Add(null); continue; } var room = new CommentRoom(this, roomInfoList[i], i); // 接続に失敗した場合、例外が返ります。 room.Connect(cc, timeout); roomList.Add(room); } Disconnect(); lock (SyncRoot) { this.connectedRoomCount = 0; this.playerStatus = streamInfo.PlayerStatus; this.publishStatus = streamInfo.PublishStatus; this.liveInfo = streamInfo.LiveInfo; this.roomList = roomList; this.currentRoomIndex = currentRoomIndex; this.cookieContainer = cc; } // フィールド値を設定した後に、OnConnectedRoomを呼びます。 foreach (var room in ClonedCommentRoomList) { OnConnectedRoom(room); } // 接続時のイベントを発生させます。 FireConnected(); } }
/// <summary> /// 全部屋からの接続が切られたときに呼ばれます。 /// </summary> private void NotifyDisconnect() { // ここでイベントが呼ばれます。 FireDisconnected(); lock (SyncRoot) { this.connectedRoomCount = 0; this.currentRoomIndex = -1; this.cookieContainer = null; this.playerStatus = null; this.publishStatus = null; this.roomList.Clear(); } ClearOwnerComment(); }
/// <summary> /// 公式放送のコメントサーバーに接続します。 /// </summary> /// <remarks> /// 接続失敗時には例外が返されます。 /// </remarks> public void ConnectToOfficial(string filepath, CookieContainer cc, TimeSpan timeout) { lock (ConnectLock) { // 各コメントルームの情報を取得します。 var roomInfoList = Detail.OfficialLiveInfoCreator .GetAllRoomInfoFromXml(filepath); var roomList = new List <CommentRoom>(); // 各コメントルームに接続します。 for (var i = 0; i < roomInfoList.Count(); ++i) { var room = new CommentRoom(this, roomInfoList[i], i); // 接続に失敗した場合、例外が返ります。 room.Connect(cc, timeout); roomList.Add(room); } Disconnect(); lock (SyncRoot) { this.connectedRoomCount = 0; this.playerStatus = null; this.publishStatus = null; this.liveInfo = null; this.roomList = roomList; this.currentRoomIndex = -1; this.cookieContainer = cc; } // フィールド値を設定した後に、OnConnectedRoomを呼びます。 foreach (var room in ClonedCommentRoomList) { OnConnectedRoom(room); } // 接続時のイベントを発生させます。 FireConnected(); } }
/// <summary> /// 放送関連情報を同期的に取得します。 /// </summary> public static LiveStreamInfo GetLiveStreamInfoSync(string liveUrl, CookieContainer cc) { var playerStatus = PlayerStatus.Create(liveUrl, cc); var id = playerStatus.Stream.Id; // publishstatusは放送主しか取得することが出来ません。 PublishStatus publishStatus = null; if (playerStatus.Stream.IsOwner) { publishStatus = PublishStatus.Create(id, cc); } // 放送情報を取得します。 var liveInfo = LiveInfo.Create(id, cc); return(new LiveStreamInfo() { PlayerStatus = playerStatus, PublishStatus = publishStatus, LiveInfo = liveInfo, }); }
/// <summary> /// 公式放送のコメントサーバーに接続します。 /// </summary> /// <remarks> /// 接続失敗時には例外が返されます。 /// </remarks> public void ConnectToOfficial(string filepath, CookieContainer cc, TimeSpan timeout) { lock (ConnectLock) { // 各コメントルームの情報を取得します。 var roomInfoList = Detail.OfficialLiveInfoCreator .GetAllRoomInfoFromXml(filepath); var roomList = new List<CommentRoom>(); // 各コメントルームに接続します。 for (var i = 0; i < roomInfoList.Count(); ++i) { var room = new CommentRoom(this, roomInfoList[i], i); // 接続に失敗した場合、例外が返ります。 room.Connect(cc, timeout); roomList.Add(room); } Disconnect(); lock (SyncRoot) { this.connectedRoomCount = 0; this.playerStatus = null; this.publishStatus = null; this.liveInfo = null; this.roomList = roomList; this.currentRoomIndex = -1; this.cookieContainer = cc; } // フィールド値を設定した後に、OnConnectedRoomを呼びます。 foreach (var room in ClonedCommentRoomList) { OnConnectedRoom(room); } // 接続時のイベントを発生させます。 FireConnected(); } }
/// <summary> /// コメントサーバーに接続します。 /// </summary> /// <remarks> /// 接続失敗時には例外が返されます。 /// </remarks> public void Connect(PlayerStatus playerStatus, CookieContainer cc, bool currentRoomOnly, TimeSpan timeout) { lock (ConnectLock) { if (playerStatus == null) { throw new ArgumentNullException("playerStatus"); } // 例外が発生する可能性があります。 var streamInfo = LiveUtil.GetLiveStreamInfo(playerStatus, cc); // 各コメントルームの情報を取得します。 var roomInfoList = GetAllRoomInfo( streamInfo.PlayerStatus, streamInfo.LiveInfo.CommunityLevel); var currentRoomIndex = FindRoomIndex( playerStatus.MS.Port, roomInfoList); var roomList = new List<CommentRoom>(); // 各コメントルームに接続します。 for (var i = 0; i < roomInfoList.Count(); ++i) { if (currentRoomOnly && i != currentRoomIndex) { roomList.Add(null); continue; } var room = new CommentRoom(this, roomInfoList[i], i); // 接続に失敗した場合、例外が返ります。 room.Connect(cc, timeout); roomList.Add(room); } Disconnect(); lock (SyncRoot) { this.connectedRoomCount = 0; this.playerStatus = streamInfo.PlayerStatus; this.publishStatus = streamInfo.PublishStatus; this.liveInfo = streamInfo.LiveInfo; this.roomList = roomList; this.currentRoomIndex = currentRoomIndex; this.cookieContainer = cc; } // フィールド値を設定した後に、OnConnectedRoomを呼びます。 foreach (var room in ClonedCommentRoomList) { OnConnectedRoom(room); } // 接続時のイベントを発生させます。 FireConnected(); } }