Compare commits

..

298 Commits

Author SHA1 Message Date
KodeStar
1071b85472 Merge pull request #160 from LiamAkkerman/master
SupportedApp: Grafana
2018-03-26 08:34:56 +01:00
KodeStar
479412b190 Merge pull request #157 from halorrr/patch-2
SupportedApp: Cardigann
2018-03-26 08:34:26 +01:00
KodeStar
ac4fc5b0ba Merge pull request #156 from halorrr/patch-1
SupportedApp: pyLoad
2018-03-26 08:33:28 +01:00
KodeStar
4a8770232d Merge pull request #158 from rigrassm/mobile-app-compatible
Add html needed to allow the site to load as a mobile app
2018-03-26 08:31:40 +01:00
Liam B. Akkerman
2ea983bdae rename grafana icon file 2018-03-24 21:40:52 -07:00
Liam B. Akkerman
ffce8fa505 add grafana to readme 2018-03-24 21:37:07 -07:00
Liam B. Akkerman
cb9e529eb7 add grafana to Item.php 2018-03-24 21:35:23 -07:00
Liam B. Akkerman
7f0ee208fa add grafana icon 2018-03-24 21:29:46 -07:00
Liam B. Akkerman
2d38652034 add grafana app php 2018-03-24 21:23:15 -07:00
Ricky Grassmuck
4a2076a550 One more indentation fix
This time I really did fix it I swear!
2018-03-23 18:25:36 -05:00
Ricky Grassmuck
35049b26fe Fix Indentation
Fixed indentation of newly added lines to match existing lines.
2018-03-23 18:24:40 -05:00
Ricky Grassmuck
39648ba372 Add html needed to allow the site to load as a mobile app 2018-03-23 18:11:04 -05:00
KodeStar
44ce0bbffd Merge pull request #155 from imcdona/master
Document adding a supported application
2018-03-22 15:01:44 +00:00
halorrr
a634472873 Create Cardigann.php 2018-03-21 11:28:30 -04:00
halorrr
a98c30f7fa Update Item.php 2018-03-21 11:25:31 -04:00
halorrr
43d4b80e11 Add files via upload 2018-03-21 16:24:47 +01:00
halorrr
09926fcc53 Update readme.md 2018-03-21 11:24:14 -04:00
halorrr
17eef7a4aa Update pyLoad.php 2018-03-21 11:17:12 -04:00
halorrr
4738d7c951 Create pyLoad.php 2018-03-21 11:07:16 -04:00
halorrr
4be0af5fa3 Update Item.php 2018-03-21 11:06:33 -04:00
halorrr
8aaa0900e5 Add files via upload 2018-03-21 16:05:38 +01:00
halorrr
49b5d9b886 Update readme.md 2018-03-21 11:03:40 -04:00
Isaac McDonald
7a3912767b Document adding a supported application
If you type the name of a supported application quickly enough in the title field, you'll never see the option to select that application from the list. Long term I think this needs to be addressed. In the short term, an explanation will suffice.
2018-03-21 07:52:47 -07:00
KodeStar
d1e473aafe Merge pull request #151 from halorrr/patch-3
SupportedApp: Watcher3
2018-03-21 12:59:41 +00:00
KodeStar
c91eb7ed47 Merge branch 'master' into patch-3 2018-03-21 12:59:21 +00:00
KodeStar
443f631bac Merge pull request #146 from halorrr/patch-1
SupportedApp: AirSonic
2018-03-21 12:57:53 +00:00
KodeStar
95be8d4698 Merge branch 'master' into patch-1 2018-03-21 12:57:39 +00:00
KodeStar
f3926d020f Merge pull request #154 from imcdona/master
Changed pFsense to the proper pfSense. Changed Ttrss to tt-rss
2018-03-21 12:56:13 +00:00
KodeStar
b48eb5fdd3 Merge pull request #153 from albertsj1/better_transmission_icon
New Transmission icon with transparent background
2018-03-21 12:55:41 +00:00
KodeStar
b0fecdd017 Merge pull request #147 from halorrr/patch-2
SupportedApp: OpenVaultMedia
2018-03-21 12:55:08 +00:00
KodeStar
793483b6e9 Merge pull request #145 from halorrr/master
SupportedApp: WebTools
2018-03-21 12:54:21 +00:00
Isaac McDonald
c99c7fa9af Changed pFsense to the proper pfSense. Changed Ttrss to tt-rss 2018-03-20 14:15:01 -07:00
John Alberts
59449a73e1 New Transmission icon with transparent background 2018-03-20 08:31:12 -07:00
halorrr
dc86d636ac Create Watcher3.php 2018-03-18 09:20:39 -04:00
halorrr
27dd2dd5f3 Update Item.php 2018-03-18 09:18:27 -04:00
halorrr
494ae1a47f Add files via upload 2018-03-18 14:17:25 +01:00
halorrr
7d1e1e5ff1 Update readme.md 2018-03-18 09:09:10 -04:00
KodeStar
bcd1567b7d Merge pull request #133 from albertsj1/couchpotato
Add Couchpotato as an enhanced app
2018-03-17 13:18:03 +00:00
KodeStar
ae391b885b added missing dataonly attribute so it polls every 20 seconds 2018-03-17 13:17:45 +00:00
KodeStar
226bc84a4c removed duplicate semi-colon 2018-03-17 13:15:39 +00:00
halorrr
e60a0c8f61 Logo for OpenMediaVault 2018-03-17 07:07:50 +01:00
halorrr
218c90a306 Delete openvaultmedia.png 2018-03-17 02:07:29 -04:00
halorrr
2a60c80194 Create OpenMediaVault.php 2018-03-17 02:06:26 -04:00
halorrr
35b1c55564 Update Item.php 2018-03-17 02:05:32 -04:00
halorrr
20476387ff Add files via upload 2018-03-17 07:04:23 +01:00
halorrr
a787748a00 Update readme.md 2018-03-17 02:03:43 -04:00
halorrr
34ee540c30 Changed default colour for AirSonic 2018-03-17 02:02:35 -04:00
halorrr
975a5ffc82 Create AirSonic.php 2018-03-17 01:52:17 -04:00
halorrr
dee0870bf6 Airsonic added 2018-03-17 01:48:40 -04:00
halorrr
96ec3bd44e Airsonic logo added 2018-03-17 06:47:20 +01:00
halorrr
e4cf4096a6 Adding AirSonic to readme 2018-03-17 01:46:12 -04:00
halorrr
3d79694c0a Create WebTools.php 2018-03-17 01:24:14 -04:00
halorrr
eab3e4e6f7 Update Item.php 2018-03-17 01:19:30 -04:00
halorrr
462152bab2 Update readme.md 2018-03-17 01:17:33 -04:00
halorrr
766a455db0 Add files via upload 2018-03-17 06:16:06 +01:00
John Alberts
30200ac219 Get rid off aggressive polling option and always use inactive status 2018-03-16 15:08:04 -07:00
KodeStar
90a9113971 Merge pull request #140 from halorrr/master
FoundationApp: Krusader closes #144
2018-03-16 22:00:17 +00:00
KodeStar
ad1834568f Merge pull request #141 from halorrr/patch-1
Adding Tautulli to Enhanced Apps
2018-03-16 21:58:19 +00:00
KodeStar
6231500b4a Merge pull request #142 from grOGH/master
Add a readme section about using self-signed certificates with enhanced apps
2018-03-15 13:04:38 +00:00
grOGH
b2dbc08ea0 Add a readme section about using self-signed certificates with enhanced
apps
2018-03-15 08:48:56 +01:00
KodeStar
4700f68f4d Update readme.md 2018-03-13 21:09:59 +00:00
halorrr
fa73738309 Update readme.md 2018-03-13 16:01:44 -04:00
halorrr
25f92ec438 Create tautulli.blade.php 2018-03-13 16:01:14 -04:00
halorrr
6a59c1dfd6 Update Item.php 2018-03-13 15:58:37 -04:00
halorrr
bad6e9d2fe Create Tautulli.php 2018-03-13 15:57:14 -04:00
halorrr
e544972c1d Add files via upload 2018-03-13 20:56:12 +01:00
halorrr
f1e5de0d58 Update readme.md 2018-03-13 15:52:44 -04:00
halorrr
e434e1effb Update readme.md 2018-03-13 15:32:54 -04:00
halorrr
ca04b210e6 Update Item.php 2018-03-13 12:38:29 -04:00
halorrr
51275af41d Create Krusader.php 2018-03-13 12:35:26 -04:00
halorrr
c2417ac5b3 Add files via upload 2018-03-13 17:32:04 +01:00
John Alberts
72831d413b update couchpotato icon 2018-03-13 08:14:18 -07:00
John Alberts
5cb4bd5819 Icon name should be lower case. 2018-03-13 06:49:05 -07:00
KodeStar
2d9bbca9a9 Merge pull request #135 from albertsj1/fix_transmission_pic
Fix capitalization of tranmission icon name
2018-03-13 09:36:29 +00:00
KodeStar
7b54c4e969 Merge pull request #134 from albertsj1/update_readme
add some apps to the enhanced app section of the readme that were mis…
2018-03-13 09:35:54 +00:00
Chris
b50f4ec5ce Merge branch 'master' of https://github.com/linuxserver/Heimdall 2018-03-12 09:59:43 +00:00
Chris
86cc7534c2 fix html error in link, but replaced target _blank to a named window to keep the experience 2018-03-12 09:59:37 +00:00
John Alberts
1ab2565244 Fix capitalization of tranmission icon name 2018-03-11 21:23:01 -07:00
John Alberts
d2089a9344 add some apps to the enhanced app section of the readme that were missing. 2018-03-11 21:12:25 -07:00
John Alberts
39153c6936 Add Couchpotato as an enhanced app 2018-03-11 20:48:58 -07:00
KodeStar
1a8e2b92de closes #128 2018-03-11 17:47:05 +00:00
KodeStar
cf63e751bf Merge pull request #127 from albertsj1/add_transmission
Add Enhanced App Transmission
2018-03-11 17:41:02 +00:00
KodeStar
0c51bc2771 fix multiple tags 2018-03-11 17:40:08 +00:00
John Alberts
5f278cce3e cleanup a couple symlinks I didn't intend to commit and some errant whitespace 2018-03-09 07:59:01 -08:00
KodeStar
f8cf3ac832 Merge pull request #125 from frenos/foundation_glances
Foundation App for Glances
2018-03-09 08:05:07 +00:00
John Alberts
50bdd02a72 Add Enhanced App Transmission 2018-03-08 16:18:39 -08:00
frenos
424155e5cd Foundation App for Glances
Default color is the backgroundcolor of the official site.
2018-03-07 17:39:45 +01:00
Chris
c4a4d25f7e change js version to break cache 2018-03-06 09:43:54 +00:00
KodeStar
ca2e135cba closes #122, closes #82, 2018-03-05 19:38:23 +00:00
KodeStar
8b4583c59c update version 2018-03-01 19:21:18 +00:00
KodeStar
6a836f9151 Merge pull request #118 from Futos/add-new-foundationApps
Add new foundation apps
2018-03-01 10:16:43 +00:00
Futos
c7b92ad945 fix(SupportedApps): fixed class name 2018-02-28 13:04:45 +01:00
Futos
a05b7a43bd feat(SupportedApps): Added DokuWiki to Foundation Apps
Closes #104
2018-02-28 13:03:17 +01:00
Futos
929346b2f1 feat(SupportedApps): Added SickRage to Foundation Apps
Closes #102
2018-02-28 12:58:00 +01:00
Futos
23ceed01cb feat(SupportedApps): Added Gitea to Foundation Apps
Closes #101
2018-02-28 12:52:11 +01:00
KodeStar
2ccf9a1110 Merge pull request #115 from mrquatsch/runeaudio
Add Runeaudio to list of foundation apps
2018-02-26 12:02:35 +00:00
mrquatsch
4917d8e47b updated runeaudio scss to bump keyframes outside of the title-marquee 2018-02-25 20:44:24 -06:00
mrquatsch
a0963e5d92 add Runeaudio to app/Item list 2018-02-25 20:41:19 -06:00
KodeStar
e2731b532a Update readme.md 2018-02-25 20:26:33 +00:00
KodeStar
eccd6056bd Merge pull request #112 from mrquatsch/runeaudio
enhanced runeaudio app - displays artist and song
2018-02-25 16:39:20 +00:00
mrquatsch
c1273a4b01 new rune scss - imported in app.scss 2018-02-25 08:23:45 -06:00
KodeStar
017752b06e Merge pull request #113 from Ephelyon/master
Add Dutch translation
2018-02-25 11:45:13 +00:00
KodeStar
9abb7a04ac Merge pull request #114 from mrquatsch/patch-1
Rename plexpy.blade.app to plexpy.blade.php
2018-02-25 11:44:37 +00:00
mrquatsch
9533b9d887 Rename plexpy.blade.app to plexpy.blade.php 2018-02-24 13:58:54 -06:00
Ephelyon
f1a6feeb8f Add Dutch translation 2018-02-24 18:54:31 +00:00
KodeStar
35930f2ffb Merge pull request #111 from mrquatsch/enhanced_plexpy
Enhanced Plexpy - display stream count via api token
2018-02-23 11:18:56 +00:00
mrquatsch
0a1e8a2f8b enhanced runeaudio app - displays artist and song 2018-02-22 13:41:30 -06:00
mrquatsch
4f9315132b Enhanced Plexpy - display stream count via api token 2018-02-22 13:27:44 -06:00
KodeStar
196a843148 Merge pull request #105 from Attoy/master
Update readme.md
2018-02-20 12:23:21 +00:00
KodeStar
9778875d52 Merge branch 'master' into master 2018-02-20 12:23:10 +00:00
KodeStar
fdeb812333 Merge pull request #106 from kehator/master
Add PL translation
2018-02-20 11:51:35 +00:00
KodeStar
e21e12e737 Update SettingsSeeder.php 2018-02-20 11:51:18 +00:00
nuc
52d2322955 Rough translation based on EN translation 2018-02-20 05:40:50 +00:00
KodeStar
5ea8f7df33 Fix target link 2018-02-19 23:15:09 +00:00
Attoy
7a9c73df3f Update readme.md 2018-02-19 20:18:46 +01:00
KodeStar
1f38de989b fix routes 2018-02-18 22:36:32 +00:00
KodeStar
c4f119de9c Fix routes in controllers for RP support 2018-02-18 22:15:14 +00:00
KodeStar
fa2afa856a change release number 2018-02-18 19:23:17 +00:00
KodeStar
4c83680ae9 remove apps from tags 2018-02-18 19:21:42 +00:00
KodeStar
981665e3e3 Update readme.md 2018-02-18 19:04:19 +00:00
KodeStar
b3185292b3 Merge pull request #100 from linuxserver/v1.4
fixes to RP
2018-02-18 18:39:35 +00:00
KodeStar
249f437ff5 fixes to RP 2018-02-18 18:38:43 +00:00
KodeStar
a7563ab499 Merge pull request #99 from linuxserver/v1.4
V1.4
2018-02-18 17:51:26 +00:00
KodeStar
38f8143fd2 closes #46, #47, #77, #89 2018-02-18 17:48:52 +00:00
KodeStar
a051c17010 style the tags + close #47 2018-02-18 17:23:05 +00:00
KodeStar
0b62f8a1c8 change icon for tags 2018-02-18 17:04:18 +00:00
KodeStar
b803d4f49d fix mix 2018-02-17 23:18:20 +00:00
KodeStar
78e368f406 Merge branch 'master' into v1.4 2018-02-17 23:17:34 +00:00
KodeStar
90e613ab26 Update readme.md 2018-02-17 23:15:07 +00:00
KodeStar
e15914dc2e Update readme.md 2018-02-17 23:09:21 +00:00
KodeStar
ebe6c39237 Closes #86 2018-02-17 22:23:30 +00:00
KodeStar
3369de9660 possible fix for RP for forms 2018-02-17 20:37:23 +00:00
KodeStar
98b831bc22 folder support 2018-02-17 00:13:38 +00:00
KodeStar
c0f741d914 Merge pull request #95 from cheesemarathon/master
feat: added Deluge to supported Apps - Closes #70
2018-02-16 17:37:35 +00:00
KodeStar
4c27a0cb5c Update Item.php 2018-02-16 17:37:09 +00:00
KodeStar
4ff5f139f7 fix indentation 2018-02-16 17:36:36 +00:00
cheesemarathon
59910ecadc Add Graylog 2018-02-16 16:28:48 +00:00
Chris
4e37176436 changes to allow preview of image first 2018-02-16 15:27:48 +00:00
Chris
35085248b6 some changes to test droppable 2018-02-16 15:15:22 +00:00
nuc
3ad8a366a6 Add Polish Translation 2018-02-16 11:22:11 +00:00
KodeStar
b1660c92cc changed opening a link to new tab 2018-02-15 20:52:04 +00:00
KodeStar
6ec1a3d4cb Merge pull request #90 from Futos/adding-new-foundation-apps
Adding new foundation apps
2018-02-15 20:45:57 +00:00
KodeStar
86ffa86800 Merge branch 'master' into adding-new-foundation-apps 2018-02-15 20:45:08 +00:00
KodeStar
22ad29c92f crap image 2018-02-15 20:42:53 +00:00
KodeStar
ebc1046ba6 Merge pull request #88 from cheesemarathon/master
feat: added Deluge to supported Apps - Closes #63
2018-02-15 20:41:50 +00:00
KodeStar
43e23b15dc update version 2018-02-15 20:33:36 +00:00
KodeStar
c8effe757b fix for nzbget on new apps 2018-02-15 20:33:07 +00:00
Futos
40b5cd3cff feat(SupportedApps): added TT-RSS Application to Foundation Apps
Closes #72
2018-02-15 19:59:53 +01:00
Futos
26435d85e8 feat(SupportedApps): added NZBHydra Application to Foundation Apps
Closes #66
2018-02-15 19:51:38 +01:00
Futos
b6d5e73708 feat(SupportedApps): added Deluge Application to Foundation Apps
Closes #63
2018-02-15 19:32:10 +01:00
Futos
2f193e0c83 feat(SupportedApps): added Medusa Application to Foundation Apps
Closes #64
2018-02-15 19:25:37 +01:00
Futos
4897c80646 feat(.gitignore): added MacOS generated files to ignore 2018-02-15 19:23:57 +01:00
cheesemarathon
601a455e08 Add Deluge 2018-02-15 15:03:41 +00:00
KodeStar
d37f4fd77b Merge pull request #84 from cheesemarathon/master
feat: added ruTorrent to supported Apps - Closes #35
2018-02-15 14:07:37 +00:00
cheesemarathon
c395cb2206 Replace with better logo 2018-02-15 14:01:18 +00:00
cheesemarathon
b6f8c612f1 Removes icon background 2018-02-15 08:36:19 +00:00
cheesemarathon
18551528ca Removes icon background 2018-02-15 08:27:34 +00:00
cheesemarathon
bbc7782f40 Adds ruTorrent 2018-02-15 08:22:37 +00:00
KodeStar
c121341911 Update readme.md 2018-02-15 08:22:14 +00:00
KodeStar
990a256e40 update version 2018-02-14 21:43:52 +00:00
KodeStar
89e3caf4f2 Closes #78 2018-02-14 20:47:49 +00:00
KodeStar
3e4a458fac Change to Pihole to close #81 2018-02-14 20:39:15 +00:00
KodeStar
25d2897fb9 Merge pull request #79 from Futos/netdata
Netdata
2018-02-14 17:10:47 +00:00
KodeStar
a2151d0b93 Merge pull request #80 from cheesemarathon/master
Fix indentation
2018-02-14 17:07:30 +00:00
KodeStar
5b9dcd829c Update Lidarr.php 2018-02-14 17:05:36 +00:00
cheesemarathon
e2e1471dfa Add Lidarr
Adds Lidarr as a foundation app
2018-02-14 13:41:10 +00:00
cheesemarathon
a664c9abe9 Fix indentation 2018-02-14 13:20:02 +00:00
Futos
0f9b1cdf25 fix(SupportedApps): fixed Item.php
Fixed Item.php because forgot to save the changes before push

