Add Force-recheck.
This commit is contained in:
parent
a4b46d0607
commit
094e132ace
|
@ -381,6 +381,10 @@ class Core(
|
||||||
self.plugins.disable_plugin(plugin)
|
self.plugins.disable_plugin(plugin)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def export_force_recheck(self, torrent_id):
|
||||||
|
"""Forces a data recheck on torrent_id"""
|
||||||
|
return self.torrents.force_recheck(torrent_id)
|
||||||
|
|
||||||
# Signals
|
# Signals
|
||||||
def torrent_added(self, torrent_id):
|
def torrent_added(self, torrent_id):
|
||||||
"""Emitted when a new torrent is added to the core"""
|
"""Emitted when a new torrent is added to the core"""
|
||||||
|
|
|
@ -235,8 +235,8 @@ class TorrentManager:
|
||||||
try:
|
try:
|
||||||
# Remove from libtorrent session
|
# Remove from libtorrent session
|
||||||
self.session.remove_torrent(self.torrents[torrent_id].handle, 0)
|
self.session.remove_torrent(self.torrents[torrent_id].handle, 0)
|
||||||
except RuntimeError, KeyError:
|
except (RuntimeError, KeyError), e:
|
||||||
log.warning("Error removing torrent")
|
log.warning("Error removing torrent: %s", e)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -303,6 +303,71 @@ class TorrentManager:
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def force_recheck(self, torrent_id):
|
||||||
|
"""Forces a re-check of the torrent's data"""
|
||||||
|
log.debug("Doing a forced recheck on %s", torrent_id)
|
||||||
|
paused = self.torrents[torrent_id].handle.status().paused
|
||||||
|
### Check for .torrent file prior to removing and make a copy if needed
|
||||||
|
### FIXME
|
||||||
|
|
||||||
|
try:
|
||||||
|
# We start by removing it from the lt session
|
||||||
|
self.session.remove_torrent(self.torrents[torrent_id].handle, 0)
|
||||||
|
except (RuntimeError, KeyError), e:
|
||||||
|
log.warning("Error removing torrent: %s", e)
|
||||||
|
return False
|
||||||
|
# Remove the fastresume file if there
|
||||||
|
self.delete_fastresume(torrent_id)
|
||||||
|
|
||||||
|
# Get the torrent data from the torrent file
|
||||||
|
filename = self.torrents[torrent_id].filename
|
||||||
|
try:
|
||||||
|
log.debug("Attempting to open %s for add.", filename)
|
||||||
|
_file = open(
|
||||||
|
os.path.join(
|
||||||
|
self.config["torrentfiles_location"], filename), "rb")
|
||||||
|
filedump = _file.read()
|
||||||
|
_file.close()
|
||||||
|
except IOError, e:
|
||||||
|
log.warning("Unable to open %s: e", filename, e)
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Bdecode the filedata
|
||||||
|
torrent_filedump = lt.bdecode(filedump)
|
||||||
|
handle = None
|
||||||
|
|
||||||
|
# Next we re-add the torrent
|
||||||
|
# Make sure we have a valid download_location
|
||||||
|
if self.torrents[torrent_id].save_path is None:
|
||||||
|
self.torrents[torrent_id].save_path = \
|
||||||
|
self.config["download_location"]
|
||||||
|
|
||||||
|
# Make sure we are adding it with the correct allocation method.
|
||||||
|
if self.torrents[torrent_id].compact is None:
|
||||||
|
self.torrents[torrent_id].compact = \
|
||||||
|
self.config["compact_allocation"]
|
||||||
|
|
||||||
|
# Set the right storage_mode
|
||||||
|
if self.torrents[torrent_id].compact:
|
||||||
|
storage_mode = lt.storage_mode_t(1)
|
||||||
|
else:
|
||||||
|
storage_mode = lt.storage_mode_t(2)
|
||||||
|
|
||||||
|
try:
|
||||||
|
handle = self.session.add_torrent(
|
||||||
|
lt.torrent_info(torrent_filedump),
|
||||||
|
str(self.torrents[torrent_id].save_path),
|
||||||
|
storage_mode=storage_mode,
|
||||||
|
paused=paused)
|
||||||
|
except RuntimeError, e:
|
||||||
|
log.warning("Error adding torrent: %s", e)
|
||||||
|
|
||||||
|
if not handle or not handle.is_valid():
|
||||||
|
# The torrent was not added to the session
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def load_state(self):
|
def load_state(self):
|
||||||
"""Load the state of the TorrentManager from the torrents.state file"""
|
"""Load the state of the TorrentManager from the torrents.state file"""
|
||||||
state = TorrentManagerState()
|
state = TorrentManagerState()
|
||||||
|
|
|
@ -89,6 +89,9 @@ class GtkUI(ui.UI):
|
||||||
tooltip=_("Queue selected torrents down"),
|
tooltip=_("Queue selected torrents down"),
|
||||||
callback=self.on_queuedown_activate)
|
callback=self.on_queuedown_activate)
|
||||||
|
|
||||||
|
# Add a separator before menu
|
||||||
|
self.menu_sep = self.plugin.add_torrentmenu_separator()
|
||||||
|
|
||||||
# Add the queue menu to the torrent menu
|
# Add the queue menu to the torrent menu
|
||||||
self.queue_menuitem = gtk.ImageMenuItem("Queue")
|
self.queue_menuitem = gtk.ImageMenuItem("Queue")
|
||||||
queue_image = gtk.Image()
|
queue_image = gtk.Image()
|
||||||
|
@ -99,7 +102,8 @@ class GtkUI(ui.UI):
|
||||||
self.plugin.add_torrentmenu_menu(self.queue_menuitem)
|
self.plugin.add_torrentmenu_menu(self.queue_menuitem)
|
||||||
|
|
||||||
def unload_interface(self):
|
def unload_interface(self):
|
||||||
self.plugin.remove_torrentmenu_menu(self.queue_menuitem)
|
self.plugin.remove_torrentmenu_item(self.menu_sep)
|
||||||
|
self.plugin.remove_torrentmenu_item(self.queue_menuitem)
|
||||||
self.plugin.remove_toolbar_button(self.toolbar_sep)
|
self.plugin.remove_toolbar_button(self.toolbar_sep)
|
||||||
self.plugin.remove_toolbar_button(self.toolbutton_up)
|
self.plugin.remove_toolbar_button(self.toolbutton_up)
|
||||||
self.plugin.remove_toolbar_button(self.toolbutton_down)
|
self.plugin.remove_toolbar_button(self.toolbutton_down)
|
||||||
|
|
|
@ -315,6 +315,14 @@ def disable_plugin(plugin):
|
||||||
except (AttributeError, socket.error):
|
except (AttributeError, socket.error):
|
||||||
set_core_uri(None)
|
set_core_uri(None)
|
||||||
|
|
||||||
|
def force_recheck(torrent_ids):
|
||||||
|
"""Forces a data recheck on torrent_ids"""
|
||||||
|
try:
|
||||||
|
for torrent_id in torrent_ids:
|
||||||
|
get_core().force_recheck(torrent_id)
|
||||||
|
except (AttributeError, socket.error):
|
||||||
|
set_core_uri(None)
|
||||||
|
|
||||||
def open_url_in_browser(url):
|
def open_url_in_browser(url):
|
||||||
"""Opens link in the desktop's default browser"""
|
"""Opens link in the desktop's default browser"""
|
||||||
def start_browser():
|
def start_browser():
|
||||||
|
|
|
@ -4,6 +4,28 @@
|
||||||
<glade-interface>
|
<glade-interface>
|
||||||
<widget class="GtkMenu" id="torrent_menu">
|
<widget class="GtkMenu" id="torrent_menu">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkImageMenuItem" id="menuitem_open_folder">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
<property name="label" translatable="yes">_Open Folder</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<signal name="activate" handler="on_menuitem_open_folder_activate"/>
|
||||||
|
<child internal-child="image">
|
||||||
|
<widget class="GtkImage" id="menu-item-image7">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
<property name="stock">gtk-open</property>
|
||||||
|
<property name="icon_size">1</property>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkSeparatorMenuItem" id="separator4">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkImageMenuItem" id="menuitem_pause">
|
<widget class="GtkImageMenuItem" id="menuitem_pause">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -102,5 +124,27 @@
|
||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkSeparatorMenuItem" id="separator3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<widget class="GtkImageMenuItem" id="menuitem_recheck">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
<property name="label" translatable="yes">_Force Re-check</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<signal name="activate" handler="on_menuitem_recheck_activate"/>
|
||||||
|
<child internal-child="image">
|
||||||
|
<widget class="GtkImage" id="menu-item-image6">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||||
|
<property name="stock">gtk-redo</property>
|
||||||
|
<property name="icon_size">1</property>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
</glade-interface>
|
</glade-interface>
|
||||||
|
|
|
@ -92,7 +92,8 @@ class MenuBar(component.Component):
|
||||||
"on_menuitem_edittrackers_activate": \
|
"on_menuitem_edittrackers_activate": \
|
||||||
self.on_menuitem_edittrackers_activate,
|
self.on_menuitem_edittrackers_activate,
|
||||||
"on_menuitem_remove_activate": self.on_menuitem_remove_activate,
|
"on_menuitem_remove_activate": self.on_menuitem_remove_activate,
|
||||||
|
"on_menuitem_recheck_activate": self.on_menuitem_recheck_activate,
|
||||||
|
"on_menuitem_open_folder": self.on_menuitem_open_folder_activate
|
||||||
})
|
})
|
||||||
|
|
||||||
self.change_sensitivity = [
|
self.change_sensitivity = [
|
||||||
|
@ -121,6 +122,12 @@ class MenuBar(component.Component):
|
||||||
self.window.main_glade.get_widget("separatormenuitem").hide()
|
self.window.main_glade.get_widget("separatormenuitem").hide()
|
||||||
self.window.main_glade.get_widget("menuitem_quitdaemon").hide()
|
self.window.main_glade.get_widget("menuitem_quitdaemon").hide()
|
||||||
|
|
||||||
|
def add_torrentmenu_separator(self):
|
||||||
|
sep = gtk.SeparatorMenuItem()
|
||||||
|
self.torrentmenu.append(sep)
|
||||||
|
sep.show()
|
||||||
|
return sep
|
||||||
|
|
||||||
### Callbacks ###
|
### Callbacks ###
|
||||||
|
|
||||||
## File Menu ##
|
## File Menu ##
|
||||||
|
@ -182,6 +189,14 @@ class MenuBar(component.Component):
|
||||||
client.remove_torrent(
|
client.remove_torrent(
|
||||||
component.get("TorrentView").get_selected_torrents())
|
component.get("TorrentView").get_selected_torrents())
|
||||||
|
|
||||||
|
def on_menuitem_recheck_activate(self, data=None):
|
||||||
|
log.debug("on_menuitem_recheck_activate")
|
||||||
|
client.force_recheck(
|
||||||
|
component.get("TorrentView").get_selected_torrents())
|
||||||
|
|
||||||
|
def on_menuitem_open_folder_activate(self, data=None):
|
||||||
|
log.debug("on_menuitem_open_folder")
|
||||||
|
|
||||||
## View Menu ##
|
## View Menu ##
|
||||||
def on_menuitem_toolbar_toggled(self, value):
|
def on_menuitem_toolbar_toggled(self, value):
|
||||||
log.debug("on_menuitem_toolbar_toggled")
|
log.debug("on_menuitem_toolbar_toggled")
|
||||||
|
|
|
@ -74,9 +74,12 @@ class PluginManager(deluge.pluginmanagerbase.PluginManagerBase,
|
||||||
def add_torrentmenu_menu(self, *args):
|
def add_torrentmenu_menu(self, *args):
|
||||||
return component.get("MenuBar").torrentmenu.append(*args)
|
return component.get("MenuBar").torrentmenu.append(*args)
|
||||||
|
|
||||||
def remove_torrentmenu_menu(self, *args):
|
def remove_torrentmenu_item(self, *args):
|
||||||
return component.get("MenuBar").torrentmenu.remove(*args)
|
return component.get("MenuBar").torrentmenu.remove(*args)
|
||||||
|
|
||||||
|
def add_torrentmenu_separator(self):
|
||||||
|
return component.get("MenuBar").add_torrentmenu_separator()
|
||||||
|
|
||||||
def update_torrent_view(self, *args):
|
def update_torrent_view(self, *args):
|
||||||
return component.get("TorrentView").update(*args)
|
return component.get("TorrentView").update(*args)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue