4
0
Эх сурвалжийг харах

added Jackett homepage item

CauseFX 5 жил өмнө
parent
commit
f268dc70af

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

@@ -31,6 +31,7 @@ class Organizr
 	use EmbyHomepageItem;
 	use HealthChecksHomepageItem;
 	use ICalHomepageItem;
+	use JackettHomepageItem;
 	use JDownloaderHomepageItem;
 	use JellyfinHomepageItem;
 	use LidarrHomepageItem;
@@ -3992,6 +3993,20 @@ class Organizr
 					}
 				}
 				break;
+			case 'homepageOrderJackett':
+				if ($this->config['jackettURL'] && $this->config['jackettToken'] && $this->qualifyRequest($this->config['homepageJackettAuth'])) {
+					if ($this->config['homepageJackettEnabled']) {
+						$item .= '<div class="white-box homepage-loading-box"><h2 class="text-center" lang="en">Loading Jackett...</h2></div>';
+						$item .= '
+					<script>
+					// Jackett
+					homepageJackett();
+					// End Jackett
+					</script>
+					';
+					}
+				}
+				break;
 			default:
 				# code...
 				break;
@@ -4086,6 +4101,14 @@ class Organizr
 						$class .= ' faded';
 					}
 					break;
+				case 'homepageOrderjellyfinnowplaying':
+				case 'homepageOrderjellyfinrecent':
+					$class = 'bg-jellyfin';
+					$image = 'plugins/images/tabs/jellyfin.png';
+					if (!$this->config['homepageJellyfinEnabled']) {
+						$class .= ' faded';
+					}
+					break;
 				case 'homepageOrderombi':
 					$class = 'bg-inverse';
 					$image = 'plugins/images/tabs/ombi.png';
@@ -4184,6 +4207,13 @@ class Organizr
 						$class .= ' faded';
 					}
 					break;
+				case 'homepageOrderJackett':
+					$class = 'bg-inverse';
+					$image = 'plugins/images/tabs/jackett.png';
+					if (!$this->config['homepageJackettEnabled']) {
+						$class .= ' faded';
+					}
+					break;
 				default:
 					$class = 'blue-bg';
 					$image = '';
@@ -4233,6 +4263,7 @@ class Organizr
 			$this->ombiSettingsArray(),
 			$this->unifiSettingsArray(),
 			$this->healthChecksSettingsArray(),
+			$this->jackettSettingsArray(),
 			$this->piholeSettingsArray(),
 			$this->tautulliSettingsArray(),
 			$this->monitorrSettingsArray(),

+ 5 - 0
api/config/default.php

@@ -111,6 +111,10 @@ return array(
 	'rTorrentCombine' => false,
 	'rTorrentDisableCertCheck' => false,
 	'rTorrentLimit' => '200',
+	'homepageJackettEnabled' => false,
+	'homepageJackettAuth' => '1',
+	'jackettURL' => '',
+	'jackettToken' => '',
 	'homepageCalendarEnabled' => false,
 	'homepageCalendarAuth' => '4',
 	'calendariCal' => '',
@@ -208,6 +212,7 @@ return array(
 	'homepageOrderOctoprint' => '28',
 	'homepageOrderjellyfinnowplaying' => '29',
 	'homepageOrderjellyfinrecent' => '30',
+	'homepageOrderJackett' => '31',
 	'homepageShowStreamNames' => false,
 	'homepageShowStreamNamesAuth' => '1',
 	'homepageStreamRefresh' => '60000',

+ 87 - 0
api/homepage/jackett.php

@@ -0,0 +1,87 @@
+<?php
+
+trait JackettHomepageItem
+{
+	public function jackettSettingsArray()
+	{
+		return array(
+			'name' => 'Jackett',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/jackett.png',
+			'category' => 'Utility',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageJackettEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageJackettEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageJackettAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageJackettAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'jackettURL',
+						'label' => 'URL',
+						'value' => $this->config['jackettURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'jackettToken',
+						'label' => 'Token',
+						'value' => $this->config['jackettToken']
+					)
+				),
+				'Options' => array(),
+			)
+		);
+	}
+	
+	public function searchJackettIndexers($query = null)
+	{
+		if (!$this->config['homepageJackettEnabled']) {
+			$this->setAPIResponse('error', 'Jackett homepage item is not enabled', 409);
+			return false;
+		}
+		if (!$this->qualifyRequest($this->config['homepageJackettAuth'])) {
+			$this->setAPIResponse('error', 'User not approved to view this homepage item', 401);
+			return false;
+		}
+		if (empty($this->config['jackettURL']) || empty($this->config['jackettToken'])) {
+			$this->setAPIResponse('error', 'Jackett URL and/or Token were not defined', 422);
+			return false;
+		}
+		if (!$query) {
+			$this->setAPIResponse('error', 'Query was not supplied', 422);
+			return false;
+		}
+		$apiURL = $this->qualifyURL($this->config['jackettURL']);
+		$endpoint = $apiURL . '/api/v2.0/indexers/all/results?apikey=' . $this->config['jackettToken'] . '&Query=' . urlencode($query);
+		try {
+			$headers = array();
+			$options = array('timeout' => 60);
+			$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', 'Weather And Air Connect Function - Error: ' . $e->getMessage(), 'SYSTEM');
+			$this->setAPIResponse('error', $e->getMessage(), 500);
+			return false;
+		};
+		$api['content'] = isset($api['content']) ? $api['content'] : false;
+		$this->setAPIResponse('success', null, 200, $api);
+		return $api;
+	}
+}

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

