You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
8.7 KiB
255 lines
8.7 KiB
<?php
|
|
define("UTORRENT_TORRENT_HASH", 0);
|
|
define("UTORRENT_TORRENT_STATUS", 1);
|
|
define("UTORRENT_TORRENT_NAME", 2);
|
|
define("UTORRENT_TORRENT_SIZE", 3);
|
|
define("UTORRENT_TORRENT_PROGRESS", 4);
|
|
define("UTORRENT_TORRENT_DOWNLOADED", 5);
|
|
define("UTORRENT_TORRENT_UPLOADED", 6);
|
|
define("UTORRENT_TORRENT_RATIO", 7);
|
|
define("UTORRENT_TORRENT_UPSPEED", 8);
|
|
define("UTORRENT_TORRENT_DOWNSPEED", 9);
|
|
define("UTORRENT_TORRENT_ETA", 10);
|
|
define("UTORRENT_TORRENT_LABEL", 11);
|
|
define("UTORRENT_TORRENT_PEERS_CONNECTED", 12);
|
|
define("UTORRENT_TORRENT_PEERS_SWARM", 13);
|
|
define("UTORRENT_TORRENT_SEEDS_CONNECTED", 14);
|
|
define("UTORRENT_TORRENT_SEEDS_SWARM", 15);
|
|
define("UTORRENT_TORRENT_AVAILABILITY", 16);
|
|
define("UTORRENT_TORRENT_QUEUE_POSITION", 17);
|
|
define("UTORRENT_TORRENT_REMAINING", 18);
|
|
define("UTORRENT_FILEPRIORITY_HIGH", 3);
|
|
define("UTORRENT_FILEPRIORITY_NORMAL", 2);
|
|
define("UTORRENT_FILEPRIORITY_LOW", 1);
|
|
define("UTORRENT_FILEPRIORITY_SKIP", 0);
|
|
define("UTORRENT_TYPE_INTEGER", 0);
|
|
define("UTORRENT_TYPE_BOOLEAN", 1);
|
|
define("UTORRENT_TYPE_STRING", 2);
|
|
define("UTORRENT_STATUS_STARTED", 1);
|
|
define("UTORRENT_STATUS_CHECKED", 2);
|
|
define("UTORRENT_STATUS_START_AFTER_CHECK", 4);
|
|
|
|
class uTorrent {
|
|
// class static variables
|
|
private static $base = "%s/gui/%s";
|
|
|
|
// member variables
|
|
public $host;
|
|
public $user;
|
|
public $pass;
|
|
|
|
protected $token;
|
|
protected $guid;
|
|
|
|
// constructor
|
|
function __construct($host = "", $user = "", $pass = "") {
|
|
$this->host = rtrim($host,'/');
|
|
$this->user = $user;
|
|
$this->pass = $pass;
|
|
|
|
if (!$this->getToken()) {
|
|
//handle error here, don't know how to best do this yet
|
|
die('could not get token');
|
|
}
|
|
}
|
|
|
|
// performs request
|
|
private function makeRequest($request, $decode = true, $options = array()) {
|
|
$request = preg_replace('/^\?/', '?token='.$this->token . '&', $request);
|
|
|
|
$ch = curl_init();
|
|
curl_setopt_array($ch, $options);
|
|
curl_setopt($ch, CURLOPT_URL, sprintf(self::$base, $this->host, $request));
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_USERPWD, $this->user.":".$this->pass);
|
|
curl_setopt($ch, CURLOPT_COOKIE, "GUID=".$this->guid);
|
|
|
|
$req = curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
return ($decode ? json_decode($req, true) : $req);
|
|
}
|
|
|
|
// implodes given parameter with glue, whether it is an array or not
|
|
private function paramImplode($glue, $param) {
|
|
return $glue.implode($glue, is_array($param) ? $param : array($param));
|
|
}
|
|
|
|
// gets token, returns true on success
|
|
private function getToken() {
|
|
$url = sprintf(self::$base, $this->host, 'token.html');
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_USERPWD, $this->user.":".$this->pass);
|
|
curl_setopt($ch, CURLOPT_HEADER, true);
|
|
$output = curl_exec($ch);
|
|
$info = curl_getinfo($ch);
|
|
curl_close($ch);
|
|
|
|
$headers = substr($output, 0, $info['header_size']);
|
|
|
|
if (preg_match("@Set-Cookie: GUID=([^;]+);@i", $headers, $matches)) {
|
|
$this->guid = $matches[1];
|
|
}
|
|
|
|
if (preg_match('/<div id=\'token\'.+>(.*)<\/div>/', $output, $m)) {
|
|
$this->token = $m[1];
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// returns the uTorrent build number
|
|
public function getBuild(){
|
|
$json = $this->makeRequest("?");
|
|
return $json['build'];
|
|
}
|
|
|
|
// returns an array of files for the specified torrent hash
|
|
// TODO:
|
|
// - (when implemented in API) allow multiple hashes to be specified
|
|
public function getFiles($hash) {
|
|
$json = $this->makeRequest("?action=getfiles&hash=".$hash);
|
|
return $json['files'];
|
|
}
|
|
|
|
// returns an array of all labels
|
|
public function getLabels(){
|
|
$json = $this->makeRequest("?list=1");
|
|
return $json['label'];
|
|
}
|
|
|
|
// returns an array of the properties for the specified torrent hash
|
|
// TODO:
|
|
// - (when implemented in API) allow multiple hashes to be specified
|
|
public function getProperties($hash) {
|
|
$json = $this->makeRequest("?action=getprops&hash=".$hash);
|
|
return $json['props'];
|
|
}
|
|
|
|
// returns an array of all settings
|
|
public function getSettings() {
|
|
$json = $this->makeRequest("?action=getsettings");
|
|
return $json['settings'];
|
|
}
|
|
|
|
// returns an array of all torrent jobs and related information
|
|
public function getTorrents() {
|
|
$json = $this->makeRequest("?list=1");
|
|
return $json['torrents'];
|
|
}
|
|
|
|
/**
|
|
* Get all the RSS favourites/filters
|
|
* @return model\Filter[]
|
|
*/
|
|
public function getRSSFilters() {
|
|
$json = $this->makeRequest("?list=1");
|
|
$filters = array();
|
|
foreach ($json['rssfilters'] as $filter) {
|
|
$filters[] = model\Filter::fromData($filter);
|
|
}
|
|
return $filters;
|
|
}
|
|
|
|
/**
|
|
* Update an RSS filter as retrieved from getRSSFilters
|
|
* @param \uTorrent\model\Filter $filter
|
|
*/
|
|
public function setRSSFilter(model\Filter $filter) {
|
|
$request = array_merge(array('action' => 'filter-update'), $filter->toParams());
|
|
return $this->makeRequest('?'.http_build_query($request));
|
|
}
|
|
|
|
/**
|
|
* Add a new RSS filter
|
|
* Requires a utorrent > 2.2.1 (not sure which version exactly)
|
|
* @param \uTorrent\model\Filter $filter
|
|
* @return int ID of the new filter
|
|
*/
|
|
public function addRSSFilter(model\Filter $filter) {
|
|
$filter->filterId = -1;
|
|
$resp = $this->setRSSFilter($filter);
|
|
if (!empty($resp['filter_ident'])) {
|
|
return $resp['filter_ident'];
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
// returns true if WebUI server is online and enabled, false otherwise
|
|
public function is_online() {
|
|
return is_array($this->makeRequest("?"));
|
|
}
|
|
|
|
// sets the properties for the specified torrent hash
|
|
// TODO:
|
|
// - allow multiple hashes, properties, and values to be set simultaneously
|
|
public function setProperties($hash, $property, $value) {
|
|
$this->makeRequest("?action=setprops&hash=".$hash."&s=".$property."&v=".$value, false);
|
|
}
|
|
|
|
// sets the priorities for the specified files in the specified torrent hash
|
|
public function setPriority($hash, $files, $priority) {
|
|
$this->makeRequest("?action=setprio&hash=".$hash."&p=".$priority.$this->paramImplode("&f=", $files), false);
|
|
}
|
|
|
|
// sets the settings
|
|
// TODO:
|
|
// - allow multiple settings and values to be set simultaneously
|
|
public function setSetting($setting, $value) {
|
|
$this->makeRequest("?action=setsetting&s=".$setting."&v=".$value, false);
|
|
}
|
|
|
|
// add a file to the list
|
|
public function torrentAdd($filename, &$estring = false) {
|
|
$split = explode(":", $filename, 2);
|
|
if (count($split) > 1 && (stristr("|http|https|file|magnet|", "|".$split[0]."|") !== false)) {
|
|
$this->makeRequest("?action=add-url&s=".urlencode($filename), false);
|
|
}
|
|
elseif (file_exists($filename)) {
|
|
$json = $this->makeRequest("?action=add-file", true, array(CURLOPT_POSTFIELDS => array("torrent_file" => "@".realpath($filename))));
|
|
|
|
if (isset($json['error'])) {
|
|
if ($estring !== false) $estring = $json['error'];
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
else {
|
|
if ($estring !== false) $estring = "File doesn't exist!";
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// force start the specified torrent hashes
|
|
public function torrentForceStart($hash) {
|
|
$this->makeRequest("?action=forcestart".$this->paramImplode("&hash=", $hash), false);
|
|
}
|
|
|
|
// pause the specified torrent hashes
|
|
public function torrentPause($hash) {
|
|
$this->makeRequest("?action=pause".$this->paramImplode("&hash=", $hash), false);
|
|
}
|
|
|
|
// recheck the specified torrent hashes
|
|
public function torrentRecheck($hash) {
|
|
$this->makeRequest("?action=recheck".$this->paramImplode("&hash=", $hash), false);
|
|
}
|
|
|
|
// start the specified torrent hashes
|
|
public function torrentStart($hash) {
|
|
$this->makeRequest("?action=start".$this->paramImplode("&hash=", $hash), false);
|
|
}
|
|
|
|
// stop the specified torrent hashes
|
|
public function torrentStop($hash) {
|
|
$this->makeRequest("?action=stop".$this->paramImplode("&hash=", $hash), false);
|
|
}
|
|
|
|
// remove the specified torrent hashes (and data, if $data is set to true)
|
|
public function torrentRemove($hash, $data = false) {
|
|
$this->makeRequest("?action=".($data ? "removedata" : "remove").$this->paramImplode("&hash=", $hash), false);
|
|
}
|
|
}
|
|
|