2323
2424from scenedetect import open_video , AVAILABLE_BACKENDS
2525
26- from scenedetect .scene_detector import SceneDetector , FlashFilter
27- from scenedetect .platform import get_cv2_imwrite_params , init_logger
26+ from scenedetect .scene_detector import SceneDetector
27+ from scenedetect .platform import get_and_create_path , get_cv2_imwrite_params , init_logger
2828from scenedetect .frame_timecode import FrameTimecode , MAX_FPS_DELTA
2929from scenedetect .video_stream import VideoStream , VideoOpenFailure , FrameRateUnavailable
3030from scenedetect .video_splitter import is_mkvmerge_available , is_ffmpeg_available
3131from scenedetect .detectors import AdaptiveDetector , ContentDetector , ThresholdDetector , HistogramDetector
3232from scenedetect .stats_manager import StatsManager
3333from scenedetect .scene_manager import SceneManager , Interpolation
3434
35- from scenedetect ._cli .config import (ConfigRegistry , ConfigLoadFailure , TimecodeFormat ,
36- FlashFilterMode , CHOICE_MAP , DEFAULT_JPG_QUALITY ,
37- DEFAULT_WEBP_QUALITY )
35+ from scenedetect ._cli .config import (ConfigRegistry , ConfigLoadFailure , TimecodeFormat , CHOICE_MAP ,
36+ DEFAULT_JPG_QUALITY , DEFAULT_WEBP_QUALITY )
3837
3938logger = logging .getLogger ('pyscenedetect' )
4039
@@ -117,9 +116,9 @@ def __init__(self):
117116 self .output_dir : str = None # -o/--output
118117 self .quiet_mode : bool = None # -q/--quiet or -v/--verbosity quiet
119118 self .stats_file_path : str = None # -s/--stats
120- self .min_scene_len : FrameTimecode = None # -m/--min-scene-len
121- self .filter_mode : FlashFilterMode = None # --filter-mode
119+ self .drop_short_scenes : bool = None # --drop-short-scenes
122120 self .merge_last_scene : bool = None # --merge-last-scene
121+ self .min_scene_len : FrameTimecode = None # -m/--min-scene-len
123122 self .frame_skip : int = None # -fs/--frame-skip
124123 self .default_detector : Tuple [Type [SceneDetector ],
125124 Dict [str , Any ]] = None # [global] default-detector
@@ -187,7 +186,6 @@ def handle_options(
187186 downscale : Optional [int ],
188187 frame_skip : int ,
189188 min_scene_len : str ,
190- filter_mode : Optional [str ],
191189 drop_short_scenes : bool ,
192190 merge_last_scene : bool ,
193191 backend : Optional [str ],
@@ -271,15 +269,8 @@ def handle_options(
271269 self .min_scene_len = parse_timecode (
272270 min_scene_len if min_scene_len is not None else self .config .get_value (
273271 "global" , "min-scene-len" ), self .video_stream .frame_rate )
274-
275- if drop_short_scenes :
276- logger .warning (
277- "WARNING: --drop-short-scenes is deprecated, use --filter-mode=drop instead." )
278- if filter_mode is None :
279- self .filter_mode = FlashFilterMode .DROP
280- else :
281- self .filter_mode = FlashFilterMode [self .config .get_value ("global" , "filter-mode" ,
282- filter_mode ).upper ()]
272+ self .drop_short_scenes = drop_short_scenes or self .config .get_value (
273+ "global" , "drop-short-scenes" )
283274 self .merge_last_scene = merge_last_scene or self .config .get_value (
284275 "global" , "merge-last-scene" )
285276 self .frame_skip = self .config .get_value ("global" , "frame-skip" , frame_skip )
@@ -290,7 +281,6 @@ def handle_options(
290281 self .stats_manager = StatsManager ()
291282
292283 # Initialize default detector with values in the config file.
293- # TODO(v0.6.4): Integrate perceptual hash detector.
294284 default_detector = self .config .get_value ("global" , "default-detector" )
295285 if default_detector == 'detect-adaptive' :
296286 self .default_detector = (AdaptiveDetector , self .get_detect_adaptive_params ())
@@ -330,18 +320,29 @@ def get_detect_content_params(
330320 ) -> Dict [str , Any ]:
331321 """Handle detect-content command options and return dict to construct one with."""
332322 self ._ensure_input_open ()
323+
324+ if self .drop_short_scenes :
325+ min_scene_len = 0
326+ else :
327+ if min_scene_len is None :
328+ if self .config .is_default ('detect-content' , 'min-scene-len' ):
329+ min_scene_len = self .min_scene_len .frame_num
330+ else :
331+ min_scene_len = self .config .get_value ('detect-content' , 'min-scene-len' )
332+ min_scene_len = parse_timecode (min_scene_len , self .video_stream .frame_rate ).frame_num
333+
333334 if weights is not None :
334335 try :
335336 weights = ContentDetector .Components (* weights )
336337 except ValueError as ex :
337338 logger .debug (str (ex ))
338- raise click .BadParameter (str (ex ), param_hint = " weights" )
339+ raise click .BadParameter (str (ex ), param_hint = ' weights' )
339340 return {
340- " weights" : self .config .get_value (" detect-content" , " weights" , weights ),
341- " kernel_size" : self .config .get_value (" detect-content" , " kernel-size" , kernel_size ),
342- " luma_only" : luma_only or self .config .get_value (" detect-content" , " luma-only" ),
343- "flash_filter" : self . _init_flash_filter ( "detect-content" , min_scene_len ) ,
344- " threshold" : self .config .get_value (" detect-content" , " threshold" , threshold ),
341+ ' weights' : self .config .get_value (' detect-content' , ' weights' , weights ),
342+ ' kernel_size' : self .config .get_value (' detect-content' , ' kernel-size' , kernel_size ),
343+ ' luma_only' : luma_only or self .config .get_value (' detect-content' , ' luma-only' ),
344+ 'min_scene_len' : min_scene_len ,
345+ ' threshold' : self .config .get_value (' detect-content' , ' threshold' , threshold ),
345346 }
346347
347348 def get_detect_adaptive_params (
@@ -371,8 +372,15 @@ def get_detect_adaptive_params(
371372 self .config .config_dict ["detect-adaptive" ]["min-content-val" ] = (
372373 self .config .config_dict ["detect-adaptive" ]["min-deleta-hsv" ])
373374
374- # TODO(v0.6.4): Integrate flash filter.
375- min_scene_len = self ._init_flash_filter ("detect-adaptive" , min_scene_len )._filter_length
375+ if self .drop_short_scenes :
376+ min_scene_len = 0
377+ else :
378+ if min_scene_len is None :
379+ if self .config .is_default ("detect-adaptive" , "min-scene-len" ):
380+ min_scene_len = self .min_scene_len .frame_num
381+ else :
382+ min_scene_len = self .config .get_value ("detect-adaptive" , "min-scene-len" )
383+ min_scene_len = parse_timecode (min_scene_len , self .video_stream .frame_rate ).frame_num
376384
377385 if weights is not None :
378386 try :
@@ -406,8 +414,16 @@ def get_detect_threshold_params(
406414 ) -> Dict [str , Any ]:
407415 """Handle detect-threshold command options and return dict to construct one with."""
408416 self ._ensure_input_open ()
409- # TODO(v0.6.4): Integrate flash filter.
410- min_scene_len = self ._init_flash_filter ("detect-adaptive" , min_scene_len )._filter_length
417+
418+ if self .drop_short_scenes :
419+ min_scene_len = 0
420+ else :
421+ if min_scene_len is None :
422+ if self .config .is_default ("detect-threshold" , "min-scene-len" ):
423+ min_scene_len = self .min_scene_len .frame_num
424+ else :
425+ min_scene_len = self .config .get_value ("detect-threshold" , "min-scene-len" )
426+ min_scene_len = parse_timecode (min_scene_len , self .video_stream .frame_rate ).frame_num
411427 # TODO(v1.0): add_last_scene cannot be disabled right now.
412428 return {
413429 'add_final_scene' :
@@ -439,8 +455,15 @@ def get_detect_hist_params(self, threshold: Optional[float], bits: Optional[int]
439455 min_scene_len : Optional [str ]) -> Dict [str , Any ]:
440456 """Handle detect-hist command options and return dict to construct one with."""
441457 self ._ensure_input_open ()
442- # TODO(v0.6.4): Integrate flash filter.
443- min_scene_len = self ._init_flash_filter ("detect-adaptive" , min_scene_len )._filter_length
458+ if self .drop_short_scenes :
459+ min_scene_len = 0
460+ else :
461+ if min_scene_len is None :
462+ if self .config .is_default ("detect-hist" , "min-scene-len" ):
463+ min_scene_len = self .min_scene_len .frame_num
464+ else :
465+ min_scene_len = self .config .get_value ("detect-hist" , "min-scene-len" )
466+ min_scene_len = parse_timecode (min_scene_len , self .video_stream .frame_rate ).frame_num
444467 return {
445468 'bits' : self .config .get_value ("detect-hist" , "bits" , bits ),
446469 'min_scene_len' : min_scene_len ,
@@ -829,15 +852,3 @@ def _on_duplicate_command(self, command: str) -> None:
829852 raise click .BadParameter (
830853 '\n Command %s may only be specified once.' % command ,
831854 param_hint = '%s command' % command )
832-
833- def _init_flash_filter (self , detector_name : str ,
834- min_scene_len : ty .Optional [int ]) -> FlashFilter :
835- if self .filter_mode == FlashFilterMode .DROP :
836- return FlashFilter (length = 0 )
837- if min_scene_len is None :
838- if self .config .is_default (detector_name , 'min-scene-len' ):
839- min_scene_len = self .min_scene_len .frame_num
840- else :
841- min_scene_len = self .config .get_value (detector_name , 'min-scene-len' )
842- min_scene_len = parse_timecode (min_scene_len , self .video_stream .frame_rate ).frame_num
843- return FlashFilter (length = min_scene_len , mode = self .filter_mode .value )
0 commit comments