Merge branch 'sophist_fix_error_on_malformed_TRCK_tag' of git://github.com/Sophist-UK/picard into Sophist-UK-sophist_fix_error_on_malformed_TRCK_tag

Conflicts:
	NEWS.txt
This commit is contained in:
Laurent Monin
2014-04-06 22:46:16 +02:00
2 changed files with 13 additions and 11 deletions

View File

@@ -36,6 +36,7 @@
* Add %_musicbrainz_tracknumber% to hold track # as shown on MusicBrainz release web-page
e.g. vinyl/cassette style A1, A2, B1, B2
* Show the ID3 version of the file in the Info... dialog (Ctrl-I) (PICARD-218)
* Fixed a bug where Picard crashed if a MP3 file had malformed TRCK or TPOS tags (PICARD-112)
Version 1.2 - 2013-03-30

View File

@@ -20,6 +20,7 @@
import mutagen.apev2
import mutagen.mp3
import mutagen.trueaudio
import re
from collections import defaultdict
from mutagen import id3
from picard import config, log
@@ -175,6 +176,10 @@ class ID3File(File):
__other_supported_tags = ("discnumber", "tracknumber",
"totaldiscs", "totaltracks")
__tag_re_parse = {
'TRCK': re.compile(r'^(?P<tracknumber>\d+)(?:/(?P<totaltracks>\d+))?$'),
'TPOS': re.compile(r'^(?P<discnumber>\d+)(?:/(?P<totaldiscs>\d+))?$')
}
def __init__(self, filename):
super(ID3File, self).__init__(filename)
@@ -239,18 +244,14 @@ class ID3File(File):
metadata.add(name, unicode(frame.text))
elif frameid == 'UFID' and frame.owner == 'http://musicbrainz.org':
metadata['musicbrainz_recordingid'] = frame.data.decode('ascii', 'ignore')
elif frameid == 'TRCK':
value = frame.text[0].split('/')
if len(value) > 1:
metadata['tracknumber'], metadata['totaltracks'] = value[:2]
elif frameid in self.__tag_re_parse.keys():
m = self.__tag_re_parse[frameid].search(frame.text[0])
if m:
for name, value in m.groupdict().iteritems():
if value is not None:
metadata[name] = value
else:
metadata['tracknumber'] = value[0]
elif frameid == 'TPOS':
value = frame.text[0].split('/')
if len(value) > 1:
metadata['discnumber'], metadata['totaldiscs'] = value[:2]
else:
metadata['discnumber'] = value[0]
log.error("Invalid %s value '%s' dropped in %r", frameid, frame.text[0], filename)
elif frameid == 'APIC':
extras = {
'desc': frame.desc,