Here's an example of using the DOPAL interactive module - it gives you an idea of what the API is like. We'll just play around with a few torrents and print some data.
Let's get run the dopal.interact module...
Enter host: 127.0.0.1
Enter port (default is 6884):
Enter user name (leave blank if not applicable):
------------------------
DOPAL 0.54 - interact module
Connection object stored in 'connection' variable.
Plugin interface stored in 'interface' variable.
sys.tracebacklimit = 3 # We don't need the whole stack trace here...
print connection
AzureusObjectConnection for 127.0.0.1 [Azureus 2.3.0.7_B16]
Now let's see what's being downloaded.
dm = interface.getDownloadManager()
dm
<DopalDownloadManager object at 0x009EEE90, sid=9EC940>
downloads = dm.getDownloads()
for download in downloads:
print download
Download: [Lunar] Bleach - 59 [EADDC84D].avi [Downloading, 16.1%]
Download: [AnimeLito]_Rozen_Maiden_Traumend_9_[3E237847].avi [Downloading, 25.1%]
Download: RSSImport_2.2.1.zip [Queued, 100.0%]
Download: [Lunar] Suzuka - 23 [7A531830].avi [Stopped, 0.0%]
Download: Gokusen [Stopped, 0.0%]
Download: UKTV.80s.Ads.divx [Seeding, 100.0%]
downloads[0]
<DopalDownload object at 0x00D6AE30, sid=9EC8AE, for "[Lunar] Bleach - 59 [EADDC84D].avi">
Let's change what is being downloaded, so only the torrent with the largest amount of data remaining to be downloaded is running.
First of all - let's just get all the torrents which haven't been downloaded yet.
(Note: The "< 1000" test is done because the "completed" attribute represents percentages as a value out of 1000.)
not_downloaded = [dl for dl in downloads if dl.stats.completed < 1000]
for download in not_downloaded:
print download
Download: [Lunar] Bleach - 59 [EADDC84D].avi [Downloading, 16.1%]
Download: [AnimeLito]_Rozen_Maiden_Traumend_9_[3E237847].avi [Downloading, 25.1%]
Download: [Lunar] Suzuka - 23 [7A531830].avi [Stopped, 0.0%]
Download: Gokusen [Stopped, 0.0%]
Now we'll stop them all.
for download in not_downloaded:
download.stop()
Traceback (most recent call last):
File "<console>", line 2, in ?
File "c:\dopal-cvs\src\dopal\objects.py", line 292, in stop
return self.invoke_object_method(__funcname__, args, **kwargs)
RemoteMethodError: Download::stop: download already stopped
Oops! I should've been more careful there. The first two have probably been stopped - the third one is likely to have caused the error. Let's examine the objects again.
for download in not_downloaded:
print download
Download: [Lunar] Bleach - 59 [EADDC84D].avi [Downloading, 16.1%]
Download: [AnimeLito]_Rozen_Maiden_Traumend_9_[3E237847].avi [Downloading, 25.1%]
Download: [Lunar] Suzuka - 23 [7A531830].avi [Stopped, 0.0%]
Download: Gokusen [Stopped, 0.0%]
# We need to refresh the local representation of these objects to sync
# them up with the real remote objects in Azureus.
for download in not_downloaded:
download.refresh_object() # This is a DOPAL-specific method.
print download
Download: [Lunar] Bleach - 59 [EADDC84D].avi [Stopped, 34.7%]
Download: [AnimeLito]_Rozen_Maiden_Traumend_9_[3E237847].avi [Stopped, 57.2%]
Download: [Lunar] Suzuka - 23 [7A531830].avi [Stopped, 0.0%]
Download: Gokusen [Stopped, 0.0%]
Time to find the one with the most to download. We'll sort by data remaining to find the one we are after.
def get_bytes_remaining(download):
# There are various ways of calculating this, but this is just
# an example.
return download.torrent.size - download.stats.downloaded
def compare_by_remaining_bytes(download_a, download_b):
a_remaining = get_bytes_remaining(download_a)
b_remaining = get_bytes_remaining(download_b)
return cmp(a_remaining, b_remaining)
not_downloaded.sort(compare_by_remaining_bytes)
for dl in not_downloaded:
print get_bytes_remaining(dl), dl
82529571 Download: [AnimeLito]_Rozen_Maiden_Traumend_9_[3E237847].avi [Stopped, 57.2%]
118019862 Download: [Lunar] Bleach - 59 [EADDC84D].avi [Stopped, 34.7%]
178530304 Download: [Lunar] Suzuka - 23 [7A531830].avi [Stopped, 0.0%]
2384037376 Download: Gokusen [Stopped, 0.0%]
Looks like the last torrent has the most remaining (we haven't even started it - it's around 2 GB's). Let's fire it up.
not_downloaded[-1].start()
Traceback (most recent call last):
File "<console>", line 1, in ?
File "c:\dopal-cvs\src\dopal\objects.py", line 292, in start
return self.invoke_object_method(__funcname__, args, **kwargs)
RemoteMethodError: Download::start: download not ready (state=70)
# Oops, wrong method...
not_downloaded[-1].restart()
# Let's see if it's worked...
print not_downloaded[-1]
Download: Gokusen [Stopped, 0.0%]
# Oops, have to resync it with the real object...
not_downloaded[-1].refresh_object()
print not_downloaded[-1]
Download: Gokusen [Downloading, 0.0%]