import sys

def bin2unicode(bin,possible_encoding='utf_8'):
    sysenc = sys.getfilesystemencoding()
    if possible_encoding is None:
        possible_encoding = sysenc
    try:
        return bin.decode(possible_encoding)
    except:
        try:
            if possible_encoding == sysenc:
                raise
            return bin.decode(sysenc)
        except:
            try:
                return bin.decode('utf_8')
            except:
                try:
                    return bin.decode('iso-8859-1')
                except:
                    try:
                        return bin.decode(sys.getfilesystemencoding())
                    except:
                        return bin.decode(sys.getdefaultencoding(), errors = 'replace')


def str2unicode(s):
    try:
        s = unicode(s)
    except: 
        flag = 0
        for encoding in [sys.getfilesystemencoding(), 'utf_8', 'iso-8859-1', 'unicode-escape' ]:
            try:
                s = unicode(s, encoding)
                flag = 1
                break
            except: 
                pass
        if flag == 0:
            try:
                s = unicode(s,sys.getdefaultencoding(), errors = 'replace')
            except:
                pass
    return s

def dunno2unicode(dunno):
    newdunno = None
    if isinstance(dunno,unicode):
        newdunno = dunno
    else:
        try:
            newdunno = bin2unicode(dunno)
        except:
            newdunno = str2unicode(dunno)
    return newdunno


def name2unicode(metadata):
    if metadata['info'].has_key('name.utf-8'):
        namekey = 'name.utf-8'
    else:
        namekey = 'name'
    if metadata.has_key('encoding'):
        encoding = metadata['encoding']
        metadata['info'][namekey] = bin2unicode(metadata['info'][namekey],encoding)
    else:
        metadata['info'][namekey] = bin2unicode(metadata['info'][namekey])

    # change metainfo['info']['name'] to metainfo['info'][namekey], just in case...
    # roer888 TODO: Never tested the following 2 lines 
    if namekey != 'name':
        metadata['info']['name'] = metadata['info'][namekey ]

    return namekey


def unicode2str(s):
    if not isinstance(s,unicode):
        return s
    return s.encode(sys.getfilesystemencoding())