Ejemplo n.º 1
0
        public HistoryPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService)
            : base(hohoemaApp, pageManager, mylistDialogService)
        {
            RemoveHistoryCommand = SelectedItems.ObserveProperty(x => x.Count)
                                   .Select(x => x > 0)
                                   .ToReactiveCommand()
                                   .AddTo(_CompositeDisposable);

            RemoveHistoryCommand.Subscribe(async _ =>
            {
                var selectedItems = SelectedItems.ToArray();

                var action = AsyncInfo.Run <uint>(async(cancelToken, progress) =>
                {
                    foreach (var item in selectedItems)
                    {
                        await RemoveHistory(item.RawVideoId);

                        SelectedItems.Remove(item);

                        await Task.Delay(250);
                    }

                    await UpdateList();

                    _HistoriesResponse = await HohoemaApp.ContentFinder.GetHistory();

                    RemoveAllHistoryCommand.RaiseCanExecuteChanged();
                });

                await PageManager.StartNoUIWork("視聴履歴の削除", selectedItems.Length, () => action);
            })
            .AddTo(_CompositeDisposable);
        }
Ejemplo n.º 2
0
        public CacheManagementPageViewModel(HohoemaApp app, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService)
            : base(app, pageManager, mylistDialogService)
        {
            if (scheduler == null)
            {
                scheduler = new SynchronizationContextScheduler(SynchronizationContext.Current);
            }
            _MediaManager = app.MediaManager;

            OpenCacheSettingsCommand = new DelegateCommand(() =>
            {
                PageManager.OpenPage(HohoemaPageType.Settings, HohoemaSettingsKind.Cache.ToString());
            });
        }
