Beispiel #1
0
    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
Beispiel #2
0
 def test_high_unicode(self):
     value = utf8("\u1234")
     self.failUnlessEqual(value, b'\xe1\x88\xb4')
     self.failUnless(isinstance(value, bytes))
Beispiel #3
0
 def test_low_unicode(self):
     value = utf8("1234")
     self.failUnlessEqual(value, b"1234")
     self.failUnless(isinstance(value, bytes))
Beispiel #4
0
 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))
Beispiel #5
0
 def test_str(self):
     value = utf8(b"1234")
     self.failUnlessEqual(value, b"1234")
     self.failUnless(isinstance(value, bytes))
Beispiel #6
0
 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])
Beispiel #7
0
 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])
Beispiel #8
0
 def setter(tags, key, value):
     tags[atomid] = [utf8(v) for v in value]
Beispiel #9
0
 def setter(tags, key, value):
     tags[atomid] = [utf8(v) for v in value]