Error handling for 'filesize' field

- Logs a warning and returns 0 if getsize fails
- Add tests for this

Fix #1326
This commit is contained in:
Tom Jaspers 2015-02-13 12:24:21 +01:00
parent e1e46df1b3
commit 9cdd541943
2 changed files with 24 additions and 1 deletions

View file

@ -421,7 +421,7 @@ class Item(LibModel):
getters = plugins.item_field_getters()
getters['singleton'] = lambda i: i.album_id is None
# Filesize is given in bytes
getters['filesize'] = lambda i: os.path.getsize(syspath(i.path))
getters['filesize'] = lambda i: i.try_filesize()
return getters
@classmethod
@ -605,6 +605,13 @@ class Item(LibModel):
"""
return int(os.path.getmtime(syspath(self.path)))
def try_filesize(self):
try:
return os.path.getsize(syspath(self.path))
except (OSError, Exception) as exc:
log.warning(u'could not get filesize: {0}', exc)
return 0
# Model methods.
def remove(self, delete=False, with_album=True):

View file

@ -1172,6 +1172,22 @@ class ItemReadTest(unittest.TestCase):
item.read('/thisfiledoesnotexist')
class FilesizeTest(unittest.TestCase, TestHelper):
def setUp(self):
self.setup_beets()
def tearDown(self):
self.teardown_beets()
def test_filesize(self):
item = self.add_item_fixture()
self.assertNotEquals(item.filesize, 0)
def test_nonexistent_file(self):
item = beets.library.Item()
self.assertEqual(item.filesize, 0)
class ParseQueryTest(unittest.TestCase):
def test_parse_invalid_query_string(self):
with self.assertRaises(beets.dbcore.InvalidQueryError) as raised: