diff --git a/NEWS.txt b/NEWS.txt index 324e94975..ec7185512 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -14,10 +14,11 @@ Version 1.0 - 2012-06-XX * Lookup in Browser will now not use MBIDs to lookup unmatched files/clusters * Add Date/Country to CD Lookup results dialog (PICARD-198) * Fix/reset album folksonomy tag counts while refreshing releases (PICARD-4) - * Plugins actions can how create sub-menus using the MENU class attribute + * Plugins actions can now create sub-menus using the MENU class attribute * New plugin hook register_clusterlist_action * Display the port Picard is listening on at bottom right status bar (PICARD-191) * Make album drops from right hand pane to left default to "unmatched files" again (PICARD-33) + * Remove .DS_Store, desktop.ini, and Thumbs.db from otherwise empty directories (PICARD-75) Version 0.16 - 2011-10-23 * Added AcoustID support. diff --git a/picard/file.py b/picard/file.py index eaee0f9a5..728c6b410 100644 --- a/picard/file.py +++ b/picard/file.py @@ -171,12 +171,21 @@ class File(LockableObject, Item): new_filename = self._rename(old_filename, metadata, settings) # Move extra files (images, playlists, etc.) if settings["move_files"] and settings["move_additional_files"]: - self._move_additional_files(old_filename, new_filename, - settings) + self._move_additional_files(old_filename, new_filename, settings) # Delete empty directories if settings["delete_empty_dirs"]: + dirname = encode_filename(os.path.dirname(old_filename)) try: - os.removedirs(encode_filename(os.path.dirname(old_filename))) + self._rmdir(dirname) + head, tail = os.path.split(dirname) + if not tail: + head, tail = os.path.split(head) + while head and tail: + try: + self._rmdir(head) + except: + break + head, tail = os.path.split(head) except EnvironmentError: pass # Save cover art images @@ -184,6 +193,14 @@ class File(LockableObject, Item): self._save_images(new_filename, metadata, settings) return new_filename + @staticmethod + def _rmdir(dir): + junk_files = (".DS_Store", "desktop.ini", "Desktop.ini", "Thumbs.db") + if not set(os.listdir(dir)) - set(junk_files): + shutil.rmtree(dir, False) + else: + raise OSError + @call_next def _saving_finished(self, next, result=None, error=None): old_filename = new_filename = self.filename