'uTorrent', 'enabled' => strpos('personal', $this->config['license']) !== false, 'image' => 'plugins/images/tabs/utorrent.png', 'category' => 'Downloader', 'settingsArray' => __FUNCTION__ ]; if ($infoOnly) { return $homepageInformation; } $homepageSettings = [ 'debug' => true, 'settings' => [ 'Enable' => [ $this->settingsOption('enable', 'homepageuTorrentEnabled'), $this->settingsOption('auth', 'homepageuTorrentAuth'), ], 'Connection' => [ $this->settingsOption('url', 'uTorrentURL'), $this->settingsOption('blank'), $this->settingsOption('username', 'uTorrentUsername'), $this->settingsOption('password', 'uTorrentPassword'), $this->settingsOption('disable-cert-check', 'uTorrentDisableCertCheck'), $this->settingsOption('use-custom-certificate', 'uTorrentUseCustomCertificate'), ], 'Misc Options' => [ $this->settingsOption('hide-seeding', 'uTorrentHideSeeding', ['label' => 'Hide Seeding']), $this->settingsOption('hide-completed', 'uTorrentHideCompleted'), $this->settingsOption('refresh', 'uTorrentRefresh'), $this->settingsOption('combine', 'uTorrentCombine'), ], 'Test Connection' => [ $this->settingsOption('blank', null, ['label' => 'Please Save before Testing']), $this->settingsOption('test', 'utorrent'), ] ] ]; return array_merge($homepageInformation, $homepageSettings); } public function uTorrentHomepagePermissions($key = null) { $permissions = [ 'main' => [ 'enabled' => [ 'homepageuTorrentEnabled' ], 'auth' => [ 'homepageuTorrentAuth' ], 'not_empty' => [ 'uTorrentURL' ] ] ]; if (array_key_exists($key, $permissions)) { return $permissions[$key]; } elseif ($key == 'all') { return $permissions; } else { return []; } } public function testConnectionuTorrent() { if (empty($this->config['uTorrentURL'])) { $this->setAPIResponse('error', 'uTorrent URL is not defined', 422); return false; } try { $response = $this->getuTorrentToken(); } catch (Requests_Exception $e) { $this->setLoggerChannel('uTorrent')->error($e); $this->setResponse(500, $e->getMessage()); return false; } } public function homepageOrderuTorrent() { if ($this->homepageItemPermissions($this->uTorrentHomepagePermissions('main'))) { $loadingBox = ($this->config['uTorrentCombine']) ? '' : '

Loading Download Queue...

'; $builder = ($this->config['uTorrentCombine']) ? 'buildDownloaderCombined(\'utorrent\');' : '$("#' . __FUNCTION__ . '").html(buildDownloader("utorrent"));'; return '
' . $loadingBox . '
'; } } public function getuTorrentToken() { try { $tokenUrl = '/gui/token.html'; $digest = $this->qualifyURL($this->config['uTorrentURL'], true); $url = $digest['scheme'] . '://' . $digest['host'] . $digest['port'] . $digest['path'] . $tokenUrl; $data = array('username' => $this->config['uTorrentUsername'], 'password' => $this->decrypt($this->config['uTorrentPassword'])); $options = $this->requestOptions($url, null, $this->config['uTorrentDisableCertCheck'], $this->config['uTorrentUseCustomCertificate']); if ($this->config['uTorrentUsername'] !== '' && $this->decrypt($this->config['uTorrentPassword']) !== '') { $credentials = array('auth' => new Requests_Auth_Basic(array($this->config['uTorrentUsername'], $this->decrypt($this->config['uTorrentPassword'])))); $options = array_merge($options, $credentials); } $response = Requests::post($url, [], $data, $options); $dom = new PHPHtmlParser\Dom; $dom->loadStr($response->body); $id = $dom->getElementById('token')->text; $uTorrentConfig = array( "uTorrentToken" => $id, "uTorrentCookie" => "", ); $reflection = new ReflectionClass($response->cookies); $cookie = $reflection->getProperty("cookies"); $cookie->setAccessible(true); $cookie = $cookie->getValue($response->cookies); if ($cookie['GUID']) { $uTorrentConfig['uTorrentCookie'] = $cookie['GUID']->value; } if ($uTorrentConfig['uTorrentToken'] || $uTorrentConfig['uTorrentCookie']) { $this->updateConfigItems($uTorrentConfig); } } catch (Requests_Exception $e) { $this->setLoggerChannel('uTorrent')->error($e); $this->setResponse(500, $e->getMessage()); return false; } } public function getuTorrentHomepageQueue() { if (!$this->homepageItemPermissions($this->uTorrentHomepagePermissions('main'), true)) { return false; } try { if (!$this->config['uTorrentToken'] || !$this->config['uTorrentCookie']) { $this->getuTorrentToken(); } $queryUrl = '/gui/?token=' . $this->config['uTorrentToken'] . '&list=1'; $digest = $this->qualifyURL($this->config['uTorrentURL'], true); $url = $digest['scheme'] . '://' . $digest['host'] . $digest['port'] . $digest['path'] . $queryUrl; $options = $this->requestOptions($url, null, $this->config['uTorrentDisableCertCheck'], $this->config['uTorrentUseCustomCertificate']); if ($this->config['uTorrentUsername'] !== '' && $this->decrypt($this->config['uTorrentPassword']) !== '') { $credentials = array('auth' => new Requests_Auth_Basic(array($this->config['uTorrentUsername'], $this->decrypt($this->config['uTorrentPassword'])))); $options = array_merge($options, $credentials); } $headers = array( 'Cookie' => 'GUID=' . $this->config['uTorrentCookie'] ); $response = Requests::get($url, $headers, $options); $httpResponse = $response->status_code; if ($httpResponse == 400) { $this->setLoggerChannel('uTorrent')->warning('Token or Cookie Expired. Generating new session...'); $this->getuTorrentToken(); $response = Requests::get($url, $headers, $options); $httpResponse = $response->status_code; } if ($httpResponse == 200) { $responseData = json_decode($response->body); $keyArray = (array)$responseData->torrents; //Populate values $valueArray = array(); foreach ($keyArray as $keyArr) { preg_match('/(?(\w+\s+)+)(?\d+.\d+.*)/', $keyArr[21], $matches); $Status = str_replace(' ', '', $matches['Status']); if ($this->config['uTorrentHideSeeding'] && $Status == "Seeding") { // Do Nothing } else if ($this->config['uTorrentHideCompleted'] && $Status == "Finished") { // Do Nothing } else { $value = array( 'Hash' => $keyArr[0], 'TorrentStatus' => $keyArr[1], 'Name' => $keyArr[2], 'Size' => $keyArr[3], 'Progress' => $keyArr[4], 'Downloaded' => $keyArr[5], 'Uploaded' => $keyArr[6], 'Ratio' => $keyArr[7], 'upSpeed' => $keyArr[8], 'downSpeed' => $keyArr[9], 'eta' => $keyArr[10], 'Labels' => $keyArr[11], 'PeersConnected' => $keyArr[12], 'PeersInSwarm' => $keyArr[13], 'SeedsConnected' => $keyArr[14], 'SeedsInSwarm' => $keyArr[15], 'Availability' => $keyArr[16], 'TorrentQueueOrder' => $keyArr[17], 'Remaining' => $keyArr[18], 'DownloadUrl' => $keyArr[19], 'RssFeedUrl' => $keyArr[20], 'Message' => $keyArr[21], 'StreamId' => $keyArr[22], 'DateAdded' => $keyArr[23], 'DateCompleted' => $keyArr[24], 'AppUpdateUrl' => $keyArr[25], 'RootDownloadPath' => $keyArr[26], 'Unknown27' => $keyArr[27], 'Unknown28' => $keyArr[28], 'Status' => $Status, 'Percent' => str_replace(' ', '', $matches['Percentage']), ); array_push($valueArray, $value); } } $api['content']['queueItems'] = $valueArray; $api['content'] = $api['content'] ?? false; $this->setAPIResponse('success', null, 200, $api); return $api; } } catch (Requests_Exception $e) { $this->setLoggerChannel('uTorrent')->error($e); $this->setResponse(500, $e->getMessage()); return false; } } }