Quellcode durchsuchen

prowlarr homepage item

blowl vor 3 Jahren
Ursprung
Commit
4b401e97b1
4 geänderte Dateien mit 211 neuen und 4 gelöschten Zeilen
  1. 9 1
      api/classes/organizr.class.php
  2. 23 1
      api/v2/routes/connectionTester.php
  3. 18 1
      api/v2/routes/homepage.php
  4. 161 1
      js/functions.js

+ 9 - 1
api/classes/organizr.class.php

@@ -37,6 +37,7 @@ class Organizr
 	use HTMLHomepageItem;
 	use ICalHomepageItem;
 	use JackettHomepageItem;
+	use ProwlarrHomepageItem;
 	use JDownloaderHomepageItem;
 	use JellyfinHomepageItem;
 	use LidarrHomepageItem;
@@ -4647,6 +4648,13 @@ class Organizr
 						$class .= ' faded';
 					}
 					break;
+				case 'homepageOrderProwlarr':
+					$class = 'bg-inverse';
+					$image = 'plugins/images/tabs/prowlarr.png';
+					if (!$this->config['homepageProwlarrEnabled']) {
+						$class .= ' faded';
+					}
+					break;
 				case 'homepageOrderBookmarks':
 					$class = 'bg-bookmarks';
 					$image = 'plugins/images/bookmark.png';
@@ -7791,4 +7799,4 @@ class Organizr
 		return count($request) > 1 ? $results : $results[$firstKey];
 	}
 
-}
+}

+ 23 - 1
api/v2/routes/connectionTester.php

@@ -667,6 +667,28 @@ $app->post('/test/jackett', function ($request, $response, $args) {
 		->withHeader('Content-Type', 'application/json;charset=UTF-8')
 		->withStatus($GLOBALS['responseCode']);
 });
