Bläddra i källkod

clean up homepage item settings arrays
clean up option functions

CauseFX 5 år sedan
förälder
incheckning
1464e07930

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 41 - 2422
api/classes/organizr.class.php


+ 255 - 4
api/functions/option-functions.php

@@ -2,8 +2,77 @@
 
 trait OptionsFunction
 {
+	public function daysOptions()
+	{
+		return array(
+			array(
+				'name' => 'Sunday',
+				'value' => '0'
+			),
+			array(
+				'name' => 'Monday',
+				'value' => '1'
+			),
+			array(
+				'name' => 'Tueday',
+				'value' => '2'
+			),
+			array(
+				'name' => 'Wednesday',
+				'value' => '3'
+			),
+			array(
+				'name' => 'Thursday',
+				'value' => '4'
+			),
+			array(
+				'name' => 'Friday',
+				'value' => '5'
+			),
+			array(
+				'name' => 'Saturday',
+				'value' => '6'
+			)
+		);
+	}
+	
+	public function mediaServerOptions()
+	{
+		return array(
+			array(
+				'name' => 'N/A',
+				'value' => ''
+			),
+			array(
+				'name' => 'Plex',
+				'value' => 'plex'
+			),
+			array(
+				'name' => 'Emby [Not Available]',
+				'value' => 'emby'
+			)
+		);
+	}
+	
+	public function ombiTvOptions()
+	{
+		return array(
+			array(
+				'name' => 'All Seasons',
+				'value' => 'all'
+			),
+			array(
+				'name' => 'First Season Only',
+				'value' => 'first'
+			),
+			array(
+				'name' => 'Last Season Only',
+				'value' => 'last'
+			),
+		);
+	}
 	
-	public function optionLimit()
+	public function limitOptions()
 	{
 		return array(
 			array(
@@ -45,7 +114,7 @@ trait OptionsFunction
 		);
 	}
 	
-	public function optionNotificationTypes()
+	public function notificationTypesOptions()
 	{
 		return array(
 			array(
@@ -67,7 +136,7 @@ trait OptionsFunction
 		);
 	}
 	
-	public function optionNotificationPositions()
+	public function notificationPositionsOptions()
 	{
 		return array(
 			array(
@@ -101,7 +170,7 @@ trait OptionsFunction
 		);
 	}
 	
-	public function optionTime()
+	public function timeOptions()
 	{
 		return array(
 			array(
@@ -259,4 +328,186 @@ trait OptionsFunction
 			]
 		];
 	}
+	
+	public function timeFormatOptions()
+	{
+		return array(
+			array(
+				'name' => '6p',
+				'value' => 'h(:mm)t'
+			),
+			array(
+				'name' => '6:00p',
+				'value' => 'h:mmt'
+			),
+			array(
+				'name' => '6:00',
+				'value' => 'h:mm'
+			),
+			array(
+				'name' => '18',
+				'value' => 'H(:mm)'
+			),
+			array(
+				'name' => '18:00',
+				'value' => 'H:mm'
+			)
+		);
+	}
+	
+	public function rTorrentSortOptions()
+	{
+		return array(
+			array(
+				'name' => 'Date Desc',
+				'value' => 'dated'
+			),
+			array(
+				'name' => 'Date Asc',
+				'value' => 'datea'
+			),
+			array(
+				'name' => 'Hash Desc',
+				'value' => 'hashd'
+			),
+			array(
+				'name' => 'Hash Asc',
+				'value' => 'hasha'
+			),
+			array(
+				'name' => 'Name Desc',
+				'value' => 'named'
+			),
+			array(
+				'name' => 'Name Asc',
+				'value' => 'namea'
+			),
+			array(
+				'name' => 'Size Desc',
+				'value' => 'sized'
+			),
+			array(
+				'name' => 'Size Asc',
+				'value' => 'sizea'
+			),
+			array(
+				'name' => 'Label Desc',
+				'value' => 'labeld'
+			),
+			array(
+				'name' => 'Label Asc',
+				'value' => 'labela'
+			),
+			array(
+				'name' => 'Status Desc',
+				'value' => 'statusd'
+			),
+			array(
+				'name' => 'Status Asc',
+				'value' => 'statusa'
+			),
+		);
+	}
+	
+	public function qBittorrentApiOptions()
+	{
+		return array(
+			array(
+				'name' => 'V1',
+				'value' => '1'
+			),
+			array(
+				'name' => 'V2',
+				'value' => '2'
+			),
+		);
+	}
+	
+	public function qBittorrentSortOptions()
+	{
+		return array(
+			array(
+				'name' => 'Hash',
+				'value' => 'hash'
+			),
+			array(
+				'name' => 'Name',
+				'value' => 'name'
+			),
+			array(
+				'name' => 'Size',
+				'value' => 'size'
+			),
+			array(
+				'name' => 'Progress',
+				'value' => 'progress'
+			),
+			array(
+				'name' => 'Download Speed',
+				'value' => 'dlspeed'
+			),
+			array(
+				'name' => 'Upload Speed',
+				'value' => 'upspeed'
+			),
+			array(
+				'name' => 'Priority',
+				'value' => 'priority'
+			),
+			array(
+				'name' => 'Number of Seeds',
+				'value' => 'num_seeds'
+			),
+			array(
+				'name' => 'Number of Seeds in Swarm',
+				'value' => 'num_complete'
+			),
+			array(
+				'name' => 'Number of Leechers',
+				'value' => 'num_leechs'
+			),
+			array(
+				'name' => 'Number of Leechers in Swarm',
+				'value' => 'num_incomplete'
+			),
+			array(
+				'name' => 'Ratio',
+				'value' => 'ratio'
+			),
+			array(
+				'name' => 'ETA',
+				'value' => 'eta'
+			),
+			array(
+				'name' => 'State',
+				'value' => 'state'
+			),
+			array(
+				'name' => 'Category',
+				'value' => 'category'
+			)
+		);
+	}
+	
+	public function calendarDefaultOptions()
+	{
+		return array(
+			array(
+				'name' => 'Month',
+				'value' => 'month'
+			),
+			array(
+				'name' => 'Day',
+				'value' => 'basicDay'
+			),
+			array(
+				'name' => 'Week',
+				'value' => 'basicWeek'
+			),
+			array(
+				'name' => 'List',
+				'value' => 'list'
+			)
+		);
+	}
 }

+ 85 - 0
api/homepage/calendar.php

@@ -2,6 +2,91 @@
 
 trait CalendarHomepageItem
 {
+	public function calendarSettingsArray()
+	{
+		return array(
+			'name' => 'Calendar',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/calendar.png',
+			'category' => 'HOMEPAGE',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageCalendarEnabled',
+						'label' => 'Enable iCal',
+						'value' => $this->config['homepageCalendarEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageCalendarAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageCalendarAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'input',
+						'name' => 'calendariCal',
+						'label' => 'iCal URL\'s',
+						'value' => $this->config['calendariCal'],
+						'placeholder' => 'separate by comma\'s'
+					),
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'number',
+						'name' => 'calendarStart',
+						'label' => '# of Days Before',
+						'value' => $this->config['calendarStart'],
+						'placeholder' => ''
+					),
+					array(
+						'type' => 'number',
+						'name' => 'calendarEnd',
+						'label' => '# of Days After',
+						'value' => $this->config['calendarEnd'],
+						'placeholder' => ''
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarFirstDay',
+						'label' => 'Start Day',
+						'value' => $this->config['calendarFirstDay'],
+						'options' => $this->daysOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarDefault',
+						'label' => 'Default View',
+						'value' => $this->config['calendarDefault'],
+						'options' => $this->calendarDefaultOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarTimeFormat',
+						'label' => 'Time Format',
+						'value' => $this->config['calendarTimeFormat'],
+						'options' => $this->timeFormatOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarLimit',
+						'label' => 'Items Per Day',
+						'value' => $this->config['calendarLimit'],
+						'options' => $this->limitOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['calendarRefresh'],
+						'options' => $this->timeOptions()
+					)
+				),
+			)
+		);
+	}
+	
 	public function getCalendar()
 	{
 		$startDate = date('Y-m-d', strtotime("-" . $this->config['calendarStart'] . " days"));

+ 81 - 0
api/homepage/couchpotato.php

@@ -2,6 +2,87 @@
 
 trait CouchPotatoHomepageItem
 {
+	
+	public function couchPotatoSettingsArray()
+	{
+		return array(
+			'name' => 'CouchPotato',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/couchpotato.png',
+			'category' => 'PVR',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageCouchpotatoEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageCouchpotatoEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageCouchpotatoAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageCouchpotatoAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'couchpotatoURL',
+						'label' => 'URL',
+						'value' => $this->config['couchpotatoURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'couchpotatoToken',
+						'label' => 'Token',
+						'value' => $this->config['couchpotatoToken']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'select',
+						'name' => 'calendarFirstDay',
+						'label' => 'Start Day',
+						'value' => $this->config['calendarFirstDay'],
+						'options' => $this->daysOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarDefault',
+						'label' => 'Default View',
+						'value' => $this->config['calendarDefault'],
+						'options' => $this->calendarDefaultOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarTimeFormat',
+						'label' => 'Time Format',
+						'value' => $this->config['calendarTimeFormat'],
+						'options' => $this->timeFormatOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarLimit',
+						'label' => 'Items Per Day',
+						'value' => $this->config['calendarLimit'],
+						'options' => $this->limitOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['calendarRefresh'],
+						'options' => $this->timeOptions()
+					)
+				)
+			)
+		);
+	}
+	
 	public function getCouchPotatoCalendar()
 	{
 		if (!$this->config['homepageCouchpotatoEnabled']) {

+ 103 - 0
api/homepage/deluge.php

@@ -2,6 +2,109 @@
 
 trait DelugeHomepageItem
 {
+	public function delugeSettingsArray()
+	{
+		return array(
+			'name' => 'Deluge',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/deluge.png',
+			'category' => 'Downloader',
+			'settings' => array(
+				'custom' => '
+				<div class="row">
+                    <div class="col-lg-12">
+                        <div class="panel panel-info">
+                            <div class="panel-heading">
+								<span lang="en">Notice</span>
+                            </div>
+                            <div class="panel-wrapper collapse in" aria-expanded="true">
+                                <div class="panel-body">
+									<ul class="list-icons">
+                                        <li><i class="fa fa-chevron-right text-danger"></i> <a href="https://github.com/idlesign/deluge-webapi/tree/master/dist" target="_blank">Download Plugin</a></li>
+                                        <li><i class="fa fa-chevron-right text-danger"></i> Open Deluge Web UI, go to "Preferences -> Plugins -> Install plugin" and choose egg file.</li>
+                                        <li><i class="fa fa-chevron-right text-danger"></i> Activate WebAPI plugin </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+				</div>
+				',
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageDelugeEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageDelugeEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageDelugeAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageDelugeAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'delugeURL',
+						'label' => 'URL',
+						'value' => $this->config['delugeURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password',
+						'name' => 'delugePassword',
+						'label' => 'Password',
+						'value' => $this->config['delugePassword']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'delugeHideSeeding',
+						'label' => 'Hide Seeding',
+						'value' => $this->config['delugeHideSeeding']
+					), array(
+						'type' => 'switch',
+						'name' => 'delugeHideCompleted',
+						'label' => 'Hide Completed',
+						'value' => $this->config['delugeHideCompleted']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageDownloadRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageDownloadRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'delugeCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['delugeCombine']
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'deluge\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionDeluge()
 	{
 		if (empty($this->config['delugeURL'])) {

+ 160 - 0
api/homepage/emby.php

@@ -2,6 +2,166 @@
 
 trait EmbyHomepageItem
 {
+	public function embySettingsArray()
+	{
+		return array(
+			'name' => 'Emby',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/emby.png',
+			'category' => 'Media Server',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageEmbyEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageEmbyEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageEmbyAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageEmbyAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'embyURL',
+						'label' => 'URL',
+						'value' => $this->config['embyURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'embyToken',
+						'label' => 'Token',
+						'value' => $this->config['embyToken']
+					)
+				),
+				'Active Streams' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageEmbyStreams',
+						'label' => 'Enable',
+						'value' => $this->config['homepageEmbyStreams']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageEmbyStreamsAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepageEmbyStreamsAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageShowStreamNames',
+						'label' => 'User Information',
+						'value' => $this->config['homepageShowStreamNames']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageShowStreamNamesAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepageShowStreamNamesAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageStreamRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageStreamRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Recent Items' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageEmbyRecent',
+						'label' => 'Enable',
+						'value' => $this->config['homepageEmbyRecent']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageEmbyRecentAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepageEmbyRecentAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'number',
+						'name' => 'homepageRecentLimit',
+						'label' => 'Item Limit',
+						'value' => $this->config['homepageRecentLimit'],
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageRecentRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageRecentRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'embyTabName',
+						'label' => 'Emby Tab Name',
+						'value' => $this->config['embyTabName'],
+						'placeholder' => 'Only use if you have Emby in a reverse proxy'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'embyTabURL',
+						'label' => 'Emby Tab WAN URL',
+						'value' => $this->config['embyTabURL'],
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'select',
+						'name' => 'cacheImageSize',
+						'label' => 'Image Cache Size',
+						'value' => $this->config['cacheImageSize'],
+						'options' => array(
+							array(
+								'name' => 'Low',
+								'value' => '.5'
+							),
+							array(
+								'name' => '1x',
+								'value' => '1'
+							),
+							array(
+								'name' => '2x',
+								'value' => '2'
+							),
+							array(
+								'name' => '3x',
+								'value' => '3'
+							)
+						)
+					)
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'emby\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionEmby()
 	{
 		if (empty($this->config['embyURL'])) {

+ 60 - 0
api/homepage/healthchecks.php

@@ -2,6 +2,66 @@
 
 trait HealthChecksHomepageItem
 {
+	public function healthChecksSettingsArray()
+	{
+		return array(
+			'name' => 'HealthChecks',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/healthchecks.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageHealthChecksEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageHealthChecksEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageHealthChecksAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageHealthChecksAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'healthChecksURL',
+						'label' => 'URL',
+						'value' => $this->config['healthChecksURL'],
+						'help' => 'URL for HealthChecks API',
+						'placeholder' => 'HealthChecks API URL'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'healthChecksToken',
+						'label' => 'Token',
+						'value' => $this->config['healthChecksToken']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'healthChecksTags',
+						'label' => 'Tags',
+						'value' => $this->config['healthChecksTags'],
+						'help' => 'Pull only checks with this tag - Blank for all',
+						'placeholder' => 'Multiple tags using CSV - tag1,tag2'
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageHealthChecksRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageHealthChecksRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+			)
+		);
+	}
+	
 	public function healthChecksTags($tags)
 	{
 		$return = '?tag=';

+ 85 - 0
api/homepage/jdownloader.php

@@ -2,6 +2,91 @@
 
 trait JDownloaderHomepageItem
 {
+	public function jDownloaderSettingsArray()
+	{
+		return array(
+			'name' => 'JDownloader',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/jdownloader.png',
+			'category' => 'Downloader',
+			'settings' => array(
+				'custom' => '
+				<div class="row">
+                    <div class="col-lg-12">
+                        <div class="panel panel-info">
+                            <div class="panel-heading">
+								<span lang="en">Notice</span>
+                            </div>
+                            <div class="panel-wrapper collapse in" aria-expanded="true">
+                                <div class="panel-body">
+									<ul class="list-icons">
+                                        <li><i class="fa fa-chevron-right text-danger"></i> <a href="https://pypi.org/project/myjd-api/" target="_blank">Download [myjd-api] Module</a></li>
+                                        <li><i class="fa fa-chevron-right text-danger"></i> Add <b>/api/myjd</b> to the URL if you are using <a href="https://pypi.org/project/RSScrawler/" target="_blank">RSScrawler</a></li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+				</div>
+				',
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageJdownloaderEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageJdownloaderEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageJdownloaderAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageJdownloaderAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'jdownloaderURL',
+						'label' => 'URL',
+						'value' => $this->config['jdownloaderURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'select',
+						'name' => 'homepageDownloadRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageDownloadRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'jdownloaderCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['jdownloaderCombine']
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'jdownloader\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionJDownloader()
 	{
 		if (empty($this->config['jdownloaderURL'])) {

+ 161 - 0
api/homepage/jellyfin.php

@@ -2,6 +2,167 @@
 
 trait JellyfinHomepageItem
 {
+	
+	public function jellyfinSettingsArray()
+	{
+		return array(
+			'name' => 'Jellyfin',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/jellyfin.png',
+			'category' => 'Media Server',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageJellyfinEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageJellyfinEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageJellyfinAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageJellyfinAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'jellyfinURL',
+						'label' => 'URL',
+						'value' => $this->config['jellyfinURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'jellyfinToken',
+						'label' => 'Token',
+						'value' => $this->config['jellyfinToken']
+					)
+				),
+				'Active Streams' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageJellyfinStreams',
+						'label' => 'Enable',
+						'value' => $this->config['homepageJellyfinStreams']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageJellyStreamsAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepageJellyStreamsAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageShowStreamNames',
+						'label' => 'User Information',
+						'value' => $this->config['homepageShowStreamNames']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageShowStreamNamesAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepageShowStreamNamesAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageStreamRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageStreamRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Recent Items' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageJellyfinRecent',
+						'label' => 'Enable',
+						'value' => $this->config['homepageJellyfinRecent']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageJellyfinRecentAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepageJellyfinRecentAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'number',
+						'name' => 'homepageRecentLimit',
+						'label' => 'Item Limit',
+						'value' => $this->config['homepageRecentLimit'],
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageRecentRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageRecentRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'jellyfinTabName',
+						'label' => 'Jellyfin Tab Name',
+						'value' => $this->config['jellyfinTabName'],
+						'placeholder' => 'Only use if you have Jellyfin in a reverse proxy'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'jellyfinTabURL',
+						'label' => 'Jellyfin Tab WAN URL',
+						'value' => $this->config['jellyfinTabURL'],
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'select',
+						'name' => 'cacheImageSize',
+						'label' => 'Image Cache Size',
+						'value' => $this->config['cacheImageSize'],
+						'options' => array(
+							array(
+								'name' => 'Low',
+								'value' => '.5'
+							),
+							array(
+								'name' => '1x',
+								'value' => '1'
+							),
+							array(
+								'name' => '2x',
+								'value' => '2'
+							),
+							array(
+								'name' => '3x',
+								'value' => '3'
+							)
+						)
+					)
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'jellyfin\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionJellyfin()
 	{
 		if (empty($this->config['jellyfinURL'])) {

+ 138 - 0
api/homepage/lidarr.php

@@ -2,6 +2,144 @@
 
 trait LidarrHomepageItem
 {
+	public function lidarrSettingsArray()
+	{
+		return array(
+			'name' => 'Lidarr',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/lidarr.png',
+			'category' => 'PMR',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageLidarrEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageLidarrEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageLidarrAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageLidarrAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'lidarrURL',
+						'label' => 'URL',
+						'value' => $this->config['lidarrURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'lidarrToken',
+						'label' => 'Token',
+						'value' => $this->config['lidarrToken']
+					)
+				),
+				'API SOCKS' => array(
+					array(
+						'type' => 'html',
+						'override' => 12,
+						'label' => '',
+						'html' => '
+							<div class="panel panel-default">
+								<div class="panel-wrapper collapse in">
+									<div class="panel-body">
+										<h3 lang="en">Lidarr SOCKS API Connection</h3>
+										<p>Using this feature allows you to access the Lidarr API without having to reverse proxy it.  Just access it from: </p>
+										<code>' . $this->getServerPath() . 'api/v2/socks/lidarr/</code>
+									</div>
+								</div>
+							</div>'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'lidarrSocksEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['lidarrSocksEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'lidarrSocksAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['lidarrSocksAuth'],
+						'options' => $this->groupOptions
+					),
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'number',
+						'name' => 'calendarStart',
+						'label' => '# of Days Before',
+						'value' => $this->config['calendarStart'],
+						'placeholder' => ''
+					),
+					array(
+						'type' => 'number',
+						'name' => 'calendarEnd',
+						'label' => '# of Days After',
+						'value' => $this->config['calendarEnd'],
+						'placeholder' => ''
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarFirstDay',
+						'label' => 'Start Day',
+						'value' => $this->config['calendarFirstDay'],
+						'options' => $this->daysOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarDefault',
+						'label' => 'Default View',
+						'value' => $this->config['calendarDefault'],
+						'options' => $this->calendarDefaultOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarTimeFormat',
+						'label' => 'Time Format',
+						'value' => $this->config['calendarTimeFormat'],
+						'options' => $this->timeFormatOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarLimit',
+						'label' => 'Items Per Day',
+						'value' => $this->config['calendarLimit'],
+						'options' => $this->limitOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['calendarRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'lidarr\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionLidarr()
 	{
 		if (empty($this->config['lidarrURL'])) {

+ 67 - 0
api/homepage/monitorr.php

@@ -2,6 +2,73 @@
 
 trait MonitorrHomepageItem
 {
+	public function monitorrSettingsArray()
+	{
+		return array(
+			'name' => 'Monitorr',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/monitorr.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageMonitorrEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageMonitorrEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageMonitorrAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageMonitorrAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'monitorrURL',
+						'label' => 'URL',
+						'value' => $this->config['monitorrURL'],
+						'help' => 'URL for Monitorr. Please use the revers proxy URL i.e. https://domain.com/monitorr/.',
+						'placeholder' => 'http://domain.com/monitorr/'
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageMonitorrRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageMonitorrRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'monitorrHeader',
+						'label' => 'Title',
+						'value' => $this->config['monitorrHeader'],
+						'help' => 'Sets the title of this homepage module',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'monitorrHeaderToggle',
+						'label' => 'Toggle Title',
+						'value' => $this->config['monitorrHeaderToggle'],
+						'help' => 'Shows/hides the title of this homepage module'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'monitorrCompact',
+						'label' => 'Compact view',
+						'value' => $this->config['monitorrCompact'],
+						'help' => 'Toggles the compact view of this homepage module'
+					),
+				),
+			)
+		);
+	}
+	
 	public function getMonitorrHomepageData()
 	{
 		if (!$this->config['homepageMonitorrEnabled']) {

+ 1 - 1
api/homepage/netdata.php

@@ -287,7 +287,7 @@ trait NetDataHomepageItem
 				'name' => 'homepageNetdataRefresh',
 				'label' => 'Refresh Seconds',
 				'value' => $this->config['homepageNetdataRefresh'],
-				'options' => $this->optionTime()
+				'options' => $this->timeOptions()
 			),
 		);
 		return $array;

+ 78 - 0
api/homepage/nzbget.php

@@ -2,6 +2,84 @@
 
 trait NZBGetHomepageItem
 {
+	public function nzbgetSettingsArray()
+	{
+		return array(
+			'name' => 'NZBGet',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/nzbget.png',
+			'category' => 'Downloader',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageNzbgetEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageNzbgetEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageNzbgetAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageNzbgetAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'nzbgetURL',
+						'label' => 'URL',
+						'value' => $this->config['nzbgetURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'nzbgetUsername',
+						'label' => 'Username',
+						'value' => $this->config['nzbgetUsername']
+					),
+					array(
+						'type' => 'password',
+						'name' => 'nzbgetPassword',
+						'label' => 'Password',
+						'value' => $this->config['nzbgetPassword']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'select',
+						'name' => 'homepageDownloadRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageDownloadRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'nzbgetCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['nzbgetCombine']
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'nzbget\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionNZBGet()
 	{
 		if (empty($this->config['nzbgetURL'])) {

+ 59 - 0
api/homepage/octoprint.php

@@ -2,6 +2,65 @@
 
 trait OctoPrintHomepageItem
 {
+	public function octoprintSettingsArray()
+	{
+		return array(
+			'name' => 'Octoprint',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/octoprint.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageOctoprintEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageOctoprintEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageOctoprintAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageOctoprintAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'octoprintURL',
+						'label' => 'URL',
+						'value' => $this->config['octoprintURL'],
+						'help' => 'Enter the IP:PORT of your Octoprint instance e.g. http://octopi.local'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'octoprintToken',
+						'label' => 'API Key',
+						'value' => $this->config['octoprintToken'],
+						'help' => 'Enter your Octoprint API key, found in Octoprint settings page.'
+					),
+				),
+				'Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'octoprintHeader',
+						'label' => 'Title',
+						'value' => $this->config['octoprintHeader'],
+						'help' => 'Sets the title of this homepage module',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'octoprintToggle',
+						'label' => 'Toggle Title',
+						'value' => $this->config['octoprintHeaderToggle'],
+						'help' => 'Shows/hides the title of this homepage module'
+					),
+				),
+			)
+		);
+	}
+	
 	public function getOctoprintHomepageData()
 	{
 		if (!$this->config['homepageOctoprintEnabled']) {

+ 137 - 0
api/homepage/ombi.php

@@ -2,6 +2,143 @@
 
 trait OmbiHomepageItem
 {
+	
+	public function ombiSettingsArray()
+	{
+		return array(
+			'name' => 'Ombi',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/ombi.png',
+			'category' => 'Requests',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageOmbiEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageOmbiEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageOmbiAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageOmbiAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'ombiURL',
+						'label' => 'URL',
+						'value' => $this->config['ombiURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'ombiToken',
+						'label' => 'Token',
+						'value' => $this->config['ombiToken']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'select',
+						'name' => 'homepageOmbiRequestAuth',
+						'label' => 'Minimum Group to Request',
+						'value' => $this->config['homepageOmbiRequestAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'select',
+						'name' => 'ombiTvDefault',
+						'label' => 'TV Show Default Request',
+						'value' => $this->config['ombiTvDefault'],
+						'options' => $this->ombiTvOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'ombiLimitUser',
+						'label' => 'Limit to User',
+						'value' => $this->config['ombiLimitUser']
+					),
+					array(
+						'type' => 'number',
+						'name' => 'ombiLimit',
+						'label' => 'Item Limit',
+						'value' => $this->config['ombiLimit'],
+					),
+					array(
+						'type' => 'select',
+						'name' => 'ombiRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['ombiRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'ombiAlias',
+						'label' => 'Use Ombi Alias Names',
+						'value' => $this->config['ombiAlias'],
+						'help' => 'Use Ombi Alias Names instead of Usernames - If Alias is blank, Alias will fallback to Username'
+					)
+				),
+				'Default Filter' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'ombiDefaultFilterAvailable',
+						'label' => 'Show Available',
+						'value' => $this->config['ombiDefaultFilterAvailable'],
+						'help' => 'Show All Available Ombi Requests'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'ombiDefaultFilterUnavailable',
+						'label' => 'Show Unavailable',
+						'value' => $this->config['ombiDefaultFilterUnavailable'],
+						'help' => 'Show All Unavailable Ombi Requests'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'ombiDefaultFilterApproved',
+						'label' => 'Show Approved',
+						'value' => $this->config['ombiDefaultFilterApproved'],
+						'help' => 'Show All Approved Ombi Requests'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'ombiDefaultFilterUnapproved',
+						'label' => 'Show Unapproved',
+						'value' => $this->config['ombiDefaultFilterUnapproved'],
+						'help' => 'Show All Unapproved Ombi Requests'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'ombiDefaultFilterDenied',
+						'label' => 'Show Denied',
+						'value' => $this->config['ombiDefaultFilterDenied'],
+						'help' => 'Show All Denied Ombi Requests'
+					)
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'ombi\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionOmbi()
 	{
 		if (empty($this->config['ombiURL'])) {

+ 67 - 0
api/homepage/pihole.php

@@ -2,6 +2,73 @@
 
 trait PiHoleHomepageItem
 {
+	public function piholeSettingsArray()
+	{
+		return array(
+			'name' => 'Pi-hole',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/pihole.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepagePiholeEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepagePiholeEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepagePiholeAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepagePiholeAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'piholeURL',
+						'label' => 'URL',
+						'value' => $this->config['piholeURL'],
+						'help' => 'Please make sure to use local IP address and port and to include \'/admin/\' at the end of the URL. You can add multiple Pi-holes by comma separating the URLs.',
+						'placeholder' => 'http(s)://hostname:port/admin/'
+					),
+				),
+				'Misc' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'piholeHeaderToggle',
+						'label' => 'Toggle Title',
+						'value' => $this->config['piholeHeaderToggle'],
+						'help' => 'Shows/hides the title of this homepage module'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepagePiholeCombine',
+						'label' => 'Combine stat cards',
+						'value' => $this->config['homepagePiholeCombine'],
+						'help' => 'This controls whether to combine the stats for multiple pihole instances into 1 card.',
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'pihole\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionPihole()
 	{
 		if (empty($this->config['piholeURL'])) {

+ 204 - 0
api/homepage/plex.php

@@ -2,6 +2,210 @@
 
 trait PlexHomepageItem
 {
+	
+	public function plexSettingsArray()
+	{
+		return array(
+			'name' => 'Plex',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/plex.png',
+			'category' => 'Media Server',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepagePlexEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepagePlexEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepagePlexAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepagePlexAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'plexURL',
+						'label' => 'URL',
+						'value' => $this->config['plexURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'plexToken',
+						'label' => 'Token',
+						'value' => $this->config['plexToken']
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'plexID',
+						'label' => 'Plex Machine',
+						'value' => $this->config['plexID']
+					)
+				),
+				'Active Streams' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepagePlexStreams',
+						'label' => 'Enable',
+						'value' => $this->config['homepagePlexStreams']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepagePlexStreamsAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepagePlexStreamsAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageShowStreamNames',
+						'label' => 'User Information',
+						'value' => $this->config['homepageShowStreamNames']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageShowStreamNamesAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepageShowStreamNamesAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageStreamRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageStreamRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Recent Items' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepagePlexRecent',
+						'label' => 'Enable',
+						'value' => $this->config['homepagePlexRecent']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepagePlexRecentAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepagePlexRecentAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'number',
+						'name' => 'homepageRecentLimit',
+						'label' => 'Item Limit',
+						'value' => $this->config['homepageRecentLimit'],
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageRecentRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageRecentRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Media Search' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'mediaSearch',
+						'label' => 'Enable',
+						'value' => $this->config['mediaSearch']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'mediaSearchAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['mediaSearchAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'select',
+						'name' => 'mediaSearchType',
+						'label' => 'Media Server',
+						'value' => $this->config['mediaSearchType'],
+						'options' => $this->mediaServerOptions()
+					),
+				),
+				'Playlists' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepagePlexPlaylist',
+						'label' => 'Enable',
+						'value' => $this->config['homepagePlexPlaylist']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepagePlexPlaylistAuth',
+						'label' => 'Minimum Authorization',
+						'value' => $this->config['homepagePlexPlaylistAuth'],
+						'options' => $this->groupOptions
+					),
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'plexTabName',
+						'label' => 'Plex Tab Name',
+						'value' => $this->config['plexTabName'],
+						'placeholder' => 'Only use if you have Plex in a reverse proxy'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'plexTabURL',
+						'label' => 'Plex Tab WAN URL',
+						'value' => $this->config['plexTabURL'],
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'select',
+						'name' => 'cacheImageSize',
+						'label' => 'Image Cache Size',
+						'value' => $this->config['cacheImageSize'],
+						'options' => array(
+							array(
+								'name' => 'Low',
+								'value' => '.5'
+							),
+							array(
+								'name' => '1x',
+								'value' => '1'
+							),
+							array(
+								'name' => '2x',
+								'value' => '2'
+							),
+							array(
+								'name' => '3x',
+								'value' => '3'
+							)
+						)
+					)
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'plex\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionPlex()
 	{
 		if (!empty($this->config['plexURL']) && !empty($this->config['plexToken'])) {

+ 109 - 0
api/homepage/qbittorrent.php

@@ -2,6 +2,115 @@
 
 trait QBitTorrentHomepageItem
 {
+	public function qBittorrentSettingsArray()
+	{
+		return array(
+			'name' => 'qBittorrent',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/qBittorrent.png',
+			'category' => 'Downloader',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageqBittorrentEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageqBittorrentEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageqBittorrentAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageqBittorrentAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'qBittorrentURL',
+						'label' => 'URL',
+						'value' => $this->config['qBittorrentURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'select',
+						'name' => 'qBittorrentApiVersion',
+						'label' => 'API Version',
+						'value' => $this->config['qBittorrentApiVersion'],
+						'options' => $this->qBittorrentApiOptions()
+					),
+					array(
+						'type' => 'input',
+						'name' => 'qBittorrentUsername',
+						'label' => 'Username',
+						'value' => $this->config['qBittorrentUsername']
+					),
+					array(
+						'type' => 'password',
+						'name' => 'qBittorrentPassword',
+						'label' => 'Password',
+						'value' => $this->config['qBittorrentPassword']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'qBittorrentHideSeeding',
+						'label' => 'Hide Seeding',
+						'value' => $this->config['qBittorrentHideSeeding']
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'qBittorrentHideCompleted',
+						'label' => 'Hide Completed',
+						'value' => $this->config['qBittorrentHideCompleted']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'qBittorrentSortOrder',
+						'label' => 'Order',
+						'value' => $this->config['qBittorrentSortOrder'],
+						'options' => $this->qBittorrentSortOptions()
+					), array(
+						'type' => 'switch',
+						'name' => 'qBittorrentReverseSorting',
+						'label' => 'Reverse Sorting',
+						'value' => $this->config['qBittorrentReverseSorting']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageDownloadRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageDownloadRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'qBittorrentCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['qBittorrentCombine']
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'qbittorrent\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionQBittorrent()
 	{
 		if (empty($this->config['qBittorrentURL'])) {

+ 166 - 0
api/homepage/radarr.php

@@ -2,6 +2,172 @@
 
 trait RadarrHomepageItem
 {
+	public function radarrSettingsArray()
+	{
+		return array(
+			'name' => 'Radarr',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/radarr.png',
+			'category' => 'PVR',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageRadarrEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageRadarrEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageRadarrAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageRadarrAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'radarrURL',
+						'label' => 'URL',
+						'value' => $this->config['radarrURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'radarrToken',
+						'label' => 'Token',
+						'value' => $this->config['radarrToken']
+					)
+				),
+				'API SOCKS' => array(
+					array(
+						'type' => 'html',
+						'override' => 12,
+						'label' => '',
+						'html' => '
+							<div class="panel panel-default">
+								<div class="panel-wrapper collapse in">
+									<div class="panel-body">
+										<h3 lang="en">Radarr SOCKS API Connection</h3>
+										<p>Using this feature allows you to access the Radarr API without having to reverse proxy it.  Just access it from: </p>
+										<code>' . $this->getServerPath() . 'api/v2/socks/radarr/</code>
+									</div>
+								</div>
+							</div>'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'radarrSocksEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['radarrSocksEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'radarrSocksAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['radarrSocksAuth'],
+						'options' => $this->groupOptions
+					),
+				),
+				'Queue' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageRadarrQueueEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageRadarrQueueEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageRadarrQueueAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageRadarrQueueAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageRadarrQueueCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['homepageRadarrQueueCombine']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageRadarrQueueRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageRadarrQueueRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Calendar' => array(
+					array(
+						'type' => 'number',
+						'name' => 'calendarStart',
+						'label' => '# of Days Before',
+						'value' => $this->config['calendarStart'],
+						'placeholder' => ''
+					),
+					array(
+						'type' => 'number',
+						'name' => 'calendarEnd',
+						'label' => '# of Days After',
+						'value' => $this->config['calendarEnd'],
+						'placeholder' => ''
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarFirstDay',
+						'label' => 'Start Day',
+						'value' => $this->config['calendarFirstDay'],
+						'options' => $this->daysOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarDefault',
+						'label' => 'Default View',
+						'value' => $this->config['calendarDefault'],
+						'options' => $this->calendarDefaultOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarTimeFormat',
+						'label' => 'Time Format',
+						'value' => $this->config['calendarTimeFormat'],
+						'options' => $this->timeFormatOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarLimit',
+						'label' => 'Items Per Day',
+						'value' => $this->config['calendarLimit'],
+						'options' => $this->limitOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['calendarRefresh'],
+						'options' => $this->timeOptions()
+					)
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'radarr\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionRadarr()
 	{
 		if (empty($this->config['radarrURL'])) {

+ 150 - 0
api/homepage/rtorrent.php

@@ -2,6 +2,156 @@
 
 trait RTorrentHomepageItem
 {
+	public function rTorrentSettingsArray()
+	{
+		$xmlStatus = (extension_loaded('xmlrpc')) ? 'Installed' : 'Not Installed';
+		return array(
+			'name' => 'rTorrent',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/rTorrent.png',
+			'category' => 'Downloader',
+			'settings' => array(
+				'FYI' => array(
+					array(
+						'type' => 'html',
+						'label' => '',
+						'override' => 12,
+						'html' => '
+						<div class="row">
+						    <div class="col-lg-12">
+						        <div class="panel panel-info">
+						            <div class="panel-heading">
+						                <span lang="en">ATTENTION</span>
+						            </div>
+						            <div class="panel-wrapper collapse in" aria-expanded="true">
+						                <div class="panel-body">
+						                	<h4 lang="en">This module requires XMLRPC</h4>
+						                    <span lang="en">Status: [ <b>' . $xmlStatus . '</b> ]</span>
+						                    <br/></br>
+						                    <span lang="en">
+						                    	<h4><b>Note about API URL</b></h4>
+						                    	Organizr appends the url with <code>/RPC2</code> unless the URL ends in <code>.php</code><br/>
+						                    	<h5>Possible URLs:</h5>
+						                    	<li>http://localhost:8080</li>
+						                    	<li>https://domain.site/xmlrpc.php</li>
+						                    	<li>https://seedbox.site/rutorrent/plugins/httprpc/action.php</li>
+						                    </span>
+						                </div>
+						            </div>
+						        </div>
+						    </div>
+						</div>
+						'
+					)
+				),
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepagerTorrentEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepagerTorrentEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepagerTorrentAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepagerTorrentAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'rTorrentURL',
+						'label' => 'URL',
+						'value' => $this->config['rTorrentURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'rTorrentURLOverride',
+						'label' => 'rTorrent API URL Override',
+						'value' => $this->config['rTorrentURLOverride'],
+						'help' => 'Only use if you cannot connect.  Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port/xmlrpc'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'rTorrentUsername',
+						'label' => 'Username',
+						'value' => $this->config['rTorrentUsername']
+					),
+					array(
+						'type' => 'password',
+						'name' => 'rTorrentPassword',
+						'label' => 'Password',
+						'value' => $this->config['rTorrentPassword']
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'rTorrentDisableCertCheck',
+						'label' => 'Disable Certificate Check',
+						'value' => $this->config['rTorrentDisableCertCheck']
+					),
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'rTorrentHideSeeding',
+						'label' => 'Hide Seeding',
+						'value' => $this->config['rTorrentHideSeeding']
+					), array(
+						'type' => 'switch',
+						'name' => 'rTorrentHideCompleted',
+						'label' => 'Hide Completed',
+						'value' => $this->config['rTorrentHideCompleted']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'rTorrentSortOrder',
+						'label' => 'Order',
+						'value' => $this->config['rTorrentSortOrder'],
+						'options' => $this->rTorrentSortOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageDownloadRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageDownloadRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'number',
+						'name' => 'rTorrentLimit',
+						'label' => 'Item Limit',
+						'value' => $this->config['rTorrentLimit'],
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'rTorrentCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['rTorrentCombine']
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'rtorrent\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionRTorrent()
 	{
 		if (empty($this->config['rTorrentURL']) && empty($this->config['rTorrentURLOverride'])) {

+ 73 - 0
api/homepage/sabnzbd.php

@@ -2,6 +2,79 @@
 
 trait SabNZBdHomepageItem
 {
+	
+	public function sabNZBdSettingsArray()
+	{
+		return array(
+			'name' => 'SabNZBD',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/sabnzbd.png',
+			'category' => 'Downloader',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageSabnzbdEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageSabnzbdEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageSabnzbdAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageSabnzbdAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'sabnzbdURL',
+						'label' => 'URL',
+						'value' => $this->config['sabnzbdURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'sabnzbdToken',
+						'label' => 'Token',
+						'value' => $this->config['sabnzbdToken']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'select',
+						'name' => 'homepageDownloadRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageDownloadRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'sabnzbdCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['sabnzbdCombine']
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'sabnzbd\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionSabNZBd()
 	{
 		if (!empty($this->config['sabnzbdURL']) && !empty($this->config['sabnzbdToken'])) {

+ 94 - 0
api/homepage/sickrage.php

@@ -2,6 +2,100 @@
 
 trait SickRageHomepageItem
 {
+	public function sickrageSettingsArray()
+	{
+		return array(
+			'name' => 'SickRage',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/sickrage.png',
+			'category' => 'PVR',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageSickrageEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageSickrageEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageSickrageAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageSickrageAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'sickrageURL',
+						'label' => 'URL',
+						'value' => $this->config['sickrageURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'sickrageToken',
+						'label' => 'Token',
+						'value' => $this->config['sickrageToken']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'select',
+						'name' => 'calendarFirstDay',
+						'label' => 'Start Day',
+						'value' => $this->config['calendarFirstDay'],
+						'options' => $this->daysOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarDefault',
+						'label' => 'Default View',
+						'value' => $this->config['calendarDefault'],
+						'options' => $this->calendarDefaultOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarTimeFormat',
+						'label' => 'Time Format',
+						'value' => $this->config['calendarTimeFormat'],
+						'options' => $this->timeFormatOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarLimit',
+						'label' => 'Items Per Day',
+						'value' => $this->config['calendarLimit'],
+						'options' => $this->limitOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['calendarRefresh'],
+						'options' => $this->timeOptions()
+					)
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'sickrage\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionSickRage()
 	{
 		if (empty($this->config['sickrageURL'])) {

+ 171 - 0
api/homepage/sonarr.php

@@ -2,6 +2,177 @@
 
 trait SonarrHomepageItem
 {
+	public function sonarrSettingsArray()
+	{
+		return array(
+			'name' => 'Sonarr',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/sonarr.png',
+			'category' => 'PVR',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageSonarrEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageSonarrEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageSonarrAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageSonarrAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'sonarrURL',
+						'label' => 'URL',
+						'value' => $this->config['sonarrURL'],
+						'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'sonarrToken',
+						'label' => 'Token',
+						'value' => $this->config['sonarrToken']
+					)
+				),
+				'API SOCKS' => array(
+					array(
+						'type' => 'html',
+						'override' => 12,
+						'label' => '',
+						'html' => '
+							<div class="panel panel-default">
+								<div class="panel-wrapper collapse in">
+									<div class="panel-body">
+										<h3 lang="en">Sonarr SOCKS API Connection</h3>
+										<p>Using this feature allows you to access the Sonarr API without having to reverse proxy it.  Just access it from: </p>
+										<code>' . $this->getServerPath() . 'api/v2/socks/sonarr/</code>
+									</div>
+								</div>
+							</div>'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'sonarrSocksEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['sonarrSocksEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'sonarrSocksAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['sonarrSocksAuth'],
+						'options' => $this->groupOptions
+					),
+				),
+				'Queue' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageSonarrQueueEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageSonarrQueueEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageSonarrQueueAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageSonarrQueueAuth'],
+						'options' => $this->groupOptions
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageSonarrQueueCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['homepageSonarrQueueCombine']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageSonarrQueueRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageSonarrQueueRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Calendar' => array(
+					array(
+						'type' => 'number',
+						'name' => 'calendarStart',
+						'label' => '# of Days Before',
+						'value' => $this->config['calendarStart'],
+						'placeholder' => ''
+					),
+					array(
+						'type' => 'number',
+						'name' => 'calendarEnd',
+						'label' => '# of Days After',
+						'value' => $this->config['calendarEnd'],
+						'placeholder' => ''
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarFirstDay',
+						'label' => 'Start Day',
+						'value' => $this->config['calendarFirstDay'],
+						'options' => $this->daysOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarDefault',
+						'label' => 'Default View',
+						'value' => $this->config['calendarDefault'],
+						'options' => $this->calendarDefaultOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarTimeFormat',
+						'label' => 'Time Format',
+						'value' => $this->config['calendarTimeFormat'],
+						'options' => $this->timeFormatOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarLimit',
+						'label' => 'Items Per Day',
+						'value' => $this->config['calendarLimit'],
+						'options' => $this->limitOptions()
+					),
+					array(
+						'type' => 'select',
+						'name' => 'calendarRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['calendarRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'sonarrUnmonitored',
+						'label' => 'Show Unmonitored',
+						'value' => $this->config['sonarrUnmonitored']
+					)
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'sonarr\')"'
+					),
+				)
+			)
+		);
+	}
 	
 	public function testConnectionSonarr()
 	{

+ 58 - 0
api/homepage/speedtest.php

@@ -2,6 +2,64 @@
 
 trait SpeedTestHomepageItem
 {
+	public function speedTestSettingsArray()
+	{
+		return array(
+			'name' => 'Speedtest',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/speedtest-icon.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'html',
+						'override' => 6,
+						'label' => 'Info',
+						'html' => '<p>This homepage item requires <a href="https://github.com/henrywhitaker3/Speedtest-Tracker" target="_blank" rel="noreferrer noopener">Speedtest-Tracker <i class="fa fa-external-link" aria-hidden="true"></i></a> to be running on your network.</p>'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageSpeedtestEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageSpeedtestEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageSpeedtestAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageSpeedtestAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'speedtestURL',
+						'label' => 'URL',
+						'value' => $this->config['speedtestURL'],
+						'help' => 'Enter the IP:PORT of your speedtest instance e.g. http(s)://<ip>:<port>'
+					),
+				),
+				'Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'speedtestHeader',
+						'label' => 'Title',
+						'value' => $this->config['speedtestHeader'],
+						'help' => 'Sets the title of this homepage module',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'speedtestHeaderToggle',
+						'label' => 'Toggle Title',
+						'value' => $this->config['speedtestHeaderToggle'],
+						'help' => 'Shows/hides the title of this homepage module'
+					),
+				),
+			)
+		);
+	}
+	
 	public function getSpeedtestHomepageData()
 	{
 		if (!$this->config['homepageSpeedtestEnabled']) {

+ 156 - 0
api/homepage/tatutulli.php

@@ -2,6 +2,162 @@
 
 trait TautulliHomepageItem
 {
+	public function tautulliSettingsArray()
+	{
+		return array(
+			'name' => 'Tautulli',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/tautulli.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageTautulliEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageTautulliEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageTautulliAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageTautulliAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'tautulliHeader',
+						'label' => 'Title',
+						'value' => $this->config['tautulliHeader'],
+						'help' => 'Sets the title of this homepage module'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'tautulliHeaderToggle',
+						'label' => 'Toggle Title',
+						'value' => $this->config['tautulliHeaderToggle'],
+						'help' => 'Shows/hides the title of this homepage module'
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'tautulliURL',
+						'label' => 'URL',
+						'value' => $this->config['tautulliURL'],
+						'help' => 'URL for Tautulli API, include the IP, the port and the base URL (e.g. /tautulli/) in the URL',
+						'placeholder' => 'http://<ip>:<port>'
+					),
+					array(
+						'type' => 'password-alt',
+						'name' => 'tautulliApikey',
+						'label' => 'API Key',
+						'value' => $this->config['tautulliApikey']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageTautulliRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageTautulliRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Library Stats' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'tautulliLibraries',
+						'label' => 'Libraries',
+						'value' => $this->config['tautulliLibraries'],
+						'help' => 'Shows/hides the card with library information.',
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageTautulliLibraryAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageTautulliLibraryAuth'],
+						'options' => $this->groupOptions
+					),
+				),
+				'Viewing Stats' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'tautulliPopularMovies',
+						'label' => 'Popular Movies',
+						'value' => $this->config['tautulliPopularMovies'],
+						'help' => 'Shows/hides the card with Popular Movies information.',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'tautulliPopularTV',
+						'label' => 'Popular TV',
+						'value' => $this->config['tautulliPopularTV'],
+						'help' => 'Shows/hides the card with Popular TV information.',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'tautulliTopMovies',
+						'label' => 'Top Movies',
+						'value' => $this->config['tautulliTopMovies'],
+						'help' => 'Shows/hides the card with Top Movies information.',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'tautulliTopTV',
+						'label' => 'Top TV',
+						'value' => $this->config['tautulliTopTV'],
+						'help' => 'Shows/hides the card with Top TV information.',
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageTautulliViewsAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageTautulliViewsAuth'],
+						'options' => $this->groupOptions
+					),
+				),
+				'Misc Stats' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'tautulliTopUsers',
+						'label' => 'Top Users',
+						'value' => $this->config['tautulliTopUsers'],
+						'help' => 'Shows/hides the card with Top Users information.',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'tautulliTopPlatforms',
+						'label' => 'Top Platforms',
+						'value' => $this->config['tautulliTopPlatforms'],
+						'help' => 'Shows/hides the card with Top Platforms information.',
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageTautulliMiscAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageTautulliMiscAuth'],
+						'options' => $this->groupOptions
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'tautulli\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionTautulli()
 	{
 		if (empty($this->config['tautulliURL'])) {

+ 89 - 0
api/homepage/transmission.php

@@ -2,6 +2,95 @@
 
 trait TransmissionHomepageItem
 {
+	public function transmissionSettingsArray()
+	{
+		return array(
+			'name' => 'Transmission',
+			'enabled' => strpos('personal', $this->config['license']) !== false,
+			'image' => 'plugins/images/tabs/transmission.png',
+			'category' => 'Downloader',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageTransmissionEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageTransmissionEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageTransmissionAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageTransmissionAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'transmissionURL',
+						'label' => 'URL',
+						'value' => $this->config['transmissionURL'],
+						'help' => 'Please do not included /web in URL.  Please make sure to use local IP address and port - You also may use local dns name too.',
+						'placeholder' => 'http(s)://hostname:port'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'transmissionUsername',
+						'label' => 'Username',
+						'value' => $this->config['transmissionUsername']
+					),
+					array(
+						'type' => 'password',
+						'name' => 'transmissionPassword',
+						'label' => 'Password',
+						'value' => $this->config['transmissionPassword']
+					)
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'transmissionHideSeeding',
+						'label' => 'Hide Seeding',
+						'value' => $this->config['transmissionHideSeeding']
+					), array(
+						'type' => 'switch',
+						'name' => 'transmissionHideCompleted',
+						'label' => 'Hide Completed',
+						'value' => $this->config['transmissionHideCompleted']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageDownloadRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageDownloadRefresh'],
+						'options' => $this->timeOptions()
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'transmissionCombine',
+						'label' => 'Add to Combined Downloader',
+						'value' => $this->config['transmissionCombine']
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'transmission\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function testConnectionTransmission()
 	{
 		if (empty($this->config['transmissionURL'])) {

+ 91 - 0
api/homepage/unifi.php

@@ -2,6 +2,97 @@
 
 trait UnifiHomepageItem
 {
+	public function unifiSettingsArray()
+	{
+		return array(
+			'name' => 'Unifi',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/ubnt.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageUnifiEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageUnifiEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageUnifiAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageUnifiAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'unifiURL',
+						'label' => 'URL',
+						'value' => $this->config['unifiURL'],
+						'help' => 'URL for Unifi',
+						'placeholder' => 'Unifi API URL'
+					),
+					array(
+						'type' => 'blank',
+						'label' => ''
+					),
+					array(
+						'type' => 'input',
+						'name' => 'unifiUsername',
+						'label' => 'Username',
+						'value' => $this->config['unifiUsername'],
+						'help' => 'Username is case-sensitive',
+					),
+					array(
+						'type' => 'password',
+						'name' => 'unifiPassword',
+						'label' => 'Password',
+						'value' => $this->config['unifiPassword']
+					),
+					array(
+						'type' => 'input',
+						'name' => 'unifiSiteName',
+						'label' => 'Site Name (Not for UnifiOS)',
+						'value' => $this->config['unifiSiteName'],
+						'help' => 'Site Name - not Site ID nor Site Description',
+					),
+					array(
+						'type' => 'button',
+						'label' => 'Grab Unifi Site (Not for UnifiOS)',
+						'icon' => 'fa fa-building',
+						'text' => 'Get Unifi Site',
+						'attr' => 'onclick="getUnifiSite()"'
+					),
+				),
+				'Misc Options' => array(
+					array(
+						'type' => 'select',
+						'name' => 'homepageUnifiRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageUnifiRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+				'Test Connection' => array(
+					array(
+						'type' => 'blank',
+						'label' => 'Please Save before Testing'
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-flask',
+						'class' => 'pull-right',
+						'text' => 'Test Connection',
+						'attr' => 'onclick="testAPIConnection(\'unifi\')"'
+					),
+				)
+			)
+		);
+	}
+	
 	public function getUnifiSiteName()
 	{
 		if (empty($this->config['unifiURL'])) {

+ 115 - 0
api/homepage/weather.php

@@ -2,6 +2,121 @@
 
 trait WeatherHomepageItem
 {
+	public function weatherSettingsArray()
+	{
+		return array(
+			'name' => 'Weather-Air',
+			'enabled' => true,
+			'image' => 'plugins/images/tabs/wind.png',
+			'category' => 'Monitor',
+			'settings' => array(
+				'Enable' => array(
+					array(
+						'type' => 'switch',
+						'name' => 'homepageWeatherAndAirEnabled',
+						'label' => 'Enable',
+						'value' => $this->config['homepageWeatherAndAirEnabled']
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageWeatherAndAirAuth',
+						'label' => 'Minimum Authentication',
+						'value' => $this->config['homepageWeatherAndAirAuth'],
+						'options' => $this->groupOptions
+					)
+				),
+				'Connection' => array(
+					array(
+						'type' => 'input',
+						'name' => 'homepageWeatherAndAirLatitude',
+						'label' => 'Latitude',
+						'value' => $this->config['homepageWeatherAndAirLatitude'],
+						'help' => 'Please enter full latitude including minus if needed'
+					),
+					array(
+						'type' => 'input',
+						'name' => 'homepageWeatherAndAirLongitude',
+						'label' => 'Longitude',
+						'value' => $this->config['homepageWeatherAndAirLongitude'],
+						'help' => 'Please enter full longitude including minus if needed'
+					),
+					array(
+						'type' => 'blank',
+						'label' => ''
+					),
+					array(
+						'type' => 'button',
+						'label' => '',
+						'icon' => 'fa fa-search',
+						'class' => 'pull-right',
+						'text' => 'Need Help With Coordinates?',
+						'attr' => 'onclick="showLookupCoordinatesModal()"'
+					),
+				),
+				'Options' => array(
+					array(
+						'type' => 'input',
+						'name' => 'homepageWeatherAndAirWeatherHeader',
+						'label' => 'Title',
+						'value' => $this->config['homepageWeatherAndAirWeatherHeader'],
+						'help' => 'Sets the title of this homepage module',
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageWeatherAndAirWeatherHeaderToggle',
+						'label' => 'Toggle Title',
+						'value' => $this->config['homepageWeatherAndAirWeatherHeaderToggle'],
+						'help' => 'Shows/hides the title of this homepage module'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageWeatherAndAirWeatherEnabled',
+						'label' => 'Enable Weather',
+						'value' => $this->config['homepageWeatherAndAirWeatherEnabled'],
+						'help' => 'Toggles the view module for Weather'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageWeatherAndAirAirQualityEnabled',
+						'label' => 'Enable Air Quality',
+						'value' => $this->config['homepageWeatherAndAirAirQualityEnabled'],
+						'help' => 'Toggles the view module for Air Quality'
+					),
+					array(
+						'type' => 'switch',
+						'name' => 'homepageWeatherAndAirPollenEnabled',
+						'label' => 'Enable Pollen',
+						'value' => $this->config['homepageWeatherAndAirPollenEnabled'],
+						'help' => 'Toggles the view module for Pollen'
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageWeatherAndAirUnits',
+						'label' => 'Unit of Measurement',
+						'value' => $this->config['homepageWeatherAndAirUnits'],
+						'options' => array(
+							array(
+								'name' => 'Imperial',
+								'value' => 'imperial'
+							),
+							array(
+								'name' => 'Metric',
+								'value' => 'metric'
+							)
+						)
+					),
+					array(
+						'type' => 'select',
+						'name' => 'homepageWeatherAndAirRefresh',
+						'label' => 'Refresh Seconds',
+						'value' => $this->config['homepageWeatherAndAirRefresh'],
+						'options' => $this->timeOptions()
+					),
+				),
+			)
+		);
+	}
+	
 	public function searchCityForCoordinates($query)
 	{
 		try {

+ 1 - 1
api/plugins/chat.php

@@ -62,7 +62,7 @@ class Chat extends Organizr
 					'name' => 'CHAT-userRefreshTimeout',
 					'label' => 'Refresh Seconds',
 					'value' => $this->config['CHAT-userRefreshTimeout'],
-					'options' => $this->optionTime()
+					'options' => $this->timeOptions()
 				),
 				array(
 					'type' => 'select',

Vissa filer visades inte eftersom för många filer har ändrats