This commit is contained in:
mike
2026-06-20 02:43:57 +02:00
parent f1f693523b
commit 0176c1b965
16 changed files with 3820 additions and 394 deletions

321
.trash/groups.json Normal file
View File

@@ -0,0 +1,321 @@
{
"20260617_005040_img_56.png": "cg_077c3625",
"20260617_005026_img_55.png": "cg_077c3625",
"20260617_014351_img_66.png": "cg_9be4f76c",
"20260617_013150_img_66.png": "cg_9be4f76c",
"20260617_013327_img_67.png": "cg_9be4f76c",
"20260617_013211_img_65.png": "cg_9be4f76c",
"20260617_013035_img_64.png": "cg_9be4f76c",
"20260617_013111_img_63.png": "cg_9be4f76c",
"20260616_005752_img_21.png": "cg_07d742c0",
"20260616_005727_img_19.png": "cg_07d742c0",
"20260615_151614_img_93.png": "cg_74544975",
"20260615_145017_img_93.png": "cg_74544975",
"20260615_151829_img_92.png": "cg_74544975",
"img_9.png": "cg_74544975",
"20260617_133832_img_81.png": "cg_85873ed2",
"20260617_133917_img_82.png": "cg_85873ed2",
"20260617_134119_img_85.png": "cg_85873ed2",
"20260617_134229_img_83.png": "cg_85873ed2",
"20260618_004930_20260617_134041_img_84.png": "cg_85873ed2",
"20260618_004501_20260617_134041_img_84.png": "cg_85873ed2",
"20260617_134041_img_84.png": "cg_85873ed2",
"20260618_011507_20260617_134615_img_86.png": "cg_85873ed2",
"20260617_134615_img_86.png": "cg_85873ed2",
"20260618_011633_t159zr-1.png": "cg_85873ed2",
"t159zr-1.png": "cg_85873ed2",
"20260618_004919_kbk99v.png": "cg_a5a45c98",
"kbk99v.png": "cg_a5a45c98",
"20260618_004941_out7.png": "cg_a5a45c98",
"out7.png": "cg_a5a45c98",
"20260618_004334_Pasted image (3).png": "cg_0290aa0c",
"Pasted image (3).png": "cg_0290aa0c",
"20260618_002025_20260616_020020_img_35.png": "cg_0290aa0c",
"20260616_020020_img_35.png": "cg_0290aa0c",
"20260618_004428_20260616_015949_img_37.png": "cg_0290aa0c",
"20260618_002036_20260616_015949_img_37.png": "cg_0290aa0c",
"20260616_015949_img_37.png": "cg_0290aa0c",
"20260616_020059_img_38.png": "cg_0290aa0c",
"20260616_015919_img_33.png": "cg_4ae30667",
"20260616_015850_img_34.png": "cg_4ae30667",
"20260616_011823_imgxxxx.png": "cg_800abf94",
"20260615_152252_imgxxx.png": "cg_800abf94",
"tp236b.png": "cg_f55e9e4a",
"out.png": "cg_f55e9e4a",
"out2.png": "cg_f55e9e4a",
"p13.png": "cg_4e575e1d",
"pa0.png": "cg_4e575e1d",
"Pasted image (5).png": "cg_85873ed2",
"img_3.png": "cg_53eda359",
"Pasted image.png": "cg_53eda359",
"out3.png": "cg_53eda359",
"20260615_155354_others.jpeg": "cg_569ddd5e",
"20260615_154852_other.jpeg": "cg_569ddd5e",
"20260615_154333_other.jpeg": "cg_1c0c5074",
"20260618_004407_20260616_002456_test123.jpeg": "cg_569ddd5e",
"20260616_002456_test123.jpeg": "cg_569ddd5e",
"20260618_013512_Pasted image (9).png": "cg_809653a0",
"Pasted image (9).png": "cg_809653a0",
"20260615_155756_img_6v1.png": "cg_2b3ab0b0",
"20260616_002302_image.png": "cg_2b3ab0b0",
"20260618_011622_jb1.png": "cg_ee004a75",
"jb1.png": "cg_ee004a75",
"20260618_010649_20260615_150340_test.png": "cg_ee004a75",
"20260615_150340_test.png": "cg_ee004a75",
"20260618_045745_7_20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045734_6_20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045723_5_20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045656_20260618_045450_test_clipboard.png": "cg_32d91763",
"20260618_045629_20260618_045234_test_clipboard.png": "cg_32d91763",
"20260618_045234_test_clipboard.png": "cg_32d91763",
"20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045450_test_clipboard.png": "cg_32d91763",
"20260618_045703_4_20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045652_3_20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045631_2_20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045620_1_20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045608_0_20260618_045549_test_clipboard.png": "cg_32d91763",
"20260618_045539_3_20260618_045450_test_clipboard.png": "cg_32d91763",
"20260618_045528_2_20260618_045450_test_clipboard.png": "cg_32d91763",
"20260618_045500_0_20260618_045450_test_clipboard.png": "cg_32d91763",
"20260618_045450_4_20260618_045234_test_clipboard.png": "cg_32d91763",
"20260618_045439_3_20260618_045234_test_clipboard.png": "cg_32d91763",
"20260618_045428_2_20260618_045234_test_clipboard.png": "cg_32d91763",
"20260618_045418_1_20260618_045234_test_clipboard.png": "cg_32d91763",
"20260618_045407_0_20260618_045234_test_clipboard.png": "cg_32d91763",
"20260618_051052_9_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_051040_8_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_051029_7_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_051017_6_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_051006_5_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_050955_4_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_050929_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_050935_3_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_050902_0_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_050913_1_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_050923_2_20260618_050846_img_4.png": "cg_b5b937c7",
"20260618_053530_2_20260618_053458_image.png": "cg_bc58b958",
"20260618_220856_2_20260618_053458_image.png": "cg_bc58b958",
"20260618_220907_2_20260618_053458_image.png": "cg_bc58b958",
"20260618_220918_2_20260618_053458_image.png": "cg_bc58b958",
"Pasted image (7).png": "cg_0290aa0c",
"20260616_021235_img_47.png": "cg_0290aa0c",
"20260616_020035_img_36.png": "cg_0290aa0c",
"20260618_002014_20260616_020035_img_36.png": "cg_0290aa0c",
"20260618_011517_20260618_002014_20260616_020035_img_36.png": "cg_0290aa0c",
"Pasted image (4).png": "cg_0290aa0c",
"20260618_010700_Pasted image (4).png": "cg_0290aa0c",
"20260618_015156_20260618_010700_Pasted image (4).png": "cg_0290aa0c",
"20260616_023306_img_52.png": "cg_571ceb34",
"20260616_022349_img_48.png": "cg_571ceb34",
"20260616_022543_img_50.png": "cg_571ceb34",
"20260618_015102_20260616_022543_img_50.png": "cg_571ceb34",
"20260618_124203_image.png": "cg_f1e85987",
"20260618_124440_6_20260618_124203_image.png": "cg_f1e85987",
"20260618_124424_5_20260618_124203_image.png": "cg_f1e85987",
"20260618_124412_4_20260618_124203_image.png": "cg_f1e85987",
"20260618_124355_3_20260618_124203_image.png": "cg_f1e85987",
"20260618_124334_2_20260618_124203_image.png": "cg_f1e85987",
"20260618_124316_1_20260618_124203_image.png": "cg_f1e85987",
"20260618_124256_0_20260618_124203_image.png": "cg_f1e85987",
"20260618_122931_image.png": "cg_f1e85987",
"20260618_123315_8_20260618_122931_image.png": "cg_f1e85987",
"20260618_123257_7_20260618_122931_image.png": "cg_f1e85987",
"20260618_123244_6_20260618_122931_image.png": "cg_f1e85987",
"20260618_123227_5_20260618_122931_image.png": "cg_f1e85987",
"20260618_123210_4_20260618_122931_image.png": "cg_f1e85987",
"20260618_123153_3_20260618_122931_image.png": "cg_f1e85987",
"20260618_123132_2_20260618_122931_image.png": "cg_f1e85987",
"20260618_123119_1_20260618_122931_image.png": "cg_f1e85987",
"20260618_123104_0_20260618_122931_image.png": "cg_f1e85987",
"20260618_132718_image.png": "cg_7e0e0569",
"20260618_133011_9_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132956_8_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132941_7_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132923_6_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132906_5_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132848_4_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132831_3_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132817_2_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132806_1_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132755_0_20260618_132718_image.png": "cg_7e0e0569",
"20260618_133023_10_20260618_132718_image.png": "cg_7e0e0569",
"20260618_132215_image.png": "cg_7e0e0569",
"20260618_132450_8_20260618_132215_image.png": "cg_7e0e0569",
"20260618_132432_7_20260618_132215_image.png": "cg_7e0e0569",
"20260618_132414_6_20260618_132215_image.png": "cg_7e0e0569",
"20260618_132357_5_20260618_132215_image.png": "cg_7e0e0569",
"20260618_132340_4_20260618_132215_image.png": "cg_7e0e0569",
"20260618_132323_3_20260618_132215_image.png": "cg_7e0e0569",
"20260618_132305_2_20260618_132215_image.png": "cg_7e0e0569",
"20260618_132248_1_20260618_132215_image.png": "cg_7e0e0569",
"20260618_132232_0_20260618_132215_image.png": "cg_7e0e0569",
"20260618_131909_image.png": "cg_7e0e0569",
"20260618_132152_8_20260618_131909_image.png": "cg_7e0e0569",
"20260618_132134_7_20260618_131909_image.png": "cg_7e0e0569",
"20260618_132114_6_20260618_131909_image.png": "cg_7e0e0569",
"20260618_132054_5_20260618_131909_image.png": "cg_7e0e0569",
"20260618_132035_4_20260618_131909_image.png": "cg_7e0e0569",
"20260618_132017_3_20260618_131909_image.png": "cg_7e0e0569",
"20260618_131959_2_20260618_131909_image.png": "cg_7e0e0569",
"20260618_131943_1_20260618_131909_image.png": "cg_7e0e0569",
"20260618_131926_0_20260618_131909_image.png": "cg_7e0e0569",
"20260618_131624_image.png": "cg_7e0e0569",
"20260618_131822_8_20260618_131624_image.png": "cg_7e0e0569",
"20260618_131811_7_20260618_131624_image.png": "cg_7e0e0569",
"20260618_131759_6_20260618_131624_image.png": "cg_7e0e0569",
"20260618_131747_5_20260618_131624_image.png": "cg_7e0e0569",
"20260618_131736_4_20260618_131624_image.png": "cg_7e0e0569",
"20260618_131725_3_20260618_131624_image.png": "cg_7e0e0569",
"20260618_131713_2_20260618_131624_image.png": "cg_7e0e0569",
"20260618_131702_1_20260618_131624_image.png": "cg_7e0e0569",
"20260618_131651_0_20260618_131624_image.png": "cg_7e0e0569",
"20260618_172500_image.png": "cg_08203e88",
"20260618_172641_8_20260618_172500_image.png": "cg_08203e88",
"20260618_172630_7_20260618_172500_image.png": "cg_08203e88",
"20260618_172618_6_20260618_172500_image.png": "cg_08203e88",
"20260618_172607_5_20260618_172500_image.png": "cg_08203e88",
"20260618_172555_4_20260618_172500_image.png": "cg_08203e88",
"20260618_172544_3_20260618_172500_image.png": "cg_08203e88",
"20260618_172532_2_20260618_172500_image.png": "cg_08203e88",
"20260618_172521_1_20260618_172500_image.png": "cg_08203e88",
"20260618_172510_0_20260618_172500_image.png": "cg_08203e88",
"20260618_171448_image.png": "cg_08203e88",
"20260618_172015_8_20260618_171448_image.png": "cg_08203e88",
"20260618_171939_7_20260618_171448_image.png": "cg_08203e88",
"20260618_171906_6_20260618_171448_image.png": "cg_08203e88",
"20260618_171834_5_20260618_171448_image.png": "cg_08203e88",
"20260618_171802_4_20260618_171448_image.png": "cg_08203e88",
"20260618_171732_3_20260618_171448_image.png": "cg_08203e88",
"20260618_171706_2_20260618_171448_image.png": "cg_08203e88",
"20260618_171639_1_20260618_171448_image.png": "cg_08203e88",
"20260618_171624_0_20260618_171448_image.png": "cg_08203e88",
"20260618_171628_image.png": "cg_08203e88",
"20260618_172048_8_20260618_171628_image.png": "cg_08203e88",
"20260618_172032_7_20260618_171628_image.png": "cg_08203e88",
"20260618_171956_6_20260618_171628_image.png": "cg_08203e88",
"20260618_171923_5_20260618_171628_image.png": "cg_08203e88",
"20260618_171851_4_20260618_171628_image.png": "cg_08203e88",
"20260618_171819_3_20260618_171628_image.png": "cg_08203e88",
"20260618_171746_2_20260618_171628_image.png": "cg_08203e88",
"20260618_171717_1_20260618_171628_image.png": "cg_08203e88",
"20260618_171655_0_20260618_171628_image.png": "cg_08203e88",
"20260617_015728_img_70.png": "cg_f6e02c38",
"20260617_015611_img_69.png": "cg_f6e02c38",
"20260617_133154_img_78.png": "cg_75340e8e",
"20260617_133411_img_79.png": "cg_75340e8e",
"p1.png": "cg_a5a45c98",
"20260618_004909_p1.png": "cg_a5a45c98",
"20260618_004345_p1.png": "cg_a5a45c98",
"20260615_150812_img_19_2.png": "cg_a5a45c98",
"20260618_004847_20260615_150812_img_19_2.png": "cg_a5a45c98",
"20260618_011434_20260618_004847_20260615_150812_img_19_2.png": "cg_a5a45c98",
"20260618_015052_20260618_004407_20260616_002456_test123.jpeg": "cg_569ddd5e",
"20260618_223501_image.png": "solo:20260618_223501_image.png",
"20260618_223557_2_20260618_223501_image.png": "solo:20260618_223557_2_20260618_223501_image.png",
"20260618_223541_1_20260618_223501_image.png": "solo:20260618_223541_1_20260618_223501_image.png",
"20260618_223525_0_20260618_223501_image.png": "solo:20260618_223525_0_20260618_223501_image.png",
"20260619_040307_7_20260619_040135_image.png": "solo:20260619_040307_7_20260619_040135_image.png",
"20260619_040319_8_20260619_040135_image.png": "solo:20260619_040319_8_20260619_040135_image.png",
"20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041924_8_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041902_7_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041839_6_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041734_3_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041818_5_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041756_4_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041711_2_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041650_1_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_041628_0_20260619_041612_image.png": "cg_8c8d8ec9",
"20260619_040221_3_20260619_040135_image.png": "cg_8c8d8ec9",
"20260619_040158_1_20260619_040135_image.png": "cg_84349b43",
"20260619_043405_1_20260619_040135_image.png": "cg_d193128f",
"20260619_043433_1_20260619_040135_image.png": "cg_84349b43",
"20260619_040135_image.png": "cg_84349b43",
"20260619_041913_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041850_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041829_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041806_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041744_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041722_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041701_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041639_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041618_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041555_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041544_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041533_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041522_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041511_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041500_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041449_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041438_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041427_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041417_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041406_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041355_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041334_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041323_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041041_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041030_1_20260619_040135_image.png": "cg_84349b43",
"20260619_041020_1_20260619_040135_image.png": "cg_84349b43",
"20260619_040147_0_20260619_040135_image.png": "cg_84349b43",
"20260619_040209_2_20260619_040135_image.png": "cg_84349b43",
"20260619_040255_6_20260619_040135_image.png": "cg_84349b43",
"20260619_040244_5_20260619_040135_image.png": "cg_84349b43",
"20260619_040233_4_20260619_040135_image.png": "solo:20260619_040233_4_20260619_040135_image.png",
"20260619_043740_1_20260619_040135_image.png": "cg_84349b43",
"20260618_052526_image.png": "cg_7ec17537",
"20260618_052708_8_20260618_052526_image.png": "cg_7ec17537",
"20260618_052657_7_20260618_052526_image.png": "cg_7ec17537",
"20260618_052645_6_20260618_052526_image.png": "cg_7ec17537",
"20260618_052634_5_20260618_052526_image.png": "cg_7ec17537",
"20260618_052622_4_20260618_052526_image.png": "cg_7ec17537",
"20260618_052611_3_20260618_052526_image.png": "cg_7ec17537",
"20260618_052559_2_20260618_052526_image.png": "cg_7ec17537",
"20260618_052548_1_20260618_052526_image.png": "cg_7ec17537",
"20260618_052537_0_20260618_052526_image.png": "cg_7ec17537",
"20260619_052235_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
"20260619_052030_mr_mr_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
"20260619_052351_mr_mr_mr_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
"20260619_052514_mr_1_20260618_052526_image.png": "cg_ed2e43d1",
"20260619_051326_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
"20260619_051905_mr_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
"20260619_050945_image.png": "cg_ed2e43d1",
"20260619_125445_mr_7_20260619_124038_image.png": "cg_ed2e43d1",
"20260619_125434_mr_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
"20260619_125654_mr_mr_7_20260619_124038_image.png": "cg_ed2e43d1",
"20260619_130043_mr_1_20260619_124038_image.png": "cg_ed2e43d1",
"20260619_130001_mr_1_20260619_124038_image.png": "cg_6f321af3",
"20260619_124635_mr_7_20260619_124038_image.png": "cg_6f321af3",
"20260619_123958_image.png": "cg_6f321af3",
"20260619_124529_8_20260619_123958_image.png": "cg_6f321af3",
"20260619_124508_7_20260619_123958_image.png": "cg_6f321af3",
"20260619_124446_6_20260619_123958_image.png": "cg_6f321af3",
"20260619_124421_5_20260619_123958_image.png": "cg_6f321af3",
"20260619_124351_4_20260619_123958_image.png": "cg_6f321af3",
"20260619_124316_3_20260619_123958_image.png": "cg_6f321af3",
"20260619_124242_2_20260619_123958_image.png": "cg_6f321af3",
"20260619_124210_1_20260619_123958_image.png": "cg_6f321af3",
"20260619_124139_0_20260619_123958_image.png": "cg_6f321af3",
"20260619_124038_image.png": "cg_6f321af3",
"20260619_124540_8_20260619_124038_image.png": "cg_6f321af3",
"20260619_124518_7_20260619_124038_image.png": "cg_6f321af3",
"20260619_124456_6_20260619_124038_image.png": "cg_6f321af3",
"20260619_124435_5_20260619_124038_image.png": "cg_6f321af3",
"20260619_124407_4_20260619_124038_image.png": "cg_6f321af3",
"20260619_124333_3_20260619_124038_image.png": "cg_6f321af3",
"20260619_124258_2_20260619_124038_image.png": "cg_6f321af3",
"20260619_124226_1_20260619_124038_image.png": "cg_6f321af3",
"20260619_124154_0_20260619_124038_image.png": "cg_6f321af3",
"20260619_184116_image.png": "cg_6f321af3",
"20260619_184259_8_20260619_184116_image.png": "cg_6f321af3",
"20260619_184248_7_20260619_184116_image.png": "cg_6f321af3",
"20260619_184236_6_20260619_184116_image.png": "cg_6f321af3",
"20260619_184225_5_20260619_184116_image.png": "cg_6f321af3",
"20260619_184214_4_20260619_184116_image.png": "cg_6f321af3",
"20260619_184202_3_20260619_184116_image.png": "cg_6f321af3",
"20260619_184150_2_20260619_184116_image.png": "cg_6f321af3",
"20260619_184139_1_20260619_184116_image.png": "cg_6f321af3",
"20260619_184128_0_20260619_184116_image.png": "cg_6f321af3"
}

View File

@@ -6,5 +6,8 @@
"20260618_045831_20260618_045549_test_clipboard.png": "1girl breasts nipples solo nude blue skin pussy head out of frame", "20260618_045831_20260618_045549_test_clipboard.png": "1girl breasts nipples solo nude blue skin pussy head out of frame",
"20260618_050929_20260618_050846_img_4.png": "1girl solo blue skin nipples nude head out of frame breasts navel", "20260618_050929_20260618_050846_img_4.png": "1girl solo blue skin nipples nude head out of frame breasts navel",
"20260618_051629_20260618_051435_test_group.png": "1girl breasts solo nipples realistic nude head out of frame navel", "20260618_051629_20260618_051435_test_group.png": "1girl breasts solo nipples realistic nude head out of frame navel",
"20260618_052008_20260618_051426_test_group.png": "1girl breasts solo nipples nude head out of frame navel realistic" "20260618_052008_20260618_051426_test_group.png": "1girl breasts solo nipples nude head out of frame navel realistic",
"20260619_123958_image.png": "Solo 1Female",
"20260619_172708_image.png": "Bicycle Fem",
"20260619_172850_8_20260619_172708_image.png": "Bicycle 1 female"
} }

View File

@@ -1,14 +0,0 @@
---
title: Qwen Image Edit Rapid AIO (NSFW)
emoji: 🌍
colorFrom: pink
colorTo: pink
sdk: gradio
sdk_version: 6.1.0
app_file: app.py
pinned: true
tags:
- not-for-all-audiences
---
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference

View File

@@ -1,23 +0,0 @@
def calculate_area(length, width):
"""
Calculate the area of a rectangle.
Args:
length (float): The length of the rectangle
width (float): The width of the rectangle
Returns:
float: The area of the rectangle
"""
if length <= 0 or width <= 0:
raise ValueError("Length and width must be positive numbers")
return length * width
# Example usage
if __name__ == "__main__":
try:
area = calculate_area(5, 3)
print(f"The area is: {area}")
except ValueError as e:
print(f"Error: {e}")

