23
23
24
24
from scenedetect import open_video , AVAILABLE_BACKENDS
25
25
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
28
28
from scenedetect .frame_timecode import FrameTimecode , MAX_FPS_DELTA
29
29
from scenedetect .video_stream import VideoStream , VideoOpenFailure , FrameRateUnavailable
30
30
from scenedetect .video_splitter import is_mkvmerge_available , is_ffmpeg_available
31
31
from scenedetect .detectors import AdaptiveDetector , ContentDetector , ThresholdDetector , HistogramDetector
32
32
from scenedetect .stats_manager import StatsManager
33
33
from scenedetect .scene_manager import SceneManager , Interpolation
34
34
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 )
38
37
39
38
logger = logging .getLogger ('pyscenedetect' )
40
39
@@ -117,9 +116,9 @@ def __init__(self):
117
116
self .output_dir : str = None # -o/--output
118
117
self .quiet_mode : bool = None # -q/--quiet or -v/--verbosity quiet
119
118
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
122
120
self .merge_last_scene : bool = None # --merge-last-scene
121
+ self .min_scene_len : FrameTimecode = None # -m/--min-scene-len
123
122
self .frame_skip : int = None # -fs/--frame-skip
124
123
self .default_detector : Tuple [Type [SceneDetector ],
125
124
Dict [str , Any ]] = None # [global] default-detector
@@ -187,7 +186,6 @@ def handle_options(
187
186
downscale : Optional [int ],
188
187
frame_skip : int ,
189
188
min_scene_len : str ,
190
- filter_mode : Optional [str ],
191
189
drop_short_scenes : bool ,
192
190
merge_last_scene : bool ,
193
191
backend : Optional [str ],
@@ -271,15 +269,8 @@ def handle_options(
271
269
self .min_scene_len = parse_timecode (
272
270
min_scene_len if min_scene_len is not None else self .config .get_value (
273
271
"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" )
283
274
self .merge_last_scene = merge_last_scene or self .config .get_value (
284
275
"global" , "merge-last-scene" )
285
276
self .frame_skip = self .config .get_value ("global" , "frame-skip" , frame_skip )
@@ -290,7 +281,6 @@ def handle_options(
290
281
self .stats_manager = StatsManager ()
291
282
292
283
# Initialize default detector with values in the config file.
293
- # TODO(v0.6.4): Integrate perceptual hash detector.
294
284
default_detector = self .config .get_value ("global" , "default-detector" )
295
285
if default_detector == 'detect-adaptive' :
296
286
self .default_detector = (AdaptiveDetector , self .get_detect_adaptive_params ())
@@ -330,18 +320,29 @@ def get_detect_content_params(
330
320
) -> Dict [str , Any ]:
331
321
"""Handle detect-content command options and return dict to construct one with."""
332
322
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
+
333
334
if weights is not None :
334
335
try :
335
336
weights = ContentDetector .Components (* weights )
336
337
except ValueError as ex :
337
338
logger .debug (str (ex ))
338
- raise click .BadParameter (str (ex ), param_hint = " weights" )
339
+ raise click .BadParameter (str (ex ), param_hint = ' weights' )
339
340
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 ),
345
346
}
346
347
347
348
def get_detect_adaptive_params (
@@ -371,8 +372,15 @@ def get_detect_adaptive_params(
371
372
self .config .config_dict ["detect-adaptive" ]["min-content-val" ] = (
372
373
self .config .config_dict ["detect-adaptive" ]["min-deleta-hsv" ])
373
374
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
376
384
377
385
if weights is not None :
378
386
try :
@@ -406,8 +414,16 @@ def get_detect_threshold_params(
406
414
) -> Dict [str , Any ]:
407
415
"""Handle detect-threshold command options and return dict to construct one with."""
408
416
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
411
427
# TODO(v1.0): add_last_scene cannot be disabled right now.
412
428
return {
413
429
'add_final_scene' :
@@ -439,8 +455,15 @@ def get_detect_hist_params(self, threshold: Optional[float], bits: Optional[int]
439
455
min_scene_len : Optional [str ]) -> Dict [str , Any ]:
440
456
"""Handle detect-hist command options and return dict to construct one with."""
441
457
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
444
467
return {
445
468
'bits' : self .config .get_value ("detect-hist" , "bits" , bits ),
446
469
'min_scene_len' : min_scene_len ,
@@ -829,15 +852,3 @@ def _on_duplicate_command(self, command: str) -> None:
829
852
raise click .BadParameter (
830
853
'\n Command %s may only be specified once.' % command ,
831
854
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