Spaces:
Sleeping
Sleeping
Commit
·
ca63f09
1
Parent(s):
c1b007c
add: logic for skipping necklace portion from the video
Browse files- app.py +12 -18
- src/components/each_necklace_video_gen.py +12 -14
app.py
CHANGED
@@ -237,15 +237,15 @@ class EachNecklaceVideoGeneratorRequest(BaseModel):
|
|
237 |
background_audio_path: str = "TraditionalIndianVlogMusic.mp3"
|
238 |
image_display_duration: float = 2.5
|
239 |
fps: int = 10
|
240 |
-
necklace_title: List[str]
|
241 |
-
nto_image_title: List[List[str]]
|
242 |
-
nto_cto_image_title: List[List[str]]
|
243 |
-
makeup_image_title: List[List[str]]
|
244 |
-
necklace_images: List[str]
|
245 |
-
necklace_try_on_output_images: List[List[str]]
|
246 |
-
clothing_output_images: List[List[str]]
|
247 |
-
makeup_output_images: List[List[str]]
|
248 |
-
background_colors: list[tuple[int, int, int]]
|
249 |
outro_title: str = "Reach out to us for more information"
|
250 |
address: str = "123, ABC Street, XYZ City"
|
251 |
phone_numbers: str = "1234567890"
|
@@ -254,6 +254,7 @@ class EachNecklaceVideoGeneratorRequest(BaseModel):
|
|
254 |
transition_type: str = "None"
|
255 |
direction: str = "left"
|
256 |
outro_video_path: str = "JewelMirror_outro.mp4"
|
|
|
257 |
|
258 |
|
259 |
@app.post("/createcombinedvideo/")
|
@@ -284,12 +285,6 @@ async def create_combined_video(request: EachNecklaceVideoGeneratorRequest):
|
|
284 |
return all(verify_files(item) for item in files)
|
285 |
return files is not None
|
286 |
|
287 |
-
if not all(verify_files(files) for files in temp_files.values()):
|
288 |
-
return JSONResponse(
|
289 |
-
content={"status": "error", "message": "Failed to download all required images."},
|
290 |
-
status_code=400
|
291 |
-
)
|
292 |
-
|
293 |
intro_path = f"{RESOURCES_DIR}/intro/{request.intro_video_path}"
|
294 |
output_path = f"{TEMP_VIDEO_DIR}/video_{os.urandom(8).hex()}.mp4"
|
295 |
font_path = f"{RESOURCES_DIR}/fonts/{request.font_path}"
|
@@ -297,7 +292,6 @@ async def create_combined_video(request: EachNecklaceVideoGeneratorRequest):
|
|
297 |
outro_path = f"{RESOURCES_DIR}/outro/{request.outro_video_path}"
|
298 |
try:
|
299 |
model_name = request.necklace_try_on_output_images[0][0].split("/")[-1].split(".")[0].split("-")[1]
|
300 |
-
|
301 |
except:
|
302 |
model_name = "MOD"
|
303 |
|
@@ -324,7 +318,8 @@ async def create_combined_video(request: EachNecklaceVideoGeneratorRequest):
|
|
324 |
transition_duration=request.transition_duration,
|
325 |
transition_type=request.transition_type,
|
326 |
direction=request.direction,
|
327 |
-
outro_video_path=outro_path
|
|
|
328 |
|
329 |
)
|
330 |
logger.info("Creating video...")
|
@@ -364,7 +359,6 @@ async def create_combined_video(request: EachNecklaceVideoGeneratorRequest):
|
|
364 |
return JSONResponse(content=response, status_code=200)
|
365 |
|
366 |
except Exception as e:
|
367 |
-
raise e
|
368 |
return JSONResponse(content={"status": "error", "message": str(e)}, status_code=500)
|
369 |
|
370 |
|
|
|
237 |
background_audio_path: str = "TraditionalIndianVlogMusic.mp3"
|
238 |
image_display_duration: float = 2.5
|
239 |
fps: int = 10
|
240 |
+
necklace_title: List[str] = None
|
241 |
+
nto_image_title: List[List[str]] = None
|
242 |
+
nto_cto_image_title: List[List[str]] = None
|
243 |
+
makeup_image_title: List[List[str]] = None
|
244 |
+
necklace_images: List[str] = None
|
245 |
+
necklace_try_on_output_images: List[List[str]] = None
|
246 |
+
clothing_output_images: List[List[str]] = None
|
247 |
+
makeup_output_images: List[List[str]] = None
|
248 |
+
background_colors: list[tuple[int, int, int]] = None
|
249 |
outro_title: str = "Reach out to us for more information"
|
250 |
address: str = "123, ABC Street, XYZ City"
|
251 |
phone_numbers: str = "1234567890"
|
|
|
254 |
transition_type: str = "None"
|
255 |
direction: str = "left"
|
256 |
outro_video_path: str = "JewelMirror_outro.mp4"
|
257 |
+
skip_necklace_video_portion: bool = False
|
258 |
|
259 |
|
260 |
@app.post("/createcombinedvideo/")
|
|
|
285 |
return all(verify_files(item) for item in files)
|
286 |
return files is not None
|
287 |
|
|
|
|
|
|
|
|
|
|
|
|
|
288 |
intro_path = f"{RESOURCES_DIR}/intro/{request.intro_video_path}"
|
289 |
output_path = f"{TEMP_VIDEO_DIR}/video_{os.urandom(8).hex()}.mp4"
|
290 |
font_path = f"{RESOURCES_DIR}/fonts/{request.font_path}"
|
|
|
292 |
outro_path = f"{RESOURCES_DIR}/outro/{request.outro_video_path}"
|
293 |
try:
|
294 |
model_name = request.necklace_try_on_output_images[0][0].split("/")[-1].split(".")[0].split("-")[1]
|
|
|
295 |
except:
|
296 |
model_name = "MOD"
|
297 |
|
|
|
318 |
transition_duration=request.transition_duration,
|
319 |
transition_type=request.transition_type,
|
320 |
direction=request.direction,
|
321 |
+
outro_video_path=outro_path,
|
322 |
+
skip_necklace_video_portion=request.skip_necklace_video_portion
|
323 |
|
324 |
)
|
325 |
logger.info("Creating video...")
|
|
|
359 |
return JSONResponse(content=response, status_code=200)
|
360 |
|
361 |
except Exception as e:
|
|
|
362 |
return JSONResponse(content={"status": "error", "message": str(e)}, status_code=500)
|
363 |
|
364 |
|
src/components/each_necklace_video_gen.py
CHANGED
@@ -23,7 +23,7 @@ class EachVideoCreator:
|
|
23 |
audio_path=None, image_display_duration=2.5, box_color=(131, 42, 48), box_opacity=0.8,
|
24 |
font_size=28, text_color="white", fps=1, outro_title=None, logo_image=None, address=None,
|
25 |
phone_numbers=None, transition_duration=0.5, transition_type='None', direction='left',
|
26 |
-
outro_video_path: str = ""):
|
27 |
self.intro_video_path = intro_video_path
|
28 |
self.necklace_images = necklace_image if necklace_image else []
|
29 |
self.nto_outputs = nto_outputs if nto_outputs else []
|
@@ -51,6 +51,7 @@ class EachVideoCreator:
|
|
51 |
self.transition_type = transition_type
|
52 |
self.direction = direction
|
53 |
self.outro_video_path = outro_video_path
|
|
|
54 |
|
55 |
def create_necklace_clips(self, necklace_image, index, label):
|
56 |
if not necklace_image:
|
@@ -156,14 +157,18 @@ class EachVideoCreator:
|
|
156 |
print("Skipping intro video: Path not provided or invalid.")
|
157 |
|
158 |
# Step 2: Process Necklaces and Associated Outputs
|
|
|
159 |
for idx, necklace_image in enumerate(self.necklace_images):
|
160 |
-
|
161 |
-
|
162 |
-
necklace_clips = self.create_necklace_clips(necklace_image, idx, self.necklace_title[idx])
|
163 |
-
if necklace_clips:
|
164 |
-
clips.extend(necklace_clips)
|
165 |
else:
|
166 |
-
print(f"
|
|
|
|
|
|
|
|
|
|
|
|
|
167 |
|
168 |
# NTO outputs
|
169 |
if idx < len(self.nto_outputs):
|
@@ -202,13 +207,6 @@ class EachVideoCreator:
|
|
202 |
outro_clip = resize(VideoFileClip(self.outro_video_path), (1080, 1080))
|
203 |
clips.append(outro_clip)
|
204 |
|
205 |
-
# if self.logo_image or self.address or self.phone_numbers is not None:
|
206 |
-
# outro_clip = self.create_last_clip(title=self.outro_title, logo_image=self.logo_image,
|
207 |
-
# address=self.address,
|
208 |
-
# phone_numbers=self.phone_numbers,
|
209 |
-
# font_path=self.font_path)
|
210 |
-
# clips.extend([outro_clip])
|
211 |
-
|
212 |
final_clips = []
|
213 |
for clip in clips:
|
214 |
clip = clip.set_duration(self.image_display_duration)
|
|
|
23 |
audio_path=None, image_display_duration=2.5, box_color=(131, 42, 48), box_opacity=0.8,
|
24 |
font_size=28, text_color="white", fps=1, outro_title=None, logo_image=None, address=None,
|
25 |
phone_numbers=None, transition_duration=0.5, transition_type='None', direction='left',
|
26 |
+
outro_video_path: str = "", skip_necklace_video_portion=False):
|
27 |
self.intro_video_path = intro_video_path
|
28 |
self.necklace_images = necklace_image if necklace_image else []
|
29 |
self.nto_outputs = nto_outputs if nto_outputs else []
|
|
|
51 |
self.transition_type = transition_type
|
52 |
self.direction = direction
|
53 |
self.outro_video_path = outro_video_path
|
54 |
+
self.skip_necklace_video_portion = skip_necklace_video_portion
|
55 |
|
56 |
def create_necklace_clips(self, necklace_image, index, label):
|
57 |
if not necklace_image:
|
|
|
157 |
print("Skipping intro video: Path not provided or invalid.")
|
158 |
|
159 |
# Step 2: Process Necklaces and Associated Outputs
|
160 |
+
|
161 |
for idx, necklace_image in enumerate(self.necklace_images):
|
162 |
+
if self.skip_necklace_video_portion:
|
163 |
+
pass
|
|
|
|
|
|
|
164 |
else:
|
165 |
+
print(f"Processing Necklace {idx + 1}...")
|
166 |
+
# Necklace preview clips
|
167 |
+
necklace_clips = self.create_necklace_clips(necklace_image, idx, self.necklace_title[idx])
|
168 |
+
if necklace_clips:
|
169 |
+
clips.extend(necklace_clips)
|
170 |
+
else:
|
171 |
+
print(f"Skipping Necklace {idx + 1} preview: No valid clips created.")
|
172 |
|
173 |
# NTO outputs
|
174 |
if idx < len(self.nto_outputs):
|
|
|
207 |
outro_clip = resize(VideoFileClip(self.outro_video_path), (1080, 1080))
|
208 |
clips.append(outro_clip)
|
209 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
210 |
final_clips = []
|
211 |
for clip in clips:
|
212 |
clip = clip.set_duration(self.image_display_duration)
|