Ver Fonte

Merge pull request #1127 from noah-witt/emby-invites

Emby invites
causefx há 7 anos atrás
pai
commit
6aa4b15ed7

+ 1 - 1
api/functions/api-functions.php

@@ -1182,4 +1182,4 @@ function getSchema()
 	} else {
 		return 'DB not set yet...';
 	}
-}
+}

+ 93 - 1
api/functions/organizr-functions.php

@@ -2064,6 +2064,11 @@ function plexJoinAPI($array)
 	return plexJoin($array['data']['username'], $array['data']['email'], $array['data']['password']);
 }
 
+function embyJoinAPI($array)
+{
+	return embyJoin($array['data']['username'], $array['data']['email'], $array['data']['password']);
+}
+
 function plexJoin($username, $email, $password)
 {
 	try {
@@ -2107,6 +2112,93 @@ function plexJoin($username, $email, $password)
 	return false;
 }
 
+function embyJoin($username, $email, $password)
+{
+	try {
+		#create user in emby.
+		$headers = array(
+			"Accept" => "application/json"
+		);
+		$data = array ();
+		$url =  $GLOBALS['embyURL'] . '/emby/Users/New?name=' . $username . '&api_key=' . $GLOBALS['embyToken'];
+		$response = Requests::Post($url, $headers, json_encode($data), array());
+		$response = $response->body;
+		//return($response);
+		$response = json_decode($response, true);
+		//return($response);
+		$userID = $response["Id"];
+		//return($userID);
+
+		#authenticate as user to update password.
+
+		//randomizer four digits of DeviceId
+		// I dont think ther would be security problems with hardcoding deviceID but randomizing it would mitigate any issue.
+		$deviceIdSeceret = rand(0, 9)."".rand(0, 9)."".rand(0,9)."".rand(0,9);
+
+		//hardcoded device id with the first three digits random 0-9,0-9,0-9,0-9
+		$embyAuthHeader = 'MediaBrowser Client="Emby Mobile", Device="Firefox", DeviceId="'.$deviceIdSeceret.'aWxssS81LgAggFdpbmRvd3MgTlQgMTAuMDsgV2luNjxx7IHf2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcyLjAuMzYyNi4xMTkgU2FmYXJpLzUzNy4zNnwxNTUxNTczMTAyNDI4", Version="4.0.2.0"';
+		$headers = array(
+			"Accept" => "application/json",
+			"Content-Type" => "application/json",
+			"X-Emby-Authorization" => $embyAuthHeader
+		);
+		$data = array (
+			"Pw" => "",
+			"Username" => $username
+		);
+		$url =  $GLOBALS['embyURL'] . '/emby/Users/AuthenticateByName';
+		$response = Requests::Post($url, $headers, json_encode($data), array());
+		$response = $response->body;
+		$response = json_decode($response, true);
+		$userToken = $response["AccessToken"];
+
+		#update password
+		$embyAuthHeader = 'MediaBrowser Client="Emby Mobile", Device="Firefox", Token="'.$userToken.'", DeviceId="'.$deviceIdSeceret.'aWxssS81LgAggFdpbmRvd3MgTlQgMTAuMDsgV2luNjxx7IHf2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcyLjAuMzYyNi4xMTkgU2FmYXJpLzUzNy4zNnwxNTUxNTczMTAyNDI4", Version="4.0.2.0"';
+
+		$headers = array(
+			"Accept" => "application/json",
+			"Content-Type" => "application/json",
+			"X-Emby-Authorization" => $embyAuthHeader
+		);
+		$data = array (
+			"CurrentPw" => "",
+			"NewPw" => $password,
+			"Id" => $userID
+		);
+		$url =  $GLOBALS['embyURL'] . '/emby/Users/' . $userID . '/Password';
+		Requests::Post($url, $headers, json_encode($data), array());
+
+		#update config
+		$headers = array(
+			"Accept" => "application/json",
+			"Content-Type" => "application/json"
+		);
+		$url =  $GLOBALS['embyURL'] . '/emby/Users/' . $userID . '/Policy?api_key=' . $GLOBALS['embyToken'];
+		$response = Requests::Post($url, $headers, $GLOBALS['INVITES-EmbyDefaultUserConfig'], array());
+
+		#add emby.media
+		try {
+			#seperate because this is not required
+			$headers = array(
+				"Accept" => "application/json",
+				"X-Emby-Authorization" => $embyAuthHeader
+			);
+			$data = array (
+				"ConnectUsername " => $email
+			);
+			$url =  $GLOBALS['embyURL'] . '/emby/Users/' . $userID . '/Connect/Link';
+			Requests::Post($url, $headers, json_encode($data), array());
+		} catch (Requests_Exception $e)	{
+			writeLog('error', 'Emby Connect Function - Error: ' . $e->getMessage(), 'SYSTEM');
+		}
+		return(true);
+		//return( "USERID:".$userID);
+	} catch (Requests_Exception $e) {
+		writeLog('error', 'Emby create Function - Error: ' . $e->getMessage(), 'SYSTEM');
+	};
+	return false;
+}
+
 function checkFrame($array, $url)
 {
 	if (array_key_exists("x-frame-options", $array)) {
@@ -2254,4 +2346,4 @@ function checkHostPrefix($s)
 		return $s;
 	}
 	return (substr($s, -1, 1) == '\\') ? $s : $s . '\\';
-}
+}

