Command-line BitTorrent remote control (btc)
Python
Switch branches/tags
Nothing to show
Latest commit b12f152 Mar 9, 2016 Jean-Philippe Cottin Jean-Philippe Cottin Merge pull request #11 from bittorrent/feature-recheck
Feature recheck
Permalink
Failed to load latest commit information.
btc Merge pull request #11 from bittorrent/feature-recheck Mar 8, 2016
.gitignore ignore build Oct 2, 2012
LICENSE update year in copyright Jan 24, 2013
README.md Update README.md May 30, 2013
setup.py allow 3.x users to install Jan 21, 2013

README.md

BTC

This project enables you to control uTorrent from the command line.

License

BTC is released under the MIT license.

Installation

BTC requires python 2.6.x or 2.7.x and can be installed using pip:

$ pip install -U https://github.com/bittorrent/btc/tarball/master

If you were to make changes to the source code, which is welcome, you can fork the git repository on Github and install a development setup doing:

$ python setup.py develop

You can then use pull requests if you want your changes to be integrated.

Configuration

Located in your home folder, the settings file should be named .btc. This file has to hold a valid JSON dictionary. In order to have BTC talk to uTorrent we need to set host, port, username and password settings properly. All these settings have default values so an empty settings file will be equivalent to:

{
  "host": "127.0.0.1",
  "port": 8080,
  "username": "admin",
  "password": ""
}

In order to keep this file clean you can use btc set to change settings.

$ btc set host 192.168.1.10
$ btc set port 8889

If you want to remove a setting and get the default back, you can use the --delete option to get rid of it.

$ btc set --delete host

Finally if you want to use a configuration file named differently you can set then environment variable BTC_CONFIG_FILE to another absolute path.

Usage

BTC is made to behave in a way that might surprise you at first. It is made to be piped into itself. What does it mean? When you pipe a command into another, say you type ls | grep bittorrent, the output of ls is going to be used as the input of grep and grep will output only the lines with the word bittorrent. BTC leverages this mecanism as its core way of processing data and requesting actions. Everything beggins with the list command.

$ btc list
[
  {
    "name": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "sid": "5deab0a",
    "dl_rate": 0,
    "done": 815997472,
    "peers_connected": 0,
    "seeds_connected": 0,
    "size": 815997472,
    "state": "SEEDING",
    "ul_rate": 0
  },
  {
    "name": "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
    "hash": "779E32E8D82521A3472FE6F93C0B29984A7FB411",
    "sid": "5d6264e",
    "dl_rate": 0,
    "done": 477507449,
    "peers_connected": 0,
    "seeds_connected": 0,
    "size": 477507449,
    "state": "SEEDING",
    "ul_rate": 0
  }
]

This command queries uTorrent for the list of all its torrents, and BTC outputs them, using JSON format, as a list of dictionaries each dictionary being a torrent. Each torrent is reported with its name and hash but other information such as peers_connected or current state and so on. This is nice, but what next? This command can then be piped to other commands in order to filter the information you want and have BTC perform the operations you want on your uTorrent client. Let's say you want to stop the torrent named with all these 'A's.

$ btc list "A*" | btc stop

This torrent is not going to be seeded anymore by uTorrent. Don't worry, you can restart it using the start command. This is the right moment to mention that btc list takes an optional argument which filters all the torrents by name allowing glob syntax. The --case-sensitive or the shorter -s options can be used to enforce case sensitivity. Some of you might think that it is a lot more complicated than doing btc stop "A*". Fair enough, but what if you only want to stop torrents with a dl_rate of zero?

$ btc list | btc filter --key dl_rate --numeric-equals 0 | btc stop

As simple as that. The filter command is here to help you select the entries you want and reject the other ones. It can be used to filter anything BTC outputs, not only torrents, but we will see that afterwards. The filter command can have multiple arguments (see btc filter --help) such as --nth N which select the N-th entry in a list or --first N which takes the N first entries of the list. Given a key supplied with --key each entry is going to be selected if:

$ btc list | btc filter --key KEY "X*"  # it matches a string, supporting glob syntax
$ btc list | btc filter --key KEY --numeric-equals X  # its numeric value equals X
$ btc list | btc filter --key KEY --numeric-differs X # its numeric value differs from X
$ btc list | btc filter --key KEY --less X    # its numeric value is less than X
$ btc list | btc filter --key KEY --greater X # its numeric value is greater than X
$ btc list | btc filter --key KEY --true      # it is the boolean value true
$ btc list | btc filter --key KEY --false     # it is the boolean value false
...

