mirror of
https://gitee.com/ledc/IYUUAutoReseed
synced 2025-08-24 15:04:50 +00:00
Compare commits
45 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
e66d632ba3 | ||
|
87d9f81bad | ||
|
7b2e82c506 | ||
|
ae63bfca89 | ||
|
6c1211708c | ||
|
40387fdb5b | ||
|
e10c36295c | ||
|
801d7b016f | ||
|
1ff415ea91 | ||
|
849370e26a | ||
|
815156b252 | ||
|
d62be67927 | ||
|
d513b1bedf | ||
|
b566181968 | ||
|
60b4939aee | ||
|
dad8afa8d4 | ||
|
a60e5f859c | ||
|
59622691e1 | ||
|
3a97c17e66 | ||
|
6d3b937097 | ||
|
4277568346 | ||
|
84f75ea443 | ||
|
715be0e7eb | ||
|
6eebc7d26c | ||
|
30410735af | ||
|
99a2894f37 | ||
|
13b176c4a1 | ||
|
afca458acc | ||
|
b8b05ff3bf | ||
|
d402d30aac | ||
|
11c976d2c0 | ||
|
630dc3af92 | ||
|
463e45ee38 | ||
|
b046ecc75f | ||
|
468813a057 | ||
|
fdd5475e37 | ||
|
1f4da154fb | ||
|
419b6eb8cd | ||
|
289df1e126 | ||
|
4d86a9cb9f | ||
|
c79d5e4592 | ||
|
c9fb5c6a6a | ||
|
a744f5e785 | ||
|
84394c3a71 | ||
|
fd61ee86a1 |
2
.dockerignore
Normal file
2
.dockerignore
Normal file
@@ -0,0 +1,2 @@
|
||||
.git
|
||||
*
|
4
1.Windows辅种.cmd
Normal file
4
1.Windows辅种.cmd
Normal file
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
chcp 65001
|
||||
%~dp0php\php %~dp0iyuu.php
|
||||
pause
|
@@ -2,6 +2,5 @@
|
||||
chcp 65001
|
||||
git fetch --all
|
||||
git reset --hard origin/master
|
||||
#git pull
|
||||
php %cd%\iyuu.php
|
||||
php %~dp0iyuu.php
|
||||
pause
|
@@ -1,4 +1,4 @@
|
||||
@echo off
|
||||
chcp 65001
|
||||
php %cd%\iyuu.php
|
||||
php %~dp0iyuu.php
|
||||
pause
|
31
Dockerfile
31
Dockerfile
@@ -1,6 +1,8 @@
|
||||
FROM swoft/alphp:base
|
||||
#FROM swoft/alphp:cli
|
||||
#FROM alpine:latest
|
||||
#FROM alpine:3.12
|
||||
FROM alpine:3.8
|
||||
#FROM swoft/alphp:base
|
||||
#FROM swoft/alphp:cli
|
||||
|
||||
LABEL maintainer="david <367013672@qq.com>" version="1.0"
|
||||
|
||||
@@ -16,7 +18,8 @@ ARG app_env=prod
|
||||
# ARG add_user=www-data
|
||||
|
||||
ENV APP_ENV=${app_env:-"prod"} \
|
||||
TIMEZONE=${timezone:-"Asia/Shanghai"}
|
||||
TIMEZONE=${timezone:-"Asia/Shanghai"} \
|
||||
cron="3 */10 * * *"
|
||||
|
||||
##
|
||||
# ---------- building ----------
|
||||
@@ -24,7 +27,7 @@ ENV APP_ENV=${app_env:-"prod"} \
|
||||
|
||||
RUN set -ex \
|
||||
# change apk source repo
|
||||
# && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
|
||||
#&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
|
||||
&& apk update \
|
||||
&& apk add --no-cache \
|
||||
# Install base packages ('ca-certificates' will install 'nghttp2-libs')
|
||||
@@ -60,6 +63,7 @@ RUN set -ex \
|
||||
# php7-pdo_mysql \
|
||||
# php7-pdo_sqlite \
|
||||
# php7-phar \
|
||||
# php7-pcntl \
|
||||
# php7-posix \
|
||||
# php7-redis \
|
||||
php7-simplexml \
|
||||
@@ -73,10 +77,12 @@ RUN set -ex \
|
||||
# php7-tokenizer \
|
||||
php7-zip \
|
||||
# php7-zlib \
|
||||
php7-xml \
|
||||
&& git clone https://gitee.com/ledc/IYUUAutoReseed.git /var/www \
|
||||
&& cp /var/www/config/config.sample.php /var/www/config/config.php \
|
||||
&& ln -sf /var/www/config/config.php /config.php \
|
||||
php7-xml \
|
||||
&& git clone https://gitee.com/ledc/IYUUAutoReseed.git /IYUU \
|
||||
&& cp /IYUU/config/config.sample.php /IYUU/config/config.php \
|
||||
&& ln -sf /IYUU/config/config.php /config.php \
|
||||
&& cp /IYUU/docker/entrypoint.sh /entrypoint.sh \
|
||||
&& chmod +x /entrypoint.sh \
|
||||
&& apk del --purge *-dev \
|
||||
&& rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/share/php7 \
|
||||
# ---------- some config,clear work ----------
|
||||
@@ -91,6 +97,8 @@ RUN set -ex \
|
||||
# - config timezone
|
||||
&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
|
||||
&& echo "${TIMEZONE}" > /etc/timezone \
|
||||
&& echo '2 */5 * * * cd /IYUU && git fetch --all && git reset --hard origin/master' >> /etc/crontabs/root \
|
||||
#&& echo "${cron} /usr/bin/php /IYUU/iyuu.php &> /dev/null" >> /etc/crontabs/root \
|
||||
# ---------- some config work ----------
|
||||
# - ensure 'www-data' user exists(82 is the standard uid/gid for "www-data" in Alpine)
|
||||
# && addgroup -g 82 -S ${add_user} \
|
||||
@@ -100,6 +108,7 @@ RUN set -ex \
|
||||
# && chown -R ${add_user}:${add_user} /data \
|
||||
&& echo -e "\033[42;37m Build Completed :).\033[0m\n"
|
||||
|
||||
EXPOSE 9000
|
||||
# VOLUME ["/var/www", "/data"]
|
||||
WORKDIR /var/www
|
||||
# EXPOSE 9000
|
||||
# VOLUME ["/IYUU", "/data"]
|
||||
WORKDIR /IYUU
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
File diff suppressed because it is too large
Load Diff
@@ -1,66 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: David <367013672@qq.com>
|
||||
* Date: 2020-2-14
|
||||
* Time: 21:31:49
|
||||
*/
|
||||
|
||||
namespace IYUU\Client;
|
||||
|
||||
abstract class AbstractClient
|
||||
{
|
||||
/**
|
||||
* 公共方法:创建客户端实例
|
||||
*/
|
||||
public static function create($config = array())
|
||||
{
|
||||
$type = $config['type'];
|
||||
$host = $config['host'];
|
||||
$username = $config['username'];
|
||||
$password = $config['password'];
|
||||
$file = __DIR__ . DIRECTORY_SEPARATOR . $type . DIRECTORY_SEPARATOR . $type .'.php';
|
||||
if (!is_file($file)) {
|
||||
die($file.' 文件不存在');
|
||||
}
|
||||
$className = "\IYUU\Client\\" . $type . "\\" . $type;
|
||||
if (class_exists($className)) {
|
||||
echo $type." 客户端正在实例化!".PHP_EOL;
|
||||
return new $className($host, $username, $password);
|
||||
} else {
|
||||
die($className.' 客户端不存在');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询Bittorrent客户端状态
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function status();
|
||||
|
||||
/**
|
||||
* 获取种子列表
|
||||
* @return array(
|
||||
'hash' => string json,
|
||||
'sha1' => string,
|
||||
'hashString '=> array
|
||||
)
|
||||
*/
|
||||
abstract public function getList(&$move = array());
|
||||
|
||||
/**
|
||||
* 添加种子连接
|
||||
*/
|
||||
abstract public function add($torrent_url, $save_path = '', $extra_options = array());
|
||||
|
||||
/**
|
||||
* 添加种子原数据
|
||||
*/
|
||||
abstract public function add_metainfo($torrent_url, $save_path = '', $extra_options = array());
|
||||
|
||||
/**
|
||||
* 删除种子
|
||||
*/
|
||||
abstract public function delete($hash, $deleteFiles = false);
|
||||
}
|
@@ -1,350 +0,0 @@
|
||||
<?php
|
||||
namespace IYUU\Client\qBittorrent;
|
||||
|
||||
use Curl\Curl;
|
||||
use IYUU\Client\AbstractClient;
|
||||
|
||||
/**
|
||||
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation
|
||||
*/
|
||||
class qBittorrent extends AbstractClient
|
||||
{
|
||||
private $debug;
|
||||
private $url;
|
||||
private $api_version;
|
||||
private $curl;
|
||||
protected $delimiter;
|
||||
private $endpoints = [
|
||||
'login' => [
|
||||
'1' => '/login',
|
||||
'2' => '/api/v2/auth/login'
|
||||
],
|
||||
'app_version' => [
|
||||
'1' => '/version/qbittorrent',
|
||||
'2' => '/api/v2/app/version'
|
||||
],
|
||||
'api_version' => [
|
||||
'1' => '/version/api',
|
||||
'2' => '/api/v2/app/webapiVersion'
|
||||
],
|
||||
'build_info' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/app/buildInfo'
|
||||
],
|
||||
'preferences' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/app/preferences'
|
||||
],
|
||||
'setPreferences' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/app/setPreferences'
|
||||
],
|
||||
'defaultSavePath' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/app/defaultSavePath'
|
||||
],
|
||||
'torrent_list' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/torrents/info'
|
||||
],
|
||||
'torrent_add' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/torrents/add'
|
||||
],
|
||||
'torrent_delete' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/torrents/delete'
|
||||
],
|
||||
'torrent_pause' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/torrents/pause'
|
||||
],
|
||||
'torrent_resume' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/torrents/resume'
|
||||
],
|
||||
'set_torrent_location' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/torrents/setLocation'
|
||||
],
|
||||
'maindata' => [
|
||||
'1' => null,
|
||||
'2' => '/api/v2/sync/maindata'
|
||||
]
|
||||
];
|
||||
|
||||
public function __construct($url='', $username='', $password='', $api_version = 2, $debug = false)
|
||||
{
|
||||
$this->debug = $debug;
|
||||
$this->url = rtrim($url, '/');
|
||||
$this->username = $username;
|
||||
$this->password = $password;
|
||||
$this->api_version = $api_version;
|
||||
$this->curl = new Curl();
|
||||
$this->curl->setOpt(CURLOPT_SSL_VERIFYPEER, false); // 禁止验证证书
|
||||
$this->curl->setOpt(CURLOPT_SSL_VERIFYHOST, 2); // 不检查证书
|
||||
$this->curl->setOpt(CURLOPT_CONNECTTIMEOUT, 60); // 超时
|
||||
$this->curl->setOpt(CURLOPT_TIMEOUT, 600); // 超时
|
||||
// Authenticate and get cookie, else throw exception
|
||||
if (!$this->authenticate()) {
|
||||
throw new \Exception("qBittorrent Unable to authenticate with Web Api.");
|
||||
}
|
||||
}
|
||||
|
||||
public function appVersion()
|
||||
{
|
||||
return $this->getData('app_version');
|
||||
}
|
||||
|
||||
public function apiVersion()
|
||||
{
|
||||
return $this->getData('api_version');
|
||||
}
|
||||
|
||||
public function buildInfo()
|
||||
{
|
||||
return $this->getData('build_info');
|
||||
}
|
||||
|
||||
public function preferences($data = null)
|
||||
{
|
||||
if (!empty($data)) {
|
||||
return $this->postData('setPreferences', ['json' => json_encode($data)]);
|
||||
}
|
||||
|
||||
return $this->getData('preferences');
|
||||
}
|
||||
|
||||
public function torrentList()
|
||||
{
|
||||
return $this->getData('torrent_list');
|
||||
}
|
||||
/**
|
||||
* @param array $extra_options
|
||||
array(
|
||||
'urls' => '',
|
||||
'savepath' => '',
|
||||
'cookie' => '',
|
||||
'category' => '',
|
||||
'skip_checking' => true,
|
||||
'paused' => true,
|
||||
'root_folder' => true,
|
||||
)
|
||||
* @return array
|
||||
*/
|
||||
public function add($torrent_url, $save_path = '', $extra_options = array())
|
||||
{
|
||||
if (!empty($save_path)) {
|
||||
$extra_options['savepath'] = $save_path;
|
||||
}
|
||||
$extra_options['urls'] = $torrent_url;
|
||||
#$extra_options['skip_checking'] = 'true'; //跳校验
|
||||
// 关键 上传文件流 multipart/form-data【严格按照api文档编写】
|
||||
$post_data = $this->buildUrls($extra_options);
|
||||
#p($post_data);
|
||||
// 设置请求头
|
||||
$this->curl->setHeader('Content-Type', 'multipart/form-data; boundary='.$this->delimiter);
|
||||
$this->curl->setHeader('Content-Length', strlen($post_data));
|
||||
return $this->postData('torrent_add', $post_data);
|
||||
}
|
||||
|
||||
public function add_metainfo($torrent_metainfo, $save_path = '', $extra_options = array())
|
||||
{
|
||||
if (!empty($save_path)) {
|
||||
$extra_options['savepath'] = $save_path;
|
||||
}
|
||||
$extra_options['torrents'] = $torrent_metainfo;
|
||||
#$extra_options['skip_checking'] = 'true'; //跳校验
|
||||
// 关键 上传文件流 multipart/form-data【严格按照api文档编写】
|
||||
$post_data = $this->buildData($extra_options);
|
||||
// 设置请求头
|
||||
$this->curl->setHeader('Content-Type', 'multipart/form-data; boundary='.$this->delimiter);
|
||||
$this->curl->setHeader('Content-Length', strlen($post_data));
|
||||
return $this->postData('torrent_add', $post_data);
|
||||
}
|
||||
|
||||
public function torrentDeleteAll($deleteFiles = false)
|
||||
{
|
||||
$torrents = json_decode($this->torrentList());
|
||||
$response = '';
|
||||
foreach ($torrents as $torrent) {
|
||||
$response .= $this->torrentDelete($torrent->hash, $deleteFiles);
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
public function torrentPause($hash)
|
||||
{
|
||||
return $this->postData('torrent_pause', ['hashes' => $hash]);
|
||||
}
|
||||
|
||||
public function torrentResume($hash)
|
||||
{
|
||||
return $this->postData('torrent_resume', ['hashes' => $hash]);
|
||||
}
|
||||
|
||||
public function setTorrentLocation($hash, $location)
|
||||
{
|
||||
return $this->postData('set_torrent_location', ['hashes' => $hash, 'location' => $location]);
|
||||
}
|
||||
|
||||
private function getData($endpoint)
|
||||
{
|
||||
$this->curl->get($this->url . $this->endpoints[$endpoint][$this->api_version]);
|
||||
|
||||
if ($this->debug) {
|
||||
var_dump($this->curl->request_headers);
|
||||
var_dump($this->curl->response_headers);
|
||||
}
|
||||
|
||||
if ($this->curl->error) {
|
||||
return $this->errorMessage();
|
||||
}
|
||||
|
||||
return $this->curl->response;
|
||||
}
|
||||
|
||||
private function postData($endpoint, $data)
|
||||
{
|
||||
$this->curl->post($this->url . $this->endpoints[$endpoint][$this->api_version], $data);
|
||||
|
||||
if ($this->debug) {
|
||||
var_dump($this->curl->request_headers);
|
||||
var_dump($this->curl->response_headers);
|
||||
}
|
||||
|
||||
if ($this->curl->error) {
|
||||
return $this->errorMessage();
|
||||
}
|
||||
|
||||
return $this->curl->response;
|
||||
}
|
||||
|
||||
private function authenticate()
|
||||
{
|
||||
$this->curl->post($this->url . $this->endpoints['login'][$this->api_version], [
|
||||
'username' => $this->username,
|
||||
'password' => $this->password
|
||||
]);
|
||||
|
||||
if ($this->debug) {
|
||||
var_dump($this->curl->request_headers);
|
||||
var_dump($this->curl->response_headers);
|
||||
}
|
||||
|
||||
// Find authentication cookie and set in curl connection
|
||||
foreach ($this->curl->response_headers as $header) {
|
||||
if (preg_match('/SID=(\S[^;]+)/', $header, $matches)) {
|
||||
$this->curl->setHeader('Cookie', $matches[0]);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private function errorMessage()
|
||||
{
|
||||
return 'Curl Error Code: ' . $this->curl->error_code . ' (' . $this->curl->response . ')';
|
||||
}
|
||||
/**
|
||||
* 拼接种子urls multipart/form-data
|
||||
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent
|
||||
*/
|
||||
private function buildUrls($param)
|
||||
{
|
||||
$this->delimiter = uniqid();
|
||||
$eol = "\r\n";
|
||||
$data = '';
|
||||
// 拼接文件流
|
||||
foreach ($param as $name => $content) {
|
||||
$data .= "--" . $this->delimiter . $eol;
|
||||
$data .= 'Content-Disposition: form-data; name="' .$name. '"' . $eol . $eol;
|
||||
$data .= $content . $eol;
|
||||
}
|
||||
$data .= "--" . $this->delimiter . "--" . $eol;
|
||||
return $data;
|
||||
}
|
||||
/**
|
||||
* 拼接种子上传文件流 multipart/form-data
|
||||
* https://github.com/qbittorrent/qBittorrent/wiki/Web-API-Documentation#add-new-torrent
|
||||
*/
|
||||
private function buildData($param)
|
||||
{
|
||||
$this->delimiter = uniqid();
|
||||
$eol = "\r\n";
|
||||
$data = '';
|
||||
// 拼接文件流
|
||||
$data .= "--" . $this->delimiter . $eol;
|
||||
$data .= 'Content-Disposition: form-data; name="' .$param['name']. '"; filename="'.$param['filename'].'"' . $eol;
|
||||
$data .= 'Content-Type: application/x-bittorrent' . $eol . $eol;
|
||||
$data .= $param['torrents'] . $eol;
|
||||
unset($param['name']);
|
||||
unset($param['filename']);
|
||||
unset($param['torrents']);
|
||||
if (!empty($param)) {
|
||||
foreach ($param as $name => $content) {
|
||||
$data .= "--" . $this->delimiter . $eol;
|
||||
$data .= 'Content-Disposition: form-data; name="' . $name . '"' . $eol . $eol;
|
||||
$data .= $content . $eol;
|
||||
}
|
||||
}
|
||||
$data .= "--" . $this->delimiter . "--" . $eol;
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽象方法,子类实现
|
||||
*/
|
||||
public function status()
|
||||
{
|
||||
return $this->appVersion();
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽象方法,子类实现
|
||||
*/
|
||||
public function getList(&$move = array())
|
||||
{
|
||||
$result = $this->getData('torrent_list');
|
||||
$res = json_decode($result, true);
|
||||
if (empty($res)) {
|
||||
echo "获取种子列表失败,可能qBittorrent暂时无响应,请稍后重试!".PHP_EOL;
|
||||
return array();
|
||||
}
|
||||
// 过滤,只保留正常做种
|
||||
$res = array_filter($res, function ($v) {
|
||||
if (isset($v['state']) && in_array($v['state'], array('uploading','stalledUP','pausedUP','queuedUP','checkingUP','forcedUP'))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}, ARRAY_FILTER_USE_BOTH);
|
||||
|
||||
if (empty($res)) {
|
||||
echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL;
|
||||
return array();
|
||||
}
|
||||
// 提取数组:hashString
|
||||
$info_hash = array_column($res, 'hash');
|
||||
// 升序排序
|
||||
sort($info_hash);
|
||||
$json = json_encode($info_hash, JSON_UNESCAPED_UNICODE);
|
||||
// 去重 应该从文件读入,防止重复提交
|
||||
$sha1 = sha1($json);
|
||||
// 组装返回数据
|
||||
$hashArray['hash'] = $json;
|
||||
$hashArray['sha1'] = $sha1;
|
||||
// 变换数组:hashString为键
|
||||
$hashArray['hashString'] = array_column($res, "save_path", 'hash');
|
||||
return $hashArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽象方法,子类实现
|
||||
*/
|
||||
public function delete($hash='', $deleteFiles = false)
|
||||
{
|
||||
return $this->postData('torrent_delete', ['hashes' => $hash, 'deleteFiles' => $deleteFiles ? 'true':'false']);
|
||||
}
|
||||
}
|
@@ -1,48 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Rhilip
|
||||
* Date: 1/17/2020
|
||||
* Time: 2020
|
||||
*/
|
||||
|
||||
namespace IYUU\Client\transmission;
|
||||
|
||||
/**
|
||||
* This is the type of exception the TransmissionRPC class will throw
|
||||
*/
|
||||
class TransmissionRPCException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Exception: Invalid arguments
|
||||
*/
|
||||
const E_INVALIDARG = -1;
|
||||
|
||||
/**
|
||||
* Exception: Invalid Session-Id
|
||||
*/
|
||||
const E_SESSIONID = -2;
|
||||
|
||||
/**
|
||||
* Exception: Error while connecting
|
||||
*/
|
||||
const E_CONNECTION = -3;
|
||||
|
||||
/**
|
||||
* Exception: Error 401 returned, unauthorized
|
||||
*/
|
||||
const E_AUTHENTICATION = -4;
|
||||
|
||||
/**
|
||||
* Exception constructor
|
||||
*/
|
||||
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', '>=')) {
|
||||
parent::__construct($message, $code, $previous);
|
||||
} else {
|
||||
parent::__construct($message, $code);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,759 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Transmission bittorrent client/daemon RPC communication class
|
||||
* Copyright (C) 2010 Johan Adriaans <johan.adriaans@gmail.com>,
|
||||
* Bryce Chidester <bryce@cobryce.com>
|
||||
*
|
||||
* 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* PHP version specific information
|
||||
* version_compare() (PHP 4 >= 4.1.0, PHP 5)
|
||||
* ctype_digit() (PHP 4 >= 4.0.4, PHP 5)
|
||||
* stream_context_create (PHP 4 >= 4.3.0, PHP 5)
|
||||
* PHP Class support (PHP 5) (PHP 4 might work, untested)
|
||||
*/
|
||||
|
||||
namespace IYUU\Client\transmission;
|
||||
|
||||
use IYUU\Client\AbstractClient;
|
||||
|
||||
/**
|
||||
* A friendly little version check...
|
||||
*/
|
||||
if (version_compare(PHP_VERSION, '5.2.10', '<')) {
|
||||
die("The TransmissionRPC class requires PHP version 5.2.10 or above." . PHP_EOL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transmission bittorrent client/daemon RPC communication class
|
||||
*
|
||||
* Usage example:
|
||||
* <code>
|
||||
* $rpc = new TransmissionRPC($rpc_url);
|
||||
* $result = $rpc->add_file( $url_or_path_to_torrent, $target_folder );
|
||||
* </code>
|
||||
*
|
||||
*/
|
||||
class transmission extends AbstractClient
|
||||
{
|
||||
/**
|
||||
* User agent used in all http communication
|
||||
*/
|
||||
const HTTP_UA = 'TransmissionRPC for PHP/0.3';
|
||||
|
||||
/**
|
||||
* The URL to the bittorent client you want to communicate with
|
||||
* the port (default: 9091) can be set in you Transmission preferences
|
||||
* @var string
|
||||
*/
|
||||
public $url = '';
|
||||
|
||||
/**
|
||||
* If your Transmission RPC requires authentication, supply username here
|
||||
* @var string
|
||||
*/
|
||||
public $username = '';
|
||||
|
||||
/**
|
||||
* If your Transmission RPC requires authentication, supply password here
|
||||
* @var string
|
||||
*/
|
||||
public $password = '';
|
||||
|
||||
/**
|
||||
* Print debugging information, default is off
|
||||
* @var bool
|
||||
*/
|
||||
public $debug = false;
|
||||
|
||||
/**
|
||||
* Transmission RPC version
|
||||
* @var int
|
||||
*/
|
||||
protected $rpc_version = 0;
|
||||
|
||||
/**
|
||||
* Transmission uses a session id to prevent CSRF attacks
|
||||
* @var string
|
||||
*/
|
||||
protected $session_id = '';
|
||||
|
||||
/**
|
||||
* Default values for stream context
|
||||
* @var array
|
||||
*/
|
||||
private $default_context_opts = array(
|
||||
'http' => array(
|
||||
'user_agent' => self::HTTP_UA,
|
||||
'timeout' => '60', // Don't want to be too slow
|
||||
'ignore_errors' => true, // Leave the error parsing/handling to the code
|
||||
),
|
||||
"ssl"=>array(
|
||||
"verify_peer"=>false,
|
||||
"verify_peer_name"=>false,
|
||||
)
|
||||
);
|
||||
|
||||
/**
|
||||
* Constants for torrent status
|
||||
*/
|
||||
const TR_STATUS_STOPPED = 0;
|
||||
const TR_STATUS_CHECK_WAIT = 1;
|
||||
const TR_STATUS_CHECK = 2;
|
||||
const TR_STATUS_DOWNLOAD_WAIT = 3;
|
||||
const TR_STATUS_DOWNLOAD = 4;
|
||||
const TR_STATUS_SEED_WAIT = 5;
|
||||
const TR_STATUS_SEED = 6;
|
||||
|
||||
const RPC_LT_14_TR_STATUS_CHECK_WAIT = 1;
|
||||
const RPC_LT_14_TR_STATUS_CHECK = 2;
|
||||
const RPC_LT_14_TR_STATUS_DOWNLOAD = 4;
|
||||
const RPC_LT_14_TR_STATUS_SEED = 8;
|
||||
const RPC_LT_14_TR_STATUS_STOPPED = 16;
|
||||
|
||||
/**
|
||||
* Takes the connection parameters
|
||||
*
|
||||
* @param string $url
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
*/
|
||||
public function __construct($url = 'http://127.0.0.1:9091/transmission/rpc', $username = null, $password = null)
|
||||
{
|
||||
$this->url = rtrim($url, '/');
|
||||
$this->username = $username;
|
||||
$this->password = $password;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start one or more torrents
|
||||
*
|
||||
* @param int|array ids A list of transmission torrent ids
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function start($ids)
|
||||
{
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
}
|
||||
$request = array("ids" => $ids);
|
||||
return $this->request("torrent-start", $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop one or more torrents
|
||||
*
|
||||
* @param int|array ids A list of transmission torrent ids
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function stop($ids)
|
||||
{
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
}
|
||||
$request = array("ids" => $ids);
|
||||
return $this->request("torrent-stop", $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reannounce one or more torrents
|
||||
*
|
||||
* @param int|array ids A list of transmission torrent ids
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function reannounce($ids)
|
||||
{
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
}
|
||||
$request = array("ids" => $ids);
|
||||
return $this->request("torrent-reannounce", $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify one or more torrents
|
||||
*
|
||||
* @param int|array ids A list of transmission torrent ids
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function verify($ids)
|
||||
{
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
}
|
||||
$request = array("ids" => $ids);
|
||||
return $this->request("torrent-verify", $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get information on torrents in transmission, if the ids parameter is
|
||||
* empty all torrents will be returned. The fields array can be used to return certain
|
||||
* fields. Default fields are: "id", "name", "status", "doneDate", "haveValid", "totalSize".
|
||||
* See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for available fields
|
||||
*
|
||||
* @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
|
||||
* }
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function get($ids = array(), $fields = array())
|
||||
{
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
} // Convert $ids to an array if only a single id was passed
|
||||
if (count($fields) == 0) {
|
||||
$fields = array("id", "name", "status", "doneDate", "haveValid", "totalSize");
|
||||
} // Defaults
|
||||
$request = array(
|
||||
"fields" => $fields,
|
||||
"ids" => $ids
|
||||
);
|
||||
return $this->request("torrent-get", $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set properties on one or more torrents, available fields are:
|
||||
* "bandwidthPriority" | number this torrent's bandwidth tr_priority_t
|
||||
* "downloadLimit" | number maximum download speed (in K/s)
|
||||
* "downloadLimited" | boolean true if "downloadLimit" is honored
|
||||
* "files-wanted" | array indices of file(s) to download
|
||||
* "files-unwanted" | array indices of file(s) to not download
|
||||
* "honorsSessionLimits" | boolean true if session upload limits are honored
|
||||
* "ids" | array torrent list, as described in 3.1
|
||||
* "location" | string new location of the torrent's content
|
||||
* "peer-limit" | number maximum number of peers
|
||||
* "priority-high" | array indices of high-priority file(s)
|
||||
* "priority-low" | array indices of low-priority file(s)
|
||||
* "priority-normal" | array indices of normal-priority file(s)
|
||||
* "seedRatioLimit" | double session seeding ratio
|
||||
* "seedRatioMode" | number which ratio to use. See tr_ratiolimit
|
||||
* "uploadLimit" | number maximum upload speed (in K/s)
|
||||
* "uploadLimited" | boolean true if "uploadLimit" is honored
|
||||
* See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for more information
|
||||
*
|
||||
* @param array arguments An associative array of arguments to set
|
||||
* @param int|array ids A list of transmission torrent ids
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function set($ids = array(), $arguments = array())
|
||||
{
|
||||
// See https://github.com/transmission/transmission/blob/2.9x/extras/rpc-spec.txt for available fields
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
} // Convert $ids to an array if only a single id was passed
|
||||
if (!isset($arguments['ids'])) {
|
||||
$arguments['ids'] = $ids;
|
||||
} // Any $ids given in $arguments overrides the method parameter
|
||||
return $this->request("torrent-set", $arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new torrent
|
||||
*
|
||||
* Available extra options:
|
||||
* key | value type & description
|
||||
* ---------------------+-------------------------------------------------
|
||||
* "download-dir" | string path to download the torrent to
|
||||
* "filename" | string filename or URL of the .torrent file
|
||||
* "metainfo" | string base64-encoded .torrent content
|
||||
* "paused" | boolean if true, don't start the torrent
|
||||
* "peer-limit" | number maximum number of peers
|
||||
* "bandwidthPriority" | number torrent's bandwidth tr_priority_t
|
||||
* "files-wanted" | array indices of file(s) to download
|
||||
* "files-unwanted" | array indices of file(s) to not download
|
||||
* "priority-high" | array indices of high-priority file(s)
|
||||
* "priority-low" | array indices of low-priority file(s)
|
||||
* "priority-normal" | array indices of normal-priority file(s)
|
||||
*
|
||||
* Either "filename" OR "metainfo" MUST be included.
|
||||
* All other arguments are optional.
|
||||
*
|
||||
* @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())
|
||||
{
|
||||
if (!empty($save_path)) {
|
||||
$extra_options['download-dir'] = $save_path;
|
||||
}
|
||||
$extra_options['filename'] = $torrent_location;
|
||||
|
||||
return $this->request("torrent-add", $extra_options);
|
||||
}
|
||||
|
||||
/* Add a new torrent using a file path or a URL (For backwards compatibility)
|
||||
* @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
|
||||
*/
|
||||
public function add($torrent_location, $save_path = '', $extra_options = array())
|
||||
{
|
||||
return $this->add_file($torrent_location, $save_path, $extra_options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a torrent using the raw torrent data
|
||||
*
|
||||
* @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())
|
||||
{
|
||||
if (!empty($save_path)) {
|
||||
$extra_options['download-dir'] = $save_path;
|
||||
}
|
||||
$extra_options['metainfo'] = base64_encode($torrent_metainfo);
|
||||
|
||||
return $this->request("torrent-add", $extra_options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove torrent from transmission
|
||||
*
|
||||
* @param bool delete_local_data Also remove local data?
|
||||
* @param int|array ids A list of transmission torrent ids
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function delete($ids, $delete_local_data = false)
|
||||
{
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
} // Convert $ids to an array if only a single id was passed
|
||||
$request = array(
|
||||
"ids" => $ids,
|
||||
"delete-local-data" => $delete_local_data
|
||||
);
|
||||
return $this->request("torrent-remove", $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Move local storage location
|
||||
*
|
||||
* @param int|array ids A list of transmission torrent ids
|
||||
* @param string target_location The new storage location
|
||||
* @param string move_existing_data Move existing data or scan new location for available data
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function move($ids, $target_location, $move_existing_data = true)
|
||||
{
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
} // Convert $ids to an array if only a single id was passed
|
||||
$request = array(
|
||||
"ids" => $ids,
|
||||
"location" => $target_location,
|
||||
"move" => $move_existing_data
|
||||
);
|
||||
return $this->request("torrent-set-location", $request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 3.7. Renaming a Torrent's Path
|
||||
*
|
||||
* Method name: "torrent-rename-path"
|
||||
*
|
||||
* For more information on the use of this function, see the transmission.h
|
||||
* documentation of tr_torrentRenamePath(). In particular, note that if this
|
||||
* call succeeds you'll want to update the torrent's "files" and "name" field
|
||||
* with torrent-get.
|
||||
*
|
||||
* Request arguments:
|
||||
*
|
||||
* string | value type & description
|
||||
* ---------------------------------+-------------------------------------------------
|
||||
* "ids" | array the torrent torrent list, as described in 3.1
|
||||
* | (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)
|
||||
{
|
||||
if (!is_array($ids)) {
|
||||
$ids = array($ids);
|
||||
} // Convert $id to an array if only a single id was passed
|
||||
if (count($ids) !== 1) {
|
||||
throw new TransmissionRPCException('A single id is accepted', TransmissionRPCException::E_INVALIDARG);
|
||||
}
|
||||
|
||||
$request = array(
|
||||
"ids" => $ids,
|
||||
"path" => $path,
|
||||
"name" => $name
|
||||
);
|
||||
return $this->request("torrent-rename-path", $request);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve session statistics
|
||||
*
|
||||
* @returns array of statistics
|
||||
*/
|
||||
public function sstats()
|
||||
{
|
||||
return $this->request("session-stats", array());
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all session variables
|
||||
*
|
||||
* @returns array of session information
|
||||
*/
|
||||
public function sget()
|
||||
{
|
||||
return $this->request("session-get", array());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set session variable(s)
|
||||
*
|
||||
* @param array of session variables to set
|
||||
* @return mixed
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function sset($arguments)
|
||||
{
|
||||
return $this->request("session-set", $arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the interpretation of the torrent status
|
||||
*
|
||||
* @param int The integer "torrent status"
|
||||
* @returns string The translated meaning
|
||||
* @return string
|
||||
*/
|
||||
public function getStatusString($intstatus)
|
||||
{
|
||||
if ($this->rpc_version < 14) {
|
||||
if ($intstatus == self::RPC_LT_14_TR_STATUS_CHECK_WAIT) {
|
||||
return "Waiting to verify local files";
|
||||
}
|
||||
if ($intstatus == self::RPC_LT_14_TR_STATUS_CHECK) {
|
||||
return "Verifying local files";
|
||||
}
|
||||
if ($intstatus == self::RPC_LT_14_TR_STATUS_DOWNLOAD) {
|
||||
return "Downloading";
|
||||
}
|
||||
if ($intstatus == self::RPC_LT_14_TR_STATUS_SEED) {
|
||||
return "Seeding";
|
||||
}
|
||||
if ($intstatus == self::RPC_LT_14_TR_STATUS_STOPPED) {
|
||||
return "Stopped";
|
||||
}
|
||||
} else {
|
||||
if ($intstatus == self::TR_STATUS_CHECK_WAIT) {
|
||||
return "Waiting to verify local files";
|
||||
}
|
||||
if ($intstatus == self::TR_STATUS_CHECK) {
|
||||
return "Verifying local files";
|
||||
}
|
||||
if ($intstatus == self::TR_STATUS_DOWNLOAD) {
|
||||
return "Downloading";
|
||||
}
|
||||
if ($intstatus == self::TR_STATUS_SEED) {
|
||||
return "Seeding";
|
||||
}
|
||||
if ($intstatus == self::TR_STATUS_STOPPED) {
|
||||
return "Stopped";
|
||||
}
|
||||
if ($intstatus == self::TR_STATUS_SEED_WAIT) {
|
||||
return "Queued for seeding";
|
||||
}
|
||||
if ($intstatus == self::TR_STATUS_DOWNLOAD_WAIT) {
|
||||
return "Queued for download";
|
||||
}
|
||||
}
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Here be dragons (Internal methods)
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* 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)
|
||||
{
|
||||
if (!is_array($array) || count($array) == 0) {
|
||||
return null;
|
||||
} // Nothing to clean
|
||||
setlocale(LC_NUMERIC, 'en_US.utf8'); // Override the locale - if the system locale is wrong, then 12.34 will encode as 12,34 which is invalid JSON
|
||||
foreach ($array as $index => $value) {
|
||||
if (is_object($value)) {
|
||||
$array[$index] = $value->toArray();
|
||||
} // Convert objects to arrays so they can be JSON encoded
|
||||
if (is_array($value)) {
|
||||
$array[$index] = $this->cleanRequestData($value);
|
||||
} // Recursion
|
||||
if (empty($value) && $value !== 0) { // Remove empty members
|
||||
unset($array[$index]);
|
||||
continue; // Skip the rest of the tests - they may re-add the element.
|
||||
}
|
||||
if (is_numeric($value)) {
|
||||
$array[$index] = $value + 0;
|
||||
} // Force type-casting for proper JSON encoding (+0 is a cheap way to maintain int/float/etc)
|
||||
if (is_bool($value)) {
|
||||
$array[$index] = ($value ? 1 : 0);
|
||||
} // Store boolean values as 0 or 1
|
||||
if (is_string($value)) {
|
||||
$type = mb_detect_encoding($value, "auto");
|
||||
if ($type !== 'UTF-8') {
|
||||
$array[$index] = mb_convert_encoding($value, "UTF-8");
|
||||
//utf8_encode( $value ); // Make sure all data is UTF-8 encoded for Transmission
|
||||
}
|
||||
}
|
||||
}
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行 rpc 请求
|
||||
*
|
||||
* @param string $method 请求类型/方法, 详见 $this->allowMethods
|
||||
* @param array $arguments 附加参数, 可选
|
||||
* @return array
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
protected function request($method, $arguments = array())
|
||||
{
|
||||
// Check the parameters
|
||||
if (!is_scalar($method)) {
|
||||
throw new TransmissionRPCException('Method name has no scalar value', TransmissionRPCException::E_INVALIDARG);
|
||||
}
|
||||
if (!is_array($arguments)) {
|
||||
throw new TransmissionRPCException('Arguments must be given as array', TransmissionRPCException::E_INVALIDARG);
|
||||
}
|
||||
|
||||
$arguments = $this->cleanRequestData($arguments); // Sanitize input
|
||||
|
||||
// Grab the X-Transmission-Session-Id if we don't have it already
|
||||
if (!$this->session_id) {
|
||||
if (!$this->GetSessionID()) {
|
||||
throw new TransmissionRPCException('Unable to acquire X-Transmission-Session-Id', TransmissionRPCException::E_SESSIONID);
|
||||
}
|
||||
}
|
||||
|
||||
$data = array(
|
||||
'method' => $method,
|
||||
'arguments' => $arguments
|
||||
);
|
||||
|
||||
$header = array(
|
||||
'Content-Type: application/json',
|
||||
'Authorization: Basic ' . base64_encode(sprintf("%s:%s", $this->username, $this->password)),
|
||||
'X-Transmission-Session-Id: ' . $this->session_id
|
||||
);
|
||||
|
||||
$ch = curl_init();
|
||||
curl_setopt($ch, CURLOPT_URL, $this->url);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
|
||||
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
|
||||
curl_setopt($ch, CURLOPT_USERPWD, $this->username . ':' . $this->password);
|
||||
curl_setopt($ch, CURLOPT_HEADER, false);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 600);
|
||||
$content = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
|
||||
if (!$content) {
|
||||
$content = array('result' => 'failed');
|
||||
}
|
||||
return json_decode($content, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs an empty GET on the Transmission RPC to get the X-Transmission-Session-Id
|
||||
* and store it in $this->session_id
|
||||
*
|
||||
* @return string
|
||||
* @throws TransmissionRPCException
|
||||
*/
|
||||
public function GetSessionID()
|
||||
{
|
||||
if (!$this->url) {
|
||||
throw new TransmissionRPCException("Class must be initialized before GetSessionID() can be called.", TransmissionRPCException::E_INVALIDARG);
|
||||
}
|
||||
|
||||
// Setup the context
|
||||
$contextopts = $this->default_context_opts; // Start with the defaults
|
||||
|
||||
// Make sure it's blank/empty (reset)
|
||||
$this->session_id = null;
|
||||
|
||||
// Setup authentication (if provided)
|
||||
if ($this->username && $this->password) {
|
||||
$contextopts['http']['header'] = sprintf("Authorization: Basic %s\r\n", base64_encode($this->username . ':' . $this->password));
|
||||
}
|
||||
|
||||
if ($this->debug) {
|
||||
echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Stream context created with options:" .
|
||||
PHP_EOL . print_r($contextopts, true);
|
||||
}
|
||||
|
||||
$context = stream_context_create($contextopts); // Create the context for this request
|
||||
if (!$fp = @fopen($this->url, 'r', false, $context)) { // Open a filepointer to the data, and use fgets to get the result
|
||||
throw new TransmissionRPCException('Unable to connect to ' . $this->url, TransmissionRPCException::E_CONNECTION);
|
||||
}
|
||||
|
||||
// Check the response (headers etc)
|
||||
$stream_meta = stream_get_meta_data($fp);
|
||||
fclose($fp);
|
||||
if ($this->debug) {
|
||||
echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Stream meta info: " .
|
||||
PHP_EOL . print_r($stream_meta, true);
|
||||
}
|
||||
if ($stream_meta['timed_out']) {
|
||||
throw new TransmissionRPCException("Timed out connecting to {$this->url}", TransmissionRPCException::E_CONNECTION);
|
||||
}
|
||||
if (substr($stream_meta['wrapper_data'][0], 9, 3) == "401") {
|
||||
throw new TransmissionRPCException("Invalid username/password.", TransmissionRPCException::E_AUTHENTICATION);
|
||||
} elseif (substr($stream_meta['wrapper_data'][0], 9, 3) == "409") { // This is what we're hoping to find
|
||||
// Loop through the returned headers and extract the X-Transmission-Session-Id
|
||||
foreach ($stream_meta['wrapper_data'] as $header) {
|
||||
if (strpos($header, 'X-Transmission-Session-Id: ') === 0) {
|
||||
if ($this->debug) {
|
||||
echo "TRANSMISSIONRPC_DEBUG:: GetSessionID():: Session-Id header: " .
|
||||
PHP_EOL . print_r($header, true);
|
||||
}
|
||||
$this->session_id = trim(substr($header, 27));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$this->session_id) { // Didn't find a session_id
|
||||
throw new TransmissionRPCException("Unable to retrieve X-Transmission-Session-Id", TransmissionRPCException::E_SESSIONID);
|
||||
}
|
||||
} else {
|
||||
throw new TransmissionRPCException("Unexpected response from Transmission RPC: " . $stream_meta['wrapper_data'][0]);
|
||||
}
|
||||
return $this->session_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽象方法,子类实现
|
||||
*/
|
||||
public function status()
|
||||
{
|
||||
$rs = $this->sstats();
|
||||
return isset($rs['result']) ? $rs['result'] : 'error';
|
||||
}
|
||||
|
||||
/**
|
||||
* 抽象方法,子类实现
|
||||
*/
|
||||
public function getList(&$move = array())
|
||||
{
|
||||
$ids = array();
|
||||
$fields = array( "id", "status", "name", "hashString", "downloadDir", "torrentFile" );
|
||||
$res = $this->get($ids, $fields);
|
||||
if (isset($res['result']) && $res['result'] == 'success') {
|
||||
// 成功
|
||||
} else {
|
||||
// 失败
|
||||
echo "获取种子列表失败,可能transmission暂时无响应,请稍后重试!".PHP_EOL;
|
||||
return array();
|
||||
}
|
||||
if (empty($res['arguments']['torrents'])) {
|
||||
echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL;
|
||||
return array();
|
||||
}
|
||||
$res = $res['arguments']['torrents'];
|
||||
// 过滤,只保留正常做种
|
||||
$res = array_filter($res, function ($v) {
|
||||
return isset($v['status']) && $v['status']===6;
|
||||
}, ARRAY_FILTER_USE_BOTH);
|
||||
|
||||
if (empty($res)) {
|
||||
echo "未获取到正常做种数据,请多保种,然后重试!".PHP_EOL;
|
||||
return array();
|
||||
}
|
||||
// 提取数组:hashString
|
||||
$info_hash = array_column($res, 'hashString');
|
||||
// 升序排序
|
||||
sort($info_hash);
|
||||
$json = json_encode($info_hash, JSON_UNESCAPED_UNICODE);
|
||||
// 去重 应该从文件读入,防止重复提交
|
||||
$sha1 = sha1($json);
|
||||
// 组装返回数据
|
||||
$hashArray['hash'] = $json;
|
||||
$hashArray['sha1'] = $sha1;
|
||||
// 变换数组:hashString为键
|
||||
$hashArray['hashString'] = array_column($res, "downloadDir", 'hashString');
|
||||
$move = array_column($res, null, 'hashString');
|
||||
return $hashArray;
|
||||
}
|
||||
}
|
@@ -100,9 +100,10 @@ class IFile
|
||||
|
||||
/**
|
||||
* @brief 创建文件夹
|
||||
* @param String $path 路径
|
||||
* @param int $chmod 文件夹权限
|
||||
* @param String $path 路径
|
||||
* @param int $chmod 文件夹权限
|
||||
* @note $chmod 参数不能是字符串(加引号),否则linux会出现权限问题
|
||||
* @return bool
|
||||
*/
|
||||
public static function mkdir($path, $chmod=0777)
|
||||
{
|
||||
@@ -113,7 +114,7 @@ class IFile
|
||||
* @brief 复制文件
|
||||
* @param String $from 源文件路径
|
||||
* @param String $to 目标文件路径
|
||||
* @param String $mod 操作模式,c:复制(默认); x:剪切(删除$from文件)
|
||||
* @param String $mode 操作模式,c:复制(默认); x:剪切(删除$from文件)
|
||||
* @return bool 操作结果 true:成功; false:失败;
|
||||
*/
|
||||
public static function copy($from, $to, $mode = 'c')
|
||||
@@ -178,7 +179,7 @@ class IFile
|
||||
/**
|
||||
* @brief 获取文件类型
|
||||
* @param String $fileName 文件名
|
||||
* @return String $filetype 文件类型
|
||||
* @return String|array $filetype 文件类型
|
||||
* @note 如果文件不存在,返回false,如果文件后缀名不在识别列表之内,返回NULL,对于docx及elsx格式文档识别在会出现识别为ZIP格式的错误,这是office2007的bug目前尚未修复,请谨慎使用
|
||||
*/
|
||||
public static function getFileType($fileName)
|
||||
|
@@ -8,93 +8,94 @@ use Curl\Curl;
|
||||
*/
|
||||
class Oauth
|
||||
{
|
||||
// 合作的站点
|
||||
public static $sites = ['ourbits','hddolby','hdhome','pthome','moecat'];
|
||||
// 爱语飞飞token
|
||||
public static $token = '';
|
||||
// 合作站点用户id
|
||||
public static $user_id = 0;
|
||||
// 合作站点密钥
|
||||
public static $passkey = '';
|
||||
// 合作站名字
|
||||
public static $site = '';
|
||||
// 登录缓存路径
|
||||
public static $SiteLoginCache = ROOT_PATH.DS.'config'.DS.'siteLoginCache_{}.json';
|
||||
const SiteLoginCache = ROOT_PATH.DS.'config'.DS.'siteLoginCache_{}.json';
|
||||
/**
|
||||
* 从配置文件内读取爱语飞飞token作为鉴权参数
|
||||
*/
|
||||
public static function getSign()
|
||||
{
|
||||
global $configALL;
|
||||
// 爱语飞飞
|
||||
$token = isset($configALL['iyuu.cn']) && $configALL['iyuu.cn'] ? $configALL['iyuu.cn'] : '';
|
||||
if (empty($token) || strlen($token)<46) {
|
||||
echo "缺少辅种接口请求参数:爱语飞飞token \n";
|
||||
echo "请访问https://iyuu.cn 用微信扫码申请,并填入配置文件config.php内。\n\n";
|
||||
$token = empty($configALL['iyuu.cn']) ? '' : $configALL['iyuu.cn'];
|
||||
if (empty($token) || strlen($token) < 46) {
|
||||
echo "缺少辅种接口请求参数:爱语飞飞token ".PHP_EOL;
|
||||
echo "请访问https://iyuu.cn 用微信扫码申请,并填入配置文件config.php内。".PHP_EOL.PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
return $token;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户注册与登录
|
||||
* 作用:在服务器端实现微信用户与合作站点用户id的关联
|
||||
* 参数:爱语飞飞token + 合作站点用户id + sha1(合作站点密钥passkey) + 合作站点标识
|
||||
* @param string $apiUrl
|
||||
* @param array $sites
|
||||
* @return bool
|
||||
* @throws \ErrorException
|
||||
*/
|
||||
public static function login($apiUrl = '', $sites = array())
|
||||
{
|
||||
global $configALL;
|
||||
// 云端下发合作的站点标识
|
||||
self::$sites = $sites ? $sites : self::$sites;
|
||||
if (empty($sites)) {
|
||||
die('云端下发合作站点信息失败,请稍后重试');
|
||||
}
|
||||
$_sites = array_column($sites, 'site');
|
||||
$ret = false;
|
||||
self::$token = self::getSign();
|
||||
foreach (self::$sites as $name) {
|
||||
if (is_file(str_replace('{}', $name, self::$SiteLoginCache))) {
|
||||
$token = self::getSign();
|
||||
foreach ($_sites as $k => $site) {
|
||||
if (is_file(str_replace('{}', $site, self::SiteLoginCache))) {
|
||||
// 存在鉴权缓存
|
||||
$ret = true;
|
||||
continue;
|
||||
}
|
||||
if (isset($configALL[$name]['passkey']) && $configALL[$name]['passkey'] && isset($configALL[$name]['id']) && $configALL[$name]['id']) {
|
||||
self::$user_id = $configALL[$name]['id'];
|
||||
self::$passkey = sha1($configALL[$name]['passkey']); // 避免泄露用户passkey秘钥
|
||||
self::$site = $name;
|
||||
if (isset($configALL[$site]['passkey']) && $configALL[$site]['passkey'] && isset($configALL[$site]['id']) && $configALL[$site]['id']) {
|
||||
$user_id = $configALL[$site]['id'];
|
||||
$passkey = $configALL[$site]['passkey'];
|
||||
|
||||
$curl = new Curl();
|
||||
$curl->setOpt(CURLOPT_SSL_VERIFYPEER, false);
|
||||
$data = [
|
||||
'token' => self::$token,
|
||||
'id' => self::$user_id,
|
||||
'passkey'=> self::$passkey,
|
||||
'site' => self::$site,
|
||||
'token' => $token,
|
||||
'id' => $user_id,
|
||||
'passkey'=> sha1($passkey), // 避免泄露用户passkey秘钥
|
||||
'site' => $site,
|
||||
];
|
||||
$res = $curl->get($apiUrl, $data);
|
||||
p($res->response);
|
||||
|
||||
$rs = json_decode($res->response, true);
|
||||
if (isset($rs['ret']) && $rs['ret'] == 200 && isset($rs['data']['success']) && $rs['data']['success']) {
|
||||
self::setSiteLoginCache($name, $rs);
|
||||
if (isset($rs['ret']) && ($rs['ret'] === 200) && isset($rs['data']['success']) && $rs['data']['success']) {
|
||||
self::setSiteLoginCache($site, $rs);
|
||||
$ret = true;
|
||||
} else {
|
||||
$msg = isset($rs['msg']) && $rs['msg'] ? $rs['msg'] : '远端服务器无响应,请稍后重试!';
|
||||
$msg = isset($rs['data']['errmsg']) && $rs['data']['errmsg'] ? $rs['data']['errmsg'] : $msg;
|
||||
$msg = !empty($rs['msg']) ? $rs['msg'] : '远端服务器无响应,请稍后重试!';
|
||||
$msg = !empty($rs['data']['errmsg']) ? $rs['data']['errmsg'] : $msg;
|
||||
echo $msg . PHP_EOL;
|
||||
}
|
||||
} else {
|
||||
echo $name.'合作站点参数配置不完整,请同时填写passkey和用户id。' . PHP_EOL;
|
||||
echo $site.'合作站点参数配置不完整,请同时填写passkey和用户id。' . PHP_EOL;
|
||||
echo '合作站点鉴权配置,请查阅:https://www.iyuu.cn/archives/337/'. PHP_EOL. PHP_EOL;
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* 写鉴权成功缓存
|
||||
* @desc 作用:减少对服务器请求,跳过鉴权提示信息;
|
||||
* @param string $site
|
||||
* @param array $array
|
||||
* @return bool|int
|
||||
*/
|
||||
private static function setSiteLoginCache($key = '', $array = [])
|
||||
private static function setSiteLoginCache($site = '', $array = [])
|
||||
{
|
||||
$json = json_encode($array, JSON_UNESCAPED_UNICODE);
|
||||
$myfile = str_replace('{}', $key, self::$SiteLoginCache);
|
||||
$myfile = str_replace('{}', $site, self::SiteLoginCache);
|
||||
$file_pointer = @fopen($myfile, "w");
|
||||
$worldsnum = @fwrite($file_pointer, $json);
|
||||
@fclose($file_pointer);
|
||||
return $worldsnum;
|
||||
}
|
||||
}
|
||||
|
@@ -197,14 +197,14 @@ function convertToMB($from)
|
||||
|
||||
/**
|
||||
* 字节数Byte转换为KB、MB、GB、TB
|
||||
*
|
||||
* @param $num
|
||||
* @return string
|
||||
*/
|
||||
function getFilesize($num)
|
||||
{
|
||||
$p = 0;
|
||||
$format='bytes';
|
||||
if ($num>0 && $num<1024) {
|
||||
$p = 0;
|
||||
return number_format($num).' '.$format;
|
||||
}
|
||||
if ($num>=1024 && $num<pow(1024, 2)) {
|
||||
@@ -393,8 +393,9 @@ function sign($timestamp)
|
||||
|
||||
/**
|
||||
* @brief 分离token中的用户uid
|
||||
* token算法:IYUU + uid + T + sha1(openid+time+盐)
|
||||
* @param string $token 用户请求token
|
||||
* @desc token算法:IYUU + uid + T + sha1(openid+time+盐)
|
||||
* @param string $token 用户请求token
|
||||
* @return bool|string
|
||||
*/
|
||||
function getUid($token)
|
||||
{
|
||||
@@ -456,3 +457,12 @@ function isWin()
|
||||
{
|
||||
return (DIRECTORY_SEPARATOR == '\\') ? true : false;
|
||||
}
|
||||
|
||||
function sleepIYUU($t, $msg)
|
||||
{
|
||||
echo $msg . PHP_EOL;
|
||||
do {
|
||||
echo microtime(true).$msg.' '.$t.'秒后继续...'.PHP_EOL;
|
||||
sleep(1);
|
||||
} while (--$t > 0);
|
||||
}
|
||||
|
@@ -2,10 +2,16 @@
|
||||
# 传入的种子备份参数
|
||||
if [ $1 ]; then
|
||||
AppName=$1
|
||||
else
|
||||
echo 'AppName not null'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $2 ]; then
|
||||
torrentDir=$2
|
||||
else
|
||||
echo 'torrentDir not null'
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# 脚本当前目录
|
||||
|
@@ -13,7 +13,8 @@
|
||||
"ext-json": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-curl": "*",
|
||||
"curl/curl": "^2.2"
|
||||
"curl/curl": "^2.2",
|
||||
"ledccn/iyuubittorrentclient": "dev-master"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
75
composer.lock
generated
75
composer.lock
generated
@@ -4,20 +4,20 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "10281f19c929443b7db18d1ab159ec63",
|
||||
"content-hash": "568a690b54981e283a0cc9ee09f5d696",
|
||||
"packages": [
|
||||
{
|
||||
"name": "curl/curl",
|
||||
"version": "2.2.0",
|
||||
"version": "2.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-mod/curl.git",
|
||||
"reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff"
|
||||
"reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-mod/curl/zipball/d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff",
|
||||
"reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff",
|
||||
"url": "https://api.github.com/repos/php-mod/curl/zipball/3ad560b1fc1bbdf5c7681356ab953fb961f255e5",
|
||||
"reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@@ -45,15 +45,15 @@
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "php-curl-class",
|
||||
"homepage": "https://github.com/php-curl-class"
|
||||
},
|
||||
{
|
||||
"name": "Hassan Amouhzi",
|
||||
"email": "hassan@anezi.net",
|
||||
"homepage": "http://hassan.amouhzi.com"
|
||||
},
|
||||
{
|
||||
"name": "php-curl-class",
|
||||
"homepage": "https://github.com/php-curl-class"
|
||||
},
|
||||
{
|
||||
"name": "user52",
|
||||
"homepage": "https://github.com/user52"
|
||||
@@ -65,13 +65,66 @@
|
||||
"curl",
|
||||
"dot"
|
||||
],
|
||||
"time": "2018-12-04T19:47:03+00:00"
|
||||
"time": "2020-03-19T20:07:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "ledccn/iyuubittorrentclient",
|
||||
"version": "dev-master",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ledccn/IYUUBittorrentClient.git",
|
||||
"reference": "cb59d3380efd8cab7d277eefbc7e2590845bf805"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ledccn/IYUUBittorrentClient/zipball/cb59d3380efd8cab7d277eefbc7e2590845bf805",
|
||||
"reference": "cb59d3380efd8cab7d277eefbc7e2590845bf805",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||
"preferred": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"require": {
|
||||
"curl/curl": "^2.3",
|
||||
"ext-curl": "*",
|
||||
"ext-json": "*",
|
||||
"ext-mbstring": "*",
|
||||
"php": "^5.6 | ^7.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"IYUU\\Client\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"GPL-3.0-or-later"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "David",
|
||||
"email": "367013672@qq.com"
|
||||
}
|
||||
],
|
||||
"description": "实现pt客户端管理的代码库",
|
||||
"homepage": "https://github.com/ledccn/IYUUBittorrentClient",
|
||||
"keywords": [
|
||||
"qbittorrent",
|
||||
"transmission"
|
||||
],
|
||||
"time": "2021-01-12T06:07:08+00:00"
|
||||
}
|
||||
],
|
||||
"packages-dev": [],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": [],
|
||||
"stability-flags": {
|
||||
"ledccn/iyuubittorrentclient": 20
|
||||
},
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
|
@@ -7,6 +7,7 @@
|
||||
* IYUU自动辅种工具-【安装篇】Windows之git https://www.iyuu.cn/archives/367/
|
||||
* IYUU自动辅种工具-【安装篇】群晖Linux之git https://www.iyuu.cn/archives/372/
|
||||
* IYUU自动辅种工具-【安装篇】小钢炮手把手教程 https://www.iyuu.cn/archives/386/
|
||||
* IYUU自动辅种工具-【安装篇】全平台Docker安装方式 https://www.iyuu.cn/archives/401/
|
||||
* IYUU自动辅种工具--最简配置(所有平台通用教程) https://www.iyuu.cn/archives/324/
|
||||
* IYUU自动辅种工具--合作站点鉴权配置说明 https://www.iyuu.cn/archives/337/
|
||||
* IYUU自动下载种子--之RSS订阅使用教程 https://www.iyuu.cn/archives/349/
|
||||
@@ -32,9 +33,9 @@ return array(
|
||||
array(
|
||||
'type' => 'transmission', // 支持:transmission、qBittorrent
|
||||
'host' => 'http://127.0.0.1:9091/transmission/rpc', // 警告!注意:transmission/rpc这段别动,你只需要修改 127.0.0.1:9091
|
||||
'username' => 'null',
|
||||
'password' => 'null',
|
||||
'BT_backup' => '/var/lib/transmission/torrents', // 移动做种:如果脚本与当前客户端不在一台机器,必须配置
|
||||
'username' => '', // 没有用户名请填写null
|
||||
'password' => '', // 没有密码 请填写null
|
||||
'BT_backup' => '/torrents', // 移动做种:如果脚本与当前客户端不在一台机器,必须配置
|
||||
'move' => 0, // 0不移动,1移动并辅种,2移动且只在当前客户端辅种
|
||||
),
|
||||
# 结束
|
||||
@@ -44,8 +45,8 @@ return array(
|
||||
'host' => 'http://127.0.0.1:8083',
|
||||
'username' => 'admin',
|
||||
'password' => '',
|
||||
'root_folder'=> 1, // 0不创建根目录,1创建根目录
|
||||
'BT_backup' => 'C:\Users\ASUS\AppData\Local\qBittorrent\BT_backup', // 移动做种:必须配置,Linux搜索方法:find / -name BT_backup
|
||||
'root_folder'=> 1, // 创建多文件子目录:0不创建,1创建(下载器默认1)【此处必须与下载器真实配置相同,否则添加任务不会校验!】
|
||||
'BT_backup' => '/BT_backup', // 移动做种:必须配置,Linux搜索方法:find / -name BT_backup
|
||||
'move' => 0, // 0不移动,1移动并辅种,2移动且只在当前客户端辅种
|
||||
),
|
||||
# 结束
|
||||
@@ -60,14 +61,14 @@ return array(
|
||||
),
|
||||
'path_filter'=> array(), //转移过滤器:不转移此路径内文件
|
||||
'path_selector' => array(), //转移选择器:只转移此路径内文件(为空时,全转移) 【优先级:过滤器 > 选择器】
|
||||
'paused' => 0, //转移成功,自动开始任务:0开始,1暂停
|
||||
'paused' => 1, //转移成功,自动开始任务:0开始,1暂停
|
||||
'skip_check' => 0, //转移成功,跳校验:0不跳、1跳校验
|
||||
'delete_torrent' => 0, //转移成功,删除当前做种:0不删除、1删除
|
||||
),
|
||||
// 6.RSS工作模式
|
||||
'workingMode' => 0,
|
||||
// 7.监控目录
|
||||
'watch' => '/volume1/downloads',
|
||||
'watch' => '/volume1/watch',
|
||||
// 8.RSS过滤参数配置
|
||||
'filter' => array(
|
||||
'size'=>array(
|
||||
@@ -98,7 +99,7 @@ return array(
|
||||
* 以下为各站点的独立配置(互不影响、互不冲突)
|
||||
* 自动辅种:需要配置各站的passkey(没有配置passkey的站点会自动跳过)
|
||||
*/
|
||||
// ourbits
|
||||
// 【合作站点用户鉴权】ourbits
|
||||
'ourbits' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
@@ -124,12 +125,14 @@ return array(
|
||||
),
|
||||
|
||||
),
|
||||
// hddolby
|
||||
// 【合作站点用户鉴权】hddolby
|
||||
'hddolby' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
// 如果需要辅种,必须配置
|
||||
'rss' => '',
|
||||
'id' => 0, // 用户ID(不是用户名)
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
@@ -138,12 +141,14 @@ return array(
|
||||
'sleep' => 5, // 最少休眠5秒
|
||||
),
|
||||
),
|
||||
// hdhome
|
||||
// 【合作站点用户鉴权】hdhome
|
||||
'hdhome' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
// 如果需要辅种,必须配置
|
||||
'rss' => '',
|
||||
'id' => 0, // 用户ID(不是用户名)
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
@@ -152,12 +157,14 @@ return array(
|
||||
'sleep' => 5, // 最少休眠5秒
|
||||
),
|
||||
),
|
||||
// PTHome
|
||||
// 【合作站点用户鉴权】PTHome
|
||||
'pthome' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
// 如果需要辅种,必须配置
|
||||
'rss' => '',
|
||||
'id' => 0, // 用户ID(不是用户名)
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
@@ -166,22 +173,25 @@ return array(
|
||||
'sleep' => 5, // 最少休眠5秒
|
||||
),
|
||||
),
|
||||
// MoeCat
|
||||
'moecat' => array(
|
||||
// 【合作站点用户鉴权】chdbits
|
||||
'chdbits' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
'id' => 0, // 用户ID(不是用户名)
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(
|
||||
//'ipv6=1', // 种子Tracker的IP地址选择 可选:ipv4,ipv6
|
||||
'https=1',
|
||||
),
|
||||
'limitRule' => array(
|
||||
'count' => 20, // 每次辅种20个
|
||||
'sleep' => 15, // 最少休眠15秒
|
||||
),
|
||||
'url_join' => array(),
|
||||
),
|
||||
// HDAI
|
||||
'hdai' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
'id' => 0, // 用户ID(不是用户名)
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
),
|
||||
// m-team
|
||||
'm-team' => array(
|
||||
@@ -194,23 +204,6 @@ return array(
|
||||
//'ipv6=1', // 种子Tracker的IP地址选择 可选:ipv4,ipv6
|
||||
'https=1',
|
||||
),
|
||||
'clients' => array(
|
||||
array(
|
||||
'type' => 'transmission', // 支持:transmission、qBittorrent
|
||||
'host' => 'http://127.0.0.1:9091/transmission/rpc', // 警告!注意:transmission/rpc这段别动,你只需要修改 127.0.0.1:9091
|
||||
'username' => '',
|
||||
'password' => '',
|
||||
'downloadDir'=> '',
|
||||
),
|
||||
),
|
||||
'workingMode' => 1,
|
||||
'watch' => '',
|
||||
'filter' => array(
|
||||
'size'=>array(
|
||||
'min' => '1GB',
|
||||
'max' => '280GB',
|
||||
),
|
||||
),
|
||||
),
|
||||
// keepfrds
|
||||
'keepfrds' => array(
|
||||
@@ -258,13 +251,13 @@ return array(
|
||||
),
|
||||
// HDSky
|
||||
'hdsky' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
// 如果需要自动辅种,必须配置此项
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
'limitRule' => array(
|
||||
'count' => 20, // 每次辅种50个
|
||||
'sleep' => 20, // 最少休眠15秒
|
||||
'count' => 20, // 每次辅种20个
|
||||
'sleep' => 20, // 最少休眠20秒
|
||||
),
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
@@ -294,9 +287,9 @@ return array(
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
// 如果需要rss订阅,必须配置
|
||||
'rss' => '',
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
'rss' => '',
|
||||
),
|
||||
// nanyangpt
|
||||
'nanyangpt' => array(
|
||||
@@ -383,15 +376,6 @@ return array(
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
),
|
||||
// chdbits
|
||||
'chdbits' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
),
|
||||
// leaguehd
|
||||
'leaguehd' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
@@ -655,5 +639,30 @@ return array(
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
),
|
||||
// dragonhd
|
||||
'dragonhd' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
),
|
||||
// hitpt 百川
|
||||
'hitpt' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
),
|
||||
// pttime PT时间
|
||||
'pttime' => array(
|
||||
// 如果需要用下载免费种脚本,须配置(只是自动辅种,可以不配置此项)
|
||||
'cookie' => '',
|
||||
// 如果需要自动辅种,必须配置
|
||||
'passkey' => '',
|
||||
'url_replace' => array(),
|
||||
'url_join' => array(),
|
||||
),
|
||||
// 配置结束,后面的一行不能删除,必须保留!!!
|
||||
);
|
||||
|
@@ -1,6 +1,8 @@
|
||||
FROM swoft/alphp:base
|
||||
#FROM swoft/alphp:cli
|
||||
#FROM alpine:latest
|
||||
#FROM alpine:3.12
|
||||
FROM alpine:3.8
|
||||
#FROM swoft/alphp:base
|
||||
#FROM swoft/alphp:cli
|
||||
|
||||
LABEL maintainer="david <367013672@qq.com>" version="1.0"
|
||||
|
||||
@@ -16,7 +18,8 @@ ARG app_env=prod
|
||||
# ARG add_user=www-data
|
||||
|
||||
ENV APP_ENV=${app_env:-"prod"} \
|
||||
TIMEZONE=${timezone:-"Asia/Shanghai"}
|
||||
TIMEZONE=${timezone:-"Asia/Shanghai"} \
|
||||
cron="3 */10 * * *"
|
||||
|
||||
##
|
||||
# ---------- building ----------
|
||||
@@ -24,7 +27,7 @@ ENV APP_ENV=${app_env:-"prod"} \
|
||||
|
||||
RUN set -ex \
|
||||
# change apk source repo
|
||||
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
|
||||
#&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
|
||||
&& apk update \
|
||||
&& apk add --no-cache \
|
||||
# Install base packages ('ca-certificates' will install 'nghttp2-libs')
|
||||
@@ -60,6 +63,7 @@ RUN set -ex \
|
||||
# php7-pdo_mysql \
|
||||
# php7-pdo_sqlite \
|
||||
# php7-phar \
|
||||
# php7-pcntl \
|
||||
# php7-posix \
|
||||
# php7-redis \
|
||||
php7-simplexml \
|
||||
@@ -73,10 +77,12 @@ RUN set -ex \
|
||||
# php7-tokenizer \
|
||||
php7-zip \
|
||||
# php7-zlib \
|
||||
php7-xml \
|
||||
&& git clone https://gitee.com/ledc/IYUUAutoReseed.git /var/www \
|
||||
&& cp /var/www/config/config.sample.php /var/www/config/config.php \
|
||||
&& ln -sf /var/www/config/config.php /config.php \
|
||||
php7-xml \
|
||||
&& git clone https://gitee.com/ledc/IYUUAutoReseed.git /IYUU \
|
||||
&& cp /IYUU/config/config.sample.php /IYUU/config/config.php \
|
||||
&& ln -sf /IYUU/config/config.php /config.php \
|
||||
&& cp /IYUU/docker/entrypoint.sh /entrypoint.sh \
|
||||
&& chmod +x /entrypoint.sh \
|
||||
&& apk del --purge *-dev \
|
||||
&& rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/share/php7 \
|
||||
# ---------- some config,clear work ----------
|
||||
@@ -91,6 +97,8 @@ RUN set -ex \
|
||||
# - config timezone
|
||||
&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
|
||||
&& echo "${TIMEZONE}" > /etc/timezone \
|
||||
&& echo '2 */5 * * * cd /IYUU && git fetch --all && git reset --hard origin/master' >> /etc/crontabs/root \
|
||||
#&& echo "${cron} /usr/bin/php /IYUU/iyuu.php &> /dev/null" >> /etc/crontabs/root \
|
||||
# ---------- some config work ----------
|
||||
# - ensure 'www-data' user exists(82 is the standard uid/gid for "www-data" in Alpine)
|
||||
# && addgroup -g 82 -S ${add_user} \
|
||||
@@ -100,6 +108,7 @@ RUN set -ex \
|
||||
# && chown -R ${add_user}:${add_user} /data \
|
||||
&& echo -e "\033[42;37m Build Completed :).\033[0m\n"
|
||||
|
||||
EXPOSE 9000
|
||||
# VOLUME ["/var/www", "/data"]
|
||||
WORKDIR /var/www
|
||||
# EXPOSE 9000
|
||||
# VOLUME ["/IYUU", "/data"]
|
||||
WORKDIR /IYUU
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
@@ -4,7 +4,7 @@ FROM arm64v8/alpine:3.12
|
||||
|
||||
ENV TZ Asia/Shanghai
|
||||
|
||||
ENV cron="0 9 * * 0"
|
||||
ENV cron="3 */10 * * *"
|
||||
|
||||
RUN set -ex \
|
||||
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories \
|
||||
@@ -17,9 +17,16 @@ RUN set -ex \
|
||||
&& git clone https://gitee.com/ledc/IYUUAutoReseed.git /IYUU \
|
||||
&& cp /IYUU/config/config.sample.php /IYUU/config/config.php \
|
||||
&& ln -sf /IYUU/config/config.php /config.php \
|
||||
&& cp /IYUU/docker/entrypoint.sh /entrypoint.sh \
|
||||
&& chmod +x /entrypoint.sh \
|
||||
&& apk del --purge *-dev \
|
||||
&& rm -rf /var/cache/apk/* /tmp/* /usr/share/man \
|
||||
&& echo "${TZ}" > /etc/timezone \
|
||||
&& ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime
|
||||
|
||||
WORKDIR /IYUU
|
||||
&& ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
|
||||
# && echo '* * * * * echo "iyuu.cn" >/dev/null 2>&1' >> /etc/crontabs/root \
|
||||
&& echo '3 */6 * * * cd /IYUU && git fetch --all && git reset --hard origin/master' >> /etc/crontabs/root \
|
||||
# && echo "${cron} /usr/bin/php /IYUU/iyuu.php >/dev/null 2>&1" >> /etc/crontabs/root \
|
||||
&& echo -e "\033[42;37m Build Completed :).\033[0m\n"
|
||||
|
||||
CMD ["sh", "-c", "/usr/bin/php /IYUU/iyuu.php ; /usr/sbin/crond ; (crontab -l ;echo \"$cron /usr/bin/php /IYUU/iyuu.php &> /dev/null\") | crontab - ; tail -f /dev/null"]
|
||||
WORKDIR /IYUU
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
docker build -t iyuu:latest .
|
||||
docker run -it -v /root/config.php:/config.php -v /var/lib/transmission/torrents:/torrents -v /var/lib/qbittorrent/.local/share/data/qBittorrent/BT_backup:/BT_backup --network bridge --name IYUUAutoReseed --restart always -d iyuu:latest
|
||||
docker build -t iyuu:arm64v8 .
|
||||
docker run -it -v /root/config.php:/config.php -v /var/lib/transmission/torrents:/torrents -v /var/lib/qbittorrent/.local/share/data/qBittorrent/BT_backup:/BT_backup --network bridge --name IYUUAutoReseed --restart always -d iyuu:arm64v8
|
||||
docker exec -it IYUUAutoReseed php iyuu.php
|
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
docker build -f Dockerfile -t iyuu:latest .
|
||||
docker run -it -v /root/config.php:/config.php --network bridge --name IYUUAutoReseed --restart always -d iyuu:latest
|
||||
docker build -f Dockerfile -t iyuu:arm64v8 .
|
||||
docker run -it -v /root/config.php:/config.php --network bridge --name IYUUAutoReseed --restart always -d iyuu:arm64v8
|
||||
docker exec -it IYUUAutoReseed php iyuu.php
|
@@ -1,3 +0,0 @@
|
||||
#!/bin/sh
|
||||
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin
|
||||
docker exec IYUUAutoReseed php iyuu.php
|
2
docker/Arm64v8/push.sh
Normal file
2
docker/Arm64v8/push.sh
Normal file
@@ -0,0 +1,2 @@
|
||||
docker image tag iyuu:arm64v8 iyuucn/iyuuautoreseed:arm64v8
|
||||
docker image push iyuucn/iyuuautoreseed:arm64v8
|
8
docker/entrypoint.sh
Normal file
8
docker/entrypoint.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
DEFAULT_CRON="9 */6 * * *"
|
||||
cron=${cron:-$DEFAULT_CRON}
|
||||
set -e
|
||||
echo "$cron /usr/bin/php /IYUU/iyuu.php" | crontab -
|
||||
cd /IYUU && git fetch --all && git reset --hard origin/master
|
||||
/usr/bin/php /IYUU/iyuu.php
|
||||
/usr/sbin/crond -f
|
20
docker/iyuu.sh
Normal file
20
docker/iyuu.sh
Normal file
@@ -0,0 +1,20 @@
|
||||
#!/bin/sh
|
||||
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin
|
||||
## 相关命令
|
||||
# 1. 手动执行辅种
|
||||
docker exec IYUUAutoReseed php iyuu.php
|
||||
|
||||
# 2. 手动删除辅种缓存
|
||||
docker exec -it IYUUAutoReseed rm -rf ./torrent/cachehash
|
||||
|
||||
# 3. 手动删除转移缓存
|
||||
docker exec -it IYUUAutoReseed rm -rf ./torrent/cachemove
|
||||
|
||||
# 4. 查看当前定时任务
|
||||
docker exec -it IYUUAutoReseed crontab -l
|
||||
|
||||
# 5. 修改定时任务(推荐修改docker容器的环境变量:参数cron)
|
||||
docker exec -it IYUUAutoReseed crontab -e
|
||||
|
||||
# 6. 进入容器内交互终端
|
||||
docker exec -it IYUUAutoReseed sh
|
@@ -5,5 +5,4 @@ echo $pwddir
|
||||
cd $(dirname $0)
|
||||
git fetch --all
|
||||
git reset --hard origin/master
|
||||
git pull
|
||||
php ./iyuu.php
|
10
readme.md
10
readme.md
@@ -12,7 +12,7 @@
|
||||
|
||||

|
||||
|
||||
## 获取脚本,三种方式皆可
|
||||
## 获取脚本,四种方式皆可
|
||||
|
||||
1. 通过git命令安装
|
||||
|
||||
@@ -25,6 +25,10 @@
|
||||
3. 直接下载zip源码包
|
||||
|
||||
`https://github.com/ledccn/IYUUAutoReseed/archive/master.zip`
|
||||
|
||||
4. Docker使用
|
||||
|
||||
[https://gitee.com/ledc/IYUUAutoReseed/tree/master/docker](https://gitee.com/ledc/IYUUAutoReseed/tree/master/docker)
|
||||
|
||||
## 功能
|
||||
|
||||
@@ -51,7 +55,7 @@ IYUU自动辅种工具(英文名:IYUUAutoReseed),是一款PHP语言编
|
||||
2. qBittorrent
|
||||
|
||||
## 支持自动辅种的站点
|
||||
学校、杜比、家园、天空、朋友、馒头、萌猫、我堡、猫站、铂金家、烧包、北洋、TCCF、南洋、TTG、映客、城市、52pt、brobits、备胎、SSD、CHD、ptmsg、leaguehd、聆音、瓷器、hdarea、eastgame(TLF)、1ptba、hdtime、hd4fans、opencd、hdbug、hdstreet、joyhd、u2、upxin(HDU)、oshen、discfan(GZT)、cnscg圣城(已删除)、北邮、CCFBits、dicmusic、天雪、葡萄、HDRoute、伊甸园hdbd、海胆haidan、HDfans。
|
||||
学校、杜比、家园、天空、朋友、馒头、萌猫、我堡、猫站、铂金家、烧包、北洋、TCCF、南洋、TTG、映客、城市、52pt、brobits、备胎、SSD、CHD、ptmsg、leaguehd、聆音、瓷器、hdarea、eastgame(TLF)、1ptba、hdtime、hd4fans、opencd、hdbug、hdstreet、joyhd、u2、upxin(HDU)、oshen、discfan(GZT)、cnscg圣城(已删除)、北邮、CCFBits、dicmusic、天雪、葡萄、HDRoute、伊甸园hdbd、海胆haidan、HDfans、龙之家、百川PT。
|
||||
|
||||
## 运行环境
|
||||
具备PHP运行环境的所有平台,例如:Linux、Windows、MacOS!
|
||||
@@ -90,7 +94,7 @@ IYUU自动辅种工具(英文名:IYUUAutoReseed),是一款PHP语言编
|
||||
|
||||
## 需求提交/错误反馈
|
||||
|
||||
- QQ群:859882209[2000人.入门群],931954050[1000人.进阶群]
|
||||
- QQ群:859882209[2000人群],931954050[1000人群],924099912[2000人群]
|
||||
- 问答社区:http://wenda.iyuu.cn
|
||||
- 博客:https://www.iyuu.cn/
|
||||
- issues: https://gitee.com/ledc/IYUUAutoReseed/issues
|
||||
|
1
vendor/composer/autoload_psr4.php
vendored
1
vendor/composer/autoload_psr4.php
vendored
@@ -6,5 +6,6 @@ $vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'IYUU\\Client\\' => array($vendorDir . '/ledccn/iyuubittorrentclient/src'),
|
||||
'IYUU\\' => array($baseDir . '/app'),
|
||||
);
|
||||
|
5
vendor/composer/autoload_static.php
vendored
5
vendor/composer/autoload_static.php
vendored
@@ -13,11 +13,16 @@ class ComposerStaticInitd8553673db02b2a444a853f28e16196e
|
||||
public static $prefixLengthsPsr4 = array (
|
||||
'I' =>
|
||||
array (
|
||||
'IYUU\\Client\\' => 12,
|
||||
'IYUU\\' => 5,
|
||||
),
|
||||
);
|
||||
|
||||
public static $prefixDirsPsr4 = array (
|
||||
'IYUU\\Client\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/ledccn/iyuubittorrentclient/src',
|
||||
),
|
||||
'IYUU\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/../..' . '/app',
|
||||
|
65
vendor/composer/installed.json
vendored
65
vendor/composer/installed.json
vendored
@@ -1,17 +1,17 @@
|
||||
[
|
||||
{
|
||||
"name": "curl/curl",
|
||||
"version": "2.2.0",
|
||||
"version_normalized": "2.2.0.0",
|
||||
"version": "2.3.0",
|
||||
"version_normalized": "2.3.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-mod/curl.git",
|
||||
"reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff"
|
||||
"reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-mod/curl/zipball/d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff",
|
||||
"reference": "d22086dd2eee5ca02e4c29b9a5bdf3645bfdbbff",
|
||||
"url": "https://api.github.com/repos/php-mod/curl/zipball/3ad560b1fc1bbdf5c7681356ab953fb961f255e5",
|
||||
"reference": "3ad560b1fc1bbdf5c7681356ab953fb961f255e5",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@@ -28,7 +28,7 @@
|
||||
"phpunit/phpunit": "^5.7",
|
||||
"squizlabs/php_codesniffer": "~2.1"
|
||||
},
|
||||
"time": "2018-12-04T19:47:03+00:00",
|
||||
"time": "2020-03-19T20:07:26+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
@@ -41,15 +41,15 @@
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "php-curl-class",
|
||||
"homepage": "https://github.com/php-curl-class"
|
||||
},
|
||||
{
|
||||
"name": "Hassan Amouhzi",
|
||||
"email": "hassan@anezi.net",
|
||||
"homepage": "http://hassan.amouhzi.com"
|
||||
},
|
||||
{
|
||||
"name": "php-curl-class",
|
||||
"homepage": "https://github.com/php-curl-class"
|
||||
},
|
||||
{
|
||||
"name": "user52",
|
||||
"homepage": "https://github.com/user52"
|
||||
@@ -63,18 +63,18 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "owner888/phpspider",
|
||||
"version": "v2.1.6",
|
||||
"version_normalized": "2.1.6.0",
|
||||
"name": "ledccn/iyuubittorrentclient",
|
||||
"version": "dev-master",
|
||||
"version_normalized": "9999999-dev",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/owner888/phpspider.git",
|
||||
"reference": "e6021148adec201418c16ba26f39bc013ba5b4d9"
|
||||
"url": "https://github.com/ledccn/IYUUBittorrentClient.git",
|
||||
"reference": "cb59d3380efd8cab7d277eefbc7e2590845bf805"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/owner888/phpspider/zipball/e6021148adec201418c16ba26f39bc013ba5b4d9",
|
||||
"reference": "e6021148adec201418c16ba26f39bc013ba5b4d9",
|
||||
"url": "https://api.github.com/repos/ledccn/IYUUBittorrentClient/zipball/cb59d3380efd8cab7d277eefbc7e2590845bf805",
|
||||
"reference": "cb59d3380efd8cab7d277eefbc7e2590845bf805",
|
||||
"shasum": "",
|
||||
"mirrors": [
|
||||
{
|
||||
@@ -84,36 +84,35 @@
|
||||
]
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5.0"
|
||||
"curl/curl": "^2.3",
|
||||
"ext-curl": "*",
|
||||
"ext-json": "*",
|
||||
"ext-mbstring": "*",
|
||||
"php": "^5.6 | ^7.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-pcntl、ext-redis": "For better performance. "
|
||||
},
|
||||
"time": "2018-08-15T08:04:29+00:00",
|
||||
"time": "2021-01-12T06:07:08+00:00",
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"installation-source": "source",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"phpspider\\": "./"
|
||||
"IYUU\\Client\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
"GPL-3.0-or-later"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Seatle Yang",
|
||||
"email": "seatle@foxmail.com",
|
||||
"homepage": "http://www.phpspider.org",
|
||||
"role": "Developer"
|
||||
"name": "David",
|
||||
"email": "367013672@qq.com"
|
||||
}
|
||||
],
|
||||
"description": "The PHPSpider Framework.",
|
||||
"homepage": "http://www.phpspider.org",
|
||||
"description": "实现pt客户端管理的代码库",
|
||||
"homepage": "https://github.com/ledccn/IYUUBittorrentClient",
|
||||
"keywords": [
|
||||
"framework",
|
||||
"phpspider"
|
||||
"qbittorrent",
|
||||
"transmission"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
34
vendor/curl/curl/.gitlab-ci.yml
vendored
34
vendor/curl/curl/.gitlab-ci.yml
vendored
@@ -27,7 +27,6 @@ tests-php5.6:
|
||||
- php --version
|
||||
- if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi;
|
||||
- php composer.phar install
|
||||
@@ -36,7 +35,6 @@ tests-php5.6:
|
||||
cache:
|
||||
key: php5.6
|
||||
paths:
|
||||
- composer.phar
|
||||
- vendor
|
||||
|
||||
tests-php7.0:
|
||||
@@ -51,7 +49,6 @@ tests-php7.0:
|
||||
- php --version
|
||||
- if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi;
|
||||
- php composer.phar install
|
||||
@@ -75,7 +72,6 @@ tests-php7.1:
|
||||
- php --version
|
||||
- if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi;
|
||||
- php composer.phar install
|
||||
@@ -89,25 +85,37 @@ tests-php7.1:
|
||||
- vendor
|
||||
|
||||
tests-php7.2:
|
||||
image: alpine:3.8
|
||||
image: alpine:3.9
|
||||
stage: test
|
||||
services:
|
||||
- name: "$CI_REGISTRY_IMAGE:server-test"
|
||||
alias: server_test
|
||||
script:
|
||||
- apk add --no-cache php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml
|
||||
- apk add --no-cache composer php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml
|
||||
- php --version
|
||||
- if [ ! -f composer.phar ]; then DOWLOAD_COMPOSER=1 ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php composer-setup.php ; fi;
|
||||
- if [ -n "$DOWLOAD_COMPOSER" ] ; then php -r "unlink('composer-setup.php');" ; fi;
|
||||
- php composer.phar install
|
||||
- composer install
|
||||
- vendor/bin/phpcs --warning-severity=0 --standard=PSR2 src
|
||||
- nohup php -S localhost:8000 -t tests/server/php-curl-test > phpd.log 2>&1 &
|
||||
- vendor/bin/phpunit
|
||||
cache:
|
||||
key: php7.2
|
||||
paths:
|
||||
- composer.phar
|
||||
- vendor
|
||||
|
||||
tests-php7.3:
|
||||
image: alpine:3.11
|
||||
stage: test
|
||||
services:
|
||||
- name: "$CI_REGISTRY_IMAGE:server-test"
|
||||
alias: server_test
|
||||
script:
|
||||
- apk add --no-cache composer php7-cli php7-curl php7-gd php7-phar php7-json php7-openssl php7-dom php7-simplexml php7-tokenizer php7-mbstring php7-xml
|
||||
- php --version
|
||||
- composer install
|
||||
- vendor/bin/phpcs --warning-severity=0 --standard=PSR2 src
|
||||
- nohup php -S localhost:8000 -t tests/server/php-curl-test > phpd.log 2>&1 &
|
||||
- vendor/bin/phpunit
|
||||
cache:
|
||||
key: php7.3
|
||||
paths:
|
||||
- vendor
|
||||
|
151
vendor/curl/curl/src/Curl/Curl.php
vendored
151
vendor/curl/curl/src/Curl/Curl.php
vendored
@@ -78,12 +78,12 @@ class Curl
|
||||
public $curl;
|
||||
|
||||
/**
|
||||
* @var bool Whether an error occured or not
|
||||
* @var bool Whether an error occurred or not
|
||||
*/
|
||||
public $error = false;
|
||||
|
||||
/**
|
||||
* @var int Contains the error code of the curren request, 0 means no error happend
|
||||
* @var int Contains the error code of the current request, 0 means no error happened
|
||||
*/
|
||||
public $error_code = 0;
|
||||
|
||||
@@ -93,12 +93,12 @@ class Curl
|
||||
public $error_message = null;
|
||||
|
||||
/**
|
||||
* @var bool Whether an error occured or not
|
||||
* @var bool Whether an error occurred or not
|
||||
*/
|
||||
public $curl_error = false;
|
||||
|
||||
/**
|
||||
* @var int Contains the error code of the curren request, 0 means no error happend.
|
||||
* @var int Contains the error code of the current request, 0 means no error happened.
|
||||
* @see https://curl.haxx.se/libcurl/c/libcurl-errors.html
|
||||
*/
|
||||
public $curl_error_code = 0;
|
||||
@@ -109,7 +109,7 @@ class Curl
|
||||
public $curl_error_message = null;
|
||||
|
||||
/**
|
||||
* @var bool Whether an error occured or not
|
||||
* @var bool Whether an error occurred or not
|
||||
*/
|
||||
public $http_error = false;
|
||||
|
||||
@@ -124,17 +124,17 @@ class Curl
|
||||
public $http_error_message = null;
|
||||
|
||||
/**
|
||||
* @var string|array TBD (ensure type) Contains the request header informations
|
||||
* @var string|array TBD (ensure type) Contains the request header information
|
||||
*/
|
||||
public $request_headers = null;
|
||||
|
||||
/**
|
||||
* @var string|array TBD (ensure type) Contains the response header informations
|
||||
* @var string|array TBD (ensure type) Contains the response header information
|
||||
*/
|
||||
public $response_headers = array();
|
||||
|
||||
/**
|
||||
* @var string Contains the response from the curl request
|
||||
* @var string|false|null Contains the response from the curl request
|
||||
*/
|
||||
public $response = null;
|
||||
|
||||
@@ -146,12 +146,12 @@ class Curl
|
||||
/**
|
||||
* Constructor ensures the available curl extension is loaded.
|
||||
*
|
||||
* @throws \ErrorException
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
if (!extension_loaded('curl')) {
|
||||
throw new \ErrorException('The cURL extensions is not loaded, make sure you have installed the cURL extension: https://php.net/manual/curl.setup.php');
|
||||
throw new \RuntimeException('The cURL extensions is not loaded, make sure you have installed the cURL extension: https://php.net/manual/curl.setup.php');
|
||||
}
|
||||
|
||||
$this->init();
|
||||
@@ -162,7 +162,7 @@ class Curl
|
||||
/**
|
||||
* Initializer for the curl resource.
|
||||
*
|
||||
* Is called by the __construct() of the class or when the curl request is reseted.
|
||||
* Is called by the __construct() of the class or when the curl request is reset.
|
||||
* @return self
|
||||
*/
|
||||
private function init()
|
||||
@@ -202,7 +202,7 @@ class Curl
|
||||
// protected methods
|
||||
|
||||
/**
|
||||
* Execute the curl request based on the respectiv settings.
|
||||
* Execute the curl request based on the respective settings.
|
||||
*
|
||||
* @return int Returns the error code for the current curl request
|
||||
*/
|
||||
@@ -212,14 +212,14 @@ class Curl
|
||||
$this->response = curl_exec($this->curl);
|
||||
$this->curl_error_code = curl_errno($this->curl);
|
||||
$this->curl_error_message = curl_error($this->curl);
|
||||
$this->curl_error = !($this->curl_error_code === 0);
|
||||
$this->http_status_code = curl_getinfo($this->curl, CURLINFO_HTTP_CODE);
|
||||
$this->http_error = in_array(floor($this->http_status_code / 100), array(4, 5));
|
||||
$this->curl_error = !($this->getErrorCode() === 0);
|
||||
$this->http_status_code = intval(curl_getinfo($this->curl, CURLINFO_HTTP_CODE));
|
||||
$this->http_error = $this->isError();
|
||||
$this->error = $this->curl_error || $this->http_error;
|
||||
$this->error_code = $this->error ? ($this->curl_error ? $this->curl_error_code : $this->http_status_code) : 0;
|
||||
$this->error_code = $this->error ? ($this->curl_error ? $this->getErrorCode() : $this->getHttpStatus()) : 0;
|
||||
$this->request_headers = preg_split('/\r\n/', curl_getinfo($this->curl, CURLINFO_HEADER_OUT), null, PREG_SPLIT_NO_EMPTY);
|
||||
$this->http_error_message = $this->error ? (isset($this->response_headers['0']) ? $this->response_headers['0'] : '') : '';
|
||||
$this->error_message = $this->curl_error ? $this->curl_error_message : $this->http_error_message;
|
||||
$this->error_message = $this->curl_error ? $this->getErrorMessage() : $this->http_error_message;
|
||||
|
||||
return $this->error_code;
|
||||
}
|
||||
@@ -250,6 +250,18 @@ class Curl
|
||||
$this->setOpt(CURLOPT_POSTFIELDS, $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the json payload informations to the postfield curl option.
|
||||
*
|
||||
* @param array $data The data to be sent.
|
||||
* @return void
|
||||
*/
|
||||
protected function prepareJsonPayload(array $data)
|
||||
{
|
||||
$this->setOpt(CURLOPT_POST, true);
|
||||
$this->setOpt(CURLOPT_POSTFIELDS, json_encode($data));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set auth options for the current request.
|
||||
*
|
||||
@@ -307,12 +319,17 @@ class Curl
|
||||
*
|
||||
* @param string $url The url to make the post request
|
||||
* @param array $data Post data to pass to the url
|
||||
* @param boolean $asJson Whether the data should be passed as json or not. {@insce 2.2.1}
|
||||
* @return self
|
||||
*/
|
||||
public function post($url, $data = array())
|
||||
public function post($url, $data = array(), $asJson = false)
|
||||
{
|
||||
$this->setOpt(CURLOPT_URL, $url);
|
||||
$this->preparePayload($data);
|
||||
if ($asJson) {
|
||||
$this->prepareJsonPayload($data);
|
||||
} else {
|
||||
$this->preparePayload($data);
|
||||
}
|
||||
$this->exec();
|
||||
return $this;
|
||||
}
|
||||
@@ -320,7 +337,7 @@ class Curl
|
||||
/**
|
||||
* Make a put request with optional data.
|
||||
*
|
||||
* The put request data can be either sent via payload or as get paramters of the string.
|
||||
* The put request data can be either sent via payload or as get parameters of the string.
|
||||
*
|
||||
* @param string $url The url to make the put request
|
||||
* @param array $data Optional data to pass to the $url
|
||||
@@ -346,7 +363,7 @@ class Curl
|
||||
/**
|
||||
* Make a patch request with optional data.
|
||||
*
|
||||
* The patch request data can be either sent via payload or as get paramters of the string.
|
||||
* The patch request data can be either sent via payload or as get parameters of the string.
|
||||
*
|
||||
* @param string $url The url to make the patch request
|
||||
* @param array $data Optional data to pass to the $url
|
||||
@@ -398,7 +415,7 @@ class Curl
|
||||
/**
|
||||
* Pass basic auth data.
|
||||
*
|
||||
* If the the rquested url is secured by an httaccess basic auth mechanism you can use this method to provided the auth data.
|
||||
* If the the requested url is secured by an htaccess basic auth mechanism you can use this method to provided the auth data.
|
||||
*
|
||||
* ```php
|
||||
* $curl = new Curl();
|
||||
@@ -406,8 +423,8 @@ class Curl
|
||||
* $curl->get('http://example.com/secure.php');
|
||||
* ```
|
||||
*
|
||||
* @param string $username The username for the authentification
|
||||
* @param string $password The password for the given username for the authentification
|
||||
* @param string $username The username for the authentication
|
||||
* @param string $password The password for the given username for the authentication
|
||||
* @return self
|
||||
*/
|
||||
public function setBasicAuthentication($username, $password)
|
||||
@@ -418,7 +435,7 @@ class Curl
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide optional header informations.
|
||||
* Provide optional header information.
|
||||
*
|
||||
* In order to pass optional headers by key value pairing:
|
||||
*
|
||||
@@ -442,7 +459,7 @@ class Curl
|
||||
/**
|
||||
* Provide a User Agent.
|
||||
*
|
||||
* In order to provide you cusomtized user agent name you can use this method.
|
||||
* In order to provide you customized user agent name you can use this method.
|
||||
*
|
||||
* ```php
|
||||
* $curl = new Curl();
|
||||
@@ -461,6 +478,9 @@ class Curl
|
||||
|
||||
/**
|
||||
* @deprecated Call setReferer() instead
|
||||
*
|
||||
* @param $referrer
|
||||
* @return self
|
||||
*/
|
||||
public function setReferrer($referrer)
|
||||
{
|
||||
@@ -471,7 +491,7 @@ class Curl
|
||||
/**
|
||||
* Set the HTTP referer header.
|
||||
*
|
||||
* The $referer informations can help identify the requested client where the requested was made.
|
||||
* The $referer Information can help identify the requested client where the requested was made.
|
||||
*
|
||||
* @param string $referer An url to pass and will be set as referer header
|
||||
* @return self
|
||||
@@ -503,24 +523,26 @@ class Curl
|
||||
*
|
||||
* @see http://php.net/curl_setopt
|
||||
*
|
||||
* @param int $option The curl option constante e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION`
|
||||
* @param mixed $value The value to pass for the given $option
|
||||
* @param int $option The curl option constant e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION`
|
||||
* @param mixed $value The value to pass for the given $option
|
||||
* @return bool
|
||||
*/
|
||||
public function setOpt($option, $value)
|
||||
{
|
||||
return curl_setopt($this->curl, $option, $value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get customized curl options.
|
||||
*
|
||||
* To see a full list of options: http://php.net/curl_getinfo
|
||||
*
|
||||
* @see http://php.net/curl_getinfo
|
||||
*
|
||||
* @param int $option The curl option constante e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION`
|
||||
* @param mixed $value The value to check for the given $option
|
||||
*/
|
||||
* Get customized curl options.
|
||||
*
|
||||
* To see a full list of options: http://php.net/curl_getinfo
|
||||
*
|
||||
* @see http://php.net/curl_getinfo
|
||||
*
|
||||
* @param int $option The curl option constant e.g. `CURLOPT_AUTOREFERER`, `CURLOPT_COOKIESESSION`
|
||||
* @param mixed The value to check for the given $option
|
||||
* @return mixed
|
||||
*/
|
||||
public function getOpt($option)
|
||||
{
|
||||
return curl_getinfo($this->curl, $option);
|
||||
@@ -539,17 +561,26 @@ class Curl
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable verbositiy.
|
||||
* Enable verbosity.
|
||||
*
|
||||
* @todo As to keep naming convention it should be renamed to `setVerbose()`
|
||||
* @param bool $on
|
||||
* @return self
|
||||
*/
|
||||
public function setVerbose($on = true)
|
||||
{
|
||||
$this->setOpt(CURLOPT_VERBOSE, $on);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Call setVerbose() instead
|
||||
*
|
||||
* @param string $on
|
||||
* @param bool $on
|
||||
* @return self
|
||||
*/
|
||||
public function verbose($on = true)
|
||||
{
|
||||
$this->setOpt(CURLOPT_VERBOSE, $on);
|
||||
return $this;
|
||||
return $this->setVerbose($on);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -574,7 +605,7 @@ class Curl
|
||||
$this->http_error_message = null;
|
||||
$this->request_headers = null;
|
||||
$this->response_headers = array();
|
||||
$this->response = null;
|
||||
$this->response = false;
|
||||
$this->init();
|
||||
return $this;
|
||||
}
|
||||
@@ -605,7 +636,7 @@ class Curl
|
||||
*/
|
||||
public function isInfo()
|
||||
{
|
||||
return $this->http_status_code >= 100 && $this->http_status_code < 200;
|
||||
return $this->getHttpStatus() >= 100 && $this->getHttpStatus() < 200;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -614,7 +645,7 @@ class Curl
|
||||
*/
|
||||
public function isSuccess()
|
||||
{
|
||||
return $this->http_status_code >= 200 && $this->http_status_code < 300;
|
||||
return $this->getHttpStatus() >= 200 && $this->getHttpStatus() < 300;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -623,7 +654,7 @@ class Curl
|
||||
*/
|
||||
public function isRedirect()
|
||||
{
|
||||
return $this->http_status_code >= 300 && $this->http_status_code < 400;
|
||||
return $this->getHttpStatus() >= 300 && $this->getHttpStatus() < 400;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -632,7 +663,7 @@ class Curl
|
||||
*/
|
||||
public function isError()
|
||||
{
|
||||
return $this->http_status_code >= 400 && $this->http_status_code < 600;
|
||||
return $this->getHttpStatus() >= 400 && $this->getHttpStatus() < 600;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -641,7 +672,7 @@ class Curl
|
||||
*/
|
||||
public function isClientError()
|
||||
{
|
||||
return $this->http_status_code >= 400 && $this->http_status_code < 500;
|
||||
return $this->getHttpStatus() >= 400 && $this->getHttpStatus() < 500;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -650,7 +681,7 @@ class Curl
|
||||
*/
|
||||
public function isServerError()
|
||||
{
|
||||
return $this->http_status_code >= 500 && $this->http_status_code < 600;
|
||||
return $this->getHttpStatus() >= 500 && $this->getHttpStatus() < 600;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -673,7 +704,7 @@ class Curl
|
||||
* ```
|
||||
*
|
||||
* @param string $headerKey Optional key to get from the array.
|
||||
* @return bool|string
|
||||
* @return bool|string|array
|
||||
* @since 1.9
|
||||
*/
|
||||
public function getResponseHeaders($headerKey = null)
|
||||
@@ -697,21 +728,37 @@ class Curl
|
||||
return $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get response from the curl request
|
||||
* @return string|false
|
||||
*/
|
||||
public function getResponse()
|
||||
{
|
||||
return $this->response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get curl error code
|
||||
* @return string
|
||||
*/
|
||||
public function getErrorCode()
|
||||
{
|
||||
return $this->curl_error_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get curl error message
|
||||
* @return string
|
||||
*/
|
||||
public function getErrorMessage()
|
||||
{
|
||||
return $this->curl_error_message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get http status code from the curl request
|
||||
* @return int
|
||||
*/
|
||||
public function getHttpStatus()
|
||||
{
|
||||
return $this->http_status_code;
|
||||
|
@@ -1,5 +1,11 @@
|
||||
# 公告栏
|
||||
|
||||
### 2020年7月31日09:25:55
|
||||
|
||||
1. IYUUAutoReseed正式建立了docke镜像,自动编译2个版本ARM64【iyuucn/iyuuautoreseed:arm64v8】、AMD64【iyuucn/iyuuautoreseed:latest】,使用方法:[点击查看](https://gitee.com/ledc/IYUUAutoReseed/tree/master/docker)
|
||||
2. 优化默认流控参数:单次最多20个,间隔20秒。天空辅种,请配置cookie,必须更新至最新版本,并配置浏览器UA(获取UA请访问:[http://demo.iyuu.cn](http://demo.iyuu.cn/))
|
||||
3. v1.10.2版本以后的docker,每5小时会自动拉取最新代码;从此,您只需要看公告更新配置就行啦。
|
||||
|
||||
### 2020年7月13日08:00:00
|
||||
|
||||
【更新提醒】v1.9.1
|
||||
|
@@ -4,6 +4,15 @@
|
||||
|
||||
------
|
||||
|
||||
### 2020年8月2日
|
||||
|
||||
- v1.10.2版本以后的docker,每5小时会自动拉取最新代码;从此,您只需要看公告更新配置就行啦。
|
||||
- IYUUAutoReseed正式建立了docke镜像,自动编译2个版本ARM64【iyuucn/iyuuautoreseed:arm64v8】、AMD64【iyuucn/iyuuautoreseed:latest】,使用方法:[点击查看](https://gitee.com/ledc/IYUUAutoReseed/tree/master/docker)
|
||||
- 辅种天空的用户,必须更新至最新版本。
|
||||
优化了默认流控参数:单次最多20个,间隔20秒。
|
||||
天空辅种,请配置cookie,并配置浏览器UA(获取UA请访问:[http://demo.iyuu.cn](http://demo.iyuu.cn/))
|
||||
- v1.10.4版本,支持qBittorrent v4.1.5 (小钢炮等)
|
||||
|
||||
### 2020年7月3日
|
||||
|
||||
1. 优化windows的辅种批处理,采用环境变量调用
|
||||
|
Reference in New Issue
Block a user