+ 13 - 1
api/index.php

@@ -1232,6 +1232,19 @@ switch ($function) {
 				break;
 		}
 		break;
+		case 'v1_emby_join':
+			switch ($method) {
+				case 'POST':
+					$result['status'] = 'success';
+					$result['statusText'] = 'success';
+					$result['data'] = embyJoinAPI($_POST);
+					break;
+				default:
+					$result['status'] = 'error';
+					$result['statusText'] = 'The function requested is not defined for method: ' . $method;
+					break;
+			}
+			break;
 	case 'v1_token_revoke':
 		switch ($method) {
 			case 'POST':
@@ -1347,4 +1360,3 @@ if ($pretty) {
 } else {
 	exit(safe_json_encode($result, JSON_HEX_QUOT | JSON_HEX_TAG));
 }
-

+ 31 - 3
api/plugins/invites.php

@@ -194,7 +194,7 @@ function invitesGetSettings()
 						'value' => 'plex'
 					),
 					array(
-						'name' => 'Emby [Not Ready]',
+						'name' => 'Emby',
 						'value' => 'emby'
 					)
 				)
@@ -225,7 +225,29 @@ function invitesGetSettings()
 				'options' => $libraryList
 			)
 		),
-		'Emby Settings' => array(),
+		'Emby Settings' => array(
+			array(
+				'type' => 'password-alt',
+				'name' => 'embyToken',
+				'label' => 'Emby API key',
+				'value' => $GLOBALS['embyToken'],
+				'placeholder' => 'enter key from emby'
+			),
+			array(
+				'type' => 'text',
+				'name' => 'embyURL',
+				'label' => 'Emby server adress',
+				'value' =>  $GLOBALS['embyURL'],
+				'placeholder' => 'localhost:8086'
+			),
+			array(
+				'type' => 'text',
+				'name' => 'INVITES-EmbyDefaultUserConfig',
+				'label' => 'Emby Default User Config JSON',
+				'value' => $GLOBALS['INVITES-EmbyDefaultUserConfig'],
+				'placeholder' => '{...}'
+			)
+		),
 		'FYI' => array(
 			array(
 				'type' => 'html',
@@ -309,7 +331,13 @@ function inviteAction($username, $action = null, $type = null)
 			}
 			break;
 		case 'emby':
-			# code...
+			try {
+				#add emby user to sytem
+				return true;
+			} catch (Requests_Exception $e){
+				writeLog('error', 'Emby Invite Function - Error: ' . $e->getMessage(), 'SYSTEM');
+				return false;
+			}
 			break;
 		default:
 			return false;

+ 100 - 2
api/plugins/js/invites.js

@@ -111,6 +111,39 @@ function joinPlex(){
     	});
     }
 }
+
+function joinEmby(){
+    var username = $('#inviteEmbyJoinUsername');
+    var email = $('#inviteEmbyJoinEmail');
+    var password = $('#inviteEmbyJoinPassword');
+    if(username.val() == ''){
+        username.focus();
+        message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+    }else if(email.val() == ''){
+        email.focus();
+        message('Invite Error',' Please Enter Email',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+    }else if(password.val() == ''){
+        password.focus();
+        message('Invite Error',' Please Enter Passowrd',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+    }
+    if(email.val() !== '' && username.val() !== '' && password.val() !== ''){
+        organizrAPI('POST','api/?v1/emby/join',{username:username.val(), email:email.val(), password:password.val()}).success(function(data) {
+    		var response = JSON.parse(data);
+            if(response.data === true){
+                $('.invite-step-3-emby-no').toggleClass('hidden');
+                $('.invite-step-3-emby-yes').toggleClass('hidden');
+                message('Invite Function',' User Created',activeInfo.settings.notifications.position,'#FFF','success','5000');
+                $('#inviteUsernameInviteEmby').val(username.val());
+                hasEmbyUsername();
+            }else{
+                message('Invite Error',' '+response.data,activeInfo.settings.notifications.position,'#FFF','warning','5000');
+            }
+    	}).fail(function(xhr) {
+    		console.error("Organizr Function: API Connection Failed");
+    	});
+    }
+}
+
 function inviteHasAccount(type,value){
     switch (type) {
         case 'plex':
@@ -122,6 +155,15 @@ function inviteHasAccount(type,value){
                 $('.invite-step-3-plex-no').toggleClass('hidden');
             }
             break;
+        case 'emby' :
+          if(value){
+            $('.invite-step-2').toggleClass('hidden');
+            $('.invite-step-3-emby-yes').toggleClass('hidden');
+          }else{
+            $('.invite-step-2').toggleClass('hidden');
+            $('.invite-step-3-emby-no').toggleClass('hidden');
+          }
+          break;
         default:
         alert(type+' is not set up yet');
     }
@@ -158,6 +200,38 @@ function hasPlexUsername(){
         });
     }
 }