@@ -456,4 +456,13 @@ $app->post('/homepage/scrape', function ($request, $response, $args) {
 		->withHeader('Content-Type', 'application/json;charset=UTF-8')
 		->withStatus($GLOBALS['responseCode']);
 	
+});
+$app->get('/homepage/jackett/{query}', function ($request, $response, $args) {
+	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
+	$Organizr->searchJackettIndexers($args['query']);
+	$response->getBody()->write(jsonE($GLOBALS['api']));
+	return $response
+		->withHeader('Content-Type', 'application/json;charset=UTF-8')
+		->withStatus($GLOBALS['responseCode']);
+	
 });

+ 137 - 0
js/functions.js

@@ -8295,6 +8295,143 @@ function tryUpdateNetdata(array){
     });
     return existing;
 }
+function homepageJackett(){
+	let html = `
+	<div id="jackettSearch" class="row">
+		<div class="col-lg-12">
+			<div class="panel panel-default">
+			
+				<div class="panel-heading bg-info p-t-10 p-b-10">
+					<span class="pull-left m-t-5"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/jackett.png" > &nbsp; <span lang="en">Jackett</span></span>
+					<div class="clearfix"></div>
+				</div>
+			
+				<div class="panel-wrapper p-b-0 collapse in">
+					<div class="white-box">
+	                    <h3 class="box-title m-b-0">Search</h3>
+	                    
+	                    <form onsubmit="searchJackett();return false;">
+	                        <div class="input-group m-b-30">
+	                            <input id="jackett-search-query" class="form-control" placeholder="Search for...">
+	                            <span class="input-group-btn"> 
+	                                <button class="btn btn-info" type="submit">Go!</button> 
+	                            </span>
+	                        </div>
+	
+	                    </form>
+	                    
+	                    <div class="jackettDataTable hidden">
+        					<h3 class="box-title m-b-0" lang="en">Results</h3>
+					        <div class="table-responsive">
+					            <table id="jackettDataTable" class="table table-striped">
+					                <thead>
+					                    <tr>
+					                        <th lang="en">Date</th>
+					                        <th lang="en">Tracker</th>
+					                        <th lang="en">Name</th>
+					                        <th lang="en">Size</th>
+					                        <th lang="en">Files</th>
+					                        <th lang="en">Grabs</th>
+					                        <th lang="en">Seeds</th>
+					                        <th lang="en">Leechers</th>
+					                        <th lang="en">Download</th>
+					                    </tr>
+					                </thead>
+					                <tbody></tbody>
+					            </table>
+					        </div>
+    					</div>
+	                </div>
+					
+				</div>
+			</div>
+		</div>
+	</div>
+	`
+	$('#homepageOrderJackett').html(html);
+}
+
+function searchJackett(){
+	let query = $('#jackett-search-query').val();
+	if(query !== ''){
+		$('.jackettDataTable').removeClass('hidden');
+		ajaxloader('#jackettSearch .panel-wrapper', 'in');
+	}else{
+		return false;
+	}
+	$.fn.dataTable.ext.errMode = 'none';
+	$("#jackettDataTable").DataTable().destroy()
+	let jackettTable = $("#jackettDataTable")
+		.on( 'error.dt', function ( e, settings, techNote, message ) {
+			console.log( 'An error has been reported by DataTables: ', message );
+		} )
+		.DataTable( {
+			"ajax": {
+				"url": "api/v2/homepage/jackett/" + query,
+				"dataSrc": function ( json ) {
+					return json.response.data.content.Results;
+				}
+			},
+			"columns": [
+				{ data: 'PublishDate',
+					render: function ( data, type, row ) {
+						if ( type === 'display' || type === 'filter' ) {
+							var m = moment.tz(data, activeInfo.timezone);
+							return moment.utc(m, "YYYY-MM-DD hh:mm[Z]").local().fromNow();
+
+						}
+						return data;
+					}
+				},
+				{ "data": "Tracker" },
+				{ data: 'Title',
+					render: function ( data, type, row ) {
+						if(row.Comments !== null){
+							return '<a href="'+row.Comments+'">'+data+'</a>';
+						}else{
+							return data;
+						}
+
+					}
+				},
+				{ data: 'Size',
+					render: function ( data, type, row ) {
+						if ( type === 'display' || type === 'filter' ) {
+							return humanFileSize(data, false);
+						}
+						return humanFileSize(data, false);
+					}
+				},
+				{ "data": "Files" },
+				{ "data": "Grabs" },
+				{ "data": "Seeders" },
+				{ "data": "Peers" },
+				{ data: 'MagnetUri',
+					render: function ( data, type, row ) {
+						if ( type === 'display' || type === 'filter' ) {
+							if(data !== null){
+								return '<a href="'+data+'"><i class="fa fa-magnet"></i></a>';
+							}else if(row.Comments !== null){
+								return '<a href="'+row.Comments+'"><i class="fa fa-cloud-download"></i></a>';
+							}else if(row.Guid !== null){
+								return '<a href="'+row.Guid+'"><i class="fa fa-cloud-download"></i></a>';
+							}else if(row.Link !== null){
+								return '<a href="'+row.Link+'"><i class="fa fa-download"></i></a>';
+							}else{
+								return 'No Download Link';
+							}
+						}
+						return data;
+					}
+				},
+			],
+			"order": [[ 0, 'desc' ]],
+			"initComplete": function(settings, json) {
+				ajaxloader();
+			}
+		} );
+
+}
 function homepageOctoprint(timeout){
     var timeout = (typeof timeout !== 'undefined') ? timeout : activeInfo.settings.homepage.refresh.homepageOctoprintRefresh;
     organizrAPI2('GET','api/v2/homepage/octoprint/data').success(function(data) {