test_id3.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import os
  2. import re
  3. import mutagen
  4. import pytest
  5. from symuid._tag_interface import ID3
  6. # pylint: disable=protected-access
  7. @pytest.mark.parametrize('track_name', ['id3v2.4-empty.mp3'])
  8. def test_get_track_path(tracks_dir_path, track_name):
  9. track_path = os.path.join(tracks_dir_path, track_name)
  10. iface = ID3(mutagen.File(track_path))
  11. assert track_path == iface.track_path
  12. @pytest.mark.parametrize(('track_name', 'tag_label', 'expected_text'), [
  13. ('id3v2.4-typical.mp3', 'TPE1', 'some artist'),
  14. ('id3v2.4-typical.mp3', 'COMM::eng', 'some comment'),
  15. ])
  16. def test__get_str(tracks_dir_path, track_name, tag_label, expected_text):
  17. iface = ID3(mutagen.File(os.path.join(tracks_dir_path, track_name)))
  18. assert expected_text == iface._get_str(tag_label)
  19. @pytest.mark.parametrize(('track_name', 'tag_label'), [
  20. ('id3v2.4-empty.mp3', 'TPE1'),
  21. ('id3v2.4-typical.mp3', 'COMM'),
  22. ])
  23. def test__get_str_missing(tracks_dir_path, track_name, tag_label):
  24. iface = ID3(mutagen.File(os.path.join(tracks_dir_path, track_name)))
  25. with pytest.raises(KeyError, match=re.escape(tag_label)):
  26. iface._get_str(tag_label)
  27. def test__get_free_str(empty_id3_path):
  28. mutagen_file = mutagen.File(empty_id3_path)
  29. mutagen_file.tags.add(mutagen.id3.TXXX(
  30. desc='foo',
  31. text='bar',
  32. ))
  33. mutagen_file.save()
  34. id3_iface = ID3(mutagen.File(empty_id3_path))
  35. assert id3_iface._get_free_str('foo') == 'bar'
  36. def test__get_free_str_missing(empty_id3_path):
  37. iface = ID3(mutagen.File(empty_id3_path))
  38. with pytest.raises(KeyError, match=r'TXXX:foo'):
  39. iface._get_free_str('foo')
  40. @pytest.mark.parametrize(('track_name', 'expected_comment'), [
  41. ('id3v2.4-empty.mp3', None),
  42. ('id3v2.4-typical.mp3', 'some comment'),
  43. ])
  44. def test_get_comment(tracks_dir_path, track_name, expected_comment):
  45. iface = ID3(mutagen.File(os.path.join(tracks_dir_path, track_name)))
  46. assert expected_comment == iface.get_comment()
  47. def test_set_comment(empty_id3_path):
  48. empty_id3_iface = ID3(mutagen.File(empty_id3_path))
  49. assert empty_id3_iface.get_comment() is None
  50. empty_id3_iface.set_comment('latin')
  51. assert empty_id3_iface.get_comment() == 'latin'
  52. empty_id3_iface.set_comment('你好')
  53. assert empty_id3_iface.get_comment() == '你好'
  54. empty_id3_iface.save()
  55. tags = mutagen.File(empty_id3_iface.track_path).tags
  56. assert len(tags) == 1
  57. tag = tags.values()[0]
  58. assert isinstance(tag, mutagen.id3.COMM)
  59. assert tag.lang == 'eng'
  60. assert tag.text == ['你好']
  61. @pytest.mark.parametrize(('tag_label', 'tag_value', 'expected_value'), [
  62. ('foo', '21/42', (21, 42)),
  63. ('bar', '-1/4', (-1, 4)),
  64. ('ham:egg', '0/-3', (0, -3)),
  65. ])
  66. def test_get_free_int_ratio(empty_id3_path, tag_label, tag_value, expected_value):
  67. mutagen_file = mutagen.File(empty_id3_path)
  68. mutagen_file.tags.add(mutagen.id3.TXXX(
  69. encoding=mutagen.id3.Encoding.LATIN1,
  70. desc=tag_label,
  71. text=[tag_value],
  72. ))
  73. mutagen_file.save()
  74. id3_iface = ID3(mutagen.File(empty_id3_path))
  75. assert id3_iface.get_free_int_ratio(tag_label) == expected_value
  76. @pytest.mark.parametrize(
  77. ('tag_label', 'nominator', 'denominator', 'expected_tag_value'),
  78. [('foo', 21, 42, '21/42'),
  79. ('bar', -1, 4, '-1/4'),
  80. ('ham:egg', 0, -3, '0/-3')],
  81. )
  82. def test_set_free_int_ratio(empty_id3_path, tag_label, nominator, denominator, expected_tag_value):
  83. id3_iface = ID3(mutagen.File(empty_id3_path))
  84. assert repr(id3_iface.set_free_int_ratio(tag_label, nominator, denominator))
  85. id3_iface.save()
  86. mutagen_file = mutagen.File(empty_id3_path)
  87. assert len(mutagen_file.tags) == 1
  88. assert mutagen_file.tags['TXXX:' + tag_label].text == [expected_tag_value]