private void ConsumerTask()
        {
            try
            {
                while (true)
                {
                    string fileFullPath;
                    if (_filesChanged.TryDequeue(out fileFullPath))
                    {
                        Beatmap beatmap = null;
                        _settings.Add(_names.LoadingRawBeatmaps.Name, true);
                        Interlocked.Increment(ref _numberOfBeatmapsCurrentlyBeingLoaded);
                        _logger.Log("Processing new beatmap", LogLevel.Debug);
                        beatmap = BeatmapHelpers.ReadBeatmap(fileFullPath);

                        _sqlite.StoreTempBeatmap(beatmap);
                        _logger.Log("Added new Temporary beatmap {0} - {1} [{2}]", LogLevel.Debug, beatmap.ArtistRoman,
                                    beatmap.TitleRoman, beatmap.DiffName);
                        if (Interlocked.Decrement(ref _numberOfBeatmapsCurrentlyBeingLoaded) == 0)
                        {
                            _settings.Add(_names.LoadingRawBeatmaps.Name, false);
                        }
                    }
                    Thread.Sleep(5);
                }
            }
            catch (ThreadAbortException ex)
            {
                return;
            }
        }
Exemple #2
0
        private async Task ConsumerTask(CancellationToken token)
        {
            while (true)
            {
                //Forcefully queue removal of cache entries
                //TODO: more than anything this is a hack, needs proper debounce logic instead of using memorycache.
                memoryCache.Trim(100);

                if (token.IsCancellationRequested)
                {
                    return;
                }
                if (filesChanged.TryDequeue(out var fsArgs))
                {
                    _settings.Add(_names.LoadingRawBeatmaps.Name, true);
                    Interlocked.Increment(ref _numberOfBeatmapsCurrentlyBeingLoaded);
                    _logger.Log($">Processing beatmap located at {fsArgs.FullPath}", LogLevel.Debug);

                    var beatmap = await BeatmapHelpers.ReadBeatmap(fsArgs.FullPath);

                    _databaseController.StoreTempBeatmap(beatmap);

                    _logger.Log(">Added new Temporary beatmap {0} - {1} [{2}]", LogLevel.Information, beatmap.ArtistRoman,
                                beatmap.TitleRoman, beatmap.DiffName);
                    if (Interlocked.Decrement(ref _numberOfBeatmapsCurrentlyBeingLoaded) == 0)
                    {
                        _settings.Add(_names.LoadingRawBeatmaps.Name, false);
                    }

                    if (lastMapSearchArgs != null &&
                        (
                            (lastMapSearchArgs.Artist == beatmap.Artist &&
                             lastMapSearchArgs.Title == beatmap.Title &&
                             lastMapSearchArgs.Diff == beatmap.DiffName
                            ) || lastMapSearchArgs.MapId == beatmap.MapId
                        ))
                    {
                        NewOsuEvent?.Invoke(this, new MapSearchArgs($"OsuMemory-FolderWatcherReplay", OsuEventType.MapChange)
                        {
                            Artist    = beatmap.Artist,
                            MapHash   = beatmap.Md5,
                            Title     = beatmap.Title,
                            Diff      = beatmap.DiffName,
                            EventType = OsuEventType.MapChange,
                            PlayMode  = beatmap.PlayMode,
                            Status    = lastMapSearchArgs.Status,
                            MapId     = beatmap.MapId > 0 ? beatmap.MapId : -123
                        });
                    }
                }
                Thread.Sleep(5);
            }
        }
