diff --git a/beets/library.py b/beets/library.py index a57ed1642..4cf1d6d74 100644 --- a/beets/library.py +++ b/beets/library.py @@ -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): diff --git a/test/test_library.py b/test/test_library.py index 3515c855c..6bb88076e 100644 --- a/test/test_library.py +++ b/test/test_library.py @@ -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: