fix subdir thumbnail gen

This commit is contained in:
Shaun Johnston
2025-12-25 19:41:01 +10:00
parent 4ba3fdbe35
commit b8a5eaf9a6
2 changed files with 39 additions and 14 deletions
+22 -11
View File
@@ -1021,11 +1021,13 @@ class PromptManagerAPI:
thumbnails_dir = output_path / "thumbnails"
if thumbnails_dir.exists():
thumbnail_ext = '.jpg' if is_video else extension
thumbnail_rel_path = f"thumbnails/{media_path.stem}_thumb{thumbnail_ext}"
# Use full relative path to support subdirectories
thumbnail_rel_path = Path("thumbnails") / rel_path.parent / f"{media_path.stem}_thumb{thumbnail_ext}"
thumbnail_abs_path = output_path / thumbnail_rel_path
if thumbnail_abs_path.exists():
thumbnail_url = f'/prompt_manager/images/serve/{Path(thumbnail_rel_path).as_posix()}'
from urllib.parse import quote
thumbnail_url = f'/prompt_manager/images/serve/{quote(thumbnail_rel_path.as_posix(), safe="/")}'
image_info = {
'id': str(hash(str(media_path))),
@@ -1146,7 +1148,9 @@ class PromptManagerAPI:
# Also try to delete associated thumbnail if it exists
try:
thumbnail_path = output_path / "thumbnails" / f"{file_path.stem}_thumb{file_path.suffix}"
# Use full relative path to support subdirectories
rel_path = file_path.relative_to(output_path)
thumbnail_path = output_path / "thumbnails" / rel_path.parent / f"{file_path.stem}_thumb{file_path.suffix}"
if thumbnail_path.exists():
os.remove(thumbnail_path)
self.logger.debug(f"Deleted associated thumbnail: {thumbnail_path}")
@@ -1906,12 +1910,14 @@ class PromptManagerAPI:
thumbnail_url = None
if thumbnails_dir.exists():
# For videos, look for thumbnail with .jpg extension
# Use full relative path to support subdirectories
thumbnail_ext = '.jpg' if is_video else extension
thumbnail_rel_path = f"thumbnails/{media_path.stem}_thumb{thumbnail_ext}"
thumbnail_rel_path = Path("thumbnails") / rel_path.parent / f"{media_path.stem}_thumb{thumbnail_ext}"
thumbnail_abs_path = output_path / thumbnail_rel_path
if thumbnail_abs_path.exists():
thumbnail_url = f'/prompt_manager/images/serve/{Path(thumbnail_rel_path).as_posix()}'
from urllib.parse import quote
thumbnail_url = f'/prompt_manager/images/serve/{quote(thumbnail_rel_path.as_posix(), safe="/")}'
images.append({
'id': str(hash(str(media_path))), # Simple hash for ID
@@ -2159,10 +2165,11 @@ class PromptManagerAPI:
is_video = any(media_file.name.lower().endswith(ext) for ext in video_extensions)
# For videos, always save thumbnail as .jpg
# Include parent directory structure to avoid collisions with same-named files
if is_video:
thumbnail_path = thumbnails_dir / f"{rel_path.stem}_thumb.jpg"
thumbnail_path = thumbnails_dir / rel_path.parent / f"{rel_path.stem}_thumb.jpg"
else:
thumbnail_path = thumbnails_dir / f"{rel_path.stem}_thumb{rel_path.suffix}"
thumbnail_path = thumbnails_dir / rel_path.parent / f"{rel_path.stem}_thumb{rel_path.suffix}"
# Skip if thumbnail already exists and is newer than original
if (thumbnail_path.exists() and
@@ -2375,10 +2382,11 @@ class PromptManagerAPI:
rel_path = media_file.relative_to(output_path)
# For videos, always save thumbnail as .jpg
# Include parent directory structure to avoid collisions with same-named files
if is_video:
thumbnail_path = thumbnails_dir / f"{rel_path.stem}_thumb.jpg"
thumbnail_path = thumbnails_dir / rel_path.parent / f"{rel_path.stem}_thumb.jpg"
else:
thumbnail_path = thumbnails_dir / f"{rel_path.stem}_thumb{rel_path.suffix}"
thumbnail_path = thumbnails_dir / rel_path.parent / f"{rel_path.stem}_thumb{rel_path.suffix}"
# SAFETY: Ensure thumbnail path is within our thumbnails directory
try:
@@ -4739,9 +4747,12 @@ class PromptManagerAPI:
thumbnail_url = None
thumbnails_dir = output_path / "thumbnails"
if thumbnails_dir.exists():
thumbnail_path = thumbnails_dir / f"{image_path.stem}_thumb{image_path.suffix}"
# Use full relative path to support subdirectories
thumbnail_rel = Path("thumbnails") / rel_path.parent / f"{image_path.stem}_thumb{image_path.suffix}"
thumbnail_path = output_path / thumbnail_rel
if thumbnail_path.exists():
thumbnail_url = f'/prompt_manager/images/serve/thumbnails/{image_path.stem}_thumb{image_path.suffix}'
from urllib.parse import quote
thumbnail_url = f'/prompt_manager/images/serve/{quote(thumbnail_rel.as_posix(), safe="/")}'
images.append({
'filename': image_path.name,
+17 -3
View File
@@ -4713,14 +4713,28 @@ Seed: ${this.currentMetadata.seed || 'Unknown'}`;
// If thumbnail_url already exists, use it
if (image.thumbnail_url) return image.thumbnail_url;
// Try to construct thumbnail URL from filename
// Thumbnails are stored as: thumbnails/{stem}_thumb{ext}
// Try to construct thumbnail URL from filename and relative_path
// Thumbnails are stored as: thumbnails/{parent_dir}/{stem}_thumb{ext}
// to avoid collisions with same-named files in different directories
if (image.filename) {
const lastDot = image.filename.lastIndexOf('.');
if (lastDot > 0) {
const stem = image.filename.substring(0, lastDot);
const ext = image.filename.substring(lastDot);
return `/prompt_manager/images/serve/thumbnails/${stem}_thumb${ext}`;
// Get parent directory from relative_path if available
let parentDir = '';
if (image.relative_path) {
const relPath = image.relative_path.replace(/\\/g, '/');
const lastSlash = relPath.lastIndexOf('/');
if (lastSlash > 0) {
parentDir = relPath.substring(0, lastSlash) + '/';
}
}
// URL encode the path components (but preserve slashes)
const encodedParentDir = parentDir.split('/').map(p => encodeURIComponent(p)).join('/');
return `/prompt_manager/images/serve/thumbnails/${encodedParentDir}${encodeURIComponent(stem)}_thumb${ext}`;
}
}