Exemple #3
0
        private void ConsumerTask()
        {
            try
            {
                while (true)
                {
                    memoryCache.Get("dummy");
                    if (filesChanged.TryDequeue(out var fsArgs))
                    {
                        _settings.Add(_names.LoadingRawBeatmaps.Name, true);
                        Interlocked.Increment(ref _numberOfBeatmapsCurrentlyBeingLoaded);
                        _logger.Log($">Processing beatmap located at {fsArgs.FullPath}", LogLevel.Debug);

                        var beatmap = BeatmapHelpers.ReadBeatmap(fsArgs.FullPath);

                        _databaseController.StoreTempBeatmap(beatmap);

                        _logger.Log(">Added new Temporary beatmap {0} - {1} [{2}]", LogLevel.Information, beatmap.ArtistRoman,
                                    beatmap.TitleRoman, beatmap.DiffName);
                        if (Interlocked.Decrement(ref _numberOfBeatmapsCurrentlyBeingLoaded) == 0)
                        {
                            _settings.Add(_names.LoadingRawBeatmaps.Name, false);
                        }

                        if (fsArgs.ChangeType == WatcherChangeTypes.Changed && lastMapSearchArgs != null &&
                            (
                                (lastMapSearchArgs.Artist == beatmap.Artist &&
                                 lastMapSearchArgs.Title == beatmap.Title &&
                                 lastMapSearchArgs.Diff == beatmap.DiffName
                                ) || lastMapSearchArgs.MapId == beatmap.MapId
                            ))
                        {
                            NewOsuEvent?.Invoke(this, new MapSearchArgs($"OsuMemory-FolderWatcherReplay", OsuEventType.MapChange)
                            {
                                Artist    = beatmap.Artist,
                                MapHash   = beatmap.Md5,
                                Title     = beatmap.Title,
                                Diff      = beatmap.DiffName,
                                EventType = OsuEventType.MapChange,
                                PlayMode  = beatmap.PlayMode,
                                Status    = lastMapSearchArgs.Status,
                                MapId     = beatmap.MapId > 0 ? beatmap.MapId : -123
                            });
                        }
                    }
                    Thread.Sleep(5);
                }
            }
            catch (ThreadAbortException)
            {
            }
        }
        private void ConsumerTask()
        {
            try
            {
                while (true)
                {
                    if (_filesChanged.TryDequeue(out var fsArgs))
                    {
                        Beatmap beatmap = null;
                        _settings.Add(_names.LoadingRawBeatmaps.Name, true);
                        Interlocked.Increment(ref _numberOfBeatmapsCurrentlyBeingLoaded);
                        _logger.Log("Processing new beatmap", LogLevel.Debug);
                        beatmap = BeatmapHelpers.ReadBeatmap(fsArgs.FullPath);

                        _sqliteControler.StoreTempBeatmap(beatmap);

                        _logger.Log("Added new Temporary beatmap {0} - {1} [{2}]", LogLevel.Debug, beatmap.ArtistRoman,
                                    beatmap.TitleRoman, beatmap.DiffName);
                        if (Interlocked.Decrement(ref _numberOfBeatmapsCurrentlyBeingLoaded) == 0)
                        {
                            _settings.Add(_names.LoadingRawBeatmaps.Name, false);
                        }

                        if (fsArgs.ChangeType == WatcherChangeTypes.Changed && lastMapSearchArgs != null)
                        {
                            var l = lastMapSearchArgs;
                            NewOsuEvent?.Invoke(this, new MapSearchArgs($"OsuMemory-FolderWatcherReplay")
                            {
                                Artist    = beatmap.Artist,
                                MapHash   = beatmap.Md5,
                                Title     = beatmap.Title,
                                Diff      = beatmap.DiffName,
                                EventType = OsuEventType.MapChange,
                                PlayMode  = beatmap.PlayMode,
                                Status    = l.Status,
                                MapId     = -123//bogus id to force string search
                            });
                        }
                    }
                    Thread.Sleep(5);
                }
            }
            catch (ThreadAbortException)
            {
                return;
            }
        }
Exemple #5
0
        public Beatmap ReadBeatmapData(string fullFileDir)
        {
            var map           = new Beatmap();
            var directoryInfo = new DirectoryInfo(fullFileDir).Parent;

            map.Dir         = directoryInfo?.Name ?? "";
            map.OsuFileName = Path.GetFileName(fullFileDir);

            var filename = Path.GetFileNameWithoutExtension(map.OsuFileName);

            if (!filename.EndsWith("]"))
            {
                var idx = filename.LastIndexOf("]", StringComparison.InvariantCulture);
                try
                {
                    filename = filename.Remove(idx + 1);
                }
                catch (ArgumentOutOfRangeException e)
                {
                    //TODO: create unit test for this function to figure out why does this still break from time to time
                }
            }
            map.DiffName = BeatmapHelpers.GetDiffFromString(filename);

            List <string> lines = new List <string>();

            Thread.Sleep(50);
            FileInfo fileInfo = new FileInfo(fullFileDir);

            while (BeatmapHelpers.FileIsLocked(fileInfo))
            {
                Thread.Sleep(1);
            }
            int tryCount = 0;

            do
            {
                try
                {
                    tryCount++;
                    using (var stream = File.OpenRead(fullFileDir))
                    {
                        using (var fileHandle = new StreamReader(stream, true))
                        {
                            while (!fileHandle.EndOfStream)
                            {
                                lines.Add(fileHandle.ReadLine());
                            }
                        }
                    }
                    using (var md5 = System.Security.Cryptography.MD5.Create())
                    {
                        using (var stream = File.OpenRead(fullFileDir))
                        {
                            map.Md5 = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
                        }
                    }
                    tryCount = 5;
                }
                catch (IOException e)
                {
                    if (tryCount < 2)
                    {
                        Thread.Sleep(1000);
                    }
                }
            } while (tryCount < 2);
            if (tryCount != 5)
            {
                return(map);
            }



            if (string.IsNullOrEmpty(map.TitleUnicode))
            {
                map.TitleUnicode = map.TitleRoman;
            }
            if (string.IsNullOrEmpty(map.ArtistUnicode))
            {
                map.ArtistUnicode = map.ArtistRoman;
            }
            map.EditDate   = DateTime.Now;
            map.LastPlayed = DateTime.MinValue;
            map.LastSync   = DateTime.Now;

            ParseLines(lines, map);


            return(map);
        }