Skip to content

Commit 890d960

Browse files
committed
PICARD-2199: Fix saving ratings to ID3 with non-latin1 characters in email
1 parent f3241a9 commit 890d960

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

picard/formats/id3.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ def _load(self, filename):
259259
tags = file.tags or {}
260260
config = get_config()
261261
itunes_compatible = config.setting['itunes_compatible_grouping']
262-
rating_user_email = config.setting['rating_user_email']
262+
rating_user_email = id3text(config.setting['rating_user_email'], 0)
263263
rating_steps = config.setting['rating_steps']
264264
# upgrade custom 2.3 frames to 2.4
265265
for old, new in self.__upgrade.items():
@@ -458,17 +458,18 @@ def _save(self, filename, metadata):
458458
elif name == 'musicbrainz_recordingid':
459459
tags.add(id3.UFID(owner='http://musicbrainz.org', data=bytes(values[0], 'ascii')))
460460
elif name == '~rating':
461+
rating_email = id3text(config.setting['rating_user_email'], 0)
461462
# Search for an existing POPM frame to get the current playcount
462463
for frame in tags.values():
463-
if frame.FrameID == 'POPM' and frame.email == config.setting['rating_user_email']:
464+
if frame.FrameID == 'POPM' and frame.email == rating_email:
464465
count = getattr(frame, 'count', 0)
465466
break
466467
else:
467468
count = 0
468469

469470
# Convert rating to range between 0 and 255
470471
rating = int(round(float(values[0]) * 255 / (config.setting['rating_steps'] - 1)))
471-
tags.add(id3.POPM(email=config.setting['rating_user_email'], rating=rating, count=count))
472+
tags.add(id3.POPM(email=rating_email, rating=rating, count=count))
472473
elif name == 'grouping':
473474
if config.setting['itunes_compatible_grouping']:
474475
tags.add(id3.GRP1(encoding=encoding, text=values))
@@ -581,7 +582,7 @@ def _remove_deleted_tags(self, metadata, tags):
581582
tags.delall(real_name)
582583
tags.delall('TXXX:' + self.__rtranslate_freetext[name])
583584
elif real_name == 'POPM':
584-
user_email = config.setting['rating_user_email']
585+
user_email = id3text(config.setting['rating_user_email'], 0)
585586
for key, frame in list(tags.items()):
586587
if frame.FrameID == 'POPM' and frame.email == user_email:
587588
del tags[key]

test/formats/test_id3.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,15 @@ def test_woar_delete(self):
516516
loaded_metadata = save_and_load_metadata(self.filename, metadata)
517517
self.assertNotIn('website', loaded_metadata)
518518

519+
@skipUnlessTestfile
520+
def test_rating_email_non_latin1(self):
521+
for rating in range(6):
522+
config.setting['rating_user_email'] = 'foo€'
523+
rating = '3'
524+
metadata = Metadata({'~rating': rating})
525+
loaded_metadata = save_and_load_metadata(self.filename, metadata)
526+
self.assertEqual(loaded_metadata['~rating'], rating, '~rating: %r != %r' % (loaded_metadata['~rating'], rating))
527+
519528

520529
class MP3Test(CommonId3Tests.Id3TestCase):
521530
testfile = 'test.mp3'

0 commit comments

Comments
 (0)