Browse Source

Merge branch 'v2-develop' into octoprint

causefx 5 years ago
parent
commit
717baee92d

+ 11 - 1
api/config/default.php

@@ -116,6 +116,10 @@ return array(
 	'homepageSabnzbdAuth' => '1',
 	'homepageSonarrEnabled' => false,
 	'homepageSonarrAuth' => '1',
+	'homepageSonarrQueueEnabled' => false,
+	'homepageSonarrQueueAuth' => '1',
+	'homepageSonarrQueueCombine' => false,
+	'homepageSonarrQueueRefresh' => '60000',
 	'homepageLidarrEnabled' => false,
 	'homepageLidarrAuth' => '1',
 	'homepageCouchpotatoEnabled' => false,
@@ -124,6 +128,10 @@ return array(
 	'homepageSickrageAuth' => '1',
 	'homepageRadarrEnabled' => false,
 	'homepageRadarrAuth' => '1',
+	'homepageRadarrQueueEnabled' => false,
+	'homepageRadarrQueueAuth' => '1',
+	'homepageRadarrQueueCombine' => false,
+	'homepageRadarrQueueRefresh' => '60000',
 	'homepageTransmissionEnabled' => false,
 	'homepageTransmissionAuth' => '1',
 	'homepageqBittorrentEnabled' => false,
@@ -183,7 +191,9 @@ return array(
 	'homepageOrderWeatherAndAir' => '23',
 	'homepageOrderSpeedtest' => '24',
 	'homepageOrderNetdata' => '25',
-	'homepageOrderOctoprint' => '26',
+	'homepageOrderSonarrQueue' => '26',
+	'homepageOrderRadarrQueue' => '27',
+  'homepageOrderOctoprint' => '28',
 	'homepageShowStreamNames' => false,
 	'homepageShowStreamNamesAuth' => '1',
 	'homepageStreamRefresh' => '60000',

+ 19 - 3
api/functions/auth-functions.php

@@ -106,7 +106,7 @@ function checkPlexUser($username)
 	return false;
 }
 
-function allPlexUsers($newOnly = false)
+function allPlexUsers($newOnly = false, $friendsOnly = false)
 {
 	try {
 		if (!empty($GLOBALS['plexToken'])) {
@@ -127,13 +127,29 @@ function allPlexUsers($newOnly = false)
 								if (!$taken) {
 									$results[] = array(
 										'username' => (string)$child['username'],
-										'email' => (string)$child['email']
+										'email' => (string)$child['email'],
+										'id' => (string)$child['id'],
 									);
 								}
-							} else {
+							} elseif ($friendsOnly) {
+								$machineMatches = false;
+								foreach ($child->Server as $server) {
+									if ((string)$server['machineIdentifier'] == $GLOBALS['plexID']) {
+										$machineMatches = true;
+									}
+								}
+								if($machineMatches){
+									$results[] = array(
+										'username' => (string)$child['username'],
+										'email' => (string)$child['email'],
+										'id' => (string)$child['id'],
+									);
+								}
+							}else{
 								$results[] = array(
 									'username' => (string)$child['username'],
 									'email' => (string)$child['email'],
+									'id' => (string)$child['id'],
 								);
 							}
 							

+ 84 - 1
api/functions/homepage-connect-functions.php

@@ -3,6 +3,12 @@
 function homepageConnect($array)
 {
 	switch ($array['data']['action']) {
+		case 'getSonarrQueue':
+			return (qualifyRequest($GLOBALS['homepageSonarrQueueAuth'])) ? sonarrConnectQueue() : false;
+			break;
+		case 'getRadarrQueue':
+			return (qualifyRequest($GLOBALS['homepageRadarrQueueAuth'])) ? radarrConnectQueue() : false;
+			break;
 		case 'getPlexStreams':
 			return (qualifyRequest($GLOBALS['homepagePlexStreamsAuth'])) ? plexConnect('streams') : false;
 			break;
@@ -1238,7 +1244,84 @@ function delugeConnect()
 	$api['content'] = isset($api['content']) ? $api['content'] : false;
 	return $api;
 }
-
+function sonarrConnectQueue()
+{
+	$sonarrQueueItems = array();
+	if ($GLOBALS['homepageSonarrEnabled'] && qualifyRequest($GLOBALS['homepageSonarrAuth']) && !empty($GLOBALS['sonarrURL']) && !empty($GLOBALS['sonarrToken'])) {
+		$sonarrs = array();
+		$sonarrURLList = explode(',', $GLOBALS['sonarrURL']);
+		$sonarrTokenList = explode(',', $GLOBALS['sonarrToken']);
+		if (count($sonarrURLList) == count($sonarrTokenList)) {
+			foreach ($sonarrURLList as $key => $value) {
+				$sonarrs[$key] = array(
+					'url' => $value,
+					'token' => $sonarrTokenList[$key]
+				);
+			}
+			foreach ($sonarrs as $key => $value) {
+				try {
+					$sonarr = new Kryptonit3\Sonarr\Sonarr($value['url'], $value['token']);
+					$sonarr = $sonarr->getQueue();
+					$downloadList = json_decode($sonarr, true);
+					if (is_array($downloadList) || is_object($downloadList)) {
+						$sonarrQueue = (array_key_exists('error', $downloadList)) ? '' : $downloadList;
+					} else {
+						$sonarrQueue = '';
+					}
+					if (!empty($sonarrQueue)) {
+						$sonarrQueueItems = array_merge($sonarrQueueItems, $sonarrQueue);
+					}
+				} catch (Exception $e) {
+					writeLog('error', 'Sonarr Connect Function - Error: ' . $e->getMessage(), 'SYSTEM');
+				}
+			}
+			$api['content']['queueItems'] = $sonarrQueueItems;
+			$api['content']['historyItems'] = false;
+			$api['content'] = isset($api['content']) ? $api['content'] : false;
+			return $api;
+		}
+	}
+	return false;
+}
+function radarrConnectQueue()
+{
+	$radarrQueueItems = array();
+	if ($GLOBALS['homepageRadarrEnabled'] && qualifyRequest($GLOBALS['homepageRadarrAuth']) && !empty($GLOBALS['radarrURL']) && !empty($GLOBALS['radarrToken'])) {
+		$radarrs = array();
+		$radarrURLList = explode(',', $GLOBALS['radarrURL']);
+		$radarrTokenList = explode(',', $GLOBALS['radarrToken']);
+		if (count($radarrURLList) == count($radarrTokenList)) {
+			foreach ($radarrURLList as $key => $value) {
+				$radarrs[$key] = array(
+					'url' => $value,
+					'token' => $radarrTokenList[$key]
+				);
+			}
+			foreach ($radarrs as $key => $value) {
+				try {
+					$radarr = new Kryptonit3\Sonarr\Sonarr($value['url'], $value['token']);
+					$radarr = $radarr->getQueue();
+					$downloadList = json_decode($radarr, true);
+					if (is_array($downloadList) || is_object($downloadList)) {
+						$radarrQueue = (array_key_exists('error', $downloadList)) ? '' : $downloadList;
+					} else {
+						$radarrQueue = '';
+					}
+					if (!empty($radarrQueue)) {
+						$radarrQueueItems = array_merge($radarrQueueItems, $radarrQueue);
+					}
+				} catch (Exception $e) {
+					writeLog('error', 'Radarr Connect Function - Error: ' . $e->getMessage(), 'SYSTEM');
+				}
+			}
+			$api['content']['queueItems'] = $radarrQueueItems;
+			$api['content']['historyItems'] = false;
+			$api['content'] = isset($api['content']) ? $api['content'] : false;
+			return $api;
+		}
+	}
+	return false;
+}
 function getCalendar()
 {
 	$startDate = date('Y-m-d', strtotime("-" . $GLOBALS['calendarStart'] . " days"));

+ 130 - 3
api/functions/homepage-functions.php

@@ -2,7 +2,7 @@
 //homepage order
 function homepageOrder()
 {
-	$homepageOrder = array(
+	/*$homepageOrder = array(
 		"homepageOrdercustomhtml" => $GLOBALS['homepageOrdercustomhtml'],
 		"homepageOrdercustomhtmlTwo" => $GLOBALS['homepageOrdercustomhtmlTwo'],
 		"homepageOrdernzbget" => $GLOBALS['homepageOrdernzbget'],
@@ -32,6 +32,16 @@ function homepageOrder()
 	);
 	asort($homepageOrder);
 	return $homepageOrder;
+=======
+		"homepageOrderSonarrQueue" => $GLOBALS['homepageOrderSonarrQueue'],
+		"homepageOrderRadarrQueue" => $GLOBALS['homepageOrderRadarrQueue'],
+	);*/
+	$hpOrderSearch = 'homepageOrder';
+	$homepageItems =  array_filter($GLOBALS, function ($k) use ($hpOrderSearch) {
+		return strpos($k, $hpOrderSearch) !== false;
+	}, ARRAY_FILTER_USE_KEY);
+	asort($homepageItems);
+	return $homepageItems;
 }
 
 function buildHomepage()
@@ -420,6 +430,53 @@ function buildHomepageItem($homepageItem)
 				// End Octoprint
 				</script>
 				';
+      }
+		case 'homepageOrderSonarrQueue':
+			if ($GLOBALS['homepageSonarrQueueEnabled'] && qualifyRequest($GLOBALS['homepageSonarrQueueAuth'])) {
+				if ($GLOBALS['homepageSonarrQueueCombine']) {
+					$item .= '
+					<script>
+					// Sonarr Queue
+					buildDownloaderCombined(\'sonarr\');
+					homepageDownloader("sonarr", "' . $GLOBALS['homepageSonarrQueueRefresh'] . '");
+					// End Sonarr Queue
+					</script>
+					';
+				} else {
+					$item .= '<div class="white-box"><h2 class="text-center" lang="en">Loading Download Queue...</h2></div>';
+					$item .= '
+					<script>
+					// Sonarr Queue
+					$("#' . $homepageItem . '").html(buildDownloader("sonarr"));
+					homepageDownloader("sonarr", "' . $GLOBALS['homepageSonarrQueueRefresh'] . '");
+					// End Sonarr Queue
+					</script>
+					';
+				}
+			}
+			break;
+		case 'homepageOrderRadarrQueue':
+			if ($GLOBALS['homepageRadarrQueueEnabled'] && qualifyRequest($GLOBALS['homepageRadarrQueueAuth'])) {
+				if ($GLOBALS['homepageRadarrQueueCombine']) {
+					$item .= '
+					<script>
+					// Radarr Queue
+					buildDownloaderCombined(\'radarr\');
+					homepageDownloader("radarr", "' . $GLOBALS['homepageRadarrQueueRefresh'] . '");
+					// End Radarr Queue
+					</script>
+					';
+				} else {
+					$item .= '<div class="white-box"><h2 class="text-center" lang="en">Loading Download Queue...</h2></div>';
+					$item .= '
+					<script>
+					// Radarr Queue
+					$("#' . $homepageItem . '").html(buildDownloader("radarr"));
+					homepageDownloader("radarr", "' . $GLOBALS['homepageRadarrQueueRefresh'] . '");
+					// End Radarr Queue
+					</script>
+					';
+				}
 			}
 			break;
 		default:
@@ -1787,7 +1844,35 @@ function getHomepageList()
 						'value' => $GLOBALS['sonarrToken']
 					)
 				),
-				'Misc Options' => array(
+				'Queue' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageSonarrQueueEnabled',
+						'label' => 'Enable',
+						'value' => $GLOBALS['homepageSonarrQueueEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageSonarrQueueAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $GLOBALS['homepageSonarrQueueAuth'],
+						'options' => $groups
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageSonarrQueueCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $GLOBALS['homepageSonarrQueueCombine']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageSonarrQueueRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $GLOBALS['homepageSonarrQueueRefresh'],
+						'options' => optionTime()
+					),
+				),
+				'Calendar' => array(
 					array(
 						'type' => 'number',
 						'name' => 'calendarStart',
@@ -2001,7 +2086,35 @@ function getHomepageList()
 						'value' => $GLOBALS['radarrToken']
 					)
 				),
-				'Misc Options' => array(
+				'Queue' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageRadarrQueueEnabled',
+						'label' => 'Enable',
+						'value' => $GLOBALS['homepageRadarrQueueEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageRadarrQueueAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $GLOBALS['homepageRadarrQueueAuth'],
+						'options' => $groups
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageRadarrQueueCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $GLOBALS['homepageRadarrQueueCombine']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageRadarrQueueRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $GLOBALS['homepageRadarrQueueRefresh'],
+						'options' => optionTime()
+					),
+				),
+				'Calendar' => array(
 					array(
 						'type' => 'number',
 						'name' => 'calendarStart',
@@ -3235,6 +3348,20 @@ function buildHomepageSettings()
 				$class = 'bg-success';
 				$image = 'plugins/images/tabs/octoprint.png';
 				if (!$GLOBALS['homepageOctoprintEnabled']) {
+          	$class .= ' faded';
+				}
+        break;
+			case 'homepageOrderSonarrQueue':
+				$class = 'bg-sonarr';
+				$image = 'plugins/images/tabs/sonarr.png';
+				if (!$GLOBALS['homepageSonarrQueueEnabled']) {
+					$class .= ' faded';
+				}
+				break;
+			case 'homepageOrderRadarrQueue':
+				$class = 'bg-radarr';
+				$image = 'plugins/images/tabs/radarr.png';
+				if (!$GLOBALS['homepageRadarrQueueEnabled']) {
 					$class .= ' faded';
 				}
 				break;

+ 4 - 0
api/functions/organizr-functions.php

@@ -15,6 +15,7 @@ function checkPlexAdminFilled()
 function organizrSpecialSettings()
 {
 	$refreshSearch = "Refresh";
+	$homepageOrderSearch = "homepageOrder";
 	$tautulliSearch = "tautulli_token";
 	$tautulli = array_filter($_COOKIE, function ($k) use ($tautulliSearch) {
 		return stripos($k, $tautulliSearch) !== false;
@@ -24,6 +25,9 @@ function organizrSpecialSettings()
 			'refresh' => array_filter($GLOBALS, function ($k) use ($refreshSearch) {
 				return stripos($k, $refreshSearch) !== false;
 			}, ARRAY_FILTER_USE_KEY),
+			'order' => array_filter($GLOBALS, function ($k) use ($homepageOrderSearch) {
+				return strpos($k, $homepageOrderSearch) !== false;
+			}, ARRAY_FILTER_USE_KEY),
 			'search' => array(
 				'enabled' => (qualifyRequest($GLOBALS['mediaSearchAuth']) && $GLOBALS['mediaSearch'] == true && $GLOBALS['plexToken']) ? true : false,
 				'type' => $GLOBALS['mediaSearchType'],

+ 8 - 0
css/organizr.css

@@ -643,6 +643,14 @@ input#inviteCodeInput {
 .bg-org-alt {
     background: #2d2c2c;
 }
+.bg-sonarr {
+    background: #35c5f2;
+}
+
+.bg-radarr {
+    background: #8f7128;
+}
+
 .bg-plex {
     background: #E5A00D;
 }

File diff suppressed because it is too large
+ 0 - 0
css/organizr.min.css


+ 85 - 5
js/functions.js

@@ -1998,8 +1998,8 @@ function buildCategoryEditor(){
 		console.error("Organizr Function: API Connection Failed");
 	});
 }
-function settingsAPI(post, callbacks=null){
-	organizrAPI('POST',post.api,post).success(function(data) {
+function settingsAPI(post, callbacks=null, asyncValue=true){
+	organizrAPI('POST',post.api,post,asyncValue).success(function(data) {
         try {
             var response = JSON.parse(data);
         }catch(e) {
@@ -2007,7 +2007,6 @@ function settingsAPI(post, callbacks=null){
             orgErrorAlert('<h4>' + e + '</h4>' + formatDebug(data));
             return false;
         }
-		//console.log(response);
 		message(post.messageTitle,post.messageBody,activeInfo.settings.notifications.position,"#FFF","success","5000");
 		if(callbacks){ callbacks.fire(); }
 	}).fail(function(xhr) {
@@ -3152,6 +3151,11 @@ function submitHomepageOrder(){
 	}
 }
 function submitTabOrder(newTabs){
+	$.each(newTabs.tab, function(i,v) {
+		if(v.originalOrder == v.order){
+			delete newTabs.tab[i];
+		}
+	})
 	var post = {
 		action:'changeOrder',
 		api:'api/?v1/settings/tab/editor/tabs',
@@ -3162,7 +3166,7 @@ function submitTabOrder(newTabs){
 	};
 	var callbacks = $.Callbacks();
     callbacks.add( buildTabEditor );
-	settingsAPI(post,callbacks);
+	settingsAPI(post,callbacks, false);
 	$('.saveTabOrderButton').addClass('hidden');
 }
 function submitCategoryOrder(){
@@ -3670,7 +3674,7 @@ function updateNow(){
 		console.error("Organizr Function: API Connection Failed");
 	});
 }
-function organizrAPI(type,path,data=null){
+function organizrAPI(type,path,data=null,asyncValue=true){
 	var timeout = 10000;
     switch(path){
         case 'api/?v1/windows/update':
@@ -3701,6 +3705,7 @@ function organizrAPI(type,path,data=null){
 			return $.ajax({
 				url:path,
 				method:"POST",
+				async: asyncValue,
 				beforeSend: function(request) {
 					request.setRequestHeader("Token", activeInfo.token);
                     request.setRequestHeader("formKey", local('g','formKey'));
@@ -5420,6 +5425,66 @@ function buildDownloaderItem(array, source, type='none'){
                 `;
             });
             break;
+		case 'sonarr':
+			if(array.content === false){
+				queue = '<tr><td class="max-texts" lang="en">Connection Error to ' + source + '</td></tr>';
+				break;
+			}
+			if(array.content.queueItems == 0){
+				queue = '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
+			}
+			$.each(array.content.queueItems, function(i,v) {
+				count = count + 1;
+				var percent = Math.floor(((v.size - v.sizeleft) / v.size) * 100);
+				percent = (isNaN(percent)) ? '0' : percent;
+				var size = v.size != -1 ? humanFileSize(v.size,false) : "?";
+				v.name = v.series.title;
+				queue += `
+                <tr>
+                    <td class="">`+v.name+`</td>
+                    <td class="">S`+pad(v.episode.seasonNumber,2)+`E`+pad(v.episode.episodeNumber,2)+`</td>
+                    <td class="max-texts">`+v.episode.title+`</td>
+                    <td class="hidden-xs sonarr-`+cleanClass(v.status)+`">`+v.status+`</td>
+                    <td class="hidden-xs">`+size+`</td>
+                    <td class="hidden-xs"><span class="label label-info">`+v.protocol+`</span></td>
+                    <td class="text-right">
+                        <div class="progress progress-lg m-b-0">
+                            <div class="progress-bar progress-bar-info" style="width: `+percent+`%;" role="progressbar">`+percent+`%</div>
+                        </div>
+                    </td>
+                </tr>
+                `;
+			});
+			break;
+		case 'radarr':
+			if(array.content === false){
+				queue = '<tr><td class="max-texts" lang="en">Connection Error to ' + source + '</td></tr>';
+				break;
+			}
+			if(array.content.queueItems == 0){
+				queue = '<tr><td class="max-texts" lang="en">Nothing in queue</td></tr>';
+			}
+			$.each(array.content.queueItems, function(i,v) {
+				count = count + 1;
+				var percent = Math.floor(((v.size - v.sizeleft) / v.size) * 100);
+				percent = (isNaN(percent)) ? '0' : percent;
+				var size = v.size != -1 ? humanFileSize(v.size,false) : "?";
+				v.name = v.movie.title;
+				queue += `
+                <tr>
+                    <td class="max-texts">`+v.name+`</td>
+                    <td class="hidden-xs sonarr-`+cleanClass(v.status)+`">`+v.status+`</td>
+                    <td class="hidden-xs">`+size+`</td>
+                    <td class="hidden-xs"><span class="label label-info">`+v.protocol+`</span></td>
+                    <td class="text-right">
+                        <div class="progress progress-lg m-b-0">
+                            <div class="progress-bar progress-bar-info" style="width: `+percent+`%;" role="progressbar">`+percent+`%</div>
+                        </div>
+                    </td>
+                </tr>
+                `;
+			});
+			break;
 		case 'qBittorrent':
 		    if(array.content === false){
                 queue = '<tr><td class="max-texts" lang="en">Connection Error to ' + source + '</td></tr>';
@@ -5540,6 +5605,8 @@ function buildDownloader(source){
         case 'qBittorrent':
         case 'deluge':
         case 'rTorrent':
+	    case 'sonarr':
+	    case 'radarr':
             var queue = true;
             var history = false;
             queueButton = 'REFRESH';
@@ -5640,6 +5707,8 @@ function buildDownloaderCombined(source){
         case 'qBittorrent':
         case 'deluge':
         case 'rTorrent':
+	    case 'sonarr':
+	    case 'radarr':
             var queue = true;
             var history = false;
             queueButton = 'REFRESH';
@@ -6295,6 +6364,12 @@ function homepageDownloader(type, timeout){
 		case 'transmission':
 			var action = 'getTransmission';
 			break;
+		case 'sonarr':
+			var action = 'getSonarrQueue';
+			break;
+		case 'radarr':
+			var action = 'getRadarrQueue';
+			break;
 		case 'qBittorrent':
 			var action = 'getqBittorrent';
 			break;
@@ -8029,6 +8104,11 @@ function octoprintPluralize(s, n) {
 	}
 	return s
 }
+function pad(n, width, z) {
+	z = z || '0';
+	n = n + '';
+	return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
+}
 // Thanks Swifty!
 function PopupCenter(url, title, w, h) {
     // Fixes dual-screen position                         Most browsers      Firefox

Some files were not shown because too many files changed in this diff