Skip to content

Commit

Permalink
Implement Popularimeter beetbox#23
Browse files Browse the repository at this point in the history
  • Loading branch information
Ingo Fischer committed Jan 6, 2020
1 parent 384784c commit 2f88190
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
34 changes: 34 additions & 0 deletions mediafile.py
Original file line number Diff line number Diff line change
Expand Up @@ -1222,6 +1222,8 @@ def _none_value(self):
return False
elif self.out_type == six.text_type:
return u''
elif self.out_type == dict:
return {}


class ListMediaField(MediaField):
Expand Down Expand Up @@ -1414,6 +1416,34 @@ def __delete__(self, mediafile):
delattr(mediafile, 'images')


class PopmMediaField(MediaField):
""" Access Popularimeter as dictionary."""


class MP3PopmStorageStyle(StorageStyle):
formats = ['MP3']

def get(self, mutagen_file):
"""Returns POPM dictionary: {EMAIL: {'rating': RATING, 'count': COUNT}}
"""
return {
popm.email: {'rating': popm.rating, 'count': popm.count}
for popm in mutagen_file.tags.getall('POPM')
}

def set(self, mutagen_file, value):
"""Set POPM. 'count' will be set to 0 by default."""
popm_list = [
mutagen.id3.POPM(
email=email,
rating=value[email]['rating'],
count=value[email].get('count', 0)
)
for email in value.keys()
]
mutagen_file.tags.setall('POPM', popm_list)


class QNumberField(MediaField):
"""Access integer-represented Q number fields.
Expand Down Expand Up @@ -1849,6 +1879,10 @@ def update(self, dict):
StorageStyle('MUSICBRAINZ_ALBUMCOMMENT'),
ASFStorageStyle('MusicBrainz/Album Comment'),
)
popm = PopmMediaField(
MP3PopmStorageStyle(key='POPM', as_type=list),
out_type=dict
)

# Release date.
date = DateField(
Expand Down
33 changes: 32 additions & 1 deletion test/test_mediafile.py
Original file line number Diff line number Diff line change
Expand Up @@ -755,6 +755,37 @@ def test_unknown_apic_type(self):
mediafile = self._mediafile_fixture('image_unknown_type')
self.assertEqual(mediafile.images[0].type, ImageType.other)

def test_write_single_popm(self):
mediafile = self._mediafile_fixture('empty')
test_email = '[email protected]'
mediafile.popm = {
test_email: {'rating': 1, 'count': 1}
}
mediafile.save()
self.assertEqual(mediafile.popm, {
test_email: {'rating': 1, 'count': 1}
})

def test_write_popm_without_count(self):
mediafile = self._mediafile_fixture('empty')
test_email = '[email protected]'
mediafile.popm = {test_email: {'rating': 1}}
mediafile.save()
self.assertEqual(mediafile.popm, {
test_email: {'rating': 1, 'count': 0}
})

def test_write_multiple_popm(self):
mediafile = self._mediafile_fixture('full')
mediafile.popm = {'[email protected]': {'rating': 1, 'count': 1},
'[email protected]': {'rating': 2, 'count': 2}}
mediafile.save()

self.assertEqual(mediafile.popm, {
'[email protected]': {'rating': 1, 'count': 1},
'[email protected]': {'rating': 2, 'count': 2},
})


class MP4Test(ReadWriteTestBase, PartialTestMixin,
ImageStructureTestMixin, unittest.TestCase):
Expand Down Expand Up @@ -975,7 +1006,7 @@ def test_properties_from_readable_fields(self):

def test_known_fields(self):
fields = list(ReadWriteTestBase.tag_fields)
fields.extend(('encoder', 'images', 'genres', 'albumtype'))
fields.extend(('encoder', 'images', 'genres', 'albumtype', 'popm'))
assertCountEqual(self, MediaFile.fields(), fields)

def test_fields_in_readable_fields(self):
Expand Down

0 comments on commit 2f88190

Please sign in to comment.