DOPAL snake and frog logo DOPAL logo Python and Azureus!
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%]
>>>