def __setitem__(self, key, value): """'Magic' value setter. This function tries to guess at what kind of value you want to store. If you pass in a valid UTF-8 or Unicode string, it treats it as a text value. If you pass in a list, it treats it as a list of string/Unicode values. If you pass in a string that is not valid UTF-8, it assumes it is a binary value. If you need to force a specific type of value (e.g. binary data that also happens to be valid UTF-8, or an external reference), use the APEValue factory and set the value to the result of that:: from mutagenx.apev2 import APEValue, EXTERNAL tag['Website'] = APEValue('http://example.org', EXTERNAL) """ if not is_valid_apev2_key(key): raise KeyError("%r is not a valid APEv2 key" % key) if not isinstance(value, _APEValue): # let's guess at the content if we're not already a value... if isinstance(value, str): # unicode? we've got to be text. value = APEValue(value, TEXT) elif isinstance(value, list): # list? text. value = APEValue("\0".join(utf8(v).decode('utf-8') for v in value), TEXT) else: try: value.decode("utf-8") except UnicodeError: # invalid UTF8 text, probably binary value = APEValue(value, BINARY) else: # valid UTF8, probably text value = APEValue(value.decode("utf-8"), TEXT) self.__casemap[key.lower()] = key self.__dict[key.lower()] = value
def test_high_unicode(self): value = utf8("\u1234") self.failUnlessEqual(value, b'\xe1\x88\xb4') self.failUnless(isinstance(value, bytes))
def test_low_unicode(self): value = utf8("1234") self.failUnlessEqual(value, b"1234") self.failUnless(isinstance(value, bytes))
def test_bad_str(self): value = utf8(b"\xab\xde") # Two '?' symbols. self.failUnlessEqual(value, b"\xef\xbf\xbd\xef\xbf\xbd") self.failUnless(isinstance(value, bytes))
def test_str(self): value = utf8(b"1234") self.failUnlessEqual(value, b"1234") self.failUnless(isinstance(value, bytes))
def __render_text(self, key, value, flags=1): if isinstance(value, (str, bytes)): value = [value] return self.__render_data(key, flags, [utf8(v) for v in value])
def __render_text(self, key, value, flags=1): if isinstance(value, (str, bytes)): value = [value] return self.__render_data( key, flags, [utf8(v) for v in value])
def setter(tags, key, value): tags[atomid] = [utf8(v) for v in value]