emby.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. <?php
  2. trait EmbyHomepageItem
  3. {
  4. public function embySettingsArray($infoOnly = false)
  5. {
  6. $homepageInformation = [
  7. 'name' => 'Emby',
  8. 'enabled' => strpos('personal', $this->config['license']) !== false,
  9. 'image' => 'plugins/images/tabs/emby.png',
  10. 'category' => 'Media Server',
  11. 'settingsArray' => __FUNCTION__
  12. ];
  13. if ($infoOnly) {
  14. return $homepageInformation;
  15. }
  16. $homepageSettings = [
  17. 'debug' => true,
  18. 'settings' => [
  19. 'Enable' => [
  20. $this->settingsOption('enable', 'homepageEmbyEnabled'),
  21. $this->settingsOption('auth', 'homepageEmbyAuth'),
  22. ],
  23. 'Connection' => [
  24. $this->settingsOption('url', 'embyURL'),
  25. $this->settingsOption('token', 'embyToken'),
  26. $this->settingsOption('disable-cert-check', 'embyDisableCertCheck'),
  27. $this->settingsOption('use-custom-certificate', 'embyUseCustomCertificate'),
  28. ],
  29. 'Active Streams' => [
  30. $this->settingsOption('enable', 'homepageEmbyStreams'),
  31. $this->settingsOption('auth', 'homepageEmbyStreamsAuth'),
  32. $this->settingsOption('switch', 'homepageShowStreamNames', ['label' => 'User Information']),
  33. $this->settingsOption('auth', 'homepageShowStreamNamesAuth'),
  34. $this->settingsOption('refresh', 'homepageStreamRefresh'),
  35. ],
  36. 'Recent Items' => [
  37. $this->settingsOption('enable', 'homepageEmbyRecent'),
  38. $this->settingsOption('auth', 'homepageEmbyRecentAuth'),
  39. $this->settingsOption('limit', 'homepageRecentLimit'),
  40. $this->settingsOption('refresh', 'homepageRecentRefresh'),
  41. ],
  42. 'Misc Options' => [
  43. $this->settingsOption('input', 'homepageEmbyLink', ['label' => 'Emby Homepage Link URL', 'help' => 'Available variables: {id} {serverId}']),
  44. $this->settingsOption('input', 'embyTabName', ['label' => 'Emby Tab Name', 'placeholder' => 'Only use if you have Emby in a reverse proxy']),
  45. $this->settingsOption('input', 'embyTabURL', ['label' => 'Emby Tab WAN URL', 'placeholder' => 'Only use if you have Emby in a reverse proxy']),
  46. $this->settingsOption('image-cache-quality', 'cacheImageSize'),
  47. ],
  48. 'Test Connection' => [
  49. $this->settingsOption('blank', null, ['label' => 'Please Save before Testing']),
  50. $this->settingsOption('test', 'emby'),
  51. ]
  52. ]
  53. ];
  54. return array_merge($homepageInformation, $homepageSettings);
  55. }
  56. public function testConnectionEmby()
  57. {
  58. if (empty($this->config['embyURL'])) {
  59. $this->setAPIResponse('error', 'Emby URL is not defined', 422);
  60. return false;
  61. }
  62. if (empty($this->config['embyToken'])) {
  63. $this->setAPIResponse('error', 'Emby Token is not defined', 422);
  64. return false;
  65. }
  66. $url = $this->qualifyURL($this->config['embyURL']);
  67. $url = $url . "/Users?api_key=" . $this->config['embyToken'];
  68. $options = $this->requestOptions($url, null, $this->config['embyDisableCertCheck'], $this->config['embyUseCustomCertificate']);
  69. try {
  70. $response = Requests::get($url, [], $options);
  71. if ($response->success) {
  72. $this->setAPIResponse('success', 'API Connection succeeded', 200);
  73. return true;
  74. } else {
  75. $this->setAPIResponse('error', 'Emby Connection Error', 500);
  76. return true;
  77. }
  78. } catch (Requests_Exception $e) {
  79. $this->setAPIResponse('error', $e->getMessage(), 500);
  80. return false;
  81. }
  82. }
  83. public function embyHomepagePermissions($key = null)
  84. {
  85. $permissions = [
  86. 'streams' => [
  87. 'enabled' => [
  88. 'homepageEmbyEnabled',
  89. 'homepageEmbyStreams'
  90. ],
  91. 'auth' => [
  92. 'homepageEmbyAuth',
  93. 'homepageEmbyStreamsAuth'
  94. ],
  95. 'not_empty' => [
  96. 'embyURL',
  97. 'embyToken'
  98. ]
  99. ],
  100. 'recent' => [
  101. 'enabled' => [
  102. 'homepageEmbyEnabled',
  103. 'homepageEmbyRecent'
  104. ],
  105. 'auth' => [
  106. 'homepageEmbyAuth',
  107. 'homepageEmbyRecentAuth'
  108. ],
  109. 'not_empty' => [
  110. 'embyURL',
  111. 'embyToken'
  112. ]
  113. ],
  114. 'metadata' => [
  115. 'enabled' => [
  116. 'homepageEmbyEnabled'
  117. ],
  118. 'auth' => [
  119. 'homepageEmbyAuth'
  120. ],
  121. 'not_empty' => [
  122. 'embyURL',
  123. 'embyToken'
  124. ]
  125. ]
  126. ];
  127. if (array_key_exists($key, $permissions)) {
  128. return $permissions[$key];
  129. } elseif ($key == 'all') {
  130. return $permissions;
  131. } else {
  132. return [];
  133. }
  134. }
  135. public function homepageOrderembynowplaying()
  136. {
  137. if ($this->homepageItemPermissions($this->embyHomepagePermissions('streams'))) {
  138. return '
  139. <div id="' . __FUNCTION__ . '">
  140. <div class="white-box homepage-loading-box"><h2 class="text-center" lang="en">Loading Now Playing...</h2></div>
  141. <script>
  142. // Emby Stream
  143. homepageStream("emby", "' . $this->config['homepageStreamRefresh'] . '");
  144. // End Emby Stream
  145. </script>
  146. </div>
  147. ';
  148. }
  149. }
  150. public function homepageOrderembyrecent()
  151. {
  152. if ($this->homepageItemPermissions($this->embyHomepagePermissions('recent'))) {
  153. return '
  154. <div id="' . __FUNCTION__ . '">
  155. <div class="white-box homepage-loading-box"><h2 class="text-center" lang="en">Loading Recent...</h2></div>
  156. <script>
  157. // Emby Recent
  158. homepageRecent("emby", "' . $this->config['homepageRecentRefresh'] . '");
  159. // End Emby Recent
  160. </script>
  161. </div>
  162. ';
  163. }
  164. }
  165. public function getEmbyHomepageStreams()
  166. {
  167. if (!$this->homepageItemPermissions($this->embyHomepagePermissions('streams'), true)) {
  168. return false;
  169. }
  170. $url = $this->qualifyURL($this->config['embyURL']);
  171. $url = $url . '/Sessions?api_key=' . $this->config['embyToken'] . '&Fields=Overview,People,Genres,CriticRating,Studios,Taglines';
  172. $options = $this->requestOptions($url, $this->config['homepageStreamRefresh'], $this->config['embyDisableCertCheck'], $this->config['embyUseCustomCertificate']);
  173. try {
  174. $response = Requests::get($url, [], $options);
  175. if ($response->success) {
  176. $items = array();
  177. $emby = json_decode($response->body, true);
  178. foreach ($emby as $child) {
  179. if (isset($child['NowPlayingItem']) || isset($child['Name'])) {
  180. $items[] = $this->resolveEmbyItem($child);
  181. }
  182. }
  183. $api['content'] = array_filter($items);
  184. $this->setAPIResponse('success', null, 200, $api);
  185. return $api;
  186. } else {
  187. $this->setAPIResponse('error', 'Emby Error Occurred', 500);
  188. return false;
  189. }
  190. } catch (Requests_Exception $e) {
  191. $this->writeLog('error', 'Emby Connect Function - Error: ' . $e->getMessage(), 'SYSTEM');
  192. $this->setAPIResponse('error', $e->getMessage(), 500);
  193. return false;
  194. }
  195. }
  196. public function getEmbyHomepageRecent()
  197. {
  198. if (!$this->homepageItemPermissions($this->embyHomepagePermissions('recent'), true)) {
  199. return false;
  200. }
  201. $url = $this->qualifyURL($this->config['embyURL']);
  202. $options = $this->requestOptions($url, $this->config['homepageRecentRefresh'], $this->config['embyDisableCertCheck'], $this->config['embyUseCustomCertificate']);
  203. $username = false;
  204. $showPlayed = false;
  205. $userId = 0;
  206. try {
  207. if (isset($this->user['username'])) {
  208. $username = strtolower($this->user['username']);
  209. }
  210. // Get A User
  211. $userIds = $url . "/Users?api_key=" . $this->config['embyToken'];
  212. $response = Requests::get($userIds, [], $options);
  213. if ($response->success) {
  214. $emby = json_decode($response->body, true);
  215. foreach ($emby as $value) { // Scan for admin user
  216. if (isset($value['Policy']) && isset($value['Policy']['IsAdministrator']) && $value['Policy']['IsAdministrator']) {
  217. $userId = $value['Id'];
  218. }
  219. if ($username && strtolower($value['Name']) == $username) {
  220. $userId = $value['Id'];
  221. $showPlayed = false;
  222. break;
  223. }
  224. }
  225. $url = $url . '/Users/' . $userId . '/Items/Latest?EnableImages=true&Limit=' . $this->config['homepageRecentLimit'] . '&api_key=' . $this->config['embyToken'] . ($showPlayed ? '' : '&IsPlayed=false') . '&Fields=Overview,People,Genres,CriticRating,Studios,Taglines&IncludeItemTypes=Series,Episode,MusicAlbum,Audio,Movie,Video';
  226. } else {
  227. $this->setAPIResponse('error', 'Emby Error Occurred', 500);
  228. return false;
  229. }
  230. $response = Requests::get($url, [], $options);
  231. if ($response->success) {
  232. $items = array();
  233. $emby = json_decode($response->body, true);
  234. foreach ($emby as $child) {
  235. if (isset($child['NowPlayingItem']) || isset($child['Name'])) {
  236. $items[] = $this->resolveEmbyItem($child);
  237. }
  238. }
  239. $api['content'] = array_filter($items);
  240. $this->setAPIResponse('success', null, 200, $api);
  241. return $api;
  242. } else {
  243. $this->setAPIResponse('error', 'Emby Error Occurred', 500);
  244. return false;
  245. }
  246. } catch (Requests_Exception $e) {
  247. $this->writeLog('error', 'Emby Connect Function - Error: ' . $e->getMessage(), 'SYSTEM');
  248. $this->setAPIResponse('error', $e->getMessage(), 500);
  249. return false;
  250. }
  251. }
  252. public function getEmbyHomepageMetadata($array)
  253. {
  254. if (!$this->homepageItemPermissions($this->embyHomepagePermissions('metadata'), true)) {
  255. return false;
  256. }
  257. $key = $array['key'] ?? null;
  258. if (!$key) {
  259. $this->setAPIResponse('error', 'Emby Metadata key is not defined', 422);
  260. return false;
  261. }
  262. $url = $this->qualifyURL($this->config['embyURL']);
  263. $options = $this->requestOptions($url, 60, $this->config['embyDisableCertCheck'], $this->config['embyUseCustomCertificate']);
  264. $username = false;
  265. $showPlayed = false;
  266. $userId = 0;
  267. try {
  268. if (isset($this->user['username'])) {
  269. $username = strtolower($this->user['username']);
  270. }
  271. // Get A User
  272. $userIds = $url . "/Users?api_key=" . $this->config['embyToken'];
  273. $response = Requests::get($userIds, [], $options);
  274. if ($response->success) {
  275. $emby = json_decode($response->body, true);
  276. foreach ($emby as $value) { // Scan for admin user
  277. if (isset($value['Policy']) && isset($value['Policy']['IsAdministrator']) && $value['Policy']['IsAdministrator']) {
  278. $userId = $value['Id'];
  279. }
  280. if ($username && strtolower($value['Name']) == $username) {
  281. $userId = $value['Id'];
  282. $showPlayed = false;
  283. break;
  284. }
  285. }
  286. $url = $url . '/Users/' . $userId . '/Items/' . $key . '?EnableImages=true&Limit=' . $this->config['homepageRecentLimit'] . '&api_key=' . $this->config['embyToken'] . ($showPlayed ? '' : '&IsPlayed=false') . '&Fields=Overview,People,Genres,CriticRating,Studios,Taglines';
  287. } else {
  288. $this->setAPIResponse('error', 'Emby Error Occurred', 500);
  289. return false;
  290. }
  291. $response = Requests::get($url, [], $options);
  292. if ($response->success) {
  293. $items = array();
  294. $emby = json_decode($response->body, true);
  295. if (isset($emby['NowPlayingItem']) || isset($emby['Name'])) {
  296. $items[] = $this->resolveEmbyItem($emby);
  297. }
  298. $api['content'] = array_filter($items);
  299. $this->setAPIResponse('success', null, 200, $api);
  300. return $api;
  301. } else {
  302. $this->setAPIResponse('error', 'Emby Error Occurred', 500);
  303. return false;
  304. }
  305. } catch (Requests_Exception $e) {
  306. $this->writeLog('error', 'Emby Connect Function - Error: ' . $e->getMessage(), 'SYSTEM');
  307. $this->setAPIResponse('error', $e->getMessage(), 500);
  308. return false;
  309. }
  310. }
  311. public function resolveEmbyItem($itemDetails)
  312. {
  313. $item = isset($itemDetails['NowPlayingItem']['Id']) ? $itemDetails['NowPlayingItem'] : $itemDetails;
  314. // Static Height & Width
  315. $height = $this->getCacheImageSize('h');
  316. $width = $this->getCacheImageSize('w');
  317. $nowPlayingHeight = $this->getCacheImageSize('nph');
  318. $nowPlayingWidth = $this->getCacheImageSize('npw');
  319. $actorHeight = 450;
  320. $actorWidth = 300;
  321. // Cache Directories
  322. $cacheDirectory = dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'images' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR;
  323. $cacheDirectoryWeb = 'plugins/images/cache/';
  324. // Types
  325. //$embyItem['array-item'] = $item;
  326. //$embyItem['array-itemdetails'] = $itemDetails;
  327. switch (@$item['Type']) {
  328. case 'Series':
  329. $embyItem['type'] = 'tv';
  330. $embyItem['title'] = $item['Name'];
  331. $embyItem['secondaryTitle'] = '';
  332. $embyItem['summary'] = '';
  333. $embyItem['ratingKey'] = $item['Id'];
  334. $embyItem['thumb'] = $item['Id'];
  335. $embyItem['key'] = $item['Id'] . "-list";
  336. $embyItem['nowPlayingThumb'] = $item['Id'];
  337. $embyItem['nowPlayingKey'] = $item['Id'] . "-np";
  338. $embyItem['metadataKey'] = $item['Id'];
  339. $embyItem['nowPlayingImageType'] = isset($item['ImageTags']['Thumb']) ? 'Thumb' : (isset($item['BackdropImageTags'][0]) ? 'Backdrop' : '');
  340. break;
  341. case 'Episode':
  342. $embyItem['type'] = 'tv';
  343. $embyItem['title'] = $item['SeriesName'];
  344. $embyItem['secondaryTitle'] = '';
  345. $embyItem['summary'] = '';
  346. $embyItem['ratingKey'] = $item['Id'];
  347. $embyItem['thumb'] = (isset($item['SeriesId']) ? $item['SeriesId'] : $item['Id']);
  348. $embyItem['key'] = (isset($item['SeriesId']) ? $item['SeriesId'] : $item['Id']) . "-list";
  349. $embyItem['nowPlayingThumb'] = isset($item['ParentThumbItemId']) ? $item['ParentThumbItemId'] : (isset($item['ParentBackdropItemId']) ? $item['ParentBackdropItemId'] : false);
  350. $embyItem['nowPlayingKey'] = isset($item['ParentThumbItemId']) ? $item['ParentThumbItemId'] . '-np' : (isset($item['ParentBackdropItemId']) ? $item['ParentBackdropItemId'] . '-np' : false);
  351. $embyItem['metadataKey'] = $item['Id'];
  352. $embyItem['nowPlayingImageType'] = isset($item['ImageTags']['Thumb']) ? 'Thumb' : (isset($item['ParentBackdropImageTags'][0]) ? 'Backdrop' : '');
  353. $embyItem['nowPlayingTitle'] = @$item['SeriesName'] . ' - ' . @$item['Name'];
  354. $embyItem['nowPlayingBottom'] = 'S' . @$item['ParentIndexNumber'] . ' · E' . @$item['IndexNumber'];
  355. break;
  356. case 'MusicAlbum':
  357. case 'Audio':
  358. $embyItem['type'] = 'music';
  359. $embyItem['title'] = $item['Name'];
  360. $embyItem['secondaryTitle'] = '';
  361. $embyItem['summary'] = '';
  362. $embyItem['ratingKey'] = $item['Id'];
  363. $embyItem['thumb'] = $item['Id'];
  364. $embyItem['key'] = $item['Id'] . "-list";
  365. $embyItem['nowPlayingThumb'] = (isset($item['AlbumId']) ? $item['AlbumId'] : @$item['ParentBackdropItemId']);
  366. $embyItem['nowPlayingKey'] = $item['Id'] . "-np";
  367. $embyItem['metadataKey'] = isset($item['AlbumId']) ? $item['AlbumId'] : $item['Id'];
  368. $embyItem['nowPlayingImageType'] = (isset($item['ParentBackdropItemId']) ? "Primary" : "Backdrop");
  369. $embyItem['nowPlayingTitle'] = @$item['AlbumArtist'] . ' - ' . @$item['Name'];
  370. $embyItem['nowPlayingBottom'] = @$item['Album'];
  371. break;
  372. case 'Movie':
  373. $embyItem['type'] = 'movie';
  374. $embyItem['title'] = $item['Name'];
  375. $embyItem['secondaryTitle'] = '';
  376. $embyItem['summary'] = '';
  377. $embyItem['ratingKey'] = $item['Id'];
  378. $embyItem['thumb'] = $item['Id'];
  379. $embyItem['key'] = $item['Id'] . "-list";
  380. $embyItem['nowPlayingThumb'] = $item['Id'];
  381. $embyItem['nowPlayingKey'] = $item['Id'] . "-np";
  382. $embyItem['metadataKey'] = $item['Id'];
  383. $embyItem['nowPlayingImageType'] = isset($item['ImageTags']['Thumb']) ? "Thumb" : (isset($item['BackdropImageTags']) ? "Backdrop" : false);
  384. $embyItem['nowPlayingTitle'] = @$item['Name'];
  385. $embyItem['nowPlayingBottom'] = @$item['ProductionYear'];
  386. break;
  387. case 'Video':
  388. $embyItem['type'] = 'video';
  389. $embyItem['title'] = $item['Name'];
  390. $embyItem['secondaryTitle'] = '';
  391. $embyItem['summary'] = '';
  392. $embyItem['ratingKey'] = $item['Id'];
  393. $embyItem['thumb'] = $item['Id'];
  394. $embyItem['key'] = $item['Id'] . "-list";
  395. $embyItem['nowPlayingThumb'] = $item['Id'];
  396. $embyItem['nowPlayingKey'] = $item['Id'] . "-np";
  397. $embyItem['metadataKey'] = $item['Id'];
  398. $embyItem['nowPlayingImageType'] = isset($item['ImageTags']['Thumb']) ? "Thumb" : (isset($item['BackdropImageTags']) ? "Backdrop" : false);
  399. $embyItem['nowPlayingTitle'] = @$item['Name'];
  400. $embyItem['nowPlayingBottom'] = @$item['ProductionYear'];
  401. break;
  402. default:
  403. return false;
  404. }
  405. $embyItem['uid'] = $item['Id'];
  406. $embyItem['imageType'] = (isset($item['ImageTags']['Primary']) ? "Primary" : false);
  407. $embyItem['elapsed'] = isset($itemDetails['PlayState']['PositionTicks']) && $itemDetails['PlayState']['PositionTicks'] !== '0' ? (int)$itemDetails['PlayState']['PositionTicks'] : null;
  408. $embyItem['duration'] = isset($itemDetails['NowPlayingItem']['RunTimeTicks']) ? (int)$itemDetails['NowPlayingItem']['RunTimeTicks'] : (int)(isset($item['RunTimeTicks']) ? $item['RunTimeTicks'] : '');
  409. $embyItem['watched'] = ($embyItem['elapsed'] && $embyItem['duration'] ? floor(($embyItem['elapsed'] / $embyItem['duration']) * 100) : 0);
  410. $embyItem['transcoded'] = isset($itemDetails['TranscodingInfo']['CompletionPercentage']) ? floor((int)$itemDetails['TranscodingInfo']['CompletionPercentage']) : 100;
  411. $embyItem['stream'] = @$itemDetails['PlayState']['PlayMethod'];
  412. $embyItem['id'] = $item['ServerId'];
  413. $embyItem['session'] = @$itemDetails['DeviceId'];
  414. $embyItem['bandwidth'] = isset($itemDetails['TranscodingInfo']['Bitrate']) ? $itemDetails['TranscodingInfo']['Bitrate'] / 1000 : '';
  415. $embyItem['bandwidthType'] = 'wan';
  416. $embyItem['sessionType'] = (@$itemDetails['PlayState']['PlayMethod'] == 'Transcode') ? 'Transcoding' : 'Direct Playing';
  417. $embyItem['state'] = ((@(string)$itemDetails['PlayState']['IsPaused'] == '1') ? "pause" : "play");
  418. $embyItem['user'] = ($this->config['homepageShowStreamNames'] && $this->qualifyRequest($this->config['homepageShowStreamNamesAuth'])) ? @(string)$itemDetails['UserName'] : "";
  419. $embyItem['userThumb'] = '';
  420. $embyItem['userAddress'] = (isset($itemDetails['RemoteEndPoint']) ? $itemDetails['RemoteEndPoint'] : "x.x.x.x");
  421. $embyVariablesForLink = [
  422. '{id}' => $embyItem['uid'],
  423. '{serverId}' => $embyItem['id']
  424. ];
  425. $embyItem['address'] = $this->userDefinedIdReplacementLink($this->config['homepageEmbyLink'], $embyVariablesForLink);
  426. $embyItem['nowPlayingOriginalImage'] = 'api/v2/homepage/image?source=emby&type=' . $embyItem['nowPlayingImageType'] . '&img=' . $embyItem['nowPlayingThumb'] . '&height=' . $nowPlayingHeight . '&width=' . $nowPlayingWidth . '&key=' . $embyItem['nowPlayingKey'] . '$' . $this->randString();
  427. $embyItem['originalImage'] = 'api/v2/homepage/image?source=emby&type=' . $embyItem['imageType'] . '&img=' . $embyItem['thumb'] . '&height=' . $height . '&width=' . $width . '&key=' . $embyItem['key'] . '$' . $this->randString();
  428. $embyItem['openTab'] = $this->config['embyTabURL'] && $this->config['embyTabName'] ? true : false;
  429. $embyItem['tabName'] = $this->config['embyTabName'] ? $this->config['embyTabName'] : '';
  430. // Stream info
  431. $embyItem['userStream'] = array(
  432. 'platform' => @(string)$itemDetails['Client'],
  433. 'product' => @(string)$itemDetails['Client'],
  434. 'device' => @(string)$itemDetails['DeviceName'],
  435. 'stream' => @$itemDetails['PlayState']['PlayMethod'],
  436. 'videoResolution' => isset($itemDetails['NowPlayingItem']['MediaStreams'][0]['Width']) ? $itemDetails['NowPlayingItem']['MediaStreams'][0]['Width'] : '',
  437. 'throttled' => false,
  438. 'sourceVideoCodec' => isset($itemDetails['NowPlayingItem']['MediaStreams'][0]) ? $itemDetails['NowPlayingItem']['MediaStreams'][0]['Codec'] : '',
  439. 'videoCodec' => @$itemDetails['TranscodingInfo']['VideoCodec'],
  440. 'audioCodec' => @$itemDetails['TranscodingInfo']['AudioCodec'],
  441. 'sourceAudioCodec' => isset($itemDetails['NowPlayingItem']['MediaStreams'][1]) ? $itemDetails['NowPlayingItem']['MediaStreams'][1]['Codec'] : (isset($itemDetails['NowPlayingItem']['MediaStreams'][0]) ? $itemDetails['NowPlayingItem']['MediaStreams'][0]['Codec'] : ''),
  442. 'videoDecision' => $this->streamType(@$itemDetails['PlayState']['PlayMethod']),
  443. 'audioDecision' => $this->streamType(@$itemDetails['PlayState']['PlayMethod']),
  444. 'container' => isset($itemDetails['NowPlayingItem']['Container']) ? $itemDetails['NowPlayingItem']['Container'] : '',
  445. 'audioChannels' => @$itemDetails['TranscodingInfo']['AudioChannels']
  446. );
  447. // Genre catch all
  448. if (isset($item['Genres'])) {
  449. $genres = array();
  450. foreach ($item['Genres'] as $genre) {
  451. $genres[] = $genre;
  452. }
  453. }
  454. // Actor catch all
  455. if (isset($item['People'])) {
  456. $actors = array();
  457. foreach ($item['People'] as $key => $value) {
  458. if (@$value['PrimaryImageTag'] && @$value['Role']) {
  459. if (file_exists($cacheDirectory . (string)$value['Id'] . '-cast.jpg')) {
  460. $actorImage = $cacheDirectoryWeb . (string)$value['Id'] . '-cast.jpg';
  461. }
  462. if (file_exists($cacheDirectory . (string)$value['Id'] . '-cast.jpg') && (time() - 604800) > filemtime($cacheDirectory . (string)$value['Id'] . '-cast.jpg') || !file_exists($cacheDirectory . (string)$value['Id'] . '-cast.jpg')) {
  463. $actorImage = 'api/v2/homepage/image?source=emby&type=Primary&img=' . (string)$value['Id'] . '&height=' . $actorHeight . '&width=' . $actorWidth . '&key=' . (string)$value['Id'] . '-cast';
  464. }
  465. $actors[] = array(
  466. 'name' => (string)$value['Name'],
  467. 'role' => (string)$value['Role'],
  468. 'thumb' => $actorImage
  469. );
  470. }
  471. }
  472. }
  473. // Metadata information
  474. $embyItem['metadata'] = array(
  475. 'guid' => $item['Id'],
  476. 'summary' => @(string)$item['Overview'],
  477. 'rating' => @(string)$item['CommunityRating'],
  478. 'duration' => @(string)$item['RunTimeTicks'],
  479. 'originallyAvailableAt' => @(string)$item['PremiereDate'],
  480. 'year' => (string)isset($item['ProductionYear']) ? $item['ProductionYear'] : '',
  481. //'studio' => (string)$item['studio'],
  482. 'tagline' => @(string)$item['Taglines'][0],
  483. 'genres' => (isset($item['Genres'])) ? $genres : '',
  484. 'actors' => (isset($item['People'])) ? $actors : ''
  485. );
  486. if (file_exists($cacheDirectory . $embyItem['nowPlayingKey'] . '.jpg')) {
  487. $embyItem['nowPlayingImageURL'] = $cacheDirectoryWeb . $embyItem['nowPlayingKey'] . '.jpg';
  488. }
  489. if (file_exists($cacheDirectory . $embyItem['key'] . '.jpg')) {
  490. $embyItem['imageURL'] = $cacheDirectoryWeb . $embyItem['key'] . '.jpg';
  491. }
  492. if (file_exists($cacheDirectory . $embyItem['nowPlayingKey'] . '.jpg') && (time() - 604800) > filemtime($cacheDirectory . $embyItem['nowPlayingKey'] . '.jpg') || !file_exists($cacheDirectory . $embyItem['nowPlayingKey'] . '.jpg')) {
  493. $embyItem['nowPlayingImageURL'] = 'api/v2/homepage/image?source=emby&type=' . $embyItem['nowPlayingImageType'] . '&img=' . $embyItem['nowPlayingThumb'] . '&height=' . $nowPlayingHeight . '&width=' . $nowPlayingWidth . '&key=' . $embyItem['nowPlayingKey'] . '';
  494. }
  495. if (file_exists($cacheDirectory . $embyItem['key'] . '.jpg') && (time() - 604800) > filemtime($cacheDirectory . $embyItem['key'] . '.jpg') || !file_exists($cacheDirectory . $embyItem['key'] . '.jpg')) {
  496. $embyItem['imageURL'] = 'api/v2/homepage/image?source=emby&type=' . $embyItem['imageType'] . '&img=' . $embyItem['thumb'] . '&height=' . $height . '&width=' . $width . '&key=' . $embyItem['key'] . '';
  497. }
  498. if (!$embyItem['nowPlayingThumb']) {
  499. $embyItem['nowPlayingOriginalImage'] = $embyItem['nowPlayingImageURL'] = "plugins/images/cache/no-np.png";
  500. $embyItem['nowPlayingKey'] = "no-np";
  501. }
  502. if (!$embyItem['thumb']) {
  503. $embyItem['originalImage'] = $embyItem['imageURL'] = "plugins/images/cache/no-list.png";
  504. $embyItem['key'] = "no-list";
  505. }
  506. if (isset($useImage)) {
  507. $embyItem['useImage'] = $useImage;
  508. }
  509. return $embyItem;
  510. }
  511. }