reorder
This commit is contained in:
@@ -98,4 +98,5 @@ videos
|
|||||||
# generieke stappen
|
# generieke stappen
|
||||||
1) 3ref image HQ detail
|
1) 3ref image HQ detail
|
||||||
2) 3ref image MERGE
|
2) 3ref image MERGE
|
||||||
3) 3ref straight on- head-on - looking viewer
|
3) 3ref straight on- head-on - looking viewer
|
||||||
|
|
||||||
|
|||||||
@@ -2305,6 +2305,60 @@
|
|||||||
|
|
||||||
// --- HYDRATION_START ---
|
// --- HYDRATION_START ---
|
||||||
const PRELOADED_IMAGES = [
|
const PRELOADED_IMAGES = [
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_044252_sc_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_043545_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_043148_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_043148_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_043045_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042836_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042836_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042239_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042228_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042217_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042206_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042154_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042143_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042132_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042121_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042109_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042058_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042047_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042036_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042025_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042014_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_042002_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041951_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041940_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041929_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041918_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041906_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041855_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041649_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041638_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041627_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041615_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041604_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041553_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041542_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041531_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041520_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041508_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041457_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041446_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041435_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041424_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041413_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041401_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041206_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041206_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_041119_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_040812_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_040437_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_035637_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.nobg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_035637_pad_20260628_035257_dup_20260628_033600_dup_view_000_000deg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_035257_dup_20260628_033600_dup_view_000_000deg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_034809_dup_20260628_033600_dup_view_000_000deg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_034614_dup_20260628_033600_dup_view_000_000deg.png",
|
||||||
"20260618_053802_image.png_face.png",
|
"20260618_053802_image.png_face.png",
|
||||||
"20260628_032232_dup_20260618_053932_7_20260618_053802_image.nobg.nobg.nobg.png",
|
"20260628_032232_dup_20260618_053932_7_20260618_053802_image.nobg.nobg.nobg.png",
|
||||||
"20260628_032232_dup_20260618_053932_7_20260618_053802_image.nobg.nobg.png",
|
"20260628_032232_dup_20260618_053932_7_20260618_053802_image.nobg.nobg.png",
|
||||||
@@ -3421,6 +3475,8 @@
|
|||||||
"_turntable/cg_7ec17537/views/view_002_030deg.png",
|
"_turntable/cg_7ec17537/views/view_002_030deg.png",
|
||||||
"_turntable/cg_7ec17537/views/view_001_015deg.png",
|
"_turntable/cg_7ec17537/views/view_001_015deg.png",
|
||||||
"_turntable/cg_7ec17537/views/view_000_000deg.png",
|
"_turntable/cg_7ec17537/views/view_000_000deg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_033600_dup_view_000_000deg.png",
|
||||||
|
"_turntable/cg_7ec17537/views/20260628_033831_dup_20260628_033600_dup_view_000_000deg.png",
|
||||||
"_turntable/up_154b502c/views/view_023_345deg.png",
|
"_turntable/up_154b502c/views/view_023_345deg.png",
|
||||||
"_turntable/up_154b502c/views/view_022_330deg.png",
|
"_turntable/up_154b502c/views/view_022_330deg.png",
|
||||||
"_turntable/up_154b502c/views/view_021_315deg.png",
|
"_turntable/up_154b502c/views/view_021_315deg.png",
|
||||||
@@ -4874,8 +4930,8 @@
|
|||||||
"20260625_024438_dup_20260624_165109_0_20260622_091731_image.nobg.png",
|
"20260625_024438_dup_20260624_165109_0_20260622_091731_image.nobg.png",
|
||||||
"20260625_023536_dup_20260624_165109_0_20260622_091731_image.nobg.png",
|
"20260625_023536_dup_20260624_165109_0_20260622_091731_image.nobg.png",
|
||||||
"20260624_165109_0_20260622_091731_image.nobg.png",
|
"20260624_165109_0_20260622_091731_image.nobg.png",
|
||||||
"20260625_023536_dup_20260624_165109_0_20260622_091731_image.png",
|
|
||||||
"20260624_165109_0_20260622_091731_image.png",
|
"20260624_165109_0_20260622_091731_image.png",
|
||||||
|
"20260625_023536_dup_20260624_165109_0_20260622_091731_image.png",
|
||||||
"up_ab858b0a_face.png",
|
"up_ab858b0a_face.png",
|
||||||
"20260625_022332_dup_20260625_022250_sc_image.png",
|
"20260625_022332_dup_20260625_022250_sc_image.png",
|
||||||
"20260625_022250_sc_image.png",
|
"20260625_022250_sc_image.png",
|
||||||
@@ -5074,8 +5130,8 @@
|
|||||||
"20260624_182958_image.png",
|
"20260624_182958_image.png",
|
||||||
"20260624_174900_image.png",
|
"20260624_174900_image.png",
|
||||||
"20260624_175711_dup_20260624_174943_dup_20260624_173115_image.png",
|
"20260624_175711_dup_20260624_174943_dup_20260624_173115_image.png",
|
||||||
"20260624_174943_dup_20260624_173115_image.png",
|
|
||||||
"20260624_173115_image.png",
|
"20260624_173115_image.png",
|
||||||
|
"20260624_174943_dup_20260624_173115_image.png",
|
||||||
"20260624_174757_image.png",
|
"20260624_174757_image.png",
|
||||||
"20260624_174442_image.png",
|
"20260624_174442_image.png",
|
||||||
"20260624_172923_image.nobg.png",
|
"20260624_172923_image.nobg.png",
|
||||||
@@ -5100,8 +5156,8 @@
|
|||||||
"20260624_164240_crop_20260624_162342_1_20260622_093058_image.png",
|
"20260624_164240_crop_20260624_162342_1_20260622_093058_image.png",
|
||||||
"20260624_164218_crop_20260624_162601_mr_0_20260622_093058_image.nobg.png",
|
"20260624_164218_crop_20260624_162601_mr_0_20260622_093058_image.nobg.png",
|
||||||
"20260624_164059_dup_20260624_163951_dup_20260624_163352_dup_20260624_162601_mr_0_20260622_093058_image.png",
|
"20260624_164059_dup_20260624_163951_dup_20260624_163352_dup_20260624_162601_mr_0_20260622_093058_image.png",
|
||||||
"20260624_164116_dup_20260624_163951_dup_20260624_163352_dup_20260624_162601_mr_0_20260622_093058_image.png",
|
|
||||||
"20260624_163951_dup_20260624_163352_dup_20260624_162601_mr_0_20260622_093058_image.png",
|
"20260624_163951_dup_20260624_163352_dup_20260624_162601_mr_0_20260622_093058_image.png",
|
||||||
|
"20260624_164116_dup_20260624_163951_dup_20260624_163352_dup_20260624_162601_mr_0_20260622_093058_image.png",
|
||||||
"20260624_163634_dup_20260624_163352_dup_20260624_162601_mr_0_20260622_093058_image.png",
|
"20260624_163634_dup_20260624_163352_dup_20260624_162601_mr_0_20260622_093058_image.png",
|
||||||
"20260624_162510_image.png",
|
"20260624_162510_image.png",
|
||||||
"20260624_162408_image.png",
|
"20260624_162408_image.png",
|
||||||
@@ -5183,8 +5239,8 @@
|
|||||||
"20260624_152038_Screenshot_From_2026-06-17_07-41-27.png",
|
"20260624_152038_Screenshot_From_2026-06-17_07-41-27.png",
|
||||||
"20260624_152027_Screenshot_From_2026-06-17_07-41-27.png",
|
"20260624_152027_Screenshot_From_2026-06-17_07-41-27.png",
|
||||||
"20260624_143523_Screenshot_From_2026-06-17_07-41-27.nobg.png",
|
"20260624_143523_Screenshot_From_2026-06-17_07-41-27.nobg.png",
|
||||||
"20260624_151746_dup_20260624_143523_Screenshot_From_2026-06-17_07-41-27.png",
|
|
||||||
"20260624_143523_Screenshot_From_2026-06-17_07-41-27.png",
|
"20260624_143523_Screenshot_From_2026-06-17_07-41-27.png",
|
||||||
|
"20260624_151746_dup_20260624_143523_Screenshot_From_2026-06-17_07-41-27.png",
|
||||||
"20260624_151501_dup_20260624_143523_Screenshot_From_2026-06-17_07-41-27.png",
|
"20260624_151501_dup_20260624_143523_Screenshot_From_2026-06-17_07-41-27.png",
|
||||||
"20260624_151439_dup_20260624_143523_Screenshot_From_2026-06-17_07-41-27.png",
|
"20260624_151439_dup_20260624_143523_Screenshot_From_2026-06-17_07-41-27.png",
|
||||||
"20260624_151250_Screenshot_From_2026-06-17_07-41-27.nobg.png",
|
"20260624_151250_Screenshot_From_2026-06-17_07-41-27.nobg.png",
|
||||||
@@ -5907,8 +5963,8 @@
|
|||||||
"20260618_010638_b1.png",
|
"20260618_010638_b1.png",
|
||||||
"20260622_020521_dup_20260622_020223_image.nobg.png",
|
"20260622_020521_dup_20260622_020223_image.nobg.png",
|
||||||
"20260622_021658_dup_20260621_212650_image.nobg.png",
|
"20260622_021658_dup_20260621_212650_image.nobg.png",
|
||||||
"20260622_020223_image.png",
|
|
||||||
"20260622_020521_dup_20260622_020223_image.png",
|
"20260622_020521_dup_20260622_020223_image.png",
|
||||||
|
"20260622_020223_image.png",
|
||||||
"20260622_013636_image.nobg.png",
|
"20260622_013636_image.nobg.png",
|
||||||
"20260622_015031_image.png",
|
"20260622_015031_image.png",
|
||||||
"20260622_013636_image.png",
|
"20260622_013636_image.png",
|
||||||
@@ -9505,6 +9561,7 @@
|
|||||||
_orbitTabFlippers = {};
|
_orbitTabFlippers = {};
|
||||||
|
|
||||||
const panel = document.getElementById('sbPanelOrbit');
|
const panel = document.getElementById('sbPanelOrbit');
|
||||||
|
const savedScrollTop = panel ? panel.scrollTop : 0;
|
||||||
panel.innerHTML = '<div style="font-size:11px;color:#555;padding:8px 0">Loading…</div>';
|
panel.innerHTML = '<div style="font-size:11px;color:#555;padding:8px 0">Loading…</div>';
|
||||||
try {
|
try {
|
||||||
const r = await fetch(`${IMAGE_FOLDER}_data/turntables.json?t=` + Date.now());
|
const r = await fetch(`${IMAGE_FOLDER}_data/turntables.json?t=` + Date.now());
|
||||||
@@ -9548,6 +9605,13 @@
|
|||||||
_orbitStartTabFlipper(t.group_id, t.frames);
|
_orbitStartTabFlipper(t.group_id, t.frames);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (panel) {
|
||||||
|
panel.scrollTop = savedScrollTop;
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
if (panel) panel.scrollTop = savedScrollTop;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _orbitStartTabFlipper(groupId, frameRels) {
|
function _orbitStartTabFlipper(groupId, frameRels) {
|
||||||
@@ -10609,6 +10673,16 @@
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (e.altKey && e.key === 'Enter') {
|
||||||
|
if (document.getElementById('studio').classList.contains('open') && _activeSidebarTab === 'generate') {
|
||||||
|
const btn = document.getElementById('sbGenBtn');
|
||||||
|
if (btn && !btn.disabled) {
|
||||||
|
btn.click();
|
||||||
|
e.preventDefault();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (e.key === 'Escape') {
|
if (e.key === 'Escape') {
|
||||||
if (document.getElementById('variantPicker').classList.contains('open')) {
|
if (document.getElementById('variantPicker').classList.contains('open')) {
|
||||||
closeVariantPicker(); return;
|
closeVariantPicker(); return;
|
||||||
@@ -10839,6 +10913,7 @@
|
|||||||
function renderSidebarGenerate() {
|
function renderSidebarGenerate() {
|
||||||
const panel = document.getElementById('sbPanelGenerate');
|
const panel = document.getElementById('sbPanelGenerate');
|
||||||
if (!panel) return;
|
if (!panel) return;
|
||||||
|
const savedScrollTop = panel.scrollTop;
|
||||||
// Preserve live input values before re-render
|
// Preserve live input values before re-render
|
||||||
const prevPromptVal = document.getElementById('sbGenPromptInput')?.value ?? '';
|
const prevPromptVal = document.getElementById('sbGenPromptInput')?.value ?? '';
|
||||||
_sbPadTop = document.getElementById('sbPadTop')?.value ?? _sbPadTop;
|
_sbPadTop = document.getElementById('sbPadTop')?.value ?? _sbPadTop;
|
||||||
@@ -11041,6 +11116,11 @@
|
|||||||
const promptEl = document.getElementById('sbGenPromptInput');
|
const promptEl = document.getElementById('sbGenPromptInput');
|
||||||
if (promptEl) autoGrowPrompt(promptEl);
|
if (promptEl) autoGrowPrompt(promptEl);
|
||||||
if (_sbPoseFilter) sbFilterPoses(_sbPoseFilter); // re-apply after rebuild
|
if (_sbPoseFilter) sbFilterPoses(_sbPoseFilter); // re-apply after rebuild
|
||||||
|
|
||||||
|
panel.scrollTop = savedScrollTop;
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
if (panel) panel.scrollTop = savedScrollTop;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Grow the custom-prompt textarea to fit its content (capped by max-height in CSS).
|
// Grow the custom-prompt textarea to fit its content (capped by max-height in CSS).
|
||||||
@@ -11586,6 +11666,7 @@
|
|||||||
function renderSidebarFaceswap() {
|
function renderSidebarFaceswap() {
|
||||||
const panel = document.getElementById('sbPanelFaceswap');
|
const panel = document.getElementById('sbPanelFaceswap');
|
||||||
if (!panel) return;
|
if (!panel) return;
|
||||||
|
const savedScrollTop = panel.scrollTop;
|
||||||
|
|
||||||
if (_fsTrimVideo) {
|
if (_fsTrimVideo) {
|
||||||
// Clip timeline view
|
// Clip timeline view
|
||||||
@@ -11674,6 +11755,11 @@
|
|||||||
if (s.facefusion) { hairCb.disabled = false; hairBdg.style.display = 'none'; }
|
if (s.facefusion) { hairCb.disabled = false; hairBdg.style.display = 'none'; }
|
||||||
else { hairCb.disabled = true; hairBdg.style.display = ''; }
|
else { hairCb.disabled = true; hairBdg.style.display = ''; }
|
||||||
}).catch(()=>{});
|
}).catch(()=>{});
|
||||||
|
|
||||||
|
panel.scrollTop = savedScrollTop;
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
if (panel) panel.scrollTop = savedScrollTop;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function sbSelectTemplate(videoName) {
|
function sbSelectTemplate(videoName) {
|
||||||
@@ -11875,6 +11961,7 @@
|
|||||||
function renderSidebarScenery() {
|
function renderSidebarScenery() {
|
||||||
const panel = document.getElementById('sbPanelScenery');
|
const panel = document.getElementById('sbPanelScenery');
|
||||||
if (!panel) return;
|
if (!panel) return;
|
||||||
|
const savedScrollTop = panel.scrollTop;
|
||||||
// Preserve a typed prompt across the frequent re-renders (slot changes).
|
// Preserve a typed prompt across the frequent re-renders (slot changes).
|
||||||
const prevScenePrompt = document.getElementById('scenePromptInput')?.value || '';
|
const prevScenePrompt = document.getElementById('scenePromptInput')?.value || '';
|
||||||
// Auto-fill the Person slot (image2) once per group with the current image.
|
// Auto-fill the Person slot (image2) once per group with the current image.
|
||||||
@@ -12062,6 +12149,11 @@
|
|||||||
if (lbl) lbl.textContent = formatSecs(vid.currentTime || 0);
|
if (lbl) lbl.textContent = formatSecs(vid.currentTime || 0);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
panel.scrollTop = savedScrollTop;
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
if (panel) panel.scrollTop = savedScrollTop;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scrub the preview video live as the slider moves (no server round-trip).
|
// Scrub the preview video live as the slider moves (no server round-trip).
|
||||||
@@ -12325,6 +12417,7 @@
|
|||||||
function renderSidebarSegment() {
|
function renderSidebarSegment() {
|
||||||
const panel = document.getElementById('sbPanelSegment');
|
const panel = document.getElementById('sbPanelSegment');
|
||||||
if (!panel) return;
|
if (!panel) return;
|
||||||
|
const savedScrollTop = panel.scrollTop;
|
||||||
const isChecked = document.getElementById('studioViewer')?.classList.contains('show-checker');
|
const isChecked = document.getElementById('studioViewer')?.classList.contains('show-checker');
|
||||||
panel.innerHTML = `
|
panel.innerHTML = `
|
||||||
<div style="font-size:11px;color:#666;margin-bottom:12px;line-height:1.6">
|
<div style="font-size:11px;color:#666;margin-bottom:12px;line-height:1.6">
|
||||||
@@ -12353,6 +12446,11 @@
|
|||||||
const btn = document.getElementById('sbSam2Btn');
|
const btn = document.getElementById('sbSam2Btn');
|
||||||
if (btn) btn.title = d.sam2 ? 'SAM2 available' : 'SAM2 not available — will use rembg fallback';
|
if (btn) btn.title = d.sam2 ? 'SAM2 available' : 'SAM2 not available — will use rembg fallback';
|
||||||
}).catch(()=>{});
|
}).catch(()=>{});
|
||||||
|
|
||||||
|
panel.scrollTop = savedScrollTop;
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
if (panel) panel.scrollTop = savedScrollTop;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sam2RemoveBg() {
|
async function sam2RemoveBg() {
|
||||||
|
|||||||
@@ -791,10 +791,18 @@ def _faceswap_worker(job_id: str, model_filename: str, video_name: str, enhance:
|
|||||||
# 3. Write frame-swapped temp video
|
# 3. Write frame-swapped temp video
|
||||||
ts = time.strftime("%Y%m%d_%H%M%S")
|
ts = time.strftime("%Y%m%d_%H%M%S")
|
||||||
vid_stem = os.path.splitext(video_name)[0]
|
vid_stem = os.path.splitext(video_name)[0]
|
||||||
base_name = naming.get_base_name(model_filename)
|
dir_part = os.path.dirname(model_filename)
|
||||||
|
basename = os.path.basename(model_filename)
|
||||||
|
clean_basename = naming.get_base_name(basename)
|
||||||
prev_tag = f"_prev{int(scale*100)}" if scale < 1.0 else ""
|
prev_tag = f"_prev{int(scale*100)}" if scale < 1.0 else ""
|
||||||
tmp_name = f"{ts}_fs_tmp_{vid_stem}_{base_name}{prev_tag}.mp4"
|
tmp_basename = f"{ts}_fs_tmp_{vid_stem}_{clean_basename}{prev_tag}.mp4"
|
||||||
out_name = f"{ts}_fs_{vid_stem}_{base_name}{prev_tag}.mp4"
|
out_basename = f"{ts}_fs_{vid_stem}_{clean_basename}{prev_tag}.mp4"
|
||||||
|
if dir_part:
|
||||||
|
tmp_name = f"{dir_part}/{tmp_basename}"
|
||||||
|
out_name = f"{dir_part}/{out_basename}"
|
||||||
|
else:
|
||||||
|
tmp_name = tmp_basename
|
||||||
|
out_name = out_basename
|
||||||
tmp_path = os.path.join(output_dir, tmp_name)
|
tmp_path = os.path.join(output_dir, tmp_name)
|
||||||
out_path = os.path.join(output_dir, out_name)
|
out_path = os.path.join(output_dir, out_name)
|
||||||
|
|
||||||
@@ -862,7 +870,7 @@ def _faceswap_worker(job_id: str, model_filename: str, video_name: str, enhance:
|
|||||||
# 5. Snapshot poster + register output in DB under same group as model
|
# 5. Snapshot poster + register output in DB under same group as model
|
||||||
_make_video_poster(out_path)
|
_make_video_poster(out_path)
|
||||||
person = database.get_person(model_filename)
|
person = database.get_person(model_filename)
|
||||||
group_id = (person[1] if person and person[1] else naming.get_base_name(model_filename))
|
group_id = (person[1] if person and person[1] else naming.get_base_name(os.path.basename(model_filename)))
|
||||||
database.upsert_person(
|
database.upsert_person(
|
||||||
out_name,
|
out_name,
|
||||||
filepath=out_path,
|
filepath=out_path,
|
||||||
@@ -915,10 +923,16 @@ def _faceswap_worker_ff(job_id: str, model_filename: str, video_name: str,
|
|||||||
video_path = os.path.join(wireframe_dir, video_name)
|
video_path = os.path.join(wireframe_dir, video_name)
|
||||||
ts = time.strftime('%Y%m%d_%H%M%S')
|
ts = time.strftime('%Y%m%d_%H%M%S')
|
||||||
vid_stem = os.path.splitext(video_name)[0]
|
vid_stem = os.path.splitext(video_name)[0]
|
||||||
base_name = naming.get_base_name(model_filename)
|
dir_part = os.path.dirname(model_filename)
|
||||||
|
basename = os.path.basename(model_filename)
|
||||||
|
clean_basename = naming.get_base_name(basename)
|
||||||
scale = max(0.1, min(1.0, preview_scale))
|
scale = max(0.1, min(1.0, preview_scale))
|
||||||
prev_tag = f'_prev{int(scale*100)}' if scale < 1.0 else ''
|
prev_tag = f'_prev{int(scale*100)}' if scale < 1.0 else ''
|
||||||
out_name = f'{ts}_fs_{vid_stem}_{base_name}{prev_tag}.mp4'
|
out_basename = f'{ts}_fs_{vid_stem}_{clean_basename}{prev_tag}.mp4'
|
||||||
|
if dir_part:
|
||||||
|
out_name = f'{dir_part}/{out_basename}'
|
||||||
|
else:
|
||||||
|
out_name = out_basename
|
||||||
out_path = os.path.join(output_dir, out_name)
|
out_path = os.path.join(output_dir, out_name)
|
||||||
|
|
||||||
processors = ['face_swapper']
|
processors = ['face_swapper']
|
||||||
@@ -1017,7 +1031,7 @@ def _faceswap_worker_ff(job_id: str, model_filename: str, video_name: str,
|
|||||||
|
|
||||||
_make_video_poster(out_path)
|
_make_video_poster(out_path)
|
||||||
person = database.get_person(model_filename)
|
person = database.get_person(model_filename)
|
||||||
group_id = (person[1] if person and person[1] else naming.get_base_name(model_filename))
|
group_id = (person[1] if person and person[1] else naming.get_base_name(os.path.basename(model_filename)))
|
||||||
database.upsert_person(
|
database.upsert_person(
|
||||||
out_name, filepath=out_path, group_id=group_id,
|
out_name, filepath=out_path, group_id=group_id,
|
||||||
content_type='video', faceswap_source_video=video_name,
|
content_type='video', faceswap_source_video=video_name,
|
||||||
@@ -1531,11 +1545,11 @@ def _batch_worker(job_id: str, filenames: list, prompts: list[str], poses: list,
|
|||||||
if person and person[1]:
|
if person and person[1]:
|
||||||
actual_gid = person[1]
|
actual_gid = person[1]
|
||||||
else:
|
else:
|
||||||
actual_gid = group_id or naming.get_base_name(fname)
|
actual_gid = group_id or naming.get_base_name(os.path.basename(fname))
|
||||||
database.upsert_person(fname, group_id=actual_gid)
|
database.upsert_person(fname, group_id=actual_gid)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error determining/updating group for {fname}: {e}")
|
print(f"Error determining/updating group for {fname}: {e}")
|
||||||
actual_gid = group_id or naming.get_base_name(fname)
|
actual_gid = group_id or naming.get_base_name(os.path.basename(fname))
|
||||||
|
|
||||||
fpath = os.path.join(output_dir, fname)
|
fpath = os.path.join(output_dir, fname)
|
||||||
if not os.path.exists(fpath):
|
if not os.path.exists(fpath):
|
||||||
@@ -1586,8 +1600,14 @@ def _batch_worker(job_id: str, filenames: list, prompts: list[str], poses: list,
|
|||||||
extra_imgs = [pose_guide_pil] if pose_guide_pil else None
|
extra_imgs = [pose_guide_pil] if pose_guide_pil else None
|
||||||
png = _run_pipeline(pil, actual_prompt, seed, max_area, extra_images=extra_imgs)
|
png = _run_pipeline(pil, actual_prompt, seed, max_area, extra_images=extra_imgs)
|
||||||
ts = time.strftime("%Y%m%d_%H%M%S")
|
ts = time.strftime("%Y%m%d_%H%M%S")
|
||||||
clean_fname = naming.get_base_name(fname)
|
dir_part = os.path.dirname(fname)
|
||||||
out_name = f"{ts}_{clean_fname}"
|
basename = os.path.basename(fname)
|
||||||
|
clean_basename = naming.get_base_name(basename)
|
||||||
|
new_basename = f"{ts}_{clean_basename}"
|
||||||
|
if dir_part:
|
||||||
|
out_name = f"{dir_part}/{new_basename}"
|
||||||
|
else:
|
||||||
|
out_name = new_basename
|
||||||
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:
|
||||||
@@ -1683,8 +1703,14 @@ def _multi_ref_worker(job_id: str, filenames: list[str], prompts: list[str], pos
|
|||||||
|
|
||||||
png = _run_pipeline(work_pil, actual_prompt, seed, max_area, extra_images=extra_pils)
|
png = _run_pipeline(work_pil, actual_prompt, seed, max_area, extra_images=extra_pils)
|
||||||
ts = time.strftime("%Y%m%d_%H%M%S")
|
ts = time.strftime("%Y%m%d_%H%M%S")
|
||||||
clean = naming.get_base_name(primary_fname)
|
dir_part = os.path.dirname(primary_fname)
|
||||||
out_name = f"{ts}_mr_{clean}"
|
basename = os.path.basename(primary_fname)
|
||||||
|
clean_basename = naming.get_base_name(basename)
|
||||||
|
new_basename = f"{ts}_mr_{clean_basename}"
|
||||||
|
if dir_part:
|
||||||
|
out_name = f"{dir_part}/{new_basename}"
|
||||||
|
else:
|
||||||
|
out_name = new_basename
|
||||||
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:
|
||||||
@@ -2112,11 +2138,16 @@ def generate_video(req: VideoStitchRequest):
|
|||||||
paths = paths + list(reversed(paths[1:-1])) if len(paths) > 2 else paths + list(reversed(paths))
|
paths = paths + list(reversed(paths[1:-1])) if len(paths) > 2 else paths + list(reversed(paths))
|
||||||
|
|
||||||
ts = time.strftime("%Y%m%d_%H%M%S")
|
ts = time.strftime("%Y%m%d_%H%M%S")
|
||||||
base = naming.get_base_name(req.filenames[0])
|
base = naming.get_base_name(os.path.basename(req.filenames[0]))
|
||||||
stem = os.path.splitext(base)[0]
|
stem = os.path.splitext(base)[0]
|
||||||
out_name = req.output_name or f"{ts}_vid_{stem}.mp4"
|
out_basename = req.output_name or f"{ts}_vid_{stem}.mp4"
|
||||||
if not out_name.lower().endswith(".mp4"):
|
if not out_basename.lower().endswith(".mp4"):
|
||||||
out_name += ".mp4"
|
out_basename += ".mp4"
|
||||||
|
dir_part = os.path.dirname(req.filenames[0])
|
||||||
|
if dir_part:
|
||||||
|
out_name = f"{dir_part}/{out_basename}"
|
||||||
|
else:
|
||||||
|
out_name = out_basename
|
||||||
out_path = os.path.join(output_dir, out_name)
|
out_path = os.path.join(output_dir, out_name)
|
||||||
|
|
||||||
# Build ffmpeg concat list in a temp file
|
# Build ffmpeg concat list in a temp file
|
||||||
@@ -2151,7 +2182,7 @@ def generate_video(req: VideoStitchRequest):
|
|||||||
|
|
||||||
# Register in DB so it shows up in the gallery
|
# Register in DB so it shows up in the gallery
|
||||||
person = database.get_person(req.filenames[0])
|
person = database.get_person(req.filenames[0])
|
||||||
group_id = person[1] if person and person[1] else naming.get_base_name(req.filenames[0])
|
group_id = person[1] if person and person[1] else naming.get_base_name(os.path.basename(req.filenames[0]))
|
||||||
try:
|
try:
|
||||||
next_order = database.get_next_sort_order(group_id)
|
next_order = database.get_next_sort_order(group_id)
|
||||||
database.upsert_person(
|
database.upsert_person(
|
||||||
@@ -2456,13 +2487,13 @@ def db_repair(req: RepairRequest):
|
|||||||
if not os.path.exists(fpath):
|
if not os.path.exists(fpath):
|
||||||
raise HTTPException(404, "File not found on disk")
|
raise HTTPException(404, "File not found on disk")
|
||||||
# Basic import: just register it in DB
|
# Basic import: just register it in DB
|
||||||
database.upsert_person(req.filename, filepath=fpath, group_id=naming.get_base_name(req.filename), is_source=True)
|
database.upsert_person(req.filename, filepath=fpath, group_id=naming.get_base_name(os.path.basename(req.filename)), is_source=True)
|
||||||
_invalidate_static()
|
_invalidate_static()
|
||||||
_run_consistency_check()
|
_run_consistency_check()
|
||||||
return {"status": "imported", "filename": req.filename}
|
return {"status": "imported", "filename": req.filename}
|
||||||
elif req.action == "assign_group":
|
elif req.action == "assign_group":
|
||||||
# Assign a group_id (default to base name if not provided)
|
# Assign a group_id (default to base name if not provided)
|
||||||
gid = req.group_id or naming.get_base_name(req.filename)
|
gid = req.group_id or naming.get_base_name(os.path.basename(req.filename))
|
||||||
database.upsert_person(req.filename, group_id=gid)
|
database.upsert_person(req.filename, group_id=gid)
|
||||||
_invalidate_static()
|
_invalidate_static()
|
||||||
_run_consistency_check()
|
_run_consistency_check()
|
||||||
@@ -2766,7 +2797,7 @@ def set_image_preferred(filename: str):
|
|||||||
group_id = person[1]
|
group_id = person[1]
|
||||||
if not group_id:
|
if not group_id:
|
||||||
# Auto-assign group_id if missing (legacy/orphan)
|
# Auto-assign group_id if missing (legacy/orphan)
|
||||||
group_id = naming.get_base_name(filename)
|
group_id = naming.get_base_name(os.path.basename(filename))
|
||||||
database.upsert_person(filename, group_id=group_id)
|
database.upsert_person(filename, group_id=group_id)
|
||||||
print(f"[fix] Auto-assigned group_id={group_id} to orphan {filename} during set-preferred")
|
print(f"[fix] Auto-assigned group_id={group_id} to orphan {filename} during set-preferred")
|
||||||
|
|
||||||
@@ -3404,16 +3435,21 @@ def _scenery_worker(job_id: str, model_filename: str, scene_pil: Image.Image,
|
|||||||
extra_images=extra_images,
|
extra_images=extra_images,
|
||||||
)
|
)
|
||||||
ts = time.strftime("%Y%m%d_%H%M%S")
|
ts = time.strftime("%Y%m%d_%H%M%S")
|
||||||
base_name = naming.get_base_name(model_filename)
|
dir_part = os.path.dirname(model_filename)
|
||||||
# Ensure .png extension
|
basename = os.path.basename(model_filename)
|
||||||
if not base_name.lower().endswith('.png'):
|
clean_basename = naming.get_base_name(basename)
|
||||||
base_name = os.path.splitext(base_name)[0] + '.png'
|
if not clean_basename.lower().endswith('.png'):
|
||||||
out_name = f"{ts}_sc_{base_name}"
|
clean_basename = os.path.splitext(clean_basename)[0] + '.png'
|
||||||
|
new_basename = f"{ts}_sc_{clean_basename}"
|
||||||
|
if dir_part:
|
||||||
|
out_name = f"{dir_part}/{new_basename}"
|
||||||
|
else:
|
||||||
|
out_name = new_basename
|
||||||
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_bytes)
|
f.write(png_bytes)
|
||||||
person = database.get_person(model_filename)
|
person = database.get_person(model_filename)
|
||||||
group_id = person[1] if person and person[1] else naming.get_base_name(model_filename)
|
group_id = person[1] if person and person[1] else naming.get_base_name(os.path.basename(model_filename))
|
||||||
try:
|
try:
|
||||||
embedding = embeddings.generate_embedding(out_path)
|
embedding = embeddings.generate_embedding(out_path)
|
||||||
next_order = database.get_next_sort_order(group_id)
|
next_order = database.get_next_sort_order(group_id)
|
||||||
@@ -3830,9 +3866,16 @@ def remove_background_sam(filename: str):
|
|||||||
raise HTTPException(404, "Image file not found")
|
raise HTTPException(404, "Image file not found")
|
||||||
path = person[5]
|
path = person[5]
|
||||||
output_dir = os.path.dirname(path)
|
output_dir = os.path.dirname(path)
|
||||||
stem = os.path.splitext(filename)[0]
|
|
||||||
nobg_filename = f"{stem}.nobg.png"
|
dir_part = os.path.dirname(filename)
|
||||||
nobg_path = os.path.join(output_dir, nobg_filename)
|
basename = os.path.basename(filename)
|
||||||
|
stem = os.path.splitext(basename)[0]
|
||||||
|
nobg_basename = f"{stem}.nobg.png"
|
||||||
|
if dir_part:
|
||||||
|
nobg_filename = f"{dir_part}/{nobg_basename}"
|
||||||
|
else:
|
||||||
|
nobg_filename = nobg_basename
|
||||||
|
nobg_path = os.path.join(output_dir, nobg_basename)
|
||||||
|
|
||||||
with open(path, "rb") as f:
|
with open(path, "rb") as f:
|
||||||
png_bytes = f.read()
|
png_bytes = f.read()
|
||||||
@@ -3904,11 +3947,18 @@ def manual_crop_image(filename: str, req: CropRequest):
|
|||||||
# Mirror duplicate_image: copy file + register a DB row that points back to the original.
|
# Mirror duplicate_image: copy file + register a DB row that points back to the original.
|
||||||
from datetime import datetime as _dt
|
from datetime import datetime as _dt
|
||||||
output_dir = os.path.dirname(src_path)
|
output_dir = os.path.dirname(src_path)
|
||||||
ext = os.path.splitext(filename)[1] or ".png"
|
dir_part = os.path.dirname(filename)
|
||||||
stem = os.path.splitext(filename)[0]
|
basename = os.path.basename(filename)
|
||||||
|
stem, ext = os.path.splitext(basename)
|
||||||
|
if not ext:
|
||||||
|
ext = ".png"
|
||||||
ts = _dt.now().strftime("%Y%m%d_%H%M%S")
|
ts = _dt.now().strftime("%Y%m%d_%H%M%S")
|
||||||
new_filename = f"{ts}_crop_{stem}{ext}"
|
new_basename = f"{ts}_crop_{stem}{ext}"
|
||||||
path = os.path.join(output_dir, new_filename)
|
if dir_part:
|
||||||
|
new_filename = f"{dir_part}/{new_basename}"
|
||||||
|
else:
|
||||||
|
new_filename = new_basename
|
||||||
|
path = os.path.join(output_dir, new_basename)
|
||||||
shutil.copy2(src_path, path)
|
shutil.copy2(src_path, path)
|
||||||
database.upsert_person(
|
database.upsert_person(
|
||||||
new_filename, filepath=path, group_id=person[1],
|
new_filename, filepath=path, group_id=person[1],
|
||||||
@@ -4015,11 +4065,18 @@ def pad_image(filename: str, req: PadRequest):
|
|||||||
if req.as_copy:
|
if req.as_copy:
|
||||||
from datetime import datetime as _dt
|
from datetime import datetime as _dt
|
||||||
output_dir = os.path.dirname(src_path)
|
output_dir = os.path.dirname(src_path)
|
||||||
ext = os.path.splitext(filename)[1] or ".png"
|
dir_part = os.path.dirname(filename)
|
||||||
stem = os.path.splitext(filename)[0]
|
basename = os.path.basename(filename)
|
||||||
|
stem, ext = os.path.splitext(basename)
|
||||||
|
if not ext:
|
||||||
|
ext = ".png"
|
||||||
ts = _dt.now().strftime("%Y%m%d_%H%M%S")
|
ts = _dt.now().strftime("%Y%m%d_%H%M%S")
|
||||||
new_filename = f"{ts}_pad_{stem}{ext}"
|
new_basename = f"{ts}_pad_{stem}{ext}"
|
||||||
path = os.path.join(output_dir, new_filename)
|
if dir_part:
|
||||||
|
new_filename = f"{dir_part}/{new_basename}"
|
||||||
|
else:
|
||||||
|
new_filename = new_basename
|
||||||
|
path = os.path.join(output_dir, new_basename)
|
||||||
shutil.copy2(src_path, path)
|
shutil.copy2(src_path, path)
|
||||||
database.upsert_person(
|
database.upsert_person(
|
||||||
new_filename, filepath=path, group_id=person[1],
|
new_filename, filepath=path, group_id=person[1],
|
||||||
@@ -4104,11 +4161,20 @@ def duplicate_image(filename: str):
|
|||||||
raise HTTPException(404, "Image file not found")
|
raise HTTPException(404, "Image file not found")
|
||||||
path = person[5]
|
path = person[5]
|
||||||
output_dir = os.path.dirname(path)
|
output_dir = os.path.dirname(path)
|
||||||
ext = os.path.splitext(filename)[1] or ".png"
|
|
||||||
|
dir_part = os.path.dirname(filename)
|
||||||
|
basename = os.path.basename(filename)
|
||||||
|
stem, ext = os.path.splitext(basename)
|
||||||
|
if not ext:
|
||||||
|
ext = ".png"
|
||||||
ts = _dt.now().strftime("%Y%m%d_%H%M%S")
|
ts = _dt.now().strftime("%Y%m%d_%H%M%S")
|
||||||
stem = os.path.splitext(filename)[0]
|
new_basename = f"{ts}_dup_{stem}{ext}"
|
||||||
new_filename = f"{ts}_dup_{stem}{ext}"
|
if dir_part:
|
||||||
new_path = os.path.join(output_dir, new_filename)
|
new_filename = f"{dir_part}/{new_basename}"
|
||||||
|
else:
|
||||||
|
new_filename = new_basename
|
||||||
|
|
||||||
|
new_path = os.path.join(output_dir, new_basename)
|
||||||
_shutil.copy2(path, new_path)
|
_shutil.copy2(path, new_path)
|
||||||
group_id = person[1]
|
group_id = person[1]
|
||||||
# person tuple: (name, group_id, tags, embedding, clip_description, filepath,
|
# person tuple: (name, group_id, tags, embedding, clip_description, filepath,
|
||||||
@@ -4828,16 +4894,22 @@ def _pose_gen_worker(job_id: str, model_filename: str, prompt: str, seed: int,
|
|||||||
|
|
||||||
png_bytes = _run_pipeline(model_pil, prompt, seed, MAX_AREA, extra_images=extra_images)
|
png_bytes = _run_pipeline(model_pil, prompt, seed, MAX_AREA, extra_images=extra_images)
|
||||||
ts = time.strftime("%Y%m%d_%H%M%S")
|
ts = time.strftime("%Y%m%d_%H%M%S")
|
||||||
base_name = naming.get_base_name(model_filename)
|
dir_part = os.path.dirname(model_filename)
|
||||||
if not base_name.lower().endswith(".png"):
|
basename = os.path.basename(model_filename)
|
||||||
base_name = os.path.splitext(base_name)[0] + ".png"
|
clean_basename = naming.get_base_name(basename)
|
||||||
out_name = f"{ts}_pose_{base_name}"
|
if not clean_basename.lower().endswith(".png"):
|
||||||
|
clean_basename = os.path.splitext(clean_basename)[0] + ".png"
|
||||||
|
new_basename = f"{ts}_pose_{clean_basename}"
|
||||||
|
if dir_part:
|
||||||
|
out_name = f"{dir_part}/{new_basename}"
|
||||||
|
else:
|
||||||
|
out_name = new_basename
|
||||||
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_bytes)
|
f.write(png_bytes)
|
||||||
|
|
||||||
person = database.get_person(model_filename)
|
person = database.get_person(model_filename)
|
||||||
group_id = person[1] if person and person[1] else naming.get_base_name(model_filename)
|
group_id = person[1] if person and person[1] else naming.get_base_name(os.path.basename(model_filename))
|
||||||
|
|
||||||
embedding = embeddings.generate_embedding(out_path)
|
embedding = embeddings.generate_embedding(out_path)
|
||||||
next_order = database.get_next_sort_order(group_id)
|
next_order = database.get_next_sort_order(group_id)
|
||||||
|
|||||||
@@ -22,6 +22,18 @@ Masterpiece, you are in a black void, hyper-realistic, high quality. detailed. d
|
|||||||
1 female nude.
|
1 female nude.
|
||||||
realistic.
|
realistic.
|
||||||
|
|
||||||
|
# Feminine Body
|
||||||
|
|
||||||
|
Stand with legs slightly apart, knees relaxed. Slightly turn hips to the side, arching back to accentuate buttocks and pelvis depth. Tilt chin slightly upwards, showing teeth in a playful, confident smile. Tilt head slightly, revealing the ear. Relax shoulders and extend arms at sides, drawing attention to the silhouette of the torso. Keep knees slightly bent, creating a gentle, inviting curvature of the spine. Allow the chest to gently protrude, highlighting breast size and natural cleavage. Maintain a relaxed facial expression, eyes gazing forward with a hint of arouse. The primary focus
|
||||||
|
should be on the exposed genitals, capturing their natural form and contours with utmost clarity. Perfect anatomy, hyper realistic.
|
||||||
|
|
||||||
|
# Undress
|
||||||
|
|
||||||
|
masterpiece, high quality,
|
||||||
|
undress,
|
||||||
|
hyper realistic, detailed, detailed skin.
|
||||||
|
Ensure the lighting is soft and diffused to bring out the detailed skin texture, especially in the areas of the breasts and genitals. Capture this image in high resolution to showcase the hyper-realistic quality of the photograph. Perfect anatomy, realistic.
|
||||||
|
|
||||||
# Feminine NO BG (18)
|
# Feminine NO BG (18)
|
||||||
|
|
||||||
You are in a black empty void.
|
You are in a black empty void.
|
||||||
@@ -65,10 +77,10 @@ Anatomically precise. Keep characteristics of reference image.
|
|||||||
|
|
||||||
# Three-quarter
|
# Three-quarter
|
||||||
|
|
||||||
You are in a black empty void.
|
You are in a black empty void.
|
||||||
high quality, masterpiece, detailed, detailed skin.
|
high quality, masterpiece, detailed, detailed skin.
|
||||||
Head-on a right-front view.
|
Head-on a right-front view.
|
||||||
Top-to-toe. detailed full-nude-body, female portrait, hyper-realistic.
|
Top-to-toe. detailed full-nude-body, female portrait, hyper-realistic.
|
||||||
Keep characteristics of reference image.
|
Keep characteristics of reference image.
|
||||||
|
|
||||||
# Head-on undress (18)
|
# Head-on undress (18)
|
||||||
@@ -125,14 +137,14 @@ Keep characteristics of reference image.
|
|||||||
|
|
||||||
masterpiece, you are in a black void, high quality, detailed, undress, combine the characteristics from reference images.
|
masterpiece, you are in a black void, high quality, detailed, undress, combine the characteristics from reference images.
|
||||||
detailed skin, detailed full-nude-body. teenage female.
|
detailed skin, detailed full-nude-body. teenage female.
|
||||||
Photo-realistic.
|
Photo-realistic.
|
||||||
Anatomically precise, keep the posture and gesture from the base image.
|
Anatomically precise, keep the posture and gesture from the base image.
|
||||||
|
|
||||||
# Merge (18)
|
# Merge (18)
|
||||||
|
|
||||||
masterpiece, you are in a black void, high quality, detailed, undress, combine the characteristics from reference images.
|
masterpiece, you are in a black void, high quality, detailed, undress, combine the characteristics from reference images.
|
||||||
detailed skin, detailed full-nude-body. teenage female.
|
detailed skin, detailed full-nude-body. teenage female.
|
||||||
hyper realistic.
|
hyper realistic.
|
||||||
Anatomically precise, keep the posture and gesture from the base image.
|
Anatomically precise, keep the posture and gesture from the base image.
|
||||||
|
|
||||||
# Merge
|
# Merge
|
||||||
@@ -4591,3 +4603,4 @@ of serene anticipation, lips parted ever so slightly. The room around her is a v
|
|||||||
|
|
||||||
In the void, you lay supine with legs spread wide and bent at the knees, your feet flat against the ground. The back is slightly arched, emphasizing the curve of the lower spine. Your arms are outstretched to the sides, parallel to the ground, with elbows slightly bent. The head is tilted back, eyes closed and mouth slightly open, in a state of blissful surrender. The hips are raised just enough to create tension in the lower back, enhancing the silhouette. A steel band encircles each thigh, just above the knee, cinching them tightly together, symbolizing restraint. Your skin glistens with a
|
In the void, you lay supine with legs spread wide and bent at the knees, your feet flat against the ground. The back is slightly arched, emphasizing the curve of the lower spine. Your arms are outstretched to the sides, parallel to the ground, with elbows slightly bent. The head is tilted back, eyes closed and mouth slightly open, in a state of blissful surrender. The hips are raised just enough to create tension in the lower back, enhancing the silhouette. A steel band encircles each thigh, just above the knee, cinching them tightly together, symbolizing restraint. Your skin glistens with a
|
||||||
sheen of perspiration, accentuating every muscle contour. Anatomically precise, hyperrealistic.
|
sheen of perspiration, accentuating every muscle contour. Anatomically precise, hyperrealistic.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user