feat(main.py): add functionality to reposition segments in multi-segment mode

This commit is contained in:
2025-08-20 12:00:01 +02:00
parent 03d4d26335
commit ab54fb2da7

46
main.py
View File

@@ -362,8 +362,13 @@ class MediaGrader:
self.jump_history[current_file].append(self.current_frame) self.jump_history[current_file].append(self.current_frame)
# Jump to the target frame # Jump to the target frame
self.current_cap.set(cv2.CAP_PROP_POS_FRAMES, target_frame) if self.multi_segment_mode:
self.load_current_frame() # In multi-segment mode, reposition all segments relative to the jump target
self.reposition_segments_around_frame(target_frame)
else:
# In single mode, just jump the main capture
self.current_cap.set(cv2.CAP_PROP_POS_FRAMES, target_frame)
self.load_current_frame()
# Increment jump counter # Increment jump counter
self.jump_counters[current_file] += 1 self.jump_counters[current_file] += 1
@@ -514,9 +519,9 @@ class MediaGrader:
# Calculate segment positions - evenly spaced through video # Calculate segment positions - evenly spaced through video
self.segment_positions = [] self.segment_positions = []
for i in range(self.segment_count): for i in range(self.segment_count):
# Position segments at 0%, 25%, 50%, 75% of video # Position segments at 0%, 25%, 50%, 75% of video (not 0%, 33%, 66%, 100%)
position_ratio = i / max(1, self.segment_count - 1) if self.segment_count > 1 else 0 position_ratio = i / self.segment_count # This gives 0, 0.25, 0.5, 0.75
start_frame = int(position_ratio * (self.total_frames - 1)) start_frame = int(position_ratio * self.total_frames)
self.segment_positions.append(start_frame) self.segment_positions.append(start_frame)
# Create video captures for each segment # Create video captures for each segment
@@ -562,6 +567,37 @@ class MediaGrader:
if ret: if ret:
self.segment_frames[i] = frame self.segment_frames[i] = frame
def reposition_segments_around_frame(self, center_frame: int):
"""Reposition all segments around a center frame while maintaining spacing"""
if not self.multi_segment_mode or not self.segment_caps:
return
# Calculate new segment positions around the center frame
# Keep the same relative spacing but center around the new frame
segment_spacing = self.total_frames // (self.segment_count + 1)
new_positions = []
for i in range(self.segment_count):
# Spread segments around center_frame
offset = (i - (self.segment_count - 1) / 2) * segment_spacing
new_frame = int(center_frame + offset)
new_frame = max(0, min(new_frame, self.total_frames - 1))
new_positions.append(new_frame)
# Update segment positions and seek all captures
self.segment_positions = new_positions
for i, cap in enumerate(self.segment_caps):
if cap and cap.isOpened():
cap.set(cv2.CAP_PROP_POS_FRAMES, self.segment_positions[i])
# Load new frame
ret, frame = cap.read()
if ret:
self.segment_frames[i] = frame
# Reset position for next read
cap.set(cv2.CAP_PROP_POS_FRAMES, self.segment_positions[i])
def seek_all_segments(self, frames_delta: int): def seek_all_segments(self, frames_delta: int):
"""Seek all segments by the specified number of frames""" """Seek all segments by the specified number of frames"""
if not self.multi_segment_mode or not self.segment_caps: if not self.multi_segment_mode or not self.segment_caps: