New tagger script parser, new plugin system, options page with plugin list.

This commit is contained in:
Lukáš Lalinský
2007-01-20 17:59:45 +01:00
parent f820ec97b3
commit 49d9041bf7
30 changed files with 1261 additions and 985 deletions

96
picard/plugin.py Normal file
View File

@@ -0,0 +1,96 @@
# -*- coding: utf-8 -*-
#
# Picard, the next-generation MusicBrainz tagger
# Copyright (C) 2007 Lukáš Lalinský
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from PyQt4 import QtCore
import imp
import os.path
import picard.plugins
class PluginWrapper(object):
def __init__(self, module):
self.module = module
def __get_name(self):
try:
return self.module.PLUGIN_NAME
except AttributeError:
return self.module.name
name = property(__get_name)
def __get_author(self):
try:
return self.module.PLUGIN_AUTHOR
except AttributeError:
return ""
author = property(__get_author)
def __get_description(self):
try:
return self.module.PLUGIN_DESCRIPTION
except AttributeError:
return ""
description = property(__get_description)
def __get_file(self):
return self.module.__file__
file = property(__get_file)
class PluginManager(QtCore.QObject):
def __init__(self):
self.plugins = []
def load(self, plugindir):
if not os.path.isdir(plugindir):
self.log.info("Plugin directory '%s' doesn't exist", plugindir)
return
names = set()
suffixes = [s[0] for s in imp.get_suffixes()]
package_entries = ["__init__.py", "__init__.pyc", "__init__.pyo"]
for name in os.listdir(plugindir):
path = os.path.join(plugindir, name)
if os.path.isdir(path):
for entry in package_entries:
if os.path.isfile(os.path.join(path, entry)):
break
else:
continue
else:
name, suffix = os.path.splitext(name)
if suffix not in suffixes:
continue
if hasattr(picard.plugins, name):
self.log.info("Plugin %s already loaded!", name)
else:
names.add(name)
for name in names:
self.log.debug("Loading plugin %s", name)
info = imp.find_module(name, [plugindir])
try:
plugin = imp.load_module('picard.plugins.' + name, *info)
setattr(picard.plugins, name, plugin)
self.plugins.append(PluginWrapper(plugin))
finally:
if info[0] is not None:
info[0].close()

415
picard/script.py Normal file
View File