Multiple filter commands can be piped one after the other for the output to match exactly what you want.

What about files? A torrent can have multiple files and you can list them using the files command. Hence for one or many torrents outputed by btc list, btc files lists the files inside this or these torrents.

$ btc list "A*" | btc files
[
  {
    "name": "audio_1.mp3",
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "sid": "5deab0a",
    "fileid": 0,
    "downloaded": 6579667,
    "priority": 2,
    "size": 6579667
  },
  {
    "name": "image_1.jpeg",
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "sid": "5deab0a",
    "fileid": 1,
    "downloaded": 384077,
    "priority": 2,
    "size": 384077
  },
  {
    "name": "video_6.mpg",
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "sid": "5deab0a",
    "fileid": 2,
    "downloaded": 809033728,
    "priority": 2,
    "size": 809033728
  }
]

This lists all the files of the torrent(s) given in input. The filter command can be used here again to select some of these files. But let's introduce the sort command. It allows you to sort the results by simply piping them to btc sort. By default, giving it no arguments, it is going to sort the entries by name. Another key can also be specified with the option --key if you were to sort by size for instance. You can also reverse the sort by using the option --reverse.

$ btc list | btc files | btc sort
[
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "audio_1.mp3",
    "priority": 2,
    "downloaded": 6579667,
    "sid": "5deab0a",
    "size": 6579667,
    "fileid": 0
  },
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "image_1.jpeg",
    "priority": 2,
    "downloaded": 384077,
    "sid": "5deab0a",
    "size": 384077,
    "fileid": 1
  },
  {
    "hash": "779E32E8D82521A3472FE6F93C0B29984A7FB411",
    "name": "image_2.jpg",
    "priority": 2,
    "downloaded": 3386455,
    "sid": "5d6264e",
    "size": 3386455,
    "fileid": 0
  },
  {
    "hash": "779E32E8D82521A3472FE6F93C0B29984A7FB411",
    "name": "video_14.avi",
    "priority": 2,
    "downloaded": 474120994,
    "sid": "5d6264e",
    "size": 474120994,
    "fileid": 1
  },
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "video_6.mpg",
    "priority": 2,
    "downloaded": 809033728,
    "sid": "5deab0a",
    "size": 809033728,
    "fileid": 2
  }
]

$ btc list | btc files | btc sort --key size
[
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "image_1.jpeg",
    "priority": 2,
    "downloaded": 384077,
    "sid": "5deab0a",
    "size": 384077,
    "fileid": 1
  },
  {
    "hash": "779E32E8D82521A3472FE6F93C0B29984A7FB411",
    "name": "image_2.jpg",
    "priority": 2,
    "downloaded": 3386455,
    "sid": "5d6264e",
    "size": 3386455,
    "fileid": 0
  },
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "audio_1.mp3",
    "priority": 2,
    "downloaded": 6579667,
    "sid": "5deab0a",
    "size": 6579667,
    "fileid": 0
  },
  {
    "hash": "779E32E8D82521A3472FE6F93C0B29984A7FB411",
    "name": "video_14.avi",
    "priority": 2,
    "downloaded": 474120994,
    "sid": "5d6264e",
    "size": 474120994,
    "fileid": 1
  },
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "video_6.mpg",
    "priority": 2,
    "downloaded": 809033728,
    "sid": "5deab0a",
    "size": 809033728,
    "fileid": 2
  }
]

$ btc list | btc files | btc sort --key size --reverse
[
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "video_6.mpg",
    "priority": 2,
    "downloaded": 809033728,
    "sid": "5deab0a",
    "size": 809033728,
    "fileid": 2
  },
  {
    "hash": "779E32E8D82521A3472FE6F93C0B29984A7FB411",
    "name": "video_14.avi",
    "priority": 2,
    "downloaded": 474120994,
    "sid": "5d6264e",
    "size": 474120994,
    "fileid": 1
  },
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "audio_1.mp3",
    "priority": 2,
    "downloaded": 6579667,
    "sid": "5deab0a",
    "size": 6579667,
    "fileid": 0
  },
  {
    "hash": "779E32E8D82521A3472FE6F93C0B29984A7FB411",
    "name": "image_2.jpg",
    "priority": 2,
    "downloaded": 3386455,
    "sid": "5d6264e",
    "size": 3386455,
    "fileid": 0
  },
  {
    "hash": "45097EB957FD45EE657A442B16F702251CBB8E35",
    "name": "image_1.jpeg",
    "priority": 2,
    "downloaded": 384077,
    "sid": "5deab0a",
    "size": 384077,
    "fileid": 1
  }
]

