| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- <?php
- // PLUGIN INFORMATION
- $GLOBALS['plugins']['plexlibraries'] = array( // Plugin Name
- 'name' => 'Plex Libraries', // Plugin Name
- 'author' => 'TehMuffinMoo', // Who wrote the plugin
- 'category' => 'Library Management', // One to Two Word Description
- 'link' => '', // Link to plugin info
- 'license' => 'personal', // License Type use , for multiple
- 'idPrefix' => 'PLEXLIBRARIES', // html element id prefix (All Uppercase)
- 'configPrefix' => 'PLEXLIBRARIES', // config file prefix for array items without the hypen (All Uppercase)
- 'version' => '1.0.1', // SemVer of plugin
- 'image' => 'api/plugins/plexLibraries/logo.png', // 1:1 non transparent image for plugin
- 'settings' => true, // does plugin need a settings modal?
- 'bind' => true, // use default bind to make settings page - true or false
- 'api' => 'api/v2/plugins/plexlibraries/settings', // api route for settings page (All Lowercase)
- 'homepage' => false // Is plugin for use on homepage? true or false
- );
- class plexLibrariesPlugin extends Organizr
- {
- public function _pluginGetSettings()
- {
- $libraryList = [['name' => 'Refresh page to update List', 'value' => '', 'disabled' => true]];
- if ($this->config['plexID'] !== '' && $this->config['plexToken'] !== '') {
- $libraryList = [];
- $loop = $this->plexLibraryList('key')['libraries'];
- foreach ($loop as $key => $value) {
- $libraryList[] = ['name' => $key, 'value' => $value];
- }
- }
- $this->setGroupOptionsVariable();
- return array(
- 'Settings' => array(
- $this->settingsOption('token', 'plexToken'),
- $this->settingsOption('button', '', ['label' => 'Get Plex Token', 'icon' => 'fa fa-ticket', 'text' => 'Retrieve', 'attr' => 'onclick="PlexOAuth(oAuthSuccess,oAuthError, null, \'#PLEXLIBRARIES-settings-page [name=plexToken]\')"']),
- $this->settingsOption('password-alt', 'plexID', ['label' => 'Plex Machine']),
- $this->settingsOption('button', '', ['label' => 'Get Plex Machine', 'icon' => 'fa fa-id-badge', 'text' => 'Retrieve', 'attr' => 'onclick="showPlexMachineForm(\'#PLEXLIBRARIES-settings-page [name=plexID]\')"']),
- $this->settingsOption('auth', 'PLEXLIBRARIES-pluginAuth'),
- $this->settingsOption('input', 'plexAdmin', ['label' => 'Plex Admin Username or Email']),
- $this->settingsOption('plex-library-include', 'PLEXLIBRARIES-librariesToInclude', ['options' => $libraryList])
- )
- );
- }
-
- public function _pluginLaunch()
- {
- $user = $this->getUserById($this->user['userID']);
- if ($user) {
- if ($user['plex_token'] !== null) {
- $this->setResponse(200, 'User approved for plugin');
- return true;
- }
- }
- $this->setResponse(401, 'User not approved for plugin');
- return false;
- }
-
- public function plexLibrariesPluginGetPlexShares($includeAll = false, $userId = "")
- {
- if (empty($this->config['plexToken'])) {
- $this->setResponse(409, 'plexToken is not setup');
- return false;
- }
- $headers = array(
- 'Content-type: application/xml',
- 'X-Plex-Token' => $this->config['plexToken'],
- );
- // Check if user is Plex Admin
- if ((strtolower($this->user['username']) == strtolower($this->config['plexAdmin']) || strtolower($this->user['email']) == strtolower($this->config['plexAdmin'])) && !$userId) {
- $url = 'https://plex.tv/api/servers/' . $this->config['plexID'] . '/shared_servers/';
- try {
- $response = Requests::get($url, $headers, []);
- if ($response->success) {
- libxml_use_internal_errors(true);
- $plex = simplexml_load_string($response->body);
- $libraryList = array();
- foreach ($plex->SharedServer as $child) {
- if (!empty($child['username'])) {
- $libraryList[(string)$child['username']]['username'] = (string)$child['username'];
- $libraryList[(string)$child['username']]['email'] = (string)$child['email'];
- $libraryList[(string)$child['username']]['id'] = (string)$child['id'];
- $libraryList[(string)$child['username']]['userID'] = (string)$child['userID'];
- foreach ($child->Section as $library) {
- $library = current($library->attributes());
- $libraryList[(string)$child['username']]['libraries'][] = $library;
- }
- }
- }
- $libraryList = array_change_key_case($libraryList, CASE_LOWER);
- ksort($libraryList);
- $apiData = [
- 'plexAdmin' => true,
- 'libraryData' => $libraryList
- ];
- $this->setResponse(200, null, $apiData);
- return $apiData;
- } else {
- $this->setResponse(500, 'Plex error');
- return false;
- }
- } catch (Requests_Exception $e) {
- $this->writeLog('error', 'PlexLibraries Plugin - Error: ' . $e->getMessage(), 'SYSTEM');
- $this->setAPIResponse('error', 'PlexLibraries Plugin - Error: ' . $e->getMessage(), 400);
- return false;
- }
- } else {
- $searchTerm = ($userId) ?: $this->user['email'];
- $searchKey = ($userId) ? 'shareId' : 'email';
- $plexUsers = $this->allPlexUsers(false, true);
- $key = array_search($searchTerm, array_column($plexUsers, $searchKey));
- if ($key !== false) {
- $url = 'https://plex.tv/api/servers/' . $this->config['plexID'] . '/shared_servers/' . $plexUsers[$key]['shareId'];
- } else {
- $this->setResponse(404, 'User Id was not found in Plex Users');
- return false;
- }
- try {
- $response = Requests::get($url, $headers, array());
- if ($response->success) {
- libxml_use_internal_errors(true);
- $plex = simplexml_load_string($response->body);
- $libraryList = array();
- foreach ($plex->SharedServer as $child) {
- if (!empty($child['username'])) {
- $libraryList[(string)$child['username']]['username'] = (string)$child['username'];
- $libraryList[(string)$child['username']]['email'] = (string)$child['email'];
- $libraryList[(string)$child['username']]['id'] = (string)$child['id'];
- $libraryList[(string)$child['username']]['shareId'] = (string)$plexUsers[$key]['shareId'];
- foreach ($child->Section as $library) {
- $library = current($library->attributes());
- if (!$includeAll) {
- $librariesToInclude = explode(',', $this->config['PLEXLIBRARIES-librariesToInclude']);
- if (in_array($library['key'], $librariesToInclude)) {
- $libraryList[(string)$child['username']]['libraries'][] = $library;
- }
- } else {
- $libraryList[(string)$child['username']]['libraries'][] = $library;
- }
- }
- }
- }
- $libraryList = array_change_key_case($libraryList, CASE_LOWER);
- $apiData = [
- 'plexAdmin' => false,
- 'libraryData' => $libraryList
- ];
- $this->setResponse(200, null, $apiData);
- return $apiData;
- } else {
- $this->setResponse(500, 'Plex Error', $response->body);
- return false;
- }
- } catch (Requests_Exception $e) {
- $this->writeLog('error', 'PlexLibraries Plugin - Error: ' . $e->getMessage(), 'SYSTEM');
- $this->setAPIResponse('error', 'PlexLibraries Plugin - Error: ' . $e->getMessage(), 400);
- return false;
- }
- }
- }
-
- public function plexLibrariesPluginUpdatePlexShares($userId, $action, $shareId)
- {
- if (!$userId) {
- $this->setResponse(409, 'User Id not supplied');
- return false;
- }
- if (!$action) {
- $this->setResponse(409, 'Action not supplied');
- return false;
- }
- if (!$shareId) {
- $this->setResponse(409, 'Share Id not supplied');
- return false;
- }
- if (!$this->qualifyRequest(1)) {
- $plexUsers = $this->allPlexUsers(false, true);
- $key = array_search($this->user['email'], array_column($plexUsers, 'email'));
- if (!$key) {
- $this->setResponse(404, 'User Id was not found in Plex Users');
- return false;
- } else {
- if ($plexUsers[$key]['shareId'] !== $userId) {
- $this->setResponse(401, 'You are not allowed to edit someone else\'s plex share');
- return false;
- }
- }
- }
- $Shares = $this->plexLibrariesPluginGetPlexShares(true, $userId);
- $NewShares = array();
- if ($Shares) {
- if (isset($Shares['libraryData'])) {
- foreach ($Shares['libraryData'] as $key => $Share) {
- foreach ($Share['libraries'] as $library) {
- if ($library['shared'] == 1) {
- $ShareString = (string)$library['id'];
- if ($action == 'share') {
- $NewShares[] = $ShareString;
- $Msg = 'Enabled share';
- } else {
- $Msg = 'Disabled share';
- if ($ShareString !== $shareId) {
- $NewShares[] = $ShareString;
- }
- }
- }
- }
- }
- if ($action == 'share') {
- if (!in_array($shareId, $NewShares)) {
- $NewShares[] = $shareId;
- }
- }
- }
- }
- if (empty($NewShares)) {
- $this->setResponse(409, 'You must have at least one share.');
- return false;
- } else {
- $http_body = [
- "server_id" => $this->config['plexID'],
- "shared_server" => [
- "library_section_ids" => $NewShares
- ]
- ];
- if ($userId) {
- $url = 'https://plex.tv/api/servers/' . $this->config['plexID'] . '/shared_servers/' . $userId . '?X-Plex-Token=' . $this->config['plexToken'];
- }
- $headers = [
- 'Accept' => 'application/json',
- 'Content-Type' => 'application/json',
- ];
- try {
- $response = Requests::put($url, $headers, json_encode($http_body), []);
- if ($response->success) {
- $this->setAPIResponse('success', $Msg, 200, $http_body);
- return $http_body;
- } else {
- $this->setAPIResponse('error', 'PlexLibraries Plugin - Error: Plex Error', 400);
- return false;
- }
- } catch (Requests_Exception $e) {
- $this->writeLog('error', 'PlexLibraries Plugin - Error: ' . $e->getMessage(), 'SYSTEM');
- $this->setAPIResponse('error', 'PlexLibraries Plugin - Error: ' . $e->getMessage(), 400);
- return false;
- }
- }
- }
- }
|