@@ -0,0 +1,415 @@
# -*- coding: utf-8 -*-
#
# Picard, the next-generation MusicBrainz tagger
# Copyright (C) 2006-2007 Lukáš Lalinský
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class ScriptError(Exception): pass
class ParseError(ScriptError): pass
class EndOfFile(ParseError): pass
class SyntaxError(ParseError): pass
class UnknownFunction(ScriptError): pass
class ScriptText(unicode):
def eval(self, state):
return self
class ScriptVariable(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return '<ScriptVariable %%%s%%>' % self.name
def eval(self, state):
return state.context.get(self.name, u"")
class ScriptFunction(object):
def __init__(self, name, args):
self.name = name
self.args = args
def __repr__(self):
return "<ScriptFunction $%s(%r)>" % (self.name, self.args)
def eval(self, state):
try:
return state.functions[self.name](state, *self.args)
except KeyError:
raise UnknownFunction("Unknown function '%s'" % self.name)
class ScriptExpression(list):
def eval(self, state):
result = []
for item in self:
result.append(item.eval(state))
return "".join(result)
def isidentif(ch):
return ch.isalnum() or ch == '_'
class ExtensionPoint(object):
def __init__(self):
self.__items = []
def register(self, item):
self.__items.append(item)
def __iter__(self):
for item in self.__items:
yield item
class ScriptParser(object):
"""Tagger script parser.
Grammar:
text ::= [^$%] | '\$' | '\%' | '\(' | '\)' | '\,'
argtext ::= [^$%(),] | '\$' | '\%' | '\(' | '\)' | '\,'
identifier ::= [a-zA-Z0-9_]
variable ::= '%' identifier '%'
function ::= '$' identifier '(' (argument (',' argument)*)? ')'
expression ::= (variable | function | text)*
argument ::= (variable | function | argtext)*
"""
_function_registry = ExtensionPoint()
_cache = {}
def __raise_eof(self):
raise EndOfFile("Unexpected end of file at position %d, line %d" % (self._x, self._y))
def __raise_char(self, ch):
raise SyntaxError("Unexpected character %r at position %d, line %d" % (ch, self._x, self._y))
def read(self):
try:
ch = self._text[self._pos]
except IndexError:
return None
else:
self._pos += 1
self._px = self._x
self._py = self._y
if ch == '\n':
self._x = 1
self._y += 1
else:
self._x += 1
return ch
def unread(self):
self._pos -= 1
self._x = self._px
self._y = self._py
def parse_arguments(self):
results = []
while True:
result, ch = self.parse_expression(False)
results.append(result)
if ch == ')':
return results
def parse_function(self):
start = self._pos
while True:
ch = self.read()
if ch == '(':
name = self._text[start:self._pos-1]
return ScriptFunction(name, self.parse_arguments())
elif ch is None:
self.__raise_eof()
elif not isidentif(ch):
self.__raise_char(ch)
def parse_variable(self):
begin = self._pos
while True:
ch = self.read()
if ch == '%':
return ScriptVariable(self._text[begin:self._pos-1])
elif ch is None:
self.__raise_eof()
elif not isidentif(ch):
self.__raise_char(ch)
def parse_text(self, top):
begin = self._pos - 1
while True:
ch = self.read()
if ch == '\\':
ch = self.read()
if ch not in '$%(),\\':
self.__raise_char(ch)
elif ch is None:
return ScriptText(self._text[begin:self._pos])
elif ch in '$%' or (not top and ch in ',()'):
self.unread()
return ScriptText(self._text[begin:self._pos])
def parse_expression(self, top):
tokens = ScriptExpression()
while True:
ch = self.read()
if ch is None:
if top:
break
else:
self.__raise_eof()
elif not top and ch in ',)':
break
elif ch == '$':
tokens.append(self.parse_function())
elif ch == '%':
tokens.append(self.parse_variable())
else:
tokens.append(self.parse_text(top))
return (tokens, ch)
def parse(self, script):
"""Parse the script."""
self._text = script
self._pos = 0
self._px = self._x = 1
self._py = self._y = 1
return self.parse_expression(True)[0]
def eval(self, script, context):
"""Parse and evaluate the script."""
self.context = context
for name, function in ScriptParser._function_registry:
self.functions[name] = function
key = hash(script)
if key not in ScriptParser.__cache:
ScriptParser.__cache[key] = self.parse(script)
return ScriptParser.__cache[key].eval(self)
def register_script_function(function, name=None):
if name is None:
name = function.__name__
ScriptParser._function_registry.register((name, function))
def func_if(parser, *args):
"""If ``if`` is not empty, it returns ``then``, otherwise it returns
``else``."""
if args[0]:
return args[1]
if len(args) == 3:
return args[2]
return ''
def func_if2(parser, *args):
"""Returns first non empty argument."""
for arg in args:
if arg:
return arg
return args[-1]
def func_noop(parser, *args):
"""Does nothing :)"""
return "".join(args)
def func_left(parser, text, length):
"""Returns first ``num`` characters from ``text``."""
return text[:int(length)]
def func_right(parser, text, length):
"""Returns last ``num`` characters from ``text``."""
return text[-int(length):]
def func_lower(parser, text):
"""Returns ``text`` in lower case."""
return text.lower()
def func_upper(parser, text):
"""Returns ``text`` in upper case."""
return text.upper()
def func_pad(parser, text, length, char):
return char * (int(length) - len(text)) + text
def func_strip(parser, text):
return re.sub("\s+", " ", text).strip()
def func_replace(parser, text, old, new):
return text.replace(old, new)
def func_rreplace(parser, text, old, new):
return re.sub(old, new, text)
def func_rsearch(parser, text, pattern):
match = re.search(pattern, text)
if match:
return match.group(1)
return u""
def func_num(parser, text, length):
format = "%%0%dd" % int(length)
try:
value = int(text)
except ValueError:
value = 0
return format % value
def func_unset(parser, name):
"""Unsets the variable ``name``."""
del parser.context[name]
return ""
def func_set(parser, name, value):
"""Sets the variable ``name`` to ``value``."""
parser.context[name] = value
return ""
def func_get(parser, name):
"""Returns the variable ``name`` (equivalent to ``%name%``)."""
return parser.context.get(name, "")
def func_trim(parser, text, char=None):
"""Trims all leading and trailing whitespaces from ``text``. The optional
second parameter specifies the character to trim."""
if char:
return text.strip(char)
else:
return text.strip()
def func_add(parser, x, y):
"""Add ``y`` to ``x``."""
return str(int(x) + int(y))
def func_sub(parser, x, y):
"""Substracts ``y`` from ``x``."""
return str(int(x) - int(y))
def func_div(parser, x, y):
"""Divides ``x`` by ``y``."""
return str(int(x) / int(y))
def func_mod(parser, x, y):
"""Returns the remainder of ``x`` divided by ``y``."""
return str(int(x) % int(y))
def func_mul(parser, x, y):
"""Multiplies ``x`` by ``y``."""
return str(int(x) * int(y))
def func_or(parser, x, y):
"""Returns true, if either ``x`` or ``y`` not empty."""
if x or y:
return "1"
else:
return ""
def func_and(parser, x, y):
"""Returns true, if both ``x`` and ``y`` are not empty."""
if x and y:
return "1"
else:
return ""
def func_not(parser, x):
"""Returns true, if ``x`` is empty."""
if not x:
return "1"
else:
return ""
def func_eq(parser, x, y):
"""Returns true, if ``x`` equals ``y``."""
if x == y:
return "1"
else:
return ""
def func_ne(parser, x, y):
"""Returns true, if ``x`` not equals ``y``."""
if x != y:
return "1"
else:
return ""
def func_lt(parser, x, y):
"""Returns true, if ``x`` is lower than ``y``."""
if x < y:
return "1"
else:
return ""
def func_lte(parser, x, y):
"""Returns true, if ``x`` is lower than or equals ``y``."""
if x <= y:
return "1"
else:
return ""
def func_gt(parser, x, y):
"""Returns true, if ``x`` is greater than ``y``."""
if x > y:
return "1"
else:
return ""
def func_gte(parser, x, y):
"""Returns true, if ``x`` is greater than or equals ``y``."""
if x >= y:
return "1"
else:
return ""
register_script_function(func_if, "if")
register_script_function(func_if2, "if2")
register_script_function(func_noop, "noop")
register_script_function(func_left, "left")
register_script_function(func_right, "right")
register_script_function(func_lower, "lower")
register_script_function(func_upper, "upper")
register_script_function(func_pad, "pad")
register_script_function(func_strip, "strip")
register_script_function(func_replace, "replace")
register_script_function(func_rreplace, "rreplace")
register_script_function(func_rsearch, "rsearch")
register_script_function(func_num, "num")
register_script_function(func_unset, "unset")
register_script_function(func_set, "set")
register_script_function(func_get, "get")
register_script_function(func_trim, "trim")
register_script_function(func_add, "add")
register_script_function(func_sub, "sub")
register_script_function(func_div, "div")
register_script_function(func_mod, "mod")
register_script_function(func_mul, "mul")
register_script_function(func_or, "or")
register_script_function(func_and, "and")
register_script_function(func_not, "not")
register_script_function(func_eq, "eq")
register_script_function(func_ne, "ne")
register_script_function(func_lt, "lt")
register_script_function(func_lte, "lte")
register_script_function(func_gt, "gt")
register_script_function(func_gte, "gte")

View File

@@ -37,9 +37,8 @@ __builtin__.__dict__['N_'] = lambda a: a
import picard.resources
import picard.plugins
import picard.formats
import picard.tagz
import picard.formats
from picard import musicdns
from picard.album import Album
from picard.api import IFileOpener, ITaggerScript
@@ -51,7 +50,9 @@ from picard.config import Config
from picard.file import File
from picard.metadata import Metadata
from picard.track import Track
from picard.script import ScriptParser
from picard.ui.mainwindow import MainWindow
from picard.plugin import PluginManager
from picard.puidmanager import PUIDManager
from picard.util import (
decode_filename,
@@ -123,10 +124,12 @@ class Tagger(QtGui.QApplication, ComponentManager, Component):
self._analyze_thread = self.thread_assist.allocate()
self.thread_assist.spawn(self._ofa.init, thread=self._analyze_thread)
self.__load_plugins(os.path.join(os.path.dirname(sys.argv[0]), "plugins"))
self.__load_plugins(self.plugins_dir)
self.pluginmanager = PluginManager()
self.pluginmanager.load(os.path.join(os.path.dirname(sys.argv[0]), "plugins"))
self.pluginmanager.load(self.plugins_dir)
self.puidmanager = PUIDManager()
self.scriptparser = ScriptParser()
self.__files_to_be_moved = []
@@ -223,42 +226,6 @@ class Tagger(QtGui.QApplication, ComponentManager, Component):
def __clear_status_bar_message(self):
self.window.clear_status_bar_message()
def __load_plugins(self, plugin_dir):
"""Load plugins from the specified directory."""
if not os.path.isdir(plugin_dir):
self.log.info("Plugin directory '%s' doesn't exist", plugin_dir)
return
plugin_names = set()
suffixes = [s[0] for s in imp.get_suffixes()]
package_entries = ["__init__.py", "__init__.pyc", "__init__.pyo"]
for name in os.listdir(plugin_dir):
path = os.path.join(plugin_dir, name)
if os.path.isdir(path):
for entry in package_entries:
if os.path.isfile(os.path.join(path, entry)):
break
else:
continue
else:
name, suffix = os.path.splitext(name)
if suffix not in suffixes:
continue
if hasattr(picard.plugins, name):
self.log.info("Plugin %s already loaded!", name)
else:
plugin_names.add(name)
for name in plugin_names:
self.log.debug("Loading plugin %s", name)
info = imp.find_module(name, [plugin_dir])
try:
plugin = imp.load_module('picard.plugins.' + name, *info)
setattr(picard.plugins, name, plugin)
finally:
if info[0] is not None:
info[0].close()
def get_supported_formats(self):
"""Returns list of supported formats.
@@ -715,10 +682,7 @@ class Tagger(QtGui.QApplication, ComponentManager, Component):
def evaluate_script(self, script, context={}):
"""Evaluate the script and return the result."""
if not self.scripting:
raise Exception, "No tagger script interpreter."
return self.scripting[0].evaluate_script(script, context)
return self.scriptparser.eval(script, context)
def get_web_service(self, cached=True, **kwargs):
if "host" not in kwargs:

View File

@@ -1,353 +0,0 @@
# -*- coding: utf-8 -*-
#
# Picard, the next-generation MusicBrainz tagger
# Copyright (C) 2006 Lukáš Lalinský
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""Tagger script parser and evaluator."""
import re
try:
from re import Scanner
except ImportError:
from sre import Scanner
from picard.component import Component, ExtensionPoint, Interface, implements
from picard.api import ITaggerScript
_re_text = r"(?:\\.|[^%$])+"
_re_text2 = r"(?:\\.|[^%$,])+"
_re_args_sep = ","
_re_name = "\w+"
_re_var = r"%" + _re_name + r"%"
_re_func_args = no_parens = r"(?:\\.|[^()])*"
for i in range(10): # 10 levels must be enough for everybody ;)
_re_func_args = r"(\(" + _re_func_args + r"\)|" + no_parens + r")*"
_re_func = r"\$" + _re_name + r"\(" + _re_func_args + r"\)"
def func_if(context, *args):
"""If ``if`` is not empty, it returns ``then``, otherwise it returns
``else``."""
if args[0]:
return args[1]
if len(args) == 3:
return args[2]
return ''
def func_if2(context, *args):
"""Returns first non empty argument."""
for arg in args:
if arg:
return arg
return args[-1]
def func_noop(context, *args):
"""Does nothing :)"""
return "".join(args)
def func_left(context, text, length):
"""Returns first ``num`` characters from ``text``."""
return text[:int(length)]
def func_right(context, text, length):
"""Returns last ``num`` characters from ``text``."""
return text[-int(length):]
def func_lower(context, text):
"""Returns ``text`` in lower case."""
return text.lower()
def func_upper(context, text):
"""Returns ``text`` in upper case."""
return text.upper()
def func_pad(context, text, length, char):
return char * (int(length) - len(text)) + text
def func_strip(context, text):
return re.sub("\s+", " ", text).strip()
def func_replace(context, text, old, new):
return text.replace(old, new)
def func_rreplace(context, text, old, new):
return re.sub(old, new, text)
def func_rsearch(context, text, pattern):
match = re.search(pattern, text)
if match:
return match.group(1)
return u""
def func_num(context, text, length):
format = "%%0%dd" % int(length)
try:
value = int(text)
except ValueError:
value = 0
return format % value
def func_unset(context, name):
"""Unsets the variable ``name``."""
del context[name]
return ""
def func_set(context, name, value):
"""Sets the variable ``name`` to ``value``."""
context[name] = value
return ""
def func_get(context, name):
"""Returns the variable ``name`` (equivalent to ``%name%``)."""
return context.get(name, "")
def func_trim(context, text, char=None):
"""Trims all leading and trailing whitespaces from ``text``. The optional
second parameter specifies the character to trim."""
if char:
return text.strip(char)
else:
return text.strip()
def func_add(context, x, y):
"""Add ``y`` to ``x``."""
return str(int(x) + int(y))
def func_sub(context, x, y):
"""Substracts ``y`` from ``x``."""
return str(int(x) - int(y))
def func_div(context, x, y):
"""Divides ``x`` by ``y``."""
return str(int(x) / int(y))
def func_mod(context, x, y):
"""Returns the remainder of ``x`` divided by ``y``."""
return str(int(x) % int(y))
def func_mul(context, x, y):
"""Multiplies ``x`` by ``y``."""
return str(int(x) * int(y))
def func_or(context, x, y):
"""Returns true, if either ``x`` or ``y`` not empty."""
if x or y:
return "1"
else:
return ""
def func_and(context, x, y):
"""Returns true, if both ``x`` and ``y`` are not empty."""
if x and y:
return "1"
else:
return ""
def func_not(context, x):
"""Returns true, if ``x`` is empty."""
if not x:
return "1"
else:
return ""
def func_eq(context, x, y):
"""Returns true, if ``x`` equals ``y``."""
if x == y:
return "1"
else:
return ""
def func_ne(context, x, y):
"""Returns true, if ``x`` not equals ``y``."""
if x != y:
return "1"
else:
return ""
def func_lt(context, x, y):
"""Returns true, if ``x`` is lower than ``y``."""
if x < y:
return "1"
else:
return ""
def func_lte(context, x, y):
"""Returns true, if ``x`` is lower than or equals ``y``."""
if x <= y:
return "1"
else:
return ""
def func_gt(context, x, y):
"""Returns true, if ``x`` is greater than ``y``."""
if x > y:
return "1"
else:
return ""
def func_gte(context, x, y):
"""Returns true, if ``x`` is greater than or equals ``y``."""
if x >= y:
return "1"
else:
return ""
class TagzError(Exception):
pass
class TagzParseError(TagzError):
pass
class TagzUnknownFunction(TagzError):
pass
class ITagzFunctionProvider(Interface):
pass
class TagzBuiltins(Component):
implements(ITagzFunctionProvider)
_functions = {
"noop": func_noop,
"if": func_if,
"if2": func_if2,
"eq": func_eq,
"ne": func_ne,
"lt": func_lt,
"lte": func_lte,
"gt": func_gt,
"gte": func_gte,
"left": func_left,
"right": func_right,
"lower": func_lower,
"upper": func_upper,
"pad": func_pad,
"strip": func_strip,
"replace": func_replace,
"rreplace": func_rreplace,
"rsearch": func_rsearch,
"num": func_num,
"unset": func_unset,
"set": func_set,
"get": func_get,
"add": func_add,
"sub": func_sub,
"div": func_div,
"mod": func_mod,
"mul": func_mul,
"or": func_or,
"and": func_and,
"not": func_not,
}
def get_functions(self):
return self._functions
class TagzParser(object):
"""Tagger script implementation similar to Foobar2000's titleformat."""
def __init__(self, context, functions):
self.context = context
self.functions = functions
def evaluate(self, text):
"""Parse and evaluate the script from ``text``."""
scanner = Scanner([(_re_text, self.s_text),
(_re_var, self.s_variable),
(_re_func, self.s_func)])
res = scanner.scan(text)
if res[1]:
raise TagzParseError()
return "".join(res[0])
def s_text(self, scanner, string):
string = string.replace("\\(", "(")
string = string.replace("\\)", ")")
string = string.replace("\\\\", "\\")
string = string.replace("\\,", ",")
return string
def s_variable(self, scanner, string):
try:
return self.context[string[1:-1].lower()]
except KeyError:
return ""
def s_args_sep(self, scanner, string):
return "\0"
def s_func(self, scanner, string):
args_begin = string.find("(")
name = string[1:args_begin]
args = string[args_begin+1:-1]
scanner = Scanner([(_re_args_sep, self.s_args_sep),
(_re_text2, self.s_text),
(_re_var, self.s_variable),
(_re_func, self.s_func)])
results, error = scanner.scan(args)
if error:
raise TagzParseError(string.rfind(error))
args = []
if results:
if results[0] == "\0":
results.insert(0, "")
if results[-1] == "\0":
results.append("")
while results:
j = 1
for res in results:
if res == "\0":
break
j += 1
args.append("".join(results[:j-1]))
results = results[j:]
try:
return self.functions[name](self.context, *args)
except KeyError:
raise TagzUnknownFunction, "Unknown function $%s" % name
class Tagz(Component):
implements(ITaggerScript)
function_providers = ExtensionPoint(ITagzFunctionProvider)
def __init__(self):
self.functions = {}
for prov in self.function_providers:
self.functions.update(prov.get_functions())
def evaluate_script(self, text, context={}):
"""Parse and evaluate the script from ``text``."""
parser = TagzParser(context, self.functions)
return parser.evaluate(text)

View File

@@ -32,6 +32,7 @@ from picard.ui.options import (
matching,
metadata,
naming,
plugins,
proxy,
scripting,
tags,

View File

@@ -0,0 +1,67 @@
# -*- coding: utf-8 -*-
#
# Picard, the next-generation MusicBrainz tagger
# Copyright (C) 2007 Lukáš Lalinský
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from PyQt4 import QtCore, QtGui
from picard.api import IOptionsPage
from picard.component import Component, implements
from picard.ui.ui_options_plugins import Ui_PluginsPage
class PluginsOptionsPage(Component):
implements(IOptionsPage)
def get_page_info(self):
return _(u"Plugins"), "plugins", None, 50
def get_page_widget(self, parent=None):
self.widget = QtGui.QWidget(parent)
self.ui = Ui_PluginsPage()
self.ui.setupUi(self.widget)
self.connect(self.ui.plugins, QtCore.SIGNAL("itemSelectionChanged()"), self.change_details)
return self.widget
def load_options(self):
self.items = {}
firstitem = None
for plugin in self.tagger.pluginmanager.plugins:
item = QtGui.QTreeWidgetItem(self.ui.plugins)
item.setText(0, plugin.name)
item.setText(1, plugin.author)
if not firstitem:
firstitem = item
self.items[item] = plugin
self.ui.plugins.setCurrentItem(firstitem)
def save_options(self):
pass
def change_details(self):
plugin = self.items[self.ui.plugins.selectedItems()[0]]
text = []
name = plugin.name
if name:
text.append("<b>" + _("Name") + "</b>: " + name)
author = plugin.author
if author:
text.append("<b>" + _("Author") + "</b>: " + author)
text.append("<b>" + _("File") + "</b>: " + plugin.file)
descr = plugin.description
if descr:
text.append(descr)
self.ui.details.setText("<br/>\n".join(text))

View File

@@ -1,37 +1,37 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui\options_about.ui'
#
# Created: Sat Oct 21 15:40:37 2006
# by: PyQt4 UI code generator 4-snapshot-20061015
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,427,426).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.label = QtGui.QLabel(Form)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.vboxlayout.addWidget(self.label)
spacerItem = QtGui.QSpacerItem(20,51,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
pass
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_about.ui'
#
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,171,137).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.label = QtGui.QLabel(Form)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.vboxlayout.addWidget(self.label)
spacerItem = QtGui.QSpacerItem(20,51,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
pass

View File

@@ -1,50 +1,50 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui\options_cdlookup.ui'
#
# Created: Sat Sep 30 21:29:55 2006
# by: PyQt4 UI code generator 4.0
# E:\projects\picard-qt\setup.py build_ui
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,285,211).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.rename_files = QtGui.QGroupBox(Form)
self.rename_files.setObjectName("rename_files")
self.gridlayout = QtGui.QGridLayout(self.rename_files)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.cd_lookup_device = QtGui.QLineEdit(self.rename_files)
self.cd_lookup_device.setObjectName("cd_lookup_device")
self.gridlayout.addWidget(self.cd_lookup_device,1,0,1,1)
self.label_3 = QtGui.QLabel(self.rename_files)
self.label_3.setObjectName("label_3")
self.gridlayout.addWidget(self.label_3,0,0,1,1)
self.vboxlayout.addWidget(self.rename_files)
spacerItem = QtGui.QSpacerItem(161,81,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_3.setBuddy(self.cd_lookup_device)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
self.rename_files.setTitle(_("CD Lookup"))
self.label_3.setText(_("CD-ROM device to use for lookups:"))
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_cdlookup.ui'
#
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,224,176).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.rename_files = QtGui.QGroupBox(Form)
self.rename_files.setObjectName("rename_files")
self.gridlayout = QtGui.QGridLayout(self.rename_files)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.cd_lookup_device = QtGui.QLineEdit(self.rename_files)
self.cd_lookup_device.setObjectName("cd_lookup_device")
self.gridlayout.addWidget(self.cd_lookup_device,1,0,1,1)
self.label_3 = QtGui.QLabel(self.rename_files)
self.label_3.setObjectName("label_3")
self.gridlayout.addWidget(self.label_3,0,0,1,1)
self.vboxlayout.addWidget(self.rename_files)
spacerItem = QtGui.QSpacerItem(161,81,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_3.setBuddy(self.cd_lookup_device)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
self.rename_files.setTitle(_(u"CD Lookup"))
self.label_3.setText(_(u"CD-ROM device to use for lookups:"))

View File

@@ -1,59 +1,59 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui\options_cdlookup_win32.ui'
#
# Created: Sat Sep 30 21:29:55 2006
# by: PyQt4 UI code generator 4.0
# E:\projects\picard-qt\setup.py build_ui
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,324,217).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.rename_files = QtGui.QGroupBox(Form)
self.rename_files.setObjectName("rename_files")
self.gridlayout = QtGui.QGridLayout(self.rename_files)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.cd_lookup_ = QtGui.QLabel(self.rename_files)
self.cd_lookup_.setObjectName("cd_lookup_")
self.gridlayout.addWidget(self.cd_lookup_,0,0,1,1)
self.hboxlayout = QtGui.QHBoxLayout()
self.hboxlayout.setMargin(0)
self.hboxlayout.setSpacing(6)
self.hboxlayout.setObjectName("hboxlayout")
self.cd_lookup_device = QtGui.QComboBox(self.rename_files)
self.cd_lookup_device.setObjectName("cd_lookup_device")
self.hboxlayout.addWidget(self.cd_lookup_device)
spacerItem = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
self.hboxlayout.addItem(spacerItem)
self.gridlayout.addLayout(self.hboxlayout,1,0,1,1)
self.vboxlayout.addWidget(self.rename_files)
spacerItem1 = QtGui.QSpacerItem(161,81,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem1)
self.cd_lookup_.setBuddy(self.cd_lookup_device)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
self.rename_files.setTitle(_("CD Lookup"))
self.cd_lookup_.setText(_("CD-ROM drive to use for lookups:"))
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_cdlookup_win32.ui'
#
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,217,155).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.rename_files = QtGui.QGroupBox(Form)
self.rename_files.setObjectName("rename_files")
self.gridlayout = QtGui.QGridLayout(self.rename_files)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.cd_lookup_ = QtGui.QLabel(self.rename_files)
self.cd_lookup_.setObjectName("cd_lookup_")
self.gridlayout.addWidget(self.cd_lookup_,0,0,1,1)
self.hboxlayout = QtGui.QHBoxLayout()
self.hboxlayout.setMargin(0)
self.hboxlayout.setSpacing(6)
self.hboxlayout.setObjectName("hboxlayout")
self.cd_lookup_device = QtGui.QComboBox(self.rename_files)
self.cd_lookup_device.setObjectName("cd_lookup_device")
self.hboxlayout.addWidget(self.cd_lookup_device)
spacerItem = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
self.hboxlayout.addItem(spacerItem)
self.gridlayout.addLayout(self.hboxlayout,1,0,1,1)
self.vboxlayout.addWidget(self.rename_files)
spacerItem1 = QtGui.QSpacerItem(161,81,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem1)
self.cd_lookup_.setBuddy(self.cd_lookup_device)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
self.rename_files.setTitle(_(u"CD Lookup"))
self.cd_lookup_.setText(_(u"CD-ROM drive to use for lookups:"))

View File

@@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'ui/options_cover.ui'
#
# Created: Sat Nov 11 12:48:02 2006
# by: PyQt4 UI code generator 4.0.1
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!

View File

@@ -1,102 +1,102 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui\options_general.ui'
#
# Created: Mon Oct 23 14:07:34 2006
# by: PyQt4 UI code generator 4-snapshot-20061015
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,400,300).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.groupBox = QtGui.QGroupBox(Form)
self.groupBox.setObjectName("groupBox")
self.gridlayout = QtGui.QGridLayout(self.groupBox)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.server_host = QtGui.QComboBox(self.groupBox)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Policy(7),QtGui.QSizePolicy.Policy(0))
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.server_host.sizePolicy().hasHeightForWidth())
self.server_host.setSizePolicy(sizePolicy)
self.server_host.setEditable(True)
self.server_host.setObjectName("server_host")
self.gridlayout.addWidget(self.server_host,1,0,1,1)
self.label_7 = QtGui.QLabel(self.groupBox)
self.label_7.setObjectName("label_7")
self.gridlayout.addWidget(self.label_7,0,1,1,1)
self.server_port = QtGui.QSpinBox(self.groupBox)
self.server_port.setMaximum(65535)
self.server_port.setMinimum(1)
self.server_port.setProperty("value",QtCore.QVariant(80))
self.server_port.setObjectName("server_port")
self.gridlayout.addWidget(self.server_port,1,1,1,1)
self.label = QtGui.QLabel(self.groupBox)
self.label.setObjectName("label")
self.gridlayout.addWidget(self.label,0,0,1,1)
self.vboxlayout.addWidget(self.groupBox)
self.rename_files_2 = QtGui.QGroupBox(Form)
self.rename_files_2.setObjectName("rename_files_2")
self.gridlayout1 = QtGui.QGridLayout(self.rename_files_2)
self.gridlayout1.setMargin(9)
self.gridlayout1.setSpacing(2)
self.gridlayout1.setObjectName("gridlayout1")
self.username = QtGui.QLineEdit(self.rename_files_2)
self.username.setObjectName("username")
self.gridlayout1.addWidget(self.username,1,0,1,1)
self.label_5 = QtGui.QLabel(self.rename_files_2)
self.label_5.setObjectName("label_5")
self.gridlayout1.addWidget(self.label_5,2,0,1,1)
self.password = QtGui.QLineEdit(self.rename_files_2)
self.password.setEchoMode(QtGui.QLineEdit.Password)
self.password.setObjectName("password")
self.gridlayout1.addWidget(self.password,3,0,1,1)
self.label_6 = QtGui.QLabel(self.rename_files_2)
self.label_6.setObjectName("label_6")
self.gridlayout1.addWidget(self.label_6,0,0,1,1)
self.vboxlayout.addWidget(self.rename_files_2)
spacerItem = QtGui.QSpacerItem(201,92,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_5.setBuddy(self.password)
self.label_6.setBuddy(self.username)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
Form.setTabOrder(self.server_host,self.server_port)
Form.setTabOrder(self.server_port,self.username)
Form.setTabOrder(self.username,self.password)
def retranslateUi(self, Form):
self.groupBox.setTitle(_(u"MusicBrainz Server"))
self.label_7.setText(_(u"Port:"))
self.label.setText(_(u"Server address:"))
self.rename_files_2.setTitle(_(u"Account Information"))
self.label_5.setText(_(u"Password:"))
self.label_6.setText(_(u"Username:"))
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_general.ui'
#
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,232,275).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.groupBox = QtGui.QGroupBox(Form)
self.groupBox.setObjectName("groupBox")
self.gridlayout = QtGui.QGridLayout(self.groupBox)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.server_host = QtGui.QComboBox(self.groupBox)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Policy(7),QtGui.QSizePolicy.Policy(0))
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.server_host.sizePolicy().hasHeightForWidth())
self.server_host.setSizePolicy(sizePolicy)
self.server_host.setEditable(True)
self.server_host.setObjectName("server_host")
self.gridlayout.addWidget(self.server_host,1,0,1,1)
self.label_7 = QtGui.QLabel(self.groupBox)
self.label_7.setObjectName("label_7")
self.gridlayout.addWidget(self.label_7,0,1,1,1)
self.server_port = QtGui.QSpinBox(self.groupBox)
self.server_port.setMaximum(65535)
self.server_port.setMinimum(1)
self.server_port.setProperty("value",QtCore.QVariant(80))
self.server_port.setObjectName("server_port")
self.gridlayout.addWidget(self.server_port,1,1,1,1)
self.label = QtGui.QLabel(self.groupBox)
self.label.setObjectName("label")
self.gridlayout.addWidget(self.label,0,0,1,1)
self.vboxlayout.addWidget(self.groupBox)
self.rename_files_2 = QtGui.QGroupBox(Form)
self.rename_files_2.setObjectName("rename_files_2")
self.gridlayout1 = QtGui.QGridLayout(self.rename_files_2)
self.gridlayout1.setMargin(9)
self.gridlayout1.setSpacing(2)
self.gridlayout1.setObjectName("gridlayout1")
self.username = QtGui.QLineEdit(self.rename_files_2)
self.username.setObjectName("username")
self.gridlayout1.addWidget(self.username,1,0,1,1)
self.label_5 = QtGui.QLabel(self.rename_files_2)
self.label_5.setObjectName("label_5")
self.gridlayout1.addWidget(self.label_5,2,0,1,1)
self.password = QtGui.QLineEdit(self.rename_files_2)
self.password.setEchoMode(QtGui.QLineEdit.Password)
self.password.setObjectName("password")
self.gridlayout1.addWidget(self.password,3,0,1,1)
self.label_6 = QtGui.QLabel(self.rename_files_2)
self.label_6.setObjectName("label_6")
self.gridlayout1.addWidget(self.label_6,0,0,1,1)
self.vboxlayout.addWidget(self.rename_files_2)
spacerItem = QtGui.QSpacerItem(201,92,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_5.setBuddy(self.password)
self.label_6.setBuddy(self.username)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
Form.setTabOrder(self.server_host,self.server_port)
Form.setTabOrder(self.server_port,self.username)
Form.setTabOrder(self.username,self.password)
def retranslateUi(self, Form):
self.groupBox.setTitle(_(u"MusicBrainz Server"))
self.label_7.setText(_(u"Port:"))
self.label.setText(_(u"Server address:"))
self.rename_files_2.setTitle(_(u"Account Information"))
self.label_5.setText(_(u"Password:"))
self.label_6.setText(_(u"Username:"))

View File

@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'ui/options_matching.ui'
#
# Created: Sat Dec 16 23:40:23 2006
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
@@ -13,7 +13,7 @@ from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,340,313).size()).expandedTo(Form.minimumSizeHint()))
Form.resize(QtCore.QSize(QtCore.QRect(0,0,328,313).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
@@ -112,3 +112,4 @@ class Ui_Form(object):
self.label_5.setText(_(u"Minimal similarity for cluster lookups:"))
self.label_3.setText(_(u"Minimal similarity for PUID lookups:"))
self.puid_lookup_threshold.setSuffix(_(u" %"))

View File

@@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'ui/options_naming.ui'
#
# Created: Sat Nov 11 15:24:58 2006
# by: PyQt4 UI code generator 4.0.1
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
@@ -13,7 +13,7 @@ from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,401,426).size()).expandedTo(Form.minimumSizeHint()))
Form.resize(QtCore.QSize(QtCore.QRect(0,0,284,388).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
@@ -92,7 +92,7 @@ class Ui_Form(object):
self.gridlayout1.addWidget(self.label_2,0,0,1,3)
self.vboxlayout.addWidget(self.move_files)
spacerItem = QtGui.QSpacerItem(383,51,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
spacerItem = QtGui.QSpacerItem(111,76,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_4.setBuddy(self.va_file_naming_format)
self.label_3.setBuddy(self.file_naming_format)

View File

@@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_plugins.ui'
#
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_PluginsPage(object):
def setupUi(self, PluginsPage):
PluginsPage.setObjectName("PluginsPage")
PluginsPage.resize(QtCore.QSize(QtCore.QRect(0,0,265,297).size()).expandedTo(PluginsPage.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(PluginsPage)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.splitter = QtGui.QSplitter(PluginsPage)
self.splitter.setOrientation(QtCore.Qt.Vertical)
self.splitter.setObjectName("splitter")
self.groupBox_2 = QtGui.QGroupBox(self.splitter)
self.groupBox_2.setObjectName("groupBox_2")
self.vboxlayout1 = QtGui.QVBoxLayout(self.groupBox_2)
self.vboxlayout1.setMargin(9)
self.vboxlayout1.setSpacing(6)
self.vboxlayout1.setObjectName("vboxlayout1")
self.plugins = QtGui.QTreeWidget(self.groupBox_2)
self.plugins.setRootIsDecorated(False)
self.plugins.setObjectName("plugins")
self.vboxlayout1.addWidget(self.plugins)
self.groupBox = QtGui.QGroupBox(self.splitter)
self.groupBox.setObjectName("groupBox")
self.vboxlayout2 = QtGui.QVBoxLayout(self.groupBox)
self.vboxlayout2.setMargin(9)
self.vboxlayout2.setSpacing(6)
self.vboxlayout2.setObjectName("vboxlayout2")
self.details = QtGui.QLabel(self.groupBox)
self.details.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.details.setWordWrap(True)
self.details.setObjectName("details")
self.vboxlayout2.addWidget(self.details)
self.vboxlayout.addWidget(self.splitter)
self.retranslateUi(PluginsPage)
QtCore.QMetaObject.connectSlotsByName(PluginsPage)
def retranslateUi(self, PluginsPage):
self.groupBox_2.setTitle(_(u"Plugins"))
self.plugins.headerItem().setText(0,_(u"Name"))
self.plugins.headerItem().setText(1,_(u"Author"))
self.groupBox.setTitle(_(u"Details"))

View File

@@ -1,87 +1,87 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui\options_proxy.ui'
#
# Created: Sun Oct 08 11:21:09 2006
# by: PyQt4 UI code generator 4.0
# E:\projects\picard-qt\setup.py build_ui
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,339,252).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.web_proxy = QtGui.QGroupBox(Form)
self.web_proxy.setCheckable(True)
self.web_proxy.setObjectName("web_proxy")
self.gridlayout = QtGui.QGridLayout(self.web_proxy)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.password = QtGui.QLineEdit(self.web_proxy)
self.password.setEchoMode(QtGui.QLineEdit.Password)
self.password.setObjectName("password")
self.gridlayout.addWidget(self.password,5,0,1,2)
self.username = QtGui.QLineEdit(self.web_proxy)
self.username.setObjectName("username")
self.gridlayout.addWidget(self.username,3,0,1,2)
self.label_5 = QtGui.QLabel(self.web_proxy)
self.label_5.setObjectName("label_5")
self.gridlayout.addWidget(self.label_5,4,0,1,2)
self.label_6 = QtGui.QLabel(self.web_proxy)
self.label_6.setObjectName("label_6")
self.gridlayout.addWidget(self.label_6,2,0,1,2)
self.server_host = QtGui.QLineEdit(self.web_proxy)
self.server_host.setObjectName("server_host")
self.gridlayout.addWidget(self.server_host,1,0,1,1)
self.label_7 = QtGui.QLabel(self.web_proxy)
self.label_7.setObjectName("label_7")
self.gridlayout.addWidget(self.label_7,0,1,1,1)
self.server_port = QtGui.QSpinBox(self.web_proxy)
self.server_port.setMaximum(65535)
self.server_port.setMinimum(1)
self.server_port.setProperty("value",QtCore.QVariant(80))
self.server_port.setObjectName("server_port")
self.gridlayout.addWidget(self.server_port,1,1,1,1)
self.label = QtGui.QLabel(self.web_proxy)
self.label.setObjectName("label")
self.gridlayout.addWidget(self.label,0,0,1,1)
self.vboxlayout.addWidget(self.web_proxy)
spacerItem = QtGui.QSpacerItem(101,31,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_5.setBuddy(self.password)
self.label_6.setBuddy(self.username)
self.label.setBuddy(self.server_host)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
Form.setTabOrder(self.server_host,self.server_port)
Form.setTabOrder(self.server_port,self.username)
Form.setTabOrder(self.username,self.password)
def retranslateUi(self, Form):
self.web_proxy.setTitle(_("Web Proxy"))
self.label_5.setText(_("Password:"))
self.label_6.setText(_("Username:"))
self.label_7.setText(_("Port:"))
self.label.setText(_("Server address:"))
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_proxy.ui'
#
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,233,252).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.web_proxy = QtGui.QGroupBox(Form)
self.web_proxy.setCheckable(True)
self.web_proxy.setObjectName("web_proxy")
self.gridlayout = QtGui.QGridLayout(self.web_proxy)
self.gridlayout.setMargin(9)
self.gridlayout.setSpacing(2)
self.gridlayout.setObjectName("gridlayout")
self.password = QtGui.QLineEdit(self.web_proxy)
self.password.setEchoMode(QtGui.QLineEdit.Password)
self.password.setObjectName("password")
self.gridlayout.addWidget(self.password,5,0,1,2)
self.username = QtGui.QLineEdit(self.web_proxy)
self.username.setObjectName("username")
self.gridlayout.addWidget(self.username,3,0,1,2)
self.label_5 = QtGui.QLabel(self.web_proxy)
self.label_5.setObjectName("label_5")
self.gridlayout.addWidget(self.label_5,4,0,1,2)
self.label_6 = QtGui.QLabel(self.web_proxy)
self.label_6.setObjectName("label_6")
self.gridlayout.addWidget(self.label_6,2,0,1,2)
self.server_host = QtGui.QLineEdit(self.web_proxy)
self.server_host.setObjectName("server_host")
self.gridlayout.addWidget(self.server_host,1,0,1,1)
self.label_7 = QtGui.QLabel(self.web_proxy)
self.label_7.setObjectName("label_7")
self.gridlayout.addWidget(self.label_7,0,1,1,1)
self.server_port = QtGui.QSpinBox(self.web_proxy)
self.server_port.setMaximum(65535)
self.server_port.setMinimum(1)
self.server_port.setProperty("value",QtCore.QVariant(80))
self.server_port.setObjectName("server_port")
self.gridlayout.addWidget(self.server_port,1,1,1,1)
self.label = QtGui.QLabel(self.web_proxy)
self.label.setObjectName("label")
self.gridlayout.addWidget(self.label,0,0,1,1)
self.vboxlayout.addWidget(self.web_proxy)
spacerItem = QtGui.QSpacerItem(101,31,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem)
self.label_5.setBuddy(self.password)
self.label_6.setBuddy(self.username)
self.label.setBuddy(self.server_host)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
Form.setTabOrder(self.server_host,self.server_port)
Form.setTabOrder(self.server_port,self.username)
Form.setTabOrder(self.username,self.password)
def retranslateUi(self, Form):
self.web_proxy.setTitle(_(u"Web Proxy"))
self.label_5.setText(_(u"Password:"))
self.label_6.setText(_(u"Username:"))
self.label_7.setText(_(u"Port:"))
self.label.setText(_(u"Server address:"))

View File

@@ -1,53 +1,53 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui\options_script.ui'
#
# Created: Tue Oct 24 15:01:06 2006
# by: PyQt4 UI code generator 4-snapshot-20061015
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,273,238).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.enable_tagger_script = QtGui.QGroupBox(Form)
self.enable_tagger_script.setCheckable(True)
self.enable_tagger_script.setObjectName("enable_tagger_script")
self.vboxlayout1 = QtGui.QVBoxLayout(self.enable_tagger_script)
self.vboxlayout1.setMargin(9)
self.vboxlayout1.setSpacing(6)
self.vboxlayout1.setObjectName("vboxlayout1")
self.tagger_script = QtGui.QTextEdit(self.enable_tagger_script)
font = QtGui.QFont(self.tagger_script.font())
font.setFamily("Courier")
font.setPointSize(8)
font.setWeight(50)
font.setItalic(False)
font.setUnderline(False)
font.setStrikeOut(False)
font.setBold(False)
self.tagger_script.setFont(font)
self.tagger_script.setLineWrapMode(QtGui.QTextEdit.NoWrap)
self.tagger_script.setObjectName("tagger_script")
self.vboxlayout1.addWidget(self.tagger_script)
self.vboxlayout.addWidget(self.enable_tagger_script)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
self.enable_tagger_script.setTitle(_(u"Tagger Script"))
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_script.ui'
#
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,222,228).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.enable_tagger_script = QtGui.QGroupBox(Form)
self.enable_tagger_script.setCheckable(True)
self.enable_tagger_script.setObjectName("enable_tagger_script")
self.vboxlayout1 = QtGui.QVBoxLayout(self.enable_tagger_script)
self.vboxlayout1.setMargin(9)
self.vboxlayout1.setSpacing(6)
self.vboxlayout1.setObjectName("vboxlayout1")
self.tagger_script = QtGui.QTextEdit(self.enable_tagger_script)
font = QtGui.QFont(self.tagger_script.font())
font.setFamily("Courier")
font.setPointSize(8)
font.setWeight(50)
font.setItalic(False)
font.setUnderline(False)
font.setStrikeOut(False)
font.setBold(False)
self.tagger_script.setFont(font)
self.tagger_script.setLineWrapMode(QtGui.QTextEdit.NoWrap)
self.tagger_script.setObjectName("tagger_script")
self.vboxlayout1.addWidget(self.tagger_script)
self.vboxlayout.addWidget(self.enable_tagger_script)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
self.enable_tagger_script.setTitle(_(u"Tagger Script"))

View File

@@ -1,109 +1,109 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui\options_tags.ui'
#
# Created: Fri Oct 20 21:31:20 2006
# by: PyQt4 UI code generator 4-snapshot-20061015
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,293,300).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.rename_files = QtGui.QGroupBox(Form)
self.rename_files.setObjectName("rename_files")
self.vboxlayout1 = QtGui.QVBoxLayout(self.rename_files)
self.vboxlayout1.setMargin(9)
self.vboxlayout1.setSpacing(2)
self.vboxlayout1.setObjectName("vboxlayout1")
self.clear_existing_tags = QtGui.QCheckBox(self.rename_files)
self.clear_existing_tags.setObjectName("clear_existing_tags")
self.vboxlayout1.addWidget(self.clear_existing_tags)
self.vboxlayout.addWidget(self.rename_files)
self.rename_files_2 = QtGui.QGroupBox(Form)
self.rename_files_2.setObjectName("rename_files_2")
self.vboxlayout2 = QtGui.QVBoxLayout(self.rename_files_2)
self.vboxlayout2.setMargin(9)
self.vboxlayout2.setSpacing(2)
self.vboxlayout2.setObjectName("vboxlayout2")
self.write_id3v1 = QtGui.QCheckBox(self.rename_files_2)
self.write_id3v1.setObjectName("write_id3v1")
self.vboxlayout2.addWidget(self.write_id3v1)
self.write_id3v23 = QtGui.QCheckBox(self.rename_files_2)
self.write_id3v23.setObjectName("write_id3v23")
self.vboxlayout2.addWidget(self.write_id3v23)
self.label_2 = QtGui.QLabel(self.rename_files_2)
self.label_2.setObjectName("label_2")
self.vboxlayout2.addWidget(self.label_2)
self.hboxlayout = QtGui.QHBoxLayout()
self.hboxlayout.setMargin(0)
self.hboxlayout.setSpacing(6)
self.hboxlayout.setObjectName("hboxlayout")
self.enc_iso88591 = QtGui.QRadioButton(self.rename_files_2)
self.enc_iso88591.setObjectName("enc_iso88591")
self.hboxlayout.addWidget(self.enc_iso88591)
self.enc_utf16 = QtGui.QRadioButton(self.rename_files_2)
self.enc_utf16.setObjectName("enc_utf16")
self.hboxlayout.addWidget(self.enc_utf16)
self.enc_utf8 = QtGui.QRadioButton(self.rename_files_2)
self.enc_utf8.setObjectName("enc_utf8")
self.hboxlayout.addWidget(self.enc_utf8)
spacerItem = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
self.hboxlayout.addItem(spacerItem)
self.vboxlayout2.addLayout(self.hboxlayout)
self.vboxlayout.addWidget(self.rename_files_2)
self.rename_files_3 = QtGui.QGroupBox(Form)
self.rename_files_3.setObjectName("rename_files_3")
self.vboxlayout3 = QtGui.QVBoxLayout(self.rename_files_3)
self.vboxlayout3.setMargin(9)
self.vboxlayout3.setSpacing(2)
self.vboxlayout3.setObjectName("vboxlayout3")
self.strip_ape_tags = QtGui.QCheckBox(self.rename_files_3)
self.strip_ape_tags.setObjectName("strip_ape_tags")
self.vboxlayout3.addWidget(self.strip_ape_tags)
self.vboxlayout.addWidget(self.rename_files_3)
spacerItem1 = QtGui.QSpacerItem(81,21,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
self.rename_files.setTitle(_(u"Common"))
self.clear_existing_tags.setText(_(u"Clear existing tags before writing new tags"))
self.rename_files_2.setTitle(_(u"ID3"))
self.write_id3v1.setText(_(u"Write ID3v1 tags to the files"))
self.write_id3v23.setText(_(u"Write ID3v2 version 2.3 tags (2.4 is default)"))
self.label_2.setText(_(u"Text encoding to use while writing ID3v2 tags:"))
self.enc_iso88591.setText(_(u"ISO-8859-1"))
self.enc_utf16.setText(_(u"UTF-16"))
self.enc_utf8.setText(_(u"UTF-8"))
self.rename_files_3.setTitle(_(u"APE"))
self.strip_ape_tags.setText(_(u"Strip APE tags from MP3 files"))
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/options_tags.ui'
#
# Created: Sat Jan 20 17:45:24 2007
# by: PyQt4 UI code generator 4.1
#
# WARNING! All changes made in this file will be lost!
import sys
from PyQt4 import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(QtCore.QSize(QtCore.QRect(0,0,292,295).size()).expandedTo(Form.minimumSizeHint()))
self.vboxlayout = QtGui.QVBoxLayout(Form)
self.vboxlayout.setMargin(9)
self.vboxlayout.setSpacing(6)
self.vboxlayout.setObjectName("vboxlayout")
self.rename_files = QtGui.QGroupBox(Form)
self.rename_files.setObjectName("rename_files")
self.vboxlayout1 = QtGui.QVBoxLayout(self.rename_files)
self.vboxlayout1.setMargin(9)
self.vboxlayout1.setSpacing(2)
self.vboxlayout1.setObjectName("vboxlayout1")
self.clear_existing_tags = QtGui.QCheckBox(self.rename_files)
self.clear_existing_tags.setObjectName("clear_existing_tags")
self.vboxlayout1.addWidget(self.clear_existing_tags)
self.vboxlayout.addWidget(self.rename_files)
self.rename_files_2 = QtGui.QGroupBox(Form)
self.rename_files_2.setObjectName("rename_files_2")
self.vboxlayout2 = QtGui.QVBoxLayout(self.rename_files_2)
self.vboxlayout2.setMargin(9)
self.vboxlayout2.setSpacing(2)
self.vboxlayout2.setObjectName("vboxlayout2")
self.write_id3v1 = QtGui.QCheckBox(self.rename_files_2)
self.write_id3v1.setObjectName("write_id3v1")
self.vboxlayout2.addWidget(self.write_id3v1)
self.write_id3v23 = QtGui.QCheckBox(self.rename_files_2)
self.write_id3v23.setObjectName("write_id3v23")
self.vboxlayout2.addWidget(self.write_id3v23)
self.label_2 = QtGui.QLabel(self.rename_files_2)
self.label_2.setObjectName("label_2")
self.vboxlayout2.addWidget(self.label_2)
self.hboxlayout = QtGui.QHBoxLayout()
self.hboxlayout.setMargin(0)
self.hboxlayout.setSpacing(6)
self.hboxlayout.setObjectName("hboxlayout")
self.enc_iso88591 = QtGui.QRadioButton(self.rename_files_2)
self.enc_iso88591.setObjectName("enc_iso88591")
self.hboxlayout.addWidget(self.enc_iso88591)
self.enc_utf16 = QtGui.QRadioButton(self.rename_files_2)
self.enc_utf16.setObjectName("enc_utf16")
self.hboxlayout.addWidget(self.enc_utf16)
self.enc_utf8 = QtGui.QRadioButton(self.rename_files_2)
self.enc_utf8.setObjectName("enc_utf8")
self.hboxlayout.addWidget(self.enc_utf8)
spacerItem = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
self.hboxlayout.addItem(spacerItem)
self.vboxlayout2.addLayout(self.hboxlayout)
self.vboxlayout.addWidget(self.rename_files_2)
self.rename_files_3 = QtGui.QGroupBox(Form)
self.rename_files_3.setObjectName("rename_files_3")
self.vboxlayout3 = QtGui.QVBoxLayout(self.rename_files_3)
self.vboxlayout3.setMargin(9)
self.vboxlayout3.setSpacing(2)
self.vboxlayout3.setObjectName("vboxlayout3")
self.strip_ape_tags = QtGui.QCheckBox(self.rename_files_3)
self.strip_ape_tags.setObjectName("strip_ape_tags")
self.vboxlayout3.addWidget(self.strip_ape_tags)
self.vboxlayout.addWidget(self.rename_files_3)
spacerItem1 = QtGui.QSpacerItem(81,21,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
self.vboxlayout.addItem(spacerItem1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
self.rename_files.setTitle(_(u"Common"))
self.clear_existing_tags.setText(_(u"Clear existing tags before writing new tags"))
self.rename_files_2.setTitle(_(u"ID3"))
self.write_id3v1.setText(_(u"Write ID3v1 tags to the files"))
self.write_id3v23.setText(_(u"Write ID3v2 version 2.3 tags (2.4 is default)"))
self.label_2.setText(_(u"Text encoding to use while writing ID3v2 tags:"))
self.enc_iso88591.setText(_(u"ISO-8859-1"))
self.enc_utf16.setText(_(u"UTF-16"))
self.enc_utf8.setText(_(u"UTF-8"))
self.rename_files_3.setTitle(_(u"APE"))
self.strip_ape_tags.setText(_(u"Strip APE tags from MP3 files"))

View File

@@ -1,52 +0,0 @@
# -*- coding: utf-8 -*-
import os
import shutil
import unittest
from picard.plugins.picardmutagen.mutagenext.asf import ASF, UnicodeAttribute
from tempfile import mkstemp
class ASFTest(unittest.TestCase):
def setUp(self):
self.filename = os.path.join("test", "data", "silence.wma")
self.asf = ASF(self.filename)
def test_write(self):
fd, filename = mkstemp(suffix='.wma')
os.close(fd)
try:
shutil.copy(self.filename, filename)
wma = ASF(filename)
wma.tags["WM/Composer"] = UnicodeAttribute("Test!")
wma.save()
wma = ASF(filename)
self.failUnlessEqual(unicode(wma["WM/Composer"][0]), "Test!")
finally:
os.unlink(filename)
def test_is_vbr(self):
self.failUnlessEqual(bool(self.asf["IsVBR"][0]), True)
def test_title(self):
self.failUnlessEqual(unicode(self.asf["Title"][0]), "Enjoy the Silence!")
class TASFInfo(unittest.TestCase):
def setUp(self):
self.file = ASF(os.path.join("test", "data", "silence.wma"))
# def test_length(self):
# self.failUnlessAlmostEqual(self.file.info.length, 0.03, 2)
def test_bitrate(self):
self.failUnlessEqual(self.file.info.bitrate, 64)
def test_sample_rate(self):
self.failUnlessEqual(self.file.info.sample_rate, 44100)
def test_channels(self):
self.failUnlessEqual(self.file.info.channels, 2)

View File

@@ -2,7 +2,7 @@
import unittest
from mutagen import id3
from picard.plugins.picardmutagen.mutagenext import compatid3
from picard.formats.mutagenext import compatid3
class UpdateToV23Test(unittest.TestCase):

View File

@@ -5,8 +5,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>427</width>
<height>426</height>
<width>171</width>
<height>137</height>
</rect>
</property>
<layout class="QVBoxLayout" >

View File

@@ -1,15 +1,12 @@
<ui version="4.0" >
<author></author>
<comment></comment>
<exportmacro></exportmacro>
<class>Form</class>
<widget class="QWidget" name="Form" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>285</width>
<height>211</height>
<width>224</width>
<height>176</height>
</rect>
</property>
<layout class="QVBoxLayout" >
@@ -62,7 +59,6 @@
</item>
</layout>
</widget>
<pixmapfunction></pixmapfunction>
<tabstops>
<tabstop>cd_lookup_device</tabstop>
</tabstops>

View File

@@ -1,15 +1,12 @@
<ui version="4.0" >
<author></author>
<comment></comment>
<exportmacro></exportmacro>
<class>Form</class>
<widget class="QWidget" name="Form" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>324</width>
<height>217</height>
<width>217</width>
<height>155</height>
</rect>
</property>
<layout class="QVBoxLayout" >
@@ -85,7 +82,6 @@
</item>
</layout>
</widget>
<pixmapfunction></pixmapfunction>
<resources/>
<connections/>
</ui>

View File

@@ -5,8 +5,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<width>232</width>
<height>275</height>
</rect>
</property>
<layout class="QVBoxLayout" >

View File

@@ -5,7 +5,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>340</width>
<width>328</width>
<height>313</height>
</rect>
</property>

View File

@@ -5,8 +5,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>401</width>
<height>426</height>
<width>284</width>
<height>388</height>
</rect>
</property>
<layout class="QVBoxLayout" >
@@ -143,8 +143,8 @@
</property>
<property name="sizeHint" >
<size>
<width>383</width>
<height>51</height>
<width>111</width>
<height>76</height>
</size>
</property>
</spacer>

86
ui/options_plugins.ui Normal file
View File

@@ -0,0 +1,86 @@
<ui version="4.0" >
<class>PluginsPage</class>
<widget class="QWidget" name="PluginsPage" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>265</width>
<height>297</height>
</rect>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QSplitter" name="splitter" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<widget class="QGroupBox" name="groupBox_2" >
<property name="title" >
<string>Plugins</string>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QTreeWidget" name="plugins" >
<property name="rootIsDecorated" >
<bool>false</bool>
</property>
<column>
<property name="text" >
<string>Name</string>
</property>
</column>
<column>
<property name="text" >
<string>Author</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBox" >
<property name="title" >
<string>Details</string>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QLabel" name="details" >
<property name="text" >
<string/>
</property>
<property name="alignment" >
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -1,14 +1,11 @@
<ui version="4.0" >
<author></author>
<comment></comment>
<exportmacro></exportmacro>
<class>Form</class>
<widget class="QWidget" name="Form" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>339</width>
<width>233</width>
<height>252</height>
</rect>
</property>
@@ -115,7 +112,6 @@
</item>
</layout>
</widget>
<pixmapfunction></pixmapfunction>
<tabstops>
<tabstop>server_host</tabstop>
<tabstop>server_port</tabstop>

View File

@@ -5,8 +5,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>273</width>
<height>238</height>
<width>222</width>
<height>228</height>
</rect>
</property>
<layout class="QVBoxLayout" >

View File

@@ -5,8 +5,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>293</width>
<height>300</height>
<width>292</width>
<height>295</height>
</rect>
</property>
<layout class="QVBoxLayout" >