From 0366dc81843016f00fb82fd8eb5ec877edaa7663 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sat, 16 Feb 2013 14:58:53 -0800 Subject: [PATCH 1/9] fix "import -l logpath" CLI option (GC-518) --- beets/ui/commands.py | 2 +- docs/changelog.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/beets/ui/commands.py b/beets/ui/commands.py index e4f04cc63..ccc43b519 100644 --- a/beets/ui/commands.py +++ b/beets/ui/commands.py @@ -702,7 +702,7 @@ import_cmd.parser.add_option('-P', '--noresume', action='store_false', dest='resume', help="do not try to resume importing") import_cmd.parser.add_option('-q', '--quiet', action='store_true', dest='quiet', help="never prompt for input: skip albums instead") -import_cmd.parser.add_option('-l', '--log', dest='logpath', +import_cmd.parser.add_option('-l', '--log', dest='log', help='file to log untaggable albums for later review') import_cmd.parser.add_option('-s', '--singletons', action='store_true', help='import individual tracks instead of full albums') diff --git a/docs/changelog.rst b/docs/changelog.rst index 4db6e5cf0..76bde7098 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -95,6 +95,7 @@ Other new stuff: * Fix an error when migrating the ``.beetsstate`` file on Windows. * A nicer error message is now given when the configuration file contains tabs. (YAML doesn't like tabs.) +* Fix the ``-l`` (log path) command-line option for the ``import`` command. .. _iTunes Sound Check: http://support.apple.com/kb/HT2425 From e780ff27c2386e94df912593598e7cf996e51900 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sat, 16 Feb 2013 15:04:07 -0800 Subject: [PATCH 2/9] update plugin API docs for 1.1 --- docs/plugins/writing.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/plugins/writing.rst b/docs/plugins/writing.rst index 91e9ba078..aee4f93bc 100644 --- a/docs/plugins/writing.rst +++ b/docs/plugins/writing.rst @@ -56,7 +56,7 @@ Here's an example plugin that adds a simple command:: from beets.ui import Subcommand my_super_command = Subcommand('super', help='do something super') - def say_hi(lib, config, opts, args): + def say_hi(lib, opts, args): print "Hello everybody! I'm a plugin!" my_super_command.func = say_hi @@ -78,7 +78,6 @@ myfunction``. This function should take the following parameters: ``lib`` (a beets ``Library`` object) and ``opts`` and ``args`` (command-line options and arguments as returned by `OptionParser.parse_args`_). -.. _ConfigParser object: http://docs.python.org/library/configparser.html .. _OptionParser.parse_args: http://docs.python.org/library/optparse.html#parsing-arguments @@ -121,29 +120,29 @@ currently available are: * *album_imported*: called with an ``Album`` object every time the ``import`` command finishes adding an album to the library. Parameters: ``lib``, - ``album``, ``config`` + ``album`` * *item_imported*: called with an ``Item`` object every time the importer adds a singleton to the library (not called for full-album imports). Parameters: - ``lib``, ``item``, ``config`` + ``lib``, ``item`` * *write*: called with an ``Item`` object just before a file's metadata is written to disk (i.e., just before the file on disk is opened). * *import_task_start*: called when before an import task begins processing. - Parameters: ``task`` and ``config``. + Parameters: ``task`` (an `ImportTask`) and ``session`` (an `ImportSession`). * *import_task_apply*: called after metadata changes have been applied in an - import task. Parameters: ``task`` and ``config``. + import task. Parameters: ``task`` and ``session``. * *import_task_choice*: called after a decision has been made about an import task. This event can be used to initiate further interaction with the user. Use ``task.choice_flag`` to determine the action to be taken. Parameters: - ``task`` and ``config``. + ``task`` and ``session``. * *import_task_files*: called after an import task finishes manipulating the filesystem (copying and moving files, writing metadata tags). Parameters: - ``task`` and ``config``. + ``task`` and ``session``. * *library_opened*: called after beets starts up and initializes the main Library object. Parameter: ``lib``. @@ -151,7 +150,8 @@ currently available are: * *database_change*: a modification has been made to the library database. The change might not be committed yet. Parameter: ``lib``. -* *cli_exit*: called just before the ``beet`` command-line program exits. Parameter: ``lib``. +* *cli_exit*: called just before the ``beet`` command-line program exits. + Parameter: ``lib``. The included ``mpdupdate`` plugin provides an example use case for event listeners. From 7a0bfff00abc4bce51c4650558363b3f6d3602f3 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sat, 16 Feb 2013 16:34:13 -0800 Subject: [PATCH 3/9] summary paragraph for 1.1b2 --- docs/changelog.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 76bde7098..b1c5c2371 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,8 +1,13 @@ Changelog ========= -1.1b2 (in development) ----------------------- +1.1b2 (February 16, 2013) +------------------------- + +The second beta of beets 1.1 uses the fancy new configuration infrastructure to +add many, many new config options. The import process is more flexible; +filenames can be customized in more detail; and more. This release also +supports Windows Media (ASF) files and iTunes Sound Check volume normalization. This version introduces one **change to the default behavior** that you should be aware of. Previously, when importing new albums matched in MusicBrainz, the From fc109e3a3d37d265878fd2343579dfa3d3d05d0d Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sat, 16 Feb 2013 16:36:35 -0800 Subject: [PATCH 4/9] fix a couple of typos found by RIT students --- beets/autotag/match.py | 2 +- beets/autotag/mb.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/beets/autotag/match.py b/beets/autotag/match.py index de9d089a7..38b5bb51b 100644 --- a/beets/autotag/match.py +++ b/beets/autotag/match.py @@ -37,7 +37,7 @@ ALBUM_WEIGHT = 3.0 TRACK_WEIGHT = 1.0 # The weight of a missing track. MISSING_WEIGHT = 0.9 -# The weight of an extra (umatched) track. +# The weight of an extra (unmatched) track. UNMATCHED_WEIGHT = 0.6 # These distances are components of the track distance (that is, they # compete against each other but not ARTIST_WEIGHT and ALBUM_WEIGHT; diff --git a/beets/autotag/mb.py b/beets/autotag/mb.py index 896f0cbb5..071561a15 100644 --- a/beets/autotag/mb.py +++ b/beets/autotag/mb.py @@ -164,7 +164,7 @@ def album_info(release): int(medium['position']), int(track['position'])) if track.get('title'): - # Track title may be distinct from underling recording + # Track title may be distinct from underlying recording # title. ti.title = track['title'] ti.disctitle = disctitle From 0c487f479a5154d416117ada7939216ffd662d30 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sat, 16 Feb 2013 16:39:21 -0800 Subject: [PATCH 5/9] remove AutotagError dead code Another silly mistake identified by the RIT testing team. --- beets/autotag/__init__.py | 1 - beets/autotag/match.py | 5 ----- beets/importer.py | 8 +++----- beets/ui/commands.py | 17 ++++++----------- 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/beets/autotag/__init__.py b/beets/autotag/__init__.py index 3e2290104..6915a7783 100644 --- a/beets/autotag/__init__.py +++ b/beets/autotag/__init__.py @@ -23,7 +23,6 @@ from beets.util import sorted_walk, ancestry, displayable_path # Parts of external interface. from .hooks import AlbumInfo, TrackInfo, AlbumMatch, TrackMatch -from .match import AutotagError from .match import tag_item, tag_album from .match import recommendation diff --git a/beets/autotag/match.py b/beets/autotag/match.py index 38b5bb51b..85d64c319 100644 --- a/beets/autotag/match.py +++ b/beets/autotag/match.py @@ -81,10 +81,6 @@ recommendation = enum('none', 'low', 'medium', 'strong', name='recommendation') # differing artists. VA_ARTISTS = (u'', u'various artists', u'va', u'unknown') -# Autotagging exceptions. -class AutotagError(Exception): - pass - # Global logger. log = logging.getLogger('beets') @@ -418,7 +414,6 @@ def tag_album(items, search_artist=None, search_album=None, - A recommendation. If search_artist and search_album or search_id are provided, then they are used as search terms in place of the current metadata. - May raise an AutotagError if existing metadata is insufficient. """ # Get current metadata. cur_artist, cur_album, artist_consensus = current_metadata(items) diff --git a/beets/importer.py b/beets/importer.py index 2e1c3b94f..a6ff10fbc 100644 --- a/beets/importer.py +++ b/beets/importer.py @@ -633,11 +633,9 @@ def initial_lookup(session): plugins.send('import_task_start', session=session, task=task) log.debug('Looking up: %s' % displayable_path(task.paths)) - try: - task.set_candidates(*autotag.tag_album(task.items, - config['import']['timid'])) - except autotag.AutotagError: - task.set_null_candidates() + task.set_candidates( + *autotag.tag_album(task.items, config['import']['timid'].get(bool)) + ) def user_query(session): """A coroutine for interfacing with the user about the tagging diff --git a/beets/ui/commands.py b/beets/ui/commands.py index ccc43b519..b50341532 100644 --- a/beets/ui/commands.py +++ b/beets/ui/commands.py @@ -539,21 +539,16 @@ class TerminalImportSession(importer.ImportSession): elif choice is importer.action.MANUAL: # Try again with manual search terms. search_artist, search_album = manual_search(False) - try: - _, _, candidates, rec = \ - autotag.tag_album(task.items, search_artist, - search_album) - except autotag.AutotagError: - candidates, rec = None, None + _, _, candidates, rec = autotag.tag_album( + task.items, search_artist, search_album + ) elif choice is importer.action.MANUAL_ID: # Try a manually-entered ID. search_id = manual_id(False) if search_id: - try: - _, _, candidates, rec = \ - autotag.tag_album(task.items, search_id=search_id) - except autotag.AutotagError: - candidates, rec = None, None + _, _, candidates, rec = autotag.tag_album( + task.items, search_id=search_id + ) else: # We have a candidate! Finish tagging. Here, choice is an # AlbumMatch object. From 872c60141973bf04c2c0bec01179bd90f9d9afaa Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sat, 16 Feb 2013 16:40:42 -0800 Subject: [PATCH 6/9] Added tag v1.1.0-beta.2 for changeset f28ea9e2ef8d --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index 8eaa155f4..2cf45afe0 100644 --- a/.hgtags +++ b/.hgtags @@ -16,3 +16,4 @@ d3dbc6df2b96f8ba5704305a893e3e63b7f9cd77 1.0b14 c84744f4519be7416dc1653142f1763f406d6896 1.0rc1 f3cd4c138c6f40dc324a23bf01c4c7d97766477e 1.0rc2 6f29c0f4dc7025e8d8216ea960000c353886c4f4 v1.1.0-beta.1 +f28ea9e2ef8d39913d79dbba73db280ff0740c50 v1.1.0-beta.2 From 6f2ec68ca8c7e8bff73220d73e7008dbfdd3e45a Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sun, 17 Feb 2013 15:02:32 -0800 Subject: [PATCH 7/9] version bump: 1.1b3 --- beets/__init__.py | 2 +- docs/changelog.rst | 3 +++ docs/conf.py | 2 +- setup.py | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/beets/__init__.py b/beets/__init__.py index e5a8d478b..dcd1a8f34 100644 --- a/beets/__init__.py +++ b/beets/__init__.py @@ -12,7 +12,7 @@ # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. -__version__ = '1.1.0-beta.2' +__version__ = '1.1.0-beta.3' __author__ = 'Adrian Sampson ' import beets.library diff --git a/docs/changelog.rst b/docs/changelog.rst index b1c5c2371..e4d9a4759 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,6 +1,9 @@ Changelog ========= +1.1b3 (in development) +---------------------- + 1.1b2 (February 16, 2013) ------------------------- diff --git a/docs/conf.py b/docs/conf.py index 9149a72d1..ccd96e730 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,7 +13,7 @@ project = u'beets' copyright = u'2012, Adrian Sampson' version = '1.1' -release = '1.1b2' +release = '1.1b3' pygments_style = 'sphinx' diff --git a/setup.py b/setup.py index cc7eb97d4..22019ad0d 100755 --- a/setup.py +++ b/setup.py @@ -42,7 +42,7 @@ if 'sdist' in sys.argv: shutil.copytree(os.path.join(docdir, '_build', 'man'), mandir) setup(name='beets', - version='1.1.0-beta.2', + version='1.1.0-beta.3', description='music tagger and library organizer', author='Adrian Sampson', author_email='adrian@radbox.org', From bbeb04c34f5d4de1169f3fbf0604e97b254decf2 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sun, 17 Feb 2013 15:04:19 -0800 Subject: [PATCH 8/9] mention GStreamer plugins in BPD docs --- docs/plugins/bpd.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/plugins/bpd.rst b/docs/plugins/bpd.rst index 4f67dd6f6..aca52020f 100644 --- a/docs/plugins/bpd.rst +++ b/docs/plugins/bpd.rst @@ -27,6 +27,10 @@ with its Python bindings) on your system. * On Windows, you may want to try `GStreamer WinBuilds`_ (cavet emptor: I haven't tried this). +You will also need the various GStreamer plugin packages to make everything +work. See the :doc:`/plugins/chroma` documentation for more information on +installing GStreamer plugins. + .. _MacPorts: http://www.macports.org/ .. _GStreamer WinBuilds: http://www.gstreamer-winbuild.ylatuya.es/ .. _Homebrew: http://mxcl.github.com/homebrew/ From eb32fa4c0ee752a9d3cd24b5a315ac3489fc5405 Mon Sep 17 00:00:00 2001 From: Adrian Sampson Date: Sun, 17 Feb 2013 15:08:53 -0800 Subject: [PATCH 9/9] docs: may need to create directories --- docs/guides/main.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guides/main.rst b/docs/guides/main.rst index f900bbaad..68e6be797 100644 --- a/docs/guides/main.rst +++ b/docs/guides/main.rst @@ -99,8 +99,8 @@ You'll want to set a few basic options before you start using beets. The configuration is stored in a text file: on Unix-like OSes, the config file is at ``~/.config/beets/config.yaml``; on Windows, it's at ``%APPDATA%\beets\config.yaml``. Create and edit the appropriate file with your -favorite text editor. This file will start out empty, but here's good place to -start:: +favorite text editor. (You may need to create the enclosing directories also.) +The file will start out empty, but here's good place to start:: directory: ~/music library: ~/data/musiclibrary.blb