Jelajahi Sumber

Added Transmission to Homepage
Fixed #182

causefx 8 tahun lalu
induk
melakukan
0339bed521
7 mengubah file dengan 194 tambahan dan 23 penghapusan
  1. 5 0
      ajax.php
  2. 5 0
      config/configDefaults.php
  3. 1 1
      error.php
  4. 130 21
      functions.php
  5. 2 1
      homepage.php
  6. 1 0
      lang/en.ini
  7. 50 0
      settings.php

+ 5 - 0
ajax.php

@@ -89,6 +89,11 @@ switch ($_SERVER['REQUEST_METHOD']) {
 				echo nzbgetConnect($_GET['list'] ? $_GET['list'] : die('Error!'));
 				die();
 				break;
+			case 'transmission-update':
+				qualifyUser(TRANSMISSIONHOMEAUTH, true);
+				echo transmissionConnect($_GET['list'] ? $_GET['list'] : die('Error!'));
+				die();
+				break;
 			case 'show-image':
 				qualifyUser(NZBGETHOMEAUTH, true);
 				header('Content-type: image/jpeg');

+ 5 - 0
config/configDefaults.php

@@ -45,6 +45,10 @@ return array(
 	"nzbgetUsername" => "",
 	"nzbgetPassword" => "",
 	"nzbgetHomeAuth" => false,
+	"transmissionURL" => "",
+	"transmissionUsername" => "",
+	"transmissionPassword" => "",
+	"transmissionHomeAuth" => false,
 	"sabnzbdURL" => "",
 	"sabnzbdKey" => "",
 	"sabnzbdHomeAuth" => false,
@@ -138,5 +142,6 @@ return array(
 	"homepageOrderombi" => '12',
 	"homepageOrdercalendar" => '13',
 	"homepageOrdernoticeguest" => '14',
+	"homepageOrdertransmisson" => '15',
 	'requestedUserOnly' => 'true',
 );

+ 1 - 1
error.php

@@ -10,7 +10,7 @@ require_once("user.php");
 $USER = new User("registration_callback");
 if(isset($_GET['error']) && $_GET['error'] !== '404'){
     $status = (isset($_GET['error'])?$_GET['error']:404);
-    setcookie('lec', $status, time() + (5), "/", DOMAIN);
+	coookie('set','lec',$status,0.00006);
     http_response_code($status);
     //get file name
     if(!empty($_SERVER['PHP_SELF'])){

+ 130 - 21
functions.php

@@ -25,6 +25,7 @@ function homepageOrder(){
 		"homepageOrderombi" => homepageOrderombi,
 		"homepageOrdercalendar" => homepageOrdercalendar,
 		"homepageOrdernoticeguest" => homepageOrdernoticeguest,
+		"homepageOrdertransmisson" => homepageOrdertransmisson,
 	);
 	asort($homepageOrder);
 	return $homepageOrder;
@@ -2625,6 +2626,91 @@ function upgradeInstall($branch = 'master') {
 	writeLog("success", "organizr has been updated");
 	return true;
 }
+// Transmission Items
+function transmissionConnect($list = 'listgroups') {
+    $url = qualifyURL(TRANSMISSIONURL);
+	$digest = parse_url($url);
+	$scheme = (isset($digest['scheme'])) ? $digest['scheme'].'://' : 'http://';
+	$host = (isset($digest['host'])) ? $digest['host'] : '';
+	$path = (isset($digest['path'])) ? $digest['path'] : '';
+	$passwordInclude = (TRANSMISSIONUSERNAME != '' && TRANSMISSIONPASSWORD != '') ? TRANSMISSIONUSERNAME.':'.TRANSMISSIONPASSWORD."@" : '';
+	$url = $scheme.$passwordInclude.$host.$path.'/rpc';
+	$contextopts = array(
+		'http' => array(
+			'user_agent'  => 'HTTP_UA',
+			'ignore_errors' => true,
+		)
+	);
+	$context  = stream_context_create( $contextopts );
+	$fp = @fopen( $url, 'r', false, $context );
+	$stream_meta = stream_get_meta_data( $fp );
+    fclose( $fp );
+	foreach( $stream_meta['wrapper_data'] as $header ){
+		if( strpos( $header, 'X-Transmission-Session-Id: ' ) === 0 ){
+			$session_id = trim( substr( $header, 27 ) );
+			break;
+		}
+	}
+
+	$headers = array(
+		'X-Transmission-Session-Id' => $session_id,
+		'Content-Type' => 'application/json'
+	);
+	$data = array(
+		'method' => 'torrent-get',
+		'arguments' => array(
+			'fields' => array(
+				"id", "name", "totalSize", "eta", "isFinished", "isStalled", "percentDone", "rateDownload", "status", "downloadDir"
+			),
+		),
+		'tags' => ''
+	);
+    $api = curl_post($url, $data, $headers);
+    $api = json_decode($api['content'], true);
+    $gotTorrent = array();
+    if (is_array($api) || is_object($api)){
+		foreach ($api['arguments']['torrents'] AS $child) {
+			$downloadName = htmlentities($child['name'], ENT_QUOTES);
+			$downloadDirectory = $child['downloadDir'];
+			$downloadPercent = $child['percentDone'] * 100;
+			$progressBar = "progress-bar-striped active";
+			if($child['status'] == "6"){
+				$downloadStatus = "Seeding";
+				$downloadHealth = "success";
+			}elseif($child['status'] == "4"){
+				$downloadStatus = "Downloading";
+				$downloadHealth = "danger";
+			}elseif($child['status'] == "3"){
+				$downloadStatus = "Queued";
+				$downloadHealth = "warning";
+			}elseif($child['status'] == "0"){
+				$downloadStatus = "Complete";
+				$downloadHealth = "success";
+			}
+			$gotTorrent[] = '<tr>
+							<td class="col-xs-6 nzbtable-file-row">'.$downloadName.'</td>
+							<td class="col-xs-2 nzbtable nzbtable-row">'.$downloadStatus.'</td>
+							<td class="col-xs-1 nzbtable nzbtable-row">'.$downloadDirectory.'</td>
+							<td class="col-xs-1 nzbtable nzbtable-row">'.realSize($child['totalSize']).'</td>
+							<td class="col-xs-2 nzbtable nzbtable-row">
+								<div class="progress">
+									<div class="progress-bar progress-bar-'.$downloadHealth.' '.$progressBar.'" role="progressbar" aria-valuenow="'.$downloadPercent.'" aria-valuemin="0" aria-valuemax="100" style="width: '.$downloadPercent.'%">
+										<p class="text-center">'.round($downloadPercent).'%</p>
+										<span class="sr-only">'.$downloadPercent.'% Complete</span>
+									</div>
+								</div>
+							</td>
+						</tr>';
+		}
+		if ($gotTorrent) {
+			return implode('',$gotTorrent);
+		} else {
+			return '<tr><td colspan="5"><p class="text-center">No Results</p></td></tr>';
+		}
+	}else{
+		writeLog("error", "TRANSMISSION ERROR: could not connect - check URL and/or check token and/or Username and Password - if HTTPS, is cert valid");
+	}
+}
 
 // NzbGET Items
 function nzbgetConnect($list = 'listgroups') {
@@ -5233,6 +5319,13 @@ function buildHomepageSettings(){
 					$class .= ' faded';
 				}
 				break;
+			case 'homepageOrdertransmisson':
+				$class = 'green-bg';
+				$image = 'images/transmission.png';
+				if(empty(TRANSMISSIONURL)){
+					$class .= ' faded';
+				}
+				break;
 			case 'homepageOrdernzbget':
 				$class = 'green-bg';
 				$image = 'images/nzbget.png';
@@ -5482,6 +5575,11 @@ function buildHomepageItem($homepageItem, $group, $user){
 				';
 			}
 			break;
+		case 'homepageOrdertransmisson':
+			if(TRANSMISSIONURL != "" && qualifyUser(TRANSMISSIONHOMEAUTH)){
+				$homepageItemBuilt .= buildDownloader('transmission', 'no');
+			}
+			break;
 		case 'homepageOrdernzbget':
 			if(NZBGETURL != "" && qualifyUser(NZBGETHOMEAUTH)){
 				$homepageItemBuilt .= buildDownloader('nzbget');
@@ -5583,7 +5681,36 @@ function buildHomepageItem($homepageItem, $group, $user){
 	return $homepageItemBuilt;
 }
 
-function buildDownloader($name){
+function buildDownloader($name, $type = 'both'){
+	if($type == 'both'){
+		$tabs = '
+		<ul class="nav nav-tabs pull-right">
+			<li class="active"><a href="#downloadQueue-'.$name.'" data-toggle="tab" aria-expanded="true">'.translate("QUEUE").'</a></li>
+			<li class=""><a href="#downloadHistory-'.$name.'" data-toggle="tab" aria-expanded="false">'.translate("HISTORY").'</a></li>
+		</ul>
+		';
+		$bodyHistory = '
+		<div class="tab-pane fade" id="downloadHistory-'.$name.'">
+			<div class="table-responsive" style="max-height: 300px">
+				<table class="table table-striped progress-widget zero-m" style="max-height: 300px">
+					<thead>
+						<tr>
+							<th class="col-xs-7 nzbtable-file-row">'.translate("FILE").'</th>
+							<th class="col-xs-2 nzbtable">'.translate("STATUS").'</th>
+							<th class="col-xs-1 nzbtable">'.translate("CATEGORY").'</th>
+							<th class="col-xs-1 nzbtable">'.translate("SIZE").'</th>
+							<th class="col-xs-2 nzbtable">'.translate("PROGRESS").'</th>
+						</tr>
+					</thead>
+					<tbody class="dl-history '.$name.'"></tbody>
+				</table>
+			</div>
+		</div>
+		';
+	}else{
+		$tabs = '';
+		$bodyHistory = '';
+	}
 	return '
 <div id="downloadClientRow" class="row">
 	<div class="col-xs-12 col-md-12">
@@ -5596,10 +5723,7 @@ function buildDownloader($name){
 						</a>
 					</div>
 					<h3 class="pull-left">'.strtoupper($name).'</h3>
-					<ul class="nav nav-tabs pull-right">
-						<li class="active"><a href="#downloadQueue-'.$name.'" data-toggle="tab" aria-expanded="true">'.translate("QUEUE").'</a></li>
-						<li class=""><a href="#downloadHistory-'.$name.'" data-toggle="tab" aria-expanded="false">'.translate("HISTORY").'</a></li>
-					</ul>
+					'.$tabs.'
 					<div class="clearfix"></div>
 				</div>
 				<div class="panel-body">
@@ -5620,22 +5744,7 @@ function buildDownloader($name){
 								</table>
 							</div>
 						</div>
-						<div class="tab-pane fade" id="downloadHistory-'.$name.'">
-							<div class="table-responsive" style="max-height: 300px">
-								<table class="table table-striped progress-widget zero-m" style="max-height: 300px">
-									<thead>
-										<tr>
-											<th class="col-xs-7 nzbtable-file-row">'.translate("FILE").'</th>
-											<th class="col-xs-2 nzbtable">'.translate("STATUS").'</th>
-											<th class="col-xs-1 nzbtable">'.translate("CATEGORY").'</th>
-											<th class="col-xs-1 nzbtable">'.translate("SIZE").'</th>
-											<th class="col-xs-2 nzbtable">'.translate("PROGRESS").'</th>
-										</tr>
-									</thead>
-									<tbody class="dl-history '.$name.'"></tbody>
-								</table>
-							</div>
-						</div>
+						'.$bodyHistory.'
 					</div>
 				</div>
 			</div>

+ 2 - 1
homepage.php

@@ -804,13 +804,14 @@ foreach(loadAppearance() as $key => $value) {
                 grabcursorenabled: false
             });
 
-            <?php if((NZBGETURL != "" && qualifyUser(NZBGETHOMEAUTH)) || (SABNZBDURL != "" && qualifyUser(SABNZBDHOMEAUTH))){ ?>
+            <?php if((NZBGETURL != "" && qualifyUser(NZBGETHOMEAUTH)) || (SABNZBDURL != "" && qualifyUser(SABNZBDHOMEAUTH)) || (TRANSMISSIONURL != "" && qualifyUser(TRANSMISSIONHOMEAUTH))){ ?>
             var queueRefresh = <?php echo DOWNLOADREFRESH; ?>;
             var historyRefresh = <?php echo HISTORYREFRESH; ?>; // This really doesn't need to happen that often
 
             var queueLoad = function() {
             <?php if(SABNZBDURL != "") { echo '$("tbody.dl-queue.sabnzbd").load("ajax.php?a=sabnzbd-update&list=queue");'; } ?>
             <?php if(NZBGETURL != "") { echo '$("tbody.dl-queue.nzbget").load("ajax.php?a=nzbget-update&list=listgroups");'; } ?>
+			<?php if(TRANSMISSIONURL != "") { echo '$("tbody.dl-queue.transmission").load("ajax.php?a=transmission-update&list=listgroups");'; } ?>
             };
 
             var historyLoad = function() {

+ 1 - 0
lang/en.ini

@@ -345,3 +345,4 @@ OMBI_URL = "Ombi V3 URL"
 OMBI_KEY = "Ombi V3 API Key"
 ENABLE_WEATHER = "Enable Weather Widget"
 WEATHER_AUTH = "Minimum authentication level to access Weather Widget"
+TRANSMISSION_URL = "Transmission URL"

+ 50 - 0
settings.php

@@ -1393,6 +1393,56 @@ echo buildSettings(
 						'value' => DOWNLOADREFRESH,
 						'options' => $refreshSeconds,
 					),
+                    array(
+						'type' => $userSelectType,
+						'labelTranslate' => 'HISTORY_REFRESH',
+						'name' => 'historyRefresh',
+						'value' => HISTORYREFRESH,
+						'options' => $refreshSeconds,
+					),
+				),
+			),
+			array(
+				'title' => 'Transmission',
+				'id' => 'transmission',
+				'image' => 'images/transmission.png',
+				'fields' => array(
+					array(
+						'type' => $userSelectType,
+						'labelTranslate' => 'SHOW_ON_HOMEPAGE',
+						'name' => 'transmissionHomeAuth',
+						'value' => TRANSMISSIONHOMEAUTH,
+						'options' => $userTypes,
+					),
+					array(
+						'type' => 'text',
+						'placeholder' => 'http://hostname:6789',
+						'labelTranslate' => 'TRANSMISSION_URL',
+						'assist' => 'http://hostname:6789',
+						'name' => 'transmissionURL',
+						'pattern' => $urlPattern,
+						'value' => TRANSMISSIONURL,
+					),
+					array(
+						'type' => 'text',
+						'labelTranslate' => 'USERNAME',
+						'name' => 'transmissionUsername',
+						'value' => TRANSMISSIONUSERNAME,
+					),
+					array(
+						'type' => 'password',
+						'labelTranslate' => 'PASSWORD',
+						'name' => 'transmissionPassword',
+						'value' => (empty(TRANSMISSIONPASSWORD)?'':randString(20)),
+                        'autocomplete' => 'new-password',
+					),
+                    array(
+						'type' => $userSelectType,
+						'labelTranslate' => 'DOWNLOAD_REFRESH',
+						'name' => 'downloadRefresh',
+						'value' => DOWNLOADREFRESH,
+						'options' => $refreshSeconds,
+					),
                     array(
 						'type' => $userSelectType,
 						'labelTranslate' => 'HISTORY_REFRESH',