code: def detect_scenes(
      clip=None,
      luminosities=None,
      luminosity_threshold=10,
      logger="bar",
      fps=None,
  ):
      """Detects scenes of a clip based on luminosity changes.
  
      Note that for large clip this may take some time.
  
      Returns
      -------
  
      tuple : cuts, luminosities
        cuts is a series of cuts [(0,t1), (t1,t2),...(...,tf)]
        luminosities are the luminosities computed for each
        frame of the clip.
  
      Parameters
      ----------
  
      clip : video.VideoClip.VideoClip, optional
        A video clip. Can be None if a list of luminosities is
        provided instead. If provided, the luminosity of each
        frame of the clip will be computed. If the clip has no
        'fps' attribute, you must provide it.
  
      luminosities : list, optional
        A list of luminosities, e.g. returned by detect_scenes
        in a previous run.
  
      luminosity_threshold : float, optional
        Determines a threshold above which the 'luminosity jumps'
        will be considered as scene changes. A scene change is defined
        as a change between 2 consecutive frames that is larger than
        (avg * thr) where avg is the average of the absolute changes
        between consecutive frames.
  
      logger : str, optional
        Either ``"bar"`` for progress bar or ``None`` or any Proglog logger.
  
      fps : int, optional
        Frames per second value. Must be provided if you provide
        no clip or a clip without fps attribute.
      """
      if luminosities is None:
          luminosities = [
              f.sum()
              for f in clip.iter_frames(
                  fps=fps, dtype="uint32", logger=logger
              )
          ]
  
      luminosities = np.array(luminosities, dtype=float)
      if clip is not None:
          end = clip.duration
      else:
          end = len(luminosities) * (1.0 / fps)
      luminosity_diffs = abs(np.diff(luminosities))
      avg = luminosity_diffs.mean()
      luminosity_jumps = (
          1
          + np.array(
              np.nonzero(luminosity_diffs > luminosity_threshold * avg)
          )[0]
      )
      timings = [0] + list((1.0 / fps) * luminosity_jumps) + [end]
      cuts = [(t1, t2) for t1, t2 in zip(timings, timings[1:])]
      return cuts, luminosities
  
imports: from collections import defaultdict
  import numpy
  from moviepy.decorators import convert_parameter_to_seconds, use_clip_fps_by_default
label_desc: Use image node_id 2 for calling a global function with example usage: detect_scenes(clip, luminosities, luminosity_threshold, logger, fps) and returns: cuts,  luminosities