code: def add(self, obj=None, filename=None, data=None, info={}, **kwargs):
          
          if [filename, obj] == [None, None]:
              raise Exception("Either filename or a HoloViews object is "
                              "needed to create an entry in the archive.")
          elif obj is None and not self.parse_fields(filename).issubset({'timestamp'}):
              raise Exception("Only the {timestamp} formatter may be used unless an object is supplied.")
          elif [obj, data] == [None, None]:
              raise Exception("Either an object or explicit data must be "
                              "supplied to create an entry in the archive.")
          elif data and 'mime_type' not in info:
              raise Exception("The mime-type must be supplied in the info dictionary "
                              "when supplying data directly")
  
          self._validate_formatters()
  
          entries = []
          if data is None:
              for exporter in self.exporters:
                  rendered = exporter(obj)
                  if rendered is None: continue
                  (data, new_info) = rendered
                  info = dict(info, **new_info)
                  entries.append((data, info))
          else:
              entries.append((data, info))
  
          for (data, info) in entries:
              self._add_content(obj, data, info, filename=filename)
docs: If a filename is supplied, it will be used. Otherwise, a
          filename will be generated from the supplied object. Note that
          if the explicit filename uses the {timestamp} field, it will
          be formatted upon export.
  
          The data to be archived is either supplied explicitly as
          'data' or automatically rendered from the object.