Beispiel #1
0
        /// <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();
            });
        }
Beispiel #2
0
        /// <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();
            }
        }
Beispiel #3
0
        /// <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();
        }
Beispiel #4
0
        /// <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();
            }
        }
Beispiel #5
0
        /// <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,
            });
        }
Beispiel #6
0
        /// <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();
        }
Beispiel #7
0
        /// <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();
            }
        }
Beispiel #8
0
        /// <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();
            }
        }