1
# Copyright 2004-2005 Joe Wreschnig, Michael Urman
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License version 2 as
5
# published by the Free Software Foundation
7
# $Id: _match.py 4330 2008-09-14 03:19:26Z piman $
11
TIME_KEYS = ["added", "mtime", "lastplayed", "laststarted"]
13
# True if the object matches any of its REs.
15
def __init__(self, res):
18
def search(self, data):
20
if re.search(data): return True
24
return "<Union %r>" % self.__res
26
# True if the object matches all of its REs.
28
def __init__(self, res):
31
def search(self, data):
33
if not re.search(data): return False
37
return "<Inter %r>" % self.__res
39
# True if the object doesn't match its RE.
41
def __init__(self, re):
44
def search(self, data):
45
return not self.__re.search(data)
48
return "<Neg %r>" % self.__re
52
def __init__(self, tag, op, value):
53
if isinstance(tag, unicode): self.__tag = tag.encode("utf-8")
54
else: self.__tag = tag
55
self.__ftag = "~#" + self.__tag
56
self.__shortcircuit = tag.startswith("playlist")
61
if self.__op == ">": self.__op = "<"
62
elif self.__op == "<": self.__op = ">"
63
elif self.__op == "<=": self.__op = ">="
64
elif self.__op == ">=": self.__op = "<="
66
if value in ["now"]: value = int(time.time())
67
elif value in ["today"]: value = int(time.time() - 24 * 60 * 60)
70
try: value = round(float(parts[0]), 2)
73
hms = map(int, value.split(":"))
81
unit = parts[1].strip("s")
82
if unit == "minute": value *= 60
83
if unit == "hour": value *= 60 * 60
84
elif unit == "day": value *= 24 * 60 * 60
85
elif unit == "week": value *= 7 * 24 * 60 * 60
86
elif unit == "year": value *= 365 * 24 * 60 * 60
89
value = int(time.time() - value)
92
def search(self, data):
93
if self.__shortcircuit: num = data.get(self.__ftag, 0)
94
else: num = data(self.__ftag, 0)
96
if self.__op == ">": return num > self.__value
97
elif self.__op == "<": return num < self.__value
98
elif self.__op == "=": return num == self.__value
99
elif self.__op == ">=": return num >= self.__value
100
elif self.__op == "<=": return num <= self.__value
101
elif self.__op == "!=": return num != self.__value
102
else: raise ValueError("Unknown operator %s" % self.__op)
105
return "<Numcmp tag=%r, op=%r, value=%d>"%(
106
self.__tag, self.__op, self.__value)
108
# See if a property of the object matches its RE.
111
# Shorthand for common tags.
112
ABBRS = { "a": "artist",
119
def __init__(self, names, res):
120
self.__names = [Tag.ABBRS.get(n.lower(), n.lower()) for n in names]
122
if not isinstance(self.__res, list): self.__res = [self.__res]
123
if len([name for name in self.__names if name.startswith('~')]):
124
self.search = self.__search_synth
126
def __search_synth(self, data):
127
for name in self.__names:
128
for re in self.__res:
129
if name.startswith('~'):
130
if re.search(data(name, "")):
132
elif re.search(data.get(name, data.get("~"+name, ""))):
136
def search(self, data):
137
for name in self.__names:
138
for re in self.__res:
139
if re.search(data.get(name, data.get("~"+name, ""))):
144
return ("<Tag names=%r, res=%r>" % (self.__names, self.__res))