示例#1
0
        private void LoadRecommendationFromCache(SettingsPreferences settings
                                                 , ILiteCollection <RecommendationAnimes> recommendationAnimesCollection, RecommendationAnimes recommendationsCache)
        {
            recommendationsCache.Recommendations = recommendationsCache.Recommendations
                                                   .Where(recommendation => !App.liteDB.GetCollection <FavoritedAnime>()
                                                          .Exists(favoritedAnime => recommendation.MalId == favoritedAnime.Anime.MalId))
                                                   .ToList();

            RecommendationAnimes = recommendationsCache;

            HasRecommendations = RecommendationAnimes.Recommendations.Count() != 0;

            recommendationAnimesCollection.Upsert(0, recommendationsCache);
        }
示例#2
0
        public async Task LoadAsync()
        {
            while (App.liteDB == null)
            {
                await Task.Delay(TimeSpan.FromMilliseconds(100));
            }

            _cancellationTokenSource = new CancellationTokenSource();

            var settings = App.liteDB.GetCollection <SettingsPreferences>().FindById(0);

            try
            {
                var loadTodayAnimesTask = Task.Run(async() =>
                {
                    if (_cancellationTokenSource.IsCancellationRequested)
                    {
                        _cancellationTokenSource.Token.ThrowIfCancellationRequested();
                    }

                    var todayAnimeCollection = App.liteDB.GetCollection <TodayAnimes>();
                    var todayAnimes          = todayAnimeCollection.FindById(0);

                    if (todayAnimes?.DayOfWeek != DateTime.Today.DayOfWeek || todayAnimes?.ShowNSFW != settings.ShowNSFW)
                    {
                        IsLoadingTodayAnimes = true;

                        await App.DelayRequest(2);
                        Schedule schedule = await App.Jikan.GetSchedule(DateTime.Today.DayOfWeek.ConvertDayOfWeekToScheduleDay());

                        var animes = await schedule.GetCurrentScheduleDay().ConvertCatalogueAnimesToFavoritedAsync(settings.ShowNSFW);

                        var tdayAnimes = new TodayAnimes
                        {
                            DayOfWeek       = DateTime.Today.DayOfWeek,
                            FavoritedAnimes = animes,
                            ShowNSFW        = settings.ShowNSFW,
                        };

                        TodayAnimes = tdayAnimes;
                        todayAnimeCollection.Upsert(0, tdayAnimes);

                        IsLoadingTodayAnimes = false;
                    }
                    else if (TodayAnimes == null || todayAnimes?.DayOfWeek != DateTime.Today.DayOfWeek)
                    {
                        TodayAnimes = todayAnimes;
                    }
                }, _cancellationTokenSource.Token);

                var loadRecommendationsTask = Task.Run(async() =>
                {
                    var recommendationAnimesCollection = App.liteDB.GetCollection <RecommendationAnimes>();
                    var recommendationsCache           = recommendationAnimesCollection.FindById(0);

                    var animeCollection = settings.ShowNSFW
                       ? App.liteDB.GetCollection <FavoritedAnime>().FindAll().ToList()
                       : App.liteDB.GetCollection <FavoritedAnime>().Find(p => !p.IsNSFW).ToList();

                    int collectionCount = animeCollection.Count;

                    if (collectionCount == 0)
                    {
                        return;
                    }

                    if (recommendationsCache == null ||
                        recommendationsCache != null && DateTime.Now.Subtract(recommendationsCache.LastRecommendationDate).TotalHours >= 1 ||
                        settings.ShowNSFW != recommendationsCache.ShowNSFW)
                    {
                        var rand = new Random();

                        int indexPick = rand.Next(collectionCount);

                        FavoritedAnime animeAsRecommend = animeCollection[indexPick];

                        if (_cancellationTokenSource.IsCancellationRequested)
                        {
                            _cancellationTokenSource.Token.ThrowIfCancellationRequested();
                        }

                        await App.DelayRequest(2);
                        Recommendations recommendations = await App.Jikan.GetAnimeRecommendations(animeAsRecommend.Anime.MalId);

                        var recommendationAnimes = recommendations.RecommendationCollection
                                                   .Where(recommendation => !animeCollection.Exists(favoritedAnime => recommendation.MalId == favoritedAnime.Anime.MalId))
                                                   .ToList();

                        if (recommendationAnimes.Count == 0)
                        {
                            if (recommendationsCache != null)
                            {
                                LoadRecommendationFromCache(settings, recommendationAnimesCollection, recommendationsCache);
                            }

                            return;
                        }

                        var recomendationsList = new HashSet <Recommendation>();

                        for (int i = 0; i < 5; i++)
                        {
                            await Task.Delay(TimeSpan.FromMilliseconds(50));
                            indexPick = rand.Next(recommendationAnimes.Count);

                            recomendationsList.Add(recommendationAnimes[indexPick]);
                        }

                        var recommendationAnimesCache = new RecommendationAnimes
                        {
                            Recommendations = recomendationsList
                                              .Where(recommendation => !App.liteDB.GetCollection <FavoritedAnime>()
                                                     .Exists(favoritedAnime => recommendation.MalId == favoritedAnime.Anime.MalId))
                                              .ToList(),
                            LastRecommendationDate = DateTime.Now,
                            ShowNSFW = settings.ShowNSFW,
                        };

                        RecommendationAnimes = recommendationAnimesCache;
                        HasRecommendations   = RecommendationAnimes.Recommendations.Count() != 0;
                        recommendationAnimesCollection.Upsert(0, recommendationAnimesCache);
                    }

                    else if (DateTime.Now.Subtract(recommendationsCache.LastRecommendationDate).TotalHours < 1)
                    {
                        LoadRecommendationFromCache(settings, recommendationAnimesCollection, recommendationsCache);
                    }
                }, _cancellationTokenSource.Token);

                await Task.WhenAny(loadRecommendationsTask, loadTodayAnimesTask);
            }
            catch (JikanDotNet.Exceptions.JikanRequestException ex)
            {
                ex.SaveExceptionData();
            }
            catch (OperationCanceledException ex)
            { }
            catch (ObjectDisposedException ex)
            { }
            catch (Exception ex)
            {
                ex.SaveExceptionData();
            }
            finally
            {
                IsLoadingTodayAnimes = false;
            }
        }