Closes #65
2018-02-14 01:07:44 +01:00
Futos
7cfd6e7493 feat(SupportedApps): added Netdata like requested
#65
2018-02-14 01:04:06 +01:00
KodeStar
592f8f0831 closes #75 and adds initial support for proxmox 2018-02-13 22:46:36 +00:00
KodeStar
88c36d2b2d Fix sabnzbd api url failing if missing trailing slash 2018-02-13 18:48:42 +00:00
KodeStar
dbe5f1dfb2 Fix nzbget api url not working if missing trailing slash 2018-02-13 18:44:34 +00:00
KodeStar
1297ae7bb3 fix some foundation apps issues 2018-02-13 18:29:15 +00:00
KodeStar
ba48a45d39 Merge pull request #73 from cheesemarathon/master
Add apps
2018-02-13 17:58:50 +00:00
KodeStar
12b5de5cea Added Italian language 2018-02-13 17:39:25 +00:00
KodeStar
a7b33647ea Merge pull request #71 from Attoy/patch-1
Create resources/lang/it/app.php
2018-02-13 17:35:36 +00:00
KodeStar
3a7467e6f7 Merge pull request #74 from BiohZn/v1.2
V1.2
2018-02-13 17:33:00 +00:00
Conny Sjöblom
8c47ce9b0e Add Swedish translation 2018-02-13 19:01:39 +02:00
Conny Sjöblom
11f623cc35 Merge branch 'master' of https://github.com/linuxserver/Heimdall into v1.2 2018-02-13 18:58:12 +02:00
cheesemarathon
5365f4b867 Adjust colors 2018-02-13 15:22:38 +00:00
cheesemarathon
260a88623e Add apps
Adds jackett, radarr, sonarr and home asssistant as foundation apps
2018-02-13 15:00:59 +00:00
Attoy
2143cab1fa Create app.php
Italian translation
2018-02-13 09:50:09 +01:00
KodeStar
5be3662b35 Update readme.md 2018-02-12 22:23:14 +00:00
KodeStar
c8ab62f9fe Merge pull request #68 from aptalca/patch-1
Add reverse proxy info
2018-02-12 20:30:33 +00:00
aptalca
114c16a36f Add reverse proxy info 2018-02-12 15:22:27 -05:00
KodeStar
8ac33ceb4c Added Norwegian language 2018-02-12 18:45:26 +00:00
KodeStar
9290c20c43 Merge pull request #50 from Oisann/master
Translated most of the English language files into Norwegian.
2018-02-12 18:40:44 +00:00
Jonas Myhr Refseth
c302c26d87 Translated most of the English language files into Norwegian. The messages in validation.php could be hard to translate. 2018-02-12 19:26:31 +01:00
KodeStar
f04c6c2032 Merge pull request #44 from Futos/readme-changes
feat: added Pihole to Enhanced App
2018-02-12 17:28:42 +00:00
Futos
9d35d567ae feat: added Pihole to Enhanced App 2018-02-12 17:10:47 +01:00
KodeStar
3549ebc5b9 Merge pull request #43 from linuxserver/README_link
edit README for links to all arch's
2018-02-12 15:37:20 +00:00
sparklyballs
68c2dcf67d spacing on links 2018-02-12 15:32:19 +00:00
sparklyballs
cb4ab20249 edit README for links to all arch's 2018-02-12 15:30:33 +00:00
Chris
effafe7b2d update version number 2018-02-12 14:48:25 +00:00
Chris
a2aac1f33c Recreate storage symlink if lost 2018-02-12 14:47:12 +00:00
KodeStar
7c30f0c236 Update readme.md 2018-02-12 13:56:01 +00:00
KodeStar
39c71b6f26 Merge pull request #40 from Futos/jdownloader
feat: added Jdownloader to supported Apps - Closes #26
2018-02-12 13:30:04 +00:00
Futos
bc5c1ebb1e Merge branch 'master' into jdownloader 2018-02-12 14:28:56 +01:00
KodeStar
800470f7fa Merge pull request #39 from Futos/openhab
feat: added OpenHAB to supported Apps - Closes #30
2018-02-12 13:27:35 +00:00
KodeStar
a0195e2e08 Merge pull request #37 from Futos/mcmyadmin
feat: added Mcmyadmin as a supported App - Closes #27
2018-02-12 13:27:21 +00:00
Futos
f60aee8072 Merge branch 'master' into mcmyadmin 2018-02-12 14:25:43 +01:00
Futos
92b54d18a9 Merge branch 'master' into openhab 2018-02-12 14:25:04 +01:00
Futos
aeae6a6ebe Merge branch 'master' into jdownloader 2018-02-12 14:23:37 +01:00
KodeStar
cf674629cb Update readme.md 2018-02-12 13:04:01 +00:00
KodeStar
650ba498e1 Update readme.md 2018-02-12 12:11:04 +00:00
KodeStar
8cbd6b7001 Update readme.md 2018-02-12 10:02:34 +00:00
KodeStar
096ceb47ea Merge pull request #38 from Futos/plexrequests
feat: added Plexrequests as a supported App - Closes #29
2018-02-11 23:40:02 +00:00
KodeStar
d0708ea8fb Merge pull request #36 from Futos/traefik
feat: added Traefik as a supported App, also sorted lines alphabetically closes #28
2018-02-11 23:39:17 +00:00
Futos
d299e1dbb9 feat: added Jdownloader to supported Apps - Closes #26 2018-02-11 14:22:06 +01:00
Futos
ee96a2c625 feat: added OpenHAB to supported Apps - Closes #30 2018-02-11 14:09:54 +01:00
Futos
4c8477c4a9 feat: added Plexrequests as a supported App 2018-02-11 14:00:36 +01:00
Futos
aa97c8fd3a feat: added Mcmyadmin as a supported App - Closes #27 2018-02-11 13:41:17 +01:00
Futos
995eb6b557 feat: added Traefik as a supported App, also sorted lines alphabetically 2018-02-11 13:12:42 +01:00
KodeStar
7f0a33e36a Update readme.md 2018-02-11 00:50:13 +00:00
KodeStar
2100075972 Update readme.md 2018-02-10 23:39:30 +00:00
KodeStar
6735401302 Update readme.md 2018-02-10 23:36:09 +00:00
KodeStar
443e18e84f Change background colour for 2 added apps 2018-02-10 22:27:52 +00:00
KodeStar
679313e58c Merge pull request #23 from Futos/plexpy
feat: added Plexpy to supported Apps
2018-02-10 22:14:32 +00:00
KodeStar
3b817c20fa Merge pull request #22 from Futos/nextcloud
feat: added Nextcloud to supported Apps
2018-02-10 22:14:01 +00:00
KodeStar
5baedc39bc fix issue in some peoples browsers where input is bigger than it should be for some reason 2018-02-10 20:23:47 +00:00
Futos
11177b73a5 feat: added Plexpy to supported Apps 2018-02-09 22:06:19 +01:00
Futos
83263c0b1b feat: added Nextcloud to supported Apps 2018-02-09 21:42:47 +01:00
Futos
076d51c6eb feat: added Nextcloud to Readme 2018-02-09 21:41:50 +01:00
KodeStar
18e1d962b8 Update readme.md 2018-02-09 20:18:18 +00:00
KodeStar
989989bda7 fix uploads 2018-02-09 17:24:05 +00:00
KodeStar
5c5f204545 changed date 2018-02-09 16:35:06 +00:00
KodeStar
40e7431b98 Merge pull request #21 from linuxserver/v1.3
V1.3
2018-02-09 16:32:01 +00:00
KodeStar
6a933ffc1d Added turkish to languages 2018-02-09 16:25:45 +00:00
Chris
a79d47f161 Fix sliding checkbox in settings 2018-02-09 15:14:54 +00:00
Chris
887e5c9d49 some updates to the default colours and styling 2018-02-09 14:55:45 +00:00
Chris
309eb4ac33 update readme 2018-02-09 14:05:46 +00:00
Chris
67f4590942 added favicon and readme header 2018-02-09 14:04:18 +00:00
Chris
fcadb2443e added default image 2018-02-09 12:38:38 +00:00
Chris
9776825506 styling for test button 2018-02-09 11:30:26 +00:00
Chris
ee089d0761 Move hidden input outside of sliding checkbox to fix edge 2018-02-09 11:08:04 +00:00
Chris
19e739196c Fix dataonly for upgrades from older versions of database 2018-02-09 08:40:13 +00:00
Chris
a6484b801c Merge branch 'master' into v1.3 2018-02-09 08:28:42 +00:00
Chris
d07fb5ea99 fix undefined $view 2018-02-09 08:28:20 +00:00
KodeStar
095c4f5181 make gap between icon and text slightly smaller 2018-02-09 00:10:22 +00:00
KodeStar
0c7842a3d6 allow enabled apps to be disabled 2018-02-09 00:05:37 +00:00
KodeStar
01ac523e60 change pinhole default colour 2018-02-08 23:59:41 +00:00
KodeStar
6feff6441e updated change log 2018-02-08 23:50:35 +00:00
KodeStar
7229d32e8b Added pinhole to enhanced list 2018-02-08 23:45:37 +00:00
KodeStar
bbd85d2516 Some fixes 2018-02-08 22:51:12 +00:00
KodeStar
803ab459b1 fixed error message on incorrect api key 2018-02-08 22:25:40 +00:00
KodeStar
256648e682 fixes to sabnzbd app 2018-02-08 22:17:19 +00:00
KodeStar
758599804c Added Sabnzbd support 2018-02-08 22:02:28 +00:00
KodeStar
b2dd3f803e don't try to get live stats for items that haven't been configured 2018-02-08 20:58:07 +00:00
KodeStar
912c6512fb change it to start at 5 seconds so if nothing is happening it doesn't start spamming 2018-02-08 20:02:26 +00:00
KodeStar
fff44f4681 fixes for saving non config items 2018-02-08 20:00:24 +00:00
KodeStar
79f4a6cc07 Change code to wind down checks when no doing anything 2018-02-08 19:50:01 +00:00
KodeStar
b910a933fb changed error message 2018-02-08 19:28:23 +00:00
KodeStar
e0d08c60d0 more detail in error message 2018-02-08 19:24:30 +00:00
KodeStar
33394c2f07 remove gitignore mix 2018-02-08 19:11:12 +00:00
KodeStar
4fc2bbd1af fixes for nzbget 2018-02-08 18:53:52 +00:00
KodeStar
e4e815dc40 ignore mix manifest 2018-02-08 17:48:33 +00:00
Chris
482831b9f9 first working(ish) app! 2018-02-08 15:50:53 +00:00
Chris
30aea8e361 updated dependencies + working api connection 2018-02-08 14:21:29 +00:00
KodeStar
dfc3c2194c Merge pull request #20 from aptalca/TR
Add Turkish language
2018-02-08 10:14:03 +00:00
aptalca
7376aef136 formatting 2018-02-07 18:08:12 -05:00
aptalca
18a45863bd formatting 2018-02-07 18:07:24 -05:00
aptalca
9c5cf150e7 formatting 2018-02-07 18:06:47 -05:00
aptalca
c08dcab1d8 formatting 2018-02-07 18:05:47 -05:00
aptalca
c9d9d50fa0 Create validation.php in Turkish 2018-02-07 18:03:46 -05:00
KodeStar
9bb0304620 Update files for next version 2018-02-07 22:33:58 +00:00
KodeStar
7b5bc24a6d Merge pull request #18 from linuxserver/v1.2
V1.2
2018-02-07 22:27:34 +00:00
KodeStar
1d390d7966 another trial 2018-02-07 22:24:43 +00:00
aptalca
528b317552 Create passwords.php in Turkish 2018-02-07 17:21:41 -05:00
KodeStar
116ff2dd46 possible fix for slider 2018-02-07 22:20:18 +00:00
aptalca
3d8483f9bb Create pagination.php in Turkish 2018-02-07 17:17:28 -05:00
aptalca
6d1d723df2 Create auth.php inTurkish 2018-02-07 17:16:20 -05:00
aptalca
3a93b4f0e1 Create app.php in Turkish 2018-02-07 17:11:15 -05:00
aptalca
f7286bb38f Create app.php 2018-02-07 16:52:47 -05:00
KodeStar
764222c901 fix image disappearing if save item without all required information 2018-02-07 20:45:31 +00:00
KodeStar
6409e291be fix item edit view 2018-02-07 20:35:52 +00:00
KodeStar
cb719be3ad Fix button size issue in chrome + move button layout 2018-02-07 20:18:12 +00:00
Conny Sjöblom
9e93ac10f4 Correct the finnish translation 2018-02-07 22:03:09 +02:00
KodeStar
dce553c587 Merge branch 'master' into v1.2
# Conflicts:
#	resources/views/app.blade.php
2018-02-07 18:17:04 +00:00
KodeStar
3ab91cc0e1 Merge remote-tracking branch 'origin/v1.2' into v1.2 2018-02-07 18:15:40 +00:00
Chris
6adbcb8d1c changed gitignore 2018-02-07 15:45:12 +00:00
Chris
211da7cb09 supported apps support 2018-02-07 15:43:29 +00:00
Chris
beb12147e0 fix incorrect translation strings 2018-02-07 14:01:10 +00:00
Chris
0f3087ab7d translations 2018-02-07 13:37:40 +00:00
Chris
a5e99545d7 Possible fix to subfolder issue 2018-02-07 08:59:40 +00:00
Chris
a8a7e56da7 Merge branch 'master' into v1.2 2018-02-07 08:47:54 +00:00
KodeStar
57ac6bc680 Merge branch 'master' into v1.2 2018-02-06 22:40:58 +00:00
KodeStar
3a3446151e supported apps stuff 2018-02-06 20:41:29 +00:00
Chris
fd5ca1914c Supported apps fixes 2018-02-06 15:27:02 +00:00
KodeStar
ade028767a supported apps stuff 2018-02-05 23:08:37 +00:00
KodeStar
983cf98b9e Delete storage 2018-02-05 21:13:56 +00:00
KodeStar
3e02d92105 Initial supported apps support 2018-02-05 20:59:38 +00:00
KodeStar
0cd8f551a1 git supported apps 2018-02-05 20:29:56 +00:00
KodeStar
bd8bac162f gitignore 2018-02-05 20:14:16 +00:00
KodeStar
91ecd03c4e supported apps 2018-02-05 19:49:20 +00:00
KodeStar
5a0321cd4f don't ignore supported apps 2018-02-05 19:47:36 +00:00
KodeStar
b9d212ed58 remove symlink 2018-02-05 19:45:40 +00:00
KodeStar
83f2a81e91 changes 2018-02-05 19:43:24 +00:00
KodeStar
3f20fe75c6 Merge branch 'master' into v1.2 2018-02-05 18:14:06 +00:00
399 changed files with 31064 additions and 1007 deletions