Ejemplo n.º 3
0
        public MylistPageViewModel(
            HohoemaApp hohoemaApp
            , PageManager pageManager
            , Views.Service.MylistRegistrationDialogService mylistDialogService
            , Views.Service.ContentSelectDialogService contentSelectDialogService
            )
            : base(hohoemaApp, pageManager, mylistDialogService, isRequireSignIn: true)
        {
            _ContentSelectDialogService = contentSelectDialogService;

            PlayableList = new ReactiveProperty <IPlayableList>();
            MylistOrigin = new ReactiveProperty <Models.PlaylistOrigin>();

            IsFavoriteMylist = new ReactiveProperty <bool>(mode: ReactivePropertyMode.DistinctUntilChanged)
                               .AddTo(_CompositeDisposable);
            CanChangeFavoriteMylistState = new ReactiveProperty <bool>()
                                           .AddTo(_CompositeDisposable);


            IsFavoriteMylist
            .Where(x => PlayableList.Value.Id != null)
            .Subscribe(async x =>
            {
                if (PlayableList.Value.Origin != PlaylistOrigin.OtherUser)
                {
                    return;
                }

                if (_NowProcessFavorite)
                {
                    return;
                }

                _NowProcessFavorite = true;

                CanChangeFavoriteMylistState.Value = false;
                if (x)
                {
                    if (await FavoriteMylist())
                    {
                        Debug.WriteLine(_MylistTitle + "のマイリストをお気に入り登録しました.");
                    }
                    else
                    {
                        // お気に入り登録に失敗した場合は状態を差し戻し
                        Debug.WriteLine(_MylistTitle + "のマイリストをお気に入り登録に失敗");
                        IsFavoriteMylist.Value = false;
                    }
                }
                else
                {
                    if (await UnfavoriteMylist())
                    {
                        Debug.WriteLine(_MylistTitle + "のマイリストをお気に入り解除しました.");
                    }
                    else
                    {
                        // お気に入り解除に失敗した場合は状態を差し戻し
                        Debug.WriteLine(_MylistTitle + "のマイリストをお気に入り解除に失敗");
                        IsFavoriteMylist.Value = true;
                    }
                }

                CanChangeFavoriteMylistState.Value =
                    IsFavoriteMylist.Value == true ||
                    HohoemaApp.FollowManager.CanMoreAddFollow(FollowItemType.Mylist);


                _NowProcessFavorite = false;
            })
            .AddTo(_CompositeDisposable);


            UnregistrationMylistCommand = SelectedItems.ObserveProperty(x => x.Count)
                                          .Where(_ => this.CanEditMylist)
                                          .Select(x => x > 0)
                                          .ToReactiveCommand(false);

            UnregistrationMylistCommand.Subscribe(async _ =>
            {
                var mylistGroup = HohoemaApp.UserMylistManager.GetMylistGroup(PlayableList.Value.Id);

                var items = SelectedItems.ToArray();


                var action = AsyncInfo.Run <uint>(async(cancelToken, progress) =>
                {
                    uint progressCount = 0;
                    int successCount   = 0;
                    int failedCount    = 0;

                    Debug.WriteLine($"マイリストに追加解除を開始...");
                    foreach (var video in items)
                    {
                        var unregistrationResult = await mylistGroup.Unregistration(
                            video.RawVideoId
                            , withRefresh: false /* あとでまとめてリフレッシュするのでここでは OFF */);

                        if (unregistrationResult == ContentManageResult.Success)
                        {
                            successCount++;
                        }
                        else
                        {
                            failedCount++;
                        }

                        progressCount++;
                        progress.Report(progressCount);

                        Debug.WriteLine($"{video.Title}[{video.RawVideoId}]:{unregistrationResult.ToString()}");
                    }

                    // 登録解除結果を得るためリフレッシュ
                    await mylistGroup.Refresh();


                    // ユーザーに結果を通知
                    var titleText    = $"「{mylistGroup.Name}」から {successCount}件 の動画が登録解除されました";
                    var toastService = App.Current.Container.Resolve <ToastNotificationService>();
                    var resultText   = $"";
                    if (failedCount > 0)
                    {
                        resultText += $"\n登録解除に失敗した {failedCount}件 は選択されたままです";
                    }
                    toastService.ShowText(titleText, resultText);

                    // 登録解除に失敗したアイテムだけを残すように
                    // マイリストから除外された動画を選択アイテムリストから削除
                    foreach (var item in SelectedItems.ToArray())
                    {
                        if (false == mylistGroup.CheckRegistratedVideoId(item.RawVideoId))
                        {
                            SelectedItems.Remove(item);
                            IncrementalLoadingItems.Remove(item);
                        }
                    }

                    Debug.WriteLine($"マイリストに追加解除完了---------------");
                });

                await PageManager.StartNoUIWork("マイリストに追加解除", items.Length, () => action);
            });

            CopyMylistCommand = SelectedItems.ObserveProperty(x => x.Count)
                                .Where(_ => this.CanEditMylist)
                                .Select(x => x > 0)
                                .ToReactiveCommand(false);

            CopyMylistCommand.Subscribe(async _ =>
            {
                var mylistGroup = HohoemaApp.UserMylistManager.GetMylistGroup(PlayableList.Value.Id);
                // ターゲットのマイリストを選択する
                var targetMylist = await MylistDialogService
                                   .ShowSelectSingleMylistDialog(
                    SelectedItems.Count
                    , hideMylistGroupId: mylistGroup.GroupId
                    );

                if (targetMylist == null)
                {
                    return;
                }



                // すでにターゲットのマイリストに登録されている動画を除外してコピーする
                var items = SelectedItems
                            .Where(x => !targetMylist.CheckRegistratedVideoId(x.RawVideoId))
                            .ToList();

                var action = AsyncInfo.Run <uint>(async(cancelToken, progress) =>
                {
                    Debug.WriteLine($"マイリストのコピーを開始...");

                    var result = await mylistGroup.CopyMylistTo(
                        targetMylist
                        , items.Select(video => video.RawVideoId).ToArray()
                        );


                    Debug.WriteLine($"copy mylist {items.Count} item from {mylistGroup.Name} to {targetMylist.Name} : {result.ToString()}");

                    // ユーザーに結果を通知
                    var toastService = App.Current.Container.Resolve <ToastNotificationService>();

                    string titleText;
                    string contentText;
                    if (result == ContentManageResult.Success)
                    {
                        titleText   = $"「{targetMylist.Name}」に {SelectedItems.Count}件 コピーしました";
                        contentText = $" {SelectedItems.Count}件 の動画をコピーしました";

                        progress.Report((uint)items.Count);
                    }
                    else
                    {
                        titleText   = $"マイリストコピーに失敗";
                        contentText = $"時間を置いてからやり直してみてください";
                    }

                    toastService.ShowText(titleText, contentText);



                    // 成功した場合は選択状態を解除
                    if (result == ContentManageResult.Success)
                    {
                        ClearSelection();
                    }

                    Debug.WriteLine($"マイリストのコピー完了...");
                });

                await PageManager.StartNoUIWork("マイリストのコピー", items.Count, () => action);
            });


            MoveMylistCommand = SelectedItems.ObserveProperty(x => x.Count)
                                .Where(_ => this.CanEditMylist)
                                .Select(x => x > 0)
                                .ToReactiveCommand(false);

            MoveMylistCommand.Subscribe(async _ =>
            {
                var mylistGroup = HohoemaApp.UserMylistManager.GetMylistGroup(PlayableList.Value.Id);

                // ターゲットのマイリストを選択する
                var targetMylist = await MylistDialogService
                                   .ShowSelectSingleMylistDialog(
                    SelectedItems.Count
                    , hideMylistGroupId: mylistGroup.GroupId
                    );

                if (targetMylist == null)
                {
                    return;
                }



                // すでにターゲットのマイリストに登録されている動画を除外してコピーする
                var items = SelectedItems
                            .Where(x => !targetMylist.CheckRegistratedVideoId(x.RawVideoId))
                            .ToList();

                Debug.WriteLine($"マイリストの移動を開始...");

                var result = await mylistGroup.MoveMylistTo(
                    targetMylist
                    , items.Select(video => video.RawVideoId).ToArray()
                    );

                Debug.WriteLine($"move mylist {items.Count} item from {mylistGroup.Name} to {targetMylist.Name} : {result.ToString()}");

                // ユーザーに結果を通知
                var toastService = App.Current.Container.Resolve <ToastNotificationService>();

                string titleText;
                string contentText;
                if (result == ContentManageResult.Success)
                {
                    titleText   = $"「{targetMylist.Name}」に {SelectedItems.Count}件 移動しました";
                    contentText = $" {SelectedItems.Count}件 の動画を移動しました";
                }
                else
                {
                    titleText   = $"マイリスト移動に失敗";
                    contentText = $"時間を置いてからやり直してみてください";
                }

                toastService.ShowText(titleText, contentText);



                // 成功した場合は選択状態を解除
                if (result == ContentManageResult.Success)
                {
                    // 移動元のマイリストからは削除されているはず
                    foreach (var item in SelectedItems)
                    {
                        if (!mylistGroup.CheckRegistratedVideoId(item.RawVideoId))
                        {
                            IncrementalLoadingItems.Remove(item);
                        }
                        else
                        {
                            throw new Exception();
                        }
                    }

                    ClearSelection();
                }

                Debug.WriteLine($"マイリストの移動完了...");
            });
        }
