def move(self, item, copy=False, in_album=False, basedir=None, with_album=True): """Move the item to its designated location within the library directory (provided by destination()). Subdirectories are created as needed. If the operation succeeds, the item's path field is updated to reflect the new location. If copy is True, moving the file is copied rather than moved. If in_album is True, then the track is treated as part of an album even if it does not yet have an album_id associated with it. (This allows items to be moved before they are added to the database, a performance optimization.) basedir overrides the library base directory for the destination. If the item is in an album, the album is given an opportunity to move its art. (This can be disabled by passing with_album=False.) The item is stored to the database if it is in the database, so any dirty fields prior to the move() call will be written as a side effect. You probably want to call save() to commit the DB transaction. """ dest = self.destination(item, in_album=in_album, basedir=basedir) # Create necessary ancestry for the move. util.mkdirall(dest) # Perform the move and store the change. old_path = item.path item.move(dest, copy) if item.id is not None: self.store(item) # If this item is in an album, move its art. if with_album: album = self.get_album(item) if album: album.move_art(copy) # Prune vacated directory. if not copy: util.prune_dirs(os.path.dirname(old_path), self.directory)
def move(self, library, copy=False, in_album=False): """Move the item to its designated location within the library directory (provided by destination()). Subdirectories are created as needed. If the operation succeeds, the item's path field is updated to reflect the new location. If copy is True, moving the file is copied rather than moved. If in_album is True, then the track is treated as part of an album even if it does not yet have an album_id associated with it. (This allows items to be moved before they are added to the database, a performance optimization.) Passes on appropriate exceptions if directories cannot be created or moving/copying fails. Note that one should almost certainly call store() and library.save() after this method in order to keep on-disk data consistent. """ dest = library.destination(self, in_album=in_album) # Create necessary ancestry for the move. util.mkdirall(dest) if not shutil._samefile(syspath(self.path), syspath(dest)): if copy: # copyfile rather than copy will not copy permissions # bits, thus possibly making the copy writable even when # the original is read-only. shutil.copyfile(syspath(self.path), syspath(dest)) else: shutil.move(syspath(self.path), syspath(dest)) # Either copying or moving succeeded, so update the stored path. self.path = dest