Explorar o código

More Ombi Integration

causefx %!s(int64=8) %!d(string=hai) anos
pai
achega
035ed8f195
Modificáronse 6 ficheiros con 556 adicións e 119 borrados
  1. 8 0
      ajax.php
  2. 7 0
      config/configDefaults.php
  3. 254 7
      functions.php
  4. 196 92
      homepage.php
  5. 7 3
      lang/en.ini
  6. 84 17
      settings.php

+ 8 - 0
ajax.php

@@ -64,6 +64,11 @@ switch ($_SERVER['REQUEST_METHOD']) {
 				echo getPlexStreams(12, PLEXSHOWNAMES, $GLOBALS['USER']->role);
 				die();
 				break;
+			case 'ombi-requests':
+				qualifyUser(PLEXHOMEAUTH, true);
+				echo buildOmbiList($GLOBALS['USER']->role, $GLOBALS['USER']->username);
+				die();
+				break;
 			case 'emby-recent':
 				qualifyUser(EMBYHOMEAUTH, true);
 				echo getEmbyRecent(array("Movie" => EMBYRECENTMOVIE, "Episode" => EMBYRECENTTV, "MusicAlbum" => EMBYRECENTMUSIC, "Series" => EMBYRECENTTV));
@@ -123,6 +128,9 @@ switch ($_SERVER['REQUEST_METHOD']) {
             default: // Stuff that you need admin for
                 qualifyUser('admin', true);
                 switch ($action) {
+					case 'ombi-action':
+                        sendResult(ombiAction($_POST['id'], $_POST['action_type'], $_POST['type']), "search", "OMBI ", "action completed successfully", "an error occured");
+                        break;
 					case 'get-emails':
 						$response = printEmails(getEmails($_POST['type']));
 						break;

+ 7 - 0
config/configDefaults.php

@@ -112,4 +112,11 @@ return array(
 	"weather" => "false",
 	"weatherAuth" => "false",
 	"speedtestAuth" => "false",
+	"recentRefresh" => "600000",
+	"requestRefresh" => "600000",
+	"nowPlayingRefresh" => "15000",
+	"embyRecentMovieAuth" => "false",
+	"embyRecentTVAuth" => "false",
+	"embyRecentMusicAuth" => "false",
+	"embyPlayingNowAuth" => "false",
 );

+ 254 - 7
functions.php

@@ -351,7 +351,7 @@ if (function_exists('curl_version')) :
 			case 'application/json':
 				curl_setopt($curlReq, CURLOPT_POSTFIELDS, json_encode($data));
 				break;
-			case 'application/x-www-form-urlencoded';
+			case 'application/x-www-form-urlencoded':
 				curl_setopt($curlReq, CURLOPT_POSTFIELDS, http_build_query($data));
 				break;
 			default:
@@ -694,7 +694,7 @@ function resolveEmbyItem($address, $token, $item, $nowPlaying = false, $showName
     	//prettyPrint($itemDetails);
     	return '<div class="col-sm-6 col-md-3"><div class="thumbnail ultra-widget"><div style="display: none;" np="'.$id.'" class="overlay content-box small-box gray-bg">'.$streamInfo.'</div><span class="refreshNP w-refresh w-p-icon gray" link="'.$id.'"><span class="fa-stack fa-lg" style="font-size: .5em"><i class="fa fa-square fa-stack-2x"></i><i class="fa fa-info-circle fa-stack-1x fa-inverse"></i></span></span><a href="'.$URL.'" target="_blank"><img style="width: 100%; display:inherit;" src="'.$image_url.'" alt="'.$itemDetails['Name'].'" original-image="'.$original_image_url.'" class="refreshImageSource"></a><div class="progress progress-bar-sm zero-m"><div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="'.$watched.'" aria-valuemin="0" aria-valuemax="100" style="width: '.$watched.'%"></div><div class="progress-bar palette-Grey-500 bg" style="width: 0%"></div></div><div class="caption"><i style="float:left" class="fa fa-'.$state.'"></i>'.$topTitle.''.$bottomTitle.'</div></div></div>';
     }else{
-		 return '<div class="item-'.$itemDetails['Type'].'"><div class="ultra-widget refreshImage"><span class="w-refresh w-p-icon gray"><span class="fa-stack fa-lg" style="font-size: .4em"><i class="fa fa-square fa-stack-2x"></i><i class="fa fa-refresh fa-stack-1x fa-inverse"></i></span></span></div><a href="'.$URL.'" target="_blank"><img alt="'.$itemDetails['Name'].'" class="'.$image.' refreshImageSource" data-lazy="'.$image_url.'" original-image="'.$original_image_url.'"></a><small style="margin-right: 13px" class="elip">'.$title.'</small></div>';
+		 return '<div class="item-'.$itemDetails['Type'].'"><div class="ultra-widget refreshImage"><span class="w-refresh w-p-icon gray"><span class="fa-stack fa-lg" style="font-size: .4em"><i class="fa fa-square fa-stack-2x"></i><i class="fa fa-refresh fa-stack-1x fa-inverse"></i></span></span></div><a href="'.$URL.'" target="_blank"><img alt="'.$itemDetails['Name'].'" class="'.$image.' refreshImageSource" data-lazy="'.$image_url.'" original-image="'.$original_image_url.'"></a><small class="elip slick-bottom-title">'.$title.'</small></div>';
 	}
 }
 
@@ -902,7 +902,7 @@ function resolvePlexItem($server, $token, $item, $nowPlaying = false, $showNames
     if($nowPlaying){
         return '<div class="col-sm-6 col-md-3"><div class="thumbnail ultra-widget"><div style="display: none;" np="'.$id.'" class="overlay content-box small-box gray-bg">'.$streamInfo.'</div><span class="refreshNP w-refresh w-p-icon gray" link="'.$id.'"><span class="fa-stack fa-lg" style="font-size: .5em"><i class="fa fa-square fa-stack-2x"></i><i class="fa fa-info-circle fa-stack-1x fa-inverse"></i></span></span><div class="ultra-widget refreshImage"><span class="w-refresh w-p-icon gray"><span class="fa-stack fa-lg" style="font-size: .4em"><i class="fa fa-square fa-stack-2x"></i><i class="fa fa-refresh fa-stack-1x fa-inverse"></i></span></span></div><a class="openTab" extraTitle="'.$title.'" extraType="'.$item['type'].'" openTab="'.$openTab.'" href="'.$address.'" target="_blank"><img class="refreshImageSource" style="width: '.$widthOverride.'%; display:block;" src="'.$image_url.'" original-image="'.$original_image_url.'" alt="'.$item['Name'].'"></a><div class="progress progress-bar-sm zero-m"><div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="'.$watched.'" aria-valuemin="0" aria-valuemax="100" style="width: '.$watched.'%"></div><div class="progress-bar palette-Grey-500 bg" style="width: '.$transcoded.'%"></div></div><div class="caption"><i style="float:left" class="fa fa-'.$state.'"></i>'.$topTitle.''.$bottomTitle.'</div></div></div>';
     }else{
-        return '<div class="item-'.$item['type'].$playlist.'"><div style="" class="ultra-widget refreshImage"><span class="w-refresh w-p-icon gray"><span class="fa-stack fa-lg" style="font-size: .4em"><i class="fa fa-square fa-stack-2x"></i><i class="fa fa-refresh fa-stack-1x fa-inverse"></i></span></span></div><a class="openTab" extraTitle="'.$title.'" extraType="'.$item['type'].'" openTab="'.$openTab.'" href="'.$address.'" target="_blank"><img alt="'.$item['Name'].'" class="'.$image.' refreshImageSource" data-lazy="'.$image_url.'" original-image="'.$original_image_url.'"></a><small style="margin-right: 13px" class="elip">'.$title.'</small></div>';
+        return '<div class="item-'.$item['type'].$playlist.'"><div style="" class="ultra-widget refreshImage"><span class="w-refresh w-p-icon gray"><span class="fa-stack fa-lg" style="font-size: .4em"><i class="fa fa-square fa-stack-2x"></i><i class="fa fa-refresh fa-stack-1x fa-inverse"></i></span></span></div><a class="openTab" extraTitle="'.$title.'" extraType="'.$item['type'].'" openTab="'.$openTab.'" href="'.$address.'" target="_blank"><img alt="'.$item['Name'].'" class="'.$image.' refreshImageSource" data-lazy="'.$image_url.'" original-image="'.$original_image_url.'"></a><small class="elip slick-bottom-title">'.$title.'</small></div>';
     }
 }
 //$hideMenu .= '<li data-filter="playlist-'.$className.'" data-name="'.$api['title'].'"><a class="js-filter-'.$className.'" href="javascript:void(0)">'.$api['title'].'</a></li>';
@@ -963,7 +963,7 @@ function getEmbyStreams($size, $showNames, $role) {
 				$('#'+loadedID).replaceWith(element);
 				console.log('Loaded updated: '+loadedID);
 			});
-		}, 15000);
+		}, ".NOWPLAYINGREFRESH.");
 	");
 }
 
