diff --git a/NEWS b/NEWS index bd98b5431..45a50cf4d 100644 --- a/NEWS +++ b/NEWS @@ -41,7 +41,8 @@ * Fix a bug where some files would be erroneously interpreted as MP4. * Fix permission bits applied to album art files. * Fix malformed MusicBrainz queries caused by null characters. -# Fix a bug with old versions of the Monkey's Audio format. +* Fix a bug with old versions of the Monkey's Audio format. +* Fix a crash on broken symbolic links. * Retry in more cases when MusicBrainz servers are slow/overloaded. * The old "albumify" plugin for upgrading databases was removed. diff --git a/beets/mediafile.py b/beets/mediafile.py index a65a0bd1d..7e0328985 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -495,6 +495,8 @@ class MediaFile(object): self.mgfile = mutagen.File(path) except unreadable_exc: raise UnreadableFileError('Mutagen could not read file') + except IOError: + raise UnreadableFileError('could not read file') if self.mgfile is None: # Mutagen couldn't guess the type raise FileTypeError('file type unsupported by Mutagen') diff --git a/test/test_mediafile.py b/test/test_mediafile.py index ce19e366f..b1163f51f 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -130,6 +130,15 @@ class SafetyTest(unittest.TestCase): self._exccheck('nothing.xml', beets.mediafile.UnreadableFileError, "ftyp") + def test_broken_symlink(self): + fn = os.path.join('rsrc', 'brokenlink') + os.symlink('does_not_exist', fn) + try: + self.assertRaises(beets.mediafile.UnreadableFileError, + beets.mediafile.MediaFile, fn) + finally: + os.unlink(fn) + class SideEffectsTest(unittest.TestCase): def setUp(self): self.empty = os.path.join('rsrc', 'empty.mp3')