16
.gitignore vendored
View File

@@ -8,3 +8,19 @@ Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
### macOS ###
*.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns

View File

@@ -1,5 +1,66 @@
# Release Notes
## v1.4.0 (2018-02-18)
### Added
- Tag(folder) support
- Image preview for uploading icons
- A load of supported apps, full list of apps https://github.com/linuxserver/Heimdall/projects/1
### Changed
- Edited vendor/laravelcollective/html/src/FormBuilder.php to allow relative links #3369de9
- Changed links to use relative links for reverse proxy support
- Links open in new tab
### Fixed
- adds all the fixes in the 1.3.x point releases and on master
## v1.3.0 (2018-02-09)
### Added
- guzzlehttp/guzzle as a dependency
- Variable polling, so interval is increased when an app is idle and decreased when it's active
- Turkish language translation
- Added Sabnzbd enhanced application
### Changed
- Updated composer dependencies
- Added live stats to Nzbget supported application
- Changed Pihole to an enhanced application
- Changed NZBGet to an enhanced application
### Fixed
- Fixed autocomplete being hard to see
- Fixed checkboxes not working on edge
## v1.2.0 (2018-02-07)
### Added
- Translation support
- Initial "Supported" application support
- Finnish translation
- Swedish translation
- German translation
- French translation
- Spanish translation
- Duplicati supported application
- Emby supported application
- Nzbget supported application
- Pfsense supported application
- Pihole supported application
- Plex supported application
- Portainer supported application
- Unifi supported application
### Changed
- button layout and behaviour
### Fixed
- Bottom of button too short in some browsers
- Icon not loading back in when required fields not filled in
## v1.1.0 (2018-02-05)
### Added

12
app/Helper.php Normal file
View File

@@ -0,0 +1,12 @@
<?php
function format_bytes($bytes, $is_drive_size = true, $beforeunit = '', $afterunit = '')
{
$btype = ($is_drive_size === true) ? 1000 : 1024;
$labels = array('B','KB','MB','GB','TB');
for($x = 0; $bytes >= $btype && $x < (count($labels) - 1); $bytes /= $btype, $x++); // use 1000 rather than 1024 to simulate HD size not real size
if($labels[$x] == "TB") return(round($bytes, 3).$beforeunit.$labels[$x].$afterunit);
elseif($labels[$x] == "GB") return(round($bytes, 2).$beforeunit.$labels[$x].$afterunit);
elseif($labels[$x] == "MB") return(round($bytes, 2).$beforeunit.$labels[$x].$afterunit);
else return(round($bytes, 0).$beforeunit.$labels[$x].$afterunit);
}

View File

@@ -18,8 +18,8 @@ class ItemController extends Controller
*/
public function dash()
{
$data['apps'] = Item::pinned()->orderBy('order', 'asc')->get();
$data['all_apps'] = Item::all();
$data['apps'] = Item::doesntHave('parents')->pinned()->orderBy('order', 'asc')->get();
$data['all_apps'] = Item::doesntHave('parents')->get();
return view('welcome', $data);
}
@@ -49,7 +49,8 @@ class ItemController extends Controller
$item = Item::findOrFail($id);
$item->pinned = true;
$item->save();
return redirect()->route('dash');
$route = route('dash', [], false);
return redirect($route);
}
/**
@@ -62,7 +63,8 @@ class ItemController extends Controller
$item = Item::findOrFail($id);
$item->pinned = false;
$item->save();
return redirect()->route('dash');
$route = route('dash', [], false);
return redirect($route);
}
/**
@@ -81,8 +83,9 @@ class ItemController extends Controller
$data['ajax'] = true;
return view('sortable', $data);
} else {
return redirect()->route('dash');
}
$route = route('dash', [], false);
return redirect($route);
}
}
@@ -95,8 +98,8 @@ class ItemController extends Controller
{
$trash = (bool)$request->input('trash');
$data['apps'] = Item::orderBy('title', 'asc')->get();
$data['trash'] = Item::onlyTrashed()->get();
$data['apps'] = Item::ofType('item')->orderBy('title', 'asc')->get();
$data['trash'] = Item::ofType('item')->onlyTrashed()->get();
if($trash) {
return view('items.trash', $data);
} else {
@@ -113,7 +116,8 @@ class ItemController extends Controller
public function create()
{
//
$data = [];
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
$data['current_tags'] = [];
return view('items.create', $data);
}
@@ -129,7 +133,7 @@ class ItemController extends Controller
//
$validatedData = $request->validate([
'title' => 'required|max:255',
'url' => 'required',
'url' => 'required|url',
]);
if($request->hasFile('file')) {
@@ -138,11 +142,21 @@ class ItemController extends Controller
'icon' => $path
]);
}
Item::create($request->all());
return redirect()->route('dash')
->with('success','Item created successfully');
$config = Item::checkConfig($request->input('config'));
$request->merge([
'description' => $config
]);
//die(print_r($request->input('config')));
$item = Item::create($request->all());
$item->parents()->sync($request->tags);
$route = route('dash', [], false);
return redirect($route)
->with('success', __('app.alert.success.item_created'));
}
/**
@@ -165,11 +179,12 @@ class ItemController extends Controller
public function edit($id)
{
// Get the item
$item = Item::find($id);
$data['item'] = Item::find($id);
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
$data['current_tags'] = $data['item']->parents;
// show the edit form and pass the nerd
return view('items.edit')
->with('item', $item);
return view('items.edit', $data);
}
/**
@@ -183,9 +198,9 @@ class ItemController extends Controller
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'url' => 'required',
'url' => 'required|url',
]);
//die(print_r($request->all()));
if($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
@@ -193,11 +208,19 @@ class ItemController extends Controller
]);
}
$config = Item::checkConfig($request->input('config'));
$request->merge([
'description' => $config
]);
Item::find($id)->update($request->all());
$item = Item::find($id);
$item->update($request->all());
return redirect()->route('dash')
->with('success','Item updated successfully');
$item->parents()->sync($request->tags);
$route = route('dash', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_updated'));
}
/**
@@ -217,9 +240,10 @@ class ItemController extends Controller
} else {
Item::find($id)->delete();
}
return redirect()->route('items.index')
->with('success','Item deleted successfully');
$route = route('items.index', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_deleted'));
}
/**
@@ -233,8 +257,77 @@ class ItemController extends Controller
//
Item::withTrashed()
->where('id', $id)
->restore();
return redirect()->route('items.index')
->with('success','Item restored successfully');
->restore();
$route = route('items.inded', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_restored'));
}
public function isSupportedAppByKey($app)
{
$output = false;
$all_supported = Item::supportedList();
if(array_key_exists($app, $all_supported)) {
$output = new $all_supported[$app];
}
return $output;
}
/**
* Return details for supported apps
*
* @return Json
*/
public function appload(Request $request)
{
$output = [];
$app = $request->input('app');
if(($app_details = $this->isSupportedAppByKey($app)) !== false) {
// basic details
$output['icon'] = $app_details->icon();
$output['colour'] = $app_details->defaultColour();
// live details
if($app_details instanceof \App\SupportedApps\Contracts\Livestats) {
$output['config'] = $app_details->configDetails();
} else {
$output['config'] = null;
}
}
return json_encode($output);
}
public function testConfig(Request $request)
{
$data = $request->input('data');
//$url = $data[array_search('url', array_column($data, 'name'))]['value'];
$app = $data['type'];
$app_details = new $app();
$app_details->config = (object)$data;
$app_details->testConfig();
}
public function getStats($id)
{
$item = Item::find($id);
$config = json_decode($item->description);
if(isset($config->type)) {
$config->url = $item->url;
if(isset($config->override_url) && !empty($config->override_url)) {
$config->url = $config->override_url;
}
$app_details = new $config->type;
$app_details->config = $config;
echo $app_details->executeConfig();
}
}
}

