mirror of
https://gitee.com/ledc/IYUUAutoReseed
synced 2025-06-13 04:08:57 +00:00
RPC和AutoReseed文件重复
This commit is contained in:
@ -5,6 +5,8 @@
|
||||
namespace IYUU;
|
||||
|
||||
use Curl\Curl;
|
||||
use IYUU\Client\qBittorrent\qBittorrent;
|
||||
use IYUU\Client\Transmission\TransmissionRPC;
|
||||
use IYUU\Library\IFile;
|
||||
use IYUU\Library\Oauth;
|
||||
|
||||
@ -94,6 +96,7 @@ class AutoReseed
|
||||
// 合作站点自动注册鉴权
|
||||
Oauth::login(self::$apiUrl . self::$endpoints['login']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 连接远端RPC服务器
|
||||
*
|
||||
@ -132,7 +135,7 @@ class AutoReseed
|
||||
if (isset($v['move']) && $v['move']) {
|
||||
self::$move = array($k,$v['type']);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
} catch (\Exception $e) {
|
||||
echo '[ERROR] ' . $e->getMessage() . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
@ -228,7 +231,7 @@ class AutoReseed
|
||||
if (self::$move != null && (empty($v['move']))) {
|
||||
self::move($res, $v['type']);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
} catch (\Exception $e) {
|
||||
echo '[ERROR] ' . $e->getMessage() . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
@ -303,7 +306,7 @@ class AutoReseed
|
||||
echo '[ERROR] '.$type;
|
||||
break;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
} catch (\Exception $e) {
|
||||
echo '[ERROR] ' . $e->getMessage() . PHP_EOL;
|
||||
}
|
||||
return false;
|
||||
@ -329,6 +332,7 @@ class AutoReseed
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 提交种子hash给远端API,用来获取辅种数据
|
||||
* @param array $hashArray 种子hash数组
|
||||
@ -569,6 +573,7 @@ class AutoReseed
|
||||
}
|
||||
// 按客户端循环辅种 结束
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -1,367 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Rpc操作类
|
||||
*/
|
||||
class Rpc
|
||||
{
|
||||
/**
|
||||
* 版本号
|
||||
* @var string
|
||||
*/
|
||||
const VER = '0.0.1';
|
||||
|
||||
// 下载种子的请求类型 GET POST
|
||||
public static $method = 'GET';
|
||||
// RPC连接池
|
||||
public static $links = array();
|
||||
/**
|
||||
* cookie
|
||||
*/
|
||||
public static $cookies = '';
|
||||
/**
|
||||
* 浏览器 User-Agent
|
||||
*/
|
||||
public static $userAgent = '';
|
||||
/**
|
||||
* passkey
|
||||
*/
|
||||
public static $passkey = '';
|
||||
/**
|
||||
* 客户端配置
|
||||
*/
|
||||
public static $clients = '';
|
||||
/**
|
||||
* 监控目录
|
||||
*/
|
||||
public static $watch = '';
|
||||
/**
|
||||
* 种子存放路径
|
||||
*/
|
||||
public static $torrentDir = '';
|
||||
/**
|
||||
* 工作模式
|
||||
*/
|
||||
public static $workingMode = '';
|
||||
// 站点标识
|
||||
public static $site = '';
|
||||
/**
|
||||
* 负载均衡 控制变量
|
||||
*/
|
||||
public static $RPC_Key = 0;
|
||||
/**
|
||||
* 退出状态码
|
||||
*/
|
||||
public static $ExitCode = 0;
|
||||
/**
|
||||
* 初始化
|
||||
*/
|
||||
public static function init($site = '', $method = 'GET')
|
||||
{
|
||||
global $configALL;
|
||||
|
||||
self::$site = $site;
|
||||
self::$method = strtoupper($method);
|
||||
|
||||
$config = $configALL[$site];
|
||||
self::$cookies = $config['cookie'];
|
||||
self::$userAgent = isset($config['userAgent']) && $config['userAgent'] ? $config['userAgent'] : $configALL['default']['userAgent'];
|
||||
self::$clients = isset($config['clients']) && $config['clients'] ? $config['clients'] : $configALL['default']['clients'];
|
||||
self::$workingMode = isset($config['workingMode']) && $config['workingMode'] ? $config['workingMode'] : 0;
|
||||
$watch = isset($config['watch']) && $config['watch'] ? $config['watch'] : $configALL['default']['watch'];
|
||||
self::$watch = rtrim($watch, '/') . DS;
|
||||
self::$torrentDir = TORRENT_PATH . $site . DS;
|
||||
// 建立目录
|
||||
IFile::mkdir(self::$torrentDir);
|
||||
|
||||
self::links();
|
||||
}
|
||||
|
||||
/**
|
||||
* 连接远端RPC服务器
|
||||
*
|
||||
* @param string
|
||||
* @return array
|
||||
*/
|
||||
public static function links()
|
||||
{
|
||||
if (self::$workingMode === 1 && empty(self::$links)) {
|
||||
foreach (self::$clients as $k => $v) {
|
||||
// 跳过未配置的客户端
|
||||
if (empty($v['username']) || empty($v['password'])) {
|
||||
unset(self::$clients[$k]);
|
||||
echo "clients_".$k." 用户名或密码未配置,已跳过 \n\n";
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
switch ($v['type']) {
|
||||
case 'transmission':
|
||||
self::$links[$k]['rpc'] = new TransmissionRPC($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->sstats();
|
||||
print $v['type'].':'.$v['host']." Rpc连接成功 [{$result->result}] \n";
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
self::$links[$k]['rpc'] = new qBittorrent($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->appVersion();
|
||||
print $v['type'].':'.$v['host']." Rpc连接成功 [{$result}] \n";
|
||||
break;
|
||||
case 'uTorrent':
|
||||
self::$links[$k]['rpc'] = new uTorrent($v['host'], $v['username'], $v['password']);
|
||||
$result = self::$links[$k]['rpc']->getBuild();
|
||||
print $v['type'].':'.$v['host']." Rpc连接 [{$result}] \n";
|
||||
break;
|
||||
default:
|
||||
echo '[ERROR] '.$v['type'];
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
self::$links[$k]['type'] = $v['type'];
|
||||
self::$links[$k]['downloadDir'] = $v['downloadDir'];
|
||||
} catch (Exception $e) {
|
||||
echo '[ERROR] ' . $e->getMessage() . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 添加下载任务
|
||||
* @param string $torrent 种子元数据
|
||||
* @param string $save_path 保存路径
|
||||
* @return bool
|
||||
*/
|
||||
public static function add($torrent, $save_path = '', $extra_options = array())
|
||||
{
|
||||
switch ((int)self::$workingMode) {
|
||||
case 0: // watch默认工作模式
|
||||
// 复制到watch目录
|
||||
copy($torrent, $save_path);
|
||||
if (is_file($save_path)) {
|
||||
print "********watch模式,下载任务添加成功 \n\n";
|
||||
return true;
|
||||
} else {
|
||||
print "-----watch模式,下载任务添加失败!!! \n\n";
|
||||
}
|
||||
break;
|
||||
case 1: //负载均衡模式
|
||||
try {
|
||||
$is_url = false;
|
||||
if ((strpos($torrent, 'http://')===0) || (strpos($torrent, 'https://')===0) || (strpos($torrent, 'magnet:?xt=urn:btih:')===0)) {
|
||||
$is_url = true;
|
||||
}
|
||||
// 负载均衡
|
||||
$rpcKey = self::$RPC_Key;
|
||||
echo '选中:负载均衡'.$rpcKey."\n";
|
||||
self::rpcSelect();
|
||||
// 调试
|
||||
#p($result);
|
||||
// 下载服务器类型 判断
|
||||
$type = self::$links[$rpcKey]['type'];
|
||||
switch ($type) {
|
||||
case 'transmission':
|
||||
if ($is_url) {
|
||||
echo 'add';
|
||||
$result = self::$links[$rpcKey]['rpc']->add($torrent, self::$links[$rpcKey]['downloadDir'], $extra_options); // 种子URL添加下载任务
|
||||
} else {
|
||||
echo 'add_metainfo';
|
||||
$result = self::$links[$rpcKey]['rpc']->add_metainfo($torrent, self::$links[$rpcKey]['downloadDir'], $extra_options); // 种子文件添加下载任务
|
||||
}
|
||||
$id = $name = '';
|
||||
if (isset($result->arguments->torrent_duplicate)) {
|
||||
$id = $result->arguments->torrent_duplicate->id;
|
||||
$name = $result->arguments->torrent_duplicate->name;
|
||||
} elseif (isset($result->arguments->torrent_added)) {
|
||||
$id = $result->arguments->torrent_added->id;
|
||||
$name = $result->arguments->torrent_added->name;
|
||||
}
|
||||
if (!$id) {
|
||||
print "-----RPC添加种子任务,失败 [{$result->result}] \n\n";
|
||||
} else {
|
||||
print "********RPC添加下载任务成功 [{$result->result}] (id=$id) \n\n";
|
||||
// 新添加的任务,开始
|
||||
self::$links[$rpcKey]['rpc']->start($id);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
if ($is_url) {
|
||||
echo 'add';
|
||||
$result = self::$links[$rpcKey]['rpc']->add($torrent, self::$links[$rpcKey]['downloadDir'], $extra_options); // 种子URL添加下载任务
|
||||
} else {
|
||||
echo 'add_metainfo';
|
||||
$result = self::$links[$rpcKey]['rpc']->add_metainfo($torrent, self::$links[$rpcKey]['downloadDir'], $extra_options); // 种子文件添加下载任务
|
||||
}
|
||||
if ($result === 'Ok.') {
|
||||
print "********RPC添加下载任务成功 [{$result}] \n\n";
|
||||
return true;
|
||||
} else {
|
||||
print "-----RPC添加种子任务,失败 [{$result}] \n\n";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
echo '[ERROR] '.$type;
|
||||
break;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
die('[ERROR] ' . $e->getMessage() . PHP_EOL);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
echo "\n\n";
|
||||
# 暂未开放
|
||||
break;
|
||||
default:
|
||||
echo "\n\n";
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 负载均衡 选择算法
|
||||
*
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
public static function rpcSelect()
|
||||
{
|
||||
$clientsConut = count(self::$clients);
|
||||
if ($clientsConut > 1) {
|
||||
if ($clientsConut > (self::$RPC_Key+1)) {
|
||||
self::$RPC_Key++;
|
||||
} else {
|
||||
self::$RPC_Key = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @brief 种子处理函数
|
||||
* @param array $data 种子数组
|
||||
* Array
|
||||
(
|
||||
[id] => 118632
|
||||
[h1] => CCTV5+ 2019 ATP Men's Tennis Final 20191115B HDTV 1080i H264-HDxxx
|
||||
[title] => 央视体育赛事频道 2019年ATP男子网球年终总决赛 单打小组赛 纳达尔VS西西帕斯 20191115[优惠剩余时间:4时13分]
|
||||
[details] => https://XXX.me/details.php?id=118632
|
||||
[download] => https://XXX.me/download.php?id=118632
|
||||
[filename] => 118632.torrent
|
||||
[type] => 0
|
||||
[sticky] => 1
|
||||
[time] => Array
|
||||
(
|
||||
[0] => "2019-11-16 20:41:53">4时13分
|
||||
[1] => "2019-11-16 14:41:53">1时<br />46分
|
||||
)
|
||||
[comments] => 0
|
||||
[size] => 5232.64MB
|
||||
[seeders] => 69
|
||||
[leechers] => 10
|
||||
[completed] => 93
|
||||
[percentage] => 100%
|
||||
[owner] => 匿名
|
||||
)
|
||||
* @return
|
||||
*/
|
||||
public static function call($data = array())
|
||||
{
|
||||
foreach ($data as $key => $value) {
|
||||
// 控制台打印
|
||||
echo '主标题:'.$value['h1']."\n";
|
||||
echo '副标题:'.$value['title']."\n";
|
||||
echo '详情页:'.$value['details']."\n";
|
||||
if ($value['type'] != 0) {
|
||||
echo "-----非免费,已忽略! \n\n";
|
||||
continue;
|
||||
}
|
||||
if (isset($value['hr']) && ($value['hr'] == 1)) {
|
||||
echo "-----HR种子,已忽略! \n\n";
|
||||
continue;
|
||||
}
|
||||
// 下载任务的可选参数
|
||||
$extra_options = array();
|
||||
// 保存的文件名
|
||||
$filename = $value['id'] . '.torrent';
|
||||
// 默认watch工作模式,复制到此目录
|
||||
$to = self::$watch . $filename;
|
||||
// 种子完整存放路径
|
||||
$torrentFile = self::$torrentDir . $filename;
|
||||
if (is_file($torrentFile)) {
|
||||
$fileSize = filesize($torrentFile); //失败会返回false 或 0(0代表上次下载失败)
|
||||
if (!empty($fileSize)) {
|
||||
//种子已经存在
|
||||
echo '-----存在旧种子:'.$filename."\n\n";
|
||||
continue;
|
||||
}
|
||||
// 删除下载错误的文件
|
||||
IFile::unlink($torrentFile);
|
||||
}
|
||||
|
||||
// 调用过滤函数
|
||||
$isFilter = filter(self::$site, $value);
|
||||
if (is_string($isFilter)) {
|
||||
echo "-----" .$isFilter. "\n\n";
|
||||
continue;
|
||||
}
|
||||
//种子不存在
|
||||
echo '正在下载新种子... '.$value['download']." \n";
|
||||
// 创建文件、下载种子以二进制写入
|
||||
$content = '';
|
||||
$content = download($value['download'], self::$cookies, self::$userAgent, self::$method);
|
||||
#p($content);
|
||||
// 文件句柄
|
||||
$resource = fopen($torrentFile, "wb");
|
||||
// 成功:返回写入字节数,失败返回false
|
||||
$worldsnum = fwrite($resource, $content);
|
||||
// 关闭
|
||||
fclose($resource);
|
||||
// 判断
|
||||
if (is_bool($worldsnum)) {
|
||||
print "种子下载失败!!! \n\n";
|
||||
IFile::unlink($torrentFile);
|
||||
continue;
|
||||
} else {
|
||||
print "成功下载种子" . $filename . ',共计:' . $worldsnum . "字节 \n";
|
||||
sleep(mt_rand(2, 10));
|
||||
$ret = false;
|
||||
$rpcKey = self::$RPC_Key;
|
||||
switch ((int)self::$workingMode) {
|
||||
case 0: //默认工作模式
|
||||
$ret = self::add($torrentFile, $to);
|
||||
break;
|
||||
case 1: //负载均衡模式
|
||||
$type = self::$links[$rpcKey]['type'];
|
||||
// 下载服务器类型
|
||||
switch ($type) {
|
||||
case 'transmission':
|
||||
# code...
|
||||
break;
|
||||
case 'qBittorrent':
|
||||
$extra_options['name'] = 'torrents';
|
||||
$extra_options['filename'] = $filename;
|
||||
$extra_options['autoTMM'] = 'false'; //关闭自动种子管理
|
||||
break;
|
||||
default:
|
||||
# code...
|
||||
break;
|
||||
}
|
||||
// 种子文件添加下载任务
|
||||
$ret = self::add($content, $to, $extra_options);
|
||||
break;
|
||||
case 2:
|
||||
echo "\n\n";
|
||||
# 暂未开放
|
||||
break;
|
||||
default:
|
||||
echo "\n\n";
|
||||
break;
|
||||
}
|
||||
global $configALL;
|
||||
if (isset($configALL['iyuu.cn']) && ($ret === true)) {
|
||||
send(self::$site, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -196,35 +196,35 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
* @param array fields An array of return fields
|
||||
* @param int|array ids A list of transmission torrent ids
|
||||
*
|
||||
Request:
|
||||
{
|
||||
"arguments": {
|
||||
"fields": [ "id", "name", "totalSize" ],
|
||||
"ids": [ 7, 10 ]
|
||||
},
|
||||
"method": "torrent-get",
|
||||
"tag": 39693
|
||||
}
|
||||
|
||||
Response:
|
||||
{
|
||||
"arguments": {
|
||||
"torrents": [
|
||||
{
|
||||
"id": 10,
|
||||
"name": "Fedora x86_64 DVD",
|
||||
"totalSize": 34983493932,
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "Ubuntu x86_64 DVD",
|
||||
"totalSize", 9923890123,
|
||||
}
|
||||
]
|
||||
},
|
||||
"result": "success",
|
||||
"tag": 39693
|
||||
}
|
||||
* Request:
|
||||
* {
|
||||
* "arguments": {
|
||||
* "fields": [ "id", "name", "totalSize" ],
|
||||
* "ids": [ 7, 10 ]
|
||||
* },
|
||||
* "method": "torrent-get",
|
||||
* "tag": 39693
|
||||
* }
|
||||
*
|
||||
* Response:
|
||||
* {
|
||||
* "arguments": {
|
||||
* "torrents": [
|
||||
* {
|
||||
* "id": 10,
|
||||
* "name": "Fedora x86_64 DVD",
|
||||
* "totalSize": 34983493932,
|
||||
* },
|
||||
* {
|
||||
* "id": 7,
|
||||
* "name": "Ubuntu x86_64 DVD",
|
||||
* "totalSize", 9923890123,
|
||||
* }
|
||||
* ]
|
||||
* },
|
||||
* "result": "success",
|
||||
* "tag": 39693
|
||||
* }
|
||||
*/
|
||||
public function get($ids = array(), $fields = array())
|
||||
{
|
||||
@ -297,9 +297,11 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
* Either "filename" OR "metainfo" MUST be included.
|
||||
* All other arguments are optional.
|
||||
*
|
||||
* @param torrent_location The URL or path to the torrent file
|
||||
* @param save_path Folder to save torrent in
|
||||
* @param extra options Optional extra torrent options
|
||||
* @param string $torrent_location The URL or path to the torrent file
|
||||
* @param string $save_path Folder to save torrent in
|
||||
* @param array $extra_options Optional extra torrent options
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function add_file($torrent_location, $save_path = '', $extra_options = array())
|
||||
{
|
||||
@ -314,9 +316,11 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
/**
|
||||
* Add a torrent using the raw torrent data
|
||||
*
|
||||
* @param torrent_metainfo The raw, unencoded contents (metainfo) of a torrent
|
||||
* @param save_path Folder to save torrent in
|
||||
* @param extra options Optional extra torrent options
|
||||
* @param string $torrent_metainfo The raw, unencoded contents (metainfo) of a torrent
|
||||
* @param string $save_path Folder to save torrent in
|
||||
* @param array $extra_options Optional extra torrent options
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array())
|
||||
{
|
||||
@ -392,12 +396,13 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
* | (must only be 1 torrent)
|
||||
* "path" | string the path to the file or folder that will be renamed
|
||||
* "name" | string the file or folder's new name
|
||||
|
||||
* Response arguments: "path", "name", and "id", holding the torrent ID integer
|
||||
*
|
||||
* @param int|array ids A 1-element list of transmission torrent ids
|
||||
* @param string path The path to the file or folder that will be renamed
|
||||
* @param string name The file or folder's new name
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function rename($ids, $path, $name)
|
||||
{
|
||||
@ -441,6 +446,8 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
* Set session variable(s)
|
||||
*
|
||||
* @param array of session variables to set
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function sset($arguments)
|
||||
{
|
||||
@ -452,6 +459,7 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
*
|
||||
* @param int The integer "torrent status"
|
||||
* @returns string The translated meaning
|
||||
* @return string
|
||||
*/
|
||||
public function getStatusString($intstatus)
|
||||
{
|
||||
@ -504,12 +512,12 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Clean up the request array. Removes any empty fields from the request
|
||||
*
|
||||
* @param array array The request associative array to clean
|
||||
* @returns array The cleaned array
|
||||
* @return array|null
|
||||
*/
|
||||
protected function cleanRequestData($array)
|
||||
{
|
||||
@ -550,6 +558,7 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
*
|
||||
* @param object The request result to clean
|
||||
* @returns array The cleaned object
|
||||
* @return array|object
|
||||
*/
|
||||
protected function cleanResultObject($object)
|
||||
{
|
||||
@ -587,6 +596,7 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
* @param string $method 请求类型/方法, 详见 $this->allowMethods
|
||||
* @param array $arguments 附加参数, 可选
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
protected function request($method, $arguments = array())
|
||||
{
|
||||
@ -637,6 +647,7 @@ class TransmissionRPC implements AbstractClientInterface
|
||||
}
|
||||
return $this->return_as_array ? json_decode($content, true) : $this->cleanResultObject(json_decode($content)); // Return the sanitized result
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs an empty GET on the Transmission RPC to get the X-Transmission-Session-Id
|
||||
* and store it in $this->session_id
|
||||
|
@ -36,7 +36,7 @@ class TransmissionRPCException extends \Exception
|
||||
/**
|
||||
* Exception constructor
|
||||
*/
|
||||
public function __construct($message = null, $code = 0, Exception $previous = null)
|
||||
public function __construct($message = null, $code = 0, \Exception $previous = null)
|
||||
{
|
||||
// PHP version 5.3.0 and above support Exception linking
|
||||
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
|
||||
|
@ -1,5 +1,7 @@
|
||||
{
|
||||
"require": {
|
||||
"ext-json": "*",
|
||||
"ext-mbstring": "*",
|
||||
"owner888/phpspider": "^2.1",
|
||||
"curl/curl": "^2.2"
|
||||
},
|
||||
|
Reference in New Issue
Block a user