From f4dff9b4c1bd09b536b9e2e3b2c638a2c973c0de Mon Sep 17 00:00:00 2001 From: SoulGateKey Date: Mon, 11 Nov 2024 21:16:19 +0800 Subject: [PATCH] fix: mai2 photos cant be merged --- titles/mai2/frontend.py | 130 ++++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/titles/mai2/frontend.py b/titles/mai2/frontend.py index b39a37e..9667eca 100644 --- a/titles/mai2/frontend.py +++ b/titles/mai2/frontend.py @@ -55,7 +55,7 @@ class Mai2Frontend(FE_Base): usr_sesh = self.validate_session(request) if not usr_sesh: usr_sesh = UserSession() - + incoming_ver = usr_sesh.maimai_version if usr_sesh.user_id > 0: @@ -103,10 +103,10 @@ class Mai2Frontend(FE_Base): if not path_index or int(path_index) < 1: index = 0 else: - index = int(path_index) - 1 # 0 and 1 are 1st page + index = int(path_index) - 1 # 0 and 1 are 1st page user_id = usr_sesh.user_id playlog_count = await self.data.score.get_user_playlogs_count(user_id) - if playlog_count < index * 20 : + if playlog_count < index * 20: return Response(template.render( title=f"{self.core_config.server.name} | {self.nav_name}", game_list=self.environment.globals["game_list"], @@ -116,17 +116,17 @@ class Mai2Frontend(FE_Base): playlog = await self.data.score.get_playlogs(user_id, index, 20) playlog_with_title = [] for record in playlog: - music_chart = await self.data.static.get_music_chart(usr_sesh.maimai_version, record.musicId, record.level) + music_chart = await self.data.static.get_music_chart(usr_sesh.maimai_version, record.musicId, record.level) if music_chart: - difficultyNum=music_chart.chartId - difficulty=music_chart.difficulty - artist=music_chart.artist - title=music_chart.title + difficultyNum = music_chart.chartId + difficulty = music_chart.difficulty + artist = music_chart.artist + title = music_chart.title else: - difficultyNum=0 - difficulty=0 - artist="unknown" - title="musicid: " + str(record.musicId) + difficultyNum = 0 + difficulty = 0 + artist = "unknown" + title = "musicid: " + str(record.musicId) playlog_with_title.append({ "raw": record, "title": title, @@ -156,29 +156,29 @@ class Mai2Frontend(FE_Base): if usr_sesh.user_id > 0: if usr_sesh.maimai_version < 0: return RedirectResponse("/game/mai2/", 303) - + photos = await self.data.profile.get_user_photos_by_user(usr_sesh.user_id) photos_fixed = [] for photo in photos: if datetime.now().timestamp() > (photo['when_upload'] + timedelta(days=7)).timestamp(): await self.data.profile.delete_user_photo_by_id(photo['id']) - + if path.exists(f"{self.game_cfg.uploads.photos_dir}/{photo['id']}.jpeg"): remove(f"{self.game_cfg.uploads.photos_dir}/{photo['id']}.jpeg") if path.exists(f"{self.game_cfg.uploads.photos_dir}/{photo['id']}"): shutil.rmtree(f"{self.game_cfg.uploads.photos_dir}/{photo['id']}") - + continue - + photos_fixed.append({ "id": photo['id'], "playlog_num": photo['playlog_num'], "track_num": photo['track_num'], "when_upload": photo['when_upload'], }) - + return Response(template.render( title=f"{self.core_config.server.name} | {self.nav_name}", game_list=self.environment.globals["game_list"], @@ -195,7 +195,7 @@ class Mai2Frontend(FE_Base): return RedirectResponse("/gate/", 303) form_data = await request.form() - new_name: str = form_data.get("new_name") + new_name: str = form_data.get("new_name") new_name_full = "" if not new_name: @@ -204,7 +204,7 @@ class Mai2Frontend(FE_Base): if len(new_name) > 8: return RedirectResponse("/gate/?e=8", 303) - for x in new_name: # FIXME: This will let some invalid characters through atm + for x in new_name: # FIXME: This will let some invalid characters through atm o = ord(x) try: if o == 0x20: @@ -235,13 +235,13 @@ class Mai2Frontend(FE_Base): resp = RedirectResponse("/game/mai2/events/", 303) else: resp = RedirectResponse("/game/mai2/", 303) - + if usr_sesh.user_id > 0: form_data = await request.form() maimai_version = form_data.get("version") self.logger.info(f"version change to: {maimai_version}") - if(maimai_version.isdigit()): - usr_sesh.maimai_version=int(maimai_version) + if (maimai_version.isdigit()): + usr_sesh.maimai_version = int(maimai_version) encoded_sesh = self.encode_session(usr_sesh) self.logger.debug(f"Created session with JWT {encoded_sesh}") resp.set_cookie("ARTEMIS_SESH", encoded_sesh) @@ -253,20 +253,20 @@ class Mai2Frontend(FE_Base): usr_sesh = self.validate_session(request) if not usr_sesh: return RedirectResponse("/gate/", 303) - + if not self.test_perm(usr_sesh.permissions, PermissionOffset.SYSADMIN): return RedirectResponse("/game/mai2/", 303) - + template = self.environment.get_template( "titles/mai2/templates/events/mai2_events.jinja" ) - + incoming_ver = usr_sesh.maimai_version evts = [] - + if incoming_ver < 0: usr_sesh.maimai_version = Mai2Constants.VER_MAIMAI_DX - + event_list = await self.data.static.get_game_events(usr_sesh.maimai_version) self.logger.info(f"Get events for v{usr_sesh.maimai_version}") @@ -280,88 +280,88 @@ class Mai2Frontend(FE_Base): "startDate": event['startDate'].strftime("%x %X"), "enabled": "true" if event['enabled'] else "false", }) - + resp = Response(template.render( - title=f"{self.core_config.server.name} | {self.nav_name} Events", - game_list=self.environment.globals["game_list"], - sesh=vars(usr_sesh), - version_list=Mai2Constants.VERSION_STRING, - events=evts - ), media_type="text/html; charset=utf-8") - + title=f"{self.core_config.server.name} | {self.nav_name} Events", + game_list=self.environment.globals["game_list"], + sesh=vars(usr_sesh), + version_list=Mai2Constants.VERSION_STRING, + events=evts + ), media_type="text/html; charset=utf-8") + if incoming_ver < 0: encoded_sesh = self.encode_session(usr_sesh) resp.delete_cookie("ARTEMIS_SESH") resp.set_cookie("ARTEMIS_SESH", encoded_sesh) - + return resp async def render_event_edit(self, request: Request) -> Response: usr_sesh = self.validate_session(request) if not usr_sesh: return RedirectResponse("/gate/", 303) - + if not self.test_perm(usr_sesh.permissions, PermissionOffset.SYSADMIN): return RedirectResponse("/game/mai2/", 303) - + template = self.environment.get_template( "titles/mai2/templates/events/mai2_event_edit.jinja" ) - + evt_id = request.path_params.get("event_id") - + event_id = await self.data.static.get_event_by_id(evt_id) if not event_id: return RedirectResponse("/game/mai2/events/", 303) - + return Response(template.render( - title=f"{self.core_config.server.name} | {self.nav_name} Edit Event {evt_id}", - game_list=self.environment.globals["game_list"], - sesh=vars(usr_sesh), - user_id=usr_sesh.user_id, - version_list=Mai2Constants.VERSION_STRING, - cur_version=usr_sesh.maimai_version, - event=event_id._asdict() - ), media_type="text/html; charset=utf-8") + title=f"{self.core_config.server.name} | {self.nav_name} Edit Event {evt_id}", + game_list=self.environment.globals["game_list"], + sesh=vars(usr_sesh), + user_id=usr_sesh.user_id, + version_list=Mai2Constants.VERSION_STRING, + cur_version=usr_sesh.maimai_version, + event=event_id._asdict() + ), media_type="text/html; charset=utf-8") async def update_event(self, request: Request) -> RedirectResponse: usr_sesh = self.validate_session(request) if not usr_sesh: return RedirectResponse("/gate/", 303) - + if not self.test_perm(usr_sesh.permissions, PermissionOffset.SYSADMIN): return RedirectResponse("/game/mai2/", 303) - + form_data = await request.form() print(form_data) event_id: int = form_data.get("evtId", None) - new_enabled: bool = bool(form_data.get("evtEnabled", False)) + new_enabled: bool = bool(form_data.get("evtEnabled", False)) try: new_start_date: datetime = datetime.strptime(form_data.get("evtStart", None), "%Y-%m-%dT%H:%M:%S") except: new_start_date = None - + print(f"{event_id} {new_enabled} {new_start_date}") if event_id is None or new_start_date is None: return RedirectResponse("/game/mai2/events/?e=4", 303) await self.data.static.update_event_by_id(int(event_id), new_enabled, new_start_date) - + return RedirectResponse("/game/mai2/events/?s=1", 303) async def get_photo(self, request: Request) -> RedirectResponse: usr_sesh = self.validate_session(request) if not usr_sesh: return RedirectResponse("/gate/", 303) - + photo_jpeg = request.path_params.get("photo_id", None) if not photo_jpeg: return Response(status_code=400) - + matcher = re.match(r"^([0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}).jpeg$", photo_jpeg) if not matcher: return Response(status_code=400) - + photo_id = matcher.groups()[0] photo_info = await self.data.profile.get_user_photo_by_id(photo_id) if not photo_info: @@ -379,18 +379,18 @@ class Mai2Frontend(FE_Base): if path.exists(f"{out_folder}"): shutil.rmtree(out_folder) - + return Response(status_code=404) if path.exists(f"{out_folder}"): self.logger.info(f"Photo Path Exist.") max_idx = 0 p = ImageFile.Parser() - for _, _, files in walk("out_folder"): + for _, _, files in walk(f"{out_folder}"): if not files: break - matcher = re.match("^(\d+)_(\d+)$", files[0]) + matcher = re.match(r"^(\d+)_(\d+)\.bin$", files[0]) if not matcher: break @@ -400,18 +400,18 @@ class Mai2Frontend(FE_Base): self.logger.error(f"Expected {max_idx + 1} files, found {len(files)}") max_idx = 0 break - + if max_idx == 0: return Response(status_code=500) - + for i in range(max_idx + 1): - with open(f"{out_folder}/{i}_{max_idx}", "rb") as f: + with open(f"{out_folder}/{i}_{max_idx}.bin", "rb") as f: p.feed(f.read()) try: im = p.close() im.save(f"{out_folder}.jpeg") self.logger.info(f"{out_folder}.jpeg generated.") - + except Exception as e: self.logger.error(f"{photo_id} failed PIL validation! - {e}") @@ -420,5 +420,5 @@ class Mai2Frontend(FE_Base): if path.exists(f"{out_folder}.jpeg"): self.logger.info(f"{out_folder}.jpeg exists") return FileResponse(f"{out_folder}.jpeg") - + return Response(status_code=404)