public async Task <Beatmap> GetBeatmapFromId(string beatmap_id, bool forceRedl = false)
        {
            string file = Path.Combine(folder, "beatmaps", $"{beatmap_id}.osu");

            if (forceRedl)
            {
                File.Delete(file);
            }
            if (!File.Exists(file))
            {
                await Logger.WriteLine(forceRedl? "hash out of date, redownloading..." : "beatmap not found, downloading...");

                await api.DownloadBeatmapFromId(beatmap_id, Path.Combine(folder, "beatmaps"), forceRedl);

                string hash = Beatmap.MD5FromFile(file);
                hashes[hash] = beatmap_id;
                Logger.LogAbsolute(Logging.BeatmapsDbSize, hashes.Count);
                Logger.Log(Logging.BeatmapsCacheMiss);
            }
            else
            {
                Logger.Log(Logging.BeatmapsCacheHit);
            }
            return(new Beatmap(file));
        }
        public async Task <Beatmap> GetBeatmapFromId(string beatmap_id)
        {
            string file = Path.Combine(folder, "beatmaps", $"{beatmap_id}.osu");

            if (!File.Exists(file))
            {
                await Logger.WriteLine("beatmap not found, downloading...");

                await api.DownloadBeatmapFromId(beatmap_id, Path.Combine(folder, "beatmaps"));

                hashes[Beatmap.MD5FromFile(file)] = beatmap_id;
                Logger.LogAbsolute(Logging.BeatmapsDbSize, hashes.Count);
                Logger.Log(Logging.BeatmapsCacheMiss);
            }
            else
            {
                Logger.Log(Logging.BeatmapsCacheHit);
            }
            return(new Beatmap(file));
        }