first commit.

This commit is contained in:
kj
2026-10-05 15:08:39 -03:00
commit b7799f9fff
93 changed files with 8966 additions and 0 deletions
+179
View File
@@ -0,0 +1,179 @@
<?php
namespace Libs;
use CurlHandle;
/**
* Aria2
*
* Library to control aria2c from PHP
* using its jsonrpc API.
*
* @author KJ
* @website https://kj2.me
* @licence MIT
*/
class Aria2
{
protected CurlHandle $ch;
protected ?string $token;
protected bool $batch = false;
protected array $batch_list = [];
/**
* Constructor
*
* @param string $server
* Path to aria2's jsonrpc server.
* @param string|null $token
* (optional) Access token for aria2c API.
*/
public function __construct(string $server = 'http://127.0.0.1:6800/jsonrpc', ?string $token = null)
{
$this->ch = curl_init($server);
$this->token = $token;
curl_setopt_array($this->ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
]);
}
/**
* Destructor
*
* @return void
*/
public function __destruct()
{
curl_close($this->ch);
}
/**
* Allows starting a batch call.
*
* @return static
*/
public function batch(): static
{
$this->batch = true;
return $this;
}
/**
* Returns whether it is in a batch call or not.
*
* @return bool
*/
public function inBatch(): bool
{
return $this->batch;
}
/**
* Sends a batch request.
*
* @return mixed
*/
public function commit(): mixed
{
$data = json_encode($this->batch_list);
$this->batch = false;
$this->batch_list = [];
$result = $this->send($data);
return json_decode($result);
}
/**
* Sends a request to aria2c via jsonrpc.
*
* @param string $data
* @return string|bool
*/
protected function send(string $data): string|bool
{
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
return curl_exec($this->ch);
}
/**
* Magic to simplify work :).
*
* PHP methods are automatically converted into aria2 methods.
*
* aria2.addUri => Aria2::addUri
* aria2.addTorrent => Aria2::addTorrent
* aria2.getPeers => Aria2::getPeers
* aria2.addMetalink => Aria2::addMetalink
* aria2.remove => Aria2::remove
* aria2.pause => Aria2::pause
* aria2.forcePause => Aria2::forcePause
* aria2.pauseAll => Aria2::pauseAll
* aria2.forcePauseAll => Aria2::forcePauseAll
* aria2.unpause => Aria2::unpause
* aria2.unpauseAll => Aria2::unpauseAll
* aria2.forceRemove => Aria2::forceRemove
* aria2.changePosition => Aria2::changePosition
* aria2.tellStatus => Aria2::tellStatus
* aria2.getUris => Aria2::getUris
* aria2.getFiles => Aria2::getFiles
* aria2.getServers => Aria2::getServers
* aria2.tellActive => Aria2::tellActive
* aria2.tellWaiting => Aria2::tellWaiting
* aria2.tellStopped => Aria2::tellStopped
* aria2.getOption => Aria2::getOption
* aria2.changeUri => Aria2::changeUri
* aria2.changeOption => Aria2::changeOption
* aria2.getGlobalOption => Aria2::getGlobalOption
* aria2.changeGlobalOption => Aria2::changeGlobalOption
* aria2.purgeDownloadResult => Aria2::purgeDownloadResult
* aria2.removeDownloadResult => Aria2::removeDownloadResult
* aria2.getVersion => Aria2::getVersion
* aria2.getSessionInfo => Aria2::getSessionInfo
* aria2.shutdown => Aria2::shutdown
* aria2.forceShutdown => Aria2::forceShutdown
* aria2.getGlobalStat => Aria2::getGlobalStat
* aria2.saveSession => Aria2::saveSession
* system.multicall => Aria2::system_multicall
* system.listMethods => Aria2::system_listMethods
* system.listNotifications => Aria2::system_listNotifications
*
* @param array<int,mixed> $arg
* @return mixed
*/
public function __call(string $name, array $arg): mixed
{
if (!is_null($this->token)) {
array_unshift($arg, $this->token);
}
// Allow system methods (the last 3 on the list)
if (strpos($name, '_') === false) { // if it doesn't contain underscores, it's an aria2 method command.
$name = 'aria2.' . $name;
} else {
$name = str_replace('_', '.', $name);
}
$data = [
'jsonrpc' => '2.0',
'id' => '1',
'method' => $name,
'params' => $arg,
];
// Apply batch call if we are in one
if ($this->batch) {
$this->batch_list[] = $data;
return $this;
}
$data = json_encode($data);
$response = $this->send($data);
if ($response === false) {
trigger_error(curl_error($this->ch));
}
return json_decode($response);
}
}