From 6ad11fc6c0ea5e4af8e0d3a5e528e0d2cba28947 Mon Sep 17 00:00:00 2001 From: mike Date: Sun, 28 Jun 2026 02:29:31 +0200 Subject: [PATCH] reorder --- tour-comfy/car.html | 71 +++++++++++++++++++++++++++++-------- tour-comfy/edit_api.py | 79 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 122 insertions(+), 28 deletions(-) diff --git a/tour-comfy/car.html b/tour-comfy/car.html index 3d9b667..3b99cfb 100644 --- a/tour-comfy/car.html +++ b/tour-comfy/car.html @@ -2227,6 +2227,63 @@ // --- HYDRATION_START --- const PRELOADED_IMAGES = [ + "20260628_020853_pad_20260628_015651_img_12.nobg.png", + "20260628_020642_pad_20260628_015651_img_12.nobg.png", + "20260628_020610_pad_20260628_015651_img_12.nobg.png", + "20260628_020546_pad_20260628_015651_img_12.nobg.png", + "20260628_020519_pad_20260628_015651_img_12.nobg.png", + "20260628_020428_pad_20260628_015651_img_12.nobg.png", + "20260628_020302_pad_20260628_015651_img_12.nobg.png", + "20260628_020125_pad_20260628_015651_img_12.nobg.png", + "20260628_015815_pad_20260628_015651_img_12.nobg.png", + "20260628_015832_pad_20260628_015651_img_12.png", + "20260628_015815_pad_20260628_015651_img_12.png", + "20260628_015707_img_12.png", + "20260628_015651_img_12.png", + "20260615_153426_img_12.png", + "20260628_015423_img_12.png", + "cg_5991f3f2_face.png", + "20260628_012806_pad_20260624_143523_Screenshot_From_2026-06-17_07-41-27.nobg.nobg.png", + "20260628_014614_p10.nobg.png", + "p10.png_face.png", + "20260628_014614_p10.png", + "20260628_014603_p10.png", + "up_2687be75_face.png", + "20260628_013521_pad_20260627_213816_best_01_person_0.874_2026-06-27_12-18-49.nobg.png", + "20260628_013511_pad_20260627_213816_best_01_person_0.874_2026-06-27_12-18-49.nobg.png", + "20260628_013459_pad_20260627_213816_best_01_person_0.874_2026-06-27_12-18-49.nobg.png", + "20260628_013429_pad_20260627_213816_best_01_person_0.874_2026-06-27_12-18-49.nobg.png", + "20260628_013429_pad_20260627_213816_best_01_person_0.874_2026-06-27_12-18-49.png", + "20260628_013412_pad_20260627_213816_best_01_person_0.874_2026-06-27_12-18-49.png", + "20260628_012832_pad_20260624_143523_Screenshot_From_2026-06-17_07-41-27.nobg.nobg.png", + "_turntable/cg_5991f3f2/views/view_022_330deg.png", + "20260628_011700_pad_20260624_154318_img_72.png", + "20260628_012006_pad_20260624_154318_img_72.png", + "20260628_011837_pad_20260624_154318_img_72.png", + "20260628_012240_crop_20260628_011837_pad_20260624_154318_img_72.png", + "20260628_011227_dup_Pasted image (9).png", + "20260628_011118_pad_20260628_010755_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.nobg.png", + "20260628_010957_pad_20260628_010755_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.nobg.png", + "20260628_010947_pad_20260628_010755_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.nobg.png", + "20260628_010858_pad_20260628_010755_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.nobg.png", + "20260628_010858_pad_20260628_010755_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.png", + "20260628_010841_pad_20260628_010755_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.png", + "20260628_010755_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.png", + "20260628_010630_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.png", + "20260628_010408_image.png", + "20260627_203626_image.png", + "up_7b6eaabb_face.png", + "cg_809653a0_face.png", + "bb_01.png_face.png", + "_turntable/up_aa1add4d/views/view_023_345deg.png", + "_turntable/up_aa1add4d/views/view_003_045deg.png", + "_turntable/up_aa1add4d/views/view_001_015deg.png", + "_turntable/up_7b6eaabb/views/view_001_015deg.png", + "_turntable/up_7b6eaabb/views/view_000_000deg.png", + "_turntable/up_6ed4293c/views/view_023_345deg.png", + "_turntable/up_6ed4293c/views/view_022_330deg.png", + "_turntable/up_6ed4293c/views/view_021_315deg.png", + "_turntable/up_6ed4293c/views/view_020_300deg.png", "_turntable/up_6ed4293c/views/view_019_285deg.png", "_turntable/up_6ed4293c/views/view_018_270deg.png", "_turntable/up_6ed4293c/views/view_017_255deg.png", @@ -2285,9 +2342,6 @@ "_turntable/cg_7c7b22c9/views/view_022_330deg.png", "20260618_015124_20260618_010617_20260615_153426_img_12.nobg.png", "_turntable/cg_5991f3f2/views/view_002_030deg.png", - "_turntable/cg_5991f3f2/views/view_022_330deg.png", - "_turntable/up_6ed4293c/views/view_021_315deg.png", - "_turntable/up_6ed4293c/views/view_020_300deg.png", "20260627_213910_best_02_person_0.874_2026-06-27_12-18-49.png", "20260627_213840_best_02_person_0.874_2026-06-27_12-18-49.png", "20260627_213816_best_01_person_0.874_2026-06-27_12-18-49.png", @@ -2368,10 +2422,8 @@ "_turntable/cg_75340e8e/views/view_001_015deg.png", "_turntable/cg_75340e8e/views/view_000_000deg.png", "20260627_203706_11_20260627_200330_image.png", - "up_7b6eaabb_face.png", "20260627_203654_11_20260627_200330_image.png", "20260627_203642_11_20260627_200330_image.png", - "20260627_203626_image.png", "20260627_203607_image.png", "20260627_203549_image.png", "20260627_203531_Screenshot_From_2026-06-27_20-04-11.png", @@ -2416,7 +2468,6 @@ "_turntable/up_c8be3aa7/views/view_004_060deg.png", "_turntable/up_c8be3aa7/views/view_001_015deg.png", "20260627_200711_11_20260627_200330_image.png", - "20260627_200632_9_20260627_200330_image.png", "20260627_200506_image.png", "20260627_200422_2_20260627_200330_image.png", "20260627_200414_image.png", @@ -2447,7 +2498,6 @@ "_turntable/img_87.png/views/view_017_255deg.png", "_turntable/img_87.png/views/view_016_240deg.png", "_turntable/img_87.png/views/view_015_225deg.png", - "_turntable/up_aa1add4d/views/view_023_345deg.png", "_turntable/up_aa1add4d/views/view_022_330deg.png", "_turntable/up_aa1add4d/views/view_021_315deg.png", "_turntable/up_aa1add4d/views/view_020_300deg.png", @@ -2467,9 +2517,7 @@ "_turntable/up_aa1add4d/views/view_006_090deg.png", "_turntable/up_aa1add4d/views/view_005_075deg.png", "_turntable/up_aa1add4d/views/view_004_060deg.png", - "_turntable/up_aa1add4d/views/view_003_045deg.png", "_turntable/up_aa1add4d/views/view_002_030deg.png", - "_turntable/up_aa1add4d/views/view_001_015deg.png", "_turntable/up_aa1add4d/views/view_000_000deg.png", "_turntable/up_ae825fce/views/view_023_345deg.png", "_turntable/up_ae825fce/views/view_022_330deg.png", @@ -4335,7 +4383,6 @@ "_turntable/cg_f0049873/views/view_002_030deg.png", "_turntable/cg_f0049873/views/view_001_015deg.png", "_turntable/cg_f0049873/views/view_000_000deg.png", - "_turntable/cg_08203e88/turntable.mp4", "_turntable/cg_08203e88/views/view_023_345deg.png", "_turntable/cg_08203e88/views/view_022_330deg.png", "_turntable/cg_08203e88/views/view_021_315deg.png", @@ -4633,7 +4680,6 @@ "20260626_021942_pad_20260625_205913_8_20260625_205722_image.png", "20260626_021533_pad_20260625_205828_4_20260625_205722_image.png", "20260626_014422_pad_20260626_005644_dup_20260626_005504_Pasted image (9).nobg.png", - "cg_809653a0_face.png", "20260626_005644_dup_20260626_005504_Pasted image (9).nobg.png", "20260626_005504_Pasted image (9).nobg.png", "20260626_005504_Pasted image (9).png", @@ -5002,7 +5048,6 @@ "20260624_154453_img_72.png", "20260624_154442_img_72.png", "20260624_154318_img_72.png", - "cg_b7e71d34_face.png", "20260624_154236_img_72.png", "20260624_154125_img_72.png", "20260624_153940_img_72.png", @@ -5010,7 +5055,6 @@ "20260624_153614_Screenshot_From_2026-06-17_07-41-27.png", "20260624_153417_Screenshot_From_2026-06-17_07-41-27.png", "20260624_153344_Screenshot_From_2026-06-17_07-41-27.png", - "20260624_153311_Screenshot_From_2026-06-17_07-41-27.png", "20260624_153102_Screenshot_From_2026-06-17_07-41-27.png", "20260624_153051_Screenshot_From_2026-06-17_07-41-27.png", "20260624_153040_Screenshot_From_2026-06-17_07-41-27.png", @@ -6623,7 +6667,6 @@ "20260616_004250_img_18.png", "20260616_003916_img_15.png", "20260616_003803_img_14.png", - "20260615_153426_img_12.png", "20260615_152252_imgxxx.png", "20260615_151829_img_92.png", "20260615_151614_img_93.png", diff --git a/tour-comfy/edit_api.py b/tour-comfy/edit_api.py index 649ef5c..d03afaa 100644 --- a/tour-comfy/edit_api.py +++ b/tour-comfy/edit_api.py @@ -307,6 +307,8 @@ def _idle_turntable_daemon(): fname, group_id, sort_order = row[0], row[2], row[6] if not group_id: continue + if fname.startswith("_turntable/"): + continue if group_id not in groups: groups[group_id] = (fname, sort_order) else: @@ -1378,24 +1380,73 @@ def _write_turntable_static() -> None: except Exception: group_names = {} - # Preferred filename per group (sort_order=0) - preferred: dict = {} + # Fetch active and existing group IDs and filenames from the database (excluding turntable assets) + all_db_gids = set() + active_db_gids = set() + all_db_filenames = set() + active_db_filenames = set() try: - for row in database.list_persons(): - fname, gid, sort_order = row[0], row[2], row[6] - if not gid: - continue - if gid not in preferred: - preferred[gid] = (fname, sort_order) - else: - cur = preferred[gid][1] - if sort_order is not None and (cur is None or sort_order < cur): - preferred[gid] = (fname, sort_order) - except Exception: - pass + conn = database.get_db_connection() + cur = conn.cursor() + cur.execute(""" + SELECT filename, group_id, archived, hidden + FROM person + WHERE NOT (filename LIKE '_turntable/%') + """) + for fname, gid, archived, hidden in cur.fetchall(): + is_archived = bool(archived) if archived is not None else False + is_hidden = bool(hidden) if hidden is not None else False + + all_db_filenames.add(fname) + if not is_archived and not is_hidden: + active_db_filenames.add(fname) + + if gid: + all_db_gids.add(gid) + if not is_archived and not is_hidden: + active_db_gids.add(gid) + cur.close() + database._put_db_connection(conn) + except Exception as db_err: + print(f"[static] DB check error: {db_err}") turntables = [] for gid in tc.list_cached_group_ids(output_dir): + is_orphaned = False + is_active = False + + if gid.startswith("file_"): + fname = gid[5:] + if all_db_filenames and fname not in all_db_filenames: + is_orphaned = True + elif active_db_filenames and fname in active_db_filenames: + is_active = True + else: + if all_db_gids and gid not in all_db_gids: + is_orphaned = True + elif active_db_gids and gid in active_db_gids: + is_active = True + + # 1. Truly orphaned turntable caches (no associated base images or files in DB) + if is_orphaned: + print(f"[static] Deleting truly orphaned turntable cache and DB records for group/file {gid}") + tc.delete_state(output_dir, gid) + try: + conn = database.get_db_connection() + cur = conn.cursor() + cur.execute("DELETE FROM person WHERE group_id = %s", (gid,)) + conn.commit() + cur.close() + database._put_db_connection(conn) + except Exception as del_err: + print(f"[static] Failed to clean DB records for orphaned group/file {gid}: {del_err}") + continue + + # 2. Inactive turntable caches (associated group/file is fully archived or hidden) + if not is_active: + # Keep cache on disk but do not write to turntables.json (hide from UI) + continue + state = tc.load_state(output_dir, gid) if not state: continue