diff options
Diffstat (limited to 'plugins/webinterface/www/coldmilk/rest.php')
-rw-r--r-- | plugins/webinterface/www/coldmilk/rest.php | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/plugins/webinterface/www/coldmilk/rest.php b/plugins/webinterface/www/coldmilk/rest.php new file mode 100644 index 0000000..bab7e68 --- /dev/null +++ b/plugins/webinterface/www/coldmilk/rest.php @@ -0,0 +1,265 @@ +<?php + + /*************************************************************************** + * Copyright (C) 2007 by Dagur Valberg Johannsson * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +/** + * Simple REST interface. + */ + +$rest_commands = array( + "global_status", + "download_status", + "torrents_details" +); + +if (!array_keys($_REQUEST)) { + header("Content-Type: text/html"); + print "<html><body> + Usage: rest.php?command<br /> + Available commands: "; + foreach ($rest_commands as $command) + print "$command "; + + print "</body></html>"; +} + +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) . "<br />"; + + } +} + +// 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_replace("'", "\'", $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) { + parent::__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); + } +} + +?>
\ No newline at end of file |