View File

@@ -39,8 +39,10 @@ class SettingsController extends Controller
'setting' => $setting,
]);
} else {
return redirect()->route('settings.list')->with([
'error' => 'This Setting does not exist.',
$route = route('settings.list', [], false);
return redirect($route)
->with([
'error' => __('app.alert.error.not_exist'),
]);
}
}
@@ -73,12 +75,16 @@ class SettingsController extends Controller
$setting->save();
return redirect()->route('settings.index')->with([
'success' => 'You have successfully edited this Setting!',
$route = route('settings.index', [], false);
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'),
]);
} else {
return redirect()->route('settings.index')->with([
'error' => 'This Setting does not exist.',
$route = route('settings.index', [], false);
return redirect($route)
->with([
'error' => __('app.alert.error.not_exist'),
]);
}
}
@@ -94,8 +100,10 @@ class SettingsController extends Controller
$setting->value = '';
$setting->save();
}
return redirect()->route('settings.index')->with([
'success' => 'You have successfully edited this Setting!',
$route = route('settings.index', [], false);
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'),
]);
}

View File

@@ -0,0 +1,193 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Item;
use DB;
class TagController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$trash = (bool)$request->input('trash');
$data['apps'] = Item::ofType('tag')->orderBy('title', 'asc')->get();
$data['trash'] = Item::ofType('tag')->onlyTrashed()->get();
if($trash) {
return view('tags.trash', $data);
} else {
return view('tags.list', $data);
}
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$data = [];
return view('tags.create', $data);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
]);
if($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
]);
}
$slug = str_slug($request->title, '-');
// set item type to tag
$request->merge([
'type' => '1',
'url' => $slug
]);
//die(print_r($request->all()));
Item::create($request->all());
$route = route('dash', [], false);
return redirect($route)
->with('success', __('app.alert.success.tag_created'));
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($slug)
{
$item = Item::whereUrl($slug)->first();
//print_r($item);
$data['apps'] = $item->children()->pinned()->orderBy('order', 'asc')->get();
$data['all_apps'] = $item->children;
return view('welcome', $data);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
// Get the item
$item = Item::find($id);
// show the edit form and pass the nerd
return view('tags.edit')
->with('item', $item);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
]);
if($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
]);
}
$slug = str_slug($request->title, '-');
// set item type to tag
$request->merge([
'url' => $slug
]);
Item::find($id)->update($request->all());
$route = route('dash', [], false);
return redirect($route)
->with('success',__('app.alert.success.tag_updated'));
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Request $request, $id)
{
//
$force = (bool)$request->input('force');
if($force) {
Item::withTrashed()
->where('id', $id)
->forceDelete();
} else {
Item::find($id)->delete();
}
$route = route('tags.index', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_deleted'));
}
/**
* Restore the specified resource from soft deletion.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function restore($id)
{
//
Item::withTrashed()
->where('id', $id)
->restore();
$route = route('tags.index', [], false);
return redirect($route)
->with('success',__('app.alert.success.item_restored'));
}
public function add($tag, $item)
{
$output = 0;
$tag = Item::find($tag);
$item = Item::find($item);
if($tag && $item) {
// only add items, not cats
if((int)$item->type === 0) {
$tag->children()->attach($item);
return 1;
}
}
return $output;
}
}

View File

@@ -13,6 +13,9 @@ class VerifyCsrfToken extends Middleware
*/
protected $except = [
//
'order'
'order',
'appload',
'test_config',
//'get_stats'
];
}

View File

