diff --git a/beets/library.py b/beets/library.py index 6a94b604b..259f894da 100644 --- a/beets/library.py +++ b/beets/library.py @@ -95,9 +95,9 @@ ALBUM_KEYS_ITEM = [f[0] for f in ALBUM_FIELDS if f[2]] # Default search fields for various granularities. ARTIST_DEFAULT_FIELDS = ('artist',) -ALBUM_DEFAULT_FIELDS = ARTIST_DEFAULT_FIELDS + ('album', 'genre') -ITEM_DEFAULT_FIELDS = ALBUM_DEFAULT_FIELDS + \ - ('albumartist', 'title', 'comments') +ALBUM_DEFAULT_FIELDS = ('album', 'albumartist', 'genre') +ITEM_DEFAULT_FIELDS = ARTIST_DEFAULT_FIELDS + ALBUM_DEFAULT_FIELDS + \ + ('title', 'comments') # Logger. log = logging.getLogger('beets') @@ -1004,12 +1004,23 @@ class Library(BaseLibrary): self.conn.execute(query, subvars) item._clear_dirty() - def remove(self, item, delete=False): + def _remove(self, item, delete=False): + """Removes this item from the library. If delete, then item's file + is also deleted from disk. + """ self.conn.execute('DELETE FROM items WHERE id=?', (item.id,)) if delete: os.unlink(_syspath(item.path)) - + def remove(self, item, delete=False): + """Removes this item, and the associated album if the removed item + was the last associated item of the album. + """ + album = self.get_album(item) + self._remove(item, delete) + if album and not album.items(): + album._remove(delete) + # Browsing. def artists(self, query=None): @@ -1190,6 +1201,27 @@ class Album(BaseAlbum): ) return ResultIterator(c, self._library) + def _remove(self, delete=False): + """Removes this album from the library. If delete, then album + art is deleted from disk, and the directories are removed + recursively (if empty). + """ + # Delete art and directory if empty. + if delete: + artpath = self.artpath + if artpath: + os.unlink(_syspath(artpath)) + try: + os.removedirs(_syspath(os.path.dirname(artpath))) + except OSError: + pass + + # Remove album from database. + self._library.conn.execute( + 'DELETE FROM albums WHERE id=?', + (self.id,) + ) + def remove(self, delete=False): """Removes this album and all its associated items from the library. If delete, then the items' files are also deleted @@ -1197,19 +1229,10 @@ class Album(BaseAlbum): """ # Remove items. for item in self.items(): - self._library.remove(item, delete) - - # Delete art. - if delete: - artpath = self.artpath - if artpath: - os.unlink(_syspath(artpath)) + self._library._remove(item, delete) # Remove album. - self._library.conn.execute( - 'DELETE FROM albums WHERE id=?', - (self.id,) - ) + self._remove(delete) def move(self, copy=False): """Moves (or copies) all items to their destination. Any diff --git a/test/rsrc/test.blb b/test/rsrc/test.blb index 8e8a80d89..166372f09 100644 Binary files a/test/rsrc/test.blb and b/test/rsrc/test.blb differ diff --git a/test/test_art.py b/test/test_art.py index 75a27f7c0..369c5e839 100644 --- a/test/test_art.py +++ b/test/test_art.py @@ -17,7 +17,7 @@ import unittest import sys -sys.path.append('..') +sys.path.insert(0, '..') from beets.autotag import art class MockHeaders(object): diff --git a/test/test_autotag.py b/test/test_autotag.py index 9cfb14413..81beb3260 100644 --- a/test/test_autotag.py +++ b/test/test_autotag.py @@ -20,7 +20,7 @@ import sys import os import shutil import re -sys.path.append('..') +sys.path.insert(0, '..') from beets import autotag from beets.library import Item diff --git a/test/test_db.py b/test/test_db.py index 95db813fb..cb7643add 100644 --- a/test/test_db.py +++ b/test/test_db.py @@ -21,7 +21,7 @@ import os import sqlite3 import ntpath import posixpath -sys.path.append('..') +sys.path.insert(0, '..') import beets.library def lib(): return beets.library.Library('rsrc' + os.sep + 'test.blb') diff --git a/test/test_files.py b/test/test_files.py index 311dba671..1742214e9 100644 --- a/test/test_files.py +++ b/test/test_files.py @@ -21,7 +21,7 @@ import sys import os import stat from os.path import join -sys.path.append('..') +sys.path.insert(0, '..') import beets.library from test_db import item diff --git a/test/test_mb.py b/test/test_mb.py index acb67eb94..20745b3cb 100644 --- a/test/test_mb.py +++ b/test/test_mb.py @@ -21,7 +21,7 @@ import time import musicbrainz2.model import musicbrainz2.webservice as mbws import _common -sys.path.append('..') +sys.path.insert(0, '..') from beets.autotag import mb def nullfun(): pass diff --git a/test/test_mediafile.py b/test/test_mediafile.py index af096bea5..a905ab989 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -16,7 +16,7 @@ """ import unittest, sys, os, shutil, datetime -sys.path.append('..') +sys.path.insert(0, '..') import beets.mediafile class EdgeTest(unittest.TestCase): diff --git a/test/test_mediafile_basic.py b/test/test_mediafile_basic.py index 3aab06131..24948f1a2 100644 --- a/test/test_mediafile_basic.py +++ b/test/test_mediafile_basic.py @@ -17,7 +17,7 @@ layer. """ import unittest, sys, os, shutil, datetime -sys.path.append('..') +sys.path.insert(0, '..') import beets.mediafile diff --git a/test/test_player.py b/test/test_player.py index 4bd95bb78..4586aa804 100644 --- a/test/test_player.py +++ b/test/test_player.py @@ -17,7 +17,7 @@ import unittest import sys -sys.path.append('..') +sys.path.insert(0, '..') from beetsplug import bpd class FauxPathTest(unittest.TestCase): diff --git a/test/test_query.py b/test/test_query.py index e05f6fab7..cd5eb3875 100644 --- a/test/test_query.py +++ b/test/test_query.py @@ -16,7 +16,7 @@ """ import unittest, sys, os -sys.path.append('..') +sys.path.insert(0, '..') import beets.library import test_db diff --git a/test/test_ui.py b/test/test_ui.py index 0db323b75..7af95d758 100644 --- a/test/test_ui.py +++ b/test/test_ui.py @@ -23,7 +23,7 @@ import textwrap from StringIO import StringIO import logging import _common -sys.path.append('..') +sys.path.insert(0, '..') from beets import library from beets import ui from beets.ui import commands