Commit graph

690 commits

Author SHA1 Message Date
Johannes Baiter
2d4ea4e49b Fix bug in discogs.album_for_id for ID-Strings that end in a bracket 2013-05-29 10:59:04 +02:00
Johannes Baiter
40a6e03ba6 Improve regular expression for Discogs IDs 2013-05-29 10:54:15 +02:00
Adrian Sampson
3b438b7778 inline: rename "pathfields" to "item_fields" 2013-05-28 23:20:19 -07:00
Adrian Sampson
0176e10ccf inline: allow album field definitions
Under the album_field heading.
2013-05-28 23:10:47 -07:00
Adrian Sampson
a0cb31956d distinguish Album and Item template fields
An earlier change (due to @pedros) added the ability for plugins to define
template fields that work with Albums as well as Items. This enables some
cool new use cases but required that every template field definition check the
type of its arguments. Instead, this iteration on the idea distinguishes
between fields meant for Items and those meant for Albums.

In addition to simplifying the implementation of these functions, this also
enables the creation of album fields with identical names to item fields.
(For example, a user contacted me recently about adding a $bitrate field for
albums, which would be the average bitrate of the items. They can do this now
using a plugin.)

I also changed the docs to stop using the decorator approach to registering
template fields. We're moving toward removing those.
2013-05-28 22:30:23 -07:00
Adrian Sampson
9f927438ca fix some dumb mistakes from most recent flurry 2013-05-28 22:04:20 -07:00
Adrian Sampson
72449caccf discogs: move config default into constructor
Such is the new convention for plugin configuratino defaults.
2013-05-28 21:45:31 -07:00
Adrian Sampson
480fa80e47 discogs: penalty only for matches from discogs
Otherwise, this was penalizing all album matches.