View File

@@ -1,152 +0,0 @@
import os
import glob
import shutil
import subprocess
import tempfile
import threading
import time
CLIPS_DIR = "/data/events/clips"
ARCHIVE_DIR = "/mnt/tour-big/clips"
SIZE_THRESHOLD_MB = 200
SIZE_THRESHOLD_BYTES = SIZE_THRESHOLD_MB * 1024 * 1024
MAX_PER_RUN = 20
def has_nvenc():
r = subprocess.run(["ffmpeg", "-hide_banner", "-encoders"],
stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
return b"hevc_nvenc" in r.stdout
def _ffmpeg(cmd):
return subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
def _proxy_cmd(src, dst, hw):
"""10fps H.265 proxy for quick local browsing."""
if hw:
return ["ffmpeg", "-y",
"-hwaccel", "cuda", "-hwaccel_output_format", "cuda",
"-i", src,
"-vcodec", "hevc_nvenc", "-rc", "constqp", "-qp", "28", "-preset", "p4",
"-r", "10", "-tag:v", "hvc1", "-acodec", "copy", dst]
return ["ffmpeg", "-y", "-i", src,
"-vcodec", "libx265", "-crf", "28", "-preset", "medium",
"-r", "10", "-tag:v", "hvc1", "-acodec", "copy", dst]
def _archive_cmd(src, dst, hw):
"""Full-fps high-quality H.265 for archive — small enough to pull back fast over slow SMB."""
if hw:
return ["ffmpeg", "-y",
"-hwaccel", "cuda", "-hwaccel_output_format", "cuda",
"-i", src,
"-vcodec", "hevc_nvenc", "-rc", "vbr", "-cq", "19", "-b:v", "0",
"-preset", "p6", "-tune", "hq",
"-tag:v", "hvc1", "-acodec", "copy", dst]
return ["ffmpeg", "-y", "-i", src,
"-vcodec", "libx265", "-crf", "19", "-preset", "slow",
"-tag:v", "hvc1", "-acodec", "copy", dst]
def _encode_worker(label, cmd, hw, fallback_cmd, out):
proc = _ffmpeg(cmd)
if proc.returncode != 0 and hw:
print(f" [{label}] NVENC failed, retrying in software...")
proc = _ffmpeg(fallback_cmd)
out[label] = proc
def process(src, orig_size, hw):
name = os.path.basename(src)
archive_dst = os.path.join(ARCHIVE_DIR, name)
if os.path.exists(archive_dst):
print(f" Skip {name} — already archived")
return 0
proxy_tmp = src + ".proxy.mp4"
# Encode archive to local /tmp first — never write directly to a slow SMB share
archive_tmp = os.path.join(tempfile.gettempdir(), name + ".archive.mp4")
print(f"[{name}] {orig_size/(1024*1024):.0f} MB ({'NVENC' if hw else 'software'})")
t0 = time.time()
results = {}
threads = [
threading.Thread(target=_encode_worker, args=(
"proxy",
_proxy_cmd(src, proxy_tmp, hw), hw,
_proxy_cmd(src, proxy_tmp, False),
results,
)),
threading.Thread(target=_encode_worker, args=(
"archive",
_archive_cmd(src, archive_tmp, hw), hw,
_archive_cmd(src, archive_tmp, False),
results,
)),
]
for t in threads: t.start()
for t in threads: t.join()
failed = {k: v for k, v in results.items() if v.returncode != 0}
if failed:
for label, proc in failed.items():
print(f" [{label}] error: {proc.stderr.decode()[-300:]}")
for f in (proxy_tmp, archive_tmp):
if os.path.exists(f): os.remove(f)
return 0
proxy_mb = os.path.getsize(proxy_tmp) / (1024*1024)
archive_mb = os.path.getsize(archive_tmp) / (1024*1024)
orig_mb = orig_size / (1024*1024)
print(f" proxy {orig_mb:.0f}->{proxy_mb:.0f} MB "
f"archive {orig_mb:.0f}->{archive_mb:.0f} MB "
f"({time.time()-t0:.1f}s) — pushing archive to share...")
try:
shutil.move(archive_tmp, archive_dst)
except Exception as e:
print(f" Archive move failed: {e} — aborting, original intact")
for f in (proxy_tmp, archive_tmp):
if os.path.exists(f): os.remove(f)
return 0
# Atomic swap: original -> proxy (same filesystem)
os.replace(proxy_tmp, src)
freed = orig_size - os.path.getsize(src)
print(f" Done freed locally: {freed/(1024*1024):.0f} MB")
return freed
if __name__ == "__main__":
hw = has_nvenc()
print(f"Encoder: {'hevc_nvenc (A6000, 2x parallel)' if hw else 'libx265 (software)'}")
print(f"Clips: {CLIPS_DIR}")
print(f"Archive: {ARCHIVE_DIR}\n")
if not os.path.isdir(ARCHIVE_DIR):
print(f"ERROR: archive not reachable: {ARCHIVE_DIR}")
raise SystemExit(1)
files = sorted(
[(fp, os.path.getsize(fp))
for fp in glob.glob(os.path.join(CLIPS_DIR, "*.mp4"))
if os.path.isfile(fp) and os.path.getsize(fp) > SIZE_THRESHOLD_BYTES],
key=lambda x: x[1], reverse=True,
)
print(f"Found {len(files)} files > {SIZE_THRESHOLD_MB} MB\n")
total_freed = 0
done = 0
for path, size in files:
freed = process(path, size, hw)
total_freed += freed
if freed:
done += 1
if done >= MAX_PER_RUN:
print(f"Reached {MAX_PER_RUN}-file limit.")
break
print(f"\nDone. Processed: {done} Freed locally: {total_freed/(1024*1024):.0f} MB")

View File

View File

@@ -649,6 +649,92 @@
#uploadInput { display: none; } #uploadInput { display: none; }
/* --- lightbox variant strip --- */
#lbVariantStrip {
display: none;
flex-direction: row;
gap: 6px;
overflow-x: auto;
padding: 6px 2px 2px;
width: 100%;
scrollbar-width: thin;
scrollbar-color: #444 transparent;
}
.lb-var-thumb {
flex: 0 0 auto;
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
cursor: pointer;
opacity: 0.5;
transition: opacity 0.15s;
max-width: 60px;
}
.lb-var-thumb:hover { opacity: 0.85; }
.lb-var-thumb.active { opacity: 1; outline: 2px solid #60a5fa; border-radius: 4px; }
.lb-var-thumb img {
width: 52px; height: 52px;
object-fit: cover;
border-radius: 4px;
display: block;
}
.lb-var-pose {
font-size: 7px;
color: #999;
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 58px;
}
/* --- group card grid overview --- */
.card-grid {
position: absolute;
inset: 0;
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr;
gap: 2px;
background: #111;
}
.card-grid-thumb {
position: relative;
overflow: hidden;
cursor: pointer;
}
.card-grid-thumb img {
width: 100%; height: 100%;
object-fit: cover;
display: block;
}
.card-grid-thumb .thumb-pose {
position: absolute;
bottom: 0; left: 0; right: 0;
background: rgba(0,0,0,0.72);
font-size: 7px;
color: #ccc;
padding: 1px 3px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-align: center;
pointer-events: none;
}
.card-grid-more {
position: absolute;
inset: 0;
background: rgba(0,0,0,0.55);
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
font-weight: 700;
color: #fff;
pointer-events: none;
}
/* --- privacy overlay --- */ /* --- privacy overlay --- */
.privacy-overlay { .privacy-overlay {
display: none; display: none;
@@ -718,6 +804,7 @@
<button class="btn primary" onclick="refreshNow()">Refresh Now</button> <button class="btn primary" onclick="refreshNow()">Refresh Now</button>
<button class="btn" id="selectBtn" onclick="toggleSelectMode()">Select</button> <button class="btn" id="selectBtn" onclick="toggleSelectMode()">Select</button>
<button class="btn" id="privacyBtn" onclick="togglePrivacyMode()" title="Privacy mode — hides content on focus loss (P)">🔓</button> <button class="btn" id="privacyBtn" onclick="togglePrivacyMode()" title="Privacy mode — hides content on focus loss (P)">🔓</button>
<button class="btn" onclick="cleanupDb()" title="Remove DB records for deleted/missing files" style="font-size:11px;opacity:0.6">Clean DB</button>
</div> </div>
<div class="status"> <div class="status">
<span class="status-dot" id="statusDot"></span> <span class="status-dot" id="statusDot"></span>
@@ -764,11 +851,13 @@
<button class="lb-btn" id="lbMoveDown" style="font-size:13px;padding:3px 8px;display:none" onclick="lbMoveInGroup(1)" title="Move later in group"></button> <button class="lb-btn" id="lbMoveDown" style="font-size:13px;padding:3px 8px;display:none" onclick="lbMoveInGroup(1)" title="Move later in group"></button>
<button class="lb-btn" id="lbPreferredBtn" style="font-size:11px;padding:3px 8px;display:none;color:#f59e0b" onclick="lbSetPreferred()" title="Set as preferred reference for this group">★ Preferred</button> <button class="lb-btn" id="lbPreferredBtn" style="font-size:11px;padding:3px 8px;display:none;color:#f59e0b" onclick="lbSetPreferred()" title="Set as preferred reference for this group">★ Preferred</button>
<button class="lb-btn" id="lbEyeBtn" style="font-size:15px;padding:3px 8px" onclick="lbToggleHidden()" title="Hide/show this image in group cycling">👁</button> <button class="lb-btn" id="lbEyeBtn" style="font-size:15px;padding:3px 8px" onclick="lbToggleHidden()" title="Hide/show this image in group cycling">👁</button>
<button class="lb-btn" style="font-size:11px;padding:3px 10px" onclick="tagCurrentImage()">Tag</button> <button class="lb-btn" style="font-size:11px;padding:3px 10px" onclick="tagCurrentImage()" title="Re-run tagger to update tags and clothing detection">Re-tag</button>
<button class="lb-btn" id="lbUndressBtn" style="font-size:11px;padding:3px 10px;background:#7c3aed;display:none" onclick="lbUndress()" title="Generate without clothing">Undress</button>
<button class="lb-btn" id="lbExtract" style="font-size:11px;padding:3px 10px" onclick="extractCurrentImage()">Extract</button> <button class="lb-btn" id="lbExtract" style="font-size:11px;padding:3px 10px" onclick="extractCurrentImage()">Extract</button>
<button class="lb-btn" id="lbNoBgBtn" style="font-size:11px;padding:3px 10px;background: #334155" onclick="lbRemoveBg()">No BG</button> <button class="lb-btn" id="lbNoBgBtn" style="font-size:11px;padding:3px 10px;background: #334155" onclick="lbRemoveBg()">No BG</button>
<button class="lb-btn" style="font-size:11px;padding:3px 10px;background: #991b1b" onclick="lbDelete()">Delete</button> <button class="lb-btn" style="font-size:11px;padding:3px 10px;background: #991b1b" onclick="lbDelete()">Delete</button>
<div id="lbSourceRefs" style="display:none;align-items:center;gap:4px;flex-wrap:wrap;margin-top:4px;width:100%"></div> <div id="lbSourceRefs" style="display:none;align-items:center;gap:4px;flex-wrap:wrap;margin-top:4px;width:100%"></div>
<div id="lbVariantStrip"></div>
</div> </div>
</div> </div>
@@ -1068,8 +1157,13 @@
let fileHidden = {}; // filename → boolean (hidden from cycling) let fileHidden = {}; // filename → boolean (hidden from cycling)
let fileHasBg = {}; // filename → boolean (has background, default true) let fileHasBg = {}; // filename → boolean (has background, default true)
let fileSourceRefs = {}; // filename → array of source filenames let fileSourceRefs = {}; // filename → array of source filenames
let fileHasClothing = {}; // filename → boolean|null (null = unknown)
let privacyMode = localStorage.getItem('privacyMode') === 'true'; let privacyMode = localStorage.getItem('privacyMode') === 'true';
function escHtml(s) {
return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
}
function getBaseName(name) { function getBaseName(name) {
return name.replace(/^(\d{8}_\d{6}_)+/, ''); return name.replace(/^(\d{8}_\d{6}_)+/, '');
} }
@@ -1155,6 +1249,11 @@
updateLightbox(); updateLightbox();
} }
function lbNavTo(idx) {
lbIdx = idx;
updateLightbox();
}
function updateLightbox() { function updateLightbox() {
document.getElementById('lbImg').src = lbUrls[lbIdx]; document.getElementById('lbImg').src = lbUrls[lbIdx];
const fname = lbNames[lbIdx]; const fname = lbNames[lbIdx];
@@ -1181,7 +1280,8 @@
document.getElementById('lbEyeBtn').title = hidden ? 'Show in cycling' : 'Hide from cycling'; document.getElementById('lbEyeBtn').title = hidden ? 'Show in cycling' : 'Hide from cycling';
// No BG button — hide when image already has no background // No BG button — hide when image already has no background
document.getElementById('lbNoBgBtn').style.display = fileHasBg[fname] !== false ? '' : 'none'; document.getElementById('lbNoBgBtn').style.display = fileHasBg[fname] !== false ? '' : 'none';
document.getElementById('lbUndressBtn').style.display = fileHasClothing[fname] === true ? '' : 'none';
// Source refs — show small clickable thumbnails // Source refs — show small clickable thumbnails
const refs = fileSourceRefs[fname]; const refs = fileSourceRefs[fname];
@@ -1207,6 +1307,26 @@
// ★ Preferred — shown when not already the first image // ★ Preferred — shown when not already the first image
const prefBtn = document.getElementById('lbPreferredBtn'); const prefBtn = document.getElementById('lbPreferredBtn');
prefBtn.style.display = multi && lbIdx > 0 ? '' : 'none'; prefBtn.style.display = multi && lbIdx > 0 ? '' : 'none';
// Variant strip — thumbnails + pose labels for every image in the group
const strip = document.getElementById('lbVariantStrip');
if (multi) {
strip.style.display = 'flex';
strip.innerHTML = lbUrls.map((url, i) => {
const n = lbNames[i];
const pose = filePoses[n] || '';
const act = i === lbIdx ? ' active' : '';
return '<div class="lb-var-thumb' + act + '" onclick="lbNavTo(' + i + ')">'
+ '<img src="' + url + '" loading="lazy" onerror="this.style.opacity=\'0.3\'">'
+ (pose ? '<div class="lb-var-pose">' + escHtml(pose) + '</div>' : '')
+ '</div>';
}).join('');
// Scroll active thumb into view
const active = strip.querySelector('.lb-var-thumb.active');
if (active) active.scrollIntoView({ block: 'nearest', inline: 'center' });
} else {
strip.style.display = 'none';
}
} }
async function updateName() { async function updateName() {
@@ -1524,7 +1644,7 @@
// Primary: live list from API (always up to date, works after batch jobs) // Primary: live list from API (always up to date, works after batch jobs)
try { try {
const r = await fetch(`${API}/images`, { signal: AbortSignal.timeout(3000) }); const r = await fetch(`${API}/images`, { signal: AbortSignal.timeout(12000) });
if (r.ok) { if (r.ok) {
const data = await r.json(); const data = await r.json();
files = data.images.map(img => img.filename); files = data.images.map(img => img.filename);
@@ -1537,7 +1657,8 @@
if (img.group_name && img.group_id) groupNames[img.group_id] = img.group_name; if (img.group_name && img.group_id) groupNames[img.group_id] = img.group_name;
fileSortOrders[img.filename] = img.sort_order ?? null; fileSortOrders[img.filename] = img.sort_order ?? null;
fileHidden[img.filename] = !!img.hidden; fileHidden[img.filename] = !!img.hidden;
fileHasBg[img.filename] = img.has_background !== false; fileHasBg[img.filename] = img.has_background !== false;
fileHasClothing[img.filename] = img.has_clothing ?? null;
if (img.source_refs) { if (img.source_refs) {
try { fileSourceRefs[img.filename] = JSON.parse(img.source_refs); } catch(e) {} try { fileSourceRefs[img.filename] = JSON.parse(img.source_refs); } catch(e) {}
} }
@@ -1570,16 +1691,19 @@
} }
if (fileObjects.length === 0) { if (fileObjects.length === 0) {
gallery.innerHTML = ` // Only show "no images" if gallery is currently empty (avoid flash on slow API)
<div class="empty-state" style="grid-column: 1 / -1;"> if (!gallery.querySelector('.image-card')) {
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"> gallery.innerHTML = `
<rect x="3" y="3" width="18" height="18" rx="2"/> <div class="empty-state" style="grid-column: 1 / -1;">
<circle cx="8.5" cy="8.5" r="1.5"/> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
<path d="M21 15l-5-5L5 21"/> <rect x="3" y="3" width="18" height="18" rx="2"/>
</svg> <circle cx="8.5" cy="8.5" r="1.5"/>
<h2>No images found</h2> <path d="M21 15l-5-5L5 21"/>
<p>Place images in the output folder and refresh.</p> </svg>
</div>`; <h2>No images found</h2>
<p>Place images in the output folder and refresh.</p>
</div>`;
}
statusDot.classList.remove('updating'); statusDot.classList.remove('updating');
return; return;
} }
@@ -1615,7 +1739,6 @@
const label = groupDisplayName(group); const label = groupDisplayName(group);
const safeGid = gid.replace(/"/g, '&quot;'); const safeGid = gid.replace(/"/g, '&quot;');
const poses = [...new Set(gf.map(f => filePoses[f.cleanName]).filter(Boolean))]; const poses = [...new Set(gf.map(f => filePoses[f.cleanName]).filter(Boolean))];
// First visible image (fallback to first overall)
const firstVisUrl = visibleIdx.length ? urls[visibleIdx[0]] : urls[0]; const firstVisUrl = visibleIdx.length ? urls[visibleIdx[0]] : urls[0];
return ` return `
@@ -1635,22 +1758,20 @@
<div class="image-wrapper"> <div class="image-wrapper">
<div class="select-indicator"></div> <div class="select-indicator"></div>
${vCount > 1 ? `<div class="variant-count">${vCount}×${count !== vCount ? `<span style="opacity:.5;font-size:9px"> /${count}</span>` : ''}</div>` : ''} ${vCount > 1 ? `<div class="variant-count">${vCount}×${count !== vCount ? `<span style="opacity:.5;font-size:9px"> /${count}</span>` : ''}</div>` : ''}
<img src="${firstVisUrl}" alt="${label}" loading="lazy" <img src="${firstVisUrl}" alt="${label}" loading="${isRecent ? 'eager' : 'lazy'}" onerror="this.style.opacity='0.2'">
onerror="this.style.opacity='0.2'">
${vCount > 1 ? `<div class="variant-dots">${visibleIdx.map((_, i) => `<span class="dot${i === 0 ? ' active' : ''}"></span>`).join('')}</div>` : ''} ${vCount > 1 ? `<div class="variant-dots">${visibleIdx.map((_, i) => `<span class="dot${i === 0 ? ' active' : ''}"></span>`).join('')}</div>` : ''}
</div> </div>
<div class="image-info"> <div class="image-info">
<div class="image-name" title="${label}">${label}</div> <div class="image-name" title="${label}">${label}</div>
<div class="image-meta"> <div class="image-meta">
<span class="image-time">#${String(currentGroups.length - gIdx).padStart(3, '0')}</span> <span class="image-time">#${String(currentGroups.length - gIdx).padStart(3, '0')}</span>
${poses.length ? `<span class="badge" style="background:#78350f;font-size:9px">${poses[0]}</span>` : ''} ${poses.length ? `<span class="badge" style="background:#78350f;font-size:9px">${escHtml(poses[0])}</span>` : ''}
${isRecent ? '<span class="badge recent">Latest</span>' : ''} ${isRecent ? '<span class="badge recent">Latest</span>' : ''}
</div> </div>
</div> </div>
</div>`; </div>`;
}).join(''); }).join('');
// Start cycling for groups with 2+ visible images
currentGroups.forEach(g => { currentGroups.forEach(g => {
const data = groupData.get(g.gid); const data = groupData.get(g.gid);
if (data && data.visibleIdx && data.visibleIdx.length > 1) startGroupCycle(g.gid); if (data && data.visibleIdx && data.visibleIdx.length > 1) startGroupCycle(g.gid);
@@ -2153,20 +2274,16 @@
}); });
}); });
// Privacy overlay — show when window loses focus, hide on regain // Privacy overlay — show on any focus loss; requires explicit dismiss (click overlay or P)
window.addEventListener('blur', () => { window.addEventListener('blur', () => {
if (privacyMode) document.getElementById('privacyOverlay').style.display = 'flex'; if (privacyMode) document.getElementById('privacyOverlay').style.display = 'flex';
}); });
window.addEventListener('focus', () => {
document.getElementById('privacyOverlay').style.display = 'none';
});
// Handle visibility change — refresh when tab becomes active; privacy on hide
document.addEventListener('visibilitychange', () => { document.addEventListener('visibilitychange', () => {
if (document.hidden) { if (document.hidden) {
if (privacyMode) document.getElementById('privacyOverlay').style.display = 'flex'; if (privacyMode) document.getElementById('privacyOverlay').style.display = 'flex';
} else { } else {
document.getElementById('privacyOverlay').style.display = 'none'; // Don't auto-hide — user must click overlay or press P to dismiss
loadImages(); loadImages();
} }
}); });
@@ -2196,6 +2313,35 @@
} catch(e) { console.error(e); } } catch(e) { console.error(e); }
} }
async function cleanupDb() {
try {
const r = await fetch(`${API}/db/cleanup`, { method: 'POST' });
const d = await r.json();
showToast(`Cleaned ${d.removed} orphan record${d.removed !== 1 ? 's' : ''}`);
if (d.removed > 0) refreshNow();
} catch(e) {
showToast('Cleanup failed');
}
}
async function lbUndress() {
const fname = lbNames[lbIdx];
if (!fname) return;
const btn = document.getElementById('lbUndressBtn');
btn.textContent = '...';
btn.disabled = true;
try {
const r = await fetch(`${API}/images/${encodeURIComponent(fname)}/undress`, {method:'POST'});
if (!r.ok) { showToast('Undress failed', 'error'); return; }
showToast('Undress queued', 'success');
} catch(e) {
showToast('Undress error', 'error');
} finally {
btn.textContent = 'Undress';
btn.disabled = false;
}
}
async function lbSetPreferred() { async function lbSetPreferred() {
const fname = lbNames[lbIdx]; const fname = lbNames[lbIdx];
if (!fname) return; if (!fname) return;

View File

@@ -25,6 +25,7 @@ def migrate_schema():
"ALTER TABLE person ADD COLUMN IF NOT EXISTS hidden BOOLEAN DEFAULT FALSE", "ALTER TABLE person ADD COLUMN IF NOT EXISTS hidden BOOLEAN DEFAULT FALSE",
"ALTER TABLE person ADD COLUMN IF NOT EXISTS has_background BOOLEAN DEFAULT TRUE", "ALTER TABLE person ADD COLUMN IF NOT EXISTS has_background BOOLEAN DEFAULT TRUE",
"ALTER TABLE person ADD COLUMN IF NOT EXISTS source_refs TEXT", "ALTER TABLE person ADD COLUMN IF NOT EXISTS source_refs TEXT",
"ALTER TABLE person ADD COLUMN IF NOT EXISTS has_clothing BOOLEAN DEFAULT NULL",
]: ]:
cur.execute(sql) cur.execute(sql)
conn.commit() conn.commit()
@@ -35,15 +36,15 @@ def migrate_schema():
def upsert_person(filename, filepath=None, name=None, group_id=None, tags=None, def upsert_person(filename, filepath=None, name=None, group_id=None, tags=None,
embedding=None, clip_description=None, prompt=None, pose=None, embedding=None, clip_description=None, prompt=None, pose=None,
sort_order=None, group_name=None, hidden=None, sort_order=None, group_name=None, hidden=None,
has_background=None, source_refs=None): has_background=None, source_refs=None, has_clothing=None):
conn = get_db_connection() conn = get_db_connection()
cur = conn.cursor() cur = conn.cursor()
try: try:
cur.execute(""" cur.execute("""
INSERT INTO person (filename, filepath, name, group_id, tags, embedding, INSERT INTO person (filename, filepath, name, group_id, tags, embedding,
clip_description, prompt, pose, sort_order, group_name, hidden, clip_description, prompt, pose, sort_order, group_name, hidden,
has_background, source_refs) has_background, source_refs, has_clothing)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
ON CONFLICT (filename) DO UPDATE ON CONFLICT (filename) DO UPDATE
SET filepath = COALESCE(EXCLUDED.filepath, person.filepath), SET filepath = COALESCE(EXCLUDED.filepath, person.filepath),
name = COALESCE(EXCLUDED.name, person.name), name = COALESCE(EXCLUDED.name, person.name),
@@ -57,11 +58,12 @@ def upsert_person(filename, filepath=None, name=None, group_id=None, tags=None,
group_name = COALESCE(EXCLUDED.group_name, person.group_name), group_name = COALESCE(EXCLUDED.group_name, person.group_name),
hidden = COALESCE(EXCLUDED.hidden, person.hidden), hidden = COALESCE(EXCLUDED.hidden, person.hidden),
has_background = COALESCE(EXCLUDED.has_background, person.has_background), has_background = COALESCE(EXCLUDED.has_background, person.has_background),
source_refs = COALESCE(EXCLUDED.source_refs, person.source_refs); source_refs = COALESCE(EXCLUDED.source_refs, person.source_refs),
has_clothing = COALESCE(EXCLUDED.has_clothing, person.has_clothing);
""", (filename, filepath, name, group_id, """, (filename, filepath, name, group_id,
json.dumps(tags) if tags else None, json.dumps(tags) if tags else None,
embedding, clip_description, prompt, pose, sort_order, group_name, hidden, embedding, clip_description, prompt, pose, sort_order, group_name, hidden,
has_background, source_refs)) has_background, source_refs, has_clothing))
conn.commit() conn.commit()
finally: finally:
cur.close() cur.close()
@@ -83,7 +85,8 @@ def get_person(filename):
try: try:
cur.execute(""" cur.execute("""
SELECT name, group_id, tags, embedding, clip_description, filepath, SELECT name, group_id, tags, embedding, clip_description, filepath,
prompt, pose, sort_order, group_name, hidden, has_background, source_refs prompt, pose, sort_order, group_name, hidden, has_background, source_refs,
has_clothing
FROM person WHERE filename = %s FROM person WHERE filename = %s
""", (filename,)) """, (filename,))
return cur.fetchone() return cur.fetchone()
@@ -97,7 +100,8 @@ def list_persons():
try: try:
cur.execute(""" cur.execute("""
SELECT filename, name, group_id, clip_description, SELECT filename, name, group_id, clip_description,
prompt, pose, sort_order, group_name, hidden, has_background, source_refs prompt, pose, sort_order, group_name, hidden, has_background, source_refs,
has_clothing
FROM person FROM person
""") """)
return cur.fetchall() return cur.fetchall()
@@ -194,6 +198,21 @@ def set_group_name(group_id, name):
cur.close() cur.close()
conn.close() conn.close()
def get_next_sort_order(group_id):
"""Return max(sort_order)+1 for the group, or 1 if no sorted members exist."""
conn = get_db_connection()
cur = conn.cursor()
try:
cur.execute(
"SELECT COALESCE(MAX(sort_order), 0) + 1 FROM person WHERE group_id = %s",
(group_id,)
)
return cur.fetchone()[0]
finally:
cur.close()
conn.close()
def get_all_group_names(): def get_all_group_names():
"""Return {group_id: group_name} for groups that have a name set.""" """Return {group_id: group_name} for groups that have a name set."""
conn = get_db_connection() conn = get_db_connection()

