code: def use_clip_fps_by_default(func, clip, *args, **kwargs):
      """Will use ``clip.fps`` if no ``fps=...`` is provided in **kwargs**."""
  
      def find_fps(fps):
          if fps is not None:
              return fps
          elif getattr(clip, "fps", None):
              return clip.fps
          raise AttributeError(
              "No 'fps' (frames per second) attribute specified"
              " for function %s and the clip has no 'fps' attribute. Either"
              " provide e.g. fps=24 in the arguments of the function, or define"
              " the clip's fps with `clip.fps=24`" % func.__name__
          )
  
      names = inspect.getfullargspec(func).args[1:]
  
      new_args = [
          find_fps(arg) if (name == "fps") else arg
          for (arg, name) in zip(args, names)
      ]
      new_kwargs = {
          kwarg: find_fps(value) if kwarg == "fps" else value
          for (kwarg, value) in kwargs.items()
      }
  
      return func(clip, *new_args, **new_kwargs)
  
file_path: moviepy/moviepy/decorators.py
imports: import inspect
  import os
  import decorator
  from moviepy.tools import convert_to_seconds
label_desc: Use image node_id 12 for calling a global function with example usage: use_clip_fps_by_default(func, clip) and returns: func, fps, clip