option-functions.php 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336
  1. <?php
  2. trait OptionsFunction
  3. {
  4. public function settingsOptionGroup($options = [])
  5. {
  6. $settings = [];
  7. foreach ($options as $option) {
  8. $optionType = $option[0] ? $option[0] : false;
  9. $optionName = $option[1] ? $option[1] : null;
  10. $optionExtras = $option[2] ? $option[2] : [];
  11. $setting = $this->settingsOption($optionType, $optionName, $optionExtras);
  12. array_push($settings, $setting);
  13. }
  14. return $settings;
  15. }
  16. public function settingsOption($type, $name = null, $extras = null)
  17. {
  18. $type = strtolower(str_replace('-', '', $type));
  19. $setting = [
  20. 'name' => $name,
  21. 'value' => $this->config[$name] ?? ''
  22. ];
  23. switch ($type) {
  24. case 'enable':
  25. $settingMerge = [
  26. 'type' => 'switch',
  27. 'label' => 'Enable',
  28. ];
  29. break;
  30. case 'auth':
  31. $this->setGroupOptionsVariable();
  32. $settingMerge = [
  33. 'type' => 'select',
  34. 'label' => 'Minimum Authentication',
  35. 'options' => $this->groupOptions
  36. ];
  37. break;
  38. case 'refresh':
  39. $settingMerge = [
  40. 'type' => 'select',
  41. 'label' => 'Refresh Seconds',
  42. 'options' => $this->timeOptions()
  43. ];
  44. break;
  45. case 'combine':
  46. case 'combine-downloader':
  47. $settingMerge = [
  48. 'type' => 'switch',
  49. 'label' => 'Add to Combined Downloader',
  50. ];
  51. break;
  52. case 'test':
  53. $settingMerge = [
  54. 'type' => 'button',
  55. 'label' => 'Test Connection',
  56. 'icon' => 'fa fa-flask',
  57. 'class' => 'pull-right',
  58. 'text' => 'Test Connection',
  59. 'attr' => 'onclick="testAPIConnection(\'' . $name . '\')"',
  60. 'help' => 'Remember! Please save before using the test button!'
  61. ];
  62. break;
  63. case 'url':
  64. $settingMerge = [
  65. 'type' => 'input',
  66. 'label' => 'URL',
  67. 'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
  68. 'placeholder' => 'http(s)://hostname:port'
  69. ];
  70. break;
  71. case 'multipleurl':
  72. $settingMerge = [
  73. 'type' => 'select2',
  74. 'class' => 'select2-multiple',
  75. 'id' => $name . '-select-' . $this->random_ascii_string(6),
  76. 'label' => 'Multiple URL\'s',
  77. 'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
  78. 'placeholder' => 'http(s)://hostname:port',
  79. 'options' => $this->makeOptionsFromValues($this->config[$name]),
  80. 'settings' => '{tags: true, selectOnClose: true, closeOnSelect: true, allowClear: true}',
  81. ];
  82. break;
  83. case 'multiple':
  84. $settingMerge = [
  85. 'type' => 'select2',
  86. 'class' => 'select2-multiple',
  87. 'id' => $name . '-select-' . $this->random_ascii_string(6),
  88. 'label' => 'Multiple Values\'s',
  89. 'options' => $this->makeOptionsFromValues($this->config[$name]),
  90. 'settings' => '{tags: true, selectOnClose: true, closeOnSelect: true, allowClear: true}',
  91. ];
  92. break;
  93. case 'cron':
  94. $settingMerge = [
  95. 'type' => 'cron',
  96. 'label' => 'Cron Schedule',
  97. 'help' => 'You may use either Cron format or - @hourly, @daily, @monthly',
  98. 'placeholder' => '* * * * *'
  99. ];
  100. break;
  101. case 'folder':
  102. $settingMerge = [
  103. 'type' => 'folder',
  104. 'label' => 'Save Path',
  105. 'help' => 'Folder path',
  106. 'placeholder' => '/path/to/folder'
  107. ];
  108. break;
  109. case 'cronfile':
  110. $path = $this->root . DIRECTORY_SEPARATOR . 'cron.php';
  111. $server = $this->serverIP();
  112. $installInstruction = ($this->docker) ?
  113. '<p lang="en">No action needed. Organizr\'s docker image comes with the Cron job built-in</p>' :
  114. '<p lang="en">Setup a Cron job so it\'s call will originate from either the server\'s IP address or a local IP address. Please use the following information to set up the Cron Job correctly.</p>
  115. <h5>Cron Information</h5>
  116. <ul class="list-icons">
  117. <li><i class="fa fa-caret-right text-info"></i> <b lang="en">Schedule</b> <small>* * * * *</small></li>
  118. <li><i class="fa fa-caret-right text-info"></i> <b lang="en">File Path</b> <small>' . $path . '</small></li>
  119. </ul>
  120. <h5>Command Examples</h5>
  121. <ul class="list-icons">
  122. <li><i class="ti-angle-right"></i> * * * * * /path/to/php ' . $path . '</li>
  123. <li><i class="ti-angle-right"></i> * * * * * curl -XGET -sL "http://' . $server . '/cron.php"</li>
  124. </ul>
  125. ';
  126. $settingMerge = [
  127. 'type' => 'html',
  128. 'override' => 12,
  129. 'label' => '',
  130. 'html' => '
  131. <div class="row">
  132. <div class="col-lg-12">
  133. <div class="panel panel-info">
  134. <div class="panel-heading">
  135. <span lang="en">Organizr Enable Cron Instructions</span>
  136. </div>
  137. <div class="panel-wrapper collapse in" aria-expanded="true">
  138. <div class="panel-body">
  139. <h3 lang="en">Instructions for your install type</h3>
  140. <span>' . $installInstruction . '</span>
  141. <button type="button" onclick="checkCronFile();" class="btn btn-outline btn-info btn-lg btn-block" lang="en">Check Cron Status</button>
  142. <div class="m-t-15 hidden cron-results-container">
  143. <div class="well">
  144. <pre class="cron-results"></pre>
  145. </div>
  146. </div>
  147. </div>
  148. </div>
  149. </div>
  150. </div>
  151. </div>
  152. '
  153. ];
  154. break;
  155. case 'username':
  156. $settingMerge = [
  157. 'type' => 'input',
  158. 'label' => 'Username',
  159. ];
  160. break;
  161. case 'password':
  162. $settingMerge = [
  163. 'type' => 'password',
  164. 'label' => 'Password',
  165. ];
  166. break;
  167. case 'passwordalt':
  168. $settingMerge = [
  169. 'type' => 'password-alt',
  170. 'label' => 'Password',
  171. ];
  172. break;
  173. case 'passwordaltcopy':
  174. $settingMerge = [
  175. 'type' => 'password-alt-copy',
  176. 'label' => 'Password',
  177. ];
  178. break;
  179. case 'apikey':
  180. case 'token':
  181. $settingMerge = [
  182. 'type' => 'password-alt',
  183. 'label' => 'API Key/Token',
  184. ];
  185. break;
  186. case 'multipleapikey':
  187. case 'multipletoken':
  188. $settingMerge = [
  189. 'type' => 'select2',
  190. 'class' => 'select2-multiple',
  191. 'id' => $name . '-select-' . $this->random_ascii_string(6),
  192. 'label' => 'Multiple API Key/Token\'s',
  193. 'options' => $this->makeOptionsFromValues($this->config[$name]),
  194. 'settings' => '{tags: true, theme: "default", selectionCssClass: "password-alt", selectOnClose: true, closeOnSelect: true, allowClear: true}',
  195. ];
  196. break;
  197. case 'notice':
  198. $settingMerge = [
  199. 'type' => 'html',
  200. 'override' => 12,
  201. 'label' => '',
  202. 'html' => '
  203. <div class="row">
  204. <div class="col-lg-12">
  205. <div class="panel panel-' . ($extras['notice'] ?? 'info') . '">
  206. <div class="panel-heading">
  207. <span lang="en">' . ($extras['title'] ?? 'Attention') . '</span>
  208. </div>
  209. <div class="panel-wrapper collapse in" aria-expanded="true">
  210. <div class="panel-body">
  211. <span lang="en">' . ($extras['body'] ?? '') . '</span>
  212. <span>' . ($extras['bodyHTML'] ?? '') . '</span>
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. </div>
  218. '
  219. ];
  220. break;
  221. case 'socks':
  222. $settingMerge = [
  223. 'type' => 'html',
  224. 'override' => 12,
  225. 'label' => '',
  226. 'html' => '
  227. <div class="panel panel-default">
  228. <div class="panel-wrapper collapse in">
  229. <div class="panel-body">' . $this->socksHeadingHTML($name) . '</div>
  230. </div>
  231. </div>'
  232. ];
  233. break;
  234. case 'about':
  235. $settingMerge = [
  236. 'type' => 'html',
  237. 'override' => 12,
  238. 'label' => '',
  239. 'html' => '
  240. <div class="panel panel-default">
  241. <div class="panel-wrapper collapse in">
  242. <div class="panel-body">
  243. <h3 lang="en">' . ucwords($name) . ' Homepage Item</h3>
  244. <p lang="en">' . $extras["about"] . '</p>
  245. </div>
  246. </div>
  247. </div>'
  248. ];
  249. break;
  250. case 'title':
  251. $settingMerge = [
  252. 'type' => 'input',
  253. 'label' => 'Title',
  254. 'help' => 'Sets the title of this homepage module',
  255. ];
  256. break;
  257. case 'toggletitle':
  258. $settingMerge = [
  259. 'type' => 'switch',
  260. 'label' => 'Toggle Title',
  261. 'help' => 'Shows/hides the title of this homepage module'
  262. ];
  263. break;
  264. case 'disablecertcheck':
  265. $settingMerge = [
  266. 'type' => 'switch',
  267. 'label' => 'Disable Certificate Check',
  268. ];
  269. break;
  270. case 'usecustomcertificate':
  271. $settingMerge = [
  272. 'type' => 'switch',
  273. 'label' => 'Use Custom Certificate',
  274. ];
  275. break;
  276. case 'hideseeding':
  277. $settingMerge = [
  278. 'type' => 'switch',
  279. 'label' => 'Hide Seeding',
  280. ];
  281. break;
  282. case 'hidecompleted':
  283. $settingMerge = [
  284. 'type' => 'switch',
  285. 'label' => 'Hide Completed',
  286. ];
  287. break;
  288. case 'hidestatus':
  289. $settingMerge = [
  290. 'type' => 'switch',
  291. 'label' => 'Hide Status',
  292. ];
  293. break;
  294. case 'limit':
  295. $settingMerge = [
  296. 'type' => 'number',
  297. 'label' => 'Item Limit',
  298. ];
  299. break;
  300. case 'mediasearchserver':
  301. $settingMerge = [
  302. 'type' => 'select',
  303. 'label' => 'Media Search Server',
  304. 'options' => $this->mediaServerOptions()
  305. ];
  306. break;
  307. case 'imagecachequality':
  308. $settingMerge = [
  309. 'type' => 'select',
  310. 'label' => 'Image Cache Quality',
  311. 'options' => [
  312. [
  313. 'name' => 'Low',
  314. 'value' => '.5'
  315. ],
  316. [
  317. 'name' => '1x',
  318. 'value' => '1'
  319. ],
  320. [
  321. 'name' => '2x',
  322. 'value' => '2'
  323. ],
  324. [
  325. 'name' => '3x',
  326. 'value' => '3'
  327. ]
  328. ]
  329. ];
  330. break;
  331. case 'blank':
  332. $settingMerge = [
  333. 'type' => 'blank',
  334. 'label' => '',
  335. ];
  336. break;
  337. case 'plexlibraryexclude':
  338. $settingMerge = [
  339. 'type' => 'select2',
  340. 'class' => 'select2-multiple',
  341. 'id' => $name . '-exclude-select-' . $this->random_ascii_string(6),
  342. 'label' => 'Libraries to Exclude',
  343. 'options' => $extras['options']
  344. ];
  345. break;
  346. case 'plexlibraryinclude':
  347. $settingMerge = [
  348. 'type' => 'select2',
  349. 'class' => 'select2-multiple',
  350. 'id' => $name . '-include-select-' . $this->random_ascii_string(6),
  351. 'label' => 'Libraries to Include',
  352. 'options' => $extras['options']
  353. ];
  354. break;
  355. // HTML ITEMS
  356. // precodeeditor possibly not needed anymore
  357. case 'precodeeditor':
  358. $settingMerge = [
  359. 'type' => 'textbox',
  360. 'class' => 'hidden ' . $name . 'Textarea',
  361. 'label' => '',
  362. ];
  363. break;
  364. case 'codeeditor':
  365. $mode = strtolower($extras['mode'] ?? 'css');
  366. switch ($mode) {
  367. case 'html':
  368. case 'javascript':
  369. $mode = 'ace/mode/' . $mode;
  370. break;
  371. case 'js':
  372. $mode = 'ace/mode/javascript';
  373. break;
  374. default:
  375. $mode = 'ace/mode/css';
  376. break;
  377. }
  378. $settingMerge = [
  379. 'type' => 'html',
  380. 'override' => 12,
  381. 'label' => 'Custom Code',
  382. 'html' => '
  383. <textarea data-changed="false" class="form-control hidden ' . $name . 'Textarea" name="' . $name . '" data-type="textbox" autocomplete="new-password">' . $this->config[$name] . '</textarea>
  384. <div id="' . $name . 'Editor" style="height:300px">' . htmlentities($this->config[$name]) . '</div>
  385. <script>
  386. let mode = ace.require("' . $mode . '").Mode;
  387. ' . $name . ' = ace.edit("' . $name . 'Editor");
  388. ' . $name . '.session.setMode(new mode());
  389. ' . $name . '.setTheme("ace/theme/idle_fingers");
  390. ' . $name . '.setShowPrintMargin(false);
  391. ' . $name . '.session.on("change", function(delta) { $(".' . $name . 'Textarea").val(' . $name . '.getValue()); $(".' . $name . 'Textarea").trigger("change") });
  392. </script>
  393. '
  394. ];
  395. break;
  396. // CALENDAR ITEMS
  397. case 'calendarstart':
  398. $settingMerge = [
  399. 'type' => 'number',
  400. 'label' => '# of Days Before'
  401. ];
  402. break;
  403. case 'calendarend':
  404. $settingMerge = [
  405. 'type' => 'number',
  406. 'label' => '# of Days After'
  407. ];
  408. break;
  409. case 'calendarstartingday':
  410. case 'calendarstartday':
  411. case 'calendarstart':
  412. $settingMerge = [
  413. 'type' => 'select',
  414. 'label' => 'Start Day',
  415. 'options' => $this->daysOptions()
  416. ];
  417. break;
  418. case 'calendardefaultview':
  419. $settingMerge = [
  420. 'type' => 'select',
  421. 'label' => 'Default View',
  422. 'options' => $this->calendarDefaultOptions()
  423. ];
  424. break;
  425. case 'calendartimeformat':
  426. $settingMerge = [
  427. 'type' => 'select',
  428. 'label' => 'Time Format',
  429. 'options' => $this->timeFormatOptions()
  430. ];
  431. break;
  432. case 'calendarlocale':
  433. $settingMerge = [
  434. 'type' => 'select',
  435. 'label' => 'Locale',
  436. 'options' => $this->calendarLocaleOptions()
  437. ];
  438. break;
  439. case 'calendarlimit':
  440. $settingMerge = [
  441. 'type' => 'select',
  442. 'label' => 'Items Per Day',
  443. 'options' => $this->limitOptions()
  444. ];
  445. break;
  446. case 'color':
  447. $settingMerge = [
  448. 'type' => 'input',
  449. 'label' => 'Color',
  450. 'class' => 'pick-a-color-custom-options',
  451. 'attr' => 'data-original="' . $this->config[$name] . '"'
  452. ];
  453. break;
  454. case 'calendarlinkurl':
  455. $settingMerge = [
  456. 'type' => 'select',
  457. 'label' => 'Target URL',
  458. 'help' => 'Set the primary URL used when clicking on calendar icon.',
  459. 'options' => $this->makeOptionsFromValues($this->config[str_replace('CalendarLink','',$name).'URL'], true, 'Use Default'),
  460. ];
  461. break;
  462. default:
  463. $settingMerge = [
  464. 'type' => strtolower($type),
  465. 'label' => ''
  466. ];
  467. break;
  468. }
  469. $setting = array_merge($settingMerge, $setting);
  470. if ($extras) {
  471. if (gettype($extras) == 'array') {
  472. $setting = array_merge($setting, $extras);
  473. }
  474. }
  475. return $setting;
  476. }
  477. public function makeOptionsFromValues($values = null, $appendBlank = null, $blankLabel = null)
  478. {
  479. if ($appendBlank === true){
  480. $formattedValues[] = [
  481. 'name' => (!empty($blankLabel)) ? $blankLabel : 'Select option...',
  482. 'value' => ''
  483. ];
  484. } else {
  485. $formattedValues = [];
  486. }
  487. if (strpos($values, ',') !== false) {
  488. $explode = explode(',', $values);
  489. foreach ($explode as $item) {
  490. $formattedValues[] = [
  491. 'name' => $item,
  492. 'value' => $item
  493. ];
  494. }
  495. } elseif ($values == '') {
  496. $formattedValues = '';
  497. } else {
  498. $formattedValues[] = [
  499. 'name' => $values,
  500. 'value' => $values
  501. ];
  502. }
  503. return $formattedValues;
  504. }
  505. public function logLevels()
  506. {
  507. return [
  508. [
  509. 'name' => 'Debug',
  510. 'value' => 'DEBUG'
  511. ],
  512. [
  513. 'name' => 'Info',
  514. 'value' => 'INFO'
  515. ],
  516. [
  517. 'name' => 'Notice',
  518. 'value' => 'NOTICE'
  519. ],
  520. [
  521. 'name' => 'Warning',
  522. 'value' => 'WARNING'
  523. ],
  524. [
  525. 'name' => 'Error',
  526. 'value' => 'ERROR'
  527. ],
  528. [
  529. 'name' => 'Critical',
  530. 'value' => 'CRITICAL'
  531. ],
  532. [
  533. 'name' => 'Alert',
  534. 'value' => 'ALERT'
  535. ],
  536. [
  537. 'name' => 'Emergency',
  538. 'value' => 'EMERGENCY'
  539. ]
  540. ];
  541. }
  542. public function sandboxOptions()
  543. {
  544. return [
  545. [
  546. 'name' => 'Allow Presentation',
  547. 'value' => 'allow-presentation'
  548. ],
  549. [
  550. 'name' => 'Allow Forms',
  551. 'value' => 'allow-forms'
  552. ],
  553. [
  554. 'name' => 'Allow Same Origin',
  555. 'value' => 'allow-same-origin'
  556. ],
  557. [
  558. 'name' => 'Allow Orientation Lock',
  559. 'value' => 'allow-orientation-lock'
  560. ],
  561. [
  562. 'name' => 'Allow Pointer Lock',
  563. 'value' => 'allow-pointer-lock'
  564. ],
  565. [
  566. 'name' => 'Allow Scripts',
  567. 'value' => 'allow-scripts'
  568. ],
  569. [
  570. 'name' => 'Allow Popups',
  571. 'value' => 'allow-popups'
  572. ],
  573. [
  574. 'name' => 'Allow Popups To Escape Sandbox',
  575. 'value' => 'allow-popups-to-escape-sandbox'
  576. ],
  577. [
  578. 'name' => 'Allow Modals',
  579. 'value' => 'allow-modals'
  580. ],
  581. [
  582. 'name' => 'Allow Top Navigation',
  583. 'value' => 'allow-top-navigation'
  584. ],
  585. [
  586. 'name' => 'Allow Top Navigation By User Activation',
  587. 'value' => 'allow-top-navigation-by-user-activation'
  588. ],
  589. [
  590. 'name' => 'Allow Downloads',
  591. 'value' => 'allow-downloads'
  592. ],
  593. ];
  594. }
  595. public function calendarLocaleOptions()
  596. {
  597. return [
  598. [
  599. 'name' => 'Arabic (Standard)',
  600. 'value' => 'ar',
  601. ],
  602. [
  603. 'name' => 'Arabic (Morocco)',
  604. 'value' => 'ar-ma',
  605. ],
  606. [
  607. 'name' => 'Arabic (Saudi Arabia)',
  608. 'value' => 'ar-sa'
  609. ],
  610. [
  611. 'value' => 'ar-tn',
  612. 'name' => 'Arabic (Tunisia)'
  613. ],
  614. [
  615. 'value' => 'bg',
  616. 'name' => 'Bulgarian'
  617. ],
  618. [
  619. 'value' => 'ca',
  620. 'name' => 'Catalan'
  621. ],
  622. [
  623. 'value' => 'cs',
  624. 'name' => 'Czech'
  625. ],
  626. [
  627. 'value' => 'da',
  628. 'name' => 'Danish'
  629. ],
  630. [
  631. 'value' => 'de',
  632. 'name' => 'German (Standard)'
  633. ],
  634. [
  635. 'value' => 'de-at',
  636. 'name' => 'German (Austria)'
  637. ],
  638. [
  639. 'value' => 'el',
  640. 'name' => 'Greek'
  641. ],
  642. [
  643. 'value' => 'en',
  644. 'name' => 'English'
  645. ],
  646. [
  647. 'value' => 'en-au',
  648. 'name' => 'English (Australia)'
  649. ],
  650. [
  651. 'value' => 'en-ca',
  652. 'name' => 'English (Canada)'
  653. ],
  654. [
  655. 'value' => 'en-gb',
  656. 'name' => 'English (United Kingdom)'
  657. ],
  658. [
  659. 'value' => 'es',
  660. 'name' => 'Spanish'
  661. ],
  662. [
  663. 'value' => 'fa',
  664. 'name' => 'Farsi'
  665. ],
  666. [
  667. 'value' => 'fi',
  668. 'name' => 'Finnish'
  669. ],
  670. [
  671. 'value' => 'fr',
  672. 'name' => 'French (Standard)'
  673. ],
  674. [
  675. 'value' => 'fr-ca',
  676. 'name' => 'French (Canada)'
  677. ],
  678. [
  679. 'value' => 'he',
  680. 'name' => 'Hebrew'
  681. ],
  682. [
  683. 'value' => 'hi',
  684. 'name' => 'Hindi'
  685. ],
  686. [
  687. 'value' => 'hr',
  688. 'name' => 'Croatian'
  689. ],
  690. [
  691. 'value' => 'hu',
  692. 'name' => 'Hungarian'
  693. ],
  694. [
  695. 'value' => 'id',
  696. 'name' => 'Indonesian'
  697. ],
  698. [
  699. 'value' => 'is',
  700. 'name' => 'Icelandic'
  701. ],
  702. [
  703. 'value' => 'it',
  704. 'name' => 'Italian'
  705. ],
  706. [
  707. 'value' => 'ja',
  708. 'name' => 'Japanese'
  709. ],
  710. [
  711. 'value' => 'ko',
  712. 'name' => 'Korean'
  713. ],
  714. [
  715. 'value' => 'lt',
  716. 'name' => 'Lithuanian'
  717. ],
  718. [
  719. 'value' => 'lv',
  720. 'name' => 'Latvian'
  721. ],
  722. [
  723. 'value' => 'nb',
  724. 'name' => 'Norwegian (Bokmal)'
  725. ],
  726. [
  727. 'value' => 'nl',
  728. 'name' => 'Dutch (Standard)'
  729. ],
  730. [
  731. 'value' => 'pl',
  732. 'name' => 'Polish'
  733. ],
  734. [
  735. 'value' => 'pt',
  736. 'name' => 'Portuguese'
  737. ],
  738. [
  739. 'value' => 'pt-br',
  740. 'name' => 'Portuguese (Brazil)'
  741. ],
  742. [
  743. 'value' => 'ro',
  744. 'name' => 'Romanian'
  745. ],
  746. [
  747. 'value' => 'ru',
  748. 'name' => 'Russian'
  749. ],
  750. [
  751. 'value' => 'sk',
  752. 'name' => 'Slovak'
  753. ],
  754. [
  755. 'value' => 'sl',
  756. 'name' => 'Slovenian'
  757. ],
  758. [
  759. 'value' => 'sr',
  760. 'name' => 'Serbian'
  761. ],
  762. [
  763. 'value' => 'sv',
  764. 'name' => 'Swedish'
  765. ],
  766. [
  767. 'value' => 'th',
  768. 'name' => 'Thai'
  769. ],
  770. [
  771. 'value' => 'tr',
  772. 'name' => 'Turkish'
  773. ],
  774. [
  775. 'value' => 'uk',
  776. 'name' => 'Ukrainian'
  777. ],
  778. [
  779. 'value' => 'vi',
  780. 'name' => 'Vietnamese'
  781. ],
  782. [
  783. 'value' => 'zh-cn',
  784. 'name' => 'Chinese (PRC)'
  785. ],
  786. [
  787. 'value' => 'zh-tw',
  788. 'name' => 'Chinese (Taiwan)'
  789. ]
  790. ];
  791. }
  792. public function daysOptions()
  793. {
  794. return array(
  795. array(
  796. 'name' => 'Sunday',
  797. 'value' => '0'
  798. ),
  799. array(
  800. 'name' => 'Monday',
  801. 'value' => '1'
  802. ),
  803. array(
  804. 'name' => 'Tueday',
  805. 'value' => '2'
  806. ),
  807. array(
  808. 'name' => 'Wednesday',
  809. 'value' => '3'
  810. ),
  811. array(
  812. 'name' => 'Thursday',
  813. 'value' => '4'
  814. ),
  815. array(
  816. 'name' => 'Friday',
  817. 'value' => '5'
  818. ),
  819. array(
  820. 'name' => 'Saturday',
  821. 'value' => '6'
  822. )
  823. );
  824. }
  825. public function mediaServerOptions()
  826. {
  827. return array(
  828. array(
  829. 'name' => 'N/A',
  830. 'value' => ''
  831. ),
  832. array(
  833. 'name' => 'Plex',
  834. 'value' => 'plex'
  835. ),
  836. array(
  837. 'name' => 'Emby [Not Available]',
  838. 'value' => 'emby'
  839. )
  840. );
  841. }
  842. public function requestTvOptions($includeUserOption = false)
  843. {
  844. $options = [
  845. [
  846. 'name' => 'All Seasons',
  847. 'value' => 'all'
  848. ],
  849. [
  850. 'name' => 'First Season Only',
  851. 'value' => 'first'
  852. ],
  853. [
  854. 'name' => 'Last Season Only',
  855. 'value' => 'last'
  856. ],
  857. ];
  858. $userOption = [
  859. 'name' => 'Let User Select',
  860. 'value' => 'user'
  861. ];
  862. if ($includeUserOption) {
  863. array_push($options, $userOption);
  864. }
  865. return $options;
  866. }
  867. public function requestServiceOptions()
  868. {
  869. return [
  870. [
  871. 'name' => 'Ombi',
  872. 'value' => 'ombi'
  873. ],
  874. [
  875. 'name' => 'Overseerr',
  876. 'value' => 'overseerr'
  877. ]
  878. ];
  879. }
  880. public function limitOptions()
  881. {
  882. return array(
  883. array(
  884. 'name' => '1 Item',
  885. 'value' => '1'
  886. ),
  887. array(
  888. 'name' => '2 Items',
  889. 'value' => '2'
  890. ),
  891. array(
  892. 'name' => '3 Items',
  893. 'value' => '3'
  894. ),
  895. array(
  896. 'name' => '4 Items',
  897. 'value' => '4'
  898. ),
  899. array(
  900. 'name' => '5 Items',
  901. 'value' => '5'
  902. ),
  903. array(
  904. 'name' => '6 Items',
  905. 'value' => '6'
  906. ),
  907. array(
  908. 'name' => '7 Items',
  909. 'value' => '7'
  910. ),
  911. array(
  912. 'name' => '8 Items',
  913. 'value' => '8'
  914. ),
  915. array(
  916. 'name' => 'Unlimited',
  917. 'value' => '1000'
  918. ),
  919. );
  920. }
  921. public function notificationTypesOptions()
  922. {
  923. return array(
  924. array(
  925. 'name' => 'Toastr',
  926. 'value' => 'toastr'
  927. ),
  928. array(
  929. 'name' => 'Izi',
  930. 'value' => 'izi'
  931. ),
  932. array(
  933. 'name' => 'Alertify',
  934. 'value' => 'alertify'
  935. ),
  936. array(
  937. 'name' => 'Noty',
  938. 'value' => 'noty'
  939. ),
  940. );
  941. }
  942. public function notificationPositionsOptions()
  943. {
  944. return array(
  945. array(
  946. 'name' => 'Bottom Right',
  947. 'value' => 'br'
  948. ),
  949. array(
  950. 'name' => 'Bottom Left',
  951. 'value' => 'bl'
  952. ),
  953. array(
  954. 'name' => 'Bottom Center',
  955. 'value' => 'bc'
  956. ),
  957. array(
  958. 'name' => 'Top Right',
  959. 'value' => 'tr'
  960. ),
  961. array(
  962. 'name' => 'Top Left',
  963. 'value' => 'tl'
  964. ),
  965. array(
  966. 'name' => 'Top Center',
  967. 'value' => 'tc'
  968. ),
  969. array(
  970. 'name' => 'Center',
  971. 'value' => 'c'
  972. ),
  973. );
  974. }
  975. public function timeOptions()
  976. {
  977. return array(
  978. array(
  979. 'name' => '2.5',
  980. 'value' => '2500'
  981. ),
  982. array(
  983. 'name' => '5',
  984. 'value' => '5000'
  985. ),
  986. array(
  987. 'name' => '10',
  988. 'value' => '10000'
  989. ),
  990. array(
  991. 'name' => '15',
  992. 'value' => '15000'
  993. ),
  994. array(
  995. 'name' => '30',
  996. 'value' => '30000'
  997. ),
  998. array(
  999. 'name' => '60 [1 Minute]',
  1000. 'value' => '60000'
  1001. ),
  1002. array(
  1003. 'name' => '300 [5 Minutes]',
  1004. 'value' => '300000'
  1005. ),
  1006. array(
  1007. 'name' => '600 [10 Minutes]',
  1008. 'value' => '600000'
  1009. ),
  1010. array(
  1011. 'name' => '900 [15 Minutes]',
  1012. 'value' => '900000'
  1013. ),
  1014. array(
  1015. 'name' => '1800 [30 Minutes]',
  1016. 'value' => '1800000'
  1017. ),
  1018. array(
  1019. 'name' => '3600 [1 Hour]',
  1020. 'value' => '3600000'
  1021. ),
  1022. );
  1023. }
  1024. public function netdataOptions()
  1025. {
  1026. return [
  1027. [
  1028. 'name' => 'Disk Read',
  1029. 'value' => 'disk-read',
  1030. ],
  1031. [
  1032. 'name' => 'Disk Write',
  1033. 'value' => 'disk-write',
  1034. ],
  1035. [
  1036. 'name' => 'CPU',
  1037. 'value' => 'cpu'
  1038. ],
  1039. [
  1040. 'name' => 'Network Inbound',
  1041. 'value' => 'net-in',
  1042. ],
  1043. [
  1044. 'name' => 'Network Outbound',
  1045. 'value' => 'net-out',
  1046. ],
  1047. [
  1048. 'name' => 'Used RAM',
  1049. 'value' => 'ram-used',
  1050. ],
  1051. [
  1052. 'name' => 'Used Swap',
  1053. 'value' => 'swap-used',
  1054. ],
  1055. [
  1056. 'name' => 'Disk space used',
  1057. 'value' => 'disk-used',
  1058. ],
  1059. [
  1060. 'name' => 'Disk space available',
  1061. 'value' => 'disk-avail',
  1062. ],
  1063. [
  1064. 'name' => 'Custom',
  1065. 'value' => 'custom',
  1066. ]
  1067. ];
  1068. }
  1069. public function netdataChartOptions()
  1070. {
  1071. return [
  1072. [
  1073. 'name' => 'Easy Pie Chart',
  1074. 'value' => 'easypiechart',
  1075. ],
  1076. [
  1077. 'name' => 'Gauge',
  1078. 'value' => 'gauge'
  1079. ]
  1080. ];
  1081. }
  1082. public function netdataColourOptions()
  1083. {
  1084. return [
  1085. [
  1086. 'name' => 'Red',
  1087. 'value' => 'fe3912',
  1088. ],
  1089. [
  1090. 'name' => 'Green',
  1091. 'value' => '46e302',
  1092. ],
  1093. [
  1094. 'name' => 'Purple',
  1095. 'value' => 'CC22AA'
  1096. ],
  1097. [
  1098. 'name' => 'Blue',
  1099. 'value' => '5054e6',
  1100. ],
  1101. [
  1102. 'name' => 'Yellow',
  1103. 'value' => 'dddd00',
  1104. ],
  1105. [
  1106. 'name' => 'Orange',
  1107. 'value' => 'd66300',
  1108. ]
  1109. ];
  1110. }
  1111. public function netdataSizeOptions()
  1112. {
  1113. return [
  1114. [
  1115. 'name' => 'Large',
  1116. 'value' => 'lg',
  1117. ],
  1118. [
  1119. 'name' => 'Medium',
  1120. 'value' => 'md',
  1121. ],
  1122. [
  1123. 'name' => 'Small',
  1124. 'value' => 'sm'
  1125. ]
  1126. ];
  1127. }
  1128. public function timeFormatOptions()
  1129. {
  1130. return array(
  1131. array(
  1132. 'name' => '6p',
  1133. 'value' => 'h(:mm)t'
  1134. ),
  1135. array(
  1136. 'name' => '6:00p',
  1137. 'value' => 'h:mmt'
  1138. ),
  1139. array(
  1140. 'name' => '6pm',
  1141. 'value' => 'h(:mm)a'
  1142. ),
  1143. array(
  1144. 'name' => '6:00pm',
  1145. 'value' => 'h:mma'
  1146. ),
  1147. array(
  1148. 'name' => '6:00',
  1149. 'value' => 'h:mm'
  1150. ),
  1151. array(
  1152. 'name' => '18',
  1153. 'value' => 'H(:mm)'
  1154. ),
  1155. array(
  1156. 'name' => '18:00',
  1157. 'value' => 'H:mm'
  1158. )
  1159. );
  1160. }
  1161. public function rTorrentSortOptions()
  1162. {
  1163. return array(
  1164. array(
  1165. 'name' => 'Date Desc',
  1166. 'value' => 'dated'
  1167. ),
  1168. array(
  1169. 'name' => 'Date Asc',
  1170. 'value' => 'datea'
  1171. ),
  1172. array(
  1173. 'name' => 'Hash Desc',
  1174. 'value' => 'hashd'
  1175. ),
  1176. array(
  1177. 'name' => 'Hash Asc',
  1178. 'value' => 'hasha'
  1179. ),
  1180. array(
  1181. 'name' => 'Name Desc',
  1182. 'value' => 'named'
  1183. ),
  1184. array(
  1185. 'name' => 'Name Asc',
  1186. 'value' => 'namea'
  1187. ),
  1188. array(
  1189. 'name' => 'Size Desc',
  1190. 'value' => 'sized'
  1191. ),
  1192. array(
  1193. 'name' => 'Size Asc',
  1194. 'value' => 'sizea'
  1195. ),
  1196. array(
  1197. 'name' => 'Label Desc',
  1198. 'value' => 'labeld'
  1199. ),
  1200. array(
  1201. 'name' => 'Label Asc',
  1202. 'value' => 'labela'
  1203. ),
  1204. array(
  1205. 'name' => 'Status Desc',
  1206. 'value' => 'statusd'
  1207. ),
  1208. array(
  1209. 'name' => 'Status Asc',
  1210. 'value' => 'statusa'
  1211. ),
  1212. );
  1213. }
  1214. public function qBittorrentApiOptions()
  1215. {
  1216. return array(
  1217. array(
  1218. 'name' => 'V1',
  1219. 'value' => '1'
  1220. ),
  1221. array(
  1222. 'name' => 'V2',
  1223. 'value' => '2'
  1224. ),
  1225. );
  1226. }
  1227. public function qBittorrentSortOptions()
  1228. {
  1229. return array(
  1230. array(
  1231. 'name' => 'Hash',
  1232. 'value' => 'hash'
  1233. ),
  1234. array(
  1235. 'name' => 'Name',
  1236. 'value' => 'name'
  1237. ),
  1238. array(
  1239. 'name' => 'Size',
  1240. 'value' => 'size'
  1241. ),
  1242. array(
  1243. 'name' => 'Progress',
  1244. 'value' => 'progress'
  1245. ),
  1246. array(
  1247. 'name' => 'Download Speed',
  1248. 'value' => 'dlspeed'
  1249. ),
  1250. array(
  1251. 'name' => 'Upload Speed',
  1252. 'value' => 'upspeed'
  1253. ),
  1254. array(
  1255. 'name' => 'Priority',
  1256. 'value' => 'priority'
  1257. ),
  1258. array(
  1259. 'name' => 'Number of Seeds',
  1260. 'value' => 'num_seeds'
  1261. ),
  1262. array(
  1263. 'name' => 'Number of Seeds in Swarm',
  1264. 'value' => 'num_complete'
  1265. ),
  1266. array(
  1267. 'name' => 'Number of Leechers',
  1268. 'value' => 'num_leechs'
  1269. ),
  1270. array(
  1271. 'name' => 'Number of Leechers in Swarm',
  1272. 'value' => 'num_incomplete'
  1273. ),
  1274. array(
  1275. 'name' => 'Ratio',
  1276. 'value' => 'ratio'
  1277. ),
  1278. array(
  1279. 'name' => 'ETA',
  1280. 'value' => 'eta'
  1281. ),
  1282. array(
  1283. 'name' => 'State',
  1284. 'value' => 'state'
  1285. ),
  1286. array(
  1287. 'name' => 'Category',
  1288. 'value' => 'category'
  1289. )
  1290. );
  1291. }
  1292. public function calendarDefaultOptions()
  1293. {
  1294. return array(
  1295. array(
  1296. 'name' => 'Month',
  1297. 'value' => 'month'
  1298. ),
  1299. array(
  1300. 'name' => 'Day',
  1301. 'value' => 'basicDay'
  1302. ),
  1303. array(
  1304. 'name' => 'Week',
  1305. 'value' => 'basicWeek'
  1306. ),
  1307. array(
  1308. 'name' => 'List',
  1309. 'value' => 'list'
  1310. )
  1311. );
  1312. }
  1313. }