mirror of
https://github.com/codex-storage/deluge.git
synced 2025-02-25 01:28:24 +00:00
filter_tree:add label-plugin and init_func
This commit is contained in:
parent
aa4ed4a6c6
commit
d8b0fb5885
@ -48,7 +48,6 @@ def filter_keyword(torrent_ids, values):
|
|||||||
def filter_state_active(self, torrent_ids, value):
|
def filter_state_active(self, torrent_ids, value):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class FilterManager(component.Component):
|
class FilterManager(component.Component):
|
||||||
"""FilterManager
|
"""FilterManager
|
||||||
|
|
||||||
@ -60,7 +59,10 @@ class FilterManager(component.Component):
|
|||||||
self.torrents = core.torrents
|
self.torrents = core.torrents
|
||||||
self.registered_filters = {}
|
self.registered_filters = {}
|
||||||
self.register_filter("keyword", filter_keyword)
|
self.register_filter("keyword", filter_keyword)
|
||||||
self.filter_tree_fields = ["state","tracker_host"]
|
self.tree_fields = {}
|
||||||
|
|
||||||
|
self.register_tree_field("state", self._init_state_tree)
|
||||||
|
self.register_tree_field("tracker_host")
|
||||||
|
|
||||||
def filter_torrent_ids(self, filter_dict):
|
def filter_torrent_ids(self, filter_dict):
|
||||||
"""
|
"""
|
||||||
@ -101,30 +103,45 @@ class FilterManager(component.Component):
|
|||||||
|
|
||||||
return torrent_ids
|
return torrent_ids
|
||||||
|
|
||||||
def register_filter(self, id, filter_func, filter_value = None):
|
|
||||||
self.registered_filters[id] = filter_func
|
|
||||||
|
|
||||||
def deregister_filter(self, id):
|
|
||||||
del self.registered_filters[id]
|
|
||||||
|
|
||||||
def get_filter_tree(self):
|
def get_filter_tree(self):
|
||||||
"""
|
"""
|
||||||
returns {field: [(value,count)] }
|
returns {field: [(value,count)] }
|
||||||
for use in sidebar.
|
for use in sidebar.
|
||||||
"""
|
"""
|
||||||
torrent_ids = self.torrents.get_torrent_list()
|
torrent_ids = self.torrents.get_torrent_list()
|
||||||
items = dict( (field,{}) for field in self.filter_tree_fields)
|
|
||||||
status_func = self.core.export_get_torrent_status #premature optimalisation..
|
status_func = self.core.export_get_torrent_status #premature optimalisation..
|
||||||
|
tree_keys = self.tree_fields.keys()
|
||||||
|
items = dict( (field, init_func()) for field, init_func in self.tree_fields.iteritems())
|
||||||
|
|
||||||
items["state"]["All"] = len(torrent_ids)
|
#count status fields.
|
||||||
|
|
||||||
for torrent_id in list(torrent_ids):
|
for torrent_id in list(torrent_ids):
|
||||||
status = status_func(torrent_id, self.filter_tree_fields) #status={key:value}
|
status = status_func(torrent_id, tree_keys) #status={key:value}
|
||||||
for field in self.filter_tree_fields:
|
for field in tree_keys:
|
||||||
value = status[field]
|
value = status[field]
|
||||||
items[field][value] = items[field].get(value, 0) + 1
|
items[field][value] = items[field].get(value, 0) + 1
|
||||||
|
|
||||||
for field in self.filter_tree_fields:
|
for field in tree_keys:
|
||||||
items[field] = sorted(items[field].iteritems())
|
items[field] = sorted(items[field].iteritems())
|
||||||
|
|
||||||
return items
|
return items
|
||||||
|
|
||||||
|
def _init_state_tree(self):
|
||||||
|
return {"All":len(self.torrents.get_torrent_list()),
|
||||||
|
"Downloading":0,
|
||||||
|
"Seeding":0,
|
||||||
|
"Paused":0,
|
||||||
|
"Checking":0,
|
||||||
|
"Queued":0,
|
||||||
|
"Error":0}
|
||||||
|
|
||||||
|
def register_filter(self, id, filter_func, filter_value = None):
|
||||||
|
self.registered_filters[id] = filter_func
|
||||||
|
|
||||||
|
def deregister_filter(self, id):
|
||||||
|
del self.registered_filters[id]
|
||||||
|
|
||||||
|
def register_tree_field(self, field, init_func = lambda : {}):
|
||||||
|
self.tree_fields[field] = init_func
|
||||||
|
|
||||||
|
def deregister_tree_field(self, field):
|
||||||
|
del self.tree_fields[field]
|
||||||
|
@ -37,7 +37,7 @@ adds a status field for tracker.
|
|||||||
from deluge.log import LOG as log
|
from deluge.log import LOG as log
|
||||||
from deluge.plugins.corepluginbase import CorePluginBase
|
from deluge.plugins.corepluginbase import CorePluginBase
|
||||||
from deluge.configmanager import ConfigManager
|
from deluge.configmanager import ConfigManager
|
||||||
|
import deluge.component as component
|
||||||
from urlparse import urlparse
|
from urlparse import urlparse
|
||||||
|
|
||||||
import traceback
|
import traceback
|
||||||
@ -111,6 +111,10 @@ class Core(CorePluginBase):
|
|||||||
#todo: register to torrent_added event.
|
#todo: register to torrent_added event.
|
||||||
self.plugin.register_hook("post_torrent_add", self.post_torrent_add)
|
self.plugin.register_hook("post_torrent_add", self.post_torrent_add)
|
||||||
self.plugin.register_hook("post_torrent_remove", self.post_torrent_remove)
|
self.plugin.register_hook("post_torrent_remove", self.post_torrent_remove)
|
||||||
|
|
||||||
|
#register tree:
|
||||||
|
component.get("FilterManager").register_tree_field("label")
|
||||||
|
|
||||||
log.debug("Label plugin enabled..")
|
log.debug("Label plugin enabled..")
|
||||||
|
|
||||||
def disable(self):
|
def disable(self):
|
||||||
@ -168,131 +172,9 @@ class Core(CorePluginBase):
|
|||||||
if changed:
|
if changed:
|
||||||
self.config.save()
|
self.config.save()
|
||||||
|
|
||||||
|
|
||||||
## Filters ##
|
|
||||||
def filter_state(self, torrents, value):
|
|
||||||
"in/out: a list of torrent objects."
|
|
||||||
for t in torrents:
|
|
||||||
log.debug("s=%s" % t.state)
|
|
||||||
return [t for t in torrents if t.state == value]
|
|
||||||
|
|
||||||
def filter_tracker(self, torrents, value):
|
|
||||||
"in/out: a list of torrent objects."
|
|
||||||
return [t for t in torrents if t.get_tracker_host() == value]
|
|
||||||
|
|
||||||
def filter_label(self, torrents, value):
|
|
||||||
"in/out: a list of torrent objects."
|
|
||||||
if value == NO_LABEL:
|
|
||||||
value = None
|
|
||||||
log.debug("NO_LABEL")
|
|
||||||
return [t for t in torrents if self.torrent_labels.get(t.torrent_id) == value]
|
|
||||||
|
|
||||||
def filter_keyword(self, torrents, value):
|
|
||||||
value = value.lower().strip()
|
|
||||||
"in/out: a list of torrent objects."
|
|
||||||
return [t for t in torrents if value in t.filename.lower()]
|
|
||||||
|
|
||||||
## Items ##
|
|
||||||
def get_state_filter_items(self):
|
|
||||||
states = dict([(state, 0) for state in KNOWN_STATES])
|
|
||||||
state_order = list(KNOWN_STATES)
|
|
||||||
|
|
||||||
#state-simple:
|
|
||||||
for t in self.torrents.values():
|
|
||||||
if not t.state in state_order:
|
|
||||||
state_order.append(t.state)
|
|
||||||
states[t.state] = 0
|
|
||||||
states[t.state] +=1
|
|
||||||
#specialized-state:
|
|
||||||
#todo: traffic.
|
|
||||||
|
|
||||||
if self.config["hide_zero_hits"]:
|
|
||||||
for state in set(KNOWN_STATES):
|
|
||||||
#log.debug(states.keys())
|
|
||||||
if states[state] == 0 :
|
|
||||||
#del states[state]
|
|
||||||
state_order.remove(state)
|
|
||||||
|
|
||||||
#return the filters sorted by STATES + add unknown states.
|
|
||||||
return ([("All",len(self.torrents))] +
|
|
||||||
[(state, states[state]) for state in state_order]
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_tracker_filter_items(self):
|
|
||||||
#trackers:
|
|
||||||
trackers = {}
|
|
||||||
for t in self.torrents.values():
|
|
||||||
tracker = t.get_tracker_host()
|
|
||||||
if not tracker in trackers:
|
|
||||||
trackers[tracker] = 0
|
|
||||||
trackers[tracker] +=1
|
|
||||||
|
|
||||||
return [(tracker , trackers[tracker]) for tracker in sorted(trackers.keys())]
|
|
||||||
|
|
||||||
def get_label_filter_items(self):
|
|
||||||
no_label = 0
|
|
||||||
labels = dict([(label_id, 0) for label_id in self.labels])
|
|
||||||
for torrent_id in self.torrents:
|
|
||||||
label_id = self.torrent_labels.get(torrent_id)
|
|
||||||
if label_id:
|
|
||||||
labels[label_id] +=1
|
|
||||||
else:
|
|
||||||
no_label +=1
|
|
||||||
|
|
||||||
#show all labels,even if hide-zero-hits is true
|
|
||||||
"""
|
|
||||||
if self.config["hide_zero_hits"]:
|
|
||||||
for label , count in list(labels.iteritems()):
|
|
||||||
if count == 0:
|
|
||||||
del labels[label]
|
|
||||||
"""
|
|
||||||
|
|
||||||
return [(NO_LABEL, no_label)] + [(label_id, labels[label_id]) for label_id in sorted(labels.keys())]
|
|
||||||
|
|
||||||
## Public ##
|
|
||||||
def export_filter_items(self):
|
|
||||||
"""
|
|
||||||
returns :
|
|
||||||
{
|
|
||||||
"CATEGORY" : [("filter_value",count), ...] , ...
|
|
||||||
}
|
|
||||||
--
|
|
||||||
category's : ["state","tracker","label"]
|
|
||||||
"""
|
|
||||||
result = {}
|
|
||||||
|
|
||||||
if self.config.get("show_states"):
|
|
||||||
result[STATE] = self.get_state_filter_items()
|
|
||||||
if self.config.get("show_trackers"):
|
|
||||||
result[TRACKER] = self.get_tracker_filter_items()
|
|
||||||
if self.config.get("show_labels"):
|
|
||||||
result[LABEL] = self.get_label_filter_items()
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
def export_get_labels(self):
|
def export_get_labels(self):
|
||||||
return sorted(self.labels.keys())
|
return sorted(self.labels.keys())
|
||||||
|
|
||||||
def export_get_filtered_ids(self, filter_dict):
|
|
||||||
"""
|
|
||||||
input : {"filter_cat":"filter_value",..}
|
|
||||||
returns : a list of torrent_id's
|
|
||||||
"""
|
|
||||||
torrents = self.torrents.values()
|
|
||||||
if KEYWORD in filter_dict:
|
|
||||||
torrents = self.filter_keyword(torrents, filter_dict[KEYWORD])
|
|
||||||
|
|
||||||
if STATE in filter_dict and filter_dict[STATE] <> "":
|
|
||||||
torrents = self.filter_state(torrents, filter_dict[STATE])
|
|
||||||
|
|
||||||
if TRACKER in filter_dict:
|
|
||||||
torrents = self.filter_tracker(torrents, filter_dict[TRACKER])
|
|
||||||
|
|
||||||
if LABEL in filter_dict:
|
|
||||||
torrents = self.filter_label(torrents, filter_dict[LABEL])
|
|
||||||
return [t.torrent_id for t in torrents]
|
|
||||||
|
|
||||||
|
|
||||||
#Labels:
|
#Labels:
|
||||||
def export_add(self, label_id):
|
def export_add(self, label_id):
|
||||||
"""add a label
|
"""add a label
|
||||||
@ -410,11 +292,7 @@ class Core(CorePluginBase):
|
|||||||
return dict ( (k,self.config.get(k) ) for k in CORE_OPTIONS)
|
return dict ( (k,self.config.get(k) ) for k in CORE_OPTIONS)
|
||||||
|
|
||||||
def export_set_global_options(self, options):
|
def export_set_global_options(self, options):
|
||||||
"""global_options:
|
"""global_options:"""
|
||||||
{
|
|
||||||
"hide_zero":bool() #label_filter_items only returns items with more than 0 hits.
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
for key in CORE_OPTIONS:
|
for key in CORE_OPTIONS:
|
||||||
if options.has_key(key):
|
if options.has_key(key):
|
||||||
self.config.set(key, options[key])
|
self.config.set(key, options[key])
|
||||||
|
@ -8,35 +8,6 @@ print sclient.get_enabled_plugins()
|
|||||||
if not "label" in sclient.get_enabled_plugins():
|
if not "label" in sclient.get_enabled_plugins():
|
||||||
sclient.enable_plugin("label")
|
sclient.enable_plugin("label")
|
||||||
|
|
||||||
#test filter items.
|
|
||||||
print "# label_filter_items()"
|
|
||||||
for cat,filters in sclient.label_filter_items().iteritems():
|
|
||||||
print "-- %s --" % cat
|
|
||||||
for filter in filters:
|
|
||||||
print " * %s (%s)" % (filter[0],filter[1])
|
|
||||||
|
|
||||||
# test filtering
|
|
||||||
print "#len(sclient.label_get_filtered_ids({'tracker':'tracker.aelitis.com'} ))"
|
|
||||||
print len(sclient.label_get_filtered_ids({'tracker':'tracker.aelitis.com'} ))
|
|
||||||
|
|
||||||
print "#len(sclient.label_get_filtered_ids({'state':'Paused'} ))"
|
|
||||||
print len(sclient.label_get_filtered_ids({'state':'Paused'} ))
|
|
||||||
|
|
||||||
|
|
||||||
print "#len(sclient.label_get_filtered_ids({'keyword':'az'} ))"
|
|
||||||
print len(sclient.label_get_filtered_ids({'keyword':'az'} ))
|
|
||||||
|
|
||||||
|
|
||||||
print "#len(sclient.label_get_filtered_ids({'state':'Paused','tracker':'tracker.aelitis.com'} ))"
|
|
||||||
print len(sclient.label_get_filtered_ids({'state':'Paused','tracker':'tracker.aelitis.com'} ))
|
|
||||||
|
|
||||||
print "#test status-fields:"
|
|
||||||
ids = sclient.get_session_state()
|
|
||||||
|
|
||||||
torrents = sclient.get_torrents_status({"id":ids},['name', 'tracker_host', 'label'])
|
|
||||||
|
|
||||||
for id,torrent in torrents.iteritems():
|
|
||||||
print id, torrent
|
|
||||||
|
|
||||||
#test labels.
|
#test labels.
|
||||||
print "#init labels"
|
print "#init labels"
|
||||||
@ -51,16 +22,7 @@ sclient.label_add("test")
|
|||||||
print "#set"
|
print "#set"
|
||||||
sclient.label_set_torrent(id,"test")
|
sclient.label_set_torrent(id,"test")
|
||||||
|
|
||||||
print "#len(sclient.label_get_filtered_ids({'label':'test'} ))"
|
print scleint.get_torrents_status({"label":test},"name")
|
||||||
print len(sclient.label_get_filtered_ids({'label':'test'} ))
|
|
||||||
|
|
||||||
#test filter items.
|
|
||||||
print "# label_filter_items()"
|
|
||||||
for cat,filters in sclient.label_filter_items().iteritems():
|
|
||||||
if cat == "label":
|
|
||||||
print "-- %s --" % cat
|
|
||||||
for filter in filters:
|
|
||||||
print " * %s (%s)" % (filter[0],filter[1])
|
|
||||||
|
|
||||||
|
|
||||||
print "#set options"
|
print "#set options"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user