Browse Source

Merge pull request #230 from Cerothen/master

Emby Support
causefx 9 years ago
parent
commit
f0bd2a239f
6 changed files with 279 additions and 30 deletions
  1. 133 1
      functions.php
  2. 21 1
      homepage.php
  3. 41 27
      image.php
  4. 6 1
      lang/en.ini
  5. 71 0
      settings.php
  6. 7 0
      user.php

+ 133 - 1
functions.php

@@ -1,5 +1,11 @@
 <?php
 
+function debug_out($variable, $die = false) {
+	$trace = debug_backtrace()[0];
+	echo '<pre style="background-color: #f2f2f2; border: 2px solid black; border-radius: 5px; padding: 5px; margin: 5px";>'.$trace['file'].':'.$trace['line']."\n\n".print_r($variable, true).'</pre>';
+	if ($die) { http_response_code(503); die(); }
+}
+
 function clean($strin) {
     $strout = null;
 
@@ -227,6 +233,132 @@ function get_browser_name() {
     
 }
 
+function resolveEmbyItem($address, $token, $item) {
+	// Static Height
+	$height = 150;
+	
+	// Get Item Details
+	$itemDetails = json_decode(file_get_contents($address.'/Items?Ids='.$item['Id'].'&Fields=Overview&api_key='.$token),true)['Items'][0];
+	
+	switch ($item['Type']) {
+		case 'Episode':
+			$title = $item['SeriesName'].': '.$item['Name'].' (Season '.$item['ParentIndexNumber'].': Episode '.$item['IndexNumber'].')';
+			$imageId = $itemDetails['SeriesId'];
+			$width = 100;
+			$image = 'season';
+			break;
+		case 'Music':
+			$title = $item['Name'];
+			$imageId = $itemDetails['AlbumId'];
+			$width = 150;
+			$image = 'music';
+			break;
+		default:
+			$title = $item['Name'];
+			$imageId = $item['Id'];
+			$width = 100;
+			$image = 'movie';
+	}
+	
+	// If No Overview
+	if (!isset($itemDetails['Overview'])) {
+		$itemDetails['Overview'] = '';
+	}
+	
+	// Assemble Item And Cache Into Array 
+	return '<div class="item"><a href="'.$address.'/web/itemdetails.html?id='.$item['Id'].'" target="_blank"><img alt="'.$item['Name'].'" class="carousel-image '.$image.'" src="image.php?source=emby&img='.$imageId.'&height='.$height.'&width='.$width.'"></a><div class="carousel-caption '.$image.'""><h4>'.$title.'</h4><small><em>'.$itemDetails['Overview'].'</em></small></div></div>';
+}
+
+function outputCarousel($header, $size, $type, $items) {
+	// If None Populate Empty Item
+	if (!count($items)) {
+		$items = array('<div class="item"><img alt="nada" class="carousel-image movie" src="images/nadaplaying.jpg"><div class="carousel-caption"><h4>Nothing To Show</h4><small><em>Get Some Stuff Going!</em></small></div></div>');
+	}
+	
+	// Set First As Active
+	$items[0] = preg_replace('/^<div class="item ?">/','<div class="item active">', $items[0]);
+	
+	// Add Buttons
+	$buttons = '';
+	if (count($items) > 1) {
+		$buttons = '
+			<a class="left carousel-control '.$type.'" href="#carousel-'.$type.'" role="button" data-slide="prev"><span class="fa fa-chevron-left" aria-hidden="true"></span><span class="sr-only">Previous</span></a>
+			<a class="right carousel-control '.$type.'" href="#carousel-'.$type.'" role="button" data-slide="next"><span class="fa fa-chevron-right" aria-hidden="true"></span><span class="sr-only">Next</span></a>';
+	}
+	
+	return '
+	<div class="col-lg-'.$size.'">
+		<h5 class="text-center">'.$header.'</h5>
+		<div id="carousel-'.$type.'" class="carousel slide box-shadow white-bg" data-ride="carousel"><div class="carousel-inner" role="listbox">
+			'.implode('',$items).'
+		</div>'.$buttons.'
+	</div></div>'; 
+}
+
+function getEmbyStreams($url, $port, $token, $size, $header) {
+    if (stripos($url, "http") === false) {
+        $url = "http://" . $url;
+    }
+    
+    if ($port !== "") { 
+		$url = $url . ":" . $port;
+	}
+    
+    $address = $url;
+	
+	$api = json_decode(file_get_contents($address.'/Sessions?api_key='.$token),true);
+	
+	$playingItems = array();
+	foreach($api as $key => $value) {
+		if (isset($value['NowPlayingItem'])) {
+			$playingItems[] = resolveEmbyItem($address, $token, $value['NowPlayingItem']);
+		}
+	}
+	
+	return outputCarousel($header, $size, 'streams', $playingItems);
+}
+
+function getEmbyRecent($url, $port, $type, $token, $size, $header) {
+    if (stripos($url, "http") === false) {
+        $url = "http://" . $url;
+    }
+    
+    if ($port !== "") { 
+		$url = $url . ":" . $port;
+	}
+    
+    $address = $url;
+	
+	// Resolve Types
+	switch ($type) {
+		case 'movie':
+			$embyTypeQuery = 'IncludeItemTypes=Movie&';
+			break;
+		case 'season':
+			$embyTypeQuery = 'IncludeItemTypes=Episode&';
+			break;
+		case 'album':
+			$embyTypeQuery = 'IncludeItemTypes=Music&';
+			break;
+		default:
+			$embyTypeQuery = '';
+	}
+	
+	// Get A User
+	$userId = json_decode(file_get_contents($address.'/Users?api_key='.$token),true)[0]['Id'];
+	
+	// Get the latest Items
+	$latest = json_decode(file_get_contents($address.'/Users/'.$userId.'/Items/Latest?'.$embyTypeQuery.'EnableImages=false&api_key='.$token),true);
+	
+	// For Each Item In Category
+	$items = array();
+	foreach ($latest as $k => $v) {
+		$items[] = resolveEmbyItem($address, $token, $v);
+	}
+	
+	return outputCarousel($header, $size, $type, $items);
+}
+
 function getPlexRecent($url, $port, $type, $token, $size, $header){
     
     $urlCheck = stripos($url, "http");
@@ -781,4 +913,4 @@ function getHeadphonesCalendar($url, $port, $key, $list){
     if ($i != 0){ return $gotCalendar; }
 
 }
-?>
+?>

+ 21 - 1
homepage.php

@@ -341,6 +341,26 @@ endif; ?>
 
                 </div>
                 
+                <div id="embyRow" class="row">
+                    
+                    <sort>3</sort>
+
+                    <?php
+                    $embySize = 0;
+                    if(EMBYRECENTMOVIE == "true"){ $embySize++; }
+                    if(EMBYRECENTTV == "true"){ $embySize++; }
+                    if(EMBYRECENTMUSIC == "true"){ $embySize++; }
+                    if(EMBYPLAYINGNOW == "true"){ $embySize++; }
+                    if($embySize >= 4){ $embySize = 3; }elseif($embySize == 3){ $embySize = 4; }elseif($embySize == 2){ $embySize = 6; }elseif($embySize == 1){ $embySize = 12; }
+                    
+                    if(EMBYRECENTMOVIE == "true"){ echo getEmbyRecent(EMBYURL, EMBYPORT, "movie", EMBYTOKEN, $embySize, $language->translate("MOVIES")); }
+                    if(EMBYRECENTTV == "true"){ echo getEmbyRecent(EMBYURL, EMBYPORT, "season", EMBYTOKEN, $embySize, $language->translate("TV_SHOWS")); }
+                    if(EMBYRECENTMUSIC == "true"){ echo getEmbyRecent(EMBYURL, EMBYPORT, "album", EMBYTOKEN, $embySize, $language->translate("MUSIC")); }
+                    if(EMBYPLAYINGNOW == "true"){ echo getEmbyStreams(EMBYURL, EMBYPORT, EMBYTOKEN, $embySize, $language->translate("PLAYING_NOW_ON_EMBY")); }
+                    ?>
+
+                </div>
+		    
                 <?php if(SONARRURL != "" || RADARRURL != "" || HEADPHONESURL != "" || SICKRAGEURL != "") : ?>
                 <div id="calendarLegendRow" class="row" style="padding: 0 0 10px 0;">
                     
@@ -591,4 +611,4 @@ endif; ?>
 
     </body>
 
-</html>
+</html>

+ 41 - 27
image.php

@@ -5,31 +5,45 @@ require_once("user.php");
 $image_url = $_GET['img'];
 $image_height = $_GET['height'];
 $image_width = $_GET['width'];
-
-$urlCheck = stripos(PLEXURL, "http");
-
-if ($urlCheck === false) {
-
-    $plexAddress = "http://" . PLEXURL;
-
-}else{
-    
-    $plexAddress = PLEXURL;
-    
-}
-
-if(PLEXPORT !== ""){ $plexAddress = $plexAddress . ":" . PLEXPORT; }
-
-if(isset($image_url) && isset($image_height) && isset($image_width)) {
-    
-	$image_src = $plexAddress . '/photo/:/transcode?height='.$image_height.'&width='.$image_width.'&upscale=1&url=' . $image_url . '&X-Plex-Token=' . PLEXTOKEN;
-
-    header('Content-type: image/jpeg');
-    
-	readfile($image_src);
-    
-} else {
-    
-    echo "Invalid Plex Request";	
-    
+$image_source = $_GET['source'];
+
+switch ($image_source) {
+	case 'emby':
+		$urlCheck = stripos(EMBYURL, "http");
+
+		if ($urlCheck === false) {
+			$embyAddress = "http://" . EMBYURL;
+		} else {
+			$embyAddress = EMBYURL;	
+		}
+		
+		if(PLEXPORT !== ""){ $embyAddress .= ":" . EMBYPORT; }
+		
+		if(isset($image_url) && isset($image_height) && isset($image_width)) {
+			$image_src = $embyAddress . '/Items/'.$image_url.'/Images/Primary?maxHeight='.$image_height.'&maxWidth='.$image_width;
+			header('Content-type: image/jpeg');
+			readfile($image_src);
+		} else {
+			echo "Invalid Emby Request";	
+		}
+		break;
+	default:
+		$urlCheck = stripos(PLEXURL, "http");
+
+		if ($urlCheck === false) {
+			$plexAddress = "http://" . PLEXURL;
+		} else {
+			$plexAddress = PLEXURL;	
+		}
+		
+		if(PLEXPORT !== ""){ $plexAddress = $plexAddress . ":" . PLEXPORT; }
+		
+		if(isset($image_url) && isset($image_height) && isset($image_width)) {
+			$image_src = $plexAddress . '/photo/:/transcode?height='.$image_height.'&width='.$image_width.'&upscale=1&url=' . $image_url . '&X-Plex-Token=' . PLEXTOKEN;
+			header('Content-type: image/jpeg');
+			readfile($image_src);
+		} else {
+			echo "Invalid Plex Request";	
+		}
+		break;
 }

+ 6 - 1
lang/en.ini

@@ -219,4 +219,9 @@ SMTP_HOST_AUTH = "SMTP Auth"
 SMTP_HOST_USERNAME = "SMTP Username"
 SMTP_HOST_PASSWORD = "SMTP Password"
 SMTP_HOST_SENDER_NAME = "SMTP Sender Name"
-SMTP_HOST_SENDER_EMAIL = "SMTP Sender Email"
+SMTP_HOST_SENDER_EMAIL = "SMTP Sender Email"
+EMBY_URL = "Emby URL"
+EMBY_PORT = "Emby Port"
+EMBY_TOKEN = "Emby Token"
+PLAYING_NOW_ON_EMBY = "Playing Now on EMBY"
+RECENTLY_ADDED_TO_EMBY = "Recently Added to EMBY"

+ 71 - 0
settings.php

@@ -1305,6 +1305,12 @@ endif;?></textarea>
                                                             <a href="#tab-plex" data-toggle="tab" aria-expanded="true"><img style="height:40px; width:40px;" src="images/plex.png"></a>
 
                                                         </li>
+							    
+                                                        <li class="apps">
+
+                                                            <a href="#tab-emby" data-toggle="tab" aria-expanded="true"><img style="height:40px; width:40px;" src="images/emby.png"></a>
+
+                                                        </li>
 
                                                         <li class="apps ">
 
@@ -1419,6 +1425,71 @@ endif;?></textarea>
 
                                                         </div>
 
+                                                        <div class="tab-pane big-box fade active in" id="tab-emby">
+
+                                                            <div class="form-group">
+
+                                                                <input type="text" class="form-control material input-sm" name="embyURL" placeholder="<?php echo $language->translate("EMBY_URL");?>" autocorrect="off" autocapitalize="off" value="<?php echo EMBYURL;?>">
+                                                                <p class="help-text"><?php echo $language->translate("EMBY_URL");?></p>
+
+                                                            </div>
+
+                                                            <div class="form-group">
+
+                                                                <input type="text" class="form-control material input-sm" name="embyPort" placeholder="<?php echo $language->translate("EMBY_PORT");?>" autocorrect="off" autocapitalize="off" value="<?php echo EMBYPORT;?>">
+                                                                <p class="help-text"><?php echo $language->translate("EMBY_PORT");?></p>
+
+                                                            </div>
+
+                                                            <div class="form-group">
+
+                                                                <input type="text" class="form-control material input-sm" name="embyToken" placeholder="<?php echo $language->translate("EMBY_TOKEN");?>" autocorrect="off" autocapitalize="off" value="<?php echo EMBYTOKEN;?>">
+                                                                <p class="help-text"><?php echo $language->translate("EMBY_TOKEN");?></p>
+
+                                                            </div>
+
+                                                            <div class="content-form form-inline">
+
+                                                                <div class="form-group">
+                                                                    <?php  if(EMBYRECENTMOVIE == "true") : $EMBYRECENTMOVIE = "checked"; else : $EMBYRECENTMOVIE = ""; endif;?>
+                                                                    <input id="" class="switcher switcher-success" value="false" name="embyRecentMovie" type="hidden">
+                                                                    <input id="embyRecentMovie" class="switcher switcher-success" value="true" name="embyRecentMovie" type="checkbox" <?php echo $EMBYRECENTMOVIE;?>>
+
+                                                                    <label for="embyRecentMovie"></label><?php echo $language->translate("RECENT_MOVIES");?>
+
+                                                                </div>
+
+                                                                <div class="form-group">
+                                                                    <?php  if(EMBYRECENTTV == "true") : $EMBYRECENTTV = "checked"; else : $EMBYRECENTTV = ""; endif;?>
+                                                                    <input id="" class="switcher switcher-success" value="false" name="embyRecentTV" type="hidden">
+                                                                    <input id="embyRecentTV" class="switcher switcher-success" value="true" name="embyRecentTV" type="checkbox" <?php echo $EMBYRECENTTV;?>>
+
+                                                                    <label for="embyRecentTV"></label><?php echo $language->translate("RECENT_TV");?>
+
+                                                                </div>
+
+                                                                <div class="form-group">
+                                                                    <?php  if(EMBYRECENTMUSIC == "true") : $EMBYRECENTMUSIC = "checked"; else : $EMBYRECENTMUSIC = ""; endif;?>
+                                                                    <input id="" class="switcher switcher-success" value="false" name="embyRecentMusic" type="hidden">
+                                                                    <input id="embyRecentMusic" class="switcher switcher-success" value="true" name="embyRecentMusic" type="checkbox" <?php echo $EMBYRECENTMUSIC;?>>
+
+                                                                    <label for="embyRecentMusic"></label><?php echo $language->translate("RECENT_MUSIC");?>
+
+                                                                </div>
+
+                                                                <div class="form-group">
+                                                                    <?php  if(EMBYPLAYINGNOW == "true") : $EMBYPLAYINGNOW = "checked"; else : $EMBYPLAYINGNOW = ""; endif;?>
+                                                                    <input id="" class="switcher switcher-success" value="false" name="embyPlayingNow" type="hidden">
+                                                                    <input id="embyPlayingNow" class="switcher switcher-success" value="true" name="embyPlayingNow" type="checkbox" <?php echo $EMBYPLAYINGNOW;?>>
+
+                                                                    <label for="embyPlayingNow"></label><?php echo $language->translate("PLAYING_NOW");?>
+
+                                                                </div>
+
+                                                            </div>
+
+                                                        </div>
+							    
                                                         <div class="tab-pane big-box fade" id="tab-sonarr">
 
                                                             <div class="form-group">

+ 7 - 0
user.php

@@ -45,6 +45,13 @@
     if(!empty($homepageConfig['plexRecentTV'])) : define('PLEXRECENTTV', $homepageConfig['plexRecentTV']); else : define('PLEXRECENTTV', 'false'); endif;
     if(!empty($homepageConfig['plexRecentMusic'])) : define('PLEXRECENTMUSIC', $homepageConfig['plexRecentMusic']); else : define('PLEXRECENTMUSIC', 'false'); endif;
     if(!empty($homepageConfig['plexPlayingNow'])) : define('PLEXPLAYINGNOW', $homepageConfig['plexPlayingNow']); else : define('PLEXPLAYINGNOW', 'false'); endif;
+    if(!empty($homepageConfig['embyURL'])) : define('EMBYURL', $homepageConfig['embyURL']); else : define('EMBYURL', ''); endif;
+    if(!empty($homepageConfig['embyPort'])) : define('EMBYPORT', $homepageConfig['embyPort']); else : define('EMBYPORT', ''); endif;
+    if(!empty($homepageConfig['embyToken'])) : define('EMBYTOKEN', $homepageConfig['embyToken']); else : define('EMBYTOKEN', ''); endif;
+    if(!empty($homepageConfig['embyRecentMovie'])) : define('EMBYRECENTMOVIE', $homepageConfig['embyRecentMovie']); else : define('EMBYRECENTMOVIE', 'false'); endif;
+    if(!empty($homepageConfig['embyRecentTV'])) : define('EMBYRECENTTV', $homepageConfig['embyRecentTV']); else : define('EMBYRECENTTV', 'false'); endif;
+    if(!empty($homepageConfig['embyRecentMusic'])) : define('EMBYRECENTMUSIC', $homepageConfig['embyRecentMusic']); else : define('EMBYRECENTMUSIC', 'false'); endif;
+    if(!empty($homepageConfig['embyPlayingNow'])) : define('EMBYPLAYINGNOW', $homepageConfig['embyPlayingNow']); else : define('EMBYPLAYINGNOW', 'false'); endif;    
     if(!empty($homepageConfig['sonarrKey'])) : define('SONARRKEY', $homepageConfig['sonarrKey']); else : define('SONARRKEY', ''); endif;
     if(!empty($homepageConfig['sonarrURL'])) : define('SONARRURL', $homepageConfig['sonarrURL']); else : define('SONARRURL', ''); endif;
     if(!empty($homepageConfig['sonarrPort'])) : define('SONARRPORT', $homepageConfig['sonarrPort']); else : define('SONARRPORT', ''); endif;