Pārlūkot izejas kodu

Merge branch 'v2-develop' of https://github.com/causefx/Organizr into v2-develop

CauseFX 5 gadi atpakaļ
vecāks
revīzija
e0183bc49a

+ 3 - 0
api/classes/organizr.class.php

@@ -3474,6 +3474,9 @@ class Organizr
 					'ombiDefaultFilterUnapproved' => $this->config['ombiDefaultFilterUnapproved'] ? true : false,
 					'ombiDefaultFilterDenied' => $this->config['ombiDefaultFilterDenied'] ? true : false
 				),
+				'jackett' => array(
+					'homepageJackettBackholeDownload' => $this->config['homepageJackettBackholeDownload'] ? true : false
+				),
 				'options' => array(
 					'alternateHomepageHeaders' => $this->config['alternateHomepageHeaders'],
 					'healthChecksTags' => $this->config['healthChecksTags'],

+ 1 - 0
api/config/default.php

@@ -130,6 +130,7 @@ return array(
 	'homepageJackettAuth' => '1',
 	'jackettURL' => '',
 	'jackettToken' => '',
+	'homepageJackettBackholeDownload' => false,
 	'homepageCalendarEnabled' => false,
 	'homepageCalendarAuth' => '4',
 	'calendariCal' => '',

+ 2 - 2
api/functions/sso-functions.php

@@ -177,7 +177,7 @@ trait SSOFunctions
 			if ($response->success) {
 				$user = json_decode($response->body, true); // not really needed yet
 				$token = $response->cookies['connect.sid']->value;
-				$this->writeLog('success', 'Overseerr Token Function - Grabbed token', $user['username']);
+				$this->writeLog('success', 'Overseerr Token Function - Grabbed token', $user['plexUsername']);
 			} else {
 				if ($fallback) {
 					$this->writeLog('error', 'Overseerr Token Function - Overseerr did not return Token - Will retry using fallback credentials', $username);
@@ -197,4 +197,4 @@ trait SSOFunctions
 		}
 	}
 	
-}
+}

+ 47 - 2
api/homepage/jackett.php

@@ -41,7 +41,15 @@ trait JackettHomepageItem
 						'value' => $this->config['jackettToken']
 					)
 				),
-				'Options' => array(),
+				'Options' => array(
+				    array(
+                	    'type' => 'switch',
+                		'name' => 'homepageJackettBackholeDownload',
+                		'label' => 'Prefer black hole download',
+                		'help' => 'Prefer black hole download link instead of direct/magnet download',
+                		'value' => $this->config['homepageJackettBackholeDownload']
+                	)
+                ),
 			)
 		);
 	}
@@ -116,4 +124,41 @@ trait JackettHomepageItem
 		$this->setAPIResponse('success', null, 200, $api);
 		return $api;
 	}
-}
+
+	public function performJackettBackHoleDownload($url = null)
+	{
+		if (!$this->homepageItemPermissions($this->jackettHomepagePermissions('main'), true)) {
+			return false;
+		}
+		if (!$url) {
+			$this->setAPIResponse('error', 'URL was not supplied', 422);
+			return false;
+		}
+		$apiURL = $this->qualifyURL($this->config['jackettURL']);
+		$endpoint = $apiURL . $url;
+		error_log($endpoint);
+		try {
+			$headers = array();
+			$options = array('timeout' => 120);
+			$response = Requests::get($endpoint, $headers, $options);
+			if ($response->success) {
+				$apiData = json_decode($response->body, true);
+				$api['content'] = $apiData;
+				unset($apiData);
+			}
+		} catch (Requests_Exception $e) {
+			$this->writeLog('error', 'Jackett blackhole download failed ' . $e->getMessage(), 'SYSTEM');
+			$this->setAPIResponse('error', $e->getMessage(), 500);
+			return false;
+		};
+		$api['content'] = isset($api['content']) ? $api['content'] : false;
+		if ($api['content'] && $api['content']['result'] == 'success') {
+			$this->setAPIResponse('success', null, 200, $api);
+		} else if ($api['content']) {
+			$this->setAPIResponse('error', $api['content']['error'], 400, $api);
+		} else {
+			$this->setAPIResponse('error', 'Unknown error', 400, $api);
+		}
+		return $api;
+	}
+}

