mirror of
https://git.deluge-torrent.org/deluge
synced 2025-08-03 23:18:40 +00:00
Updates
This commit is contained in:
parent
7c36587f23
commit
2eb455179b
8 changed files with 127 additions and 51 deletions
|
@ -51,6 +51,8 @@ class Config:
|
||||||
# Load the config from file in the config_dir
|
# Load the config from file in the config_dir
|
||||||
self.config_file = deluge.common.get_config_dir(filename)
|
self.config_file = deluge.common.get_config_dir(filename)
|
||||||
self.load(self.config_file)
|
self.load(self.config_file)
|
||||||
|
# Save
|
||||||
|
self.save()
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
log.debug("Config object deconstructing..")
|
log.debug("Config object deconstructing..")
|
||||||
|
@ -90,6 +92,8 @@ class Config:
|
||||||
# Sets the "key" with "value" in the config dict
|
# Sets the "key" with "value" in the config dict
|
||||||
log.debug("Setting '%s' to %s", key, value)
|
log.debug("Setting '%s' to %s", key, value)
|
||||||
self.config[key] = value
|
self.config[key] = value
|
||||||
|
# Whenever something is set, we should save
|
||||||
|
self.save()
|
||||||
|
|
||||||
def get(self, key):
|
def get(self, key):
|
||||||
# Attempts to get the "key" value and returns None if the key is
|
# Attempts to get the "key" value and returns None if the key is
|
||||||
|
@ -106,4 +110,4 @@ class Config:
|
||||||
return self.config[key]
|
return self.config[key]
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
self.config[key] = value
|
self.set(key, value)
|
||||||
|
|
|
@ -68,9 +68,6 @@ class Core(dbus.service.Object):
|
||||||
def __init__(self, path="/org/deluge_torrent/Core"):
|
def __init__(self, path="/org/deluge_torrent/Core"):
|
||||||
log.debug("Core init..")
|
log.debug("Core init..")
|
||||||
|
|
||||||
# Start the TorrentManager
|
|
||||||
self.torrents = TorrentManager()
|
|
||||||
|
|
||||||
# Setup DBUS
|
# Setup DBUS
|
||||||
bus_name = dbus.service.BusName("org.deluge_torrent.Deluge",
|
bus_name = dbus.service.BusName("org.deluge_torrent.Deluge",
|
||||||
bus=dbus.SessionBus())
|
bus=dbus.SessionBus())
|
||||||
|
@ -87,6 +84,9 @@ class Core(dbus.service.Object):
|
||||||
self.session.listen_on(self.config.get("listen_ports")[0],
|
self.session.listen_on(self.config.get("listen_ports")[0],
|
||||||
self.config.get("listen_ports")[1])
|
self.config.get("listen_ports")[1])
|
||||||
|
|
||||||
|
# Start the TorrentManager
|
||||||
|
self.torrents = TorrentManager(self.session)
|
||||||
|
|
||||||
log.debug("Starting main loop..")
|
log.debug("Starting main loop..")
|
||||||
self.loop = gobject.MainLoop()
|
self.loop = gobject.MainLoop()
|
||||||
self.loop.run()
|
self.loop.run()
|
||||||
|
@ -105,56 +105,27 @@ class Core(dbus.service.Object):
|
||||||
This requires the torrents filename and a dump of it's content
|
This requires the torrents filename and a dump of it's content
|
||||||
"""
|
"""
|
||||||
log.info("Adding torrent: %s", filename)
|
log.info("Adding torrent: %s", filename)
|
||||||
|
torrent_id = self.torrents.add(filename, filedump)
|
||||||
# Convert the filedump data array into a string of bytes
|
if torrent_id is not None:
|
||||||
filedump = "".join(chr(b) for b in filedump)
|
# Emit the torrent_added signal
|
||||||
|
self.torrent_added(torrent_id)
|
||||||
# Bdecode the filedata sent from the UI
|
else:
|
||||||
torrent_filedump = lt.bdecode(filedump)
|
|
||||||
handle = None
|
|
||||||
try:
|
|
||||||
handle = self.session.add_torrent(lt.torrent_info(torrent_filedump),
|
|
||||||
self.config["download_location"],
|
|
||||||
self.config["compact_allocation"])
|
|
||||||
except RuntimeError:
|
|
||||||
log.warning("Error adding torrent")
|
|
||||||
|
|
||||||
if not handle or not handle.is_valid():
|
|
||||||
# The torrent was not added to the session
|
|
||||||
# Emit the torrent_add_failed signal
|
|
||||||
self.torrent_add_failed()
|
self.torrent_add_failed()
|
||||||
return
|
|
||||||
|
|
||||||
# Write the .torrent file to the torrent directory
|
|
||||||
log.debug("Attemping to save torrent file: %s", filename)
|
|
||||||
try:
|
|
||||||
f = open(os.path.join(self.config["torrentfiles_location"],
|
|
||||||
filename),
|
|
||||||
"wb")
|
|
||||||
f.write(filedump)
|
|
||||||
f.close()
|
|
||||||
except IOError:
|
|
||||||
log.warning("Unable to save torrent file: %s", filename)
|
|
||||||
|
|
||||||
# Add the torrent to the torrentmanager
|
|
||||||
torrent_id = self.torrents.add(handle)
|
|
||||||
|
|
||||||
# Emit the torrent_added signal
|
|
||||||
self.torrent_added(torrent_id)
|
|
||||||
|
|
||||||
@dbus.service.method(dbus_interface="org.deluge_torrent.Deluge",
|
@dbus.service.method(dbus_interface="org.deluge_torrent.Deluge",
|
||||||
in_signature="s", out_signature="")
|
in_signature="s", out_signature="")
|
||||||
def remove_torrent(self, torrent_id):
|
def remove_torrent(self, torrent_id):
|
||||||
log.debug("Removing torrent %s from the core.", torrent_id)
|
log.debug("Removing torrent %s from the core.", torrent_id)
|
||||||
try:
|
if self.torrents.remove(torrent_id):
|
||||||
# Remove from libtorrent session
|
|
||||||
self.session.remove_torrent(self.torrents[torrent_id].handle)
|
|
||||||
# Remove from TorrentManager
|
|
||||||
self.torrents.remove(torrent_id)
|
|
||||||
# Emit the torrent_removed signal
|
# Emit the torrent_removed signal
|
||||||
self.torrent_removed(torrent_id)
|
self.torrent_removed(torrent_id)
|
||||||
except RuntimeError, KeyError:
|
|
||||||
log.warning("Error removing torrent")
|
@dbus.service.method(dbus_interface="org.deluge_torrent.Deluge",
|
||||||
|
in_signature="s", out_signature="")
|
||||||
|
def pause_torrent(self, torrent_id):
|
||||||
|
log.debug("Pausing torrent %s", torrent_id)
|
||||||
|
if self.torrents.pause(torrent_id):
|
||||||
|
self.torrent_paused(torrent_id)
|
||||||
|
|
||||||
@dbus.service.method(dbus_interface="org.deluge_torrent.Deluge",
|
@dbus.service.method(dbus_interface="org.deluge_torrent.Deluge",
|
||||||
in_signature="s", out_signature="(sxi)")
|
in_signature="s", out_signature="(sxi)")
|
||||||
|
@ -236,3 +207,9 @@ class Core(dbus.service.Object):
|
||||||
def torrent_queue_changed(self):
|
def torrent_queue_changed(self):
|
||||||
"""Emitted when a torrent queue position is changed"""
|
"""Emitted when a torrent queue position is changed"""
|
||||||
log.debug("torrent_queue_changed signal emitted")
|
log.debug("torrent_queue_changed signal emitted")
|
||||||
|
|
||||||
|
@dbus.service.signal(dbus_interface="org.deluge_torrent.Deluge",
|
||||||
|
signature="s")
|
||||||
|
def torrent_paused(self, torrent_id):
|
||||||
|
"""Emitted when a torrent is paused"""
|
||||||
|
log.debug("torrent_paused signal emitted")
|
||||||
|
|
|
@ -39,7 +39,9 @@ import deluge.libtorrent as lt
|
||||||
log = logging.getLogger("deluge")
|
log = logging.getLogger("deluge")
|
||||||
|
|
||||||
class Torrent:
|
class Torrent:
|
||||||
def __init__(self, handle, queue):
|
def __init__(self, filename, handle, queue):
|
||||||
|
# Set the filename
|
||||||
|
self.filename = filename
|
||||||
# Set the libtorrent handle
|
# Set the libtorrent handle
|
||||||
self.handle = handle
|
self.handle = handle
|
||||||
# Set the queue this torrent belongs too
|
# Set the queue this torrent belongs too
|
||||||
|
@ -50,6 +52,10 @@ class Torrent:
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
self.queue.remove(self.torrent_id)
|
self.queue.remove(self.torrent_id)
|
||||||
|
|
||||||
|
def get_state(self):
|
||||||
|
"""Returns the state of this torrent for saving to the session state"""
|
||||||
|
return (self.torrent_id, self.filename)
|
||||||
|
|
||||||
def get_eta(self):
|
def get_eta(self):
|
||||||
"""Returns the ETA in seconds for this torrent"""
|
"""Returns the ETA in seconds for this torrent"""
|
||||||
left = self.handle.status().total_wanted \
|
left = self.handle.status().total_wanted \
|
||||||
|
|
|
@ -32,16 +32,25 @@
|
||||||
# statement from all source files in the program, then also delete it here.
|
# statement from all source files in the program, then also delete it here.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import pickle
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
import deluge.libtorrent as lt
|
||||||
|
|
||||||
|
import deluge.common
|
||||||
|
from deluge.config import Config
|
||||||
from deluge.core.torrent import Torrent
|
from deluge.core.torrent import Torrent
|
||||||
from deluge.core.torrentqueue import TorrentQueue
|
from deluge.core.torrentqueue import TorrentQueue
|
||||||
|
from deluge.core.torrentmanagerstate import TorrentManagerState, TorrentState
|
||||||
|
|
||||||
# Get the logger
|
# Get the logger
|
||||||
log = logging.getLogger("deluge")
|
log = logging.getLogger("deluge")
|
||||||
|
|
||||||
class TorrentManager:
|
class TorrentManager:
|
||||||
def __init__(self):
|
def __init__(self, session):
|
||||||
log.debug("TorrentManager init..")
|
log.debug("TorrentManager init..")
|
||||||
|
# Set the libtorrent session
|
||||||
|
self.session = session
|
||||||
# Create the torrents dict { torrent_id: Torrent }
|
# Create the torrents dict { torrent_id: Torrent }
|
||||||
self.torrents = {}
|
self.torrents = {}
|
||||||
self.queue = TorrentQueue()
|
self.queue = TorrentQueue()
|
||||||
|
@ -50,10 +59,42 @@ class TorrentManager:
|
||||||
"""Return the Torrent with torrent_id"""
|
"""Return the Torrent with torrent_id"""
|
||||||
return self.torrents[torrent_id]
|
return self.torrents[torrent_id]
|
||||||
|
|
||||||
def add(self, handle):
|
def add(self, filename, filedump):
|
||||||
"""Add a torrent to the manager and returns it's torrent_id"""
|
"""Add a torrent to the manager and returns it's torrent_id"""
|
||||||
|
# Get the core config
|
||||||
|
config = Config("core.conf")
|
||||||
|
|
||||||
|
# Convert the filedump data array into a string of bytes
|
||||||
|
filedump = "".join(chr(b) for b in filedump)
|
||||||
|
|
||||||
|
# Bdecode the filedata sent from the UI
|
||||||
|
torrent_filedump = lt.bdecode(filedump)
|
||||||
|
handle = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
handle = self.session.add_torrent(lt.torrent_info(torrent_filedump),
|
||||||
|
config["download_location"],
|
||||||
|
config["compact_allocation"])
|
||||||
|
except RuntimeError:
|
||||||
|
log.warning("Error adding torrent")
|
||||||
|
|
||||||
|
if not handle or not handle.is_valid():
|
||||||
|
# The torrent was not added to the session
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Write the .torrent file to the torrent directory
|
||||||
|
log.debug("Attemping to save torrent file: %s", filename)
|
||||||
|
try:
|
||||||
|
f = open(os.path.join(config["torrentfiles_location"],
|
||||||
|
filename),
|
||||||
|
"wb")
|
||||||
|
f.write(filedump)
|
||||||
|
f.close()
|
||||||
|
except IOError:
|
||||||
|
log.warning("Unable to save torrent file: %s", filename)
|
||||||
|
|
||||||
# Create a Torrent object
|
# Create a Torrent object
|
||||||
torrent = Torrent(handle, self.queue)
|
torrent = Torrent(filename, handle, self.queue)
|
||||||
# Add the torrent object to the dictionary
|
# Add the torrent object to the dictionary
|
||||||
self.torrents[torrent.torrent_id] = torrent
|
self.torrents[torrent.torrent_id] = torrent
|
||||||
# Add the torrent to the queue
|
# Add the torrent to the queue
|
||||||
|
@ -62,12 +103,48 @@ class TorrentManager:
|
||||||
|
|
||||||
def remove(self, torrent_id):
|
def remove(self, torrent_id):
|
||||||
"""Remove a torrent from the manager"""
|
"""Remove a torrent from the manager"""
|
||||||
|
try:
|
||||||
|
# Remove from libtorrent session
|
||||||
|
self.session.remove_torrent(self.torrents[torrent_id].handle)
|
||||||
|
except RuntimeError, KeyError:
|
||||||
|
log.warning("Error removing torrent")
|
||||||
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
del self.torrents[torrent_id]
|
del self.torrents[torrent_id]
|
||||||
except KeyError, ValueError:
|
except KeyError, ValueError:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def pause(self, torrent_id):
|
||||||
|
"""Pause a torrent"""
|
||||||
|
try:
|
||||||
|
self.torrents[torrent_id].handle.pause()
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def save_state(self):
|
||||||
|
"""Save the state of the TorrentManager to the torrents.state file"""
|
||||||
|
state = TorrentManagerState()
|
||||||
|
# Grab the queue from TorrentQueue
|
||||||
|
state.queue = self.queue.queue
|
||||||
|
# Create the state for each Torrent and append to the list
|
||||||
|
for (key, torrent) in self.torrents:
|
||||||
|
t = TorrentState(torrent.get_state())
|
||||||
|
state.torrents.append(t)
|
||||||
|
|
||||||
|
# Pickle the TorrentManagerState object
|
||||||
|
try:
|
||||||
|
log.debug("Saving torrent state file.")
|
||||||
|
state_file = open(deluge.common.get_config_dir("torrents.state"), "wb")
|
||||||
|
pickle.dump(state, state_file)
|
||||||
|
state_file.close()
|
||||||
|
except IOError:
|
||||||
|
log.warning("Unable to save state file.")
|
||||||
|
|
||||||
|
|
||||||
def get_info_template(self):
|
def get_info_template(self):
|
||||||
"""Returns a list of strings that correspond to the info tuple"""
|
"""Returns a list of strings that correspond to the info tuple"""
|
||||||
return [
|
return [
|
||||||
|
|
|
@ -53,7 +53,6 @@ log = logging.getLogger("deluge")
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# Setup the argument parser
|
# Setup the argument parser
|
||||||
# FIXME: need to use deluge.common to fill in version
|
|
||||||
parser = OptionParser(usage="%prog [options] [actions]",
|
parser = OptionParser(usage="%prog [options] [actions]",
|
||||||
version=deluge.common.get_version())
|
version=deluge.common.get_version())
|
||||||
parser.add_option("--daemon", dest="daemon", help="Start Deluge daemon",
|
parser.add_option("--daemon", dest="daemon", help="Start Deluge daemon",
|
||||||
|
|
|
@ -93,6 +93,12 @@ def remove_torrent(torrent_ids):
|
||||||
for torrent_id in torrent_ids:
|
for torrent_id in torrent_ids:
|
||||||
core.remove_torrent(torrent_id)
|
core.remove_torrent(torrent_id)
|
||||||
|
|
||||||
|
def pause_torrent(torrent_ids):
|
||||||
|
"""Pauses torrent_ids"""
|
||||||
|
core = get_core()
|
||||||
|
for torrent_id in torrent_ids:
|
||||||
|
core.pause_torrent(torrent_id)
|
||||||
|
|
||||||
def queue_top(torrent_ids):
|
def queue_top(torrent_ids):
|
||||||
"""Attempts to queue all torrent_ids to the top"""
|
"""Attempts to queue all torrent_ids to the top"""
|
||||||
log.debug("Attempting to queue to top these torrents: %s", torrent_ids)
|
log.debug("Attempting to queue to top these torrents: %s", torrent_ids)
|
||||||
|
|
|
@ -123,6 +123,8 @@ class MenuBar:
|
||||||
## Torrent Menu ##
|
## Torrent Menu ##
|
||||||
def on_menuitem_pause_activate(self, data=None):
|
def on_menuitem_pause_activate(self, data=None):
|
||||||
log.debug("on_menuitem_pause_activate")
|
log.debug("on_menuitem_pause_activate")
|
||||||
|
functions.pause_torrent(
|
||||||
|
self.window.torrentview.get_selected_torrents())
|
||||||
|
|
||||||
def on_menuitem_updatetracker_activate(self, data=None):
|
def on_menuitem_updatetracker_activate(self, data=None):
|
||||||
log.debug("on_menuitem_updatetracker_activate")
|
log.debug("on_menuitem_updatetracker_activate")
|
||||||
|
|
|
@ -65,6 +65,7 @@ class Signals:
|
||||||
self.torrent_removed_signal)
|
self.torrent_removed_signal)
|
||||||
self.core.connect_to_signal("torrent_queue_changed",
|
self.core.connect_to_signal("torrent_queue_changed",
|
||||||
self.torrent_queue_changed_signal)
|
self.torrent_queue_changed_signal)
|
||||||
|
self.core.connect_to_signal("torrent_paused", self.torrent_paused)
|
||||||
|
|
||||||
def torrent_added_signal(self, torrent_id):
|
def torrent_added_signal(self, torrent_id):
|
||||||
log.debug("torrent_added signal received..")
|
log.debug("torrent_added signal received..")
|
||||||
|
@ -82,3 +83,7 @@ class Signals:
|
||||||
log.debug("torrent_queue_changed signal received..")
|
log.debug("torrent_queue_changed signal received..")
|
||||||
# Force an update of the torrent view
|
# Force an update of the torrent view
|
||||||
self.ui.main_window.torrentview.update()
|
self.ui.main_window.torrentview.update()
|
||||||
|
|
||||||
|
def torrent_paused(self, torrent_id):
|
||||||
|
log.debug("torrent_paused signal received..")
|
||||||
|
self.ui.main_window.torrentview.update()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue