diff --git a/library/INSTALL b/library/INSTALL index 34cc89816..cbd8d4a1e 100644 --- a/library/INSTALL +++ b/library/INSTALL @@ -1,5 +1,5 @@ ================================= -Installation of pytorrent +Installation of Flood ================================= Compile: python setup.py build @@ -11,7 +11,7 @@ Dependencies to compile (written as Ubuntu packages): python, libboost-filesyste May also depend on (not sure): python-dev, and -dev packages for all boost libs -Makefile.libtorrent-only.* are the makefiles from libtorrent, copied as it. They don't refer to pytorrent, and probably won't work in the current directory structure. However, they may help people know what dependencies etc. are needed +Makefile.libtorrent-only.* are the makefiles from libtorrent, copied as it. They don't refer to Flood, and probably won't work in the current directory structure. However, they may help people know what dependencies etc. are needed If you find mistakes here, please notify me on the project page, www.deluge-torrent.org. Thank you. diff --git a/library/LICENSE b/library/LICENSE index 97dbf705f..2c0359d70 100644 --- a/library/LICENSE +++ b/library/LICENSE @@ -18,5 +18,6 @@ * * NOTE:The libtorrent code is copyrighted by Arvid Norberg; see the notice in * the libtorrent files. However, to ensure no misunderstanding: the entire project - * as a whole is licenced, as mentioned above, under the GPL. + * as a whole is licenced, as mentioned above, under the GPL. Only laziness has + * prevented every single notice there from being changed from BSD to GPL. */ diff --git a/library/README b/library/README index 1d2a0b937..f809abef8 100644 --- a/library/README +++ b/library/README @@ -1,17 +1,17 @@ ================= -pytorrent +Flood ================= You may compile the code with the script 'makeit'. The -script 'installit' will install the pytorrent_core package +script 'installit' will install the flood_core package to the central package store, so that it can be imported inside -pytorrent.py (which is required). +flood.py (which is required). -Currently the scripts do NOT copy pytorrent.py to the central -package store, as Deluge imports pytorrent.py by "import -library.pytorrent" +Currently the scripts do NOT copy flood.py to the central +package store, as Deluge imports flood.py by "import +library.flood" -You can check whether pytorrent works by running +You can check whether flood works by running python test.py diff --git a/library/control b/library/control index 2cc53fe3e..3e1d1d67b 100644 --- a/library/control +++ b/library/control @@ -1,9 +1,9 @@ -Package: pytorrent +Package: flood Version: 0.2.99-1-i386 Section: base Priority: optional Architecture: all Depends: python, libboost-filesystem1.33.1, libboost-date-time1.33.1, libboost-program-options1.33.1, libboost-regex1.33.1, libboost-thread1.33.1, libc6-dev, zlib1g-dev Maintainer: A. Zakai ('Kripken') -Description: A Python wrapper for the (Sourceforge, not Rakshasa!) libtorrent C++ library. +Description: A Python module for bittorrent, based on Rasterbar's libtorrent. URL: http://www.deluge-torrent.org diff --git a/library/cpp/pytorrent_core.cpp b/library/cpp/flood_core.cpp similarity index 98% rename from library/cpp/pytorrent_core.cpp rename to library/cpp/flood_core.cpp index a28abc210..489235291 100755 --- a/library/cpp/pytorrent_core.cpp +++ b/library/cpp/flood_core.cpp @@ -111,7 +111,7 @@ torrents_t *M_torrents = NULL; // Exception types & macro //------------------------ -static PyObject *PyTorrentError = NULL; +static PyObject *FloodError = NULL; static PyObject *InvalidEncodingError = NULL; static PyObject *FilesystemError = NULL; static PyObject *DuplicateTorrentError = NULL; @@ -148,7 +148,7 @@ long get_torrent_index(torrent_handle &handle) return i; } - RAISE_INT(PyTorrentError, "Handle not found."); + RAISE_INT(FloodError, "Handle not found."); } long get_index_from_unique_ID(long unique_ID) @@ -159,7 +159,7 @@ long get_index_from_unique_ID(long unique_ID) if ((*M_torrents)[i].unique_ID == unique_ID) return i; - RAISE_INT(PyTorrentError, "No such unique_ID."); + RAISE_INT(FloodError, "No such unique_ID."); } long internal_add_torrent(std::string const& torrent_name, @@ -269,7 +269,7 @@ long count_DHT_peers(entry &state) static PyObject *torrent_pre_init(PyObject *self, PyObject *args) { - if (!PyArg_ParseTuple(args, "OOOOO", &PyTorrentError, + if (!PyArg_ParseTuple(args, "OOOOO", &FloodError, &InvalidEncodingError, &FilesystemError, &DuplicateTorrentError, @@ -281,7 +281,7 @@ static PyObject *torrent_pre_init(PyObject *self, PyObject *args) static PyObject *torrent_init(PyObject *self, PyObject *args) { - printf("pytorrent_core; using libtorrent %s. Compiled with NDEBUG value: %d\r\n", + printf("flood_core; using libtorrent %s. Compiled with NDEBUG value: %d\r\n", LIBTORRENT_VERSION, NDEBUG); @@ -382,7 +382,7 @@ static PyObject *torrent_save_fastresume(PyObject *self, PyObject *args) Py_INCREF(Py_None); return Py_None; } else - RAISE_PTR(PyTorrentError, "Invalid handle or no metadata for fastresume."); + RAISE_PTR(FloodError, "Invalid handle or no metadata for fastresume."); } static PyObject *torrent_set_max_half_open(PyObject *self, PyObject *args) @@ -1118,7 +1118,7 @@ static PyObject *torrent_create_torrent(PyObject *self, PyObject *args) { // std::cerr << e.what() << "\n"; // return Py_BuildValue("l", 0); - RAISE_PTR(PyTorrentError, e.what()); + RAISE_PTR(FloodError, e.what()); } } @@ -1168,7 +1168,7 @@ static PyObject *torrent_apply_IP_filter(PyObject *self, PyObject *args) // Python Module data //==================== -static PyMethodDef pytorrent_core_methods[] = { +static PyMethodDef flood_core_methods[] = { {"pre_init", torrent_pre_init, METH_VARARGS, "."}, {"init", torrent_init, METH_VARARGS, "."}, {"quit", torrent_quit, METH_VARARGS, "."}, @@ -1205,7 +1205,7 @@ static PyMethodDef pytorrent_core_methods[] = { PyMODINIT_FUNC -initpytorrent_core(void) +initflood_core(void) { - Py_InitModule("pytorrent_core", pytorrent_core_methods); + Py_InitModule("flood_core", flood_core_methods); }; diff --git a/library/pytorrent.py b/library/pytorrent.py index 729781d70..1eb0117c3 100644 --- a/library/pytorrent.py +++ b/library/pytorrent.py @@ -1,6 +1,5 @@ # # Copyright (C) 2006 Alon Zakai ('Kripken') -# Copyright (C) 2006 Zach Tibbitts # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -17,14 +16,14 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # -# Deluge Library, a.k.a. pytorrent, previously known as python-libtorrent: +# Deluge Library, a.k.a. Flood, previously known as python-libtorrent: # -# pytorrent is a Python library for torrenting, that includes -# pytorrent.py, which is Python code, and pytorrent_core, which is also a Python +# Flood is a Python library for torrenting, that includes +# Flood, which is Python code, and Flood_core, which is also a Python # module, but written in C++, and includes the libtorrent torrent library. Only -# pytorrent should be visible, and only it should be imported, in the client. -# pytorrent_core contains mainly libtorrent-interfacing code, and a few other things -# that make most sense to write at that level. pytorrent.py contains all other +# Flood should be visible, and only it should be imported, in the client. +# Flood_core contains mainly libtorrent-interfacing code, and a few other things +# that make most sense to write at that level. Flood contains all other # torrent-system management: queueing, configuration management, persistent # list of torrents, etc. # @@ -34,10 +33,10 @@ # 1. torrent_info - persistent data, like name, upload speed cap, etc. # 2. core_torrent_state - transient state data from the core. This may take # time to calculate, so we do if efficiently -# 3. supp_torrent_state - supplementary torrent data, from pytorrent +# 3. supp_torrent_state - supplementary torrent data, from Flood -import pytorrent_core +import flood_core import os, shutil import pickle import time @@ -66,35 +65,35 @@ DEFAULT_PREFS = { } PREF_FUNCTIONS = { - "max_uploads" : pytorrent_core.set_max_uploads, - "listen_on" : pytorrent_core.set_listen_on, - "max_connections" : pytorrent_core.set_max_connections, + "max_uploads" : flood_core.set_max_uploads, + "listen_on" : flood_core.set_listen_on, + "max_connections" : flood_core.set_max_connections, "use_DHT" : None, # not a normal pref in that is is applied only on start "max_active_torrents" : None, # no need for a function, applied constantly "auto_seed_ratio" : None, # no need for a function, applied constantly - "max_download_rate" : pytorrent_core.set_download_rate_limit, - "max_upload_rate" : pytorrent_core.set_upload_rate_limit + "max_download_rate" : flood_core.set_download_rate_limit, + "max_upload_rate" : flood_core.set_upload_rate_limit } # Exceptions -class PyTorrentError(Exception): +class FloodError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) -class InvalidEncodingError(PyTorrentError): +class InvalidEncodingError(FloodError): pass -class FilesystemError(PyTorrentError): +class FilesystemError(FloodError): pass -class DuplicateTorrentError(PyTorrentError): +class DuplicateTorrentError(FloodError): pass -class InvalidTorrentError(PyTorrentError): +class InvalidTorrentError(FloodError): pass @@ -154,22 +153,22 @@ class manager: os.mkdir(self.base_dir + "/" + TORRENTS_SUBDIR) # Pre-initialize the core's data structures - pytorrent_core.pre_init(PyTorrentError, - InvalidEncodingError, - FilesystemError, - DuplicateTorrentError, - InvalidTorrentError) + flood_core.pre_init(FloodError, + InvalidEncodingError, + FilesystemError, + DuplicateTorrentError, + InvalidTorrentError) # Start up the core assert(len(version) == 4) - pytorrent_core.init(client_ID, - int(version[0]), - int(version[1]), - int(version[2]), - int(version[3]), - user_agent) + flood_core.init(client_ID, + int(version[0]), + int(version[1]), + int(version[2]), + int(version[3]), + user_agent) - self.constants = pytorrent_core.constants() + self.constants = flood_core.constants() # Unique IDs are NOT in the state, since they are temporary for each session self.unique_IDs = {} # unique_ID -> a torrent_info object, i.e. persistent data @@ -199,9 +198,9 @@ class manager: # Apply DHT, if needed. Note that this is before any torrents are added if self.get_pref('use_DHT'): if not blank_slate: - pytorrent_core.start_DHT(self.base_dir + "/" + DHT_FILENAME) + flood_core.start_DHT(self.base_dir + "/" + DHT_FILENAME) else: - pytorrent_core.start_DHT("") + flood_core.start_DHT("") # Unpickle the state, or create a new one if not blank_slate: @@ -243,11 +242,11 @@ class manager: # Stop DHT, if needed if self.get_pref('use_DHT'): print "Stopping DHT..." - pytorrent_core.stop_DHT(self.base_dir + "/" + DHT_FILENAME) + flood_core.stop_DHT(self.base_dir + "/" + DHT_FILENAME) # Shutdown torrent core print "Quitting the core..." - pytorrent_core.quit() + flood_core.quit() def pre_quitting(self): # Save the uploaded data from this session to the existing upload memory @@ -268,12 +267,12 @@ class manager: self.prefs[key] = DEFAULT_PREFS[key] return self.prefs[key] else: - raise PyTorrentError("Asked for a pref that doesn't exist: " + key) + raise FloodError("Asked for a pref that doesn't exist: " + key) def set_pref(self, key, value): # Make sure this is a valid key if key not in DEFAULT_PREFS.keys(): - raise PyTorrentError("Asked to change a pref that isn't valid: " + key) + raise FloodError("Asked to change a pref that isn't valid: " + key) self.prefs[key] = value @@ -290,7 +289,7 @@ class manager: def remove_torrent(self, unique_ID, data_also): # Save some data before we remove the torrent, needed later in this func temp = self.unique_IDs[unique_ID] - temp_fileinfo = pytorrent_core.get_fileinfo(unique_ID) + temp_fileinfo = flood_core.get_fileinfo(unique_ID) self.remove_torrent_ns(unique_ID) self.sync() @@ -317,18 +316,18 @@ class manager: # A separate function, because people may want to call it from time to time def save_fastresume_data(self): for unique_ID in self.unique_IDs: - pytorrent_core.save_fastresume(unique_ID, self.unique_IDs[unique_ID].filename) + flood_core.save_fastresume(unique_ID, self.unique_IDs[unique_ID].filename) # State retrieval functions def get_state(self): - ret = pytorrent_core.get_session_info() + ret = flood_core.get_session_info() # Get additional data from our level - ret['is_listening'] = pytorrent_core.is_listening() - ret['port'] = pytorrent_core.listening_port() + ret['is_listening'] = flood_core.is_listening() + ret['port'] = flood_core.listening_port() if self.get_pref('use_DHT'): - ret['DHT_nodes'] = pytorrent_core.get_DHT_info() + ret['DHT_nodes'] = flood_core.get_DHT_info() return ret @@ -336,7 +335,7 @@ class manager: def get_torrent_state(self, unique_ID, full=False): ret = self.get_core_torrent_state(unique_ID, True).copy() - # Add the pytorrent-level things to the pytorrent_core data + # Add the flood-level things to the flood_core data if self.get_supp_torrent_state(unique_ID) is not None: ret.update(self.get_supp_torrent_state(unique_ID)) @@ -402,10 +401,10 @@ class manager: if (index < self.state.max_active_torrents or self.state_max_active_torrents == -1) \ and self.get_core_torrent_state(unique_ID, efficient)['is_paused'] \ and not self.is_user_paused(unique_ID): - pytorrent_core.resume(unique_ID) + flood_core.resume(unique_ID) elif not self.get_core_torrent_state(unique_ID, efficient)['is_paused'] and \ (index >= self.state.max_active_torrents or self.is_user_paused(unique_ID)): - pytorrent_core.pause(unique_ID) + flood_core.pause(unique_ID) # Event handling @@ -414,7 +413,7 @@ class manager: # wants to do something - show messages, for example ret = [] - event = pytorrent_core.pop_event() + event = flood_core.pop_event() while event is not None: # print "EVENT: ", event @@ -447,7 +446,7 @@ class manager: "tracker_messages", new) - event = pytorrent_core.pop_event() + event = flood_core.pop_event() return ret @@ -458,7 +457,7 @@ class manager: self.unique_IDs[unique_ID].file_filter = file_filter[:] - pytorrent_core.set_filter_out(file_filter) + flood_core.set_filter_out(file_filter) def get_file_filter(self, unique_ID): try: @@ -484,7 +483,7 @@ class manager: return self.unique_IDs[unique_ID].user_paused def get_num_torrents(self): - return pytorrent_core.get_num_torrents() + return flood_core.get_num_torrents() def get_unique_IDs(self): return self.unique_IDs.keys() @@ -497,7 +496,7 @@ class manager: # Efficient: use a saved state, if it hasn't expired yet def get_core_torrent_state(self, unique_ID, efficiently=True): if unique_ID not in self.saved_core_torrent_states.keys(): - self.saved_core_torrent_states[unique_ID] = cached_data(pytorrent_core.get_torrent_state, + self.saved_core_torrent_states[unique_ID] = cached_data(flood_core.get_torrent_state, unique_ID) return self.saved_core_torrent_states[unique_ID].get(efficiently) @@ -519,7 +518,7 @@ class manager: def get_core_torrent_peer_info(self, unique_ID, efficiently=True): if unique_ID not in self.saved_torrent_peer_infos.keys(): - self.saved_torrent_peer_infos[unique_ID] = cached_data(pytorrent_core.get_peer_info, + self.saved_torrent_peer_infos[unique_ID] = cached_data(flood_core.get_peer_info, unique_ID) return self.saved_torrent_peer_infos[unique_ID].get(efficiently) @@ -531,7 +530,7 @@ class manager: (temp, filename_short) = os.path.split(filename) if filename_short in os.listdir(self.base_dir + "/" + TORRENTS_SUBDIR): - raise PyTorrentError("Duplicate Torrent, it appears: " + filename_short) + raise FloodError("Duplicate Torrent, it appears: " + filename_short) full_new_name = self.base_dir + "/" + TORRENTS_SUBDIR + "/" + filename_short @@ -557,7 +556,7 @@ class manager: for torrent in self.state.torrents: if torrent not in torrents_with_unique_ID: # print "Adding torrent to core:", torrent.filename, torrent.save_dir, torrent.compact - unique_ID = pytorrent_core.add_torrent(torrent.filename, + unique_ID = flood_core.add_torrent(torrent.filename, torrent.save_dir, torrent.compact) # print "Got unique ID:", unique_ID @@ -568,7 +567,7 @@ class manager: to_delete = [] for torrent in self.state.torrents: if torrent.delete_me: - pytorrent_core.remove_torrent(torrent.unique_ID, torrent.filename) + flood_core.remove_torrent(torrent.unique_ID, torrent.filename) to_delete.append(torrent.unique_ID) for unique_ID in to_delete: @@ -583,7 +582,7 @@ class manager: assert(len(self.unique_IDs) == len(self.state.torrents)) assert(len(self.unique_IDs) == len(self.state.queue)) - assert(len(self.unique_IDs) == pytorrent_core.get_num_torrents()) + assert(len(self.unique_IDs) == flood_core.get_num_torrents()) return ret diff --git a/library/setup.py b/library/setup.py index 259844432..44ed92f3d 100644 --- a/library/setup.py +++ b/library/setup.py @@ -30,9 +30,9 @@ import platform pythonVersion = platform.python_version()[0:3] -print "=========================================" -print "Creating pytorrent_core for Python " + pythonVersion -print "=========================================" +print "=====================================" +print "Creating flood_core for Python " + pythonVersion +print "=====================================" import os diff --git a/library/setup_naive.py b/library/setup_naive.py index ca73564ef..6030da158 100644 --- a/library/setup_naive.py +++ b/library/setup_naive.py @@ -24,7 +24,7 @@ pythonVersion = platform.python_version()[0:3] from distutils.core import setup, Extension -module1 = Extension('pytorrent_core', +module1 = Extension('flood_core', include_dirs = ['./include', './include/libtorrent', '/usr/include/python' + pythonVersion], libraries = ['boost_filesystem', 'boost_date_time', @@ -44,7 +44,7 @@ module1 = Extension('pytorrent_core', 'cpp/peer_connection.cpp', 'cpp/piece_picker.cpp', 'cpp/policy.cpp', - 'cpp/pytorrent_core.cpp', + 'cpp/flood_core.cpp', 'cpp/session.cpp', 'cpp/session_impl.cpp', 'cpp/sha1.cpp', @@ -66,9 +66,9 @@ module1 = Extension('pytorrent_core', 'cpp/kademlia/rpc_manager.cpp', 'cpp/kademlia/traversal_algorithm.cpp']) -setup(name = 'pytorrent_core', +setup(name = 'flood_core', version = '0.5.0', - description = 'A module for the bittorrent protocol. Built using (Sourgeforge, not Rakshasha) libtorrent.', + description = "A module for the bittorrent protocol. Built using Rasterbar's libtorrent.", author="Alon Zakai ('Kripken'), Zach Tibbitts", author_email="kripkensteiner@gmail.com", url="http://www.deluge-torrent.org", diff --git a/library/test.py b/library/test.py index 7cc862b11..157e99bbe 100644 --- a/library/test.py +++ b/library/test.py @@ -9,11 +9,11 @@ #*/ -import pytorrent +import flood from time import sleep import os -manager = pytorrent.manager("PT", "0500", "pytorrent - testing only", +manager = flood.manager("FL", "0500", "flood - testing only", os.path.expanduser("~") + "/Temp")# blank_slate=True) #manager.set_pref('max_upload_rate', 6*1024) diff --git a/library/webui.py b/library/webui.py index a5d6976d4..f3b987e6f 100644 --- a/library/webui.py +++ b/library/webui.py @@ -22,7 +22,7 @@ import time import BaseHTTPServer import sys, os -import pytorrent +import flood # Constants @@ -38,7 +38,7 @@ class WebUICore: self.running = False def start(self): - self.manager = pytorrent.manager("DE", "0511", "Deluge WebUI", + self.manager = flood.manager("DE", "0511", "Deluge WebUI", os.path.expanduser("~") + "/Temp")#, blank_slate=True) self.running = True