mirror of
https://github.com/fergalmoran/picard.git
synced 2025-12-23 01:37:47 +00:00
300 lines
15 KiB
Python
300 lines
15 KiB
Python
import locale
|
|
import os.path
|
|
import unittest
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
import picard
|
|
from picard import config
|
|
from picard.metadata import Metadata
|
|
from picard.mbxml import track_to_metadata, release_to_metadata
|
|
from picard.releasegroup import ReleaseGroup
|
|
from picard.i18n import setup_gettext
|
|
|
|
|
|
settings = {
|
|
"standardize_tracks": False,
|
|
"standardize_artists": False,
|
|
"standardize_releases": False,
|
|
"translate_artist_names": False
|
|
}
|
|
|
|
|
|
class XmlNode(object):
|
|
|
|
def __init__(self, text=u'', children={}, attribs={}):
|
|
self.text = text
|
|
self.children = children
|
|
self.attribs = attribs
|
|
|
|
def __repr__(self):
|
|
return repr(self.__dict__)
|
|
|
|
def __getattr__(self, name):
|
|
try:
|
|
return self.children[name]
|
|
except KeyError:
|
|
try:
|
|
return self.attribs[name]
|
|
except KeyError:
|
|
raise
|
|
#raise AttributeError, name
|
|
|
|
|
|
class ReleaseTest(unittest.TestCase):
|
|
def setUp(self):
|
|
# we are using temporary locales for tests
|
|
self.tmp_path = tempfile.mkdtemp().decode("utf-8")
|
|
if sys.hexversion >= 0x020700F0:
|
|
self.addCleanup(shutil.rmtree, self.tmp_path)
|
|
self.localedir = os.path.join(self.tmp_path, 'locale')
|
|
setup_gettext(self.localedir, 'C')
|
|
|
|
def tearDown(self):
|
|
if sys.hexversion < 0x020700F0:
|
|
shutil.rmtree(self.tmp_path)
|
|
|
|
def test_1(self):
|
|
config.setting = settings
|
|
rlist = XmlNode(children={
|
|
'metadata': [XmlNode(children={
|
|
'release_list': [XmlNode(attribs={'count': '3'}, children={
|
|
'release': [
|
|
XmlNode(attribs={'id': '123'}, children={
|
|
'title': [XmlNode(text='Foo')],
|
|
'status': [XmlNode(text='Official')],
|
|
'packaging': [XmlNode(text='Jewel Case')],
|
|
'disambiguation': [XmlNode(text='special')],
|
|
'text_representation': [XmlNode(children={
|
|
'language': [XmlNode(text='eng')],
|
|
'script': [XmlNode(text='Latn')]
|
|
})],
|
|
'date': [XmlNode(text='2009-08-07')],
|
|
'country': [XmlNode(text='GB')],
|
|
'barcode': [XmlNode(text='012345678929')],
|
|
'medium_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'medium': [XmlNode(children={
|
|
'position': [XmlNode(text='1')],
|
|
'format': [XmlNode(text='CD')],
|
|
'track_list': [XmlNode(attribs={'count': '5'})],
|
|
})]
|
|
})],
|
|
'label_info_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'label_info': [XmlNode(children={
|
|
'catalog_number': [XmlNode(text='cat 123')],
|
|
'label': [XmlNode(children={
|
|
'name': [XmlNode(text='label A')]
|
|
})]
|
|
})]
|
|
})]
|
|
}),
|
|
XmlNode(attribs={'id': '456'}, children={
|
|
'title': [XmlNode(text='Foo')],
|
|
'status': [XmlNode(text='Official')],
|
|
'packaging': [XmlNode(text='Digipak')],
|
|
'disambiguation': [XmlNode(text='special')],
|
|
'text_representation': [XmlNode(children={
|
|
'language': [XmlNode(text='eng')],
|
|
'script': [XmlNode(text='Latn')]
|
|
})],
|
|
'date': [XmlNode(text='2009-08-07')],
|
|
'country': [XmlNode(text='GB')],
|
|
'barcode': [XmlNode(text='012345678929')],
|
|
'medium_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'medium': [XmlNode(children={
|
|
'position': [XmlNode(text='1')],
|
|
'format': [XmlNode(text='CD')],
|
|
'track_list': [XmlNode(attribs={'count': '5'})],
|
|
})]
|
|
})],
|
|
'label_info_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'label_info': [XmlNode(children={
|
|
'catalog_number': [XmlNode(text='cat 123')],
|
|
'label': [XmlNode(children={
|
|
'name': [XmlNode(text='label A')]
|
|
})]
|
|
})]
|
|
})]
|
|
}),
|
|
XmlNode(attribs={'id': '789'}, children={
|
|
'title': [XmlNode(text='Foo')],
|
|
'status': [XmlNode(text='Official')],
|
|
'packaging': [XmlNode(text='Digipak')],
|
|
'disambiguation': [XmlNode(text='specialx')],
|
|
'text_representation': [XmlNode(children={
|
|
'language': [XmlNode(text='eng')],
|
|
'script': [XmlNode(text='Latn')]
|
|
})],
|
|
'date': [XmlNode(text='2009-08-07')],
|
|
'country': [XmlNode(text='GB')],
|
|
'barcode': [XmlNode(text='012345678929')],
|
|
'medium_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'medium': [XmlNode(children={
|
|
'position': [XmlNode(text='1')],
|
|
'format': [XmlNode(text='CD')],
|
|
'track_list': [XmlNode(attribs={'count': '5'})],
|
|
})]
|
|
})],
|
|
'label_info_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'label_info': [XmlNode(children={
|
|
'catalog_number': [XmlNode(text='cat 123')],
|
|
'label': [XmlNode(children={
|
|
'name': [XmlNode(text='label A')]
|
|
})]
|
|
})]
|
|
})]
|
|
}),
|
|
]
|
|
})]
|
|
})]
|
|
})
|
|
r = ReleaseGroup(1)
|
|
r._parse_versions(rlist)
|
|
self.assertEqual(r.versions[0]['name'],
|
|
'5 / 2009 / GB / CD / label A / cat 123 / Jewel Case / special')
|
|
self.assertEqual(r.versions[1]['name'],
|
|
'5 / 2009 / GB / CD / label A / cat 123 / Digipak / special')
|
|
self.assertEqual(r.versions[2]['name'],
|
|
'5 / 2009 / GB / CD / label A / cat 123 / Digipak / specialx')
|
|
|
|
def test_2(self):
|
|
config.setting = settings
|
|
rlist = XmlNode(children={
|
|
'metadata': [XmlNode(children={
|
|
'release_list': [XmlNode(attribs={'count': '2'}, children={
|
|
'release': [
|
|
XmlNode(attribs={'id': '789'}, children={
|
|
'title': [XmlNode(text='Foox')],
|
|
'status': [XmlNode(text='Official')],
|
|
'disambiguation': [XmlNode(text='special A')],
|
|
'text_representation': [XmlNode(children={
|
|
'language': [XmlNode(text='eng')],
|
|
'script': [XmlNode(text='Latn')]
|
|
})],
|
|
'date': [XmlNode(text='2011-08-07')],
|
|
'country': [XmlNode(text='FR')],
|
|
'medium_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'medium': [XmlNode(children={
|
|
'position': [XmlNode(text='1')],
|
|
'format': [XmlNode(text='CD')],
|
|
'track_list': [XmlNode(attribs={'count': '5'})],
|
|
})]
|
|
})],
|
|
'label_info_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'label_info': [XmlNode(children={
|
|
'catalog_number': [XmlNode(text='cat 123')],
|
|
'label': [XmlNode(children={
|
|
'name': [XmlNode(text='label A')]
|
|
})]
|
|
})]
|
|
})]
|
|
}),
|
|
XmlNode(attribs={'id': '789'}, children={
|
|
'title': [XmlNode(text='Foox')],
|
|
'status': [XmlNode(text='Official')],
|
|
'text_representation': [XmlNode(children={
|
|
'language': [XmlNode(text='eng')],
|
|
'script': [XmlNode(text='Latn')]
|
|
})],
|
|
'date': [XmlNode(text='2011-08-07')],
|
|
'country': [XmlNode(text='FR')],
|
|
'medium_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'medium': [XmlNode(children={
|
|
'position': [XmlNode(text='1')],
|
|
'format': [XmlNode(text='CD')],
|
|
'track_list': [XmlNode(attribs={'count': '5'})],
|
|
})]
|
|
})],
|
|
'label_info_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'label_info': [XmlNode(children={
|
|
'catalog_number': [XmlNode(text='cat 123')],
|
|
'label': [XmlNode(children={
|
|
'name': [XmlNode(text='label A')]
|
|
})]
|
|
})]
|
|
})]
|
|
}),
|
|
]
|
|
})]
|
|
})]
|
|
})
|
|
r = ReleaseGroup(1)
|
|
r._parse_versions(rlist)
|
|
self.assertEqual(r.versions[0]['name'],
|
|
'5 / 2011 / FR / CD / label A / cat 123 / special A')
|
|
self.assertEqual(r.versions[1]['name'],
|
|
'5 / 2011 / FR / CD / label A / cat 123')
|
|
|
|
def test_3(self):
|
|
config.setting = settings
|
|
rlist = XmlNode(children={
|
|
'metadata': [XmlNode(children={
|
|
'release_list': [XmlNode(attribs={'count': '2'}, children={
|
|
'release': [
|
|
XmlNode(attribs={'id': '789'}, children={
|
|
'title': [XmlNode(text='Foox')],
|
|
'status': [XmlNode(text='Official')],
|
|
'packaging': [XmlNode(text='Digipak')],
|
|
'disambiguation': [XmlNode(text='specialx')],
|
|
'text_representation': [XmlNode(children={
|
|
'language': [XmlNode(text='eng')],
|
|
'script': [XmlNode(text='Latn')]
|
|
})],
|
|
'date': [XmlNode(text='2009-08-07')],
|
|
'country': [XmlNode(text='FR')],
|
|
'barcode': [XmlNode(text='012345678929')],
|
|
'medium_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'medium': [XmlNode(children={
|
|
'position': [XmlNode(text='1')],
|
|
'format': [XmlNode(text='CD')],
|
|
'track_list': [XmlNode(attribs={'count': '5'})],
|
|
})]
|
|
})],
|
|
'label_info_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'label_info': [XmlNode(children={
|
|
'catalog_number': [XmlNode(text='cat 123')],
|
|
'label': [XmlNode(children={
|
|
'name': [XmlNode(text='label A')]
|
|
})]
|
|
})]
|
|
})]
|
|
}),
|
|
XmlNode(attribs={'id': '789'}, children={
|
|
'title': [XmlNode(text='Foox')],
|
|
'status': [XmlNode(text='Official')],
|
|
'packaging': [XmlNode(text='Digipak')],
|
|
'disambiguation': [XmlNode(text='specialx')],
|
|
'text_representation': [XmlNode(children={
|
|
'language': [XmlNode(text='eng')],
|
|
'script': [XmlNode(text='Latn')]
|
|
})],
|
|
'date': [XmlNode(text='2009-08-07')],
|
|
'country': [XmlNode(text='FR')],
|
|
'barcode': [XmlNode(text='')],
|
|
'medium_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'medium': [XmlNode(children={
|
|
'position': [XmlNode(text='1')],
|
|
'format': [XmlNode(text='CD')],
|
|
'track_list': [XmlNode(attribs={'count': '5'})],
|
|
})]
|
|
})],
|
|
'label_info_list': [XmlNode(attribs={'count': '1'}, children={
|
|
'label_info': [XmlNode(children={
|
|
'catalog_number': [XmlNode(text='cat 123')],
|
|
'label': [XmlNode(children={
|
|
'name': [XmlNode(text='label A')]
|
|
})]
|
|
})]
|
|
})]
|
|
}),
|
|
]
|
|
})]
|
|
})]
|
|
})
|
|
r = ReleaseGroup(1)
|
|
r._parse_versions(rlist)
|
|
self.assertEqual(r.versions[0]['name'],
|
|
'5 / 2009 / FR / CD / label A / cat 123 / 012345678929')
|
|
self.assertEqual(r.versions[1]['name'],
|
|
'5 / 2009 / FR / CD / label A / cat 123 / [no barcode]')
|