option-functions.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413
  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 'total-queries':
  265. $settingsMerge = [
  266. 'type' => 'switch',
  267. 'label' => 'Total Queries',
  268. 'help' => 'Shows/hides the total queries stat'
  269. ];
  270. case 'queries-blocked':
  271. $settingsMerge = [
  272. 'type' => 'switch',
  273. 'label' => 'Total Queries',
  274. 'help' => 'Shows/hides the queries blocked stat'
  275. ];
  276. case 'percent-blocked':
  277. $settingsMerge = [
  278. 'type' => 'switch',
  279. 'label' => 'Total Queries',
  280. 'help' => 'Shows/hides the percent blocked stat'
  281. ];
  282. case 'processing-time':
  283. $settingsMerge = [
  284. 'type' => 'switch',
  285. 'label' => 'Total Queries',
  286. 'help' => 'Shows/hides the processing time stat'
  287. ];
  288. case 'domain-list':
  289. $settingsMerge = [
  290. 'type' => 'switch',
  291. 'label' => 'Total Queries',
  292. 'help' => 'Shows/hides the domain list stat'
  293. ];
  294. case 'disablecertcheck':
  295. $settingMerge = [
  296. 'type' => 'switch',
  297. 'label' => 'Disable Certificate Check',
  298. ];
  299. break;
  300. case 'usecustomcertificate':
  301. $settingMerge = [
  302. 'type' => 'switch',
  303. 'label' => 'Use Custom Certificate',
  304. ];
  305. break;
  306. case 'hideseeding':
  307. $settingMerge = [
  308. 'type' => 'switch',
  309. 'label' => 'Hide Seeding',
  310. ];
  311. break;
  312. case 'hidecompleted':
  313. $settingMerge = [
  314. 'type' => 'switch',
  315. 'label' => 'Hide Completed',
  316. ];
  317. break;
  318. case 'hidestatus':
  319. $settingMerge = [
  320. 'type' => 'switch',
  321. 'label' => 'Hide Status',
  322. ];
  323. break;
  324. case 'limit':
  325. $settingMerge = [
  326. 'type' => 'number',
  327. 'label' => 'Item Limit',
  328. ];
  329. break;
  330. case 'mediasearchserver':
  331. $settingMerge = [
  332. 'type' => 'select',
  333. 'label' => 'Media Search Server',
  334. 'options' => $this->mediaServerOptions()
  335. ];
  336. break;
  337. case 'imagecachequality':
  338. $settingMerge = [
  339. 'type' => 'select',
  340. 'label' => 'Image Cache Quality',
  341. 'options' => [
  342. [
  343. 'name' => 'Low',
  344. 'value' => '.5'
  345. ],
  346. [
  347. 'name' => '1x',
  348. 'value' => '1'
  349. ],
  350. [
  351. 'name' => '2x',
  352. 'value' => '2'
  353. ],
  354. [
  355. 'name' => '3x',
  356. 'value' => '3'
  357. ]
  358. ]
  359. ];
  360. break;
  361. case 'blank':
  362. $settingMerge = [
  363. 'type' => 'blank',
  364. 'label' => '',
  365. ];
  366. break;
  367. case 'plexlibraryexclude':
  368. $settingMerge = [
  369. 'type' => 'select2',
  370. 'class' => 'select2-multiple',
  371. 'id' => $name . '-exclude-select-' . $this->random_ascii_string(6),
  372. 'label' => 'Libraries to Exclude',
  373. 'options' => $extras['options']
  374. ];
  375. break;
  376. case 'plexlibraryinclude':
  377. $settingMerge = [
  378. 'type' => 'select2',
  379. 'class' => 'select2-multiple',
  380. 'id' => $name . '-include-select-' . $this->random_ascii_string(6),
  381. 'label' => 'Libraries to Include',
  382. 'options' => $extras['options']
  383. ];
  384. break;
  385. // HTML ITEMS
  386. // precodeeditor possibly not needed anymore
  387. case 'precodeeditor':
  388. $settingMerge = [
  389. 'type' => 'textbox',
  390. 'class' => 'hidden ' . $name . 'Textarea',
  391. 'label' => '',
  392. ];
  393. break;
  394. case 'codeeditor':
  395. $mode = strtolower($extras['mode'] ?? 'css');
  396. switch ($mode) {
  397. case 'html':
  398. case 'javascript':
  399. $mode = 'ace/mode/' . $mode;
  400. break;
  401. case 'js':
  402. $mode = 'ace/mode/javascript';
  403. break;
  404. default:
  405. $mode = 'ace/mode/css';
  406. break;
  407. }
  408. $settingMerge = [
  409. 'type' => 'html',
  410. 'override' => 12,
  411. 'label' => 'Custom Code',
  412. 'html' => '
  413. <textarea data-changed="false" class="form-control hidden ' . $name . 'Textarea" name="' . $name . '" data-type="textbox" autocomplete="new-password">' . $this->config[$name] . '</textarea>
  414. <div id="' . $name . 'Editor" style="height:300px">' . htmlentities($this->config[$name]) . '</div>
  415. <script>
  416. let mode = ace.require("' . $mode . '").Mode;
  417. ' . str_replace('-', '', $name) . ' = ace.edit("' . $name . 'Editor");
  418. ' . str_replace('-', '', $name) . '.session.setMode(new mode());
  419. ' . str_replace('-', '', $name) . '.setTheme("ace/theme/idle_fingers");
  420. ' . str_replace('-', '', $name) . '.setShowPrintMargin(false);
  421. ' . str_replace('-', '', $name) . '.session.on("change", function(delta) {
  422. $(".' . $name . 'Textarea").val(' . str_replace('-', '', $name) . '.getValue());
  423. $(".' . $name . 'Textarea").trigger("change");
  424. });
  425. </script>
  426. '
  427. ];
  428. break;
  429. // CALENDAR ITEMS
  430. case 'calendarstart':
  431. $settingMerge = [
  432. 'type' => 'number',
  433. 'label' => '# of Days Before'
  434. ];
  435. break;
  436. case 'calendarend':
  437. $settingMerge = [
  438. 'type' => 'number',
  439. 'label' => '# of Days After'
  440. ];
  441. break;
  442. case 'calendarstartingday':
  443. case 'calendarstartday':
  444. case 'calendarstart':
  445. $settingMerge = [
  446. 'type' => 'select',
  447. 'label' => 'Start Day',
  448. 'options' => $this->daysOptions()
  449. ];
  450. break;
  451. case 'calendardefaultview':
  452. $settingMerge = [
  453. 'type' => 'select',
  454. 'label' => 'Default View',
  455. 'options' => $this->calendarDefaultOptions()
  456. ];
  457. break;
  458. case 'calendartimeformat':
  459. $settingMerge = [
  460. 'type' => 'select',
  461. 'label' => 'Time Format',
  462. 'options' => $this->timeFormatOptions()
  463. ];
  464. break;
  465. case 'calendarlocale':
  466. $settingMerge = [
  467. 'type' => 'select',
  468. 'label' => 'Locale',
  469. 'options' => $this->calendarLocaleOptions()
  470. ];
  471. break;
  472. case 'calendarlimit':
  473. $settingMerge = [
  474. 'type' => 'select',
  475. 'label' => 'Items Per Day',
  476. 'options' => $this->limitOptions()
  477. ];
  478. break;
  479. case 'color':
  480. $settingMerge = [
  481. 'type' => 'input',
  482. 'label' => 'Color',
  483. 'class' => 'pick-a-color-custom-options',
  484. 'attr' => 'data-original="' . $this->config[$name] . '"'
  485. ];
  486. break;
  487. case 'calendarlinkurl':
  488. $settingMerge = [
  489. 'type' => 'select-input',
  490. 'label' => 'Target URL',
  491. 'help' => 'Set the primary URL used when clicking on calendar icon.',
  492. 'options' => $this->makeOptionsFromValues($this->config[str_replace('CalendarLink', '', $name) . 'URL'], true, 'Use Default'),
  493. ];
  494. break;
  495. case 'calendarframetarget':
  496. $settingMerge = [
  497. 'type' => 'select',
  498. 'label' => 'Target Tab',
  499. 'help' => 'Set the tab used when clicking on calendar icon. If not set, link will open in new window.',
  500. 'options' => $this->getIframeTabs($this->config[str_replace('FrameTarget', 'CalendarLink', $name)])
  501. ];
  502. break;
  503. default:
  504. $settingMerge = [
  505. 'type' => strtolower($type),
  506. 'label' => ''
  507. ];
  508. break;
  509. }
  510. $setting = array_merge($settingMerge, $setting);
  511. if ($extras) {
  512. if (gettype($extras) == 'array') {
  513. $setting = array_merge($setting, $extras);
  514. }
  515. }
  516. return $setting;
  517. }
  518. public function getIframeTabs($url = "")
  519. {
  520. if (!empty($url)) {
  521. $response = [
  522. array(
  523. 'function' => 'fetchAll',
  524. 'query' => array(
  525. "SELECT * FROM tabs WHERE `enabled`='1' AND `type`='1' AND `group_id`>=? AND (`url` = '" . $url . "' OR `url_local` = '" . $url . "') ORDER BY `order` ASC",
  526. $this->getUserLevel(),
  527. )
  528. )
  529. ];
  530. } else {
  531. $response = [
  532. array(
  533. 'function' => 'fetchAll',
  534. 'query' => array(
  535. "SELECT * FROM tabs WHERE `enabled`='1' AND `type`='1' AND `group_id`>=? ORDER BY `order` ASC",
  536. $this->getUserLevel()
  537. )
  538. )
  539. ];
  540. }
  541. $formattedValues[] = [
  542. 'name' => 'Open in New Window',
  543. 'value' => ''
  544. ];
  545. foreach ($this->processQueries($response) as $result) {
  546. $formattedValues[] = [
  547. 'name' => $result['name'],
  548. 'value' => $result['id']
  549. ];
  550. }
  551. return $formattedValues;
  552. }
  553. public function makeOptionsFromValues($values = null, $appendBlank = null, $blankLabel = null)
  554. {
  555. if ($appendBlank === true) {
  556. $formattedValues[] = [
  557. 'name' => (!empty($blankLabel)) ? $blankLabel : 'Select option...',
  558. 'value' => ''
  559. ];
  560. } else {
  561. $formattedValues = [];
  562. }
  563. if (strpos($values, ',') !== false) {
  564. $explode = explode(',', $values);
  565. foreach ($explode as $item) {
  566. $formattedValues[] = [
  567. 'name' => $item,
  568. 'value' => $item
  569. ];
  570. }
  571. } elseif ($values == '') {
  572. $formattedValues = '';
  573. } else {
  574. $formattedValues[] = [
  575. 'name' => $values,
  576. 'value' => $values
  577. ];
  578. }
  579. return $formattedValues;
  580. }
  581. public function logLevels()
  582. {
  583. return [
  584. [
  585. 'name' => 'Debug',
  586. 'value' => 'DEBUG'
  587. ],
  588. [
  589. 'name' => 'Info',
  590. 'value' => 'INFO'
  591. ],
  592. [
  593. 'name' => 'Notice',
  594. 'value' => 'NOTICE'
  595. ],
  596. [
  597. 'name' => 'Warning',
  598. 'value' => 'WARNING'
  599. ],
  600. [
  601. 'name' => 'Error',
  602. 'value' => 'ERROR'
  603. ],
  604. [
  605. 'name' => 'Critical',
  606. 'value' => 'CRITICAL'
  607. ],
  608. [
  609. 'name' => 'Alert',
  610. 'value' => 'ALERT'
  611. ],
  612. [
  613. 'name' => 'Emergency',
  614. 'value' => 'EMERGENCY'
  615. ]
  616. ];
  617. }
  618. public function sandboxOptions()
  619. {
  620. return [
  621. [
  622. 'name' => 'Allow Presentation',
  623. 'value' => 'allow-presentation'
  624. ],
  625. [
  626. 'name' => 'Allow Forms',
  627. 'value' => 'allow-forms'
  628. ],
  629. [
  630. 'name' => 'Allow Same Origin',
  631. 'value' => 'allow-same-origin'
  632. ],
  633. [
  634. 'name' => 'Allow Orientation Lock',
  635. 'value' => 'allow-orientation-lock'
  636. ],
  637. [
  638. 'name' => 'Allow Pointer Lock',
  639. 'value' => 'allow-pointer-lock'
  640. ],
  641. [
  642. 'name' => 'Allow Scripts',
  643. 'value' => 'allow-scripts'
  644. ],
  645. [
  646. 'name' => 'Allow Popups',
  647. 'value' => 'allow-popups'
  648. ],
  649. [
  650. 'name' => 'Allow Popups To Escape Sandbox',
  651. 'value' => 'allow-popups-to-escape-sandbox'
  652. ],
  653. [
  654. 'name' => 'Allow Modals',
  655. 'value' => 'allow-modals'
  656. ],
  657. [
  658. 'name' => 'Allow Top Navigation',
  659. 'value' => 'allow-top-navigation'
  660. ],
  661. [
  662. 'name' => 'Allow Top Navigation By User Activation',
  663. 'value' => 'allow-top-navigation-by-user-activation'
  664. ],
  665. [
  666. 'name' => 'Allow Downloads',
  667. 'value' => 'allow-downloads'
  668. ],
  669. ];
  670. }
  671. public function calendarLocaleOptions()
  672. {
  673. return [
  674. [
  675. 'name' => 'Arabic (Standard)',
  676. 'value' => 'ar',
  677. ],
  678. [
  679. 'name' => 'Arabic (Morocco)',
  680. 'value' => 'ar-ma',
  681. ],
  682. [
  683. 'name' => 'Arabic (Saudi Arabia)',
  684. 'value' => 'ar-sa'
  685. ],
  686. [
  687. 'value' => 'ar-tn',
  688. 'name' => 'Arabic (Tunisia)'
  689. ],
  690. [
  691. 'value' => 'bg',
  692. 'name' => 'Bulgarian'
  693. ],
  694. [
  695. 'value' => 'ca',
  696. 'name' => 'Catalan'
  697. ],
  698. [
  699. 'value' => 'cs',
  700. 'name' => 'Czech'
  701. ],
  702. [
  703. 'value' => 'da',
  704. 'name' => 'Danish'
  705. ],
  706. [
  707. 'value' => 'de',
  708. 'name' => 'German (Standard)'
  709. ],
  710. [
  711. 'value' => 'de-at',
  712. 'name' => 'German (Austria)'
  713. ],
  714. [
  715. 'value' => 'el',
  716. 'name' => 'Greek'
  717. ],
  718. [
  719. 'value' => 'en',
  720. 'name' => 'English'
  721. ],
  722. [
  723. 'value' => 'en-au',
  724. 'name' => 'English (Australia)'
  725. ],
  726. [
  727. 'value' => 'en-ca',
  728. 'name' => 'English (Canada)'
  729. ],
  730. [
  731. 'value' => 'en-gb',
  732. 'name' => 'English (United Kingdom)'
  733. ],
  734. [
  735. 'value' => 'es',
  736. 'name' => 'Spanish'
  737. ],
  738. [
  739. 'value' => 'fa',
  740. 'name' => 'Farsi'
  741. ],
  742. [
  743. 'value' => 'fi',
  744. 'name' => 'Finnish'
  745. ],
  746. [
  747. 'value' => 'fr',
  748. 'name' => 'French (Standard)'
  749. ],
  750. [
  751. 'value' => 'fr-ca',
  752. 'name' => 'French (Canada)'
  753. ],
  754. [
  755. 'value' => 'he',
  756. 'name' => 'Hebrew'
  757. ],
  758. [
  759. 'value' => 'hi',
  760. 'name' => 'Hindi'
  761. ],
  762. [
  763. 'value' => 'hr',
  764. 'name' => 'Croatian'
  765. ],
  766. [
  767. 'value' => 'hu',
  768. 'name' => 'Hungarian'
  769. ],
  770. [
  771. 'value' => 'id',
  772. 'name' => 'Indonesian'
  773. ],
  774. [
  775. 'value' => 'is',
  776. 'name' => 'Icelandic'
  777. ],
  778. [
  779. 'value' => 'it',
  780. 'name' => 'Italian'
  781. ],
  782. [
  783. 'value' => 'ja',
  784. 'name' => 'Japanese'
  785. ],
  786. [
  787. 'value' => 'ko',
  788. 'name' => 'Korean'
  789. ],
  790. [
  791. 'value' => 'lt',
  792. 'name' => 'Lithuanian'
  793. ],
  794. [
  795. 'value' => 'lv',
  796. 'name' => 'Latvian'
  797. ],
  798. [
  799. 'value' => 'nb',
  800. 'name' => 'Norwegian (Bokmal)'
  801. ],
  802. [
  803. 'value' => 'nl',
  804. 'name' => 'Dutch (Standard)'
  805. ],
  806. [
  807. 'value' => 'pl',
  808. 'name' => 'Polish'
  809. ],
  810. [
  811. 'value' => 'pt',
  812. 'name' => 'Portuguese'
  813. ],
  814. [
  815. 'value' => 'pt-br',
  816. 'name' => 'Portuguese (Brazil)'
  817. ],
  818. [
  819. 'value' => 'ro',
  820. 'name' => 'Romanian'
  821. ],
  822. [
  823. 'value' => 'ru',
  824. 'name' => 'Russian'
  825. ],
  826. [
  827. 'value' => 'sk',
  828. 'name' => 'Slovak'
  829. ],
  830. [
  831. 'value' => 'sl',
  832. 'name' => 'Slovenian'
  833. ],
  834. [
  835. 'value' => 'sr',
  836. 'name' => 'Serbian'
  837. ],
  838. [
  839. 'value' => 'sv',
  840. 'name' => 'Swedish'
  841. ],
  842. [
  843. 'value' => 'th',
  844. 'name' => 'Thai'
  845. ],
  846. [
  847. 'value' => 'tr',
  848. 'name' => 'Turkish'
  849. ],
  850. [
  851. 'value' => 'uk',
  852. 'name' => 'Ukrainian'
  853. ],
  854. [
  855. 'value' => 'vi',
  856. 'name' => 'Vietnamese'
  857. ],
  858. [
  859. 'value' => 'zh-cn',
  860. 'name' => 'Chinese (PRC)'
  861. ],
  862. [
  863. 'value' => 'zh-tw',
  864. 'name' => 'Chinese (Taiwan)'
  865. ]
  866. ];
  867. }
  868. public function daysOptions()
  869. {
  870. return array(
  871. array(
  872. 'name' => 'Sunday',
  873. 'value' => '0'
  874. ),
  875. array(
  876. 'name' => 'Monday',
  877. 'value' => '1'
  878. ),
  879. array(
  880. 'name' => 'Tueday',
  881. 'value' => '2'
  882. ),
  883. array(
  884. 'name' => 'Wednesday',
  885. 'value' => '3'
  886. ),
  887. array(
  888. 'name' => 'Thursday',
  889. 'value' => '4'
  890. ),
  891. array(
  892. 'name' => 'Friday',
  893. 'value' => '5'
  894. ),
  895. array(
  896. 'name' => 'Saturday',
  897. 'value' => '6'
  898. )
  899. );
  900. }
  901. public function mediaServerOptions()
  902. {
  903. return array(
  904. array(
  905. 'name' => 'N/A',
  906. 'value' => ''
  907. ),
  908. array(
  909. 'name' => 'Plex',
  910. 'value' => 'plex'
  911. ),
  912. array(
  913. 'name' => 'Emby [Not Available]',
  914. 'value' => 'emby'
  915. )
  916. );
  917. }
  918. public function requestTvOptions($includeUserOption = false)
  919. {
  920. $options = [
  921. [
  922. 'name' => 'All Seasons',
  923. 'value' => 'all'
  924. ],
  925. [
  926. 'name' => 'First Season Only',
  927. 'value' => 'first'
  928. ],
  929. [
  930. 'name' => 'Last Season Only',
  931. 'value' => 'last'
  932. ],
  933. ];
  934. $userOption = [
  935. 'name' => 'Let User Select',
  936. 'value' => 'user'
  937. ];
  938. if ($includeUserOption) {
  939. array_push($options, $userOption);
  940. }
  941. return $options;
  942. }
  943. public function requestServiceOptions()
  944. {
  945. return [
  946. [
  947. 'name' => 'Ombi',
  948. 'value' => 'ombi'
  949. ],
  950. [
  951. 'name' => 'Overseerr',
  952. 'value' => 'overseerr'
  953. ]
  954. ];
  955. }
  956. public function limitOptions()
  957. {
  958. return array(
  959. array(
  960. 'name' => '1 Item',
  961. 'value' => '1'
  962. ),
  963. array(
  964. 'name' => '2 Items',
  965. 'value' => '2'
  966. ),
  967. array(
  968. 'name' => '3 Items',
  969. 'value' => '3'
  970. ),
  971. array(
  972. 'name' => '4 Items',
  973. 'value' => '4'
  974. ),
  975. array(
  976. 'name' => '5 Items',
  977. 'value' => '5'
  978. ),
  979. array(
  980. 'name' => '6 Items',
  981. 'value' => '6'
  982. ),
  983. array(
  984. 'name' => '7 Items',
  985. 'value' => '7'
  986. ),
  987. array(
  988. 'name' => '8 Items',
  989. 'value' => '8'
  990. ),
  991. array(
  992. 'name' => 'Unlimited',
  993. 'value' => '1000'
  994. ),
  995. );
  996. }
  997. public function notificationTypesOptions()
  998. {
  999. return array(
  1000. array(
  1001. 'name' => 'Toastr',
  1002. 'value' => 'toastr'
  1003. ),
  1004. array(
  1005. 'name' => 'Izi',
  1006. 'value' => 'izi'
  1007. ),
  1008. array(
  1009. 'name' => 'Alertify',
  1010. 'value' => 'alertify'
  1011. ),
  1012. array(
  1013. 'name' => 'Noty',
  1014. 'value' => 'noty'
  1015. ),
  1016. );
  1017. }
  1018. public function notificationPositionsOptions()
  1019. {
  1020. return array(
  1021. array(
  1022. 'name' => 'Bottom Right',
  1023. 'value' => 'br'
  1024. ),
  1025. array(
  1026. 'name' => 'Bottom Left',
  1027. 'value' => 'bl'
  1028. ),
  1029. array(
  1030. 'name' => 'Bottom Center',
  1031. 'value' => 'bc'
  1032. ),
  1033. array(
  1034. 'name' => 'Top Right',
  1035. 'value' => 'tr'
  1036. ),
  1037. array(
  1038. 'name' => 'Top Left',
  1039. 'value' => 'tl'
  1040. ),
  1041. array(
  1042. 'name' => 'Top Center',
  1043. 'value' => 'tc'
  1044. ),
  1045. array(
  1046. 'name' => 'Center',
  1047. 'value' => 'c'
  1048. ),
  1049. );
  1050. }
  1051. public function timeOptions()
  1052. {
  1053. return array(
  1054. array(
  1055. 'name' => '2.5',
  1056. 'value' => '2500'
  1057. ),
  1058. array(
  1059. 'name' => '5',
  1060. 'value' => '5000'
  1061. ),
  1062. array(
  1063. 'name' => '10',
  1064. 'value' => '10000'
  1065. ),
  1066. array(
  1067. 'name' => '15',
  1068. 'value' => '15000'
  1069. ),
  1070. array(
  1071. 'name' => '30',
  1072. 'value' => '30000'
  1073. ),
  1074. array(
  1075. 'name' => '60 [1 Minute]',
  1076. 'value' => '60000'
  1077. ),
  1078. array(
  1079. 'name' => '300 [5 Minutes]',
  1080. 'value' => '300000'
  1081. ),
  1082. array(
  1083. 'name' => '600 [10 Minutes]',
  1084. 'value' => '600000'
  1085. ),
  1086. array(
  1087. 'name' => '900 [15 Minutes]',
  1088. 'value' => '900000'
  1089. ),
  1090. array(
  1091. 'name' => '1800 [30 Minutes]',
  1092. 'value' => '1800000'
  1093. ),
  1094. array(
  1095. 'name' => '3600 [1 Hour]',
  1096. 'value' => '3600000'
  1097. ),
  1098. );
  1099. }
  1100. public function netdataOptions()
  1101. {
  1102. return [
  1103. [
  1104. 'name' => 'Disk Read',
  1105. 'value' => 'disk-read',
  1106. ],
  1107. [
  1108. 'name' => 'Disk Write',
  1109. 'value' => 'disk-write',
  1110. ],
  1111. [
  1112. 'name' => 'CPU',
  1113. 'value' => 'cpu'
  1114. ],
  1115. [
  1116. 'name' => 'Network Inbound',
  1117. 'value' => 'net-in',
  1118. ],
  1119. [
  1120. 'name' => 'Network Outbound',
  1121. 'value' => 'net-out',
  1122. ],
  1123. [
  1124. 'name' => 'Used RAM',
  1125. 'value' => 'ram-used',
  1126. ],
  1127. [
  1128. 'name' => 'Used Swap',
  1129. 'value' => 'swap-used',
  1130. ],
  1131. [
  1132. 'name' => 'Disk space used',
  1133. 'value' => 'disk-used',
  1134. ],
  1135. [
  1136. 'name' => 'Disk space available',
  1137. 'value' => 'disk-avail',
  1138. ],
  1139. [
  1140. 'name' => 'Custom',
  1141. 'value' => 'custom',
  1142. ]
  1143. ];
  1144. }
  1145. public function netdataChartOptions()
  1146. {
  1147. return [
  1148. [
  1149. 'name' => 'Easy Pie Chart',
  1150. 'value' => 'easypiechart',
  1151. ],
  1152. [
  1153. 'name' => 'Gauge',
  1154. 'value' => 'gauge'
  1155. ]
  1156. ];
  1157. }
  1158. public function netdataColourOptions()
  1159. {
  1160. return [
  1161. [
  1162. 'name' => 'Red',
  1163. 'value' => 'fe3912',
  1164. ],
  1165. [
  1166. 'name' => 'Green',
  1167. 'value' => '46e302',
  1168. ],
  1169. [
  1170. 'name' => 'Purple',
  1171. 'value' => 'CC22AA'
  1172. ],
  1173. [
  1174. 'name' => 'Blue',
  1175. 'value' => '5054e6',
  1176. ],
  1177. [
  1178. 'name' => 'Yellow',
  1179. 'value' => 'dddd00',
  1180. ],
  1181. [
  1182. 'name' => 'Orange',
  1183. 'value' => 'd66300',
  1184. ]
  1185. ];
  1186. }
  1187. public function netdataSizeOptions()
  1188. {
  1189. return [
  1190. [
  1191. 'name' => 'Large',
  1192. 'value' => 'lg',
  1193. ],
  1194. [
  1195. 'name' => 'Medium',
  1196. 'value' => 'md',
  1197. ],
  1198. [
  1199. 'name' => 'Small',
  1200. 'value' => 'sm'
  1201. ]
  1202. ];
  1203. }
  1204. public function timeFormatOptions()
  1205. {
  1206. return array(
  1207. array(
  1208. 'name' => '6p',
  1209. 'value' => 'h(:mm)t'
  1210. ),
  1211. array(
  1212. 'name' => '6:00p',
  1213. 'value' => 'h:mmt'
  1214. ),
  1215. array(
  1216. 'name' => '6pm',
  1217. 'value' => 'h(:mm)a'
  1218. ),
  1219. array(
  1220. 'name' => '6:00pm',
  1221. 'value' => 'h:mma'
  1222. ),
  1223. array(
  1224. 'name' => '6:00',
  1225. 'value' => 'h:mm'
  1226. ),
  1227. array(
  1228. 'name' => '18',
  1229. 'value' => 'H(:mm)'
  1230. ),
  1231. array(
  1232. 'name' => '18:00',
  1233. 'value' => 'H:mm'
  1234. )
  1235. );
  1236. }
  1237. public function rTorrentSortOptions()
  1238. {
  1239. return array(
  1240. array(
  1241. 'name' => 'Date Desc',
  1242. 'value' => 'dated'
  1243. ),
  1244. array(
  1245. 'name' => 'Date Asc',
  1246. 'value' => 'datea'
  1247. ),
  1248. array(
  1249. 'name' => 'Hash Desc',
  1250. 'value' => 'hashd'
  1251. ),
  1252. array(
  1253. 'name' => 'Hash Asc',
  1254. 'value' => 'hasha'
  1255. ),
  1256. array(
  1257. 'name' => 'Name Desc',
  1258. 'value' => 'named'
  1259. ),
  1260. array(
  1261. 'name' => 'Name Asc',
  1262. 'value' => 'namea'
  1263. ),
  1264. array(
  1265. 'name' => 'Size Desc',
  1266. 'value' => 'sized'
  1267. ),
  1268. array(
  1269. 'name' => 'Size Asc',
  1270. 'value' => 'sizea'
  1271. ),
  1272. array(
  1273. 'name' => 'Label Desc',
  1274. 'value' => 'labeld'
  1275. ),
  1276. array(
  1277. 'name' => 'Label Asc',
  1278. 'value' => 'labela'
  1279. ),
  1280. array(
  1281. 'name' => 'Status Desc',
  1282. 'value' => 'statusd'
  1283. ),
  1284. array(
  1285. 'name' => 'Status Asc',
  1286. 'value' => 'statusa'
  1287. ),
  1288. );
  1289. }
  1290. public function qBittorrentApiOptions()
  1291. {
  1292. return array(
  1293. array(
  1294. 'name' => 'V1',
  1295. 'value' => '1'
  1296. ),
  1297. array(
  1298. 'name' => 'V2',
  1299. 'value' => '2'
  1300. ),
  1301. );
  1302. }
  1303. public function qBittorrentSortOptions()
  1304. {
  1305. return array(
  1306. array(
  1307. 'name' => 'Hash',
  1308. 'value' => 'hash'
  1309. ),
  1310. array(
  1311. 'name' => 'Name',
  1312. 'value' => 'name'
  1313. ),
  1314. array(
  1315. 'name' => 'Size',
  1316. 'value' => 'size'
  1317. ),
  1318. array(
  1319. 'name' => 'Progress',
  1320. 'value' => 'progress'
  1321. ),
  1322. array(
  1323. 'name' => 'Download Speed',
  1324. 'value' => 'dlspeed'
  1325. ),
  1326. array(
  1327. 'name' => 'Upload Speed',
  1328. 'value' => 'upspeed'
  1329. ),
  1330. array(
  1331. 'name' => 'Priority',
  1332. 'value' => 'priority'
  1333. ),
  1334. array(
  1335. 'name' => 'Number of Seeds',
  1336. 'value' => 'num_seeds'
  1337. ),
  1338. array(
  1339. 'name' => 'Number of Seeds in Swarm',
  1340. 'value' => 'num_complete'
  1341. ),
  1342. array(
  1343. 'name' => 'Number of Leechers',
  1344. 'value' => 'num_leechs'
  1345. ),
  1346. array(
  1347. 'name' => 'Number of Leechers in Swarm',
  1348. 'value' => 'num_incomplete'
  1349. ),
  1350. array(
  1351. 'name' => 'Ratio',
  1352. 'value' => 'ratio'
  1353. ),
  1354. array(
  1355. 'name' => 'ETA',
  1356. 'value' => 'eta'
  1357. ),
  1358. array(
  1359. 'name' => 'State',
  1360. 'value' => 'state'
  1361. ),
  1362. array(
  1363. 'name' => 'Category',
  1364. 'value' => 'category'
  1365. )
  1366. );
  1367. }
  1368. public function calendarDefaultOptions()
  1369. {
  1370. return array(
  1371. array(
  1372. 'name' => 'Month',
  1373. 'value' => 'month'
  1374. ),
  1375. array(
  1376. 'name' => 'Day',
  1377. 'value' => 'basicDay'
  1378. ),
  1379. array(
  1380. 'name' => 'Week',
  1381. 'value' => 'basicWeek'
  1382. ),
  1383. array(
  1384. 'name' => 'List',
  1385. 'value' => 'list'
  1386. )
  1387. );
  1388. }
  1389. }