Usage: rest.php?command
Available commands: "; foreach ($rest_commands as $command) print "$command "; print ""; } else { header("Content-Type: text/xml"); $rest = new RestInterface(); foreach($_REQUEST as $command=>$arg) { if (in_array($command, $rest_commands)) print $rest->$command($arg); else print "Unknown command " . htmlentities($command) . "
"; } } // classes class RestInterface { public function global_status() { $info = globalinfo(); $common = new Common(); $down_speed = $info['download_speed']; $up_speed = $info['upload_speed']; $down_total = $common->bytes_to_readable($info['bytes_downloaded']); $up_total = $common->bytes_to_readable($info['bytes_uploaded']); $dht = $info['dht_support'] ? "on" : "off"; $encryption = $info['use_encryption'] ? "on" : "off"; $xml = new KTorrentXML('status_bar'); $elements = array( $xml->new_element('download_speed' , $down_speed), $xml->new_element('upload_speed' , $up_speed), $xml->new_element('downloaded_total', $down_total), $xml->new_element('uploaded_total', $up_total), $xml->new_element('dht', null, array('status' => $dht)), $xml->new_element('encryption', null, array('status' => $encryption)), ); foreach($elements as $element) { $xml->append_to_root($element); } return $xml->saveXML(); } public function download_status() { $download_status = downloadstatus(); $xml = new KTorrentXML('download_status'); foreach($download_status as $torrent) { $torrent_xml = $xml->new_element('torrent'); $xml->append_to_root($torrent_xml); // foreach(array_keys($torrent) as $key) { // $torrent_xml->appendChild( // $xml->new_element("raw_$key", $torrent[$key])); // } $status = $torrent['status']; $done = $torrent['bytes_downloaded']; $total_bytes = $torrent['total_bytes_to_download']; $bytes_left = $torrent['bytes_left_to_download']; $elements = array( $xml->new_element('name', $this->_clean_name($torrent['torrent_name'])), $xml->new_element('status', $this->_torrent_status($status), array('id' => $status)), $xml->new_element('running', $torrent['running']), $xml->new_element('download_rate', $torrent['download_rate']." down"), $xml->new_element('upload_rate', $torrent['upload_rate']." up"), $xml->new_element('size', $torrent['total_bytes']), $xml->new_element('peers', $torrent['num_peers']), $xml->new_element('uploaded', $torrent['bytes_uploaded']." uploaded"), $xml->new_element('downloaded', "$done downloaded", array('percent' => $this->_get_percent_done($total_bytes, $bytes_left))), ); foreach($elements as $element) { $torrent_xml->appendChild($element); } } return $xml->saveXML(); } public function torrents_details($torrent_id) { $xml = new KTorrentXML('torrents_details', null, array('id'=>$torrent_id)); $download_status = downloadstatus(); if (isset($download_status[$torrent_id])) foreach($download_status[$torrent_id]['files'] as $id=>$info) { $file_xml = $xml->new_element('file', '', array('id'=>$id)); $xml->append_to_root($file_xml); foreach($info as $key=>$val) $file_xml->appendChild($xml->new_element($key, $val)); } return $xml->saveXML(); } // Helper function for download_status private function _torrent_status($status_id) { $status = array( 0 => "Not started", 1 => "Seeding Complete", 2 => "Download Complete", 3 => "Seeding", 4 => "Downloading", 5 => "Stalled", 6 => "Stopped", 7 => "Allocating Diskspace", 8 => "Error", 9 => "Queued", 10 => "Checking Data" ); return $status[$status_id]; } // Truncate long torrent name, and HTML escape it. // This is a helper function for download_status. private function _clean_name($name) { $name = str_tqreplace("'", "\'", $name); if (strlen($name) > 30) { $name = substr($name, 0, 27); $name .= "..."; } $name = htmlspecialchars($name); return $name; } // Calculate percent done. // Helper function for download_status private function _get_percent_done($bytes_total, $bytes_left) { if($bytes_total) { $perc_done = round(100.0 - ($bytes_left / $bytes_total) * 100); return $perc_done; } else { return 0; } } } /** * Class to build a xml tree */ class KTorrentXML extends DomDocument { private $root_element; public function __construct($root, $value = null, $attributes = null) { tqparent::__construct('1.0'); $this->root_element = $this->createElement($root); $this->appendChild($this->root_element); $this->formatOutput = true; if ($attributes) foreach($attributes as $key=>$val) $this->root_element->setAttribute($key, $val); } // Creates an element, and returns it. public function new_element($name, $value = null, $attributes = null) { $element = $this->createElement($name); if ($value) { $element->appendChild($this->createTextNode($value)); } if ($attributes) { foreach(array_keys($attributes) as $key) { $element->setAttribute($key, $attributes[$key]); } } return $element; } // Append a given element to the root element of the xml file. public function append_to_root($element) { $this->root_element->appendChild($element); } } /** * Generic functions */ class Common { function bytes_to_readable($bytes) { if ($bytes < 1024) { return round($bytes, 2) . " bytes"; } else if (($kb = ($bytes / 1024)) < 1024) { return round($kb, 2) . " KB"; } else if (($mb = ($kb / 1024)) < 1024) { return round($mb, 2) . " MB"; } else { $gb = round($mb / 1024, 2); return "$gb GB"; } } function kb_to_readable($kbytes) { return Common::bytes_to_readable($kbytes * 1024); } } ?>