57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
import os
|
|
|
|
from common import generalUtils
|
|
from common.log import logUtils as log
|
|
from constants import exceptions
|
|
from helpers import osuapiHelper
|
|
|
|
def isBeatmap(fileName=None, content=None):
|
|
if fileName is not None:
|
|
with open(fileName, "rb") as f:
|
|
firstLine = f.readline().decode("utf-8-sig").strip()
|
|
elif content is not None:
|
|
try:
|
|
firstLine = content.decode("utf-8-sig").split("\n")[0].strip()
|
|
except IndexError:
|
|
return False
|
|
else:
|
|
raise ValueError("Either `fileName` or `content` must be provided.")
|
|
return firstLine.lower().startswith("osu file format v")
|
|
|
|
def cacheMap(mapFile, _beatmap):
|
|
# Check if we have to download the .osu file
|
|
download = False
|
|
if not os.path.isfile(mapFile):
|
|
# .osu file doesn't exist. We must download it
|
|
download = True
|
|
else:
|
|
# File exists, check md5
|
|
if generalUtils.fileMd5(mapFile) != _beatmap.fileMD5 or not isBeatmap(mapFile):
|
|
# MD5 don't match, redownload .osu file
|
|
download = True
|
|
|
|
# Download .osu file if needed
|
|
if download:
|
|
log.debug("maps ~> Downloading {} osu file".format(_beatmap.beatmapID))
|
|
|
|
# Get .osu file from osu servers
|
|
fileContent = osuapiHelper.getOsuFileFromID(_beatmap.beatmapID)
|
|
|
|
# Make sure osu servers returned something
|
|
if fileContent is None or not isBeatmap(content=fileContent):
|
|
raise exceptions.osuApiFailException("maps")
|
|
|
|
# Delete old .osu file if it exists
|
|
if os.path.isfile(mapFile):
|
|
os.remove(mapFile)
|
|
|
|
# Save .osu file
|
|
with open(mapFile, "wb+") as f:
|
|
f.write(fileContent)
|
|
else:
|
|
# Map file is already in folder
|
|
log.debug("maps ~> Beatmap found in cache!")
|
|
|
|
def cachedMapPath(beatmap_id):
|
|
return ".data/beatmaps/{}.osu".format(beatmap_id)
|