+function hasEmbyUsername(){
+    var code = $('#inviteCodeInput').val().toUpperCase();
+    var username = $('#inviteUsernameInviteEmby');
+    if(username.val() == ''){
+        username.focus();
+        message('Invite Error',' Please Enter Username',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+    }else{
+        var post = {
+            plugin:'Invites/codes',
+            action:'use',
+            code:code,
+            usedby:username.val()
+        };
+        ajaxloader(".content-wrap","in");
+        organizrAPI('POST','api/?v1/plugin',post).success(function(data) {
+            var response = JSON.parse(data);
+            if(response.data === true){
+                $('.invite-step-3-emby-yes').toggleClass('hidden');
+                $('.invite-step-4-emby-accept').toggleClass('hidden');
+                if(local('get', 'invite')){
+            		local('remove', 'invite');
+            	}
+            }else{
+                message('Invite Error',' Code Incorrect',activeInfo.settings.notifications.position,'#FFF','warning','5000');
+            }
+            ajaxloader();;
+        }).fail(function(xhr) {
+            console.error("Organizr Function: API Connection Failed");
+            ajaxloader();
+        });
+    }
+}
 function verifyInvite(){
     var code = $('#inviteCodeInput').val().toUpperCase();
     var post = {
@@ -381,12 +455,36 @@ $(document).on('click', '.inviteModal', function() {
                             <br />
                             <button class="btn btn-block btn-info" onclick="joinPlex();">Submit</button>
                         </div>
+                        <div class="form-group invite-step-4-plex-accept hidden">
+                            <h4 class="" lang="en">You have been invited.  Please goto <a href="https://plex.tv" target="_blank">PLEX.TV</a> and login to accept the invite.  Once you have done that, you may head back here and login with your credentials.</h4>
+                        </div>
+                        <!-- Begin Emby Invites -->
                         <div class="form-group invite-step-3-emby-yes hidden">
+                            <div class="input-group" style="width: 100%;">
+                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+                                <input type="text" class="form-control" id="inviteUsernameInviteEmby" placeholder="Emby Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
+                            </div>
+                            <br />
+                            <button class="btn btn-block btn-info" onclick="hasEmbyUsername();">Submit</button>
                         </div>
                         <div class="form-group invite-step-3-emby-no hidden">
+                            <div class="input-group" style="width: 100%;">
+                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+                                <input type="text" class="form-control" id="inviteEmbyJoinUsername" lang="en" placeholder="Username" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" autofocus="" required="">
+                            </div>
+                            <div class="input-group" style="width: 100%;">
+                                <div class="input-group-addon hidden-xs"><i class="ti-email"></i></div>
+                                <input type="text" class="form-control" id="inviteEmbyJoinEmail" lang="en" placeholder="E-Mail" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" required="">
+                            </div>
+                            <div class="input-group" style="width: 100%;">
+                                <div class="input-group-addon hidden-xs"><i class="ti-user"></i></div>
+                                <input type="password" class="form-control" id="inviteEmbyJoinPassword" lang="en" placeholder="Password" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"  required="">
+                            </div>
+                            <br />
+                            <button class="btn btn-block btn-info" onclick="joinEmby();">Submit</button>
                         </div>
-                        <div class="form-group invite-step-4-plex-accept hidden">
-                            <h4 class="" lang="en">You have been invited.  Please goto <a href="https://plex.tv" target="_blank">PLEX.TV</a> and login to accept the invite.  Once you have done that, you may head back here and login with your credentials.</h4>
+                        <div class="form-group invite-step-4-emby-accept hidden">
+                            <h4 class="" lang="en">You Have been added to emby!</h4>
                         </div>
                     </div>
                 </div>