@@ -996,7 +996,7 @@ function getPlexStreams($size, $showNames, $role){
 						$('#'+loadedID).replaceWith(element);
 						console.log('Loaded updated: '+loadedID);
 					});
-				}, 15000);
+				}, ".NOWPLAYINGREFRESH.");
 			");
 		}else{
 			writeLog("error", "PLEX STREAM ERROR: could not connect - check token - if HTTPS, is cert valid");
@@ -1062,7 +1062,7 @@ function getEmbyRecent($array) {
 			loadSlick();
 		});
 
-	}, 600000);
+	}, ".RECENTREFRESH.");
 	", $array);
 }
 
@@ -1101,7 +1101,7 @@ function getPlexRecent($array){
 					loadSlick();
 				});
 
-			}, 600000);
+			}, ".RECENTREFRESH.");
 			", $array);
 		}else{
 			writeLog("error", "PLEX RECENT-ITEMS ERROR: could not connect - check token - if HTTPS, is cert valid");
@@ -4722,6 +4722,253 @@ function getOmbiToken($username, $password){
     return json_decode($api['content'], true)['access_token'];
 }
 
+function ombiAction($id, $action, $type){
+	$headers = array(
+		"Accept" => "application/json",
+		"Content-Type" => "application/json",
+		"Apikey" => OMBIKEY
+	);
+	switch ($type) {
+		case 'season':
+		case 'tv':
+			$type = 'tv';
+			break;
+		default:
+			$type = 'movie';
+			break;
+	}
+	switch ($action) {
+		case 'approve':
+			# code...
+			break;
+		case 'deny':
+			# code...
+			break;
+		case 'delete':
+			$api = curl_delete(OMBIURL."/api/v1/Request/".$type."/".$id, $headers);
+			break;
+		default:
+			# code...
+			break;
+	}
+	switch ($api['http_code']['http_code']){
+		case 401:
+			writeLog("error", "OMBI: Invalid API KEY");
+			return false;
+			break;
+		case 200:
+			writeLog("success", "OMBI: action completed successfully");
+			return true;
+			break;
+		default:
+			writeLog("error", "OMBI: unknown error with request [type: $type | action: $action | id: $id]");
+			return false;
+	}
+    //return (!empty($result) ? $result : null );
+}
+
+function getOmbiRequests($type = "both"){
+	$headers = array(
+		"Accept" => "application/json",
+		"Apikey" => OMBIKEY,
+	);
+	$requests = array();
+	switch ($type) {
+		case 'movie':
+			$movie = json_decode(curl_get(OMBIURL."/api/v1/Request/movie", $headers), true);
+			break;
+		case 'tv':
+			$tv = json_decode(curl_get(OMBIURL."/api/v1/Request/tv", $headers), true);
+			break;
+
+		default:
+			$movie = json_decode(curl_get(OMBIURL."/api/v1/Request/movie", $headers), true);
+			$tv = json_decode(curl_get(OMBIURL."/api/v1/Request/tv", $headers), true);
+			break;
+	}
+	if(isset($movie)){
+		foreach ($movie as $key => $value) {
+			$requests['movie'][] = array(
+				'id' => $value['theMovieDbId'],
+				'title' => $value['title'],
+				'poster' => (strpos($value['posterPath'], "/") !== false) ? $value['posterPath'] : 'https://image.tmdb.org/t/p/w300/'.$value['posterPath'],
+				'approved' => $value['approved'],
+				'available' => $value['available'],
+				'denied' => $value['denied'],
+				'deniedReason' => $value['deniedReason'],
+				'user' => $value['requestedUser']['userName'],
+				'request_id' => $value['id'],
+			);
+		}
+	}
+	if(isset($tv) && (is_array($tv) || is_object($tv))){
+		foreach ($tv as $key => $value) {
+			$requests['tv'][] = array(
+				'id' => $value['tvDbId'],
+				'title' => $value['title'],
+				'poster' => $value['posterPath'],
+				'approved' => $value['childRequests'][0]['approved'],
+				'available' => $key['childRequests'][0]['available'],
+				'denied' => $key['childRequests'][0]['denied'],
+				'deniedReason' => $key['childRequests'][0]['deniedReason'],
+				'user' => $value['childRequests'][0]['requestedUser']['userName'],
+				'request_id' => $value['id'],
+			);
+		}
+	}
+    return $requests;
+}
+
+function convertOmbiString($type, $value){
+	switch ($type) {
+		case 'approved':
+			$string['string'] = ($value) ? 'Approved' : 'Approval-Pending';
+			$string['icon'] = ($value) ? 'mdi mdi-check' : 'mdi mdi-clock';
+			$string['color'] = ($value) ? 'green-bg' : 'yellow-bg';
+			break;
+		case 'available':
+			$string['string'] = ($value) ? 'Available' : 'Not Downloaded';
+			$string['icon'] = ($value) ? 'mdi mdi-server' : 'mdi mdi-server-off';
+			$string['color'] = ($value) ? 'green-bg' : 'red-bg';
+			break;
+		case 'denied':
+			$string['string'] = ($value) ? 'Denied' : 'Approved';
+			$string['icon'] = ($value) ? 'mdi mdi-emoticon-sad' : 'mdi mdi-emoticon-happy';
+			$string['color'] = ($value) ? 'red-bg' : 'green-bg';
+			break;
+		case 'status':
+			switch ($value) {
+				case '1':
+					$string['string'] = 'Denied';
+					$string['icon'] = 'mdi mdi-window-close';
+					$string['color'] = 'red-bg';
+					break;
+				case '2':
+					$string['string'] = 'Approved';
+					$string['icon'] = 'mdi mdi-check';
+					$string['color'] = 'green-bg';
+					break;
+				case '3':
+					$string['string'] = 'Not Approved';
+					$string['icon'] = 'mdi mdi-clock';
+					$string['color'] = 'yellow-bg';
+					break;
+
+				default:
+					# code...
+					break;
+			}
+			break;
+		default:
+			$string['string'] = ($value) ? 'Approved' : 'Approval-Pending';
+			$string['color'] = ($value) ? 'green-bg' : 'red-bg';
+			break;
+	}
+	return $string;
+}
+function buildOmbiItem($type, $group, $user, $request){
+	if (is_array($request) || is_object($request)){
+		$actions = '';
+		if($request['denied']){
+			$status = 1;
+			$actions .= '<li request-type="'.$type.'" request-id="'.$request['id'].'" request-name="approve"><a class="requestAction" href="javascript:void(0)">Approve - Not Active</a></li>';
+		}else{
+			if($request['approved']){
+				$status = 2;
+			}else{
+				$status = 3;
+				$actions .= '<li request-type="'.$type.'" request-id="'.$request['id'].'" request-name="approve"><a class="requestAction" href="javascript:void(0)">Approve - Not Active</a></li>';
+				$actions .= '<li request-type="'.$type.'" request-id="'.$request['id'].'" request-name="deny"><a class="requestAction" href="javascript:void(0)">Deny - Not Active</a></li>';
+			}
+		}
+		$actions .= '<li request-type="'.$type.'" request-id="'.$request['request_id'].'" request-name="delete"><a class="requestAction" href="javascript:void(0)">Delete</a></li>';
+		if(isset($group) && $group == 'admin'){
+			return '
+			<div class="item-'.$type.'-'.convertOmbiString('approved', $request['approved'])['string'].'">
+				<div class="requestOptions">
+					<div class="btn-group transparent" role="group">
+						<button type="button" class="btn waves btn-success  btn-sm dropdown-toggle waves-effect waves-float transparent" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="mdi mdi-dots-vertical mdi-24px"></i></button>
+						<ul class="dropdown-menu"><h6 class="text-center">'.$request['user'].'</h6>'.$actions.'</ul>
+					</div>
+				</div>
+				<a class="openTab" extraTitle="'.$request['title'].'" extraType="'.$type.'" openTab="true"><img alt="" class="slick-image-tall" data-lazy="'.$request['poster'].'"></a>
+				<div class="requestBottom text-center">
+					<div data-toggle="tooltip" data-placement="top" data-original-title="'.convertOmbiString('status', $status)['string'].'" class="zero-m requestGroup '.convertOmbiString('status', $status)['color'].'">
+						<i class="'.convertOmbiString('status', $status)['icon'].'"></i>
+					</div>
+					<div data-toggle="tooltip" data-placement="top" data-original-title="'.convertOmbiString('available', $request['available'])['string'].'" class="zero-m requestGroup '.convertOmbiString('available', $request['available'])['color'].'">
+						<i class="'.convertOmbiString('available', $request['available'])['icon'].'"></i>
+					</div>
+				</div>
+				<small class="elip slick-bottom-title">'.$request['title'].'</small>
+			</div>';
+		}elseif(isset($group) && $group == 'user'){
+			if(strtolower($request['user']) == strtolower($user)){
+				return '
+				<div class="item-'.$type.'-'.convertOmbiString('approved', $request['approved'])['string'].'">
+					<a class="openTab" extraTitle="'.$request['title'].'" extraType="'.$type.'" openTab="true"><img alt="" class="slick-image-tall" data-lazy="'.$request['poster'].'"></a>
+					<div class="requestBottom text-center">
+						<div data-toggle="tooltip" data-placement="top" data-original-title="'.convertOmbiString('status', $status)['string'].'" class="zero-m requestGroup '.convertOmbiString('status', $status)['color'].'">
+							<i class="'.convertOmbiString('status', $status)['icon'].'"></i>
+						</div>
+						<div data-toggle="tooltip" data-placement="top" data-original-title="'.convertOmbiString('available', $request['available'])['string'].'" class="zero-m requestGroup '.convertOmbiString('available', $request['available'])['color'].'">
+							<i class="'.convertOmbiString('available', $request['available'])['icon'].'"></i>
+						</div>
+					</div>
+					<small class="elip slick-bottom-title">'.$request['title'].'</small>
+				</div>';
+			}
+		}
+	}
+}
+function buildOmbiList($group, $user){
+	$requests = array();
+	$openTab = 'true';
+	foreach (getOmbiRequests('movie')['movie'] as $request) {
+		$requests[] = buildOmbiItem('movie', $group, $user, $request);
+	}
+	foreach (getOmbiRequests('tv')['tv'] as $request) {
+		$requests[] = buildOmbiItem('season', $group, $user, $request);
+	}
+	return outputOmbiRequests("Requested Content", $requests, "
+	setInterval(function() {
+		$('<div></div>').load('ajax.php?a=ombi-requests',function() {
+			var element = $(this).find('[id]');
+			var loadedID = 	element.attr('id');
+			$('#'+loadedID).replaceWith(element);
+			console.log('Loaded updated: '+loadedID);
+			loadSlick();
+		});
+
+	}, ".RECENTREFRESH.");
+	", false);
+}
+
+function outputOmbiRequests($header = "Requested Content", $items, $script = false, $array) {
+    $hideMenu = '<div class="pull-right"><div class="btn-group" role="group"><button type="button" class="btn waves btn-default btn-sm dropdown-toggle waves-effect waves-float" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Filter &nbsp;<span class="caret"></span></button><ul style="right:0; left: auto" class="dropdown-menu filter-request-event">';
+	if(preg_grep("/item-movie-Approved/", $items)){
+        $hideMenu .= '<li data-filter="item-movie-Approved" data-name="Approved Movies" data-filter-on="false"><a class="js-filter-movie" href="javascript:void(0)">Approved Movies</a></li>';
+    }
+	if(preg_grep("/item-movie-Approval-Pending/", $items)){
+        $hideMenu .= '<li data-filter="item-movie-Approval-Pending" data-name="Approval Pending Movies" data-filter-on="false"><a class="js-filter-movie" href="javascript:void(0)">Approval Pending Movies</a></li>';
+    }
+	if(preg_grep("/item-season-Approved/", $items)){
+        $hideMenu .= '<li data-filter="item-season-Approved" data-name="Approved TV Shows" data-filter-on="false"><a class="js-filter-season" href="javascript:void(0)">Approved Shows</a></li>';
+    }
+	if(preg_grep("/item-season-Approval-Pending/", $items)){
+        $hideMenu .= '<li data-filter="item-season-Approval-Pending" data-name="Approval Pending TV Shows" data-filter-on="false"><a class="js-filter-season" href="javascript:void(0)">Approval Pending Shows</a></li>';
+    }
+	$hideMenu .= '<li data-filter="item-all" data-name="Content" data-filter-on="false"><a class="js-filter-all" href="javascript:void(0)">All</a></li>';
+    $hideMenu .= '</ul></div></div>';
+    // If None Populate Empty Item
+    if (!count($items)) {
+        return '<div id="recentRequests" class="content-box box-shadow big-box"><h5 class="text-center">'.$header.'</h5><p class="text-center">No Requests Found</p></div>';
+    }else{
+		$className = str_replace(' ', '', $header);
+        return '<div id="recentRequests" class="content-box box-shadow big-box"><h5 id="requestContent-title" style="margin-bottom: -20px" class="text-center">'.$header.'</h5><div class="recentHeader inbox-pagination '.$className.'">'.$hideMenu.'</div><br/><br/><div class="recentItems-request" data-name="'.$className.'">'.implode('',$items).'</div></div>'.($script?'<script>'.$script.'</script>':'');
+    }
+}
+
 function realSize($bytes, $decimals = 2) {
     $size = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
     $factor = floor((strlen($bytes) - 1) / 3);

+ 196 - 92
homepage.php

@@ -75,6 +75,18 @@ foreach(loadAppearance() as $key => $value) {
         <![endif]-->
         <style>
 			<?php if($USER->role !== "admin"){ echo '.refreshImage { display: none; }';}?>
+			.requestOptions {
+				position: absolute;
+			    top: 5px;
+			    margin-left: 5px;
+				opacity: 1;
+			}
+			.slick-slide:focus {
+			    outline: transparent;
+			}
+			.requestOptions:hover {
+				opacity: 1;
+			}
 			.refreshImage{
 				top: -10px;
 				opacity: 0;
@@ -119,13 +131,55 @@ foreach(loadAppearance() as $key => $value) {
                 margin: 5px 0;
             }
             .slick-image-tall{
-                width: 125px;
-                height: 180px;
+                /*width: 125px;
+                height: 180px;*/
+				width: 100%;
+				height: 200px;
+				padding: 0 2px;
             }
+			.slick-bottom-title {
+				width: 100%;
+				padding: 0 2px;
+			}
+			.requestBottom {
+				width: 100%;
+				padding: 0 2px;
+			    display: inline-flex;
+
+			}
+			.requestLast {
+				border-radius: 0 0 5px 5px;
+			    border-top: 1px solid;
+			}
+			.transparent {
+				background: transparent !important;
+				-webkit-box-shadow: none;
+    			box-shadow: none;
+			}
+			.requestGroup {
+				width: 50%;
+				vertical-align: top !important;
+				margin: 0 0px !important;
+				display: inline-block;
+			}
+			i.mdi.mdi-dots-vertical.mdi-24px {
+			    -webkit-filter: drop-shadow(1px 2px 3px black);
+			    filter: drop-shadow(1px 2px 3px black);
+			}
+			.requestGroup:first-child {
+				border-radius: 0 0 0 5px;
+			}
+			.requestGroup:last-child {
+				border-radius: 0 0 5px 0;
+			}
             .slick-image-short{
-                width: 125px;
+                /*width: 125px;
                 height: 130px;
-                margin-top: 50px;
+                margin-top: 50px;*/
+				width: 100%;
+				height: 130px;
+				margin-top: 70px;
+				padding: 0 2px;
             }
             .overlay{
                 position: absolute;
@@ -436,6 +490,13 @@ foreach(loadAppearance() as $key => $value) {
 
                 </div>
 				<?php } ?>
+				<?php if (qualifyUser(OMBIAUTH) && OMBIURL) { ?>
+				<div id="ombiRequests" class="row">
+                    <div class="col-lg-12">
+						<?php echo buildOmbiList($USER->role, $USER->username); ?>
+					</div>
+				</div>
+				<?php } ?>
                 <?php if ((SONARRURL != "" && qualifyUser(SONARRHOMEAUTH)) || (RADARRURL != "" && qualifyUser(RADARRHOMEAUTH)) || (HEADPHONESURL != "" && qualifyUser(HEADPHONESHOMEAUTH)) || (SICKRAGEURL != "" && qualifyUser(SICKRAGEHOMEAUTH)) || (COUCHURL != "" && qualifyUser(COUCHHOMEAUTH))) { ?>
                 <div id="calendarLegendRow" class="row" style="padding: 0 0 10px 0;">
                     <div class="col-lg-12 content-form form-inline">
@@ -543,13 +604,18 @@ foreach(loadAppearance() as $key => $value) {
                             complete: function(xhr, status) {
                                 var result = $.parseJSON(xhr.responseText);
                                 if (xhr.statusText === "OK") {
+									if(typeof location !== 'undefined'){
+										$('#calendarTrailer').html(convertTrailer(result.videos)+'&nbsp;<span class="label openPlex palette-Amber-600 bg" openTab="'+openTab+'" location="'+location+'" style="width:100%;display:block;cursor:pointer;"><i style="vertical-align:sub;" class="fa fa-play white"></i><text style="vertical-align:sub;"> Watch Now on PLEX</text></span>');
+									}else{
+										$('#calendarTrailer').html(convertTrailer(result.videos));
+									}
                                     if( Type === "movie"){
                                         $('#calendarTitle').html(result.title);
                                         $('#calendarRating').html('<span class="label label-gray"><i class="fa fa-thumbs-up white"></i> '+result.vote_average+'</span>&nbsp;');
                                         $('#calendarRuntime').html('<span class="label label-gray"><i class="fa fa-clock-o white"></i> '+convertTime(result.runtime)+'</span>&nbsp;');
                                         $('#calendarSummary').text(result.overview);
                                         $('#calendarTagline').text(result.tagline);
-                                        $('#calendarTrailer').html(convertTrailer(result.videos)+'&nbsp;<span class="label openPlex palette-Amber-600 bg" openTab="'+openTab+'" location="'+location+'" style="width:100%;display:block;cursor:pointer;"><i style="vertical-align:sub;" class="fa fa-play white"></i><text style="vertical-align:sub;"> Watch Now on PLEX</text></span>');
+
                                         $('#calendarCast').html(convertCast(result.credits));
                                         $('#calendarGenres').html(convertArray(result.genres, "MOVIE"));
                                         $('#calendarLang').html(convertArray(result.spoken_languages, "MOVIE"));
@@ -562,7 +628,7 @@ foreach(loadAppearance() as $key => $value) {
                                         $('#calendarRuntime').html('<span class="label label-gray"><i class="fa fa-clock-o white"></i> '+convertTime(whatWasIt(result.episode_run_time))+'</span>&nbsp;');
                                         $('#calendarSummary').text(result.overview);
                                         $('#calendarTagline').text("");
-                                        $('#calendarTrailer').html(convertTrailer(result.videos)+'&nbsp;<span class="label openPlex palette-Amber-600 bg" openTab="'+openTab+'" location="'+location+'" style="width:100%;display:block;cursor:pointer;"><i style="vertical-align:sub;" class="fa fa-play white"></i><text style="vertical-align:sub;"> Watch Now on PLEX</text></span>');
+
                                         $('#calendarCast').html(convertCast(result.credits));
                                         $('#calendarGenres').html(convertArray(result.genres, "MOVIE"));
                                         $('#calendarLang').html(convertArray(result.languages, "TV"));
@@ -623,95 +689,98 @@ foreach(loadAppearance() as $key => $value) {
 
 		function loadSlick(){
 			$('div[class*=recentItems-]').each(function() {
+				var needsSlick = true;
+				var name = $(this).attr("data-name");
 				if($(this).hasClass('slick-initialized')){
-					console.log('skipping slick addon');
-					return false;
+					console.log('skipping slick addon for: '+name);
+					needsSlick = false;
 				}
-                var name = $(this).attr("data-name");
-                console.log('creating slick for '+name);
-                $(this).slick({
-
-                    slidesToShow: 13,
-                    slidesToScroll: 13,
-                    infinite: true,
-                    lazyLoad: 'ondemand',
-                    prevArrow: '<a class="zero-m pull-left prev-mail btn btn-default waves waves-button btn-sm waves-effect waves-float"><i class="fa fa-angle-left"></i></a>',
-                    nextArrow: '<a class="pull-left next-mail btn btn-default waves waves-button btn-sm waves-effect waves-float"><i class="fa fa-angle-right"></i></a>',
-                    appendArrows: $('.'+name),
-                    arrows: true,
-                    responsive: [
-						{
-		                    breakpoint: 1750,
-		                    settings: {
-		                        slidesToShow: 12,
-		                        slidesToScroll: 12,
-		                    }
-	                    },
-	                    {
-		                    breakpoint: 1600,
-		                    settings: {
-		                        slidesToShow: 11,
-		                        slidesToScroll: 11,
-		                    }
-	                    },
-	                    {
-		                    breakpoint: 1450,
-		                    settings: {
-		                        slidesToShow: 10,
-		                        slidesToScroll: 10,
+				if(needsSlick === true){
+	                console.log('creating slick for '+name);
+	                $(this).slick({
+
+	                    slidesToShow: 13,
+	                    slidesToScroll: 13,
+	                    infinite: true,
+	                    lazyLoad: 'ondemand',
+	                    prevArrow: '<a class="zero-m pull-left prev-mail btn btn-default waves waves-button btn-sm waves-effect waves-float"><i class="fa fa-angle-left"></i></a>',
+	                    nextArrow: '<a class="pull-left next-mail btn btn-default waves waves-button btn-sm waves-effect waves-float"><i class="fa fa-angle-right"></i></a>',
+	                    appendArrows: $('.'+name),
+	                    arrows: true,
+	                    responsive: [
+							{
+			                    breakpoint: 1750,
+			                    settings: {
+			                        slidesToShow: 12,
+			                        slidesToScroll: 12,
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 1600,
+			                    settings: {
+			                        slidesToShow: 11,
+			                        slidesToScroll: 11,
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 1450,
+			                    settings: {
+			                        slidesToShow: 10,
+			                        slidesToScroll: 10,
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 1300,
+			                    settings: {
+			                        slidesToShow: 9,
+			                        slidesToScroll: 9,
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 1150,
+			                    settings: {
+			                        slidesToShow: 8,
+			                        slidesToScroll: 8,
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 1000,
+			                    settings: {
+			                        slidesToShow: 7,
+			                        slidesToScroll: 7,
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 850,
+			                    settings: {
+			                        slidesToShow: 6,
+			                        slidesToScroll: 6,
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 700,
+			                    settings: {
+			                        slidesToShow: 5,
+			                        slidesToScroll: 5,
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 675,
+			                    settings: {
+			                        slidesToShow: 4,
+			                        slidesToScroll: 4
+			                    }
+		                    },
+		                    {
+			                    breakpoint: 480,
+			                    settings: {
+			                        slidesToShow: 3,
+			                        slidesToScroll: 3
+			                    }
 		                    }
-	                    },
-	                    {
-		                    breakpoint: 1300,
-		                    settings: {
-		                        slidesToShow: 9,
-		                        slidesToScroll: 9,
-		                    }
-	                    },
-	                    {
-		                    breakpoint: 1150,
-		                    settings: {
-		                        slidesToShow: 8,
-		                        slidesToScroll: 8,
-		                    }
-	                    },
-	                    {
-		                    breakpoint: 1000,
-		                    settings: {
-		                        slidesToShow: 7,
-		                        slidesToScroll: 7,
-		                    }
-	                    },
-	                    {
-		                    breakpoint: 850,
-		                    settings: {
-		                        slidesToShow: 6,
-		                        slidesToScroll: 6,
-		                    }
-	                    },
-	                    {
-		                    breakpoint: 700,
-		                    settings: {
-		                        slidesToShow: 5,
-		                        slidesToScroll: 5,
-		                    }
-	                    },
-	                    {
-		                    breakpoint: 675,
-		                    settings: {
-		                        slidesToShow: 4,
-		                        slidesToScroll: 4
-		                    }
-	                    },
-	                    {
-		                    breakpoint: 480,
-		                    settings: {
-		                        slidesToShow: 3,
-		                        slidesToScroll: 3
-		                    }
-	                    }
-	                ]
-                });
+		                ]
+	                });
+				}
             });
 		}
 
@@ -730,6 +799,25 @@ foreach(loadAppearance() as $key => $value) {
                 }).done(function(data){ $('#resultshere').html(data);});
 
             });
+			$(document).on('click', '.requestAction', function(){
+				var type = $(this).parent().attr('request-type');
+				var action = $(this).parent().attr('request-name');
+				var id = $(this).parent().attr('request-id');
+				console.log('OMBI Action: [type: '+type+' | action: '+action+' | id: '+id+']');
+				ajax_request('POST', 'ombi-action', {
+                    id: id,
+					action_type: action,
+					type: type,
+                }).done(function(data){
+					$('<div></div>').load('ajax.php?a=ombi-requests',function() {
+						var element = $(this).find('[id]');
+						var loadedID = 	element.attr('id');
+						$('#'+loadedID).replaceWith(element);
+						console.log('OMBI ACTION Submited and reloaded: '+loadedID);
+						loadSlick();
+					});
+				});
+			});
             $('.repeat-btn').click(function(){
                 var refreshBox = $(this).closest('div.content-box');
                 $("<div class='refresh-preloader'><div class='la-timer la-dark'><div></div></div></div>").appendTo(refreshBox).fadeIn(300);
@@ -762,6 +850,22 @@ foreach(loadAppearance() as $key => $value) {
                     $('.recentItems-recent')
                         .slick('slickUnfilter')
                 }
+            });
+			//REQUEST ITEMS
+            // each filter we click on
+            $(".filter-request-event > li").on("click", function() {
+                var name = $(this).attr('data-name');
+                var filter = $(this).attr('data-filter');
+                $('#requestContent-title').text('Requested '+name);
+                // now filter the slides.
+                if(filter !== 'item-all'){
+                    $('.recentItems-request')
+                        .slick('slickUnfilter')
+                        .slick('slickFilter' , '.'+filter );
+                }else{
+                    $('.recentItems-request')
+                        .slick('slickUnfilter')
+                }
             });
             //PLAYLIST SHIT
              // each filter we click on

+ 7 - 3
lang/en.ini

@@ -306,8 +306,8 @@ EMAIL_NEWUSER_BUTTON = "Login"
 EMAIL_NEWUSER_SUBTITLE = "What do I do?"
 EMAIL_NEWUSER_SUBMESSAGE = "Now that you have signed up, you can basically do whatever you like.  Enjoy"
 PLAYLISTS = "Playlists"
-DOWNLOAD_REFRESH = "Refresh Download Queue"
-HISTORY_REFRESH = "Refresh History"
+DOWNLOAD_REFRESH = "Download Queue Refresh Rate"
+HISTORY_REFRESH = "History Refresh Rate"
 CHECK_FRAME = "Test Frame"
 GENERATE_API_KEY = "Generate API Key"
 ORGANIZR_API_KEY = "Organizr API Key"
@@ -328,8 +328,12 @@ ENABLE_CHAT = "Enable Chat"
 CHAT_AUTH = "Minimum authentication level to access Chat"
 AUTHBACKENDDOMAINFORMAT = "Advanced Domain to use for LDAP i.e. uid=s,ou=People,dc=example,dc=com"
 TOGGLE_ALL = "Toggle All"
-CALENDAR_REFRESH = "Calendar Refresh"
+CALENDAR_REFRESH = "Calendar Refresh Rate"
 COUCH_URL = "Couchpotato URL"
 COUCH_KEY = "Couchpotato API/Key"
 DELETE_CHAT_DATABASE = "Delete Chat Database"
 INSTALLED_THEME = "Installed Theme"
+PLEX_TAB_URL = "Plex Tab URL - i.e. https://domain.com/plex or https://plex.domain.com"
+RECENT_REFRESH = "Recent Items Refresh Rate"
+NOW_PLAYING_REFRESH = "Now Playing Refresh Rate"
+REQUEST_REFRESH = "Requests Refresh Rate"

+ 84 - 17
settings.php

@@ -913,24 +913,35 @@ echo buildSettings(
 						'value' => PLEXURL,
 					),
 					array(
+						array(
 						'type' => 'text',
 						'placeholder' => randString(20),
 						'labelTranslate' => 'PLEX_TOKEN',
 						'name' => 'plexToken',
 						'pattern' => '[a-zA-Z0-9]{20}',
 						'value' => PLEXTOKEN,
-					),
-                    array(
-						'type' => 'custom',
-						'html' => '<button id="openPlexModal" type="button" class="btn waves btn-labeled btn-success btn-sm text-uppercase waves-effect waves-float"> <span class="btn-label"><i class="fa fa-ticket"></i></span>'.translate("GET_PLEX_TOKEN").'</button>',
+						),
+						array(
+							'type' => 'custom',
+							'html' => '<button id="openPlexModal" type="button" class="btn waves btn-labeled btn-success btn-sm text-uppercase waves-effect waves-float"> <span class="btn-label"><i class="fa fa-ticket"></i></span>'.translate("GET_PLEX_TOKEN").'</button>',
+						),
 					),
      				array(
+						array(
 						'type' => 'text',
 						'placeholder' => "",
 						'labelTranslate' => 'RECENT_ITEMS_LIMIT',
 						'name' => 'plexRecentItems',
 						'pattern' => '[0-9]+',
 						'value' => PLEXRECENTITEMS,
+						),
+						array(
+							'type' => $userSelectType,
+							'labelTranslate' => 'RECENT_REFRESH',
+							'name' => 'recentRefresh',
+							'value' => RECENTREFRESH,
+							'options' => $refreshSeconds,
+						),
 					),
 					array(
 						'type' => 'text',
@@ -967,7 +978,8 @@ echo buildSettings(
 							'labelTranslate' => 'RECENT_MOVIES',
 							'name' => 'plexRecentMovie',
 							'value' => PLEXRECENTMOVIE,
-						),array(
+						),
+						array(
 							'type' => $userSelectType,
 							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
 							'name' => 'plexRecentMovieAuth',
@@ -981,7 +993,8 @@ echo buildSettings(
 							'labelTranslate' => 'RECENT_TV',
 							'name' => 'plexRecentTV',
 							'value' => PLEXRECENTTV,
-						),array(
+						),
+						array(
 							'type' => $userSelectType,
 							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
 							'name' => 'plexRecentTVAuth',
@@ -995,7 +1008,8 @@ echo buildSettings(
 							'labelTranslate' => 'RECENT_MUSIC',
 							'name' => 'plexRecentMusic',
 							'value' => PLEXRECENTMUSIC,
-						),array(
+						),
+						array(
 							'type' => $userSelectType,
 							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
 							'name' => 'plexRecentMusicAuth',
@@ -1009,7 +1023,8 @@ echo buildSettings(
 							'labelTranslate' => 'PLAYLISTS',
 							'name' => 'plexPlaylists',
 							'value' => PLEXPLAYLISTS,
-						),array(
+						),
+						array(
 							'type' => $userSelectType,
 							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
 							'name' => 'plexPlaylistsAuth',
@@ -1023,7 +1038,8 @@ echo buildSettings(
 							'labelTranslate' => 'PLAYING_NOW',
 							'name' => 'plexPlayingNow',
 							'value' => PLEXPLAYINGNOW,
-						),array(
+						),
+						array(
 							'type' => $userSelectType,
 							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
 							'name' => 'plexPlayingNowAuth',
@@ -1070,13 +1086,22 @@ echo buildSettings(
 						'pattern' => '[a-zA-Z0-9]{32}',
 						'value' => EMBYTOKEN,
 					),
-     				array(
-						'type' => 'text',
-						'placeholder' => "",
-						'labelTranslate' => 'RECENT_ITEMS_LIMIT',
-						'name' => 'embyRecentItems',
-						'pattern' => '[0-9]+',
-						'value' => EMBYRECENTITEMS,
+					array(
+	     				array(
+							'type' => 'text',
+							'placeholder' => "",
+							'labelTranslate' => 'RECENT_ITEMS_LIMIT',
+							'name' => 'embyRecentItems',
+							'pattern' => '[0-9]+',
+							'value' => EMBYRECENTITEMS,
+						),
+						array(
+							'type' => $userSelectType,
+							'labelTranslate' => 'RECENT_REFRESH',
+							'name' => 'recentRefresh',
+							'value' => RECENTREFRESH,
+							'options' => $refreshSeconds,
+						),
 					),
 					array(
 						array(
@@ -1085,24 +1110,60 @@ echo buildSettings(
 							'name' => 'embyRecentMovie',
 							'value' => EMBYRECENTMOVIE,
 						),
+						array(
+							'type' => $userSelectType,
+							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
+							'name' => 'embyRecentMovieAuth',
+							'value' => EMBYRECENTMOVIEAUTH,
+							'options' => $userTypes,
+						),
+					),
+					array(
 						array(
 							'type' => 'checkbox',
 							'labelTranslate' => 'RECENT_TV',
 							'name' => 'embyRecentTV',
 							'value' => EMBYRECENTTV,
 						),
+						array(
+							'type' => $userSelectType,
+							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
+							'name' => 'embyRecentTVAuth',
+							'value' => EMBYRECENTTVAUTH,
+							'options' => $userTypes,
+						),
+					),
+					array(
 						array(
 							'type' => 'checkbox',
 							'labelTranslate' => 'RECENT_MUSIC',
 							'name' => 'embyRecentMusic',
 							'value' => EMBYRECENTMUSIC,
 						),
+						array(
+							'type' => $userSelectType,
+							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
+							'name' => 'embyRecentMusicAuth',
+							'value' => EMBYRECENTMUSICAUTH,
+							'options' => $userTypes,
+						),
+					),
+					array(
 						array(
 							'type' => 'checkbox',
 							'labelTranslate' => 'PLAYING_NOW',
 							'name' => 'embyPlayingNow',
 							'value' => EMBYPLAYINGNOW,
 						),
+						array(
+							'type' => $userSelectType,
+							'labelTranslate' => 'SHOW_ON_HOMEPAGE',
+							'name' => 'embyPlayingNowAuth',
+							'value' => EMBYPLAYINGNOWAUTH,
+							'options' => $userTypes,
+						),
+					),
+					array(
       					array(
 							'type' => 'checkbox',
 							'labelTranslate' => 'SHOW_NAMES',
@@ -1512,7 +1573,13 @@ echo buildSettings(
 						'name' => 'ombiKey',
 						'value' => OMBIKEY,
 					),
-
+					array(
+						'type' => $userSelectType,
+						'labelTranslate' => 'REQUEST_REFRESH',
+						'name' => 'requestRefresh',
+						'value' => REQUESTREFRESH,
+						'options' => $refreshSeconds,
+					),
 				),
 			),
 			array(