View File

@@ -62,6 +62,20 @@ MAX_SEED = 2**32 - 1
# Poses where the source image should be rotated 180° before pipeline for better results # Poses where the source image should be rotated 180° before pipeline for better results
ROTATE_180_POSES = {"the dragon", "dragon", "the draak", "draak"} ROTATE_180_POSES = {"the dragon", "dragon", "the draak", "draak"}
# WD tagger tags that indicate the subject is wearing clothes
CLOTHING_TAGS = {
"dress", "skirt", "shirt", "top", "pants", "jeans", "jacket", "coat",
"swimsuit", "bikini", "shorts", "uniform", "hoodie", "sweater", "blouse",
"leggings", "stockings", "tights", "lingerie", "miniskirt", "pleated_skirt",
"school_uniform", "maid_dress", "bodysuit", "sailor_uniform", "leotard",
"corset", "kimono", "yukata", "cheongsam", "t-shirt", "tank_top", "crop_top",
"tube_top", "halter_top", "negligee", "nightgown", "pajamas", "trench_coat",
"vest", "bra", "underwear", "panties", "thong", "g-string", "bikini_top",
"bikini_bottom", "one-piece_swimsuit", "sports_bra", "gym_clothes",
}
UNDRESS_PROMPT = "completely nude, bare skin, no clothing, naked body, natural skin texture"
with open(WORKFLOW_PATH, "r", encoding="utf-8") as f: with open(WORKFLOW_PATH, "r", encoding="utf-8") as f:
BASE_WORKFLOW = json.load(f) BASE_WORKFLOW = json.load(f)
@@ -338,6 +352,14 @@ def _detect_has_background(pil: Image.Image) -> bool:
return transparent_px / (pil.width * pil.height) < 0.1 return transparent_px / (pil.width * pil.height) < 0.1
def _detect_has_clothing(tags: list) -> bool | None:
"""Return True if any tag from CLOTHING_TAGS appears above threshold, None if no tags."""
if not tags:
return None
tag_names = {t["tag"] for t in tags}
return bool(tag_names & CLOTHING_TAGS)
def _run_pipeline( def _run_pipeline(
pil: Image.Image, pil: Image.Image,
prompt: str, prompt: str,
@@ -476,10 +498,11 @@ def _batch_worker(job_id: str, filenames: list, prompts: list[str], poses: list,
try: try:
embedding = embeddings.generate_embedding(out_path) embedding = embeddings.generate_embedding(out_path)
next_order = database.get_next_sort_order(actual_gid)
database.upsert_person( database.upsert_person(
out_name, filepath=out_path, embedding=embedding, out_name, filepath=out_path, embedding=embedding,
group_id=actual_gid, prompt=prompt, pose=pose, group_id=actual_gid, prompt=prompt, pose=pose,
has_background=has_bg, has_background=has_bg, sort_order=next_order,
source_refs=json.dumps([fname]), source_refs=json.dumps([fname]),
) )
except Exception as db_err: except Exception as db_err:
@@ -553,9 +576,10 @@ def _multi_ref_worker(job_id: str, filenames: list[str], prompts: list[str], pos
try: try:
embedding = embeddings.generate_embedding(out_path) embedding = embeddings.generate_embedding(out_path)
next_order = database.get_next_sort_order(output_gid)
database.upsert_person(out_name, filepath=out_path, embedding=embedding, database.upsert_person(out_name, filepath=out_path, embedding=embedding,
group_id=output_gid, prompt=prompt, pose=pose, group_id=output_gid, prompt=prompt, pose=pose,
has_background=has_bg, has_background=has_bg, sort_order=next_order,
source_refs=json.dumps([f for f, _ in pils])) source_refs=json.dumps([f for f, _ in pils]))
except Exception as db_err: except Exception as db_err:
print(f"DB error in multi-ref: {db_err}") print(f"DB error in multi-ref: {db_err}")
@@ -672,9 +696,12 @@ def list_images():
# Try to get from DB first # Try to get from DB first
try: try:
persons = database.list_persons() persons = database.list_persons()
# persons: (filename, name, group_id, clip_description, prompt, pose, sort_order, group_name, hidden, has_background, source_refs) # persons: (filename, name, group_id, clip_description, prompt, pose, sort_order, group_name, hidden, has_background, source_refs, has_clothing)
db_images = [] db_images = []
for p in persons: for p in persons:
fpath = os.path.join(output_dir, p[0])
if not os.path.exists(fpath):
continue # skip orphan DB records whose file no longer exists
db_images.append({ db_images.append({
"filename": p[0], "filename": p[0],
"name": p[1], "name": p[1],
@@ -687,10 +714,10 @@ def list_images():
"hidden": bool(p[8]) if p[8] else False, "hidden": bool(p[8]) if p[8] else False,
"has_background": bool(p[9]) if p[9] is not None else True, "has_background": bool(p[9]) if p[9] is not None else True,
"source_refs": p[10], "source_refs": p[10],
"has_clothing": p[11],
}) })
db_images.sort( db_images.sort(
key=lambda x: os.path.getmtime(os.path.join(output_dir, x["filename"])) key=lambda x: os.path.getmtime(os.path.join(output_dir, x["filename"])),
if os.path.exists(os.path.join(output_dir, x["filename"])) else 0,
reverse=True, reverse=True,
) )
return {"images": db_images} return {"images": db_images}
@@ -723,16 +750,24 @@ def tag_image(req: TagRequest):
pil = Image.open(fpath) pil = Image.open(fpath)
tags = _run_tagger(pil, req.threshold) tags = _run_tagger(pil, req.threshold)
clip_desc = _tags_to_name(tags, req.max_tags) clip_desc = _tags_to_name(tags, req.max_tags)
auto_name = naming.generate_associative_name(tags) has_clothing = _detect_has_clothing(tags)
# Only assign a new name if the image doesn't already have one
existing = database.get_person(req.filename)
auto_name = (existing[0] if existing and existing[0] else None) or naming.generate_associative_name(tags)
# Save to DB # Save to DB
try: try:
embedding = embeddings.generate_embedding(fpath) embedding = embeddings.generate_embedding(fpath)
database.upsert_person(req.filename, filepath=fpath, name=auto_name, clip_description=clip_desc, tags=tags, embedding=embedding, group_id=req.group_id) database.upsert_person(
req.filename, filepath=fpath, name=auto_name,
clip_description=clip_desc, tags=tags, embedding=embedding,
group_id=req.group_id, has_clothing=has_clothing,
)
except Exception as db_err: except Exception as db_err:
print(f"Database error during tag: {db_err}") print(f"Database error during tag: {db_err}")
return {"filename": req.filename, "clip_description": clip_desc, "tags": tags[:30]} return {"filename": req.filename, "clip_description": clip_desc, "tags": tags[:30], "has_clothing": has_clothing}
except Exception as e: except Exception as e:
raise HTTPException(500, str(e)) raise HTTPException(500, str(e))
@@ -865,6 +900,20 @@ def get_similar(filename: str, limit: int = 10):
return {"filename": filename, "similar": similar} return {"filename": filename, "similar": similar}
@app.post("/db/cleanup")
def db_cleanup():
"""Delete DB records for files that no longer exist on disk."""
output_dir = _load_output_dir()
persons = database.list_persons()
removed = []
for p in persons:
fpath = os.path.join(output_dir, p[0])
if not os.path.exists(fpath):
database.delete_person(p[0])
removed.append(p[0])
return {"removed": len(removed), "filenames": removed}
@app.get("/health") @app.get("/health")
def health(): def health():
try: try:
@@ -907,37 +956,43 @@ def _process_upload(file_path: str, filename: str, prompts: list[str], name: str
# 1. CLIP tag the source # 1. CLIP tag the source
tags = _run_tagger(pil.convert("RGB")) tags = _run_tagger(pil.convert("RGB"))
clip_desc = _tags_to_name(tags) clip_desc = _tags_to_name(tags)
has_clothing = _detect_has_clothing(tags)
auto_name = name or naming.generate_associative_name(tags) auto_name = name or naming.generate_associative_name(tags)
# 2. Embedding for source # 2. Embedding for source
embedding = embeddings.generate_embedding(file_path) embedding = embeddings.generate_embedding(file_path)
# 3. Register source in DB (optional, but good for tracking) # 3. Register source in DB — sort_order=0 makes it the preferred base image
# We'll use the original filename or a timestamped one database.upsert_person(
database.upsert_person(filename, filepath=file_path, name=auto_name, clip_description=clip_desc, tags=tags, embedding=embedding, group_id=group_id) filename, filepath=file_path, name=auto_name,
clip_description=clip_desc, tags=tags, embedding=embedding,
# 4. Default behavior: Crop if needed group_id=group_id, sort_order=0, has_clothing=has_clothing,
# We'll use default values from watcher )
# 4. Crop if needed
cropped_pil = _crop_to_bbox(pil) cropped_pil = _crop_to_bbox(pil)
# 5. Run prompts # 5. Run prompts
for i, prompt in enumerate(prompts): for i, prompt in enumerate(prompts):
try: try:
# Use RGB for pipeline
png = _run_pipeline(cropped_pil.convert("RGB"), prompt) png = _run_pipeline(cropped_pil.convert("RGB"), prompt)
ts = time.strftime("%Y%m%d_%H%M%S") ts = time.strftime("%Y%m%d_%H%M%S")
out_name = f"{ts}_{i}_{filename}" out_name = f"{ts}_{i}_{filename}"
if not out_name.lower().endswith(".png"): if not out_name.lower().endswith(".png"):
out_name += ".png" out_name += ".png"
out_path = os.path.join(output_dir, out_name) out_path = os.path.join(output_dir, out_name)
with open(out_path, "wb") as f: with open(out_path, "wb") as f:
f.write(png) f.write(png)
# Register output in DB
out_embedding = embeddings.generate_embedding(out_path) out_embedding = embeddings.generate_embedding(out_path)
database.upsert_person(out_name, filepath=out_path, name=auto_name, clip_description=clip_desc, embedding=out_embedding, group_id=group_id) next_order = database.get_next_sort_order(group_id)
database.upsert_person(
out_name, filepath=out_path, name=auto_name,
clip_description=clip_desc, embedding=out_embedding,
group_id=group_id, sort_order=next_order,
)
except Exception as e: except Exception as e:
print(f"Error processing prompt '{prompt}' for {filename}: {e}") print(f"Error processing prompt '{prompt}' for {filename}: {e}")
@@ -1033,6 +1088,27 @@ def set_image_preferred(filename: str):
return {"filename": filename, "group_id": group_id} return {"filename": filename, "group_id": group_id}
@app.post("/images/{filename}/undress")
def undress_image(filename: str, background_tasks: BackgroundTasks):
"""Queue a generation using the undress prompt on the given image."""
output_dir = _load_output_dir()
fpath = os.path.join(output_dir, filename)
if not os.path.exists(fpath):
raise HTTPException(404, "Image not found")
person = database.get_person(filename)
group_id = person[1] if person and person[1] else naming.get_base_name(filename)
job_id = uuid.uuid4().hex[:8]
jobs[job_id] = {"status": "queued", "done": 0, "failed": 0, "total": 1}
threading.Thread(
target=_batch_worker,
args=(job_id, [filename], [UNDRESS_PROMPT], [None],
random.randint(0, MAX_SEED), MAX_AREA),
kwargs={"group_id": group_id},
daemon=True,
).start()
return {"job_id": job_id, "filename": filename}
@app.delete("/images/{filename}") @app.delete("/images/{filename}")
def delete_image(filename: str): def delete_image(filename: str):
person = database.get_person(filename) person = database.get_person(filename)

View File

@@ -1,10 +1,131 @@
import random import random
import re import re
_NAMES_USA = [
"Aiko", "Alara", "Amara", "Amira", "Andromeda", "Aoife", "Ara", "Aria",
"Ariel", "Arya", "Asel", "Ashira", "Astrid", "Aurora", "Aya", "Ayame",
"Bree", "Briar", "Calla", "Calypso", "Celeste", "Clio", "Cora", "Dalia",
"Dawn", "Daya", "Delia", "Deva", "Eila", "Eira", "Elara", "Elene",
"Elin", "Elira", "Ember", "Era", "Eris", "Estelle", "Eve", "Faye",
"Fern", "Fiora", "Fleur", "Flora", "Gaia", "Greer", "Gwen", "Halo",
"Haven", "Hera", "Ida", "Indra", "Io", "Iris", "Iva", "Jade",
"Jaya", "Juno", "Kai", "Kaia", "Kaya", "Kessa", "Kira", "Laia",
"Leda", "Lila", "Lira", "Lirien", "Luma", "Luna", "Lyra", "Maia",
"Mara", "Marit", "Maya", "Meira", "Mira", "Miya", "Nadia", "Naia",
"Nara", "Neva", "Nia", "Nike", "Nina", "Noor", "Nora", "Nova",
"Nyx", "Ora", "Orla", "Petra", "Quinn", "Ren", "Rhea", "Riona",
"Rue", "Saga", "Sage", "Sarai", "Selene", "Sera", "Silva", "Sol",
"Sora", "Sylva", "Tala", "Tara", "Theia", "Tova", "Ula", "Uma",
"Una", "Vega", "Vela", "Vera", "Vesper", "Vira", "Vivi", "Wren",
"Xara", "Xena", "Yael", "Yuki", "Zara", "Zita", "Zoe", "Zora",
]
_NAMES = [
"Aaf", "Aafje", "Aafke", "Aagje", "Aaltje", "Abby", "Abigail", "Ada",
"Adèle", "Adriana", "Agnes", "Aisha", "Ayla", "Alana", "Aletta", "Alexandra",
"Alice", "Alicia", "Alida", "Alina", "Alise", "Aliza", "Alma", "Amalia",
"Amanda", "Amber", "Amelie", "Amélie", "Amira", "Amy", "An", "Ana",
"Anabel", "Anastasia", "Andrea", "Angela", "Angelina", "Aniek", "Anika",
"Anissa", "Anja", "Anke", "Anna", "Annabel", "Anne", "Annebel",
"Annemarie", "Annet", "Annette", "Annie", "Anouk", "Ans", "Antje",
"Antoinette", "Ariane", "Arianna", "Ariana", "Arwen", "Ashley", "Astrid",
"Aukje", "Aurora", "Avalon", "Aya",
"Babette", "Barbara", "Bea", "Beatrix", "Beau", "Bente", "Berber",
"Bernadette", "Bertje", "Betsy", "Bianca", "Bibi", "Bodil", "Bo",
"Bobbi", "Bregje", "Brechtje", "Brenda", "Brit", "Britt",
"Cato", "Catharina", "Celine", "Céline", "Cemre", "Chantal", "Charlotte",
"Chelsey", "Chiara", "Chloë", "Christa", "Christel", "Christina", "Cindy",
"Claire", "Clara", "Clarissa", "Claudia", "Cleo", "Coby", "Conny", "Cora",
"Cornelia", "Cynthia",
"Daantje", "Dafne", "Daisy", "Dana", "Daniëlle", "Daphne", "Debbie",
"Demi", "Denise", "Desi", "Diana", "Dide", "Diede", "Dieuwertje", "Dina",
"Dinja", "Dionne", "Do", "Dominique", "Doortje", "Dora", "Doris", "Doutzen",
"Eef", "Eefje", "Eeke", "Eline", "Elisa", "Elise", "Elisabeth", "Ella",
"Elle", "Ellen", "Ellemijn", "Ellis", "Els", "Elsa", "Else", "Elvira",
"Emilia", "Emma", "Emmy", "Eva", "Evelien", "Eveline", "Evi",
"Fabiënne", "Famke", "Fay", "Faye", "Fem", "Femke", "Fenna", "Fenne",
"Fien", "Fiene", "Fieke", "Fleur", "Fleurtje", "Floor", "Floortje",
"Flore", "Florianne", "Froukje",
"Gabriëlle", "Gea", "Geertje", "Geertruida", "Geke", "Gerda", "Gerdi",
"Gerdien", "Gertrude", "Ghislaine", "Gina", "Gitte", "Greet", "Greetje",
"Greta", "Grietje", "Guusje", "Gwen",
"Hanna", "Hannah", "Hanne", "Hanneke", "Hannelore", "Harriët", "Hedwig",
"Heleen", "Helena", "Helene", "Henriëtte", "Hester", "Hilde", "Hinke",
"Ilona", "Ilse", "Imke", "Imme", "Ina", "Indy", "Ineke", "Ines", "Inge",
"Ingrid", "Iris", "Isa", "Isabel", "Isabella", "Isabelle", "Ise", "Iva",
"Ivana",
"Jacoba", "Jacqueline", "Jada", "Jade", "Janna", "Janne", "Janneke",
"Jantien", "Jasmijn", "Jasmine", "Jayda", "Jelka", "Jelke", "Jente",
"Jenthe", "Jet", "Jette", "Jill", "Jo", "Joan", "Joanna", "Johanna",
"Jolanda", "Jolie", "Josephine", "Josje", "Judith", "Julia", "Julie",
"Juliette", "Juna", "Juni", "Juul", "Juut",
"Kaat", "Kaatje", "Karen", "Karin", "Karlijn", "Kiki", "Kim", "Kirsten",
"Klara", "Klasina", "Kris", "Kristel",
"Lana", "Lara", "Laura", "Laurien", "Lena", "Lene", "Leni", "Lenie",
"Lenthe", "Lieke", "Lien", "Lieve", "Linde", "Lindsey", "Lisa", "Lisanne",
"Liset", "Liselotte", "Livia", "Liz", "Liza", "Lizzy", "Loïs", "Lola",
"Lonneke", "Lotte", "Lou", "Louise", "Lova", "Luca", "Lucia", "Lucie",
"Luna",
"Maaike", "Maan", "Maartje", "Maayke", "Madeleine", "Madelief", "Maike",
"Maja", "Malou", "Manon", "Mara", "Mare", "Margot", "Margriet", "Maria",
"Marieke", "Marije", "Marijne", "Marit", "Marja", "Marjan", "Marjolein",
"Marleen", "Marloes", "Marlot", "Marly", "Martha", "Marthe", "Mathilde",
"Maud", "Mees", "Meike", "Melanie", "Melissa", "Merel", "Mette", "Mia",
"Mieke", "Mila", "Milou", "Minke", "Mira", "Mirjam", "Myrthe",
"Naomi", "Natasja", "Nathalie", "Nena", "Nienke", "Nina", "Noa", "Noëlle",
"Noor", "Nora", "Nova",
"Olivia", "Olga",
"Pien", "Pleun",
"Quinty",
"Renske", "Renée", "Rianne", "Riek", "Rika", "Rina", "Rinske", "Rivka",
"Robin", "Romy", "Roos", "Roosmarijn", "Rosa", "Rosalie", "Rosanne",
"Rose", "Rowena", "Ruby",
"Sabine", "Sanne", "Sara", "Sarah", "Sarina", "Saskia", "Selma", "Senna",
"Sera", "Sharon", "Silke", "Sjoukje", "Sofie", "Sophie", "Soraya",
"Sterre", "Susan", "Susanne", "Suzan", "Suzanne", "Suze", "Sylvia",
"Tamar", "Tara", "Tess", "Tessa", "Teuntje", "Thea", "Theodora", "Thera",
"Theresa", "Thirza", "Tine", "Tineke", "Tirza", "Tjitske", "Toos",
"Trijntje", "Truus",
"Valerie", "Veerle", "Vera", "Vera-Lynn", "Veronique", "Victoria", "Vienna",
"Vieve", "Vita", "Vivian", "Vivienne",
"Wende", "Wendy", "Wiep", "Wietske", "Wies", "Wiesje", "Willeke", "Wilma",
"Yara", "Yfke", "Ymkje", "Yolanda", "Yuna",
"Zara", "Zoë", "Zofia", "Zonne", "Zwaantje",
]
def generate_associative_name(tags=None):
"""Return a random evocative name for a new group."""
return random.choice(_NAMES)
def clean_tag(tag): def clean_tag(tag):
return tag.replace("_", " ").strip() return tag.replace("_", " ").strip()
def generate_associative_name(tags):
def generate_associative_description(tags):
""" """
Generate a 'real-alike' associative name based on WD tagger tags. Generate a 'real-alike' associative name based on WD tagger tags.
tags: list of dicts {'tag': str, 'score': float, 'cat': int} tags: list of dicts {'tag': str, 'score': float, 'cat': int}
@@ -44,7 +165,7 @@ def generate_associative_name(tags):
colors = ["red", "blue", "green", "white", "black", "gold", "silver", "pink", "purple", "yellow"] colors = ["red", "blue", "green", "white", "black", "gold", "silver", "pink", "purple", "yellow"]
found_color = next((clean_tag(t['tag']) for t in high_score_tags if clean_tag(t['tag']).split()[0] in colors), None) found_color = next((clean_tag(t['tag']) for t in high_score_tags if clean_tag(t['tag']).split()[0] in colors), None)
if not found_color: if not found_color:
found_color = next((clean_tag(t['tag']) for t in high_score_tags if any(c in t['tag'] for c in colors)), None) found_color = next((clean_tag(t['tag']) for t in high_score_tags if any(c in t['tag'] for c in colors)), None)
# Styles/Atmosphere # Styles/Atmosphere
styles = ["cyberpunk", "fantasy", "realistic", "ethereal", "dark", "bright", "sketch", "oil painting"] styles = ["cyberpunk", "fantasy", "realistic", "ethereal", "dark", "bright", "sketch", "oil painting"]
@@ -52,10 +173,10 @@ def generate_associative_name(tags):
# Build the name # Build the name
templates = [] templates = []
if found_style and subject: if found_style and subject:
templates.append(f"{found_style.title()} {subject}") templates.append(f"{found_style.title()} {subject}")
if found_color and subject: if found_color and subject:
templates.append(f"The {found_color.title()} {subject}") templates.append(f"The {found_color.title()} {subject}")
@@ -89,8 +210,6 @@ def generate_associative_name(tags):
# Return a random template result # Return a random template result
return random.choice(templates) return random.choice(templates)
def get_base_name(name: str) -> str: def get_base_name(name: str) -> str:
"""Remove timestamp prefixes from filename.""" """Remove timestamp prefixes from filename."""
# Matches YYYYMMDD_HHMMSS_
return re.sub(r'^(\d{8}_\d{6}_)+', '', name) return re.sub(r'^(\d{8}_\d{6}_)+', '', name)

2219
tour-comfy/old_car.html Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,39 @@
# Upscale HQ
high quality. detailed.
realistic
# BG Remove
realistic, transparent background
# Feminine
1 female nude.
Hyper realistic.
# Upscale HQ Feminine
high quality.
detailed.
female nude
realistic.
# Three-quarter
Head-on a full-body three-quarter full-nude-body female portrait, realistic, transparent background
# Head-on undress
Head-on straight-on full-nude-body female portrait, realistic, transparent background
# Head-on straight-on
Head-on straight-on full-body female portrait, realistic, no background
# Looking viewer
high quality, full-nude-body, female, masterpiece, realistic, photo, looking at viewer
# Light
high quality, full-nude-body, female, masterpiece, realistic, photo, detailed skin, professional lighting, transparent background
# Drastic Light
high quality, full-nude-body, female, masterpiece, realistic, photo, cinematic lighting, dramatic shadows, sharp focus, transparent background
# The Bride: # The Bride:
Lying flat on her back, bending one leg and bringing it up to the chest, the other leg stretched out. Lying flat on her back, bending one leg and bringing it up to the chest, the other leg stretched out.
Place one arm under your head, and the other arm stretched out to the side. Place one arm under your head, and the other arm stretched out to the side.
@@ -233,7 +269,7 @@ hands at the thighs, fingers hooking into the top of thigh-high stockings or gar
torso leaning forward slightly, shoulders rolled back, chest presented. torso leaning forward slightly, shoulders rolled back, chest presented.
head tilted, lips parted. head tilted, lips parted.
Looking directly into camera. Teasing, anticipatory. Looking directly into camera. Teasing, anticipatory.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Unclasp: # The Unclasp:
standing, back partially turned toward camera over one shoulder. standing, back partially turned toward camera over one shoulder.
@@ -241,7 +277,7 @@ arms reaching behind, hands at the back working to unhook a bra clasp.
elbows drawn inward, shoulder blades prominent. elbows drawn inward, shoulder blades prominent.
hips cocked to one side, weight on one leg. hips cocked to one side, weight on one leg.
Looking back over the shoulder into camera. Inviting, conspiratorial. Looking back over the shoulder into camera. Inviting, conspiratorial.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Strap Slide: # The Strap Slide:
standing, one strap of a slip or camisole slid off the shoulder. standing, one strap of a slip or camisole slid off the shoulder.
@@ -249,7 +285,7 @@ arm relaxed at the side, letting the fabric hang loose on one side.
opposite hand touching the collarbone or trailing down the sternum. opposite hand touching the collarbone or trailing down the sternum.
hip popped, body in a subtle S-curve. hip popped, body in a subtle S-curve.
Looking directly into camera. Seductive, slow. Looking directly into camera. Seductive, slow.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Lace Pull: # The Lace Pull:
lying on back, knees bent, feet flat on the ground. lying on back, knees bent, feet flat on the ground.
@@ -257,7 +293,7 @@ hands at the hips, fingers hooked into the waistband of lace panties.
hips lifted slightly off the ground, fabric being pulled downward. hips lifted slightly off the ground, fabric being pulled downward.
thighs parted slightly, tension in the abdomen. thighs parted slightly, tension in the abdomen.
Looking directly into camera. Vulnerable, exposed. Looking directly into camera. Vulnerable, exposed.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Corset Lace: # The Corset Lace:
standing, back to camera, head turned to look over shoulder. standing, back to camera, head turned to look over shoulder.
@@ -265,15 +301,15 @@ arms reaching behind to pull the laces of a corset tighter.
elbows wide, shoulder blades drawn together, waist cinched narrow. elbows wide, shoulder blades drawn together, waist cinched narrow.
legs straight, feet apart for balance. legs straight, feet apart for balance.
Looking back into camera. Restricted, breathless. Looking back into camera. Restricted, breathless.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Garter Roll: # The Garter Roll (beta):
lying on stomach, propped on elbows. lying on stomach, propped on elbows.
legs bent at the knees, feet kicked up and crossed in the air. legs bent at the knees, feet kicked up and crossed in the air.
hands reaching back to roll a stocking up the calf or thigh. hands reaching back to roll a stocking up the calf or thigh.
back arched, hips slightly lifted, fabric of lingerie riding up. back arched, hips slightly lifted, fabric of lingerie riding up.
Looking back over the shoulder into camera. Playful, coquettish. Looking back over the shoulder into camera. Playful, coquettish.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Hook: # The Hook:
standing facing camera, one leg crossed over the other at the ankle. standing facing camera, one leg crossed over the other at the ankle.
@@ -281,7 +317,7 @@ both hands at the center of the chest, fingers working the hook-and-eye closure
head tilted down, eyes looking up through lashes. head tilted down, eyes looking up through lashes.
shoulders rounded forward, creating a valley of shadow at the cleavage. shoulders rounded forward, creating a valley of shadow at the cleavage.
Looking up into camera. Coy, demure. Looking up into camera. Coy, demure.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Thigh Band: # The Thigh Band:
seated with legs extended forward, torso reclined back on hands. seated with legs extended forward, torso reclined back on hands.
@@ -289,7 +325,7 @@ one knee bent, foot flat on the ground, thigh open.
opposite hand resting on the inner thigh, fingers tracing the edge of a garter band or stocking top. opposite hand resting on the inner thigh, fingers tracing the edge of a garter band or stocking top.
head thrown back slightly, neck exposed. head thrown back slightly, neck exposed.
Looking directly into camera. Languid, indulgent. Looking directly into camera. Languid, indulgent.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, hyper realistic
# The Mirror Check: # The Mirror Check:
standing in three-quarter profile, one hand on the hip. standing in three-quarter profile, one hand on the hip.
@@ -297,7 +333,7 @@ other hand smoothing the fabric of a sheer chemise or babydoll down the side of
weight on the back leg, front leg slightly bent, toe pointed. weight on the back leg, front leg slightly bent, toe pointed.
chin lifted, checking the fit in an implied mirror. chin lifted, checking the fit in an implied mirror.
Looking to the side, eyes catching the camera in reflection. Self-aware, assessing. Looking to the side, eyes catching the camera in reflection. Self-aware, assessing.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, hyper realistic
# The Snap: # The Snap:
standing, legs apart, hands at the crotch of a bodysuit or teddy. standing, legs apart, hands at the crotch of a bodysuit or teddy.
@@ -305,7 +341,7 @@ fingers working the snap closures at the gusset.
torso twisted slightly, one shoulder dropped lower than the other. torso twisted slightly, one shoulder dropped lower than the other.
lips pursed in concentration, then softening into a smile. lips pursed in concentration, then softening into a smile.
Looking directly into camera. Direct, unapologetic. Looking directly into camera. Direct, unapologetic.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, hyper realistic
# The Shoulder Drop: # The Shoulder Drop:
standing, back to camera. standing, back to camera.
@@ -314,7 +350,7 @@ arms hanging loose, fabric pooling at the elbows.
head turned to look back over one shoulder. head turned to look back over one shoulder.
hips swayed to one side, creating a diagonal line from shoulder to hip. hips swayed to one side, creating a diagonal line from shoulder to hip.
Looking back into camera. Revealing, inevitable. Looking back into camera. Revealing, inevitable.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Step-In: # The Step-In:
standing on one leg, opposite leg lifted, foot stepping into the leg opening of panties or a bodysuit. standing on one leg, opposite leg lifted, foot stepping into the leg opening of panties or a bodysuit.
@@ -322,7 +358,7 @@ hands holding the garment open at thigh level.
torso leaning slightly to balance, one arm extended for stability. torso leaning slightly to balance, one arm extended for stability.
head down, watching the fabric glide up the leg. head down, watching the fabric glide up the leg.
Looking down, then up into camera with a half-smile. Intimate, domestic. Looking down, then up into camera with a half-smile. Intimate, domestic.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Pearl Strand: # The Pearl Strand:
lying on back, knees bent and parted, feet flat on the ground. lying on back, knees bent and parted, feet flat on the ground.
@@ -330,15 +366,15 @@ hands at the neck, fingers working to fasten a pearl necklace or choker.
elbows wide, chest lifted, collarbones prominent. elbows wide, chest lifted, collarbones prominent.
head tilted back, throat elongated. head tilted back, throat elongated.
Looking directly into camera. Elegant, adorned. Looking directly into camera. Elegant, adorned.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Glove Tug: # The Glove Tug (beta):
seated on the floor, legs tucked to one side. seated on the floor, legs tucked to one side.
one arm extended, fingers of the opposite hand slowly pulling a long satin or lace glove up the forearm. one arm extended, fingers of the opposite hand slowly pulling a long satin or lace glove up the forearm.
head turned to watch the motion, lips slightly parted. head turned to watch the motion, lips slightly parted.
shoulders relaxed, back curved in a gentle C-shape. shoulders relaxed, back curved in a gentle C-shape.
Looking at the glove, then into camera. Methodical, sensual. Looking at the glove, then into camera. Methodical, sensual.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Ribbon Tie: # The Ribbon Tie:
standing, legs apart, hands behind the back at the waist. standing, legs apart, hands behind the back at the waist.
@@ -346,7 +382,7 @@ fingers working to tie a satin ribbon or bow at the small of the back.
torso twisted to expose the side, ribs visible with the stretch. torso twisted to expose the side, ribs visible with the stretch.
head turned over the shoulder, chin lifted. head turned over the shoulder, chin lifted.
Looking back into camera. Decorative, bound. Looking back into camera. Decorative, bound.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Hem Lift: # The Hem Lift:
standing, legs crossed at the ankles. standing, legs crossed at the ankles.
@@ -354,7 +390,7 @@ both hands at the sides of a short slip or nightgown, fingers pinching the hem.
fabric lifted slowly, revealing the upper thighs. fabric lifted slowly, revealing the upper thighs.
weight shifted to one hip, creating a diagonal line. weight shifted to one hip, creating a diagonal line.
Looking directly into camera, chin down, eyes up. Provocative, measured. Looking directly into camera, chin down, eyes up. Provocative, measured.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Clasp Front: # The Clasp Front:
lying on side, propped on one elbow. lying on side, propped on one elbow.
@@ -362,7 +398,7 @@ free hand at the center of the chest, working the front clasp of a bra.
fingers pinching the metal closure, about to release it. fingers pinching the metal closure, about to release it.
top leg bent and drawn forward, knee resting on the ground. top leg bent and drawn forward, knee resting on the ground.
Looking directly into camera. Anticipatory, breath held. Looking directly into camera. Anticipatory, breath held.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Sash Untie: # The Sash Untie:
standing, one hand on the hip. standing, one hand on the hip.
@@ -370,7 +406,7 @@ other hand pulling the end of a silk sash or robe tie.
hips cocked, weight on the back leg. hips cocked, weight on the back leg.
fabric beginning to part at the waist, hinting at what lies beneath. fabric beginning to part at the waist, hinting at what lies beneath.
Looking directly into camera. Unwrapping, revelatory. Looking directly into camera. Unwrapping, revelatory.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Zipper Pull: # The Zipper Pull:
standing in profile, one shoulder dropped toward camera. standing in profile, one shoulder dropped toward camera.
@@ -378,7 +414,7 @@ arm reaching behind the back, fingers finding the pull of a side or back zipper.
head turned to look back, neck stretched. head turned to look back, neck stretched.
zipper descending slowly, fabric parting along the spine or side. zipper descending slowly, fabric parting along the spine or side.
Looking back into camera. Mechanical, inevitable. Looking back into camera. Mechanical, inevitable.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Stocking Peel: # The Stocking Peel:
seated, one leg extended, the other bent with foot flat on the ground. seated, one leg extended, the other bent with foot flat on the ground.
@@ -386,7 +422,7 @@ hands at the ankle of the extended leg, slowly peeling a stocking downward.
toe pointed, arch of the foot visible as the fabric reveals skin. toe pointed, arch of the foot visible as the fabric reveals skin.
torso leaning forward, hair falling over one shoulder. torso leaning forward, hair falling over one shoulder.
Looking at the leg, then into camera. Unveiling, deliberate. Looking at the leg, then into camera. Unveiling, deliberate.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Halter Knot: # The Halter Knot:
standing, back to camera, arms raised overhead. standing, back to camera, arms raised overhead.
@@ -394,7 +430,7 @@ hands at the nape of the neck, tying or untying the knot of a halter top.
elbows wide, shoulder blades drawn together, back muscles defined. elbows wide, shoulder blades drawn together, back muscles defined.
spine straight, hips narrow. spine straight, hips narrow.
Looking back over the shoulder into camera. Taut, suspended. Looking back over the shoulder into camera. Taut, suspended.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Garter Snap: # The Garter Snap:
lying on back, one knee bent, foot flat, the other leg extended. lying on back, one knee bent, foot flat, the other leg extended.
@@ -402,7 +438,7 @@ hand at the inner thigh, fingers snapping the clasp of a garter to a stocking.
hips slightly rotated to expose the attachment point. hips slightly rotated to expose the attachment point.
head turned to the side, watching the action. head turned to the side, watching the action.
Looking at the hand, then into camera. Precise, functional. Looking at the hand, then into camera. Precise, functional.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Drape: # The Drape:
standing, one hand holding a sheer robe or kimono open at the chest. standing, one hand holding a sheer robe or kimono open at the chest.
@@ -410,7 +446,7 @@ other arm hanging loose at the side.
shoulders back, one hip popped, fabric cascading down the body. shoulders back, one hip popped, fabric cascading down the body.
head tilted, hair falling over one eye. head tilted, hair falling over one eye.
Looking directly into camera. Framed, theatrical. Looking directly into camera. Framed, theatrical.
Perfect anatomy, realistic, trying on erotic lingerie Perfect anatomy, realistic
# The Fold: # The Fold:
seated on the floor, legs spread wide in a straddle. seated on the floor, legs spread wide in a straddle.
@@ -536,14 +572,14 @@ weight distributed evenly between hands and feet.
Looking backward, upside down, into camera. Inverted, expansive. Looking backward, upside down, into camera. Inverted, expansive.
Perfect anatomy, realistic Perfect anatomy, realistic
# The Spiral: # The Spiral (beta):
standing, feet apart. standing, feet apart.
torso twisted deeply, one shoulder forward, the other back. torso twisted deeply, one shoulder forward, the other back.
arms extended to the sides, following the twist of the torso. arms extended to the sides, following the twist of the torso.
head turned to look over the forward shoulder. head turned to look over the forward shoulder.
hips squared, lower body stable, upper body rotated. hips squared, lower body stable, upper body rotated.
Looking back over the shoulder into camera. Wound, coiled. Looking back over the shoulder into camera.
Perfect anatomy, realistic Perfect anatomy, natural, realistic
# The Ballerina: # The Ballerina:
standing on the toes of one foot, opposite leg extended straight back, lifted high. standing on the toes of one foot, opposite leg extended straight back, lifted high.
@@ -570,7 +606,7 @@ torso leaning slightly toward the extended leg.
Looking directly into camera. Poised, watchful. Looking directly into camera. Poised, watchful.
Perfect anatomy, realistic Perfect anatomy, realistic
# The Bow: # The Bow (beta):
lying on stomach, knees bent, feet lifted toward the head. lying on stomach, knees bent, feet lifted toward the head.
arms reaching back to grasp the ankles or feet. arms reaching back to grasp the ankles or feet.
chest and thighs lifted off the ground, body forming a taut bow. chest and thighs lifted off the ground, body forming a taut bow.
@@ -587,7 +623,7 @@ body forming a wide, open V-shape.
Looking directly into camera. Open, radiant. Looking directly into camera. Open, radiant.
Perfect anatomy, realistic Perfect anatomy, realistic
# The Sickle: # The Sickle (beta):
lying on back, legs lifted and bent. lying on back, legs lifted and bent.
knees drawing toward the chest, then extending and lowering toward the head. knees drawing toward the chest, then extending and lowering toward the head.
feet arched, toes pointing toward the ground behind the head. feet arched, toes pointing toward the ground behind the head.
@@ -614,21 +650,21 @@ other arm wrapping around the back or reaching overhead.
Looking down, then into camera. Directed, focused. Looking down, then into camera. Directed, focused.
Perfect anatomy, realistic Perfect anatomy, realistic
# The Vessel: # The Vessel (beta):
lying on back, knees bent, feet flat on the ground. lying on back, knees bent, feet flat on the ground.
arms extended overhead, hands clasped or holding the knees. arms extended overhead, hands clasped.
hips lifted slightly, lower back arched. hips lifted slightly, lower back arched.
chest open, throat exposed. chest open, throat exposed.
body forming a shallow bowl or vessel shape. body forming a shallow bowl or vessel shape.
Looking directly into camera. Receptive, open. Looking directly into camera. Receptive, open.
Perfect anatomy, realistic Perfect anatomy, realistic
# The Quiver: # The Quiver (beta):
lying on stomach, legs together, arms at the sides. lying on stomach, legs together, arms at the sides.
torso lifted in a backbend, chest and shoulders arching upward. torso lifted in a backbend, chest and shoulders arching upward.
head thrown back, neck stretched. head thrown back, neck stretched.
legs remain on the ground, feet pointed. legs remain on the ground, feet pointed.
body forming a gentle, upward curve from hips. body forming a gentle, upward curve from hips to head.
Looking upward, not at camera. Trembling, stretched. Looking upward, not at camera. Trembling, stretched.
Perfect anatomy, realistic Perfect anatomy, realistic

View File

@@ -1,115 +1,106 @@
{ {
"img_2.png": "2a721fdedc31f4ee11fd7c8ab85a4b33",
"img_19.png": "82660461b10e0545165fe8dade87d4d2",
"img.png": "6023644b2237fe301e43431e28a9d2e9",
"img_4.png": "3c87ca4219c2ed6f275c044fa888afc0",
"img_3.png": "3c87ca4219c2ed6f275c044fa888afc0",
"img_5.png": "3c87ca4219c2ed6f275c044fa888afc0",
"imgxx.png": "861b244b0aa205b8fdff4015a128a5a4",
"img_1.png": "4c09437df56a8beb2a620f420a4d4d5a",
"img_6.png": "7ad3913d8fea47ea120a8e958dd2fc62",
"img_7.png": "2ad545906c6b99cac1a78305a37a5eed",
"img_8.png": "4c453e8e332e92478bf0d49e663dedc9",
"img_9.png": "7e35f295100f51a9a58533c8d1f1fc80",
"test_timestamp.png": "d41b2ed22d4562d6aa0b7dd2248f18a2",
"img_91.png": "7e35f295100f51a9a58533c8d1f1fc80",
"test.png": "e569b50c015080e05e36f21307550e1a",
"img_19_2.png": "e745ea158afbf416df6c53835c11f4c7",
"img_93.png": "ab83477ac7782d7a7b38369ccfa7df80",
"img_92.png": "7e35f295100f51a9a58533c8d1f1fc80",
"imgxxx.png": "8965337a6abd7bfec6cb774978b4198b",
"img_10.png": "10635b82a1cfcefb2c97af2ebd61d889",
"img_12.png": "3b126df55d41bb48829650a766e3c6f3",
"img_11.png": "c5e036773ead71f40a1f1966f74abc2b",
"other.jpeg": "b89b5886901ba89c5d3fcd97430904e8",
"others.jpeg": "b89b5886901ba89c5d3fcd97430904e8",
"img_6v1.png": "7ad3913d8fea47ea120a8e958dd2fc62",
"image.png": "7ad3913d8fea47ea120a8e958dd2fc62",
"test123.jpeg": "b89b5886901ba89c5d3fcd97430904e8",
"img_13.png": "5fb9fc29ca1d32c4ab6816160fcfdfe1",
"img_14.png": "759b2e7532f7bf3a0d956a7f1c4cb7af",
"img_15.png": "cbd90cb2e2edf2e4eff746c586657ad5",
"img_16.png": "9c76b232aacf1f18739b323f5b6887d7",
"img_17.png": "9955e08008340d6b2acd945cc4d9505a",
"img_18.png": "5a50839c5d5a726b5b0e770bb266f6d6",
"img_20.png": "29d28ef9f53d71c066798c46341d30a9",
"img_run.png": "72ddfe64a1cea5611ea61425f4f61fd2",
"img_21.png": "82660461b10e0545165fe8dade87d4d2",
"img_22.png": "4c9adb619b5f191d9b76d1493df211c6",
"img_23.png": "2ab193e0c19cec124764f9f54383ef2d",
"img_24.png": "942d5409a0e4c70b4f960bc6468269e2",
"imgxxxx.png": "8965337a6abd7bfec6cb774978b4198b",
"img_25.png": "1d51cc605017423c0ae114f0b883bfea",
"img_26.png": "23ef7f416f21ca3d5d237ecfdc88833e",
"img_27.png": "9bb13a4ca7292c964fedd91065af64a0",
"img_28.png": "37a7ac25c45ec63a87e04c9fe3b73aab",
"img_29.png": "5ed1e8acd413beb7165da9880d6b052d",
"img_30.png": "d907cf83d022af0545b55842f2573581",
"img_31.png": "312874252c58cbb89c8cad46bc17e7e7",
"img_32.png": "4d5ca98a255d51d5775725136f13a162", "img_32.png": "4d5ca98a255d51d5775725136f13a162",
"img_34.png": "c5f814c539acc7cdef0da3279544e55f", "img_24.png": "942d5409a0e4c70b4f960bc6468269e2",
"img_33.png": "c5f814c539acc7cdef0da3279544e55f",
"img_37.png": "fefa5a1bb755fb0d4f03d966ac04dae3",
"img_35.png": "ed1e95446696a97f46d84b246d01e0f7",
"img_36.png": "ed1e95446696a97f46d84b246d01e0f7",
"img_38.png": "dad813a6e3e919454ba1ff0fb3f8df22",
"img_39.png": "732cda29c3f658a9847239d23cbe759b",
"img_40.png": "6022fd6b8a4580ef4451c3c87e469b85",
"img_42.png": "a4578fb780c2424581d72c862e14af6c",
"img_41.png": "8871248c6da117c9b4318bcc6942c17a",
"img_45.png": "2329402c6d8c5b7555a7432eb1aeccd9",
"img_43.png": "e1d75f3326dd89c39fa91b9aaa0b54f9",
"img_44.png": "6196e5ba2bb6fb46459c44543e0eeb64",
"img_46.png": "3c73192c04ca22cc4ecb450565315798",
"img_47.png": "2fb600fb8f3717bd79a9f56fa32efb0b",
"20150913_211324.jpg": "bb75b92835207e81287a392f17f88eaf",
"20160903_200935.jpg": "1cf5a582c8a40610640898ebaee2ade3",
"20160903_200728.jpg": "7c93ad8f71045b07aeb390e0c906d5f2",
"img_49.png": "bd72afa8e00ffff04dc8e860af058d0d",
"img_48.png": "b6daebc286bc1c22a586ee1233c5b420",
"img_50.png": "6f8b764e0973cb5c34b0c02f79b202ca",
"img_51.png": "851612780583d06942c119b2c99b7b06",
"img_52.png": "935946efb74fc333f41146691a61cc8f",
"img_57.png": "514f89464e3c79bba7928b69ed01650e",
"img_53.png": "ce7e90270592666da95b0c638d10d745",
"img_58.png": "4fae0cf0017c9be9a550792167d60ce3",
"img_54.png": "0d70e4782c2823f2f8d2b4c149a38e0b",
"img_55.png": "ce7e90270592666da95b0c638d10d745",
"img_56.png": "1501a3128f19392124e727121a8f2bd4",
"img_59.png": "4fae0cf0017c9be9a550792167d60ce3",
"img_60.png": "2c31cb016cad120daaf4e441a720a56c",
"img_61.png": "68b1c7a9596ab2f0ff038bb585d7c4d4",
"img_62.png": "c2c444a31001421a69dbc9ecf8588149",
"img_64.png": "d5b235b57e6ec07e790f35b9cda399fb",
"img_63.png": "b454d1869a8fc62ed1dc988467b541db",
"img_66.png": "59e227fc6b06a2cd27659a9facf43c0d",
"img_65.png": "c442724f5a29468eed4e9563e25e06e8",
"img_68.png": "4c7fbe72509ab5b08ccdab726b5ff035",
"img_67.png": "1970b9952e14688c22f8f54ea7d7b4ec",
"img_69.png": "0bcf667d5603a157159052baddbb6e50",
"img_70.png": "0bcf667d5603a157159052baddbb6e50",
"img_71.png": "b3e79f4ff2882360b24f77a295f16650",
"img_72.png": "ebd8cd52977b7fccc6ecff7ee2f392b5",
"img_73.png": "28c91d6bc883ed6de89b62755d5417b9",
"img_74.png": "b7c41d0f4c062cc7d7da240173a1f075",
"img_75.png": "7b405fc4a4e022a272e5f09c7c485712",
"img_76.png": "29b9c219a777155d576b9f35a3f41cca",
"img_77.png": "6db31602d0ed36abc2d92a88fdcc21b0",
"img_78.png": "15e83866d2f2afb2ee1e8d2a06a70b9d", "img_78.png": "15e83866d2f2afb2ee1e8d2a06a70b9d",
"img_44.png": "6196e5ba2bb6fb46459c44543e0eeb64",
"img_41.png": "8871248c6da117c9b4318bcc6942c17a",
"img_55.png": "ce7e90270592666da95b0c638d10d745",
"img_23.png": "2ab193e0c19cec124764f9f54383ef2d",
"img_53.png": "ce7e90270592666da95b0c638d10d745",
"img_56.png": "1501a3128f19392124e727121a8f2bd4",
"img_30.png": "d907cf83d022af0545b55842f2573581",
"img_58.png": "4fae0cf0017c9be9a550792167d60ce3",
"img_79.png": "ab18eb4ce243db0f81f608d744596885", "img_79.png": "ab18eb4ce243db0f81f608d744596885",
"imgxx.png": "861b244b0aa205b8fdff4015a128a5a4",
"img_80.png": "de8dfcb0d6eeda8187783e8417f04b8b", "img_80.png": "de8dfcb0d6eeda8187783e8417f04b8b",
"img_81.png": "072948a36c4ba79f4e761a9491f3d8eb", "img_21.png": "82660461b10e0545165fe8dade87d4d2",
"img_82.png": "724fcb641da5f3294aa800ce0a9b93e4", "img_72.png": "ebd8cd52977b7fccc6ecff7ee2f392b5",
"img_84.png": "f5dea766c46abfa4011c23d3c466d8dc", "img_28.png": "37a7ac25c45ec63a87e04c9fe3b73aab",
"img_85.png": "f48059d59efd33ec8cce4daa44bbd46d", "img_73.png": "28c91d6bc883ed6de89b62755d5417b9",
"img_83.png": "501207e02d72776b65d705db9f28a179",
"img_86.png": "9e831c994a69ee1e18a6d279d69c072f",
"img_87.png": "4ce165b53df962d9e371124bfdec64bd",
"img_88.png": "7a22effc45850ecd53670827e0608e97", "img_88.png": "7a22effc45850ecd53670827e0608e97",
"20260618_045234_test_clipboard.png": "9cd53a2f405bebbac4a21dded0f12e34", "img_16.png": "9c76b232aacf1f18739b323f5b6887d7",
"20260618_045450_test_clipboard.png": "9cd53a2f405bebbac4a21dded0f12e34", "img_63.png": "b454d1869a8fc62ed1dc988467b541db",
"20260618_045549_test_clipboard.png": "9cd53a2f405bebbac4a21dded0f12e34", "img_3.png": "3c87ca4219c2ed6f275c044fa888afc0",
"20260618_050846_img_4.png": "b18d89c79c74df97f1a7f106ece9d946", "img_18.png": "5a50839c5d5a726b5b0e770bb266f6d6",
"20260618_051435_test_group.png": "bb550daac9e09ead5487e984b18d4b13", "img_22.png": "4c9adb619b5f191d9b76d1493df211c6",
"20260618_051426_test_group.png": "bb550daac9e09ead5487e984b18d4b13" "img_77.png": "6db31602d0ed36abc2d92a88fdcc21b0",
"image.png": "7ad3913d8fea47ea120a8e958dd2fc62",
"img_71.png": "b3e79f4ff2882360b24f77a295f16650",
"20150913_211324.jpg": "bb75b92835207e81287a392f17f88eaf",
"img_52.png": "935946efb74fc333f41146691a61cc8f",
"img_54.png": "0d70e4782c2823f2f8d2b4c149a38e0b",
"img_2.png": "2a721fdedc31f4ee11fd7c8ab85a4b33",
"img_6.png": "7ad3913d8fea47ea120a8e958dd2fc62",
"imgxxxx.png": "8965337a6abd7bfec6cb774978b4198b",
"img_48.png": "b6daebc286bc1c22a586ee1233c5b420",
"img_66.png": "59e227fc6b06a2cd27659a9facf43c0d",
"img_50.png": "6f8b764e0973cb5c34b0c02f79b202ca",
"20160903_200935.jpg": "1cf5a582c8a40610640898ebaee2ade3",
"img_62.png": "c2c444a31001421a69dbc9ecf8588149",
"img_82.png": "724fcb641da5f3294aa800ce0a9b93e4",
"img_57.png": "514f89464e3c79bba7928b69ed01650e",
"img_7.png": "2ad545906c6b99cac1a78305a37a5eed",
"img_67.png": "1970b9952e14688c22f8f54ea7d7b4ec",
"img_37.png": "fefa5a1bb755fb0d4f03d966ac04dae3",
"img_6v1.png": "7ad3913d8fea47ea120a8e958dd2fc62",
"img_26.png": "23ef7f416f21ca3d5d237ecfdc88833e",
"img_75.png": "7b405fc4a4e022a272e5f09c7c485712",
"img_64.png": "d5b235b57e6ec07e790f35b9cda399fb",
"img_31.png": "312874252c58cbb89c8cad46bc17e7e7",
"img_45.png": "2329402c6d8c5b7555a7432eb1aeccd9",
"img_68.png": "4c7fbe72509ab5b08ccdab726b5ff035",
"img_29.png": "5ed1e8acd413beb7165da9880d6b052d",
"img_1.png": "4c09437df56a8beb2a620f420a4d4d5a",
"img_39.png": "732cda29c3f658a9847239d23cbe759b",
"img_87.png": "4ce165b53df962d9e371124bfdec64bd",
"20160903_200728.jpg": "7c93ad8f71045b07aeb390e0c906d5f2",
"img_61.png": "68b1c7a9596ab2f0ff038bb585d7c4d4",
"img_12.png": "3b126df55d41bb48829650a766e3c6f3",
"img_85.png": "f48059d59efd33ec8cce4daa44bbd46d",
"img_69.png": "0bcf667d5603a157159052baddbb6e50",
"img_8.png": "4c453e8e332e92478bf0d49e663dedc9",
"img_92.png": "7e35f295100f51a9a58533c8d1f1fc80",
"img_35.png": "ed1e95446696a97f46d84b246d01e0f7",
"img_81.png": "072948a36c4ba79f4e761a9491f3d8eb",
"img_27.png": "9bb13a4ca7292c964fedd91065af64a0",
"img_33.png": "c5f814c539acc7cdef0da3279544e55f",
"img_47.png": "2fb600fb8f3717bd79a9f56fa32efb0b",
"img_5.png": "3c87ca4219c2ed6f275c044fa888afc0",
"img_46.png": "3c73192c04ca22cc4ecb450565315798",
"img_25.png": "1d51cc605017423c0ae114f0b883bfea",
"img_14.png": "759b2e7532f7bf3a0d956a7f1c4cb7af",
"img_93.png": "ab83477ac7782d7a7b38369ccfa7df80",
"img_10.png": "10635b82a1cfcefb2c97af2ebd61d889",
"img_13.png": "5fb9fc29ca1d32c4ab6816160fcfdfe1",
"img_65.png": "c442724f5a29468eed4e9563e25e06e8",
"img_36.png": "ed1e95446696a97f46d84b246d01e0f7",
"img_19.png": "82660461b10e0545165fe8dade87d4d2",
"img_51.png": "851612780583d06942c119b2c99b7b06",
"img_38.png": "dad813a6e3e919454ba1ff0fb3f8df22",
"img_20.png": "29d28ef9f53d71c066798c46341d30a9",
"img_34.png": "c5f814c539acc7cdef0da3279544e55f",
"img_19_2.png": "e745ea158afbf416df6c53835c11f4c7",
"img_91.png": "7e35f295100f51a9a58533c8d1f1fc80",
"test123.jpeg": "b89b5886901ba89c5d3fcd97430904e8",
"img_49.png": "bd72afa8e00ffff04dc8e860af058d0d",
"test.png": "e569b50c015080e05e36f21307550e1a",
"img_40.png": "6022fd6b8a4580ef4451c3c87e469b85",
"img_83.png": "501207e02d72776b65d705db9f28a179",
"img_70.png": "0bcf667d5603a157159052baddbb6e50",
"img_15.png": "cbd90cb2e2edf2e4eff746c586657ad5",
"imgxxx.png": "8965337a6abd7bfec6cb774978b4198b",
"img_86.png": "9e831c994a69ee1e18a6d279d69c072f",
"img_11.png": "c5e036773ead71f40a1f1966f74abc2b",
"img_4.png": "3c87ca4219c2ed6f275c044fa888afc0",
"img_9.png": "7e35f295100f51a9a58533c8d1f1fc80",
"img_76.png": "29b9c219a777155d576b9f35a3f41cca",
"img_run.png": "72ddfe64a1cea5611ea61425f4f61fd2",
"img_59.png": "4fae0cf0017c9be9a550792167d60ce3",
"img_74.png": "b7c41d0f4c062cc7d7da240173a1f075",
"img.png": "6023644b2237fe301e43431e28a9d2e9",
"img_17.png": "9955e08008340d6b2acd945cc4d9505a",
"img_60.png": "2c31cb016cad120daaf4e441a720a56c",
"img_84.png": "f5dea766c46abfa4011c23d3c466d8dc",
"img_43.png": "e1d75f3326dd89c39fa91b9aaa0b54f9",
"img_42.png": "a4578fb780c2424581d72c862e14af6c"
} }

View File

@@ -1349,3 +1349,688 @@ SyntaxError: broken PNG file (chunk b'END\xae')
2026-06-18 22:31:18,891 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage... 2026-06-18 22:31:18,891 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-18 22:31:18,891 - INFO - Output directory: /mnt/zim/tour-comfy/output 2026-06-18 22:31:18,891 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-18 22:31:18,891 - INFO - API URL: http://127.0.0.1:8500/edit 2026-06-18 22:31:18,891 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-18 23:40:49,290 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-18 23:40:49,290 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-18 23:40:49,291 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 01:12:51,333 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 01:12:51,333 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 01:12:51,333 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 01:27:41,007 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 01:27:41,007 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 01:27:41,007 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 02:51:36,835 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 02:51:36,835 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 02:51:36,835 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 04:31:56,640 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 04:31:56,640 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 04:31:56,640 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 04:33:26,942 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 04:33:26,942 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 04:33:26,942 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 04:54:47,346 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 04:54:47,346 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 04:54:47,346 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 12:39:49,176 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 12:39:49,176 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 12:39:49,176 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 19:39:35,852 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 19:39:35,854 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 19:39:35,854 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 19:53:51,980 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 19:53:51,983 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 19:53:51,983 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 19:56:28,725 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 19:56:28,725 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 19:56:28,725 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 19:57:23,120 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 19:57:23,120 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 19:57:23,120 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 22:29:55,648 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 22:29:55,648 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 22:29:55,648 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 22:29:56,648 - INFO - Starting processing for img_32.png...
2026-06-19 22:29:56,650 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_32.png to (13, 55, 129, 389) (margin=10, top_margin=20)
2026-06-19 22:29:56,650 - INFO - Adding 16px headroom to /mnt/zim/tour-comfy/stage/img_32.png
2026-06-19 22:29:56,656 - INFO - Calling API for img_32.png -> 20260619_222956_img_32.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:30:18,770 - INFO - Successfully processed img_32.png -> /mnt/zim/tour-comfy/output/20260619_222956_img_32.png
2026-06-19 22:30:18,793 - INFO - Parsing model identifier. Schema: None, Identifier: ViT-H-14
2026-06-19 22:30:18,793 - INFO - Loaded built-in ViT-H-14 model config.
2026-06-19 22:30:18,970 - INFO - HTTP Request: HEAD https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K/resolve/main/open_clip_model.safetensors "HTTP/1.1 302 Found"
2026-06-19 22:30:18,972 - INFO - Instantiating model architecture: CLIP
2026-06-19 22:30:22,576 - INFO - Loading full pretrained weights from: /home/mike/.cache/huggingface/hub/models--laion--CLIP-ViT-H-14-laion2B-s32B-b79K/snapshots/1c2b8495b28150b8a4922ee1c8edee224c284c0c/open_clip_model.safetensors
2026-06-19 22:30:23,325 - INFO - Final image preprocessing configuration set: {'size': (224, 224), 'mode': 'RGB', 'mean': (0.48145466, 0.4578275, 0.40821073), 'std': (0.26862954, 0.26130258, 0.27577711), 'interpolation': 'bicubic', 'resize_mode': 'shortest', 'fill_color': 0}
2026-06-19 22:30:23,325 - INFO - Model ViT-H-14 creation process complete.
2026-06-19 22:30:29,949 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 747 images
2026-06-19 22:30:30,950 - INFO - Starting processing for img_24.png...
2026-06-19 22:30:30,950 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_24.png to (11, 42, 111, 304) (margin=10, top_margin=20)
2026-06-19 22:30:30,951 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_24.png
2026-06-19 22:30:30,952 - INFO - Calling API for img_24.png -> 20260619_223030_img_24.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:30:39,631 - INFO - Successfully processed img_24.png -> /mnt/zim/tour-comfy/output/20260619_223030_img_24.png
2026-06-19 22:30:39,791 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 748 images
2026-06-19 22:30:40,792 - INFO - Starting processing for img_78.png...
2026-06-19 22:30:40,796 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_78.png to (0, 0, 287, 574) (margin=10, top_margin=20)
2026-06-19 22:30:40,796 - INFO - Adding 28px headroom to /mnt/zim/tour-comfy/stage/img_78.png
2026-06-19 22:30:40,842 - INFO - Calling API for img_78.png -> 20260619_223040_img_78.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:30:49,999 - INFO - Successfully processed img_78.png -> /mnt/zim/tour-comfy/output/20260619_223040_img_78.png
2026-06-19 22:30:50,161 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 749 images
2026-06-19 22:30:51,162 - INFO - Starting processing for img_44.png...
2026-06-19 22:30:51,163 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_44.png to (32, 57, 220, 396) (margin=10, top_margin=20)
2026-06-19 22:30:51,163 - INFO - Adding 16px headroom to /mnt/zim/tour-comfy/stage/img_44.png
2026-06-19 22:30:51,167 - INFO - Calling API for img_44.png -> 20260619_223051_img_44.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:31:00,240 - INFO - Successfully processed img_44.png -> /mnt/zim/tour-comfy/output/20260619_223051_img_44.png
2026-06-19 22:31:00,392 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 750 images
2026-06-19 22:31:01,393 - INFO - Starting processing for img_41.png...
2026-06-19 22:31:01,395 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_41.png to (60, 88, 284, 554) (margin=10, top_margin=20)
2026-06-19 22:31:01,395 - INFO - Adding 23px headroom to /mnt/zim/tour-comfy/stage/img_41.png
2026-06-19 22:31:01,406 - INFO - Calling API for img_41.png -> 20260619_223101_img_41.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:31:10,485 - INFO - Successfully processed img_41.png -> /mnt/zim/tour-comfy/output/20260619_223101_img_41.png
2026-06-19 22:31:10,668 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 751 images
2026-06-19 22:31:11,669 - INFO - Starting processing for img_55.png...
2026-06-19 22:31:11,670 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_55.png to (14, 40, 114, 298) (margin=10, top_margin=20)
2026-06-19 22:31:11,670 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_55.png
2026-06-19 22:31:11,673 - INFO - Calling API for img_55.png -> 20260619_223111_img_55.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:31:24,846 - INFO - Successfully processed img_55.png -> /mnt/zim/tour-comfy/output/20260619_223111_img_55.png
2026-06-19 22:31:25,081 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 752 images
2026-06-19 22:31:26,083 - INFO - Starting processing for img_23.png...
2026-06-19 22:31:26,084 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_23.png to (23, 54, 174, 364) (margin=10, top_margin=20)
2026-06-19 22:31:26,084 - INFO - Adding 15px headroom to /mnt/zim/tour-comfy/stage/img_23.png
2026-06-19 22:31:26,089 - INFO - Calling API for img_23.png -> 20260619_223126_img_23.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:31:39,670 - INFO - Successfully processed img_23.png -> /mnt/zim/tour-comfy/output/20260619_223126_img_23.png
2026-06-19 22:31:39,941 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 753 images
2026-06-19 22:31:40,941 - INFO - Starting processing for img_53.png...
2026-06-19 22:31:40,942 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_53.png to (14, 40, 114, 298) (margin=10, top_margin=20)
2026-06-19 22:31:40,942 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_53.png
2026-06-19 22:31:40,945 - INFO - Calling API for img_53.png -> 20260619_223140_img_53.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:31:54,022 - INFO - Successfully processed img_53.png -> /mnt/zim/tour-comfy/output/20260619_223140_img_53.png
2026-06-19 22:31:54,216 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 754 images
2026-06-19 22:31:55,216 - INFO - Starting processing for img_56.png...
2026-06-19 22:31:55,217 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_56.png to (20, 36, 154, 282) (margin=10, top_margin=20)
2026-06-19 22:31:55,217 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_56.png
2026-06-19 22:31:55,221 - INFO - Calling API for img_56.png -> 20260619_223155_img_56.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:32:04,813 - INFO - Successfully processed img_56.png -> /mnt/zim/tour-comfy/output/20260619_223155_img_56.png
2026-06-19 22:32:04,984 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 755 images
2026-06-19 22:32:05,985 - INFO - Starting processing for img_30.png...
2026-06-19 22:32:05,986 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_30.png to (29, 50, 181, 364) (margin=10, top_margin=20)
2026-06-19 22:32:05,986 - INFO - Adding 15px headroom to /mnt/zim/tour-comfy/stage/img_30.png
2026-06-19 22:32:05,990 - INFO - Calling API for img_30.png -> 20260619_223205_img_30.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:32:17,621 - INFO - Successfully processed img_30.png -> /mnt/zim/tour-comfy/output/20260619_223205_img_30.png
2026-06-19 22:32:17,807 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 756 images
2026-06-19 22:32:18,808 - INFO - Starting processing for img_58.png...
2026-06-19 22:32:18,810 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_58.png to (0, 0, 179, 474) (margin=10, top_margin=20)
2026-06-19 22:32:18,810 - INFO - Adding 23px headroom to /mnt/zim/tour-comfy/stage/img_58.png
2026-06-19 22:32:18,825 - INFO - Calling API for img_58.png -> 20260619_223218_img_58.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:32:27,445 - INFO - Successfully processed img_58.png -> /mnt/zim/tour-comfy/output/20260619_223218_img_58.png
2026-06-19 22:32:27,632 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 757 images
2026-06-19 22:32:28,634 - INFO - Starting processing for img_79.png...
2026-06-19 22:32:28,635 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_79.png to (0, 0, 194, 415) (margin=10, top_margin=20)
2026-06-19 22:32:28,635 - INFO - Adding 20px headroom to /mnt/zim/tour-comfy/stage/img_79.png
2026-06-19 22:32:28,657 - INFO - Calling API for img_79.png -> 20260619_223228_img_79.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:32:37,787 - INFO - Successfully processed img_79.png -> /mnt/zim/tour-comfy/output/20260619_223228_img_79.png
2026-06-19 22:32:37,962 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 758 images
2026-06-19 22:32:38,963 - INFO - Starting processing for imgxx.png...
2026-06-19 22:32:38,963 - INFO - Cropping /mnt/zim/tour-comfy/stage/imgxx.png to (0, 0, 100, 149) (margin=10, top_margin=20)
2026-06-19 22:32:38,963 - INFO - Adding 7px headroom to /mnt/zim/tour-comfy/stage/imgxx.png
2026-06-19 22:32:38,966 - INFO - Calling API for imgxx.png -> 20260619_223238_imgxx.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:32:48,265 - INFO - Successfully processed imgxx.png -> /mnt/zim/tour-comfy/output/20260619_223238_imgxx.png
2026-06-19 22:32:48,428 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 759 images
2026-06-19 22:32:49,429 - INFO - Starting processing for img_80.png...
2026-06-19 22:32:49,431 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_80.png to (0, 0, 211, 332) (margin=10, top_margin=20)
2026-06-19 22:32:49,431 - INFO - Adding 16px headroom to /mnt/zim/tour-comfy/stage/img_80.png
2026-06-19 22:32:49,451 - INFO - Calling API for img_80.png -> 20260619_223249_img_80.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:32:58,587 - INFO - Successfully processed img_80.png -> /mnt/zim/tour-comfy/output/20260619_223249_img_80.png
2026-06-19 22:32:58,743 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 760 images
2026-06-19 22:32:59,744 - INFO - Starting processing for img_21.png...
2026-06-19 22:32:59,745 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_21.png to (27, 57, 175, 375) (margin=10, top_margin=20)
2026-06-19 22:32:59,745 - INFO - Adding 15px headroom to /mnt/zim/tour-comfy/stage/img_21.png
2026-06-19 22:32:59,749 - INFO - Calling API for img_21.png -> 20260619_223259_img_21.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:33:08,824 - INFO - Successfully processed img_21.png -> /mnt/zim/tour-comfy/output/20260619_223259_img_21.png
2026-06-19 22:33:08,977 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 761 images
2026-06-19 22:33:09,978 - INFO - Starting processing for img_72.png...
2026-06-19 22:33:09,980 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_72.png to (0, 0, 199, 383) (margin=10, top_margin=20)
2026-06-19 22:33:09,980 - INFO - Adding 19px headroom to /mnt/zim/tour-comfy/stage/img_72.png
2026-06-19 22:33:10,000 - INFO - Calling API for img_72.png -> 20260619_223309_img_72.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:33:19,128 - INFO - Successfully processed img_72.png -> /mnt/zim/tour-comfy/output/20260619_223309_img_72.png
2026-06-19 22:33:19,317 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 762 images
2026-06-19 22:33:20,318 - INFO - Starting processing for img_28.png...
2026-06-19 22:33:20,319 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_28.png to (31, 52, 203, 358) (margin=10, top_margin=20)
2026-06-19 22:33:20,319 - INFO - Adding 15px headroom to /mnt/zim/tour-comfy/stage/img_28.png
2026-06-19 22:33:20,322 - INFO - Calling API for img_28.png -> 20260619_223320_img_28.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:33:29,386 - INFO - Successfully processed img_28.png -> /mnt/zim/tour-comfy/output/20260619_223320_img_28.png
2026-06-19 22:33:29,573 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 763 images
2026-06-19 22:33:30,574 - INFO - Starting processing for img_73.png...
2026-06-19 22:33:30,575 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_73.png to (0, 0, 197, 374) (margin=10, top_margin=20)
2026-06-19 22:33:30,575 - INFO - Adding 18px headroom to /mnt/zim/tour-comfy/stage/img_73.png
2026-06-19 22:33:30,596 - INFO - Calling API for img_73.png -> 20260619_223330_img_73.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:33:39,723 - INFO - Successfully processed img_73.png -> /mnt/zim/tour-comfy/output/20260619_223330_img_73.png
2026-06-19 22:33:39,877 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 764 images
2026-06-19 22:33:40,877 - INFO - Starting processing for img_88.png...
2026-06-19 22:33:40,878 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_88.png to (23, 31, 142, 284) (margin=10, top_margin=20)
2026-06-19 22:33:40,878 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_88.png
2026-06-19 22:33:40,881 - INFO - Calling API for img_88.png -> 20260619_223340_img_88.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:33:50,161 - INFO - Successfully processed img_88.png -> /mnt/zim/tour-comfy/output/20260619_223340_img_88.png
2026-06-19 22:33:50,337 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 765 images
2026-06-19 22:33:51,338 - INFO - Starting processing for img_16.png...
2026-06-19 22:33:51,338 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_16.png to (16, 32, 125, 265) (margin=10, top_margin=20)
2026-06-19 22:33:51,338 - INFO - Adding 11px headroom to /mnt/zim/tour-comfy/stage/img_16.png
2026-06-19 22:33:51,340 - INFO - Calling API for img_16.png -> 20260619_223351_img_16.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:34:00,404 - INFO - Successfully processed img_16.png -> /mnt/zim/tour-comfy/output/20260619_223351_img_16.png
2026-06-19 22:34:00,591 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 766 images
2026-06-19 22:34:01,592 - INFO - Starting processing for img_63.png...
2026-06-19 22:34:01,593 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_63.png to (27, 46, 188, 329) (margin=10, top_margin=20)
2026-06-19 22:34:01,593 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_63.png
2026-06-19 22:34:01,596 - INFO - Calling API for img_63.png -> 20260619_223401_img_63.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:34:10,660 - INFO - Successfully processed img_63.png -> /mnt/zim/tour-comfy/output/20260619_223401_img_63.png
2026-06-19 22:34:10,854 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 767 images
2026-06-19 22:34:11,854 - INFO - Starting processing for img_3.png...
2026-06-19 22:34:11,855 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_3.png to (2, 10, 77, 156) (margin=10, top_margin=20)
2026-06-19 22:34:11,855 - INFO - Adding 7px headroom to /mnt/zim/tour-comfy/stage/img_3.png
2026-06-19 22:34:11,855 - INFO - Calling API for img_3.png -> 20260619_223411_img_3.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:34:20,918 - INFO - Successfully processed img_3.png -> /mnt/zim/tour-comfy/output/20260619_223411_img_3.png
2026-06-19 22:34:21,102 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 768 images
2026-06-19 22:34:22,103 - INFO - Starting processing for img_18.png...
2026-06-19 22:34:22,103 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_18.png to (14, 13, 110, 175) (margin=10, top_margin=20)
2026-06-19 22:34:22,103 - INFO - Adding 8px headroom to /mnt/zim/tour-comfy/stage/img_18.png
2026-06-19 22:34:22,105 - INFO - Calling API for img_18.png -> 20260619_223422_img_18.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:34:30,779 - INFO - Successfully processed img_18.png -> /mnt/zim/tour-comfy/output/20260619_223422_img_18.png
2026-06-19 22:34:30,964 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 769 images
2026-06-19 22:34:31,965 - INFO - Starting processing for img_22.png...
2026-06-19 22:34:31,965 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_22.png to (12, 15, 97, 173) (margin=10, top_margin=20)
2026-06-19 22:34:31,966 - INFO - Adding 7px headroom to /mnt/zim/tour-comfy/stage/img_22.png
2026-06-19 22:34:31,967 - INFO - Calling API for img_22.png -> 20260619_223431_img_22.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:34:40,531 - INFO - Successfully processed img_22.png -> /mnt/zim/tour-comfy/output/20260619_223431_img_22.png
2026-06-19 22:34:40,698 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 770 images
2026-06-19 22:34:41,699 - INFO - Starting processing for img_77.png...
2026-06-19 22:34:41,703 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_77.png to (0, 0, 287, 574) (margin=10, top_margin=20)
2026-06-19 22:34:41,703 - INFO - Adding 28px headroom to /mnt/zim/tour-comfy/stage/img_77.png
2026-06-19 22:34:41,750 - INFO - Calling API for img_77.png -> 20260619_223441_img_77.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:34:50,912 - INFO - Successfully processed img_77.png -> /mnt/zim/tour-comfy/output/20260619_223441_img_77.png
2026-06-19 22:34:51,089 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 771 images
2026-06-19 22:34:52,090 - INFO - Starting processing for image.png...
2026-06-19 22:34:52,090 - INFO - Cropping /mnt/zim/tour-comfy/stage/image.png to (16, 38, 134, 284) (margin=10, top_margin=20)
2026-06-19 22:34:52,090 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/image.png
2026-06-19 22:34:52,093 - INFO - Calling API for image.png -> 20260619_223452_image.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:35:00,776 - INFO - Successfully processed image.png -> /mnt/zim/tour-comfy/output/20260619_223452_image.png
2026-06-19 22:35:00,951 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 772 images
2026-06-19 22:35:01,952 - INFO - Starting processing for img_71.png...
2026-06-19 22:35:01,952 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_71.png to (30, 42, 150, 308) (margin=10, top_margin=20)
2026-06-19 22:35:01,952 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_71.png
2026-06-19 22:35:01,955 - INFO - Calling API for img_71.png -> 20260619_223501_img_71.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:35:11,027 - INFO - Successfully processed img_71.png -> /mnt/zim/tour-comfy/output/20260619_223501_img_71.png
2026-06-19 22:35:11,198 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 773 images
2026-06-19 22:35:12,204 - INFO - Starting processing for 20150913_211324.jpg...
2026-06-19 22:35:12,207 - INFO - Image /mnt/zim/tour-comfy/stage/20150913_211324.jpg is mode RGB, not RGBA. Skipping crop.
2026-06-19 22:35:14,828 - INFO - Calling API for 20150913_211324.jpg -> 20260619_223512_20150913_211324.jpg with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:35:28,629 - INFO - Successfully processed 20150913_211324.jpg -> /mnt/zim/tour-comfy/output/20260619_223512_20150913_211324.jpg
2026-06-19 22:35:28,865 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 774 images
2026-06-19 22:35:29,866 - INFO - Starting processing for img_52.png...
2026-06-19 22:35:29,870 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_52.png to (0, 0, 332, 532) (margin=10, top_margin=20)
2026-06-19 22:35:29,870 - INFO - Adding 26px headroom to /mnt/zim/tour-comfy/stage/img_52.png
2026-06-19 22:35:29,915 - INFO - Calling API for img_52.png -> 20260619_223529_img_52.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:35:43,596 - INFO - Successfully processed img_52.png -> /mnt/zim/tour-comfy/output/20260619_223529_img_52.png
2026-06-19 22:35:43,845 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 775 images
2026-06-19 22:35:44,846 - INFO - Starting processing for img_54.png...
2026-06-19 22:35:44,849 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_54.png to (0, 0, 281, 498) (margin=10, top_margin=20)
2026-06-19 22:35:44,849 - INFO - Adding 24px headroom to /mnt/zim/tour-comfy/stage/img_54.png
2026-06-19 22:35:44,902 - INFO - Calling API for img_54.png -> 20260619_223544_img_54.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:35:58,628 - INFO - Successfully processed img_54.png -> /mnt/zim/tour-comfy/output/20260619_223544_img_54.png
2026-06-19 22:35:58,907 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 776 images
2026-06-19 22:35:59,908 - INFO - Starting processing for img_2.png...
2026-06-19 22:35:59,908 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_2.png to (9, 24, 83, 218) (margin=10, top_margin=20)
2026-06-19 22:35:59,908 - INFO - Adding 9px headroom to /mnt/zim/tour-comfy/stage/img_2.png
2026-06-19 22:35:59,909 - INFO - Calling API for img_2.png -> 20260619_223559_img_2.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:36:14,000 - INFO - Successfully processed img_2.png -> /mnt/zim/tour-comfy/output/20260619_223559_img_2.png
2026-06-19 22:36:14,225 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 777 images
2026-06-19 22:36:15,226 - INFO - Starting processing for img_6.png...
2026-06-19 22:36:15,227 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_6.png to (16, 38, 134, 284) (margin=10, top_margin=20)
2026-06-19 22:36:15,227 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_6.png
2026-06-19 22:36:15,229 - INFO - Calling API for img_6.png -> 20260619_223615_img_6.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:36:28,308 - INFO - Successfully processed img_6.png -> /mnt/zim/tour-comfy/output/20260619_223615_img_6.png
2026-06-19 22:36:28,503 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 778 images
2026-06-19 22:36:29,504 - INFO - Starting processing for imgxxxx.png...
2026-06-19 22:36:29,505 - INFO - Cropping /mnt/zim/tour-comfy/stage/imgxxxx.png to (0, 0, 168, 247) (margin=10, top_margin=20)
2026-06-19 22:36:29,505 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/imgxxxx.png
2026-06-19 22:36:29,514 - INFO - Calling API for imgxxxx.png -> 20260619_223629_imgxxxx.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:36:42,631 - INFO - Successfully processed imgxxxx.png -> /mnt/zim/tour-comfy/output/20260619_223629_imgxxxx.png
2026-06-19 22:36:42,878 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 779 images
2026-06-19 22:36:43,879 - INFO - Starting processing for img_48.png...
2026-06-19 22:36:43,879 - INFO - Image /mnt/zim/tour-comfy/stage/img_48.png is mode RGB, not RGBA. Skipping crop.
2026-06-19 22:36:43,899 - INFO - Calling API for img_48.png -> 20260619_223643_img_48.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:36:57,498 - INFO - Successfully processed img_48.png -> /mnt/zim/tour-comfy/output/20260619_223643_img_48.png
2026-06-19 22:36:57,729 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 780 images
2026-06-19 22:36:58,729 - INFO - Starting processing for img_66.png...
2026-06-19 22:36:58,730 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_66.png to (20, 46, 137, 340) (margin=10, top_margin=20)
2026-06-19 22:36:58,730 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_66.png
2026-06-19 22:36:58,735 - INFO - Calling API for img_66.png -> 20260619_223658_img_66.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:37:11,529 - INFO - Successfully processed img_66.png -> /mnt/zim/tour-comfy/output/20260619_223658_img_66.png
2026-06-19 22:37:11,752 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 781 images
2026-06-19 22:37:12,756 - INFO - Starting processing for img_50.png...
2026-06-19 22:37:12,769 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_50.png to (0, 0, 636, 1201) (margin=10, top_margin=20)
2026-06-19 22:37:12,770 - INFO - Adding 60px headroom to /mnt/zim/tour-comfy/stage/img_50.png
2026-06-19 22:37:12,920 - INFO - Calling API for img_50.png -> 20260619_223712_img_50.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:37:24,575 - INFO - Successfully processed img_50.png -> /mnt/zim/tour-comfy/output/20260619_223712_img_50.png
2026-06-19 22:37:24,804 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 782 images
2026-06-19 22:37:25,808 - INFO - Starting processing for 20160903_200935.jpg...
2026-06-19 22:37:25,808 - INFO - Image /mnt/zim/tour-comfy/stage/20160903_200935.jpg is mode RGB, not RGBA. Skipping crop.
2026-06-19 22:37:28,168 - INFO - Calling API for 20160903_200935.jpg -> 20260619_223725_20160903_200935.jpg with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:37:41,860 - INFO - Successfully processed 20160903_200935.jpg -> /mnt/zim/tour-comfy/output/20260619_223725_20160903_200935.jpg
2026-06-19 22:37:42,145 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 783 images
2026-06-19 22:37:43,146 - INFO - Starting processing for img_62.png...
2026-06-19 22:37:43,147 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_62.png to (12, 43, 114, 306) (margin=10, top_margin=20)
2026-06-19 22:37:43,147 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_62.png
2026-06-19 22:37:43,149 - INFO - Calling API for img_62.png -> 20260619_223743_img_62.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:37:56,737 - INFO - Successfully processed img_62.png -> /mnt/zim/tour-comfy/output/20260619_223743_img_62.png
2026-06-19 22:37:56,932 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 784 images
2026-06-19 22:37:57,933 - INFO - Starting processing for img_82.png...
2026-06-19 22:37:57,934 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_82.png to (0, 0, 124, 386) (margin=10, top_margin=20)
2026-06-19 22:37:57,934 - INFO - Adding 19px headroom to /mnt/zim/tour-comfy/stage/img_82.png
2026-06-19 22:37:57,948 - INFO - Calling API for img_82.png -> 20260619_223757_img_82.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:38:11,595 - INFO - Successfully processed img_82.png -> /mnt/zim/tour-comfy/output/20260619_223757_img_82.png
2026-06-19 22:38:11,843 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 785 images
2026-06-19 22:38:12,844 - INFO - Starting processing for img_57.png...
2026-06-19 22:38:12,844 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_57.png to (14, 58, 130, 398) (margin=10, top_margin=20)
2026-06-19 22:38:12,844 - INFO - Adding 17px headroom to /mnt/zim/tour-comfy/stage/img_57.png
2026-06-19 22:38:12,847 - INFO - Calling API for img_57.png -> 20260619_223812_img_57.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:38:25,122 - INFO - Successfully processed img_57.png -> /mnt/zim/tour-comfy/output/20260619_223812_img_57.png
2026-06-19 22:38:25,333 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 786 images
2026-06-19 22:38:26,333 - INFO - Starting processing for img_7.png...
2026-06-19 22:38:26,334 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_7.png to (17, 45, 126, 337) (margin=10, top_margin=20)
2026-06-19 22:38:26,334 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_7.png
2026-06-19 22:38:26,337 - INFO - Calling API for img_7.png -> 20260619_223826_img_7.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:38:39,949 - INFO - Successfully processed img_7.png -> /mnt/zim/tour-comfy/output/20260619_223826_img_7.png
2026-06-19 22:38:40,218 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 787 images
2026-06-19 22:38:41,219 - INFO - Starting processing for img_67.png...
2026-06-19 22:38:41,220 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_67.png to (14, 41, 115, 300) (margin=10, top_margin=20)
2026-06-19 22:38:41,220 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_67.png
2026-06-19 22:38:41,222 - INFO - Calling API for img_67.png -> 20260619_223841_img_67.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:38:54,811 - INFO - Successfully processed img_67.png -> /mnt/zim/tour-comfy/output/20260619_223841_img_67.png
2026-06-19 22:38:55,056 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 788 images
2026-06-19 22:38:56,056 - INFO - Starting processing for img_37.png...
2026-06-19 22:38:56,057 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_37.png to (29, 64, 193, 406) (margin=10, top_margin=20)
2026-06-19 22:38:56,057 - INFO - Adding 17px headroom to /mnt/zim/tour-comfy/stage/img_37.png
2026-06-19 22:38:56,063 - INFO - Calling API for img_37.png -> 20260619_223856_img_37.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:39:09,667 - INFO - Successfully processed img_37.png -> /mnt/zim/tour-comfy/output/20260619_223856_img_37.png
2026-06-19 22:39:09,886 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 789 images
2026-06-19 22:39:10,887 - INFO - Starting processing for img_6v1.png...
2026-06-19 22:39:10,887 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_6v1.png to (16, 38, 134, 284) (margin=10, top_margin=20)
2026-06-19 22:39:10,887 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_6v1.png
2026-06-19 22:39:10,889 - INFO - Calling API for img_6v1.png -> 20260619_223910_img_6v1.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:39:24,057 - INFO - Successfully processed img_6v1.png -> /mnt/zim/tour-comfy/output/20260619_223910_img_6v1.png
2026-06-19 22:39:24,327 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 790 images
2026-06-19 22:39:25,328 - INFO - Starting processing for img_26.png...
2026-06-19 22:39:25,329 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_26.png to (26, 46, 182, 308) (margin=10, top_margin=20)
2026-06-19 22:39:25,329 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_26.png
2026-06-19 22:39:25,332 - INFO - Calling API for img_26.png -> 20260619_223925_img_26.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:39:38,920 - INFO - Successfully processed img_26.png -> /mnt/zim/tour-comfy/output/20260619_223925_img_26.png
2026-06-19 22:39:39,206 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 791 images
2026-06-19 22:39:40,207 - INFO - Starting processing for img_75.png...
2026-06-19 22:39:40,208 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_75.png to (0, 0, 103, 190) (margin=10, top_margin=20)
2026-06-19 22:39:40,208 - INFO - Adding 9px headroom to /mnt/zim/tour-comfy/stage/img_75.png
2026-06-19 22:39:40,216 - INFO - Calling API for img_75.png -> 20260619_223940_img_75.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:39:54,352 - INFO - Successfully processed img_75.png -> /mnt/zim/tour-comfy/output/20260619_223940_img_75.png
2026-06-19 22:39:54,694 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 792 images
2026-06-19 22:39:55,695 - INFO - Starting processing for img_64.png...
2026-06-19 22:39:55,696 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_64.png to (16, 37, 115, 292) (margin=10, top_margin=20)
2026-06-19 22:39:55,696 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_64.png
2026-06-19 22:39:55,698 - INFO - Calling API for img_64.png -> 20260619_223955_img_64.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:40:06,292 - INFO - Successfully processed img_64.png -> /mnt/zim/tour-comfy/output/20260619_223955_img_64.png
2026-06-19 22:40:06,446 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 793 images
2026-06-19 22:40:07,447 - INFO - Starting processing for img_31.png...
2026-06-19 22:40:07,448 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_31.png to (24, 49, 152, 335) (margin=10, top_margin=20)
2026-06-19 22:40:07,448 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_31.png
2026-06-19 22:40:07,453 - INFO - Calling API for img_31.png -> 20260619_224007_img_31.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:40:20,557 - INFO - Successfully processed img_31.png -> /mnt/zim/tour-comfy/output/20260619_224007_img_31.png
2026-06-19 22:40:20,790 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 794 images
2026-06-19 22:40:21,791 - INFO - Starting processing for img_45.png...
2026-06-19 22:40:21,791 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_45.png to (17, 45, 148, 336) (margin=10, top_margin=20)
2026-06-19 22:40:21,791 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_45.png
2026-06-19 22:40:21,795 - INFO - Calling API for img_45.png -> 20260619_224021_img_45.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:40:33,876 - INFO - Successfully processed img_45.png -> /mnt/zim/tour-comfy/output/20260619_224021_img_45.png
2026-06-19 22:40:34,108 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 795 images
2026-06-19 22:40:35,109 - INFO - Starting processing for img_68.png...
2026-06-19 22:40:35,109 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_68.png to (9, 28, 93, 249) (margin=10, top_margin=20)
2026-06-19 22:40:35,109 - INFO - Adding 11px headroom to /mnt/zim/tour-comfy/stage/img_68.png
2026-06-19 22:40:35,111 - INFO - Calling API for img_68.png -> 20260619_224035_img_68.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:40:48,261 - INFO - Successfully processed img_68.png -> /mnt/zim/tour-comfy/output/20260619_224035_img_68.png
2026-06-19 22:40:48,519 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 796 images
2026-06-19 22:40:49,521 - INFO - Starting processing for img_29.png...
2026-06-19 22:40:49,523 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_29.png to (0, 0, 202, 449) (margin=10, top_margin=20)
2026-06-19 22:40:49,523 - INFO - Adding 22px headroom to /mnt/zim/tour-comfy/stage/img_29.png
2026-06-19 22:40:49,543 - INFO - Calling API for img_29.png -> 20260619_224049_img_29.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:41:03,184 - INFO - Successfully processed img_29.png -> /mnt/zim/tour-comfy/output/20260619_224049_img_29.png
2026-06-19 22:41:03,419 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 797 images
2026-06-19 22:41:04,419 - INFO - Starting processing for img_1.png...
2026-06-19 22:41:04,420 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_1.png to (22, 36, 155, 282) (margin=10, top_margin=20)
2026-06-19 22:41:04,420 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_1.png
2026-06-19 22:41:04,422 - INFO - Calling API for img_1.png -> 20260619_224104_img_1.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:41:17,554 - INFO - Successfully processed img_1.png -> /mnt/zim/tour-comfy/output/20260619_224104_img_1.png
2026-06-19 22:41:17,786 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 798 images
2026-06-19 22:41:18,787 - INFO - Starting processing for img_39.png...
2026-06-19 22:41:18,788 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_39.png to (15, 19, 127, 193) (margin=10, top_margin=20)
2026-06-19 22:41:18,788 - INFO - Adding 8px headroom to /mnt/zim/tour-comfy/stage/img_39.png
2026-06-19 22:41:18,790 - INFO - Calling API for img_39.png -> 20260619_224118_img_39.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:41:32,367 - INFO - Successfully processed img_39.png -> /mnt/zim/tour-comfy/output/20260619_224118_img_39.png
2026-06-19 22:41:32,590 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 799 images
2026-06-19 22:41:33,592 - INFO - Starting processing for img_87.png...
2026-06-19 22:41:33,595 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_87.png to (0, 0, 391, 546) (margin=10, top_margin=20)
2026-06-19 22:41:33,596 - INFO - Adding 27px headroom to /mnt/zim/tour-comfy/stage/img_87.png
2026-06-19 22:41:33,654 - INFO - Calling API for img_87.png -> 20260619_224133_img_87.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:41:47,537 - INFO - Successfully processed img_87.png -> /mnt/zim/tour-comfy/output/20260619_224133_img_87.png
2026-06-19 22:41:47,765 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 800 images
2026-06-19 22:41:48,771 - INFO - Starting processing for 20160903_200728.jpg...
2026-06-19 22:41:48,771 - INFO - Image /mnt/zim/tour-comfy/stage/20160903_200728.jpg is mode RGB, not RGBA. Skipping crop.
2026-06-19 22:41:51,428 - INFO - Calling API for 20160903_200728.jpg -> 20260619_224148_20160903_200728.jpg with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:42:04,693 - INFO - Successfully processed 20160903_200728.jpg -> /mnt/zim/tour-comfy/output/20260619_224148_20160903_200728.jpg
2026-06-19 22:42:04,945 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 801 images
2026-06-19 22:42:05,946 - INFO - Starting processing for img_61.png...
2026-06-19 22:42:05,947 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_61.png to (9, 49, 121, 336) (margin=10, top_margin=20)
2026-06-19 22:42:05,947 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_61.png
2026-06-19 22:42:05,950 - INFO - Calling API for img_61.png -> 20260619_224205_img_61.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:42:18,042 - INFO - Successfully processed img_61.png -> /mnt/zim/tour-comfy/output/20260619_224205_img_61.png
2026-06-19 22:42:18,269 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 802 images
2026-06-19 22:42:19,270 - INFO - Starting processing for img_12.png...
2026-06-19 22:42:19,271 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_12.png to (14, 74, 166, 456) (margin=10, top_margin=20)
2026-06-19 22:42:19,271 - INFO - Adding 19px headroom to /mnt/zim/tour-comfy/stage/img_12.png
2026-06-19 22:42:19,277 - INFO - Calling API for img_12.png -> 20260619_224219_img_12.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:42:32,875 - INFO - Successfully processed img_12.png -> /mnt/zim/tour-comfy/output/20260619_224219_img_12.png
2026-06-19 22:42:33,100 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 803 images
2026-06-19 22:42:36,891 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 22:42:36,891 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 22:42:36,891 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 22:43:34,921 - INFO - Starting processing for img_85.png...
2026-06-19 22:43:34,925 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_85.png to (0, 0, 242, 511) (margin=10, top_margin=20)
2026-06-19 22:43:34,925 - INFO - Adding 25px headroom to /mnt/zim/tour-comfy/stage/img_85.png
2026-06-19 22:43:34,962 - INFO - Calling API for img_85.png -> 20260619_224334_img_85.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:44:43,773 - INFO - Successfully processed img_85.png -> /mnt/zim/tour-comfy/output/20260619_224334_img_85.png
2026-06-19 22:44:43,809 - INFO - Parsing model identifier. Schema: None, Identifier: ViT-H-14
2026-06-19 22:44:43,809 - INFO - Loaded built-in ViT-H-14 model config.
2026-06-19 22:44:44,001 - INFO - HTTP Request: HEAD https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K/resolve/main/open_clip_model.safetensors "HTTP/1.1 302 Found"
2026-06-19 22:44:44,002 - INFO - Instantiating model architecture: CLIP
2026-06-19 22:44:47,954 - INFO - Loading full pretrained weights from: /home/mike/.cache/huggingface/hub/models--laion--CLIP-ViT-H-14-laion2B-s32B-b79K/snapshots/1c2b8495b28150b8a4922ee1c8edee224c284c0c/open_clip_model.safetensors
2026-06-19 22:44:48,419 - INFO - Final image preprocessing configuration set: {'size': (224, 224), 'mode': 'RGB', 'mean': (0.48145466, 0.4578275, 0.40821073), 'std': (0.26862954, 0.26130258, 0.27577711), 'interpolation': 'bicubic', 'resize_mode': 'shortest', 'fill_color': 0}
2026-06-19 22:44:48,419 - INFO - Model ViT-H-14 creation process complete.
2026-06-19 22:44:56,519 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 804 images
2026-06-19 22:44:57,520 - INFO - Starting processing for img_69.png...
2026-06-19 22:44:57,521 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_69.png to (24, 46, 132, 316) (margin=10, top_margin=20)
2026-06-19 22:44:57,521 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_69.png
2026-06-19 22:44:57,523 - INFO - Calling API for img_69.png -> 20260619_224457_img_69.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:45:11,338 - INFO - Successfully processed img_69.png -> /mnt/zim/tour-comfy/output/20260619_224457_img_69.png
2026-06-19 22:45:11,571 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 805 images
2026-06-19 22:45:12,572 - INFO - Starting processing for img_8.png...
2026-06-19 22:45:12,572 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_8.png to (12, 40, 100, 301) (margin=10, top_margin=20)
2026-06-19 22:45:12,572 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_8.png
2026-06-19 22:45:12,574 - INFO - Calling API for img_8.png -> 20260619_224512_img_8.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:45:26,362 - INFO - Successfully processed img_8.png -> /mnt/zim/tour-comfy/output/20260619_224512_img_8.png
2026-06-19 22:45:26,565 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 806 images
2026-06-19 22:45:27,566 - INFO - Starting processing for img_92.png...
2026-06-19 22:45:27,566 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_92.png to (23, 36, 154, 283) (margin=10, top_margin=20)
2026-06-19 22:45:27,566 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_92.png
2026-06-19 22:45:27,568 - INFO - Calling API for img_92.png -> 20260619_224527_img_92.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:45:41,147 - INFO - Successfully processed img_92.png -> /mnt/zim/tour-comfy/output/20260619_224527_img_92.png
2026-06-19 22:45:41,387 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 807 images
2026-06-19 22:45:42,388 - INFO - Starting processing for img_35.png...
2026-06-19 22:45:42,389 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_35.png to (34, 75, 262, 473) (margin=10, top_margin=20)
2026-06-19 22:45:42,390 - INFO - Adding 19px headroom to /mnt/zim/tour-comfy/stage/img_35.png
2026-06-19 22:45:42,397 - INFO - Calling API for img_35.png -> 20260619_224542_img_35.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:45:56,203 - INFO - Successfully processed img_35.png -> /mnt/zim/tour-comfy/output/20260619_224542_img_35.png
2026-06-19 22:45:56,479 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 808 images
2026-06-19 22:45:57,480 - INFO - Starting processing for img_81.png...
2026-06-19 22:45:57,481 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_81.png to (0, 0, 158, 203) (margin=10, top_margin=20)
2026-06-19 22:45:57,481 - INFO - Adding 10px headroom to /mnt/zim/tour-comfy/stage/img_81.png
2026-06-19 22:45:57,489 - INFO - Calling API for img_81.png -> 20260619_224557_img_81.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:46:11,741 - INFO - Successfully processed img_81.png -> /mnt/zim/tour-comfy/output/20260619_224557_img_81.png
2026-06-19 22:46:11,947 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 809 images
2026-06-19 22:46:12,947 - INFO - Starting processing for img_27.png...
2026-06-19 22:46:12,948 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_27.png to (23, 52, 145, 346) (margin=10, top_margin=20)
2026-06-19 22:46:12,948 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_27.png
2026-06-19 22:46:12,951 - INFO - Calling API for img_27.png -> 20260619_224612_img_27.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:46:25,540 - INFO - Successfully processed img_27.png -> /mnt/zim/tour-comfy/output/20260619_224612_img_27.png
2026-06-19 22:46:25,711 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 810 images
2026-06-19 22:46:26,712 - INFO - Starting processing for img_33.png...
2026-06-19 22:46:26,713 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_33.png to (40, 69, 180, 423) (margin=10, top_margin=20)
2026-06-19 22:46:26,713 - INFO - Adding 17px headroom to /mnt/zim/tour-comfy/stage/img_33.png
2026-06-19 22:46:26,717 - INFO - Calling API for img_33.png -> 20260619_224626_img_33.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:46:36,380 - INFO - Successfully processed img_33.png -> /mnt/zim/tour-comfy/output/20260619_224626_img_33.png
2026-06-19 22:46:36,578 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 811 images
2026-06-19 22:46:37,579 - INFO - Starting processing for img_47.png...
2026-06-19 22:46:37,582 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_47.png to (49, 85, 301, 535) (margin=10, top_margin=20)
2026-06-19 22:46:37,582 - INFO - Adding 22px headroom to /mnt/zim/tour-comfy/stage/img_47.png
2026-06-19 22:46:37,600 - INFO - Calling API for img_47.png -> 20260619_224637_img_47.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:46:51,203 - INFO - Successfully processed img_47.png -> /mnt/zim/tour-comfy/output/20260619_224637_img_47.png
2026-06-19 22:46:51,436 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 812 images
2026-06-19 22:46:52,437 - INFO - Starting processing for img_5.png...
2026-06-19 22:46:52,437 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_5.png to (2, 10, 77, 156) (margin=10, top_margin=20)
2026-06-19 22:46:52,437 - INFO - Adding 7px headroom to /mnt/zim/tour-comfy/stage/img_5.png
2026-06-19 22:46:52,438 - INFO - Calling API for img_5.png -> 20260619_224652_img_5.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:47:06,016 - INFO - Successfully processed img_5.png -> /mnt/zim/tour-comfy/output/20260619_224652_img_5.png
2026-06-19 22:47:06,294 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 813 images
2026-06-19 22:47:07,295 - INFO - Starting processing for img_46.png...
2026-06-19 22:47:07,296 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_46.png to (32, 61, 207, 409) (margin=10, top_margin=20)
2026-06-19 22:47:07,297 - INFO - Adding 17px headroom to /mnt/zim/tour-comfy/stage/img_46.png
2026-06-19 22:47:07,302 - INFO - Calling API for img_46.png -> 20260619_224707_img_46.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:47:20,883 - INFO - Successfully processed img_46.png -> /mnt/zim/tour-comfy/output/20260619_224707_img_46.png
2026-06-19 22:47:21,115 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 814 images
2026-06-19 22:47:22,116 - INFO - Starting processing for img_25.png...
2026-06-19 22:47:22,117 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_25.png to (34, 47, 222, 341) (margin=10, top_margin=20)
2026-06-19 22:47:22,117 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_25.png
2026-06-19 22:47:22,126 - INFO - Calling API for img_25.png -> 20260619_224722_img_25.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:47:35,794 - INFO - Successfully processed img_25.png -> /mnt/zim/tour-comfy/output/20260619_224722_img_25.png
2026-06-19 22:47:36,032 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 815 images
2026-06-19 22:47:37,033 - INFO - Starting processing for img_14.png...
2026-06-19 22:47:37,034 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_14.png to (10, 33, 104, 288) (margin=10, top_margin=20)
2026-06-19 22:47:37,034 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_14.png
2026-06-19 22:47:37,036 - INFO - Calling API for img_14.png -> 20260619_224737_img_14.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:47:50,629 - INFO - Successfully processed img_14.png -> /mnt/zim/tour-comfy/output/20260619_224737_img_14.png
2026-06-19 22:47:50,832 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 816 images
2026-06-19 22:47:51,833 - INFO - Starting processing for img_93.png...
2026-06-19 22:47:51,833 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_93.png to (0, 0, 80, 204) (margin=10, top_margin=20)
2026-06-19 22:47:51,833 - INFO - Adding 10px headroom to /mnt/zim/tour-comfy/stage/img_93.png
2026-06-19 22:47:51,835 - INFO - Calling API for img_93.png -> 20260619_224751_img_93.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:48:04,941 - INFO - Successfully processed img_93.png -> /mnt/zim/tour-comfy/output/20260619_224751_img_93.png
2026-06-19 22:48:05,185 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 817 images
2026-06-19 22:48:06,186 - INFO - Starting processing for img_10.png...
2026-06-19 22:48:06,187 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_10.png to (18, 44, 139, 318) (margin=10, top_margin=20)
2026-06-19 22:48:06,187 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_10.png
2026-06-19 22:48:06,190 - INFO - Calling API for img_10.png -> 20260619_224806_img_10.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:48:19,776 - INFO - Successfully processed img_10.png -> /mnt/zim/tour-comfy/output/20260619_224806_img_10.png
2026-06-19 22:48:20,005 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 818 images
2026-06-19 22:48:21,006 - INFO - Starting processing for img_13.png...
2026-06-19 22:48:21,007 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_13.png to (24, 62, 155, 412) (margin=10, top_margin=20)
2026-06-19 22:48:21,007 - INFO - Adding 17px headroom to /mnt/zim/tour-comfy/stage/img_13.png
2026-06-19 22:48:21,011 - INFO - Calling API for img_13.png -> 20260619_224821_img_13.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:48:35,095 - INFO - Successfully processed img_13.png -> /mnt/zim/tour-comfy/output/20260619_224821_img_13.png
2026-06-19 22:48:35,315 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 819 images
2026-06-19 22:48:36,316 - INFO - Starting processing for img_65.png...
2026-06-19 22:48:36,316 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_65.png to (15, 37, 136, 286) (margin=10, top_margin=20)
2026-06-19 22:48:36,316 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_65.png
2026-06-19 22:48:36,319 - INFO - Calling API for img_65.png -> 20260619_224836_img_65.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:48:49,898 - INFO - Successfully processed img_65.png -> /mnt/zim/tour-comfy/output/20260619_224836_img_65.png
2026-06-19 22:48:50,125 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 820 images
2026-06-19 22:48:51,126 - INFO - Starting processing for img_36.png...
2026-06-19 22:48:51,127 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_36.png to (34, 75, 262, 473) (margin=10, top_margin=20)
2026-06-19 22:48:51,127 - INFO - Adding 19px headroom to /mnt/zim/tour-comfy/stage/img_36.png
2026-06-19 22:48:51,135 - INFO - Calling API for img_36.png -> 20260619_224851_img_36.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:49:03,728 - INFO - Successfully processed img_36.png -> /mnt/zim/tour-comfy/output/20260619_224851_img_36.png
2026-06-19 22:49:04,008 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 821 images
2026-06-19 22:49:05,009 - INFO - Starting processing for img_19.png...
2026-06-19 22:49:05,010 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_19.png to (27, 57, 175, 375) (margin=10, top_margin=20)
2026-06-19 22:49:05,010 - INFO - Adding 15px headroom to /mnt/zim/tour-comfy/stage/img_19.png
2026-06-19 22:49:05,014 - INFO - Calling API for img_19.png -> 20260619_224905_img_19.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:49:18,605 - INFO - Successfully processed img_19.png -> /mnt/zim/tour-comfy/output/20260619_224905_img_19.png
2026-06-19 22:49:18,838 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 822 images
2026-06-19 22:49:19,839 - INFO - Starting processing for img_51.png...
2026-06-19 22:49:19,839 - INFO - Image /mnt/zim/tour-comfy/stage/img_51.png is mode RGB, not RGBA. Skipping crop.
2026-06-19 22:49:19,894 - INFO - Calling API for img_51.png -> 20260619_224919_img_51.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:49:33,163 - INFO - Successfully processed img_51.png -> /mnt/zim/tour-comfy/output/20260619_224919_img_51.png
2026-06-19 22:49:33,437 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 823 images
2026-06-19 22:49:34,438 - INFO - Starting processing for img_38.png...
2026-06-19 22:49:34,440 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_38.png to (47, 79, 275, 473) (margin=10, top_margin=20)
2026-06-19 22:49:34,440 - INFO - Adding 19px headroom to /mnt/zim/tour-comfy/stage/img_38.png
2026-06-19 22:49:34,449 - INFO - Calling API for img_38.png -> 20260619_224934_img_38.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:49:48,074 - INFO - Successfully processed img_38.png -> /mnt/zim/tour-comfy/output/20260619_224934_img_38.png
2026-06-19 22:49:48,363 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 824 images
2026-06-19 22:49:49,364 - INFO - Starting processing for img_20.png...
2026-06-19 22:49:49,365 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_20.png to (11, 40, 119, 354) (margin=10, top_margin=20)
2026-06-19 22:49:49,365 - INFO - Adding 15px headroom to /mnt/zim/tour-comfy/stage/img_20.png
2026-06-19 22:49:49,368 - INFO - Calling API for img_20.png -> 20260619_224949_img_20.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:50:02,949 - INFO - Successfully processed img_20.png -> /mnt/zim/tour-comfy/output/20260619_224949_img_20.png
2026-06-19 22:50:03,187 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 825 images
2026-06-19 22:50:04,188 - INFO - Starting processing for img_34.png...
2026-06-19 22:50:04,188 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_34.png to (40, 69, 180, 423) (margin=10, top_margin=20)
2026-06-19 22:50:04,188 - INFO - Adding 17px headroom to /mnt/zim/tour-comfy/stage/img_34.png
2026-06-19 22:50:04,192 - INFO - Calling API for img_34.png -> 20260619_225004_img_34.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:50:15,772 - INFO - Successfully processed img_34.png -> /mnt/zim/tour-comfy/output/20260619_225004_img_34.png
2026-06-19 22:50:16,013 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 826 images
2026-06-19 22:50:17,014 - INFO - Starting processing for img_19_2.png...
2026-06-19 22:50:17,014 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_19_2.png to (23, 7, 151, 161) (margin=10, top_margin=20)
2026-06-19 22:50:17,014 - INFO - Adding 7px headroom to /mnt/zim/tour-comfy/stage/img_19_2.png
2026-06-19 22:50:17,016 - INFO - Calling API for img_19_2.png -> 20260619_225017_img_19_2.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:50:31,410 - INFO - Successfully processed img_19_2.png -> /mnt/zim/tour-comfy/output/20260619_225017_img_19_2.png
2026-06-19 22:50:31,658 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 827 images
2026-06-19 22:50:32,658 - INFO - Starting processing for img_91.png...
2026-06-19 22:50:32,659 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_91.png to (23, 36, 154, 283) (margin=10, top_margin=20)
2026-06-19 22:50:32,659 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_91.png
2026-06-19 22:50:32,663 - INFO - Calling API for img_91.png -> 20260619_225032_img_91.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:50:46,238 - INFO - Successfully processed img_91.png -> /mnt/zim/tour-comfy/output/20260619_225032_img_91.png
2026-06-19 22:50:46,464 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 828 images
2026-06-19 22:50:47,465 - INFO - Starting processing for test123.jpeg...
2026-06-19 22:50:47,465 - INFO - Image /mnt/zim/tour-comfy/stage/test123.jpeg is mode RGB, not RGBA. Skipping crop.
2026-06-19 22:50:47,630 - INFO - Calling API for test123.jpeg -> 20260619_225047_test123.jpeg with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:50:59,800 - INFO - Successfully processed test123.jpeg -> /mnt/zim/tour-comfy/output/20260619_225047_test123.jpeg
2026-06-19 22:51:00,023 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 829 images
2026-06-19 22:51:01,025 - INFO - Starting processing for img_49.png...
2026-06-19 22:51:01,025 - INFO - Image /mnt/zim/tour-comfy/stage/img_49.png is mode RGB, not RGBA. Skipping crop.
2026-06-19 22:51:01,053 - INFO - Calling API for img_49.png -> 20260619_225101_img_49.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:51:14,705 - INFO - Successfully processed img_49.png -> /mnt/zim/tour-comfy/output/20260619_225101_img_49.png
2026-06-19 22:51:14,957 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 830 images
2026-06-19 22:51:15,957 - INFO - Starting processing for test.png...
2026-06-19 22:51:15,958 - INFO - Cropping /mnt/zim/tour-comfy/stage/test.png to (31, 45, 145, 331) (margin=10, top_margin=20)
2026-06-19 22:51:15,958 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/test.png
2026-06-19 22:51:15,962 - INFO - Calling API for test.png -> 20260619_225115_test.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:51:29,553 - INFO - Successfully processed test.png -> /mnt/zim/tour-comfy/output/20260619_225115_test.png
2026-06-19 22:51:29,825 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 831 images
2026-06-19 22:51:30,825 - INFO - Starting processing for img_40.png...
2026-06-19 22:51:30,826 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_40.png to (20, 49, 152, 347) (margin=10, top_margin=20)
2026-06-19 22:51:30,826 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_40.png
2026-06-19 22:51:30,829 - INFO - Calling API for img_40.png -> 20260619_225130_img_40.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:51:44,825 - INFO - Successfully processed img_40.png -> /mnt/zim/tour-comfy/output/20260619_225130_img_40.png
2026-06-19 22:51:45,022 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 832 images
2026-06-19 22:51:46,023 - INFO - Starting processing for img_83.png...
2026-06-19 22:51:46,024 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_83.png to (0, 0, 124, 386) (margin=10, top_margin=20)
2026-06-19 22:51:46,024 - INFO - Adding 19px headroom to /mnt/zim/tour-comfy/stage/img_83.png
2026-06-19 22:51:46,037 - INFO - Calling API for img_83.png -> 20260619_225146_img_83.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:51:59,671 - INFO - Successfully processed img_83.png -> /mnt/zim/tour-comfy/output/20260619_225146_img_83.png
2026-06-19 22:51:59,902 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 833 images
2026-06-19 22:52:00,902 - INFO - Starting processing for img_70.png...
2026-06-19 22:52:00,903 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_70.png to (24, 46, 132, 316) (margin=10, top_margin=20)
2026-06-19 22:52:00,903 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_70.png
2026-06-19 22:52:00,908 - INFO - Calling API for img_70.png -> 20260619_225200_img_70.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:52:14,508 - INFO - Successfully processed img_70.png -> /mnt/zim/tour-comfy/output/20260619_225200_img_70.png
2026-06-19 22:52:14,710 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 834 images
2026-06-19 22:52:15,711 - INFO - Starting processing for img_15.png...
2026-06-19 22:52:15,711 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_15.png to (8, 39, 100, 302) (margin=10, top_margin=20)
2026-06-19 22:52:15,711 - INFO - Adding 13px headroom to /mnt/zim/tour-comfy/stage/img_15.png
2026-06-19 22:52:15,713 - INFO - Calling API for img_15.png -> 20260619_225215_img_15.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:52:27,798 - INFO - Successfully processed img_15.png -> /mnt/zim/tour-comfy/output/20260619_225215_img_15.png
2026-06-19 22:52:28,049 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 835 images
2026-06-19 22:52:29,050 - INFO - Starting processing for imgxxx.png...
2026-06-19 22:52:29,051 - INFO - Cropping /mnt/zim/tour-comfy/stage/imgxxx.png to (0, 0, 168, 247) (margin=10, top_margin=20)
2026-06-19 22:52:29,051 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/imgxxx.png
2026-06-19 22:52:29,060 - INFO - Calling API for imgxxx.png -> 20260619_225229_imgxxx.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:52:43,686 - INFO - Successfully processed imgxxx.png -> /mnt/zim/tour-comfy/output/20260619_225229_imgxxx.png
2026-06-19 22:52:43,900 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 836 images
2026-06-19 22:52:44,901 - INFO - Starting processing for img_86.png...
2026-06-19 22:52:44,905 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_86.png to (0, 0, 242, 511) (margin=10, top_margin=20)
2026-06-19 22:52:44,905 - INFO - Adding 25px headroom to /mnt/zim/tour-comfy/stage/img_86.png
2026-06-19 22:52:44,954 - INFO - Calling API for img_86.png -> 20260619_225244_img_86.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:52:58,750 - INFO - Successfully processed img_86.png -> /mnt/zim/tour-comfy/output/20260619_225244_img_86.png
2026-06-19 22:52:59,011 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 837 images
2026-06-19 22:53:00,012 - INFO - Starting processing for img_11.png...
2026-06-19 22:53:00,013 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_11.png to (26, 46, 189, 340) (margin=10, top_margin=20)
2026-06-19 22:53:00,013 - INFO - Adding 14px headroom to /mnt/zim/tour-comfy/stage/img_11.png
2026-06-19 22:53:00,019 - INFO - Calling API for img_11.png -> 20260619_225300_img_11.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:53:13,622 - INFO - Successfully processed img_11.png -> /mnt/zim/tour-comfy/output/20260619_225300_img_11.png
2026-06-19 22:53:13,896 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 838 images
2026-06-19 22:53:14,896 - INFO - Starting processing for img_4.png...
2026-06-19 22:53:14,897 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_4.png to (2, 10, 77, 156) (margin=10, top_margin=20)
2026-06-19 22:53:14,897 - INFO - Adding 7px headroom to /mnt/zim/tour-comfy/stage/img_4.png
2026-06-19 22:53:14,898 - INFO - Calling API for img_4.png -> 20260619_225314_img_4.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:53:26,593 - INFO - Successfully processed img_4.png -> /mnt/zim/tour-comfy/output/20260619_225314_img_4.png
2026-06-19 22:53:26,800 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 839 images
2026-06-19 22:53:27,801 - INFO - Starting processing for img_9.png...
2026-06-19 22:53:27,801 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_9.png to (23, 36, 154, 283) (margin=10, top_margin=20)
2026-06-19 22:53:27,801 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_9.png
2026-06-19 22:53:27,804 - INFO - Calling API for img_9.png -> 20260619_225327_img_9.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:53:39,878 - INFO - Successfully processed img_9.png -> /mnt/zim/tour-comfy/output/20260619_225327_img_9.png
2026-06-19 22:53:40,095 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 840 images
2026-06-19 22:53:41,095 - INFO - Starting processing for img_76.png...
2026-06-19 22:53:41,096 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_76.png to (0, 0, 103, 190) (margin=10, top_margin=20)
2026-06-19 22:53:41,096 - INFO - Adding 9px headroom to /mnt/zim/tour-comfy/stage/img_76.png
2026-06-19 22:53:41,102 - INFO - Calling API for img_76.png -> 20260619_225341_img_76.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:53:54,227 - INFO - Successfully processed img_76.png -> /mnt/zim/tour-comfy/output/20260619_225341_img_76.png
2026-06-19 22:53:54,495 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 841 images
2026-06-19 22:53:55,496 - INFO - Starting processing for img_run.png...
2026-06-19 22:53:55,496 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_run.png to (18, 54, 138, 380) (margin=10, top_margin=20)
2026-06-19 22:53:55,497 - INFO - Adding 16px headroom to /mnt/zim/tour-comfy/stage/img_run.png
2026-06-19 22:53:55,500 - INFO - Calling API for img_run.png -> 20260619_225355_img_run.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:54:08,714 - INFO - Successfully processed img_run.png -> /mnt/zim/tour-comfy/output/20260619_225355_img_run.png
2026-06-19 22:54:08,910 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 842 images
2026-06-19 22:54:09,911 - INFO - Starting processing for img_59.png...
2026-06-19 22:54:09,912 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_59.png to (0, 0, 179, 474) (margin=10, top_margin=20)
2026-06-19 22:54:09,912 - INFO - Adding 23px headroom to /mnt/zim/tour-comfy/stage/img_59.png
2026-06-19 22:54:09,928 - INFO - Calling API for img_59.png -> 20260619_225409_img_59.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:54:23,337 - INFO - Successfully processed img_59.png -> /mnt/zim/tour-comfy/output/20260619_225409_img_59.png
2026-06-19 22:54:23,567 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 843 images
2026-06-19 22:54:24,567 - INFO - Starting processing for img_74.png...
2026-06-19 22:54:24,568 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_74.png to (0, 0, 172, 190) (margin=10, top_margin=20)
2026-06-19 22:54:24,568 - INFO - Adding 9px headroom to /mnt/zim/tour-comfy/stage/img_74.png
2026-06-19 22:54:24,579 - INFO - Calling API for img_74.png -> 20260619_225424_img_74.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:54:38,228 - INFO - Successfully processed img_74.png -> /mnt/zim/tour-comfy/output/20260619_225424_img_74.png
2026-06-19 22:54:38,469 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 844 images
2026-06-19 22:54:39,469 - INFO - Starting processing for img.png...
2026-06-19 22:54:39,470 - INFO - Cropping /mnt/zim/tour-comfy/stage/img.png to (22, 31, 145, 265) (margin=10, top_margin=20)
2026-06-19 22:54:39,470 - INFO - Adding 11px headroom to /mnt/zim/tour-comfy/stage/img.png
2026-06-19 22:54:39,472 - INFO - Calling API for img.png -> 20260619_225439_img.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:54:53,053 - INFO - Successfully processed img.png -> /mnt/zim/tour-comfy/output/20260619_225439_img.png
2026-06-19 22:54:53,296 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 845 images
2026-06-19 22:54:54,296 - INFO - Starting processing for img_17.png...
2026-06-19 22:54:54,297 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_17.png to (12, 34, 110, 274) (margin=10, top_margin=20)
2026-06-19 22:54:54,297 - INFO - Adding 12px headroom to /mnt/zim/tour-comfy/stage/img_17.png
2026-06-19 22:54:54,298 - INFO - Calling API for img_17.png -> 20260619_225454_img_17.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:55:07,877 - INFO - Successfully processed img_17.png -> /mnt/zim/tour-comfy/output/20260619_225454_img_17.png
2026-06-19 22:55:08,169 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 846 images
2026-06-19 22:55:09,170 - INFO - Starting processing for img_60.png...
2026-06-19 22:55:09,172 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_60.png to (0, 0, 170, 458) (margin=10, top_margin=20)
2026-06-19 22:55:09,172 - INFO - Adding 22px headroom to /mnt/zim/tour-comfy/stage/img_60.png
2026-06-19 22:55:09,188 - INFO - Calling API for img_60.png -> 20260619_225509_img_60.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:55:22,403 - INFO - Successfully processed img_60.png -> /mnt/zim/tour-comfy/output/20260619_225509_img_60.png
2026-06-19 22:55:22,660 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 847 images
2026-06-19 22:55:23,661 - INFO - Starting processing for img_84.png...
2026-06-19 22:55:23,663 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_84.png to (0, 0, 188, 469) (margin=10, top_margin=20)
2026-06-19 22:55:23,663 - INFO - Adding 23px headroom to /mnt/zim/tour-comfy/stage/img_84.png
2026-06-19 22:55:23,687 - INFO - Calling API for img_84.png -> 20260619_225523_img_84.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:55:37,332 - INFO - Successfully processed img_84.png -> /mnt/zim/tour-comfy/output/20260619_225523_img_84.png
2026-06-19 22:55:37,563 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 848 images
2026-06-19 22:55:38,564 - INFO - Starting processing for img_43.png...
2026-06-19 22:55:38,565 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_43.png to (32, 75, 208, 481) (margin=10, top_margin=20)
2026-06-19 22:55:38,565 - INFO - Adding 20px headroom to /mnt/zim/tour-comfy/stage/img_43.png
2026-06-19 22:55:38,570 - INFO - Calling API for img_43.png -> 20260619_225538_img_43.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:55:52,659 - INFO - Successfully processed img_43.png -> /mnt/zim/tour-comfy/output/20260619_225538_img_43.png
2026-06-19 22:55:52,864 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 849 images
2026-06-19 22:55:53,865 - INFO - Starting processing for img_42.png...
2026-06-19 22:55:53,866 - INFO - Cropping /mnt/zim/tour-comfy/stage/img_42.png to (48, 74, 228, 476) (margin=10, top_margin=20)
2026-06-19 22:55:53,866 - INFO - Adding 20px headroom to /mnt/zim/tour-comfy/stage/img_42.png
2026-06-19 22:55:53,873 - INFO - Calling API for img_42.png -> 20260619_225553_img_42.png with prompt: high quality. detailed, female nude, high quality. realistic. detailed. female nude
2026-06-19 22:56:06,963 - INFO - Successfully processed img_42.png -> /mnt/zim/tour-comfy/output/20260619_225553_img_42.png
2026-06-19 22:56:07,166 - INFO - Updated /mnt/zim/tour-comfy/output/car.html with 850 images
2026-06-19 23:09:20,403 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 23:09:20,403 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 23:09:20,403 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 23:30:14,960 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 23:30:14,960 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 23:30:14,960 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 23:39:35,718 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 23:39:35,718 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 23:39:35,718 - INFO - API URL: http://127.0.0.1:8500/edit
2026-06-19 23:45:09,379 - INFO - Watcher started. Monitoring /mnt/zim/tour-comfy/stage...
2026-06-19 23:45:09,379 - INFO - Output directory: /mnt/zim/tour-comfy/output
2026-06-19 23:45:09,379 - INFO - API URL: http://127.0.0.1:8500/edit