Пример #1
0
        public NicoLiveVideo(
            string liveId,
            MediaPlayer mediaPlayer,
            NiconicoSession niconicoSession,
            NicoLiveProvider nicoLiveProvider,
            LoginUserLiveReservationProvider loginUserLiveReservationProvider,
            PlayerSettings playerSettings,
            IScheduler scheduler,
            string communityId = null
            )
        {
            LiveId           = liveId;
            _CommunityId     = communityId;
            MediaPlayer      = mediaPlayer;
            NiconicoSession  = niconicoSession;
            NicoLiveProvider = nicoLiveProvider;
            LoginUserLiveReservationProvider = loginUserLiveReservationProvider;
            PlayerSettings = playerSettings;
            _UIScheduler   = scheduler;

            _LiveComments = new ObservableCollection <LiveChatData>();
            LiveComments  = new ReadOnlyObservableCollection <LiveChatData>(_LiveComments);


            LiveComments.ObserveAddChanged()
            .Where(x => x.IsOperater && x.HasOperatorCommand)
            .SubscribeOn(_UIScheduler)
            .Subscribe(chat =>
            {
                OperationCommandRecieved?.Invoke(this, new OperationCommandRecievedEventArgs()
                {
                    Chat = chat
                });
            });
        }
Пример #2
0
 public TimeshiftPageViewModel(
     LoginUserLiveReservationProvider loginUserLiveReservationProvider,
     NicoLiveProvider nicoLiveProvider,
     Services.HohoemaPlaylist hohoemaPlaylist,
     Services.PageManager pageManager,
     Services.DialogService dialogService
     )
     : base(pageManager, useDefaultPageTitle: true)
 {
     LoginUserLiveReservationProvider = loginUserLiveReservationProvider;
     NicoLiveProvider = nicoLiveProvider;
     HohoemaPlaylist  = hohoemaPlaylist;
     DialogService    = dialogService;
 }
Пример #3
0
 public TimeshiftPageViewModel(
     ApplicationLayoutManager applicationLayoutManager,
     LoginUserLiveReservationProvider loginUserLiveReservationProvider,
     NicoLiveProvider nicoLiveProvider,
     HohoemaPlaylist hohoemaPlaylist,
     NoUIProcessScreenContext noUIProcessScreenContext,
     Services.DialogService dialogService
     )
 {
     ApplicationLayoutManager         = applicationLayoutManager;
     LoginUserLiveReservationProvider = loginUserLiveReservationProvider;
     NicoLiveProvider          = nicoLiveProvider;
     HohoemaPlaylist           = hohoemaPlaylist;
     _noUIProcessScreenContext = noUIProcessScreenContext;
     DialogService             = dialogService;
 }
Пример #4
0
 public TimeshiftPageViewModel(
     ILoggerFactory loggerFactory,
     ApplicationLayoutManager applicationLayoutManager,
     LoginUserLiveReservationProvider loginUserLiveReservationProvider,
     NicoLiveProvider nicoLiveProvider,
     NoUIProcessScreenContext noUIProcessScreenContext,
     Services.DialogService dialogService,
     OpenLiveContentCommand openLiveContentCommand
     )
     : base(loggerFactory.CreateLogger <TimeshiftPageViewModel>())
 {
     ApplicationLayoutManager         = applicationLayoutManager;
     LoginUserLiveReservationProvider = loginUserLiveReservationProvider;
     NicoLiveProvider          = nicoLiveProvider;
     _noUIProcessScreenContext = noUIProcessScreenContext;
     DialogService             = dialogService;
     OpenLiveContentCommand    = openLiveContentCommand;
 }
Пример #5
0
        private async Task RefreshTimeshiftProgram()
        {
            if (NiconicoSession.IsLoggedIn)
            {
                var timeshiftDetailsRes = await LoginUserLiveReservationProvider.GetReservtionsAsync();

                foreach (var timeshift in timeshiftDetailsRes.ReservedProgram)
                {
                    if (LiveId.EndsWith(timeshift.Id))
                    {
                        _TimeshiftProgram = timeshift;
                    }
                }
            }
            else
            {
                _TimeshiftProgram = null;
            }
        }
Пример #6
0
 public TimeshiftIncrementalCollectionSource(LoginUserLiveReservationProvider liveReservationProvider, NicoLiveProvider nicoLiveProvider)
 {
     LiveReservationProvider = liveReservationProvider;
     NicoLiveProvider        = nicoLiveProvider;
 }
