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; } }
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); } }
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; } }
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); }