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.
265 lines
7.3 KiB
265 lines
7.3 KiB
<?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_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);
|
|
}
|
|
}
|
|
|
|
?>
|