@@ -13,7 +13,7 @@ class Item extends Model
//
protected $fillable = [
'title', 'url', 'colour', 'icon', 'description', 'pinned', 'order'
'title', 'url', 'colour', 'icon', 'description', 'pinned', 'order', 'type'
];
/**
@@ -26,8 +26,53 @@ class Item extends Model
public static function supportedList()
{
return [
'NZBGet' => App\SupportedApps\Nzbget::class,
'Plex' => App\SupportedApps\Plex::class,
'AirSonic' => \App\SupportedApps\AirSonic::class,
'Cardigann' => \App\SupportedApps\Cardigann::class,
'CouchPotato' => \App\SupportedApps\CouchPotato::class,
'Deluge' => \App\SupportedApps\Deluge::class,
'Dokuwiki' => \App\SupportedApps\Dokuwiki::class,
'Duplicati' => \App\SupportedApps\Duplicati::class,
'Emby' => \App\SupportedApps\Emby::class,
'Gitea' => \App\SupportedApps\Gitea::class,
'Glances' => \App\SupportedApps\Glances::class,
'Grafana' => \App\SupportedApps\Grafana::class,
'Graylog' => \App\SupportedApps\Graylog::class,
'Home Assistant' => \App\SupportedApps\HomeAssistant::class,
'Jackett' => \App\SupportedApps\Jackett::class,
'Jdownloader' => \App\SupportedApps\Jdownloader::class,
'Krusader' => \App\SupportedApps\Krusader::class,
'Lidarr' => \App\SupportedApps\Lidarr::class,
'Mcmyadmin' => \App\SupportedApps\Mcmyadmin::class,
'Medusa' => \App\SupportedApps\Medusa::class,
'NZBGet' => \App\SupportedApps\Nzbget::class,
'Netdata' => \App\SupportedApps\Netdata::class,
'Nextcloud' => \App\SupportedApps\Nextcloud::class,
'Nzbhydra' => \App\SupportedApps\Nzbhydra::class,
'OPNSense' => \App\SupportedApps\Opnsense::class,
'Ombi' => \App\SupportedApps\Ombi::class,
'Openhab' => \App\SupportedApps\Openhab::class,
'OpenMediaVault' => \App\SupportedApps\OpenMediaVault::class,
'Pihole' => \App\SupportedApps\Pihole::class,
'Plex' => \App\SupportedApps\Plex::class,
'Plexpy' => \App\SupportedApps\Plexpy::class,
'Plexrequests' => \App\SupportedApps\Plexrequests::class,
'Portainer' => \App\SupportedApps\Portainer::class,
'Proxmox' => \App\SupportedApps\Proxmox::class,
'Radarr' => \App\SupportedApps\Radarr::class,
'Runeaudio' => \App\SupportedApps\Runeaudio::class,
'Sabnzbd' => \App\SupportedApps\Sabnzbd::class,
'Sickrage' => \App\SupportedApps\Sickrage::class,
'Sonarr' => \App\SupportedApps\Sonarr::class,
'Tautulli' => \App\SupportedApps\Tautulli::class,
'Transmission' => \App\SupportedApps\Transmission::class,
'Traefik' => \App\SupportedApps\Traefik::class,
'tt-rss' => \App\SupportedApps\Ttrss::class,
'UniFi' => \App\SupportedApps\Unifi::class,
'pfSense' => \App\SupportedApps\Pfsense::class,
'pyLoad' => \App\SupportedApps\pyLoad::class,
'ruTorrent' => \App\SupportedApps\ruTorrent::class,
'Watcher3' => \App\SupportedApps\Watcher3::class,
'WebTools' => \App\SupportedApps\WebTools::class,
];
}
public static function supportedOptions()
@@ -45,4 +90,115 @@ class Item extends Model
{
return $query->where('pinned', 1);
}
public function getConfigAttribute()
{
$output = null;
$view = null;
if(isset($this->description) && !empty($this->description)){
$output = json_decode($this->description);
$output = is_object($output) ? $output : new \stdClass();
if(isset($output->type) && !empty($output->type)) {
$class = $output->type;
$sap = new $class();
$view = $sap->configDetails();
$output->view = $view;
}
if(!isset($output->dataonly)) $output->dataonly = '0';
}
return (object)$output;
}
public static function checkConfig($config)
{
if(empty($config)) {
$config = null;
} else {
$store = false;
//die(var_dump($config));
foreach($config as $key => $check) {
if($key == 'type') continue;
if($key == 'dataonly') continue;
if(!empty($check) && $check != '0') {
$store = true;
break;
}
}
//die(var_dump($store))
$config['enabled'] = ($store) ? true : false;
$config = json_encode($config);
}
return $config;
}
public function parents()
{
return $this->belongsToMany('App\Item', 'item_tag', 'item_id', 'tag_id');
}
public function children()
{
return $this->belongsToMany('App\Item', 'item_tag', 'tag_id', 'item_id');
}
public function getLinkAttribute()
{
if((int)$this->type === 1) {
return '/tag/'.$this->url;
} else {
return $this->url;
}
}
public function getDroppableAttribute()
{
if((int)$this->type === 1) {
return ' droppable';
} else {
return '';
}
}
public function getLinkTargetAttribute()
{
if((int)$this->type === 1) {
return '';
} else {
return ' target="heimdallapp"';
}
}
public function getLinkIconAttribute()
{
if((int)$this->type === 1) {
return 'fa-tag';
} else {
return 'fa-arrow-alt-to-right';
}
}
public function getLinkTypeAttribute()
{
if((int)$this->type === 1) {
return 'tags';
} else {
return 'items';
}
}
public function scopeOfType($query, $type)
{
switch($type) {
case 'item':
$typeid = 0;
break;
case 'tag':
$typeid = 1;
break;
}
return $query->where('type', $typeid);
}
}

View File

@@ -26,7 +26,6 @@ class AppServiceProvider extends ServiceProvider
// first time setup
touch(database_path('app.sqlite'));
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true));
Artisan::call('storage:link');
//Cache
//Artisan::call('config:cache');
//Artisan::call('route:cache');
@@ -34,7 +33,7 @@ class AppServiceProvider extends ServiceProvider
if(is_file(database_path('app.sqlite'))) {
if(Schema::hasTable('settings')) {
if($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url('.asset('storage/'.$bg_image).')"';
$alt_bg = ' style="background-image: url(/storage/'.$bg_image.')"';
}
// check version to see if an upgrade is needed
@@ -46,6 +45,12 @@ class AppServiceProvider extends ServiceProvider
} else {
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true));
}
$lang = Setting::fetch('language');
\App::setLocale($lang);
}
if(!is_file(public_path('storage'))) {
Artisan::call('storage:link');
}
view()->share('alt_bg', $alt_bg);

View File

@@ -15,6 +15,10 @@ class Setting extends Model
*/
protected $table = 'settings';
protected $fillable = [
'id', 'group_id', 'key', 'type', 'options', 'label', 'value', 'order', 'system'
];
/**
* Tell the Model this Table doesn't support timestamps.
*
@@ -45,28 +49,28 @@ class Setting extends Model
switch($this->type) {
case 'image':
if(!empty($this->value)) {
$value = '<a href="'.asset('storage/'.$this->value).'" title="View" target="_blank">View</a>';
$value = '<a href="'.asset('storage/'.$this->value).'" title="'.__('app.settings.view').'" target="_blank">'.__('app.settings.view').'</a>';
} else {
$value = '- not set -';
$value = __('app.options.none');
}
break;
case 'boolean':
if((bool)$this->value === true) {
$value = 'Yes';
$value = __('app.options.yes');
} else {
$value = 'No';
$value = __('app.options.no');
}
break;
case 'select':
if(!empty($this->value) && $this->value !== 'none') {
$options = (array)json_decode($this->options);
$value = $options[$this->value];
$value = __($options[$this->value]);
} else {
$value = '- not set -';
$value = __('app.options.none');
}
break;
default:
$value = $this->value;
$value = __($this->value);
break;
}
@@ -80,11 +84,11 @@ class Setting extends Model
case 'image':
$value = '';
if(isset($this->value) && !empty($this->value)) {
$value .= '<a class="setting-view-image" href="'.asset('storage/'.$this->value).'" title="View" target="_blank"><img src="'.asset('storage/'.$this->value).'" /></a>';
$value .= '<a class="setting-view-image" href="'.asset('storage/'.$this->value).'" title="'.__('app.settings.view').'" target="_blank"><img src="'.asset('storage/'.$this->value).'" /></a>';
}
$value .= Form::file('value', ['class' => 'form-control']);
if(isset($this->value) && !empty($this->value)) {
$value .= '<a class="settinglink" href="'.route('settings.clear', $this->id).'" title="Remove">Reset back to default</a>';
$value .= '<a class="settinglink" href="'.route('settings.clear', $this->id).'" title="'.__('app.settings.remove').'">'.__('app.settings.reset').'</a>';
}
break;
@@ -93,8 +97,8 @@ class Setting extends Model
if(isset($this->value) && (bool)$this->value === true) $checked = true;
$set_checked = ($checked) ? ' checked="checked"' : '';
$value = '
<input type="hidden" name="value" value="0" />
<label class="switch">
<input type="hidden" name="value" value="0" />
<input type="checkbox" name="value" value="1"'.$set_checked.' />
<span class="slider round"></span>
</label>';
@@ -102,6 +106,9 @@ class Setting extends Model
break;
case 'select':
$options = json_decode($this->options);
foreach($options as $key => $opt) {
$options->$key = __($opt);
}
$value = Form::select('value', $options, null, ['class' => 'form-control']);
break;
default:
@@ -199,8 +206,8 @@ class Setting extends Model
$output .= '<div class="searchform">';
$output .= Form::open(['url' => $url, 'method' => 'get']);
$output .= '<div class="input-container">';
$output .= Form::text($var, null, ['class' => 'homesearch', 'placeholder' => $name.' search...']);
$output .= '<button type="submit">Search</button>';
$output .= Form::text($var, null, ['class' => 'homesearch', 'placeholder' => __($name).' '.__('app.settings.search').'...']);
$output .= '<button type="submit">'.ucwords(__('app.settings.search')).'</button>';
$output .= '</div>';
$output .= Form::close();
$output .= '</div>';

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class AirSonic implements Contracts\Applications {
public function defaultColour()
{
return '#08F';
}
public function icon()
{
return 'supportedapps/airsonic.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Cardigann implements Contracts\Applications {
public function defaultColour()
{
return '#753';
}
public function icon()
{
return 'supportedapps/cardigann.png';
}
}

View File

@@ -3,5 +3,7 @@
interface Applications {
public function defaultColour();
public function icon();
}

View File

@@ -0,0 +1,11 @@
<?php namespace App\SupportedApps\Contracts;
interface Livestats {
public function configDetails();
public function testConfig();
public function executeConfig();
}

View File

@@ -0,0 +1,122 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;
class CouchPotato implements Contracts\Applications, Contracts\Livestats
{
private $_client;
public function __construct()
{
$this->_client = new Client(
['http_errors' => false,
'timeout' => 10]
);
}
public function defaultColour()
{
return '#363840';
}
public function icon()
{
return 'supportedapps/couchPotato.png';
}
public function configDetails()
{
return 'couchpotato';
}
public function testConfig()
{
$res = $this->sendRequest();
if ($res == null) {
echo 'CouchPotato connection failed';
return;
}
switch($res->getStatusCode()) {
case 200:
echo "Successfully connected to CouchPotato";
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and includes the port';
break;
case 409:
echo 'Failed: Incorrect session id';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$html = '';
$res = $this->sendRequest();
if ($res == null) {
Log::debug('CouchPotato connection failed');
return '';
}
$data = json_decode($res->getBody());
if (! isset($data->movies)) {
Log::debug('Failed to fetch data from CouchPotato');
return '';
}
$movies = $data->movies;
$wantedMovies = $availableMovies = 0;
foreach ($movies as $v) {
switch ($v->status) {
case 'active':
$wantedMovies++;
break;
case 'done':
$availableMovies++;
break;
default:
Log::warning('Unexpected CouchPotato status received: '.$v['status']);
break;
}
}
$html = '
<ul class="livestats">
<li><span class="title">Wanted</span><sub>'.$wantedMovies.'</sub></li>
<li><span class="title">Available</span><sub>'.$availableMovies.'</sub></li>
</ul>
';
return json_encode(['status' => 'inactive', 'html' => $html]);
}
private function sendRequest()
{
$res = null;
try{
$res = $this->_client->request(
'GET',
$this->getApiUrl()
);
}catch(\GuzzleHttp\Exception\BadResponseException $e){
Log::error("Connection to {$e->getRequest()->getUrl()} failed");
Log::debug($e->getMessage());
$res = $e->getRequest();
}catch(\GuzzleHttp\Exception\ConnectException $e) {
Log::error("CouchPotato connection refused");
Log::debug($e->getMessage());
}
return $res;
}
private function getApiUrl()
{
$url = $this->config->url;
$url = rtrim($url, '/');
$apiUrl = $url.'/api/'.$this->config->apikey.'/movie.list';
return $apiUrl;
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Deluge implements Contracts\Applications {
public function defaultColour()
{
return '#357';
}
public function icon()
{
return 'supportedapps/deluge.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Dokuwiki implements Contracts\Applications {
public function defaultColour()
{
return '#9d7056';
}
public function icon()
{
return 'supportedapps/dokuwiki.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Duplicati implements Contracts\Applications {
public function defaultColour()
{
return '#2c3744';
}
public function icon()
{
return 'supportedapps/duplicati.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Emby implements Contracts\Applications {
public function defaultColour()
{
return '#222';
}
public function icon()
{
return 'supportedapps/emby.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Gitea implements Contracts\Applications {
public function defaultColour()
{
return '#585e52';
}
public function icon()
{
return 'supportedapps/gitea.png';
}
}

View File

@@ -0,0 +1,14 @@
<?php namespace App\SupportedApps;
class Glances implements Contracts\Applications {
public function defaultColour()
{
return '#2c363f';
}
public function icon()
{
return 'supportedapps/glances.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Graylog implements Contracts\Applications {
public function defaultColour()
{
return '#158';
}
public function icon()
{
return 'supportedapps/graylog.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class HomeAssistant implements Contracts\Applications {
public function defaultColour()
{
return '#073c52';
}
public function icon()
{
return 'supportedapps/homeassistant.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Jackett implements Contracts\Applications {
public function defaultColour()
{
return '#484814';
}
public function icon()
{
return 'supportedapps/jackett.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Jdownloader implements Contracts\Applications {
public function defaultColour()
{
return '#2b494f';
}
public function icon()
{
return 'supportedapps/jdownloader.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Krusader implements Contracts\Applications {
public function defaultColour()
{
return '#5A5';
}
public function icon()
{
return 'supportedapps/krusader.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Lidarr implements Contracts\Applications {
public function defaultColour()
{
return '#183c18';
}
public function icon()
{
return 'supportedapps/lidarr.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Mcmyadmin implements Contracts\Applications {
public function defaultColour()
{
return '#30404b';
}
public function icon()
{
return 'supportedapps/mcmyadmin.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Medusa implements Contracts\Applications {
public function defaultColour()
{
return '#4b5e55';
}
public function icon()
{
return 'supportedapps/medusa.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Netdata implements Contracts\Applications {
public function defaultColour()
{
return '#543737';
}
public function icon()
{
return 'supportedapps/netdata.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Nextcloud implements Contracts\Applications {
public function defaultColour()
{
return '#0e2c3e';
}
public function icon()
{
return 'supportedapps/nextcloud.png';
}
}

View File

@@ -1,8 +1,84 @@
<?php namespace App\SupportedApps;
class Nzbget implements Contracts\Applications {
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Nzbget implements Contracts\Applications, Contracts\Livestats {
public $config;
public function defaultColour()
{
return '#ccc';
return '#253827';
}
public function icon()
{
return 'supportedapps/nzbget.png';
}
public function configDetails()
{
return 'nzbget';
}
public function testConfig()
{
$res = $this->buildRequest('status');
switch($res->getStatusCode()) {
case 200:
echo 'Successfully connected to the API';
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$html = '';
$active = 'inactive';
$res = $this->buildRequest('status');
$data = json_decode($res->getBody());
//$data->result->RemainingSizeMB = '10000000';
//$data->result->DownloadRate = '100000000';
if($data) {
$size = $data->result->RemainingSizeMB;
$rate = $data->result->DownloadRate;
$queue_size = format_bytes($size*1000*1000, false, ' <span>', '</span>');
$current_speed = format_bytes($rate, false, ' <span>');
$active = ($size > 0 || $rate > 0) ? 'active' : 'inactive';
$html = '
<ul class="livestats">
<li><span class="title">Queue</span><strong>'.$queue_size.'</strong></li>
<li><span class="title">Speed</span><strong>'.$current_speed.'/s</span></strong></li>
</ul>
';
}
return json_encode(['status' => $active, 'html' => $html]);
}
public function buildRequest($endpoint)
{
$config = $this->config;
$url = $config->url;
$username = $config->username;
$password = $config->password;
$rebuild_url = str_replace('http://', 'http://'.$username.':'.$password.'@', $url);
$rebuild_url = str_replace('https://', 'https://'.$username.':'.$password.'@', $rebuild_url);
$rebuild_url = rtrim($rebuild_url, '/');
$api_url = $rebuild_url.'/jsonrpc/'.$endpoint;
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Nzbhydra implements Contracts\Applications {
public function defaultColour()
{
return '#53644d';
}
public function icon()
{
return 'supportedapps/nzbhydra.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Ombi implements Contracts\Applications {
public function defaultColour()
{
return '#150f09';
}
public function icon()
{
return 'supportedapps/ombi.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class OpenMediaVault implements Contracts\Applications {
public function defaultColour()
{
return '#5AF';
}
public function icon()
{
return 'supportedapps/openmediavault.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Openhab implements Contracts\Applications {
public function defaultColour()
{
return '#2b2525';
}
public function icon()
{
return 'supportedapps/openhab.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Opnsense implements Contracts\Applications {
public function defaultColour()
{
return '#211914';
}
public function icon()
{
return 'supportedapps/opnsense.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Pfsense implements Contracts\Applications {
public function defaultColour()
{
return '#4e4742';
}
public function icon()
{
return 'supportedapps/pfsense.png';
}
}

View File

@@ -0,0 +1,73 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Pihole implements Contracts\Applications, Contracts\Livestats {
public function defaultColour()
{
return '#352222';
}
public function icon()
{
return 'supportedapps/pihole.png';
}
public function configDetails()
{
return 'pihole';
}
public function testConfig()
{
$res = $this->buildRequest();
switch($res->getStatusCode()) {
case 200:
echo 'Successfully connected to the API';
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$html = '';
$active = 'active';
$res = $this->buildRequest();
$data = json_decode($res->getBody());
$html = '
<ul class="livestats">
<li><span class="title">Domains<br />Blocked</span><strong>'.$data->domains_being_blocked.'</strong></li>
<li><span class="title">Blocked<br />Today</span><strong>'.$data->ads_blocked_today.'</span></strong></li>
</ul>
';
return json_encode(['status' => $active, 'html' => $html]);
}
public function buildRequest()
{
$config = $this->config;
$url = $config->url;
$url = rtrim($url, '/');
$api_url = $url.'/api.php';
//die( $api_url.' --- ');
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View File

@@ -3,6 +3,10 @@
class Plex implements Contracts\Applications {
public function defaultColour()
{
return '#ccc';
return '#222';
}
public function icon()
{
return 'supportedapps/plex.png';
}
}

View File

@@ -0,0 +1,77 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Plexpy implements Contracts\Applications, Contracts\Livestats {
public $config;
public function defaultColour()
{
return '#2d2208';
}
public function icon()
{
return 'supportedapps/plexpy.png';
}
public function configDetails()
{
return 'plexpy';
}
public function testConfig()
{
$res = $this->buildRequest('arnold');
switch($res->getStatusCode()) {
case 200:
$data = json_decode($res->getBody());
if(isset($data->error) && !empty($data->error)) {
echo 'Failed: '.$data->error;
} else {
echo 'Successfully connected to the API';
}
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$html = '';
$active = 'active';
$res = $this->buildRequest('get_activity');
$data = json_decode($res->getBody());
$stream_count = $data->response->data->stream_count;
$html = '
<ul class="livestats">
<li><span class="title">Stream Count</span><strong>'.$stream_count.'</strong></li>
</ul>
';
return json_encode(['status' => $active, 'html' => $html]);
}
public function buildRequest($endpoint)
{
$config = $this->config;
$url = $config->url;
$apikey = $config->apikey;
$url = rtrim($url, '/');
$api_url = $url.'/api/v2?apikey='.$apikey.'&cmd='.$endpoint;
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Plexrequests implements Contracts\Applications {
public function defaultColour()
{
return '#3c2d1c';
}
public function icon()
{
return 'supportedapps/plexrequests.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Portainer implements Contracts\Applications {
public function defaultColour()
{
return '#283f44';
}
public function icon()
{
return 'supportedapps/portainer.png';
}
}

View File

@@ -0,0 +1,80 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Proxmox implements Contracts\Applications, Contracts\Livestats {
public function defaultColour()
{
return '#542e0a';
}
public function icon()
{
return 'supportedapps/proxmox.png';
}
public function configDetails()
{
//return 'proxmox';
return null;
}
public function testConfig()
{
/*$res = $this->buildRequest();
switch($res->getStatusCode()) {
case 200:
echo 'Successfully connected to the API';
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}*/
return null;
}
public function executeConfig()
{
/*
$output = '';
$res = $this->buildRequest();
$data = json_decode($res->getBody());
$output = '
<ul class="livestats">
<li><span class="title">Domains<br />Blocked</span><strong>'.$data->domains_being_blocked.'</strong></li>
<li><span class="title">Blocked<br />Today</span><strong>'.$data->ads_blocked_today.'</span></strong></li>
</ul>
';
return $output;
*/
return null;
}
public function buildRequest($endpoint='')
{
$config = $this->config;
$username = $config->username;
$password = $config->password;
$url = $config->url;
$url = rtrim($url, '/');
$api_url = $url.'/api2/json/'.$endpoint.'?username='.$username.'&password='.$password;
//die( $api_url.' --- ');
$client = new Client(['http_errors' => false, 'verify' => false ]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Radarr implements Contracts\Applications {
public function defaultColour()
{
return '#3e3726';
}
public function icon()
{
return 'supportedapps/radarr.png';
}
}

View File

@@ -0,0 +1,95 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Runeaudio implements Contracts\Applications, Contracts\Livestats {
public function defaultColour()
{
return '#05A';
}
public function icon()
{
return 'supportedapps/runeaudio.png';
}
public function configDetails()
{
return 'runeaudio';
}
public function testConfig()
{
$res = $this->buildRequest('status');
switch($res->getStatusCode()) {
case 200:
echo 'Successfully connected to the API';
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$output = '';
$active = 'active';
$artist = '';
$song_title = '';
$res = $this->buildRequest('currentsong');
$array = explode("\n", $res->getBody());
foreach($array as $item) {
$item_array = explode(": ", $item);
if ($item_array[0] == 'Artist') {
$artist = $item_array[1];
} elseif ($item_array[0] == 'Title') {
$song_title = $item_array[1];
}
}
$output = '<ul class="livestats">';
if (strlen($artist) > 12) {
$output = $output.'<li><span class="title-marquee"><span>'.$artist.'</span></span></li>';
} else {
$output = $output.'<li><span class="title">'.$artist.'</span></li>';
}
$output = $output.'</ul><ul class="livestats">';
if (strlen($song_title) > 12) {
$output = $output.'<li><span class="title-marquee"><span>'.$song_title.'</span></span></li>';
} else {
$output = $output.'<li><span class="title">'.$song_title.'</span></li>';
}
$output = $output.'</ul>';
return json_encode(['status' => $active, 'html' => $output]);
}
public function buildRequest($endpoint)
{
$config = $this->config;
$url = $config->url;
$url = rtrim($url, '/');
$api_url = $url.'/command/?cmd='.$endpoint;
//die( $api_url.' --- ');
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View File

@@ -0,0 +1,89 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Sabnzbd implements Contracts\Applications, Contracts\Livestats {
public $config;
public function defaultColour()
{
return '#3e3924';
}
public function icon()
{
return 'supportedapps/sabnzbd.png';
}
public function configDetails()
{
return 'sabnzbd';
}
public function testConfig()
{
$res = $this->buildRequest('queue');
switch($res->getStatusCode()) {
case 200:
$data = json_decode($res->getBody());
if(isset($data->error) && !empty($data->error)) {
echo 'Failed: '.$data->error;
} else {
echo 'Successfully connected to the API';
}
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$html = '';
$active = 'inactive';
$res = $this->buildRequest('queue');
$data = json_decode($res->getBody());
//$data->result->RemainingSizeMB = '10000000';
//$data->result->DownloadRate = '100000000';
if($data) {
$size = $data->queue->mbleft;
$rate = $data->queue->kbpersec;
$queue_size = format_bytes($size*1000*1000, false, ' <span>', '</span>');
$current_speed = format_bytes($rate*1000, false, ' <span>');
$active = ($size > 0 || $rate > 0) ? 'active' : 'inactive';
$html = '
<ul class="livestats">
<li><span class="title">Queue</span><strong>'.$queue_size.'</strong></li>
<li><span class="title">Speed</span><strong>'.$current_speed.'/s</span></strong></li>
</ul>
';
}
return json_encode(['status' => $active, 'html' => $html]);
}
public function buildRequest($endpoint)
{
$config = $this->config;
$url = $config->url;
$apikey = $config->apikey;
//print_r($config);
//die();
$url = rtrim($url, '/');
$api_url = $url.'/api?output=json&apikey='.$apikey.'&mode='.$endpoint;
//die( $api_url.' --- ');
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Sickrage implements Contracts\Applications {
public function defaultColour()
{
return '#6185a6';
}
public function icon()
{
return 'supportedapps/sickrage.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Sonarr implements Contracts\Applications {
public function defaultColour()
{
return '#163740';
}
public function icon()
{
return 'supportedapps/sonarr.png';
}
}

View File

@@ -0,0 +1,77 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
class Tautulli implements Contracts\Applications, Contracts\Livestats {
public $config;
public function defaultColour()
{
return '#2d2208';
}
public function icon()
{
return 'supportedapps/tautulli.png';
}
public function configDetails()
{
return 'tautulli';
}
public function testConfig()
{
$res = $this->buildRequest('arnold');
switch($res->getStatusCode()) {
case 200:
$data = json_decode($res->getBody());
if(isset($data->error) && !empty($data->error)) {
echo 'Failed: '.$data->error;
} else {
echo 'Successfully connected to the API';
}
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and that there is a trailing slash';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$html = '';
$active = 'active';
$res = $this->buildRequest('get_activity');
$data = json_decode($res->getBody());
$stream_count = $data->response->data->stream_count;
$html = '
<ul class="livestats">
<li><span class="title">Stream Count</span><strong>'.$stream_count.'</strong></li>
</ul>
';
return json_encode(['status' => $active, 'html' => $html]);
}
public function buildRequest($endpoint)
{
$config = $this->config;
$url = $config->url;
$apikey = $config->apikey;
$url = rtrim($url, '/');
$api_url = $url.'/api/v2?apikey='.$apikey.'&cmd='.$endpoint;
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
$res = $client->request('GET', $api_url);
return $res;
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Traefik implements Contracts\Applications {
public function defaultColour()
{
return '#28434a';
}
public function icon()
{
return 'supportedapps/traefik.png';
}
}

View File

@@ -0,0 +1,166 @@
<?php namespace App\SupportedApps;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Log;
class Transmission implements Contracts\Applications, Contracts\Livestats
{
private $_client;
private $_clientOptions = array();
public function __construct()
{
$body = array();
$body["method"] = "torrent-get";
$body["arguments"] = array("fields" => ["percentDone","status","rateDownload","rateUpload"]);
$this->_client = new Client(
['http_errors' => false,
'timeout' => 10,
'body' => json_encode($body)]
);
}
public function defaultColour()
{
return '#950003';
}
public function icon()
{
return 'supportedapps/transmission.png';
}
public function configDetails()
{
return 'transmission';
}
public function testConfig()
{
$res = $this->sendRequest();
if ($res == null) {
echo 'Transmission connection failed';
return;
}
switch($res->getStatusCode()) {
case 200:
$data = json_decode($res->getBody());
echo "Successfully connected with status: ".$data->result."\n";
break;
case 401:
echo 'Failed: Invalid credentials';
break;
case 404:
echo 'Failed: Please make sure your URL is correct and includes the port';
break;
case 409:
echo 'Failed: Incorrect session id';
break;
default:
echo 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
}
public function executeConfig()
{
$html = '';
$active = 'active';
$res = $this->sendRequest();
if ($res == null) {
Log::debug('Transmission connection failed');
return '';
}
$data = json_decode($res->getBody());
if (! isset($data->arguments)) {
Log::debug('Failed to fetch data from Transmission');
return '';
}
$torrents = $data->arguments->torrents;
$torrentCount = count($torrents);
$rateDownload = $rateUpload = $completedTorrents = 0;
foreach ($torrents as $thisTorrent) {
$rateDownload += $thisTorrent->rateDownload;
$rateUpload += $thisTorrent->rateUpload;
if ($thisTorrent->percentDone == 1) {
$completedTorrents += 1;
}
}
if ($torrentCount - $completedTorrents == 0) {
// Don't poll as frequently if we don't have any active torrents
$active = 'inactive';
}
$html = '
<ul class="livestats">
<li><span class="title">Done</span><sub>'.$completedTorrents.' / '.$torrentCount.'</sub></li>
<li><span class="title">Down</span><sub>'.format_bytes($rateDownload).'</sub></li>
<li><span class="title">Up</span><sub>'.format_bytes($rateUpload).'</sub></li>
</ul>
';
return json_encode(['status' => $active, 'html' => $html]);;
}
private function sendRequest()
{
$optionsSet = $this->setClientOptions();
if (! $optionsSet) {
// Pass the failed response back up the chain
return null;
}
$res = $this->torrentGet();
if ($res->getStatusCode() == 409) {
$this->setClientOptions();
$res = $this->torrentGet();
}
return $res;
}
private function torrentGet()
{
$res = null;
try{
$res = $this->_client->request(
'POST',
$this->getApiUrl(),
$this->_clientOptions
);
}catch(\GuzzleHttp\Exception\BadResponseException $e){
Log::error("Connection to {$e->getRequest()->getUrl()} failed");
Log::debug($e->getMessage());
$res = $e->getRequest();
}catch(\GuzzleHttp\Exception\ConnectException $e) {
Log::error("Transmission connection refused");
Log::debug($e->getMessage());
}
return $res;
}
private function setClientOptions()
{
if ($this->config->username != '' || $this->config->password != '') {
$this->_clientOptions = ['auth'=> [$this->config->username, $this->config->password, 'Basic']];
}
try{
$res = $this->_client->request('HEAD', $this->getApiUrl(), $this->_clientOptions);
$xtId = $res->getHeaderLine('X-Transmission-Session-Id');
if ($xtId != null) {
$this->_clientOptions['headers'] = ['X-Transmission-Session-Id' => $xtId];
} else {
Log::error("Unable to get Transmission session information");
Log::debug("Status Code: ".$res->getStatusCode());
}
}catch(\GuzzleHttp\Exception\ConnectException $e){
Log::error("Failed connection to Transmission");
return false;
}
return true;
}
private function getApiUrl()
{
$url = $this->config->url;
$url = rtrim($url, '/');
$apiUrl = $url.'/transmission/rpc';
return $apiUrl;
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Ttrss implements Contracts\Applications {
public function defaultColour()
{
return '#9d704c';
}
public function icon()
{
return 'supportedapps/tt-rss.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Unifi implements Contracts\Applications {
public function defaultColour()
{
return '#363840';
}
public function icon()
{
return 'supportedapps/unifi.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Watcher3 implements Contracts\Applications {
public function defaultColour()
{
return '#500';
}
public function icon()
{
return 'supportedapps/watcher3.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class WebTools implements Contracts\Applications {
public function defaultColour()
{
return '#555';
}
public function icon()
{
return 'supportedapps/webtools.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class Grafana implements Contracts\Applications {
public function defaultColour()
{
return '#a56e4d';
}
public function icon()
{
return 'supportedapps/grafana.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class pyLoad implements Contracts\Applications {
public function defaultColour()
{
return '#881';
}
public function icon()
{
return 'supportedapps/pyload.png';
}
}

View File

@@ -0,0 +1,12 @@
<?php namespace App\SupportedApps;
class ruTorrent implements Contracts\Applications {
public function defaultColour()
{
return '#004';
}
public function icon()
{
return 'supportedapps/rutorrent.png';
}
}

View File

@@ -7,6 +7,7 @@
"require": {
"php": ">=7.0.0",
"fideloper/proxy": "~3.3",
"guzzlehttp/guzzle": "^6.3",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"laravelcollective/html": "^5.5"
@@ -23,6 +24,9 @@
"database/seeds",
"database/factories"
],
"files": [
"app/Helper.php"
],
"psr-4": {
"App\\": "app/"
}

446
composer.lock generated
View File

@@ -4,7 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "2e42f992455e9f27258038e27b67f5a6",
"hash": "6973e08d9c0d6b713429fd693ccce7e8",
"content-hash": "ab6533331102493e1757f58bb2b94824",
"packages": [
{
"name": "dnoegel/php-xdg-base-dir",
@@ -37,24 +38,24 @@
"MIT"
],
"description": "implementation of xdg base directory specification for php",
"time": "2014-10-24T07:27:01+00:00"
"time": "2014-10-24 07:27:01"
},
{
"name": "doctrine/inflector",
"version": "v1.3.0",
"version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/inflector.git",
"reference": "5527a48b7313d15261292c149e55e26eae771b0a"
"reference": "e11d84c6e018beedd929cff5220969a3c6d1d462"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a",
"reference": "5527a48b7313d15261292c149e55e26eae771b0a",
"url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462",
"reference": "e11d84c6e018beedd929cff5220969a3c6d1d462",
"shasum": ""
},
"require": {
"php": "^7.1"
"php": "^7.0"
},
"require-dev": {
"phpunit/phpunit": "^6.2"
@@ -62,7 +63,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.3.x-dev"
"dev-master": "1.2.x-dev"
}
},
"autoload": {
@@ -104,7 +105,7 @@
"singularize",
"string"
],
"time": "2018-01-09T20:05:19+00:00"
"time": "2017-07-22 12:18:28"
},
{
"name": "doctrine/lexer",
@@ -158,7 +159,7 @@
"lexer",
"parser"
],
"time": "2014-09-09T13:34:57+00:00"
"time": "2014-09-09 13:34:57"
},
{
"name": "egulias/email-validator",
@@ -215,7 +216,7 @@
"validation",
"validator"
],
"time": "2017-11-15T23:40:40+00:00"
"time": "2017-11-15 23:40:40"
},
{
"name": "erusev/parsedown",
@@ -260,7 +261,7 @@
"markdown",
"parser"
],
"time": "2017-11-14T20:44:03+00:00"
"time": "2017-11-14 20:44:03"
},
{
"name": "fideloper/proxy",
@@ -317,7 +318,188 @@
"proxy",
"trusted proxy"
],
"time": "2017-06-15T17:19:42+00:00"
"time": "2017-06-15 17:19:42"
},
{
"name": "guzzlehttp/guzzle",
"version": "6.3.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699",
"reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
"shasum": ""
},
"require": {
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.4",
"php": ">=5.5"
},
"require-dev": {
"ext-curl": "*",
"phpunit/phpunit": "^4.0 || ^5.0",
"psr/log": "^1.0"
},
"suggest": {
"psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "6.2-dev"
}
},
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"GuzzleHttp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
}
],
"description": "Guzzle is a PHP HTTP client library",
"homepage": "http://guzzlephp.org/",
"keywords": [
"client",
"curl",
"framework",
"http",
"http client",
"rest",
"web service"
],
"time": "2017-06-22 18:50:49"
},
{
"name": "guzzlehttp/promises",
"version": "v1.3.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"shasum": ""
},
"require": {
"php": ">=5.5.0"
},
"require-dev": {
"phpunit/phpunit": "^4.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.4-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
}
],
"description": "Guzzle promises library",
"keywords": [
"promise"
],
"time": "2016-12-20 10:07:11"
},
{
"name": "guzzlehttp/psr7",
"version": "1.4.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
"reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
"psr/http-message": "~1.0"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.4-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Schultze",
"homepage": "https://github.com/Tobion"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
"request",
"response",
"stream",
"uri",
"url"
],
"time": "2017-03-20 17:10:46"
},
{
"name": "jakub-onderka/php-console-color",
@@ -360,7 +542,7 @@
"homepage": "http://www.acci.cz"
}
],
"time": "2014-04-08T15:00:19+00:00"
"time": "2014-04-08 15:00:19"
},
{
"name": "jakub-onderka/php-console-highlighter",
@@ -404,20 +586,20 @@
"homepage": "http://www.acci.cz/"
}
],
"time": "2015-04-20T18:58:01+00:00"
"time": "2015-04-20 18:58:01"
},
{
"name": "laravel/framework",
"version": "v5.5.33",
"version": "v5.5.34",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "ef7880e665390f999f4def7c9f78133636f973cf"
"reference": "1de7c0aec13eadbdddc2d1ba4019b064b2c6b966"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/ef7880e665390f999f4def7c9f78133636f973cf",
"reference": "ef7880e665390f999f4def7c9f78133636f973cf",
"url": "https://api.github.com/repos/laravel/framework/zipball/1de7c0aec13eadbdddc2d1ba4019b064b2c6b966",
"reference": "1de7c0aec13eadbdddc2d1ba4019b064b2c6b966",
"shasum": ""
},
"require": {
@@ -538,7 +720,7 @@
"framework",
"laravel"
],
"time": "2018-01-30T15:06:13+00:00"
"time": "2018-02-06 15:36:55"
},
{
"name": "laravel/tinker",
@@ -601,7 +783,7 @@
"laravel",
"psysh"
],
"time": "2017-12-18T16:25:11+00:00"
"time": "2017-12-18 16:25:11"
},
{
"name": "laravelcollective/html",
@@ -666,7 +848,7 @@
],
"description": "HTML and Form Builders for the Laravel Framework",
"homepage": "http://laravelcollective.com",
"time": "2017-08-31T14:46:03+00:00"
"time": "2017-08-31 14:46:03"
},
{
"name": "league/flysystem",
@@ -750,7 +932,7 @@
"sftp",
"storage"
],
"time": "2018-01-27T16:03:56+00:00"
"time": "2018-01-27 16:03:56"
},
{
"name": "monolog/monolog",
@@ -828,7 +1010,7 @@
"logging",
"psr-3"
],
"time": "2017-06-19T01:22:40+00:00"
"time": "2017-06-19 01:22:40"
},
{
"name": "mtdowling/cron-expression",
@@ -872,7 +1054,7 @@
"cron",
"schedule"
],
"time": "2017-01-23T04:29:33+00:00"
"time": "2017-01-23 04:29:33"
},
{
"name": "nesbot/carbon",
@@ -925,7 +1107,7 @@
"datetime",
"time"
],
"time": "2017-01-16T07:55:07+00:00"
"time": "2017-01-16 07:55:07"
},
{
"name": "nikic/php-parser",
@@ -976,7 +1158,7 @@
"parser",
"php"
],
"time": "2018-01-25T21:31:33+00:00"
"time": "2018-01-25 21:31:33"
},
{
"name": "paragonie/random_compat",
@@ -1024,7 +1206,7 @@
"pseudorandom",
"random"
],
"time": "2017-09-27T21:40:39+00:00"
"time": "2017-09-27 21:40:39"
},
{
"name": "psr/container",
@@ -1073,7 +1255,57 @@
"container-interop",
"psr"
],
"time": "2017-02-14T16:28:37+00:00"
"time": "2017-02-14 16:28:37"
},
{
"name": "psr/http-message",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
"homepage": "https://github.com/php-fig/http-message",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
],
"time": "2016-08-06 14:39:51"
},
{
"name": "psr/log",
@@ -1120,7 +1352,7 @@
"psr",
"psr-3"
],
"time": "2016-10-10T12:19:37+00:00"
"time": "2016-10-10 12:19:37"
},
{
"name": "psr/simple-cache",
@@ -1168,7 +1400,7 @@
"psr-16",
"simple-cache"
],
"time": "2017-01-02T13:31:39+00:00"
"time": "2017-01-02 13:31:39"
},
{
"name": "psy/psysh",
@@ -1240,7 +1472,7 @@
"interactive",
"shell"
],
"time": "2017-12-28T16:14:16+00:00"
"time": "2017-12-28 16:14:16"
},
{
"name": "ramsey/uuid",
@@ -1320,7 +1552,7 @@
"identifier",
"uuid"
],
"time": "2018-01-20T00:28:24+00:00"
"time": "2018-01-20 00:28:24"
},
{
"name": "swiftmailer/swiftmailer",
@@ -1375,7 +1607,7 @@
"mail",
"mailer"
],
"time": "2017-09-30T22:39:41+00:00"
"time": "2017-09-30 22:39:41"
},
{
"name": "symfony/console",
@@ -1444,29 +1676,29 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
"time": "2018-01-29T09:03:43+00:00"
"time": "2018-01-29 09:03:43"
},
{
"name": "symfony/css-selector",
"version": "v4.0.4",
"version": "v3.4.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
"reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7"
"reference": "e66394bc7610e69279bfdb3ab11b4fe65403f556"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/css-selector/zipball/f97600434e3141ef3cbb9ea42cf500fba88022b7",
"reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7",
"url": "https://api.github.com/repos/symfony/css-selector/zipball/e66394bc7610e69279bfdb3ab11b4fe65403f556",
"reference": "e66394bc7610e69279bfdb3ab11b4fe65403f556",
"shasum": ""
},
"require": {
"php": "^7.1.3"
"php": "^5.5.9|>=7.0.8"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
"dev-master": "3.4-dev"
}
},
"autoload": {
@@ -1497,7 +1729,7 @@
],
"description": "Symfony CssSelector Component",
"homepage": "https://symfony.com",
"time": "2018-01-03T07:38:00+00:00"
"time": "2018-01-03 07:37:34"
},
{
"name": "symfony/debug",
@@ -1553,34 +1785,34 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
"time": "2018-01-18T22:16:57+00:00"
"time": "2018-01-18 22:16:57"
},
{
"name": "symfony/event-dispatcher",
"version": "v4.0.4",
"version": "v3.4.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "74d33aac36208c4d6757807d9f598f0133a3a4eb"
"reference": "26b87b6bca8f8f797331a30b76fdae5342dc26ca"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/74d33aac36208c4d6757807d9f598f0133a3a4eb",
"reference": "74d33aac36208c4d6757807d9f598f0133a3a4eb",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/26b87b6bca8f8f797331a30b76fdae5342dc26ca",
"reference": "26b87b6bca8f8f797331a30b76fdae5342dc26ca",
"shasum": ""
},
"require": {
"php": "^7.1.3"
"php": "^5.5.9|>=7.0.8"
},
"conflict": {
"symfony/dependency-injection": "<3.4"
"symfony/dependency-injection": "<3.3"
},
"require-dev": {
"psr/log": "~1.0",
"symfony/config": "~3.4|~4.0",
"symfony/dependency-injection": "~3.4|~4.0",
"symfony/expression-language": "~3.4|~4.0",
"symfony/stopwatch": "~3.4|~4.0"
"symfony/config": "~2.8|~3.0|~4.0",
"symfony/dependency-injection": "~3.3|~4.0",
"symfony/expression-language": "~2.8|~3.0|~4.0",
"symfony/stopwatch": "~2.8|~3.0|~4.0"
},
"suggest": {
"symfony/dependency-injection": "",
@@ -1589,7 +1821,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
"dev-master": "3.4-dev"
}
},
"autoload": {
@@ -1616,7 +1848,7 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
"time": "2018-01-03T07:38:00+00:00"
"time": "2018-01-03 07:37:34"
},
{
"name": "symfony/finder",
@@ -1665,7 +1897,7 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
"time": "2018-01-03T07:37:34+00:00"
"time": "2018-01-03 07:37:34"
},
{
"name": "symfony/http-foundation",
@@ -1719,7 +1951,7 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
"time": "2018-01-29T09:03:43+00:00"
"time": "2018-01-29 09:03:43"
},
{
"name": "symfony/http-kernel",
@@ -1807,7 +2039,7 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "https://symfony.com",
"time": "2018-01-29T12:29:46+00:00"
"time": "2018-01-29 12:29:46"
},
{
"name": "symfony/polyfill-mbstring",
@@ -1866,7 +2098,7 @@
"portable",
"shim"
],
"time": "2018-01-30T19:27:44+00:00"
"time": "2018-01-30 19:27:44"
},
{
"name": "symfony/polyfill-php70",
@@ -1925,7 +2157,7 @@
"portable",
"shim"
],
"time": "2018-01-30T19:27:44+00:00"
"time": "2018-01-30 19:27:44"
},
{
"name": "symfony/process",
@@ -1974,7 +2206,7 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
"time": "2018-01-29T09:03:43+00:00"
"time": "2018-01-29 09:03:43"
},
{
"name": "symfony/routing",
@@ -2052,7 +2284,7 @@
"uri",
"url"
],
"time": "2018-01-16T18:03:57+00:00"
"time": "2018-01-16 18:03:57"
},
{
"name": "symfony/translation",
@@ -2120,7 +2352,7 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
"time": "2018-01-18T22:16:57+00:00"
"time": "2018-01-18 22:16:57"
},
{
"name": "symfony/var-dumper",
@@ -2189,7 +2421,7 @@
"debug",
"dump"
],
"time": "2018-01-29T09:03:43+00:00"
"time": "2018-01-29 09:03:43"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -2236,7 +2468,7 @@
],
"description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
"homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
"time": "2017-11-27T11:13:29+00:00"
"time": "2017-11-27 11:13:29"
},
{
"name": "vlucas/phpdotenv",
@@ -2286,38 +2518,38 @@
"env",
"environment"
],
"time": "2016-09-01T10:05:43+00:00"
"time": "2016-09-01 10:05:43"
}
],
"packages-dev": [
{
"name": "doctrine/instantiator",
"version": "1.1.0",
"version": "1.0.5",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
"reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"
"reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
"reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
"reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
"shasum": ""
},
"require": {
"php": "^7.1"
"php": ">=5.3,<8.0-DEV"
},
"require-dev": {
"athletic/athletic": "~0.1.8",
"ext-pdo": "*",
"ext-phar": "*",
"phpunit/phpunit": "^6.2.3",
"squizlabs/php_codesniffer": "^3.0.2"
"phpunit/phpunit": "~4.0",
"squizlabs/php_codesniffer": "~2.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.2.x-dev"
"dev-master": "1.0.x-dev"
}
},
"autoload": {
@@ -2342,7 +2574,7 @@
"constructor",
"instantiate"
],
"time": "2017-07-22T11:58:36+00:00"
"time": "2015-06-14 21:17:01"
},
{
"name": "filp/whoops",
@@ -2403,7 +2635,7 @@
"throwable",
"whoops"
],
"time": "2017-11-23T18:22:44+00:00"
"time": "2017-11-23 18:22:44"
},
{
"name": "fzaninotto/faker",
@@ -2453,7 +2685,7 @@
"faker",
"fixtures"
],
"time": "2017-08-15T16:48:10+00:00"
"time": "2017-08-15 16:48:10"
},
{
"name": "hamcrest/hamcrest-php",
@@ -2501,7 +2733,7 @@
"keywords": [
"test"
],
"time": "2016-01-20T08:20:44+00:00"
"time": "2016-01-20 08:20:44"
},
{
"name": "mockery/mockery",
@@ -2566,7 +2798,7 @@
"test double",
"testing"
],
"time": "2017-10-06T16:20:43+00:00"
"time": "2017-10-06 16:20:43"
},
{
"name": "myclabs/deep-copy",
@@ -2611,7 +2843,7 @@
"object",
"object graph"
],
"time": "2017-10-19T19:58:43+00:00"
"time": "2017-10-19 19:58:43"
},
{
"name": "phar-io/manifest",
@@ -2666,7 +2898,7 @@
}
],
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"time": "2017-03-05T18:14:27+00:00"
"time": "2017-03-05 18:14:27"
},
{
"name": "phar-io/version",
@@ -2713,7 +2945,7 @@
}
],
"description": "Library for handling version information and constraints",
"time": "2017-03-05T17:38:23+00:00"
"time": "2017-03-05 17:38:23"
},
{
"name": "phpdocumentor/reflection-common",
@@ -2767,7 +2999,7 @@
"reflection",
"static analysis"
],
"time": "2017-09-11T18:02:19+00:00"
"time": "2017-09-11 18:02:19"
},
{
"name": "phpdocumentor/reflection-docblock",
@@ -2818,7 +3050,7 @@
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"time": "2017-11-30T07:14:17+00:00"
"time": "2017-11-30 07:14:17"
},
{
"name": "phpdocumentor/type-resolver",
@@ -2865,7 +3097,7 @@
"email": "me@mikevanriel.com"
}
],
"time": "2017-07-14T14:27:02+00:00"
"time": "2017-07-14 14:27:02"
},
{
"name": "phpspec/prophecy",
@@ -2928,7 +3160,7 @@
"spy",
"stub"
],
"time": "2017-11-24T13:59:53+00:00"
"time": "2017-11-24 13:59:53"
},
{
"name": "phpunit/php-code-coverage",
@@ -2991,7 +3223,7 @@
"testing",
"xunit"
],
"time": "2017-12-06T09:29:45+00:00"
"time": "2017-12-06 09:29:45"
},
{
"name": "phpunit/php-file-iterator",
@@ -3038,7 +3270,7 @@
"filesystem",
"iterator"
],
"time": "2017-11-27T13:52:08+00:00"
"time": "2017-11-27 13:52:08"
},
{
"name": "phpunit/php-text-template",
@@ -3079,7 +3311,7 @@
"keywords": [
"template"
],
"time": "2015-06-21T13:50:34+00:00"
"time": "2015-06-21 13:50:34"
},
{
"name": "phpunit/php-timer",
@@ -3128,7 +3360,7 @@
"keywords": [
"timer"
],
"time": "2017-02-26T11:10:40+00:00"
"time": "2017-02-26 11:10:40"
},
{
"name": "phpunit/php-token-stream",
@@ -3177,7 +3409,7 @@
"keywords": [
"tokenizer"
],
"time": "2017-11-27T05:48:46+00:00"
"time": "2017-11-27 05:48:46"
},
{
"name": "phpunit/phpunit",
@@ -3261,7 +3493,7 @@
"testing",
"xunit"
],
"time": "2018-02-01T05:57:37+00:00"
"time": "2018-02-01 05:57:37"
},
{
"name": "phpunit/phpunit-mock-objects",
@@ -3320,7 +3552,7 @@
"mock",
"xunit"
],
"time": "2018-01-06T05:45:45+00:00"
"time": "2018-01-06 05:45:45"
},
{
"name": "sebastian/code-unit-reverse-lookup",
@@ -3365,7 +3597,7 @@
],
"description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"time": "2017-03-04T06:30:41+00:00"
"time": "2017-03-04 06:30:41"
},
{
"name": "sebastian/comparator",
@@ -3429,7 +3661,7 @@
"compare",
"equality"
],
"time": "2018-02-01T13:46:46+00:00"
"time": "2018-02-01 13:46:46"
},
{
"name": "sebastian/diff",
@@ -3481,7 +3713,7 @@
"keywords": [
"diff"
],
"time": "2017-08-03T08:09:46+00:00"
"time": "2017-08-03 08:09:46"
},
{
"name": "sebastian/environment",
@@ -3531,7 +3763,7 @@
"environment",
"hhvm"
],
"time": "2017-07-01T08:51:00+00:00"
"time": "2017-07-01 08:51:00"
},
{
"name": "sebastian/exporter",
@@ -3598,7 +3830,7 @@
"export",
"exporter"
],
"time": "2017-04-03T13:19:02+00:00"
"time": "2017-04-03 13:19:02"
},
{
"name": "sebastian/global-state",
@@ -3649,7 +3881,7 @@
"keywords": [
"global state"
],
"time": "2017-04-27T15:39:26+00:00"
"time": "2017-04-27 15:39:26"
},
{
"name": "sebastian/object-enumerator",
@@ -3696,7 +3928,7 @@
],
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"time": "2017-08-03T12:35:26+00:00"
"time": "2017-08-03 12:35:26"
},
{
"name": "sebastian/object-reflector",
@@ -3741,7 +3973,7 @@
],
"description": "Allows reflection of object attributes, including inherited and non-public ones",
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"time": "2017-03-29T09:07:27+00:00"
"time": "2017-03-29 09:07:27"
},
{
"name": "sebastian/recursion-context",
@@ -3794,7 +4026,7 @@
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
"time": "2017-03-03T06:23:57+00:00"
"time": "2017-03-03 06:23:57"
},
{
"name": "sebastian/resource-operations",
@@ -3836,7 +4068,7 @@
],
"description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"time": "2015-07-28T20:34:47+00:00"
"time": "2015-07-28 20:34:47"
},
{
"name": "sebastian/version",
@@ -3879,7 +4111,7 @@
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
"time": "2016-10-03T07:35:21+00:00"
"time": "2016-10-03 07:35:21"
},
{
"name": "symfony/thanks",
@@ -3922,7 +4154,7 @@
}
],
"description": "Give thanks (in the form of a GitHub ⭐) to your fellow PHP package maintainers (not limited to Symfony components)!",
"time": "2018-01-26T10:44:34+00:00"
"time": "2018-01-26 10:44:34"
},
{
"name": "theseer/tokenizer",
@@ -3962,7 +4194,7 @@
}
],
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"time": "2017-04-07T12:08:54+00:00"
"time": "2017-04-07 12:08:54"
},
{
"name": "webmozart/assert",
@@ -4012,7 +4244,7 @@
"check",
"validate"
],
"time": "2018-01-29T19:49:41+00:00"
"time": "2018-01-29 19:49:41"
}
],
"aliases": [],