Ejemplo n.º 4
0
        public RankingCategoryPageViewModel(HohoemaApp hohoemaApp, EventAggregator ea, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService)
            : base(hohoemaApp, pageManager, mylistDialogService, useDefaultPageTitle: false)
        {
            this.ChangeRequireServiceLevel(HohoemaAppServiceLevel.LoggedIn);

            ContentFinder    = HohoemaApp.ContentFinder;
            _EventAggregator = ea;

            //			RankingSettings = hohoemaApp.UserSettings.RankingSettings;
            IsFailedRefreshRanking = new ReactiveProperty <bool>(false)
                                     .AddTo(_CompositeDisposable);
            CanChangeRankingParameter = new ReactiveProperty <bool>(false)
                                        .AddTo(_CompositeDisposable);



            // ランキングの対象
            RankingTargetItems = new List <RankingTargetListItem>()
            {
                new RankingTargetListItem(RankingTarget.view),
                new RankingTargetListItem(RankingTarget.res),
                new RankingTargetListItem(RankingTarget.mylist)
            };

            SelectedRankingTarget = new ReactiveProperty <RankingTargetListItem>(RankingTargetItems[0], ReactivePropertyMode.DistinctUntilChanged)
                                    .AddTo(_CompositeDisposable);


            // ランキングの集計期間
            RankingTimeSpanItems = new List <RankingTimeSpanListItem>()
            {
                new RankingTimeSpanListItem(RankingTimeSpan.hourly),
                new RankingTimeSpanListItem(RankingTimeSpan.daily),
                new RankingTimeSpanListItem(RankingTimeSpan.weekly),
                new RankingTimeSpanListItem(RankingTimeSpan.monthly),
                new RankingTimeSpanListItem(RankingTimeSpan.total),
            };

            SelectedRankingTimeSpan = new ReactiveProperty <RankingTimeSpanListItem>(RankingTimeSpanItems[0], ReactivePropertyMode.DistinctUntilChanged)
                                      .AddTo(_CompositeDisposable);

            Observable.Merge(
                SelectedRankingTimeSpan.ToUnit(),
                SelectedRankingTarget.ToUnit()
                )
            .SubscribeOnUIDispatcher()
            .Subscribe(async x =>
            {
                // NavigateToが呼ばれた後
                if (RequireCategoryInfo != null || CategoryInfo != null)
                {
                    await ResetList();
                }
            })
            .AddTo(_CompositeDisposable);
        }