Пример #7
0
        public async Task StartLiveWatchingSessionAsync()
        {
            if (LiveInfo != null)
            {
                LiveInfo = null;

                await ExitLiveViewing();

                await Task.Delay(TimeSpan.FromSeconds(1));
            }

            try
            {
                await UpdateLiveStatus();
            }
            catch { }

            TimeshiftPosition = LiveInfo.VideoInfo.Video.StartTime - LiveInfo.VideoInfo.Video.OpenTime;

            if (IsWatchWithTimeshift)
            {
                _StartTimeOffset = (DateTimeOffset.Now.ToOffset(JapanTimeZoneOffset) - LiveInfo.VideoInfo.Video.OpenTime) ?? TimeSpan.Zero;
            }
            else
            {
                _StartTimeOffset = TimeSpan.Zero;
            }


            // タイムシフトでの視聴かつタイムシフトの視聴予約済みかつ視聴権が未取得の場合は
            // 視聴権の使用を確認する
            if (_TimeshiftProgram?.GetReservationStatus() == Mntone.Nico2.Live.ReservationsInDetail.ReservationStatus.FIRST_WATCH)
            {
                var dialog = App.Current.Container.Resolve <Services.DialogService>();


                // 視聴権に関する詳細な情報提示

                // 視聴権の利用期限は 24H+放送時間 まで
                // ただし公開期限がそれより先に来る場合には公開期限が視聴期限となる
                var    outdatedTime = DateTimeOffset.Now.ToOffset(JapanTimeZoneOffset) + (LiveInfo.VideoInfo.Video.EndTime - LiveInfo.VideoInfo.Video.StartTime) + TimeSpan.FromHours(24);
                string desc         = string.Empty;
                if (outdatedTime > _TimeshiftProgram.ExpiredAt)
                {
                    outdatedTime = _TimeshiftProgram.ExpiredAt.LocalDateTime;
                    desc         = $"この放送のタイムシフト視聴を開始しますか?\r公開期限内に限って繰り返し視聴できます。\r\r公開期限:{_TimeshiftProgram.ExpiredAt.ToString("g")}";
                }
                else
                {
                    desc = $"この放送のタイムシフト視聴を開始しますか?\r視聴開始を起点に視聴期限が設定されます。視聴期限内に限って繰り返し視聴できます。\r\r推定視聴期限:{outdatedTime.Value.ToString("g")}";
                }
                var result = await dialog.ShowMessageDialog(
                    desc
                    , _TimeshiftProgram.Title, "視聴する", "キャンセル"
                    );

                if (result)
                {
                    var token = await LoginUserLiveReservationProvider.GetReservationTokenAsync();

                    await Task.Delay(500);

                    await LoginUserLiveReservationProvider.UseReservationAsync(_TimeshiftProgram.Id, token);

                    await Task.Delay(3000);

                    // タイムシフト予約一覧を更新
                    // 視聴権利用を開始したアイテムがFIRST_WATCH以外の視聴可能を示すステータスになっているはず
                    await RefreshTimeshiftProgram();

                    Debug.WriteLine("use reservation after status: " + _TimeshiftProgram.Status);
                }
            }


            try
            {
                _PlayerProps = await NicoLiveProvider.GetLeoPlayerPropsAsync(LiveId);
            }
            catch (Exception ex)
            {
                FailedOpenLive?.Invoke(this, new FailedOpenLiveEventArgs()
                {
                    Exception = ex,
                    Message   = "サービスからの応答がありません"
                });

                LiveStatus = StatusType.Invalid;
            }

            if (_PlayerProps != null)
            {
                Debug.WriteLine(_PlayerProps.Program.BroadcastId);

                LivePlayerType = Live.LivePlayerType.Leo;

                if (Live2WebSocket == null)
                {
                    Live2WebSocket = new Live2WebSocket(_PlayerProps);
                    Live2WebSocket.RecieveCurrentStream += Live2WebSocket_RecieveCurrentStream;
                    Live2WebSocket.RecieveStatistics    += Live2WebSocket_RecieveStatistics;
                    Live2WebSocket.RecieveDisconnect    += Live2WebSocket_RecieveDisconnect;
                    Live2WebSocket.RecieveCurrentRoom   += Live2WebSocket_RecieveCurrentRoom;
                    var quality = PlayerSettings.DefaultLiveQuality;

                    _IsLowLatency = PlayerSettings.LiveWatchWithLowLatency;
                    await Live2WebSocket.StartAsync(quality, _IsLowLatency);
                }

                await StartLiveViewing();
            }
            else
            {
                throw new NotSupportedException("RTMP による放送は対応していません。");
            }
        }