View File

@@ -14,7 +14,7 @@ return [
*/
'name' => env('APP_NAME', 'Heimdall'),
'version' => '1.1.0',
'version' => '1.4.7',
/*
|--------------------------------------------------------------------------

3698
css/app.css vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddColumnsToItemsForGroups extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('items', function (Blueprint $table) {
$table->integer('type')->default(0)->index(); // 0 = item, 1 = category
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('items', function (Blueprint $table) {
$table->dropColumn(['type']);
});
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class ItemTag extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('item_tag', function (Blueprint $table) {
$table->integer('item_id')->unsigned()->index();
$table->foreign('item_id')->references('id')->on('items')->onDelete('cascade');
$table->integer('tag_id')->unsigned()->index();
$table->foreign('tag_id')->references('id')->on('items')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('item_tag');
}
}

View File

@@ -14,29 +14,39 @@ class SettingsSeeder extends Seeder
public function run()
{
// Groups
if(!SettingGroup::find(1)) {
if(!$setting_group = SettingGroup::find(1)) {
$setting_group = new SettingGroup;
$setting_group->id = 1;
$setting_group->title = 'System';
$setting_group->title = 'app.settings.system';
$setting_group->order = 0;
$setting_group->save();
}
if(!SettingGroup::find(2)) {
$setting_group = new SettingGroup;
$setting_group->id = 2;
$setting_group->title = 'Appearance';
$setting_group->order = 1;
} else {
$setting_group->title = 'app.settings.system';
$setting_group->save();
}
if(!SettingGroup::find(3)) {
if(!$setting_group = SettingGroup::find(2)) {
$setting_group = new SettingGroup;
$setting_group->id = 2;
$setting_group->title = 'app.settings.appearance';
$setting_group->order = 1;
$setting_group->save();
} else {
$setting_group->title = 'app.settings.appearance';
$setting_group->save();
}
if(!$setting_group = SettingGroup::find(3)) {
$setting_group = new SettingGroup;
$setting_group->id = 3;
$setting_group->title = 'Miscellaneous';
$setting_group->title = 'app.settings.miscellaneous';
$setting_group->order = 2;
$setting_group->save();
} else {
$setting_group->title = 'app.settings.miscellaneous';
$setting_group->save();
}
if($version = Setting::find(1)) {
$version->label = 'app.settings.version';
$version->value = config('app.version');
$version->save();
} else {
@@ -45,37 +55,45 @@ class SettingsSeeder extends Seeder
$setting->group_id = 1;
$setting->key = 'version';
$setting->type = 'text';
$setting->label = 'Version';
$setting->label = 'app.settings.version';
$setting->value = config('app.version');
$setting->system = true;
$setting->save();
}
if(!Setting::find(2)) {
if(!$setting = Setting::find(2)) {
$setting = new Setting;
$setting->id = 2;
$setting->group_id = 2;
$setting->key = 'background_image';
$setting->type = 'image';
$setting->label = 'Background Image';
$setting->label = 'app.settings.background_image';
$setting->save();
} else {
$setting->label = 'app.settings.background_image';
$setting->save();
}
if(!Setting::find(3)) {
if(!$setting = Setting::find(3)) {
$setting = new Setting;
$setting->id = 3;
$setting->group_id = 3;
$setting->key = 'homepage_search';
$setting->type = 'boolean';
$setting->label = 'Homepage Search';
$setting->label = 'app.settings.homepage_search';
$setting->save();
} else {
$setting->label = 'app.settings.homepage_search';
$setting->save();
}
if(!Setting::find(4)) {
$options = json_encode([
'none' => '- not set -',
'google' => 'Google',
'ddg' => 'DuckDuckGo',
'bing' => 'Bing'
]);
$options = json_encode([
'none' => 'app.options.none',
'google' => 'app.options.google',
'ddg' => 'app.options.ddg',
'bing' => 'app.options.bing'
]);
if(!$setting = Setting::find(4)) {
$setting = new Setting;
$setting->id = 4;
@@ -83,9 +101,42 @@ class SettingsSeeder extends Seeder
$setting->key = 'search_provider';
$setting->type = 'select';
$setting->options = $options;
$setting->label = 'Search Provider';
$setting->label = 'app.settings.search_provider';
$setting->save();
} else {
$setting->options = $options;
$setting->label = 'app.settings.search_provider';
$setting->save();
}
$language_options = json_encode([
'de' => 'Deutsch (German)',
'en' => 'English',
'fi' => 'Suomi (Finnish)',
'fr' => 'Français (French)',
'it' => 'Italiano (Italian)',
'no' => 'Norsk (Norwegian)',
'pl' => 'Polski (Polish)',
'sv' => 'Svenska (Swedish)',
'es' => 'Español (Spanish)',
'tr' => 'Türkçe (Turkish)',
]);
if($languages = Setting::find(5)) {
$languages->options = $language_options;
$languages->save();
} else {
$setting = new Setting;
$setting->id = 5;
$setting->group_id = 1;
$setting->key = 'language';
$setting->type = 'select';
$setting->label = 'app.settings.language';
$setting->options = $language_options;
$setting->value = 'en';
$setting->save();
}
}
}

3
mix-manifest.json Normal file
View File

@@ -0,0 +1,3 @@
{
"/css/app.css": "/css/app.css"
}

19
package-lock.json generated
View File

@@ -115,6 +115,11 @@
"repeat-string": "1.6.1"
}
},
"almond": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/almond/-/almond-0.3.3.tgz",
"integrity": "sha1-oOfJWsdiTWQXtElLHmi/9pMWiiA="
},
"alphanum-sort": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
@@ -6237,6 +6242,11 @@
"integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==",
"dev": true
},
"jquery-mousewheel": {
"version": "3.1.13",
"resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz",
"integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU="
},
"js-base64": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.2.tgz",
@@ -10696,6 +10706,15 @@
"integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
"dev": true
},
"select2": {
"version": "4.0.6-rc.1",
"resolved": "https://registry.npmjs.org/select2/-/select2-4.0.6-rc.1.tgz",
"integrity": "sha1-qmwwOKfw8ukf+t448KIcFeGBMnY=",
"requires": {
"almond": "0.3.3",
"jquery-mousewheel": "3.1.13"
}
},
"selfsigned": {
"version": "1.10.1",
"resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz",

View File

@@ -19,6 +19,7 @@
"vue": "^2.5.7"
},
"dependencies": {
"node-sass": "^4.7.2"
"node-sass": "^4.7.2",
"select2": "^4.0.6-rc.1"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
public/apple-icon-57x57.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
public/apple-icon-60x60.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
public/apple-icon-72x72.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
public/apple-icon-76x76.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
public/apple-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

2
public/browserconfig.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>

932
public/css/app.css vendored

File diff suppressed because it is too large Load Diff

BIN
public/favicon-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
public/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
public/favicon-96x96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 0 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

89
public/js/app.js vendored
View File

@@ -15,10 +15,70 @@ $.when( $.ready ).then(function() {
{
$('.message-container').fadeOut();
}, 3500);
}
if($('.livestats-container').length) {
$('.livestats-container').each(function(index){
var id = $(this).data('id');
var dataonly = $(this).data('dataonly');
var increaseby = (dataonly == 1) ? 20000 : 1000;
var container = $(this);
var max_timer = 30000;
var timer = 5000;
(function worker() {
$.ajax({
url: '/get_stats/'+id,
dataType: 'json',
success: function(data) {
container.html(data.html);
if(data.status == 'active') timer = increaseby;
else {
if(timer < max_timer) timer += 2000;
}
},
complete: function() {
// Schedule the next request when the current one's complete
setTimeout(worker, timer);
}
});
})();
});
}
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
$('#appimage img').attr('src', e.target.result);
}
reader.readAsDataURL(input.files[0]);
}
}
$("#upload").change(function() {
readURL(this);
});
/*$(".droppable").droppable({
tolerance: "intersect",
drop: function( event, ui ) {
var tag = $( this ).data('id');
var item = $( ui.draggable ).data('id');
$.get('tag/add/'+tag+'/'+item, function(data) {
if(data == 1) {
$( ui.draggable ).remove();
} else {
alert('not added');
}
});
}
});*/
$( "#sortable" ).sortable({
stop: function (event, ui) {
var idsInOrder = $("#sortable").sortable('toArray', {
@@ -33,12 +93,8 @@ $.when( $.ready ).then(function() {
});
$("#sortable").sortable("disable");
$('.color-picker').each( function( i, elem ) {
var hueb = new Huebee( elem, {
// options
});
});
$('#app').on('click', '#config-button', function(e) {
e.preventDefault();
var app = $('#app');
@@ -70,6 +126,29 @@ $.when( $.ready ).then(function() {
var app = $('#app');
app.removeClass('sidebar');
}).on('click', '#test_config', function(e) {
e.preventDefault();
var apiurl = $('#create input[name=url]').val();
var override_url = $('#override_url');
if(override_url.length && override_url.val() != '') {
apiurl = override_url;
}
var data = {};
data['url'] = apiurl;
$('input.config-item').each(function(index){
var config = $(this).data('config');
data[config] = $(this).val();
})
$.post(
'/test_config',
{ data }, function(data) {
alert(data);
}
);
});
$('#pinlist').on('click', 'a', function(e) {
e.preventDefault();

1
public/js/select2.min.js vendored Normal file

File diff suppressed because one or more lines are too long

41
public/manifest.json Normal file
View File

@@ -0,0 +1,41 @@
{
"name": "App",
"icons": [
{
"src": "\/android-icon-36x36.png",
"sizes": "36x36",
"type": "image\/png",
"density": "0.75"
},
{
"src": "\/android-icon-48x48.png",
"sizes": "48x48",
"type": "image\/png",
"density": "1.0"
},
{
"src": "\/android-icon-72x72.png",
"sizes": "72x72",
"type": "image\/png",
"density": "1.5"
},
{
"src": "\/android-icon-96x96.png",
"sizes": "96x96",
"type": "image\/png",
"density": "2.0"
},
{
"src": "\/android-icon-144x144.png",
"sizes": "144x144",
"type": "image\/png",
"density": "3.0"
},
{
"src": "\/android-icon-192x192.png",
"sizes": "192x192",
"type": "image\/png",
"density": "4.0"
}
]
}

View File

@@ -1,4 +1,4 @@
{
"/css/app.css": "/css/app.css?id=2102f4e7317cba78bff5",
"/js/app.js": "/js/app.js?id=2dffa24cf7255229e085"
"/css/app.css": "/css/app.css?id=7e76b8c135b6dbd38363",
"/js/app.js": "/js/app.js?id=24ea5e5c1fbea3461a14"
}

BIN
public/ms-icon-144x144.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
public/ms-icon-150x150.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/ms-icon-310x310.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Some files were not shown because too many files have changed in this diff Show More