<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def add_sample_meta(self, source, reference, method='', filename='', md5='', sha1='', sha256='', size='', mimetype='', campaign='', confidence='', description='', bucket_list=[]):
 """ Adds a metadata sample. To add an actual file, use add_sample_file. Args: source: Source of the information reference: A reference where more information can be found method: The method for obtaining the sample. filename: The name of the file. md5: An MD5 hash of the file. sha1: SHA1 hash of the file. sha256: SHA256 hash of the file. size: size of the file. mimetype: The mimetype of the file. campaign: An associated campaign confidence: The campaign confidence bucket_list: A list of bucket list items to add upload_type: Either 'file' or 'meta' Returns: A JSON sample object or None if there was an error. """

        data = {
            'api_key': self.api_key,
            'username': self.username,
            'source': source,
            'reference': reference,
            'method': method,
            'filename': filename,
            'md5': md5,
            'sha1': sha1,
            'sha256': sha256,
            'size': size,
            'mimetype': mimetype,
            'upload_type': 'meta',
            'campaign': campaign,
            'confidence': confidence,
            'bucket_list': ','.join(bucket_list),
        }
        r = requests.post('{0}/samples/'.format(self.url),
                          data=data,
                          verify=self.verify,
                          proxies=self.proxies)
        if r.status_code == 200:
            result_data = json.loads(r.text)
            return result_data
        else:
            log.error('Error with status code {0} and message '
                      '{1}'.format(r.status_code, r.text))
        return None