+ 9 - 0
api/v2/routes/homepage.php

@@ -423,6 +423,15 @@ $app->get('/homepage/jackett/{query}', function ($request, $response, $args) {
 		->withHeader('Content-Type', 'application/json;charset=UTF-8')
 		->withStatus($GLOBALS['responseCode']);
 });
+$app->post('/homepage/jackett/download/', function ($request, $response, $args) {
+	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
+	$postData  = $request->getParsedBody();
+	$Organizr->performJackettBackHoleDownload($postData['url']);
+	$response->getBody()->write(jsonE($GLOBALS['api']));
+	return $response
+		->withHeader('Content-Type', 'application/json;charset=UTF-8')
+		->withStatus($GLOBALS['responseCode']);
+});
 $app->get('/homepage/trakt/calendar', function ($request, $response, $args) {
 	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
 	$Organizr->getTraktCalendar();

+ 1 - 1
api/v2/routes/token.php

@@ -13,7 +13,7 @@ $app->delete('/token/{id}', function ($request, $response, $args) {
 $app->post('/token/validate', function ($request, $response, $args) {
         $Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
         if ($Organizr->qualifyRequest(999, true)) {
-                $GLOBALS['api']['response']['data'] = $Organizr->jwtParse($_REQUEST["Token"]);
+                $GLOBALS['api']['response']['data'] = $Organizr->validateToken($_REQUEST["Token"]);
         }
         $response->getBody()->write(jsonE($GLOBALS['api']));
         return $response

+ 17 - 1
js/functions.js

@@ -8531,6 +8531,7 @@ function searchJackett(){
 	}
 	$.fn.dataTable.ext.errMode = 'none';
 	$('#jackettDataTable').DataTable().destroy();
+	let preferBlackholeDownload = activeInfo.settings.homepage.jackett.homepageJackettBackholeDownload;
 	let jackettTable = $("#jackettDataTable")
 		.on( 'error.dt', function ( e, settings, techNote, message ) {
 			console.log( 'An error has been reported by DataTables: ', message );
@@ -8579,7 +8580,9 @@ function searchJackett(){
 				{ data: 'MagnetUri',
 					render: function ( data, type, row ) {
 						if ( type === 'display' || type === 'filter' ) {
-							if(data !== null){
+							if(preferBlackholeDownload === true && row.BlackholeLink !== null){
+								return '<a onclick="jackettDownload(\''+row.BlackholeLink+'\');return false;" href="#"><i class="fa fa-cloud-download"></i></a>';
+							}else if(data !== null){
 								return '<a href="'+data+'" target="_blank"><i class="fa fa-magnet"></i></a>';
 							}else if(row.Details !== null){
 								return '<a href="'+row.Details+'" target="_blank"><i class="fa fa-cloud-download"></i></a>';
@@ -8604,6 +8607,19 @@ function searchJackett(){
 		} );
 
 }
+function jackettDownload(url) {
+	let blackholeLink=url.substring(url.indexOf("/bh/"));
+	var post = {
+		url: blackholeLink
+	};
+	organizrAPI2('POST', 'api/v2/homepage/jackett/download/', post, true)
+		.success(function() {
+			message('Torrent downloaded','',activeInfo.settings.notifications.position,"#FFF","success","5000");
+		})
+		.fail(function(xhr) {
+			OrganizrApiError(xhr, 'Error downloading torrent');
+		});
+}
 function homepageOctoprint(timeout){
     var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageOctoprintRefresh;
     organizrAPI2('GET','api/v2/homepage/octoprint/data').success(function(data) {