def __getattr__(self, key): if (key == 'track_number'): try: return int(re.findall('\d+', unicode(self.get("Track", u"0")))[0]) except IndexError: return 0 elif (key == 'track_total'): try: return int(re.findall('\d+/(\d+)', unicode(self.get("Track", u"0")))[0]) except IndexError: return 0 elif (key == 'album_number'): try: return int(re.findall('\d+', unicode(self.get("Media", u"0")))[0]) except IndexError: return 0 elif (key == 'album_total'): try: return int(re.findall('\d+/(\d+)', unicode(self.get("Media", u"0")))[0]) except IndexError: return 0 elif (key in self.ATTRIBUTE_MAP): return unicode(self.get(self.ATTRIBUTE_MAP[key], u'')) elif (key in MetaData.FIELDS): return u'' else: try: return self.__dict__[key] except KeyError: raise AttributeError(key)
def read_data(cls, data): if (not data.startswith(u"# xmcd")): raise XMCDException("") disc_length = re.search(r'# Disc length: (\d+)', data) if (disc_length is not None): disc_length = int(disc_length.group(1)) track_lengths = re.compile(r'# Track frame offsets:\s+[#\s\d]+', re.DOTALL).search(data) if (track_lengths is not None): track_lengths = map(int, re.findall(r'\d+', track_lengths.group(0))) fields = {} for line in re.findall(r'.+=.*[\r\n]', data): (field, value) = line.split(u'=', 1) field = field.encode('ascii') value = value.rstrip('\r\n') if (field in fields.keys()): fields[field] += value else: fields[field] = value return XMCD(values=fields, offsets=track_lengths, length=disc_length)
def clean(self, fixes_applied): tag_items = [] for tag in self.tags: if (tag.type == 0): text = unicode(tag) #check trailing whitespace fix1 = text.rstrip() if (fix1 != text): fixes_applied.append( _(u"removed trailing whitespace from %(field)s") % {"field": tag.key.decode('ascii')}) #check leading whitespace fix2 = fix1.lstrip() if (fix2 != fix1): fixes_applied.append( _(u"removed leading whitespace from %(field)s") % {"field": tag.key.decode('ascii')}) if (tag.key in self.INTEGER_ITEMS): try: current = int(re.findall('\d+', fix2)[0]) except IndexError: current = 0 try: total = int(re.findall('\d+/(\d+)', fix2)[0]) except IndexError: total = 0 if (total != 0): fix3 = u"%d/%d" % (current, total) else: fix3 = unicode(current) if (fix3 != fix2): fixes_applied.append( _(u"removed leading zeroes from %(field)s") % {"field": tag.key.decode('ascii')}) else: fix3 = fix2 if (len(fix3) > 0): tag_items.append(ApeTagItem.string(tag.key, fix3)) else: fixes_applied.append( _("removed empty field %(field)s") % {"field": tag.key.decode('ascii')}) else: tag_items.append(tag) return self.__class__(tag_items, self.contains_header, self.contains_footer)
def __getattr__(self, key): if (key == 'track_number'): try: return int( re.findall('\d+', unicode(self.get("Track", u"0")))[0]) except IndexError: return 0 elif (key == 'track_total'): try: return int( re.findall('\d+/(\d+)', unicode(self.get("Track", u"0")))[0]) except IndexError: return 0 elif (key == 'album_number'): try: return int( re.findall('\d+', unicode(self.get("Media", u"0")))[0]) except IndexError: return 0 elif (key == 'album_total'): try: return int( re.findall('\d+/(\d+)', unicode(self.get("Media", u"0")))[0]) except IndexError: return 0 elif (key in self.ATTRIBUTE_MAP): return unicode(self.get(self.ATTRIBUTE_MAP[key], u'')) elif (key in MetaData.__FIELDS__): return u'' else: try: return self.__dict__[key] except KeyError: raise AttributeError(key)