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):
|
||||
pass
|
||||
|
||||
|
||||
class FilterManager(component.Component):
|
||||
"""FilterManager
|
||||
|
||||
@ -60,7 +59,10 @@ class FilterManager(component.Component):
|
||||
self.torrents = core.torrents
|
||||
self.registered_filters = {}
|
||||
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):
|
||||
"""
|
||||
@ -101,30 +103,45 @@ class FilterManager(component.Component):
|
||||
|
||||
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):
|
||||
"""
|
||||
returns {field: [(value,count)] }
|
||||
for use in sidebar.
|
||||
"""
|
||||
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..
|
||||
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):
|
||||
status = status_func(torrent_id, self.filter_tree_fields) #status={key:value}
|
||||
for field in self.filter_tree_fields:
|
||||
status = status_func(torrent_id, tree_keys) #status={key:value}
|
||||
for field in tree_keys:
|
||||
value = status[field]
|
||||
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())
|
||||
|
||||
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.plugins.corepluginbase import CorePluginBase
|
||||
from deluge.configmanager import ConfigManager
|
||||
|
||||
import deluge.component as component
|
||||
from urlparse import urlparse
|
||||
|
||||
import traceback
|
||||
@ -111,6 +111,10 @@ class Core(CorePluginBase):
|
||||
#todo: register to torrent_added event.
|
||||
self.plugin.register_hook("post_torrent_add", self.post_torrent_add)
|
||||
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..")
|
||||
|
||||
def disable(self):
|
||||
@ -168,131 +172,9 @@ class Core(CorePluginBase):
|
||||
if changed:
|
||||
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):
|
||||
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:
|
||||
def export_add(self, label_id):
|
||||
"""add a label
|
||||
@ -410,11 +292,7 @@ class Core(CorePluginBase):
|
||||
return dict ( (k,self.config.get(k) ) for k in CORE_OPTIONS)
|
||||
|
||||
def export_set_global_options(self, options):
|
||||
"""global_options:
|
||||
{
|
||||
"hide_zero":bool() #label_filter_items only returns items with more than 0 hits.
|
||||
}
|
||||
"""
|
||||
"""global_options:"""
|
||||
for key in CORE_OPTIONS:
|
||||
if options.has_key(key):
|
||||
self.config.set(key, options[key])
|
||||
|
@ -8,35 +8,6 @@ print sclient.get_enabled_plugins()
|
||||
if not "label" in sclient.get_enabled_plugins():
|
||||
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.
|
||||
print "#init labels"
|
||||
@ -51,16 +22,7 @@ sclient.label_add("test")
|
||||
print "#set"
|
||||
sclient.label_set_torrent(id,"test")
|
||||
|
||||
print "#len(sclient.label_get_filtered_ids({'label':'test'} ))"
|
||||
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 scleint.get_torrents_status({"label":test},"name")
|
||||
|
||||
|
||||
print "#set options"
|
||||
|
Loading…
x
Reference in New Issue
Block a user