+$app->post('/test/prowlarr', function ($request, $response, $args) {
+	/**
+	 * @OA\Post(
+	 *     security={{ "api_key":{} }},
+	 *     tags={"test connection"},
+	 *     path="/api/v2/test/prowlarr",
+	 *     summary="Test connection to prowlarr",
+	 *     @OA\Response(response="200",description="Success",@OA\JsonContent(ref="#/components/schemas/success-message")),
+	 *     @OA\Response(response="401",description="Unauthorized",@OA\JsonContent(ref="#/components/schemas/unauthorized-message")),
+	 *     @OA\Response(response="422",description="Error",@OA\JsonContent(ref="#/components/schemas/error-message")),
+	 *     @OA\Response(response="500",description="Error",@OA\JsonContent(ref="#/components/schemas/error-message")),
+	 * )
+	 */
+	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
+	if ($Organizr->qualifyRequest(1, true)) {
+		$Organizr->testConnectionProwlarr();
+	}
+	$response->getBody()->write(jsonE($GLOBALS['api']));
+	return $response
+		->withHeader('Content-Type', 'application/json;charset=UTF-8')
+		->withStatus($GLOBALS['responseCode']);
+});
 $app->post('/test/slack-logs', function ($request, $response, $args) {
 	/**
 	 * @OA\Post(
@@ -688,4 +710,4 @@ $app->post('/test/slack-logs', function ($request, $response, $args) {
 	return $response
 		->withHeader('Content-Type', 'application/json;charset=UTF-8')
 		->withStatus($GLOBALS['responseCode']);
-});
+});

+ 18 - 1
api/v2/routes/homepage.php

@@ -515,6 +515,23 @@ $app->post('/homepage/jackett/download/', function ($request, $response, $args)
 		->withHeader('Content-Type', 'application/json;charset=UTF-8')
 		->withStatus($GLOBALS['responseCode']);
 });
+$app->get('/homepage/prowlarr/{query}', function ($request, $response, $args) {
+	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
+	$Organizr->searchProwlarrIndexers($args['query']);
+	$response->getBody()->write(jsonE($GLOBALS['api']));
+	return $response
+		->withHeader('Content-Type', 'application/json;charset=UTF-8')
+		->withStatus($GLOBALS['responseCode']);
+});
+$app->post('/homepage/prowlarr/download/', function ($request, $response, $args) {
+	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
+	$postData = $request->getParsedBody();
+	$Organizr->performProwlarrBackHoleDownload($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();
@@ -571,4 +588,4 @@ $app->post('/homepage/donate', function ($request, $response, $args) {
 	return $response
 		->withHeader('Content-Type', 'application/json;charset=UTF-8')
 		->withStatus($GLOBALS['responseCode']);
-});
+});

+ 161 - 1
js/functions.js

@@ -2454,6 +2454,8 @@ function checkTabHomepageItem(id, name, url, urlLocal){
         addEditHomepageItem(id,'HealthChecks');
     }else if(name.includes('jackett') || url.includes('jackett') || urlLocal.includes('jackett')){
 	    addEditHomepageItem(id,'Jackett');
+    }else if(name.includes('prowlarr') || url.includes('prowlarr') || urlLocal.includes('prowlarr')){
+	    addEditHomepageItem(id,'Prowlarr');
     }else if(name.includes('unifi') || url.includes('unifi') || urlLocal.includes('unifi')){
 	    addEditHomepageItem(id,'Unifi');
     }else if(name.includes('tautulli') || url.includes('tautulli') || urlLocal.includes('tautulli')){
@@ -7602,7 +7604,7 @@ function buildPiholeItem(array){
             <div class="card text-white mb-3 pihole-stat bg-green">
                 <div class="card-body">
                     <div class="inline-block">
-                        <p class="d-inline mr-1">Total queries</p>`;
+                        <p class="d-inline mr-1">Total Queries</p>`;
         for(var key in data) {
             var e = data[key];
             if(typeof e['FTLnotrunning'] == 'undefined'){
@@ -9643,6 +9645,164 @@ function jackettDownload(url) {
 			OrganizrApiError(xhr, 'Error downloading torrent');
 		});
 }
+/////////////////////////////////////////////////////////
+function homepageProwlarr(){
+	if(activeInfo.settings.homepage.options.alternateHomepageHeaders){
+		var header = `
+		<div class="col-md-12">
+			<h2 class="text-white m-0 pull-left text-uppercase"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/prowlarr.png"> &nbsp; <span lang="en">Prowlarr</span>&nbsp;</h2>
+			<hr class="hidden-xs"><div class="clearfix"></div>
+		</div>
+		<div class="clearfix"></div>
+		<script>$('.prowlarr-panel').removeClass('panel panel-default');</script>
+		`;
+	}else{
+		var header = `
+		<div class="panel-heading bg-info p-t-10 p-b-10">
+			<span class="pull-left m-t-5 text-white"><img class="lazyload homepageImageTitle" data-src="plugins/images/tabs/prowlarr.png" > &nbsp; <span lang="en">Prowlarr</span></span>
+			<div class="clearfix"></div>
+		</div>
+		`;
+	}
+	let html = `
+	<div id="prowlarrSearch" class="row">
+		<div class="col-lg-12">
+			<div class="prowlarr-panel panel panel-default">
+				`+header+`
+				<div class="panel-wrapper p-b-0 collapse in">
+					<div class="white-box">
+	                    <h3 class="box-title m-b-0" lang="en">Search</h3>
+	                    
+	                    <form onsubmit="searchProwlarr();return false;">
+	                        <div class="input-group m-b-30">
+	                        	<span class="input-group-btn hidden">
+									<button type="button" class="btn waves-effect waves-light btn-primary clearProwlarr" onclick="clearProwlarr();"><i class="fa fa-eraser"></i></button>
+								</span>
+	                            <input id="prowlarr-search-query" class="form-control" placeholder="Search for..." lang="en">
+	                            <span class="input-group-btn">
+									<button type="submit" class="btn waves-effect waves-light btn-info"><i class="fa fa-search"></i></button>
+								</span>
+	                        </div>
+	
+	                    </form>
+	                    
+	                    <div class="prowlarrDataTable hidden">
+        					<h3 class="box-title m-b-0" lang="en">Results</h3>
+					        <div class="table-responsive">
+					            <table id="prowlarrDataTable" class="table table-striped">
+					                <thead>
+					                    <tr>
+					                        <th lang="en">Date</th>
+					                        <th lang="en">Indexer</th>
+					                        <th lang="en">Title</th>
+					                        <th lang="en">Size</th>
+					                        <th lang="en">Grabs</th>
+					                        <th lang="en">Seeders</th>
+					                        <th lang="en">Leechers</th>
+					                        <th lang="en">Download</th>
+					                    </tr>
+					                </thead>
+					                <tbody></tbody>
+					            </table>
+					        </div>
+    					</div>
+	                </div>
+					
+				</div>
+			</div>
+		</div>
+	</div>
+	`;
+	$('#homepageOrderProwlarr').html(html);
+}
+function clearProwlarr(){
+	$('#prowlarr-search-query').val('');
+	$('.clearProwlarr').parent().addClass('hidden');
+	$('#prowlarrDataTable').DataTable().destroy();
+	$('.prowlarrDataTable').addClass('hidden');
+}
+function searchProwlarr(){
+	let query = $('#prowlarr-search-query').val();
+	if(query !== ''){
+		$('.prowlarrDataTable').removeClass('hidden');
+		ajaxloader('#prowlarrSearch .panel-wrapper', 'in');
+	}else{
+		return false;
+	}
+	$.fn.dataTable.ext.errMode = 'none';
+	$('#prowlarrDataTable').DataTable().destroy();
+	let prowlarrTable = $("#prowlarrDataTable")
+		.on( 'error.dt', function ( e, settings, techNote, message ) {
+			console.log( 'An error has been reported by DataTables: ', message );
+		} )
+		.DataTable( {
+			"ajax": {
+				"url": "api/v2/homepage/prowlarr/" + query,
+				"dataSrc": function ( json ) {
+					return json.response.data.content;
+				}
+			},
+			"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: 'indexer' },
+				{ data: 'title',
+					render: function ( data, type, row ) {
+						if(row.Details !== null){
+							return '<a href="'+row['infoUrl']+'" target="_blank">'+data+'</a>';
+						}else{
+							return data;
+						}
+
+					}
+				},
+				{ data: 'size',	render: function ( data ) {
+                    return humanFileSize(data, false);
+                }},
+				{ data: 'grabs' },
+				{ data: 'seeders' },
+				{ data: 'leechers' },
+				{ data: 'downloadUrl',
+					render: function ( data, type, row ) {
+						if ( type === 'display' || type === 'filter' ) {
+                            if(data !== null){
+								return '<a href="'+data+'" target="_blank"><i class="fa fa-download"></i></a>';
+							}else{
+								return 'No Download Link';
+							}
+						}
+						return data;
+					}
+				},
+			],
+			"order": [[ 5, 'desc' ]],
+			"initComplete": function(settings, json) {
+				ajaxloader();
+				//ajaxblocker('.prowlarr-panel .white-box');
+				$('.clearProwlarr').parent().removeClass('hidden');
+			}
+		} );
+}
+function prowlarrDownload(url) {
+	let blackholeLink=url.substring(url.indexOf("/bh/"));
+	var post = {
+		url: blackholeLink
+	};
+	organizrAPI2('POST', 'api/v2/homepage/prowlarr/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) {