You can also download on your disk some files using the download command. Piping a list of files to btc download will download them to the directory from which BTC is run. To change the output directory you can use the --directory option. If you are dealing with a single file you can also rename it using the --output option. Last but not least, if uTorrent is running on Windows you need to add the --windows option so that the backslashes will be converted to forward slashes.

$ btc list | btc files | btc download
downloading: ./audio_1.mp3
downloading: ./image_1.jpeg
downloading: ./image_2.jpg
downloading: ./video_14.avi
downloading: ./video_6.mpg

$ btc list | btc files | btc download --directory /tmp
downloading: /tmp/audio_1.mp3
downloading: /tmp/image_1.jpeg
downloading: /tmp/image_2.jpg
downloading: /tmp/video_14.avi
downloading: /tmp/video_6.mpg

$ btc list | btc files | btc filter --nth 1 | btc download --output /tmp/file
downloading: /tmp/file

Want to stream? No problem, use btc stream. With files as input it will run a stream command with the appropriate streaming url. By default it outputing the stream urls to your terminal. You can provide a streaming command using the --command option.

$ btc list | btc files | btc stream
btc stream: warning: no stream command specified, outputing streaming links
audio_1.mp3: http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=0&service=DOWNLOAD&qos=0&disposition=inline
image_1.jpeg: http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=1&service=DOWNLOAD&qos=0&disposition=inline
image_2.jpg: http://admin:@127.0.0.1:8080/proxy?sid=5d6264e&file=0&service=DOWNLOAD&qos=0&disposition=inline
video_14.avi: http://admin:@127.0.0.1:8080/proxy?sid=5d6264e&file=1&service=DOWNLOAD&qos=0&disposition=inline
video_6.mpg: http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=2&service=DOWNLOAD&qos=0&disposition=inline
$ btc list | btc files | btc filter --nth 1 | btc stream --command mplayer
running: mplayer http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=0&service=DOWNLOAD&qos=0&disposition=inline
$ btc list | btc files | btc stream --command mplayer
running: mplayer http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=0&service=DOWNLOAD&qos=0&disposition=inline
running: mplayer http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=1&service=DOWNLOAD&qos=0&disposition=inline
running: mplayer http://admin:@127.0.0.1:8080/proxy?sid=5d6264e&file=0&service=DOWNLOAD&qos=0&disposition=inline
running: mplayer http://admin:@127.0.0.1:8080/proxy?sid=5d6264e&file=1&service=DOWNLOAD&qos=0&disposition=inline
running: mplayer http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=2&service=DOWNLOAD&qos=0&disposition=inline

If you want to play all the files using a single instance of the command you may use the option --together which has the following behavior:

$ btc list | btc files | btc stream --command mplayer --together
running: mplayer http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=0&service=DOWNLOAD&qos=0&disposition=inline http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=1&service=DOWNLOAD&qos=0&disposition=inline http://admin:@127.0.0.1:8080/proxy?sid=5d6264e&file=0&service=DOWNLOAD&qos=0&disposition=inline http://admin:@127.0.0.1:8080/proxy?sid=5d6264e&file=1&service=DOWNLOAD&qos=0&disposition=inline http://admin:@127.0.0.1:8080/proxy?sid=5deab0a&file=2&service=DOWNLOAD&qos=0&disposition=inline

Here is the way to add a torrent by url or using a file on your computer:

$ btc add http://www.clearbits.net/get/547-home-2009.torrent
$ btc add "home project - home 2009.torrent"

And then you can remove the torrent from your downloads keeping or not the torrent file and dropping or not the data:

$ btc list "Home Project - Home 2009" | btc remove
$ btc list "Home Project - Home 2009" | btc remove --keep-torrent
$ btc list "Home Project - Home 2009" | btc remove --drop-data
$ btc list "Home Project - Home 2009" | btc remove --keep-torrent --drop-data

Finally the wait command simply waits for a torrent to complete. You can use that to run a command when the torrent is complete, shutdown for instance...

$ btc list "Home Project - Home 2009" | btc wait && shutdown