move helper functions from utils to plugins

This commit is contained in:
Fabrice Laporte 2014-12-17 22:00:00 +01:00
parent 9d0ca15ace
commit 474adffe63
5 changed files with 48 additions and 46 deletions

View file

@ -16,8 +16,10 @@
import logging
import traceback
from collections import defaultdict
import inspect
import re
from collections import defaultdict
import beets
from beets import mediafile
@ -402,3 +404,33 @@ def send(event, **arguments):
argspec = inspect.getargspec(handler).args
args = dict((k, v) for k, v in arguments.items() if k in argspec)
handler(**args)
def feat_tokens(for_artist=True):
"""Return a regular expression that matches phrases like "featuring"
that separate a main artist or a song title from secondary artists.
The `for_artist` option determines whether the regex should be
suitable for matching artist fields (the default) or title fields.
"""
feat_words = ['ft', 'featuring', 'feat', 'feat.', 'ft.']
if for_artist:
feat_words += ['with', 'vs', 'and', 'con', '&']
return '(?<=\s)(?:{0})(?=\s)'.format(
'|'.join(re.escape(x) for x in feat_words)
)
def sanitize_choices(choices, choices_all):
"""Clean up a stringlist configuration attribute: keep only choices
elements present in choices_all, remove duplicate elements, expand '*'
wildcard while keeping original stringlist order.
"""
seen = set()
others = [x for x in choices_all if x not in choices]
print others
res = []
for s in choices:
if s in list(choices_all) + ['*']:
if not (s in seen or seen.add(s)):
res.extend(list(others) if s == '*' else [s])
return res

View file

@ -678,32 +678,3 @@ def max_filename_length(path, limit=MAX_FILENAME_LENGTH):
return min(res[9], limit)
else:
return limit
def feat_tokens(for_artist=True):
"""Return a regular expression that matches phrases like "featuring"
that separate a main artist or a song title from secondary artists.
The `for_artist` option determines whether the regex should be
suitable for matching artist fields (the default) or title fields.
"""
feat_words = ['ft', 'featuring', 'feat', 'feat.', 'ft.']
if for_artist:
feat_words += ['with', 'vs', 'and', 'con', '&']
return '(?<=\s)(?:{0})(?=\s)'.format(
'|'.join(re.escape(x) for x in feat_words)
)
def sanitize_choices(choices, choices_all):
"""Clean up a stringlist configuration attribute by removing unknown or
duplicate string while keeping original order.
"""
seen = set()
others = [x for x in choices_all if x not in choices]
print others
res = []
for s in choices:
if s in list(choices_all) + ['*']:
if not (s in seen or seen.add(s)):
res.extend(list(others) if s == '*' else [s])
return res

View file

@ -22,12 +22,12 @@ from tempfile import NamedTemporaryFile
import requests
from beets.plugins import BeetsPlugin
from beets.util.artresizer import ArtResizer
from beets import plugins
from beets import importer
from beets import ui
from beets import util
from beets import config
from beets.util.artresizer import ArtResizer
try:
import itunes
@ -319,7 +319,7 @@ def batch_fetch_art(lib, albums, force, maxwidth=None):
message))
class FetchArtPlugin(BeetsPlugin):
class FetchArtPlugin(plugins.BeetsPlugin):
def __init__(self):
super(FetchArtPlugin, self).__init__()
@ -345,7 +345,7 @@ class FetchArtPlugin(BeetsPlugin):
if not HAVE_ITUNES and u'itunes' in SOURCES_ALL:
SOURCES_ALL.remove(u'itunes')
self.config['sources'] = util.sanitize_choices(
self.config['sources'] = plugins.sanitize_choices(
self.config['sources'].as_str_seq(), SOURCES_ALL)
# Asynchronous; after music is added to the library.

View file

@ -14,9 +14,9 @@
"""Moves "featured" artists to the title from the artist field.
"""
from beets.plugins import BeetsPlugin
from beets import plugins
from beets import ui
from beets.util import displayable_path, feat_tokens
from beets.util import displayable_path
from beets import config
import logging
import re
@ -31,7 +31,7 @@ def split_on_feat(artist):
may be a string or None if none is present.
"""
# split on the first "feat".
regex = re.compile(feat_tokens(), re.IGNORECASE)
regex = re.compile(plugins.feat_tokens(), re.IGNORECASE)
parts = [s.strip() for s in regex.split(artist, 1)]
if len(parts) == 1:
return parts[0], None
@ -42,7 +42,7 @@ def split_on_feat(artist):
def contains_feat(title):
"""Determine whether the title contains a "featured" marker.
"""
return bool(re.search(feat_tokens(), title, flags=re.IGNORECASE))
return bool(re.search(plugins.feat_tokens(), title, flags=re.IGNORECASE))
def update_metadata(item, feat_part, drop_feat):
@ -110,7 +110,7 @@ def ft_in_title(item, drop_feat):
ui.print_()
class FtInTitlePlugin(BeetsPlugin):
class FtInTitlePlugin(plugins.BeetsPlugin):
def __init__(self):
super(FtInTitlePlugin, self).__init__()

View file

@ -26,9 +26,8 @@ import difflib
import itertools
from HTMLParser import HTMLParseError
from beets.plugins import BeetsPlugin
from beets import config, ui, util
from beets.util import feat_tokens
from beets import plugins
from beets import config, ui
# Global logger.
@ -144,7 +143,7 @@ def search_pairs(item):
artists = [artist]
# Remove any featuring artists from the artists name
pattern = r"(.*?) {0}".format(feat_tokens())
pattern = r"(.*?) {0}".format(plugins.feat_tokens())
match = re.search(pattern, artist, re.IGNORECASE)
if match:
artists.append(match.group(1))
@ -157,7 +156,7 @@ def search_pairs(item):
titles.append(match.group(1))
# Remove any featuring artists from the title
pattern = r"(.*?) {0}".format(feat_tokens(for_artist=False))
pattern = r"(.*?) {0}".format(plugins.feat_tokens(for_artist=False))
for title in titles[:]:
match = re.search(pattern, title, re.IGNORECASE)
if match:
@ -437,7 +436,7 @@ SOURCES_ALL = {'google': fetch_google,
'musixmatch': fetch_musixmatch}
class LyricsPlugin(BeetsPlugin):
class LyricsPlugin(plugins.BeetsPlugin):
def __init__(self):
super(LyricsPlugin, self).__init__()
self.import_stages = [self.imported]
@ -452,7 +451,7 @@ class LyricsPlugin(BeetsPlugin):
if not self.config['google_API_key'].get() and \
'google' in SOURCES_KEYS:
SOURCES_KEYS.remove('google')
self.config['sources'] = util.sanitize_choices(
self.config['sources'] = plugins.sanitize_choices(
self.config['sources'].as_str_seq(), SOURCES_KEYS)
self.backends = []
for key in self.config['sources'].as_str_seq():