docs: def get_attributes(file, *, attributes=None, mime_type=None,
                     force_document=False, voice_note=False, video_note=False,
                     supports_streaming=False):
      """
      Get a list of attributes for the given file and
      the mime type as a tuple ([attribute], mime_type).
      """
      # Note: ``file.name`` works for :tl:`InputFile` and some `IOBase` streams
      name = file if isinstance(file, str) else getattr(file, 'name', 'unnamed')
      if mime_type is None:
          mime_type = mimetypes.guess_type(name)[0]
  
      attr_dict = {types.DocumentAttributeFilename:
          types.DocumentAttributeFilename(os.path.basename(name))}
  
      if is_audio(file):
          m = _get_metadata(file)
          if m:
              attr_dict[types.DocumentAttributeAudio] = \
                  types.DocumentAttributeAudio(
                      voice=voice_note,
                      title=m.get('title') if m.has('title') else None,
                      performer=m.get('author') if m.has('author') else None,
                      duration=int(m.get('duration').seconds
                                   if m.has('duration') else 0)
                  )
  
      if not force_document and is_video(file):
          m = _get_metadata(file)
          if m:
              doc = types.DocumentAttributeVideo(
                  round_message=video_note,
                  w=m.get('width') if m.has('width') else 0,
                  h=m.get('height') if m.has('height') else 0,
                  duration=int(m.get('duration').seconds
                               if m.has('duration') else 0),
                  supports_streaming=supports_streaming
              )
          else:
              doc = types.DocumentAttributeVideo(
                  0, 1, 1, round_message=video_note,
                  supports_streaming=supports_streaming)
  
          attr_dict[types.DocumentAttributeVideo] = doc
  
      if voice_note:
          if types.DocumentAttributeAudio in attr_dict:
              attr_dict[types.DocumentAttributeAudio].voice = True
          else:
              attr_dict[types.DocumentAttributeAudio] = \
                  types.DocumentAttributeAudio(0, voice=True)
  
      # Now override the attributes if any. As we have a dict of
      # {cls: instance}, we can override any class with the list
      # of attributes provided by the user easily.
      if attributes:
          for a in attributes:
              attr_dict[type(a)] = a
  
      # Ensure we have a mime type, any; but it cannot be None
      # 'The "octet-stream" subtype is used to indicate that a body
      # contains arbitrary binary data.'
      if not mime_type:
          mime_type = 'application/octet-stream'
  
      return list(attr_dict.values()), mime_type