radarrplexorganizrnginxsonarrdashboardserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpc
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							166 lines
						
					
					
						
							5.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							166 lines
						
					
					
						
							5.2 KiB
						
					
					
				| <?php namespace App\SupportedApps; | |
| 
 | |
| use GuzzleHttp\Exception\GuzzleException; | |
| use GuzzleHttp\Client; | |
| use Illuminate\Support\Facades\Log; | |
| 
 | |
| class Transmission implements Contracts\Applications, Contracts\Livestats | |
| { | |
| 
 | |
|     private $_client; | |
|     private $_clientOptions = array(); | |
| 
 | |
|     public function __construct() | |
|     { | |
|         $body = array(); | |
|         $body["method"] = "torrent-get"; | |
|         $body["arguments"] = array("fields" => ["percentDone","status","rateDownload","rateUpload"]); | |
|         $this->_client = new Client( | |
|             ['http_errors' => false, | |
|             'timeout' => 10, | |
|             'body' => json_encode($body)] | |
|         ); | |
|     } | |
| 
 | |
|     public function defaultColour() | |
|     { | |
|         return '#950003'; | |
|     } | |
|     public function icon() | |
|     { | |
|         return 'supportedapps/transmission.png'; | |
|     } | |
|     public function configDetails() | |
|     { | |
|         return 'transmission'; | |
|     } | |
|     public function testConfig() | |
|     { | |
|         $res = $this->sendRequest(); | |
|         if ($res == null) { | |
|             echo 'Transmission connection failed'; | |
|             return; | |
|         } | |
|         switch($res->getStatusCode()) { | |
|         case 200: | |
|             $data = json_decode($res->getBody()); | |
|             echo "Successfully connected with status: ".$data->result."\n"; | |
|             break; | |
|         case 401: | |
|             echo 'Failed: Invalid credentials'; | |
|             break; | |
|         case 404: | |
|             echo 'Failed: Please make sure your URL is correct and includes the port'; | |
|             break; | |
|         case 409: | |
|             echo 'Failed: Incorrect session id'; | |
|             break; | |
|         default: | |
|             echo 'Something went wrong... Code: '.$res->getStatusCode(); | |
|             break; | |
|         } | |
|     } | |
| 
 | |
|     public function executeConfig() | |
|     { | |
|         $html = ''; | |
|         $active = 'active'; | |
|         $res = $this->sendRequest(); | |
|         if ($res == null) { | |
|             Log::debug('Transmission connection failed'); | |
|             return ''; | |
|         } | |
|         $data = json_decode($res->getBody()); | |
|         if (! isset($data->arguments)) { | |
|             Log::debug('Failed to fetch data from Transmission'); | |
|             return ''; | |
|         } | |
|         $torrents = $data->arguments->torrents; | |
|         $torrentCount = count($torrents); | |
|         $rateDownload = $rateUpload = $completedTorrents = 0; | |
|         foreach ($torrents as $thisTorrent) { | |
|             $rateDownload += $thisTorrent->rateDownload; | |
|             $rateUpload += $thisTorrent->rateUpload; | |
|             if ($thisTorrent->percentDone == 1) { | |
|                 $completedTorrents += 1; | |
|             } | |
|         } | |
|         if ($torrentCount - $completedTorrents == 0) { | |
|             // Don't poll as frequently if we don't have any active torrents | |
|             $active = 'inactive'; | |
|         } | |
| 
 | |
|         $html = ' | |
|         <ul class="livestats"> | |
|             <li><span class="title">Done</span><sub>'.$completedTorrents.' / '.$torrentCount.'</sub></li> | |
|             <li><span class="title">Down</span><sub>'.format_bytes($rateDownload).'</sub></li> | |
|             <li><span class="title">Up</span><sub>'.format_bytes($rateUpload).'</sub></li> | |
|         </ul> | |
|         '; | |
|         return json_encode(['status' => $active, 'html' => $html]);; | |
|     } | |
| 
 | |
|     private function sendRequest() | |
|     { | |
|         $optionsSet = $this->setClientOptions(); | |
|         if (! $optionsSet) { | |
|             // Pass the failed response back up the chain | |
|             return null; | |
|         } | |
|         $res = $this->torrentGet(); | |
|         if ($res->getStatusCode() == 409) { | |
|             $this->setClientOptions(); | |
|             $res = $this->torrentGet(); | |
|         } | |
|         return $res; | |
|     } | |
| 
 | |
|     private function torrentGet() | |
|     { | |
|         $res = null; | |
|         try{ | |
|             $res = $this->_client->request( | |
|                 'POST', | |
|                 $this->getApiUrl(), | |
|                 $this->_clientOptions | |
|             ); | |
|         }catch(\GuzzleHttp\Exception\BadResponseException $e){ | |
|             Log::error("Connection to {$e->getRequest()->getUrl()} failed"); | |
|             Log::debug($e->getMessage()); | |
|             $res = $e->getRequest(); | |
|         }catch(\GuzzleHttp\Exception\ConnectException $e) { | |
|             Log::error("Transmission connection refused"); | |
|             Log::debug($e->getMessage()); | |
|         } | |
|         return $res; | |
|     } | |
| 
 | |
|     private function setClientOptions() | |
|     { | |
|         if ($this->config->username != '' || $this->config->password != '') { | |
|             $this->_clientOptions = ['auth'=> [$this->config->username, $this->config->password, 'Basic']]; | |
|         } | |
|         try{ | |
|             $res = $this->_client->request('HEAD', $this->getApiUrl(), $this->_clientOptions); | |
|             $xtId = $res->getHeaderLine('X-Transmission-Session-Id'); | |
|             if ($xtId != null) { | |
|                 $this->_clientOptions['headers'] = ['X-Transmission-Session-Id' => $xtId]; | |
|             } else { | |
|                 Log::error("Unable to get Transmission session information"); | |
|                 Log::debug("Status Code: ".$res->getStatusCode()); | |
|             } | |
|         }catch(\GuzzleHttp\Exception\ConnectException $e){ | |
|             Log::error("Failed connection to Transmission"); | |
|             return false; | |
|         } | |
|         return true; | |
|     } | |
| 
 | |
|     private function getApiUrl() | |
|     { | |
|         $url = $this->config->url; | |
|         $url = rtrim($url, '/'); | |
|         $apiUrl = $url.'/transmission/rpc'; | |
|         return $apiUrl; | |
|     } | |
| }
 | |
| 
 |