Files
tjaf/tjaf.py
2023-11-09 16:59:05 +09:00

115 lines
3.7 KiB
Python

import pathlib
import re
class ValueWrapper():
def __init__(self, value):
self.value = value
def as_str(self):
return str(self.value)
def as_file_ext(self):
path_str = self.as_str()
path = pathlib.Path(path_str)
return path.suffix.split(".",1)[1]
def as_simple_str(self):
raw = self.as_str()
no_comment = raw.split("//",1)[0]
return no_comment.strip()
def as_int(self):
return int(self.as_simple_str() or 0)
def as_float(self):
return float(self.as_simple_str() or 0)
def __str__(self):
return f"VW({self.as_simple_str()})"
def __repr__(self):
return f"ValueWrapper({self.as_str()})"
class Tja():
def __init__(self, text):
self.text = text
self.common_headers = {}
self.headers = [{},{},{},{},{},{},{}]
self.humen_list = [[],[],[],[],[],[],[]]
current_level = 3
for line in text.splitlines():
if re.match("^[a-zA-Z0-9]+:",line):
key,value = line.split(":",1)
if key not in ["COURSE","LEVEL","BALLOON","BALLOONNOR","BALLOONEXP","BALLOONMAS","SCOREINIT","SCOREDIFF","EXAM2"]:
header = (key,ValueWrapper(value))
self.common_headers.update([header])
else:
if key == "COURSE":
levels = ["easy","normal","hard","oni","edit","tower","dan"]
if value.lower() in levels:
current_level = levels.index(value.lower())
elif value.isdigit():
current_level = ValueWrapper(value).as_int()
header = (key,ValueWrapper(value))
self.headers[current_level].update([header])
elif line:
self.humen_list[current_level].append(line)
def has_branch(self, level):
return any(h.split(" ",1)[0] == "#BRANCHSTART" for h in self.humen_list[level])
def has_lyrics(self):
return any(h.split(" ",1)[0] == "#LYRIC" for h in sum(self.humen_list[:5],[]))
def to_mongo(self, song_id, order):
title = self.common_headers["TITLE"].as_str()
subtitle = None
if "SUBTITLE" in self.common_headers:
subtitle = self.common_headers["SUBTITLE"].as_str()
if subtitle.startswith("--"):
subtitle = subtitle.split("--",1)[1]
level_names = ["easy","normal","hard","oni","ura"]
preview = None
if "DEMOSTART" in self.common_headers:
preview = self.common_headers["DEMOSTART"].as_float()
return {
"title_lang": {
"ja": title,
"en": None,
"cn": None,
"tw": None,
"ko": None
},
"subtitle_lang": {
"ja": subtitle,
"en": None,
"cn": None,
"tw": None,
"ko": None
},
"courses": {
level_names[level]: {
"stars": self.headers[level]["LEVEL"].as_int(),
"branch": self.has_branch(level)
} if self.humen_list[level] != [] else None for level in range(5)
},
"enabled": True,
"title": title,
"subtitle": subtitle,
"category_id": None,
"type": "tja",
"music_type": self.common_headers["WAVE"].as_file_ext(),
"offset": -0.01,
"skin_id": None,
"preview": preview,
"volume": 1,
"maker_id": None,
"lyrics": self.has_lyrics(),
"hash": "",
"id": song_id,
"order": order
}