Ejemplo n.º 5
0
 public CommunityVideoPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService)
     : base(hohoemaApp, pageManager)
 {
 }
Ejemplo n.º 6
0
        public FeedVideoListPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService)
            : base(hohoemaApp, pageManager, mylistDialogService, isRequireSignIn: true)
        {
            LastUpdate = new ReactiveProperty <DateTime>();

            AllMarkAsReadCommand = new DelegateCommand(async() =>
            {
                FeedGroup.ForceMarkAsRead();

                await HohoemaApp.FeedManager.SaveOne(FeedGroup);

                AllMarkAsReadCommand.RaiseCanExecuteChanged();
            }
                                                       , () =>
            {
                return((FeedGroup?.GetUnreadItemCount() ?? 0) > 0);
            });


            SelectedItemsMarkAsReadCommand = SelectedItems.ToCollectionChanged()
                                             .Select(x => SelectedItems.Count(y => y.IsUnread.Value) > 0)
                                             .ToReactiveCommand(false)
                                             .AddTo(_CompositeDisposable);

            SelectedItemsMarkAsReadCommand.Subscribe(async _ =>
            {
                foreach (var item in SelectedItems)
                {
                    await HohoemaApp.FeedManager.MarkAsRead(item.VideoId);
                    await HohoemaApp.FeedManager.MarkAsRead(item.RawVideoId);
                }

                ClearSelection();
            })
            .AddTo(_CompositeDisposable);

            OpenFeedGroupPageCommand = new DelegateCommand(() =>
            {
                if (FeedGroup != null)
                {
                    PageManager.OpenPage(HohoemaPageType.FeedGroup, FeedGroup.Id);
                }
            });
        }
Ejemplo n.º 7
0
        public SearchPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService)
            : base(hohoemaApp, pageManager)
        {
            _MylistDialogService = mylistDialogService;

            SearchText = new ReactiveProperty <string>("")
                         .AddTo(_CompositeDisposable);

            TargetListItems = new List <SearchTarget>()
            {
                SearchTarget.Keyword,
                SearchTarget.Tag,
                SearchTarget.Mylist,
                SearchTarget.Community,
                SearchTarget.Niconama,
            };

            SelectedTarget = new ReactiveProperty <SearchTarget>(TargetListItems[0])
                             .AddTo(_CompositeDisposable);

            SearchOptionVM     = new ReactiveProperty <SearchOptionViewModelBase>();
            SearchOptionVMDict = new Dictionary <SearchTarget, SearchOptionViewModelBase>();

            SelectedTarget.Subscribe(x =>
            {
                RaiseSearchTargetFlags();

                var keyword = SearchOptionVM.Value?.Keyword ?? "";
                SearchOptionViewModelBase searchOptionVM = null;
                if (SearchOptionVMDict.ContainsKey(x))
                {
                    searchOptionVM = SearchOptionVMDict[x];
                }
                else
                {
                    searchOptionVM = SearchOptioniViewModelHelper.CreateFromTarget(x);
                    SearchOptionVMDict.Add(x, searchOptionVM);
                }

                searchOptionVM.Keyword = keyword;

                SearchOptionVM.Value = searchOptionVM;
            });



            DoSearchCommand =
                SearchText.Select(x => !String.IsNullOrEmpty(x))
                .ToReactiveCommand()
                .AddTo(_CompositeDisposable);

            SearchText.Subscribe(x =>
            {
                Debug.WriteLine($"検索:{x}");
            });


            DoSearchCommand.CanExecuteChangedAsObservable()
            .Subscribe(x =>
            {
                Debug.WriteLine(DoSearchCommand.CanExecute());
            });
            DoSearchCommand.Subscribe(_ =>
            {
                if (SearchText.Value.Length == 0)
                {
                    return;
                }

                // Note: Keywordの管理はSearchPage側で行うべき?
                SearchOptionVM.Value.Keyword = SearchText.Value;

                var searchOption = SearchOptionVM.Value.MakePayload();

                // 検索結果を表示
                PageManager.Search(searchOption);
            })
            .AddTo(_CompositeDisposable);
        }
Ejemplo n.º 8
0
 public UserVideoPageViewModel(HohoemaApp app, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService)
     : base(app, pageManager, mylistDialogService, isRequireSignIn: true)
 {
 }