diff --git a/beets/config_default.yaml b/beets/config_default.yaml index 78f16d051..ae0882542 100644 --- a/beets/config_default.yaml +++ b/beets/config_default.yaml @@ -22,6 +22,7 @@ import: flat: no group_albums: no pretend: false + detailed: false clutter: ["Thumbs.DB", ".DS_Store"] ignore: [".*", "*~", "System Volume Information"] diff --git a/beets/importer.py b/beets/importer.py index 0877b5508..632eda30c 100644 --- a/beets/importer.py +++ b/beets/importer.py @@ -1299,9 +1299,16 @@ def manipulate_files(session, task): def log_files(session, task): """A coroutine (pipeline stage) to log each file which will be imported """ + detailed = config['import']['detailed'].get() if isinstance(task, SingletonImportTask): - log.info(displayable_path(task.item['path'])) + if detailed: + log.info( + 'Singleton: {0}'.format(displayable_path(task.item['path']))) + else: + log.info(displayable_path(task.item['path'])) elif task.items: + if detailed: + log.info('Album {0}'.format(displayable_path(task.paths[0]))) for item in task.items: log.info(displayable_path(item['path'])) diff --git a/beets/ui/commands.py b/beets/ui/commands.py index 546fe87d9..8f369a213 100644 --- a/beets/ui/commands.py +++ b/beets/ui/commands.py @@ -947,6 +947,10 @@ import_cmd.parser.add_option( '--pretend', dest='pretend', action='store_true', help='just print the files to import' ) +import_cmd.parser.add_option( + '--detailed', dest='detailed', action='store_true', + help='use in conjunction with --pretend to get sophisticated output' +) import_cmd.func = import_func default_commands.append(import_cmd) diff --git a/docs/reference/cli.rst b/docs/reference/cli.rst index e569c073c..baee5423b 100644 --- a/docs/reference/cli.rst +++ b/docs/reference/cli.rst @@ -132,6 +132,10 @@ Optional command flags: option. If set, beets will just print a list of files that it would otherwise import. +* To get a more detailed output with the ``--pretend`` option, you can use the + ``--detailed`` flag. This way you can see which tracks beets think should + belong to an album. + .. _rarfile: https://pypi.python.org/pypi/rarfile/2.2 .. only:: html diff --git a/test/test_importer.py b/test/test_importer.py index 0ffa9aaf3..71059961d 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1542,7 +1542,8 @@ class ImportPretendTest(_common.TestCase, ImportHelper): def setUp(self): super(ImportPretendTest, self).setUp() self.setup_beets() - self._create_import_dir(1) + self.__create_import_dir() + self.__create_empty_import_dir() self._setup_import_session() config['import']['pretend'] = True self.matcher = AutotagStub().install() @@ -1552,35 +1553,31 @@ class ImportPretendTest(_common.TestCase, ImportHelper): self.teardown_beets() self.matcher.restore() - def test_import_pretend(self): + def __create_import_dir(self): + self._create_import_dir(1) resource_path = os.path.join(_common.RSRC, u'empty.mp3') single_path = os.path.join(self.import_dir, u'track_2.mp3') - shutil.copy(resource_path, single_path) - import_files = [ + self.import_paths = [ os.path.join(self.import_dir, u'the_album'), single_path ] - self._setup_import_session(singletons=True) - self.importer.paths = import_files + self.import_files = [ + displayable_path( + os.path.join(self.import_paths[0], u'track_1.mp3')), + displayable_path(single_path) + ] - with capture_log() as logs: - self.importer.run() - - self.assertEqual(len(self.lib.items()), 0) - self.assertEqual(len(self.lib.albums()), 0) - - self.assertEqual(len(logs), 3) - self.assertEqual(logs[1], os.path.join(import_files[0], - u'track_1.mp3')) - self.assertEqual(logs[2], import_files[1]) - - def test_import_pretend_empty(self): + def __create_empty_import_dir(self): path = os.path.join(self.temp_dir, 'empty') os.makedirs(path) + self.empty_path = path - self._setup_import_session(singletons=True) - self.importer.paths = [path] + def __run(self, import_paths, singletons=True, detailed=False): + config['import']['detailed'] = detailed + + self._setup_import_session(singletons=singletons) + self.importer.paths = import_paths with capture_log() as logs: self.importer.run() @@ -1588,9 +1585,46 @@ class ImportPretendTest(_common.TestCase, ImportHelper): self.assertEqual(len(self.lib.items()), 0) self.assertEqual(len(self.lib.albums()), 0) + return logs + + def test_import_pretend(self): + logs = self.__run(self.import_paths) + + self.assertEqual(len(logs), 3) + self.assertEqual(logs[1], self.import_files[0]) + self.assertEqual(logs[2], self.import_files[1]) + + def test_import_pretend_empty(self): + logs = self.__run([self.empty_path]) + self.assertEqual(len(logs), 2) self.assertEqual(logs[1], 'No files imported from {0}' - .format(displayable_path(path))) + .format(displayable_path(self.empty_path))) + + def test_import_singletons_pretend_detailed(self): + logs = self.__run(self.import_paths, detailed=True) + + self.assertEqual(len(logs), 3) + self.assertEqual(logs[1], 'Singleton: %s' % self.import_files[0]) + self.assertEqual(logs[2], 'Singleton: %s' % self.import_paths[1]) + + def test_import_album_pretend_detailed(self): + logs = self.__run(self.import_paths, singletons=False, detailed=True) + + self.assertEqual(len(logs), 5) + self.assertEqual(logs[1], + 'Album %s' % displayable_path(self.import_paths[0])) + self.assertEqual(logs[2], self.import_files[0]) + self.assertEqual(logs[3], + 'Album %s' % displayable_path(self.import_paths[1])) + self.assertEqual(logs[4], self.import_paths[1]) + + def test_import_pretend_empty_detailed(self): + logs = self.__run([self.empty_path], detailed=True) + + self.assertEqual(len(logs), 2) + self.assertEqual(logs[1], 'No files imported from {0}' + .format(displayable_path(self.empty_path))) def suite():