This also applies the same treatment as the previous commit: only load the
config at run time (at the expense of code clutter).
2013-05-28 21:25:28 -07:00
Johannes Baiter
f17e8550ca Determine IDs from MusicBrainz and Discogs URLs 2013-05-28 13:49:34 +02:00
Johannes Baiter
e3418be75d Add support for manually entered release ID in Discogs 2013-05-28 12:58:05 +02:00
Tai Lee
35e926a51b Add Discogs and general source weight penalty (configurable, undocumented).
Discogs (and other individual plugins) should return a penalty between
0.0 and 0.1, which will be multiplied by the general source weight. This
allows individual plugins to be weighted against relative to each other,
and amplified together against other penalty categories (track, title,
etc.)
2013-05-27 01:28:40 +10:00
Tai Lee
a6b1bb1bbc Move articles to the front of Discogs artist names. 2013-05-25 14:05:03 +10:00
Tai Lee
e3fa403ad2 Only execute pathfields expressions and functions if they are called with an Item argument. Otherwise, return an empty string. 2013-05-25 12:28:52 +10:00
Tai Lee
3f4e194c41 We only need to strip the disambiguation from artist names, not the join strings. 2013-05-25 12:19:48 +10:00
Adrian Sampson
72f0505744 discogs: extra space in ambiguous artists (#289) 2013-05-24 12:31:18 -07:00
Adrian Sampson
d877f5e3e8 Merge pull request #289 from Smyds/master
Remove discogs artist disambiguation number
2013-05-24 12:28:50 -07:00
César Prouté
726c84674b remove discogs artist disambiguation number 2013-05-24 20:15:24 +01:00
Tai Lee
835a3c2a73 Improved parsing of Discogs' position field.
Some albums have a single disc with positions like I, II, III, IV, etc.
Previously beets thought each track on these albums was a new medium.

Now we assume that if there is no explicit medium index and the ordinal
of an alpha medium does not appear to be sequential (e.g. A, B, C) that
the medium is actually the medium index.
2013-05-25 01:36:12 +10:00
Tai Lee
4c06c96630 Extract disc titles from Discogs' "index tracks". 2013-05-25 01:32:06 +10:00
Tai Lee
7f068a8c03 Add AlbumInfo.data_url property, populate it for Discogs matches and display it when it is non-empty.
Makes it easier for people to find the best Discogs (or other) match
and import it to Music Brainz using a grease monkey or similar script.
2013-05-24 22:50:14 +10:00
Adrian Sampson
26682f9168 docs/changelog for convert paths config (#285) 2013-05-22 15:00:53 -07:00
Lucas Duailibe
1e0290354c fix some debug code 2013-05-22 14:11:55 -03:00
Lucas Duailibe
76e310d811 different paths for convert
the paths configuration for converted files can be different from the importer
closes #232
2013-05-22 11:03:00 -03:00
Tai Lee
dde4bfab8c Update signature for item_candidates() in chroma plugin. 2013-05-22 08:10:20 +10:00
Tai Lee
75a4171d20 Merge branch 'master' of github.com:sampsyo/beets into imenem-discogs-search
Conflicts:
	docs/changelog.rst
	docs/plugins/index.rst
2013-05-21 23:27:53 +10:00
Tai Lee
3eb6f8e5eb Add discogs plugin, which extends the autotagger to include results from the discogs database.
This is a refactor of the plugin developed by `imenem`.

- Pass `artist`, `album` and `va_likely` to `candidates()` so that
  plugins don't have to work this out from `items` all over again.
- Pass `artist` and `title` to `item_candidates()`.
- Silence spurious `urllib3` info log lines.
- Use a proper "beets" user agent with `discogs_client`.
- Remove `abstract_search` plugin. It seems unnecessary. How many
  music databases are there? How many will beets support? How much
  common code might there be between them? We can add some abstraction
  if or when more databases are supported.
- Derive more AlbumInfo and TrackInfo properties from discogs Release
  objects, especially album ID so that beets doesn't just use the first
  release and think all subsequent releases are duplicates.
- Add basic documentation, doc strings and code comments.
- Sanitise search query. Remove non-word characters and medium info that
  might filter out good search results.
- Use artist `join` strings from discogs Release object when an album
  or track has multiple artists.
- Don't rely on discogs track position, which is unreliable. But tracks
  are in order, so we can recalculate medium and medium_index as long as
  we can extract a consistent medium across tracks from the position.
- Add "various" as a known signal to indicate various artists.
- Prevent `chroma` plugin from returning a a huge track distance for any
  track that is missing an ID (e.g. all discog tracks).
- `TrackInfo.index` should be the release index (calculated by beets),
  not the medium index (derived from discogs track position).
- Add `AlbumInfo.data_source`. It's "Unknown" by default which is shown
  in red when displaying a suggested or selected match. The built in
  auto tagger sets it to "MusicBrainz" which is shown in green. Anything
  else (e.g. "Discogs") is shown in yellow.
- Remove double spaces from album titles (bad data from Discogs).
2013-05-21 21:16:52 +10:00
Adrian Sampson
6f2c1d81bd random -e (#263): fix some short responses
This slight modification to the selection algorithm avoids the situation in
which too many objects are chosen for a given artist and fewer than N objects
are eventually returned. We do this by implementing "selection without
replacement" literally: we choose objects one at a time and pop them from the
population when they are selected.
2013-05-19 11:00:52 -07:00
Adrian Sampson
748d8caa64 Merge pull request #263 from madjar/master
Added a -e option to random that makes the distribution even among artists
2013-05-19 10:41:39 -07:00
Georges Dubus
5dbff4a8eb Fixed the randomness of the equal change to have more than one song by artist 2013-05-19 17:22:19 +02:00
Adrian Sampson
cee3b20630 duplicates: refactoring and empty-ID fix (#278)
The main change here, aside from documentation/naming updates, is that we skip
"duplicates" that arise from albums/tracks that are missing their MBIDs.
2013-05-17 12:35:35 -07:00
Adrian Sampson
cef245eb05 merge 2013-05-17 12:15:36 -07:00
Adrian Sampson
2f442b5677 Merge pull request #278 from pedros/duplicates
Duplicates plugin
2013-05-17 12:15:06 -07:00
Adrian Sampson
1898a79d4f fix inline for album plugin fields (#274) 2013-05-17 12:13:01 -07:00
Adrian Sampson
1ffc56b85a doc correction and refactoring for #275
Plugin-provided template fields are not available for queries. (Perhaps they
should be, though!)
2013-05-17 12:07:53 -07:00
Pedro Silva
7031c15418 Initial import of 'duplicates' plugin 2013-05-17 12:47:34 +01:00
Pedro Silva
a48fde9f2c Use newly defined '$missing' template field instead of hardcoded format (-c) 2013-05-15 15:09:00 +01:00
Adrian Sampson
a0ef886801 lyrics: substitute more punctuation (fixes #270) 2013-05-12 12:45:49 -07:00
Adrian Sampson
a5cb34360d lyrics: fix encoding for Lyrics.com 2013-05-12 12:38:48 -07:00
Adrian Sampson
f086fb6fd7 changelog, little style tweak for #272
Changed single-triple quotes to double-triple quotes, just for consistency
with the rest of the codebase.
2013-05-10 22:23:24 -07:00
Adrian Sampson
e1f7027abc Merge branch 'missing' of https://github.com/pedros/beets
Conflicts:
	docs/plugins/index.rst
2013-05-10 22:08:15 -07:00
Pedro Silva
b2d8f04f05 Modify "not part of beets" to "part of beets" 2013-05-10 16:50:34 +01:00
Pedro Silva
763cfa06b4 Don't check for item.paths == None as that can't happen 2013-05-10 16:43:17 +01:00
Pedro Silva
d32a3ef9b5 Implement logic for displaying missing track counts 2013-05-10 16:42:45 +01:00
Pedro Silva
69877f2013 Add 'count' and 'total' parameters
- count: count missing tracks per album
- total: count total missing tracks
2013-05-10 16:42:10 +01:00
Pedro Silva
bed7c5ae88 Add _missing_count function 2013-05-10 16:41:04 +01:00
Pedro Silva
abe12be4b2 Remove unneeded Library argument from _missing 2013-05-10 16:06:30 +01:00
Pedro Silva
18e2704ffb Remove unnecessary _format function 2013-05-10 14:23:32 +01:00
Pedro Silva
6ae73bc921 Initial import of missing tracks plugin
This plugin adds a new command, ``missing`` or ``miss``, which finds
and lists, for every album in your collection, which tracks are
missing.
2013-05-10 14:13:53 +01:00
Georges Dubus
bcae495c50 Added a -e option to random that makes the distribution even among artists 2013-05-03 18:19:44 +02:00
Adrian Sampson
dd8d4c16cc spell check 2013-04-29 10:23:21 -07:00
Adrian Sampson
374e043c3c API/test enhancements for #257
Also, `cautious` defaults to False for backwards-compatibility.
2013-04-27 16:47:42 -07:00
Fabrice Laporte
2dc15a0e2b Use re.search instead of re.match with simplified regex.
Add additional cover_names parameter to art_in_path, and makes 'cover_names' a  plugin config option.
2013-04-27 12:21:57 +02:00
Fabrice Laporte
d9e213867c fetchart (issue 459): use regex to detect valid image names + 'cautious' option for finer control of filename matching 2013-04-22 23:44:35 +02:00
Adrian Sampson
bf904187e2 smartplaylist: split query w/ shlex (fixes #256) 2013-04-21 20:55:07 -07:00
Adrian Sampson
aaafba4d28 changelog for #254 2013-04-21 20:41:01 -07:00
Fabrice Laporte
0fb877a059 lastgenre: invert 'force' option default value. 2013-04-21 23:34:20 +02:00
Fabrice Laporte
6fdfabe4b7 Revert "lastgenre: force real lookup during import only if no custom whitelist set."
This reverts commit 4be30fca2e.
2013-04-21 10:35:08 +02:00
Fabrice Laporte
4be30fca2e lastgenre: force real lookup during import only if no custom whitelist set. 2013-04-20 14:29:14 +02:00
Adrian Sampson
2a9afd3908 misc. style cleanup for #243 2013-04-15 10:52:17 -07:00
Adrian Sampson
1622dcefb7 Merge pull request #243 from KraYmer/master
Add a lyrics backend that scrapes results from google custom search api
2013-04-15 10:19:31 -07:00
Adrian Sampson
16e0648c81 lastgenre: fix crash with canonicalization 2013-04-10 10:34:06 -07:00
Adrian Sampson
8ae202cf24 changelog for #246 2013-04-10 10:18:58 -07:00
Uwe L. Korn
3b33705e3b Compute Content-Length to make tracks seekable in most players via the web plugin 2013-04-10 14:21:47 +02:00
Fabrice Laporte
479b25bac3 Code style + fix doc typo 2013-04-08 18:35:02 +02:00
Fabrice Laporte
7b13edee40 lyrics: restore tags write and fix extract_text() 2013-04-06 18:24:30 +02:00
Fabrice Laporte
cfb6735e43 Add a lyrics backend that scraps results from google custom search api.
Add a 'fallback' option to facilitate working around the 100 queries/day google
limit by marking files as 'visited' so they are not considered for lyrics search
on the next beet run.
I've put my own google_engine_ID as default value in the code but could be
reconsidered, this engine contains databases known to be scrappable by the
plugin algorithm though.
2013-04-06 15:22:04 +02:00
Adrian Sampson
70b528ed81 use standard query API for album-by-artist (#240) 2013-04-02 20:31:28 -07:00
Uwe L. Korn
dcc1e1aa71 Add functions needed for ScriptCollection Support in Tomahawk 2013-04-01 17:50:51 +02:00
Fabrice Laporte
6405962beb Merge branch 'master' of https://github.com/sampsyo/beets 2013-03-25 22:29:02 +01:00
Lucas Duailibe
51ed0939d6 fixing things 2013-03-25 15:20:38 -03:00
Lucas Duailibe
c682ac84b0 one more error message (#125) 2013-03-25 11:45:11 -03:00
Lucas Duailibe
56c53acbab human-friendly error messages (#125) 2013-03-25 11:24:42 -03:00
Adrian Sampson
f8d6e84581 invert new embedart switch (#182)
The default behavior now does what most people probably expect, which is to
run like the on-import handler for the embedart plugin.
2013-03-17 22:50:28 -07:00
Lucas Duailibe
0c53c0bc3f option to embed current album arts (closes #182) 2013-03-17 22:52:51 -03:00
Lucas Duailibe
7b2ff4ae9b fix mbsync bug
This fixes a bug that only applied changes to the first item of an album
2013-03-17 02:50:32 -03:00
Fabrice Laporte
9c0fa57f34 Merge branch 'master' of https://github.com/sampsyo/beets 2013-03-16 09:16:21 +01:00
Adrian Sampson
3e1a181d3a fix extra super call in fuzzy
This was dumb of me.
2013-03-14 18:43:44 -07:00
Adrian Sampson
f474f3aed2 split FieldQuery into base and registered versions 2013-03-14 10:00:30 -07:00
Adrian Sampson
f005ec2de0 refactor: everything is like a plugin query (#214)
The initial idea for this refactor was motivated by the need to make
PluginQuery.match() have the same method signature as the match() methods on
other queries. That is, it needed to take an *item*, not the pattern and
value. (The pattern is supplied when the query is constructed.) So it made
sense to move the value-to-pattern code to a class method.

But then I realized that all the other FieldQuery subclasses needed to do
essentially the same thing. So I eliminated PluginQuery altogether and
refactored FieldQuery to subsume its functionality. I then changed all the
other FieldQuery subclasses to conform to the same pattern.

This has the side effect of allowing different kinds of queries (even
non-field queries) down the road.
2013-03-13 22:57:20 -07:00
Adrian Sampson
40b49ac786 some low-level tweaks to extensible queries (#214) 2013-03-13 21:59:03 -07:00
Philippe Mongeau
292092bef7 Merge #214 extend query syntax from plugins
Conflicts:
	docs/changelog.rst
2013-03-13 18:32:27 -04:00
Adrian Sampson
54d8adf6a6 changelog for #180 2013-03-12 22:00:11 -07:00
Lucas Duailibe
b9844ccf3a importfeeds: absolute path option (#180) 2013-03-13 01:50:09 -03:00
Adrian Sampson
ae40b97528 chroma: catch acoustid exceptions during submit 2013-03-12 20:30:57 -07:00
Adrian Sampson
7b7a4257ac mbcollection: use library functions
Since we now require python-musicbrainz-ngs 0.3 or later, we no longer have to
hand-craft the API requests.
2013-03-11 19:43:57 -07:00
Adrian Sampson
aff3fb106d chroma: fingerprint command's write from config
This turns on metadata-writing based on the import.write config option, so
those with this option turned off will be spared any surprises. (Affects #217
and #143.)
2013-03-11 19:19:48 -07:00
Lucas Duailibe
704259b459 fix typo 2013-03-11 19:26:33 -03:00
Lucas Duailibe
a6ae5c4a4f cleaning up 2013-03-11 19:22:03 -03:00
Lucas Duailibe
3390fd339a store fingerprints with the "fingerprint" command 2013-03-11 18:31:53 -03:00
Lucas Duailibe
8a64686ff3 store fingerprints 2013-03-11 17:56:13 -03:00
Philippe Mongeau
8b1511a8af fix fuzzy config 2013-03-10 20:39:02 -04:00
Philippe Mongeau
ca8af62e9c change queries() function to returns a dict
of {prefix: PluginQuery}

use the class __name__ as sqlite function name

make RegexpQuery use the AnyPluginQuery
2013-03-10 20:11:42 -04:00
Philippe Mongeau
2a42c75cba fuzzy: use smartcase for the pattern
ignore case unless the pattern contains a capital letter
2013-03-10 19:07:29 -04:00
Philippe Mongeau
7d879289c1 fuzzy: add prefix config 2013-03-10 18:00:28 -04:00
Philippe Mongeau
09156b03f0 fuzzy: use threshold value from config 2013-03-10 17:37:03 -04:00
Philippe Mongeau
7314bc0524 make fuzzy use PluginQuery instead of a subcommand 2013-03-10 16:50:54 -04:00
Adrian Sampson
01a449ffa6 convert: auto (#212) now transcodes to /tmp
This avoids naming conflicts in the source directory. In particular, when
encoding MP3 -> MP3, the previous scheme would overwrite the original file
(and hang ffmpeg waiting for input). This should also work in
situations where the source directory is read-only.
2013-03-10 13:22:05 -07:00
Adrian Sampson
8736a0bb4c convert auto: changelog and de-cloning (#212) 2013-03-10 13:12:56 -07:00
Adrian Sampson
47a549a31c Merge pull request #212 from duailibe/auto_convert
Transcode files during import
2013-03-10 12:57:36 -07:00
Lucas Duailibe
c2c96d522f config name and docs update 2013-03-09 23:33:45 -03:00
Lucas Duailibe
a3d8105a5a small fix 2013-03-09 20:04:26 -03:00
Lucas Duailibe
27b1d6d7cc clean up old files and remove pdb 2013-03-09 19:36:34 -03:00
Lucas Duailibe
e49ca34f3c partial commit 2013-03-09 19:09:43 -03:00
Adrian Sampson
7d9fd0a2cf convert: fix unicode error in path construction
I introduced a regression a few commits ago when I started using
lib.destination with the basedir keyword argument as opposed to doing
os.path.join manually.
2013-03-09 11:37:10 -08:00
Adrian Sampson
218f10a62d echonest_tempo: catch socket.error 2013-03-09 11:33:55 -08:00
imenem
12476ca22e Added Discogs search plugin. 2013-03-07 17:59:52 +02:00
Adrian Sampson
69f2659410 convert: read new audio metadata (#208) 2013-03-06 23:11:08 -08:00
Adrian Sampson
87d71abc28 changelog/cleanup/fixes for #209
The major functional change here is how files move around when in keep_new
mode. Now, files are first moved to the destination directory and then
copied/transcoded back into the library.

This avoids problems where naming conflicts could occur when transcoding from
MP3 to MP3 (and thus not changing the filename).
2013-03-06 18:21:42 -08:00
Lucas Duailibe
a338b95bb7 Changing behavior in "keep new files" 2013-03-06 22:04:05 -03:00
Lucas Duailibe
28522376be Adding "keep new files" option to convert plugin 2013-03-06 21:41:40 -03:00
Fabrice Laporte
72a06e96d0 Merge branch 'master' of https://github.com/sampsyo/beets 2013-03-04 08:38:09 +01:00
Adrian Sampson
1a7ec6dc79 mbsync: fix redundant album art movement
Since we explicitly move album art later in the process, implicitly moving it
with items can cause a double-move (and thus a "file not found" error).
2013-03-03 17:46:16 -08:00
Adrian Sampson
18688008a4 mbsync: avoid spurious stores/moves
As _print_and_apply_changes itself does for items, we now shortcut
modifications (metadata and filesystem) for albums when no changes are
required for a given album. This avoids effectively doing a "beet move" on an
album even when nothing has changed.
2013-03-03 17:19:05 -08:00
Adrian Sampson
5f68d03793 mbsync: don't write tags if import.write is off
This will avoid surprising users with import.write turned off.
2013-03-03 17:13:54 -08:00
Adrian Sampson
72263a1cf7 mbsync: use ID lookups instead of full match logic
This change uses _album_for_id and _track_for_id instead of the full
autotag.match.* functions. This should be faster (requiring fewer calls to the
MusicBrainz API) while also being more predictable. It also won't, for
example, use acoustic fingerprinting even if the chroma plugin is installed.

Finally, this change catches the error case in which MBIDs are erroneous. This
can happen, for example, if the user has some track MBIDs left over from
before the NGS transition.
2013-03-03 17:08:07 -08:00
Adrian Sampson
a8d999a101 mbsync: split album/item functions; shorter txns
The main change here is to use shorter transactions -- one per matching entity
-- rather than one large one. This avoids very long transactions when the
network happens to move slowly.
2013-03-03 16:52:14 -08:00
Adrian Sampson
54e070d06b mbsync: use SingletonQuery for item updates 2013-03-03 16:29:31 -08:00
Jakob Schnitzer
d647ea0f0d mbsync: a little refactoring 2013-03-03 23:39:14 +01:00
Jakob Schnitzer
3a9c9d53da mbsync: add support for singletons
I can't really guarantee this works right now since I have no singletons
in my collection to test it
2013-03-03 23:39:13 +01:00
Jakob Schnitzer
cd7305d487 mbsync: write metadata to files... 2013-03-03 23:39:13 +01:00
Jakob Schnitzer
2fd3ad5362 initial version of the mbsync plugin
this plugin provides a faster way to query new metadata from
musicbrainz. (instead of having to 're-import' the files)
Currently it lacks all forms of documentation and will only work for
album queries. not really tested so far so be careful
2013-03-03 23:39:13 +01:00
Jakob Schnitzer
ef22ea5183 convert: add missing util.displayable_path 2013-03-01 16:16:28 +01:00
Fabrice Laporte
91255c5ae1 Merge branch 'master' of https://github.com/sampsyo/beets 2013-03-01 08:25:39 +01:00
Adrian Sampson
1fbbe61546 mbcollection: human-readable MB exceptions
Fixes #107 by wrapping the API invocation function with exception handlers.
2013-02-28 10:43:02 -08:00
Adrian Sampson
c31eabe95c convert: add missing syspath call (closes #106) 2013-02-27 10:30:24 -08:00
Adrian Sampson
a1e89b879d echonest_tempo: warn on API error 2013-02-18 18:40:59 -08:00
Adrian Sampson
63564d84e7 echonest_tempo: sanitize newlines from input
The Echo Nest API confusingly says that the input is missing if it contains a
newline.
2013-02-18 18:34:31 -08:00
Dang Mai
3be24110d7 Sanitize template evaluation for smartplaylist 2013-02-11 21:37:14 -05:00
Adrian Sampson
d1e50da71f fetchart: remote_priority config option 2013-02-10 21:40:55 -08:00
Fabrice Laporte
6b2e409007 Merge branch 'master' of https://github.com/sampsyo/beets 2013-02-09 17:46:06 +01:00
Adrian Sampson
f7f2454134 docs & style for #92
We already have a nice plurality() function in beets.util to calculate the most
popular value of something, so I reused that.
2013-02-06 10:55:48 -08:00
Peter Schnebel
7193f4e863 Do not write track-level genres if source is not 'track'. 2013-02-06 08:41:20 +01:00
Peter Schnebel
9f1e9031b6 Try to guess 'Various Artists' genre based on track genres if source is 'track'. 2013-02-06 08:15:29 +01:00
Peter Schnebel
d667fca02e Do not write track-level genres if source is not 'track'.
For 'Various Artist' compilations without a usefull 'album' genre, pick the most used track / track-artist genre.
2013-02-06 08:04:58 +01:00
Adrian Sampson
976bc20900 collapse separate album and item paths (#92)
Should reduce copypasta overhead significantly.
2013-02-05 12:16:53 -08:00
Adrian Sampson
3860a5ac27 lastgenre: "auto" config option 2013-02-05 12:02:51 -08:00
Adrian Sampson
e50e28dc38 canonicalize original genre (#92) 2013-02-05 11:58:24 -08:00
Adrian Sampson
d1e752fdeb simplify configuration handling (#92) 2013-02-05 11:51:32 -08:00
Adrian Sampson
f38bed787e remove verbose option (#92)
The lastgenre command should always log what it's doing so the user can see
the progress being made. If you really don't want any output, just pipe to
/dev/null.
2013-02-05 11:40:04 -08:00
Adrian Sampson
1fe36057b0 Python style and legibility cleanup for #92 2013-02-05 11:34:17 -08:00
Adrian Sampson
cd2d4c9b8a Merge pull request #92 from pscn/master
lastgenre improvements
2013-02-05 10:31:46 -08:00
Adrian Sampson
5be50fbb38 echonest_tempo: skip when missing artist or title 2013-02-05 10:28:24 -08:00
root
f83e9fb8bb qbugfix 2013-02-05 08:13:36 +01:00
Peter Schnebel
30dff5afff cleaned up, removed debug 2013-02-04 21:47:35 +01:00
Peter Schnebel
4df9521007 experimental track / album / artist based genre stuff per item 2013-02-04 20:24:22 +01:00
Adrian Sampson
99ed9e03de rename ImportTask.path to paths (#89) 2013-02-03 11:22:27 -08:00
Tai Lee
23cd5453d9 Improved multi-disc album detection.
- Remove "part", "volume", "vol." multi-disc markers. These are often
  part of album titles, and not necessarily indicative of a multi-disc
  album. Only look for "CD X" and "disc X" (case insensitive), ignoring
  white space and other non-word characters.

- Don't only expect each disc to be in a subdirectory of a common parent
  directory, with all siblings belonging to the same release. Also match
  any consecutive siblings (even when the parent contains other albums)
  that are named with the same prefix and multi-disc marker.

- The `albums_in_dir(path)` function now always yields a list of paths
  along with each list of items. `ItemTask.path` is now always a list of
  paths.

- The `displayable_path(path)` function now accepts a list of paths, and
  will join them with "; " by default. This can be changed with the
  `separator` argument.

- The `sorted_walk()` function now does a case insensitive sort on
  directories, but still returns case sensitive results. This allows
  better multi-disc album detection.

- The `art_for_album()` function now takes a list of paths as its second
  argument, instead of a single path.
2013-02-03 23:51:31 +11:00
Adrian Sampson
0be319767f fixes and refactoring for lastgenre.source (#88)
This provides a default for source, preventing a crash when not present in the
user's config.

It also refactors the source decision to a helper function, _lastfm_obj, to
avoid copypasta.
2013-02-02 12:52:43 -08:00
Adrian Sampson
a21e3ca344 Merge pull request #88 from pdf/lastgenre_source_selection
Allow selection of source for genre information (ie - artist vs album)
2013-02-02 12:44:02 -08:00
Adrian Sampson
89689899c9 changelog note and indentation fix for #86 2013-02-02 12:27:42 -08:00
Adrian Sampson
52dc2f6b0b Merge pull request #86 from steinitzu/master
AlbumArtist tag browsing in bpd
2013-02-02 12:25:01 -08:00
Adrian Sampson
887d1c1287 fix inline and rewrite for instance fields
I'm transitioning to using exclusively instance-level fields instead of
class-level fields in plugin objects, but I neglected to bring inline and
rewrite into the future. This manifested as silent inaction on the part of
these plugins.

This change restores the old behavior (for compatibility) but also updates the
plugins to use the new behavior.
2013-02-02 08:35:54 -08:00
Adrian Sampson
f59ff7e89e importfeeds: use bytestring paths 2013-02-02 08:22:51 -08:00
Fabrice Laporte
8eabbf64cc Merge branch 'lyrics' 2013-02-02 10:48:58 +01:00
Fabrice Laporte
bc82e04077 importfeeds: fix UnicodeDecodeError when creating symlinks 2013-02-02 10:31:36 +01:00
Fabrice Laporte
cf73d7cb08 replace \r by \n 2013-02-02 09:38:49 +01:00
Peter Fern
ef5dfa3fcf Allow selection of source for genre information (ie - artist vs album)
If config is set to:

   lastgenre:
     source: artist

The genre will be fetched for the artist, rather than the album.  This
allows for filesystem org like:

   genre/artist/album

Currently defaults to previous behaviour for anything other than
`artist`
2013-02-02 14:31:45 +11:00
steini
476adf40af Support for AlbumArtist and AlbumArtistSort tag listings. 2013-02-01 02:35:19 +00:00
Dang Mai
d4004f10fa Update comments to reflect config migration 2013-01-31 18:17:00 -05:00
Dang Mai
ef8ef4c747 Update MPD whenever database changes 2013-01-31 18:16:21 -05:00
Dang Mai
7de2727572 Fix smartplaylist to use lib param from cli_exit 2013-01-31 18:09:17 -05:00
Adrian Sampson
e6ea6dc875 zero: remove redundant list of dict's keys 2013-01-31 12:15:18 -08:00
Adrian Sampson
58d9a775cc remove singleton enforcement from plugins
The plugin system itself now enforces single instances.
2013-01-31 12:13:19 -08:00
Adrian Sampson
bba0051ee7 changelog & doc tweaks for smartplaylist (#80) 2013-01-31 10:07:18 -08:00
Dang Mai
397ad441a8 Remove debugging statement
Silly me for forgetting to check the pdb statement I just put in ...
2013-01-30 21:28:54 -05:00
Dang Mai
f5838692d7 Add default for playlist_dir 2013-01-30 21:27:00 -05:00
Dang Mai
6bc0202354 Add ability to use tag in m3u names 2013-01-30 12:45:56 -05:00
Dang Mai
895ee7de3f Fix playlist_dir not resolving relative path 2013-01-30 09:50:27 -05:00
Dang Mai
5a7d7e1bb5 Change command to splupdate 2013-01-30 09:28:50 -05:00
Dang Mai
d134e9c461 Add comments 2013-01-30 08:42:29 -05:00
Dang Mai
480d51443c Add print statements 2013-01-30 08:31:39 -05:00
Dang Mai
70240bf4b1 Fix optional relative_to 2013-01-30 08:25:18 -05:00
Dang Mai
4312fd3914 Working smart playlist plugin 2013-01-30 08:12:22 -05:00
Adrian Sampson
d0aaa511a3 minor style cleanup for #75 2013-01-29 21:30:57 -08:00
Dave Hayes
2f06a508bd Implements support for WMA/ASF
* Adds support for importing/managing .wma and .asf files
 * Adds support for all available ASF tag equivalents
 * Adds two utility methods for (un)packing embedded ASF pictures
 * Modifies scrub plugin to work around the lack of a delete method on
   ASFTags object.
2013-01-28 14:05:34 -06:00
Adrian Sampson
6898d95b9e allow convert to be used without embedart enabled 2013-01-23 15:56:49 -08:00
Adrian Sampson
0969749e5b cleanup, docs, and changelog for relative_to (#74) 2013-01-22 21:02:41 -08:00
Adrian Sampson
b4da79b2e9 Merge pull request #74 from phmongeau/relative_feeds
relative importfeeds m3u path
2013-01-22 20:46:42 -08:00
Philippe Mongeau
ddbae951c0 importfeeds: add relative_to config 2013-01-22 22:54:13 -05:00
Philippe Mongeau
053e146b0c fix the expanduser of the importfeeds dir configuration 2013-01-22 22:45:07 -05:00
John Hawthorn
f2b74d2019 fix RewritePlugin initialization
Error was introduced in 6d68a48
2013-01-21 12:42:55 -08:00
Adrian Sampson
7779a5c6f5 replaygain: catch Unicode exc on Windows (GC-499)
(grafted from 89cee0e842b4e553790b0db7daaf2fd31d217e15)

--HG--
extra : source : 89cee0e842b4e553790b0db7daaf2fd31d217e15
2013-01-12 14:38:19 -08:00
Adrian Sampson
d6c7cfa4e3 lyrics: replace apostrophes with ' (GC-498) 2013-01-11 10:51:22 -08:00
Adrian Sampson
7a410f636b happy new year
For future reference, this command did the trick:
ack -l 'Copyright 201' | xargs perl -pi -E 's/Copyright 201./Copyright 2013/'
2013-01-11 10:43:41 -08:00
Adrian Sampson
f7bef39769 GH-72: use function bodies instead of special var 2013-01-05 17:48:00 -08:00
Adrian Sampson
14b5170aec GH-72: some cleanup and changelog note 2013-01-05 17:20:39 -08:00
Florent Thoumie
da0642a026 inline: Add support for code blocks.
This should be backwards compatible. In case the the path field
isn't a statement, beets will assume it's a block of code that
stores the value in a special '_' variable.
2013-01-05 23:00:10 +00:00
Adrian Sampson
f127d8e18a merge scrub fix from master 2012-12-31 18:25:51 -08:00
Adrian Sampson
287d00179a scrub: fix Py27-style format string (GC-484) 2012-12-31 18:11:31 -08:00
Adrian Sampson
cf3860257f inline: fix defaults (dict, not list) 2012-12-31 15:54:26 -08:00
Adrian Sampson
5d210f755c merge fix from master 2012-12-29 13:07:09 -08:00
Adrian Sampson
082932069f echonest_tempo: catch IO errors (GC-482) 2012-12-26 17:16:59 -08:00
Adrian Sampson
51e9c519d4 plugin renames: fuzzy and random
Renamed fuzzy_search to fuzzy and rdm to random. These names should be easier
to remember since they are the same as the commands they provide.

--HG--
rename : beetsplug/fuzzy_search.py => beetsplug/fuzzy.py
rename : beetsplug/rdm.py => beetsplug/random.py
rename : docs/plugins/fuzzy_search.rst => docs/plugins/fuzzy.rst
rename : docs/plugins/rdm.rst => docs/plugins/random.rst
2012-12-23 14:46:20 -08:00
Adrian Sampson
6b000983c3 merge echonest_tempo fix from master 2012-12-23 14:34:08 -08:00
Adrian Sampson
1809de1500 GH-71: changelog note & retry limit 2012-12-21 23:10:30 -08:00
Zach Denton
e332940247 Wait when Echo Nest API rate limit is exceeded. 2012-12-22 06:31:23 +01:00
Adrian Sampson
a23b685747 use Confit's as_str_seq() instead of get(list)
This validator lets the user write either a real list, like [a, b, c], or just
a whitespace-separated string, like a b c. This is a little nicer for some
settings like "plugins" where the brackets and commas just look like line
noise.
2012-12-20 17:03:51 -08:00
Adrian Sampson
fbcd1d1c18 merge fixes from master 2012-12-19 12:22:23 -08:00
Adrian Sampson
6d68a4855e per-plugin configuration defaults in __init__()
This uses the new BeetsPlugin.config convenience view heavily. Things are
slowly getting less verbose.
2012-12-18 22:35:44 -08:00
Adrian Sampson
4a5594bec6 begin adding convenient plugin defaults
We need plugins to set their config values at run time instead of module import
time. That is, defaults should be put in the __init__ method. This is easy
enough, but to make it even more convenient, I added a BeetsPlugin.config
field, which is a Confit view into a subsection of the configuration named
after the plugin.
2012-12-18 20:42:42 -08:00
Adrian Sampson
55cac36d35 sync with latest confit
This includes Confit's shift to using OrderedDict, which needs some debugging.
2012-12-18 20:03:52 -08:00
Adrian Sampson
0c49db0f11 fetchart: fix exception when source returns None 2012-12-17 23:22:45 -08:00
Adrian Sampson
3a0ac96cc5 zero: Unicode logging calls 2012-12-17 15:08:48 -08:00
Adrian Sampson
582851a6fe merge fix from master 2012-12-14 12:57:40 -08:00
Adrian Sampson
4222b37bc2 convert: fix processing singletons w/ "embed" on 2012-12-14 12:38:46 -08:00
Adrian Sampson
3ef9e006f4 finish confit-ifying all the plugins 2012-12-13 17:14:19 -08:00
Adrian Sampson
6c94358b13 begin Confit-ifying plugins in alphabetical order 2012-12-13 12:31:10 -08:00
Adrian Sampson
e17cd6beba merge lots of work on the stable branch 2012-12-12 19:14:30 -08:00
Adrian Sampson
2d4b91fa6d replaygain: handle RG tool invocation errors (GC-469) 2012-12-11 13:09:10 -08:00
Adrian Sampson
531025f799 replaygain: restrict file formats (GC-469) 2012-12-11 13:06:57 -08:00
Adrian Sampson
3e9135ee7c syspath-ify call to pyacoustid (GC-464) 2012-12-07 14:49:11 -08:00
Adrian Sampson
f5628e03f6 include official beets Echo Nest API key 2012-12-02 16:32:19 -08:00
Adrian Sampson
a8cf42d05b echonest_tempo: changelog + doc fixes + print fix 2012-12-02 16:25:45 -08:00
David Brenner
0fe2331842 Create echonest_tempo plugin - use EchoNest API to get tempo (bpm).
A simple plugin that connects to the EchoNest API to retrieve
tempo (bpm) metadata for tracks. Functions similarly to the lyrics
plugin.

Requires the pyechonest library.
2012-12-02 18:27:20 -05:00
Adrian Sampson
ad9021b9d9 replaygain: normalize peaks to 2^15 (closes #65) 2012-11-09 16:25:19 -08:00
Adrian Sampson
729a89cff3 lyrics: possibly address a Unicode error 2012-11-09 00:01:36 -08:00
Adrian Sampson
ffe5d37d78 log unicode string literals (GC-456) 2012-11-06 14:22:36 -08:00
Jakob Schnitzer
19acf0809f convert: switch from flac and lame to ffmpeg
Instead of flac and lame the convert plugin now uses ffmpeg. This adds
support for more input formats and simplifies the code. ffmpeg also uses
the lame encoder internally and has equivalents of all the -V<num>
presets which should be sufficient.
2012-11-05 22:30:21 +01:00
Adrian Sampson
a8383b03e9 merge with master 2012-11-01 14:28:25 -07:00
Adrian Sampson
338eb6388e documentation for convert.exe problem (#64)
We currently just document the fact that convert.exe can interfere with finding
ImageMagick's convert binary. We can solve this with a config option easily once
confit is merged.

This also changes the line endings for fetchart.rst back to Unix.
2012-11-01 14:25:46 -07:00
Adrian Sampson
d9974081a7 add extension for proxied images
`urllib.urlretrieve` was using the correct extension in most cases -- I think
when the URL ended with .jpg -- but not in every case. This was leading to files
named just "cover" and not "cover.jpg" or something else sensible. In
particular, proxied URLs don't have .jpg extensions. This generates the filename
manually so the source image always has an extension.
2012-11-01 12:39:02 -07:00
Adrian Sampson
45650a4b64 artresizer: fix argument lists to helper functions
Also added some useful debug logs.
2012-11-01 12:15:51 -07:00
Adrian Sampson
f4fa11f8ca don't use subprocess.check_output
This function was added in Python 2.7 and we're currently targetting 2.6 as a
minimum version. Replaced with a function in util.
2012-11-01 11:59:02 -07:00
Adrian Sampson
07d3f3e066 lazily initialize ArtResizer singleton (#64)
Searching for `convert` or PIL has non-negligible performance overhead, so it's
preferable to only do it when really necessary. This way, the search is only
performed when ArtResizer.shared is accessed for the first time.
2012-11-01 11:40:53 -07:00
Adrian Sampson
f7677a4b56 fetchart: fix command & use maxwidth (#64)
An earlier commit broke the call to art_for_album here (too few arguments).
I've also now propagated the maxwidth setting for the command to match the
import hook.
2012-11-01 00:19:15 -07:00
Adrian Sampson
e3fe9712d5 fetchart fixes for image resizing (#64)
Fixed a number of issues with the changes to fetchart:
- Remove redundant fetches. This was making the Amazon source download every
  image twice even when art resizing was not enabled!
- Restore local_only switch in plugin hook, which got lost in the shuffle at
  some point.
- Don't replace the original image file in-place; use a temporary file instead.
  This would clobber the original source image on the filesystem with the
  downscaled version!
2012-11-01 00:09:35 -07:00
Adrian Sampson
3873c29448 artresizer (#64): helper functions, not classes
The previous method was to change self.__class__ dynamically to make __init__
instantiate different classes. This new way, which uses bare functions instead
of separate functor-like classes, instead just forwards the resize() call to
a module-global implementation based on self.method.

Additionally, the semantics of ArtResizer have changed. Clients now *always*
call resize() and proxy_url(), regardless of method. The method makes *one* of
these a no-op. This way, clients need not manually inspect which method is
being used.
2012-10-31 23:33:59 -07:00
Fabrice Laporte
447454a62c fix few errors revealed by test_art.py 2012-10-28 23:02:45 +01:00
Fabrice Laporte
d271735dd2 fetchart: fix urlopen call 2012-10-28 17:09:39 +01:00
Fabrice Laporte
7f2aa44ac6 Add 'maxwidth' option to embedart and fetchart plugins.
artresizer.py instances an ArtResizer object that uses internally the PIL; ImageMagick
or a web proxy service to perform the resizing operations.
Because embedart works on input images located on filesystem it requires PIL or ImageMagick, whereas
fetchart is able to do the job with the fallback webproxy resizer.
2012-10-28 15:36:42 +01:00
Adrian Sampson
7158c01ff8 clean up outdated FIXMEs 2012-10-27 18:47:04 -07:00
Adrian Sampson
57e66d7b1a fetchart: sort image filenames (GC-452) 2012-10-25 18:02:22 -07:00
Jakob Schnitzer
cf98bfcbe6 convert: write tags from library to copied files 2012-10-25 01:05:06 +02:00
Adrian Sampson
02fd9bf809 convert: embed into destination file, not source file
Paging @yagebu: I think the old version of the code would embed album art into
the wrong file. Please correct me (and accept my apologies) if I'm wrong
though.
2012-10-24 15:17:00 -07:00
Adrian Sampson
dcb9ad7373 fix several non-unicode logging statements
A user reported a problem with one of the logging statements where .format()
tried to convert a Unicode string to bytes because the log message was '', not
u''. As a rule, we should ensure that all logging statements use Unicode
literals.
2012-10-24 15:14:33 -07:00
Philippe Mongeau
78f2003eb0 simplify the random print code
We don't need the 'if opts.album' since we print with the same function and
argsuments.
2012-10-21 11:39:23 -04:00
Philippe Mongeau
e80dce6930 fuzzy: use the new print_obj function 2012-10-21 11:29:21 -04:00
Jakob Schnitzer
54f29812cf convert: fix breakage due to recent API changes 2012-10-21 13:35:41 +02:00
Adrian Sampson
91ad913399 #62: simplify list (and random) code
With the new centralized print_obj function, we can greatly simplify the code
for the list command. This necessitated a couple of additional tweaks:

- For performance reasons, print_obj can now take a compiled template. (There's
  still an issue with using the default/configured template, but we can cross
  that bridge later).
- When listing albums, $path now expands to the album's item dir. So the format
  string '$path' now exactly corresponds to passing the -p switch.

As an added bonus, we can now also reduce copypasta in the random plugin (which
behaves almost exactly the same as list).
2012-10-20 21:10:39 -07:00
Adrian Sampson
9368075756 replaygain: reinstate albumgain config option 2012-10-20 16:49:52 -07:00
Adrian Sampson
848b56e54c replaygain: remove album noclip gain adjustment
as suggested by @kraYmer
2012-10-20 16:41:31 -07:00
Jakob Schnitzer
492f168124 convert: Fix problem with "threads" config option 2012-10-20 13:25:25 +02:00
Adrian Sampson
2c38c15fb8 replaygain: apply album gain in album mode 2012-10-18 11:33:13 -07:00
Jakob Schnitzer
58ba4b3d75 convert: fix album art embedding 2012-10-18 18:35:25 +02:00
Adrian Sampson
0ab3426bd9 replaygain: add command
You can now disable automatic analysis and instead use a command to manually
analyze albums or tracks.
2012-10-17 22:12:38 -07:00
Adrian Sampson
1a261db918 replaygain: style and light refactoring 2012-10-17 21:47:17 -07:00
Adrian Sampson
95910a366b replaygain: run in import stage
This is the "new way" to post-process files on import (superseding the imported
events).
2012-10-17 21:43:27 -07:00
Adrian Sampson
3a4e1ca4f7 replaygain: add fields to Item
This has been a long time coming, but we now finally keep track of ReplayGain
values in the database. This is an intermediate step toward a refactoring of the
RG plugin; at the moment, these values are not actually saved!
2012-10-17 20:28:24 -07:00
Adrian Sampson
83f3069d57 replaygain: remove albumgain setting
We now always calculate album gain when importing an album. This is "free" (no
performance cost) now and players are free to ignore the setting if they so
choose.
2012-10-17 20:11:20 -07:00
Adrian Sampson
3d68cf5deb replaygain: fix album nopeak adjustment
Removed the second tool invocation. We now adjust the album-level gain based on
track peaks in one fell swoop. Based on help from Fabrice via email.
2012-10-17 20:06:10 -07:00