mirror of
https://github.com/jagandeepbrar/lunasea.git
synced 2026-08-30 20:24:25 +00:00
Compare commits
218 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ee0bf9a6f | ||
|
|
9490355792 | ||
|
|
5d069a537a | ||
|
|
60cdc3e0b0 | ||
|
|
642af12404 | ||
|
|
3da56b0194 | ||
|
|
08228ef0f9 | ||
|
|
ea0fe19efc | ||
|
|
bf5d0ba6ec | ||
|
|
55c417f761 | ||
|
|
8bd3368e99 | ||
|
|
69f094135c | ||
|
|
ce69e8ea90 | ||
|
|
d81052d817 | ||
|
|
1c18d007d3 | ||
|
|
14e4f6a036 | ||
|
|
83dd953a06 | ||
|
|
f3fdf6d5f3 | ||
|
|
93d740bb9b | ||
|
|
85f8558e5d | ||
|
|
896f24f5b6 | ||
|
|
d271412a99 | ||
|
|
b1a513973d | ||
|
|
e2e1c7449b | ||
|
|
8e3c477bf7 | ||
|
|
335aaa3acd | ||
|
|
021a08e4e4 | ||
|
|
7ea7dfc2d6 | ||
|
|
cfa78fb6ec | ||
|
|
89b0906eab | ||
|
|
79d13889f2 | ||
|
|
5adaf059c8 | ||
|
|
44e2611008 | ||
|
|
9d17eea143 | ||
|
|
ebf85f0f79 | ||
|
|
5a04fd95ed | ||
|
|
e3a21d2817 | ||
|
|
50714fa603 | ||
|
|
fe3d41af57 | ||
|
|
1304ae327d | ||
|
|
aeb80fcf08 | ||
|
|
a44ec79b3d | ||
|
|
a15d09b455 | ||
|
|
3aa2cc974c | ||
|
|
605002f5bd | ||
|
|
2f94c42da1 | ||
|
|
b65af75075 | ||
|
|
4b149b58d0 | ||
|
|
5ce12795e7 | ||
|
|
0f4ac9a893 | ||
|
|
4e243d6f30 | ||
|
|
568c28cd92 | ||
|
|
3500d83477 | ||
|
|
b515a0d14e | ||
|
|
6a2e7d83f3 | ||
|
|
f1a82c06aa | ||
|
|
c5eace4352 | ||
|
|
781727abba | ||
|
|
7c8e17e59f | ||
|
|
074e8fa756 | ||
|
|
228cc4140f | ||
|
|
3f6d138b8d | ||
|
|
ac560ba655 | ||
|
|
c0403d7333 | ||
|
|
e591f93791 | ||
|
|
96abd83d98 | ||
|
|
28b9037ca5 | ||
|
|
3b2bb794c9 | ||
|
|
596eab4bad | ||
|
|
fa01702362 | ||
|
|
76525b201e | ||
|
|
26314ca5a5 | ||
|
|
2f04edebfb | ||
|
|
c53d83b22f | ||
|
|
aca5d0eb82 | ||
|
|
26a35aadb1 | ||
|
|
8888795f27 | ||
|
|
5cf1a06cec | ||
|
|
47ff2628a2 | ||
|
|
94488e2df8 | ||
|
|
4e3dfbf794 | ||
|
|
6de806316e | ||
|
|
b98a0f8046 | ||
|
|
449df1d104 | ||
|
|
268b5e3693 | ||
|
|
8042c0475e | ||
|
|
6241ee4629 | ||
|
|
d612ae221c | ||
|
|
f1b831a118 | ||
|
|
0b59b7202d | ||
|
|
d86a5a0c72 | ||
|
|
7a6c9772f3 | ||
|
|
b22b87b6d8 | ||
|
|
d4774b0542 | ||
|
|
e6d7e50a45 | ||
|
|
7ba4b2f018 | ||
|
|
4c99ecf927 | ||
|
|
edb645f887 | ||
|
|
d688fe84ef | ||
|
|
c46924c996 | ||
|
|
56f26e701e | ||
|
|
968fe9cbbc | ||
|
|
19f7ecf885 | ||
|
|
3f10675422 | ||
|
|
746bcc5ac9 | ||
|
|
721c1c957e | ||
|
|
0e09821842 | ||
|
|
607ac4391a | ||
|
|
b1d01e02ca | ||
|
|
3858de8d65 | ||
|
|
a390a80ef1 | ||
|
|
322ec55546 | ||
|
|
34169bb1ff | ||
|
|
0f4aef0e32 | ||
|
|
cf5bfca265 | ||
|
|
affac3abc6 | ||
|
|
9826c5604d | ||
|
|
ea7a8ffc22 | ||
|
|
4cb8caaa1d | ||
|
|
53cb7f6675 | ||
|
|
123ab7f6a7 | ||
|
|
caf054aea2 | ||
|
|
125596498e | ||
|
|
38f2eb4cb2 | ||
|
|
7d437d5c3a | ||
|
|
3d794099a5 | ||
|
|
b7ceebcb67 | ||
|
|
25e0d05142 | ||
|
|
250a494903 | ||
|
|
b47ef16001 | ||
|
|
71f597baa7 | ||
|
|
abf117ac92 | ||
|
|
f3a3f222bd | ||
|
|
f9a2a1c85c | ||
|
|
7d469e7bad | ||
|
|
137a52ccd4 | ||
|
|
9a1769595d | ||
|
|
9b930493d7 | ||
|
|
bfe5dc77a0 | ||
|
|
3ac2c5d791 | ||
|
|
f1226e5638 | ||
|
|
ee91085b07 | ||
|
|
e287baf046 | ||
|
|
8788f76e5c | ||
|
|
6eff6c902c | ||
|
|
d9623e992d | ||
|
|
958e6f1568 | ||
|
|
f3931c6b08 | ||
|
|
3dd087e361 | ||
|
|
ac838f99a9 | ||
|
|
c9bd02b750 | ||
|
|
cfbfb2b3ad | ||
|
|
bccd1a43c4 | ||
|
|
70ed750652 | ||
|
|
c76418d26f | ||
|
|
c062b3d786 | ||
|
|
a9d551df5e | ||
|
|
dc617ed151 | ||
|
|
9f31120cd5 | ||
|
|
e9c922ff39 | ||
|
|
2ab098962d | ||
|
|
863972cf86 | ||
|
|
fd170106b4 | ||
|
|
af83820b85 | ||
|
|
a6be658164 | ||
|
|
0c59886657 | ||
|
|
a78aa001fa | ||
|
|
1e94621ce6 | ||
|
|
e477ecafcc | ||
|
|
da20cbb127 | ||
|
|
fb5cd59d6b | ||
|
|
d3d090e277 | ||
|
|
3a5e19b02c | ||
|
|
83e8374c33 | ||
|
|
82ef5f0c52 | ||
|
|
7aae480722 | ||
|
|
750d96ec13 | ||
|
|
35cba0ab27 | ||
|
|
b23f8ad633 | ||
|
|
85d9aff094 | ||
|
|
a8827b5c9e | ||
|
|
d76713dcd6 | ||
|
|
e3b771bed1 | ||
|
|
136cda5215 | ||
|
|
579531c30a | ||
|
|
dcb59667c1 | ||
|
|
4b411107f7 | ||
|
|
c0810574ce | ||
|
|
3c9d705f80 | ||
|
|
6f9e0e87ce | ||
|
|
c4945351ca | ||
|
|
a1b736ae0c | ||
|
|
2adfe59bd5 | ||
|
|
113b294346 | ||
|
|
19133df94b | ||
|
|
731e3c93c8 | ||
|
|
a160f0941f | ||
|
|
65d1478b00 | ||
|
|
b851b87515 | ||
|
|
96b2b1b5b0 | ||
|
|
3d0c5209cb | ||
|
|
57bbb80a01 | ||
|
|
3593eb329b | ||
|
|
f8dca60331 | ||
|
|
864082fd40 | ||
|
|
b963ddf401 | ||
|
|
83d3ec42e3 | ||
|
|
8ba4fb3b8d | ||
|
|
383c728481 | ||
|
|
ea01a21189 | ||
|
|
b812c7b4a1 | ||
|
|
96b2067577 | ||
|
|
1d4207ae51 | ||
|
|
9960124d32 | ||
|
|
aed7e8526f | ||
|
|
b67c916ac6 | ||
|
|
77b12bc969 | ||
|
|
11ae4a2644 |
@@ -1,334 +0,0 @@
|
||||
{
|
||||
"files": [
|
||||
"CONTRIBUTORS.md"
|
||||
],
|
||||
"imageSize": 100,
|
||||
"commit": false,
|
||||
"contributors": [
|
||||
{
|
||||
"login": "JagandeepBrar",
|
||||
"name": "Jagandeep Brar",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/3048295?v=4",
|
||||
"profile": "https://www.jagandeepbrar.io",
|
||||
"contributions": [
|
||||
"code",
|
||||
"design",
|
||||
"ideas"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "lightglitch",
|
||||
"name": "Mário Franco",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/196953?v=4",
|
||||
"profile": "https://github.com/lightglitch",
|
||||
"contributions": [
|
||||
"code",
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Qstick",
|
||||
"name": "Qstick",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/376117?v=4",
|
||||
"profile": "https://github.com/Qstick",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "AliMickey",
|
||||
"name": "Micky",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/60691199?v=4",
|
||||
"profile": "https://github.com/AliMickey",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "xrths",
|
||||
"name": "xrths",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/40337934?v=4",
|
||||
"profile": "http://www.xrths.fr",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Phaugt",
|
||||
"name": "Patrik Hauguth",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/41962737?v=4",
|
||||
"profile": "https://pythonexplainedto.me/",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "comradekingu",
|
||||
"name": "Allan Nordhøy",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/13802408?v=4",
|
||||
"profile": "https://liberapay.com/kingu/",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "cpt-kuesel",
|
||||
"name": "cpt-kuesel",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/79487102?v=4",
|
||||
"profile": "https://github.com/cpt-kuesel",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "KovalevArtem",
|
||||
"name": "KovalevArtem",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/36500228?v=4",
|
||||
"profile": "https://github.com/KovalevArtem",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "iFelix18",
|
||||
"name": "Davide",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/19800006?v=4",
|
||||
"profile": "https://github.com/iFelix18",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ersen0",
|
||||
"name": "Oğuz Ersen",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/88676873?v=4",
|
||||
"profile": "https://ersen.srht.site/",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "bittin",
|
||||
"name": "bittin",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/43197?v=4",
|
||||
"profile": "https://github.com/bittin",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "almontegil",
|
||||
"name": "Gil",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/68232356?v=4",
|
||||
"profile": "https://github.com/almontegil",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "TheSander562",
|
||||
"name": "Sander Lambrechts",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/14059770?v=4",
|
||||
"profile": "https://github.com/TheSander562",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Guilhermerrrr",
|
||||
"name": "Guilhermerrrr",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/92966143?v=4",
|
||||
"profile": "https://github.com/Guilhermerrrr",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Ben-Wallner",
|
||||
"name": "Ben Biber",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/24373331?v=4",
|
||||
"profile": "https://github.com/Ben-Wallner",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Sytom",
|
||||
"name": "Sytom",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/30535521?v=4",
|
||||
"profile": "https://github.com/Sytom",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "xxzj990",
|
||||
"name": "xxzj990",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/5134154?v=4",
|
||||
"profile": "https://xxzj990.top",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "mfrelink",
|
||||
"name": "Mark Frelink",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/3245077?v=4",
|
||||
"profile": "https://www.openflixr.com",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "diemade",
|
||||
"name": "diemade",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/174809?v=4",
|
||||
"profile": "https://github.com/diemade",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "FeikoJoosten",
|
||||
"name": "Feiko Joosten",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/10920052?v=4",
|
||||
"profile": "https://feikojoosten.com",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "TheMaxul",
|
||||
"name": "TheMaxul",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/2436527?v=4",
|
||||
"profile": "https://github.com/TheMaxul",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Lisapple",
|
||||
"name": "Maxime Leroy",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/6952213?v=4",
|
||||
"profile": "https://lisacintosh.itch.io",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "vc5",
|
||||
"name": "Vincent",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/13097192?v=4",
|
||||
"profile": "https://github.com/vc5",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "gmcinalli",
|
||||
"name": "Gian Marco Cinalli",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/9024983?v=4",
|
||||
"profile": "https://github.com/gmcinalli",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "issaccv",
|
||||
"name": "八月的蠢",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/17275050?v=4",
|
||||
"profile": "https://www.issacc.top/",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "neoestremi",
|
||||
"name": "neoestremi",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1340877?v=4",
|
||||
"profile": "https://github.com/neoestremi",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "marcosvdiasofc",
|
||||
"name": "marcosvdiasofc",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/96720080?v=4",
|
||||
"profile": "https://github.com/marcosvdiasofc",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "fscorrupt",
|
||||
"name": "FSCorrupt",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/45659314?v=4",
|
||||
"profile": "https://liberapay.com/FSCorrupt/donate",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "iHunterX",
|
||||
"name": "iHunterX",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/16854718?v=4",
|
||||
"profile": "https://github.com/iHunterX",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Brokeos",
|
||||
"name": "Brokeos",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/8388746?v=4",
|
||||
"profile": "https://github.com/Brokeos",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "punchy98",
|
||||
"name": "Michael Maldonado",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/12002902?v=4",
|
||||
"profile": "https://github.com/punchy98",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "natiz",
|
||||
"name": "natiz",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/3515888?v=4",
|
||||
"profile": "https://github.com/natiz",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "KevoM",
|
||||
"name": "KevoM",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/8274366?v=4",
|
||||
"profile": "https://github.com/KevoM",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "rogeriomendes",
|
||||
"name": "rogeriomendes",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1494503?v=4",
|
||||
"profile": "https://github.com/rogeriomendes",
|
||||
"contributions": [
|
||||
"translation"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 8,
|
||||
"projectName": "LunaSea",
|
||||
"projectOwner": "JagandeepBrar",
|
||||
"repoType": "github",
|
||||
"repoHost": "https://github.com",
|
||||
"skipCi": true,
|
||||
"commitConvention": "none"
|
||||
}
|
||||
14
.github/ISSUE_TEMPLATE/config.yml
vendored
14
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,14 +0,0 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Support via Discord
|
||||
url: https://www.lunasea.app/discord
|
||||
about: Chat with the developer and users on support and setup related topics.
|
||||
- name: Support via GitHub Discussions
|
||||
url: https://github.com/JagandeepBrar/LunaSea/discussions
|
||||
about: Ask questions and discuss with other community members
|
||||
- name: Support via Reddit
|
||||
url: https://www.lunasea.app/reddit
|
||||
about: Ask the developer and other redditors for support and setup related topics.
|
||||
- name: Feedback & Feature Requests Board
|
||||
url: https://feedback.lunasea.app
|
||||
about: Request new features and modules to be implemented into LunaSea.
|
||||
27
.github/workflows/build_linux.yml
vendored
27
.github/workflows/build_linux.yml
vendored
@@ -1,27 +0,0 @@
|
||||
name: 'Build Linux'
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
jobs:
|
||||
build-snapcraft:
|
||||
name: Snapcraft
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
|
||||
with:
|
||||
platform: linux
|
||||
|
||||
- name: Build LunaSea
|
||||
uses: snapcore/action-build@v1
|
||||
id: build
|
||||
|
||||
- name: Prepare Artifact
|
||||
run: mv ${{ steps.build.outputs.snap }} ${{ github.workspace }}/output/lunasea-linux-amd64.snap
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: linux-snapcraft
|
||||
path: ${{ github.workspace }}/output
|
||||
20
.github/workflows/clear_flutter_cache.yml
vendored
20
.github/workflows/clear_flutter_cache.yml
vendored
@@ -1,20 +0,0 @@
|
||||
name: Clear Flutter Cache
|
||||
|
||||
on:
|
||||
workflow_dispatch
|
||||
|
||||
jobs:
|
||||
clear:
|
||||
name: Clear Cache
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Install Flutter
|
||||
uses: subosito/flutter-action@v2
|
||||
with:
|
||||
channel: stable
|
||||
cache: true
|
||||
cache-key: ${{ github.sha }}
|
||||
|
||||
- name: Flutter Doctor
|
||||
working-directory: ${{ github.workspace }}
|
||||
run: flutter doctor -v
|
||||
45
.github/workflows/github_issue_labels.yml
vendored
45
.github/workflows/github_issue_labels.yml
vendored
@@ -1,45 +0,0 @@
|
||||
name: 'GitHub Issue Labels'
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [labeled, unlabeled, reopened]
|
||||
|
||||
jobs:
|
||||
support:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Feature Request
|
||||
uses: dessant/support-requests@v2
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
support-label: 'feature request'
|
||||
issue-comment: >
|
||||
Hi @{issue-author}! We use the issue tracker exclusively
|
||||
for bug reports and issues. However, this issue appears
|
||||
to be a feature request. Please use the following channels:
|
||||
|
||||
- [Feedback & Feature Requests Board](https://feedback.lunasea.app)
|
||||
|
||||
- [Discord](https://www.lunasea.app/discord)
|
||||
close-issue: true
|
||||
lock-issue: true
|
||||
issue-lock-reason: 'off-topic'
|
||||
|
||||
- name: Support
|
||||
uses: dessant/support-requests@v2
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
support-label: 'support'
|
||||
issue-comment: >
|
||||
Hi @{issue-author}! We use the issue tracker exclusively
|
||||
for bug reports and issues. However, this issue appears
|
||||
to be a support request. Please use the following channels:
|
||||
|
||||
- [Discord](https://www.lunasea.app/discord)
|
||||
|
||||
- [GitHub Discussions](https://github.com/JagandeepBrar/LunaSea/discussions)
|
||||
|
||||
- [Subreddit](https://www.lunasea.app/reddit)
|
||||
close-issue: true
|
||||
lock-issue: true
|
||||
issue-lock-reason: 'off-topic'
|
||||
73
.github/workflows/notify.yml
vendored
73
.github/workflows/notify.yml
vendored
@@ -1,73 +0,0 @@
|
||||
name: Notify
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
build-changelog:
|
||||
required: true
|
||||
type: string
|
||||
build-flavor:
|
||||
required: true
|
||||
type: string
|
||||
build-title:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
secrets:
|
||||
DISCORD_WEBHOOK_EDGE:
|
||||
required: true
|
||||
DISCORD_WEBHOOK_BETA:
|
||||
required: true
|
||||
DISCORD_WEBHOOK_CANDIDATE:
|
||||
required: true
|
||||
DISCORD_WEBHOOK_STABLE:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
discord:
|
||||
name: Discord
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Determine Webhook Channel
|
||||
id: webhook
|
||||
uses: actions/github-script@v6
|
||||
env:
|
||||
DISCORD_WEBHOOK_EDGE: ${{ secrets.DISCORD_WEBHOOK_EDGE }}
|
||||
DISCORD_WEBHOOK_BETA: ${{ secrets.DISCORD_WEBHOOK_BETA }}
|
||||
DISCORD_WEBHOOK_CANDIDATE: ${{ secrets.DISCORD_WEBHOOK_CANDIDATE }}
|
||||
DISCORD_WEBHOOK_STABLE: ${{ secrets.DISCORD_WEBHOOK_STABLE }}
|
||||
BUILD_FLAVOR: ${{ inputs.build-flavor }}
|
||||
with:
|
||||
result-encoding: string
|
||||
script: |
|
||||
switch (process.env.BUILD_FLAVOR) {
|
||||
case 'beta': return process.env.DISCORD_WEBHOOK_BETA;
|
||||
case 'candidate': return process.env.DISCORD_WEBHOOK_CANDIDATE;
|
||||
case 'stable': return process.env.DISCORD_WEBHOOK_STABLE;
|
||||
case 'edge':
|
||||
default: return process.env.DISCORD_WEBHOOK_EDGE;
|
||||
}
|
||||
|
||||
- name: Create Discord Embed
|
||||
id: embed
|
||||
uses: actions/github-script@v6
|
||||
env:
|
||||
BUILD_CHANGELOG: ${{ inputs.build-changelog }}
|
||||
BUILD_FLAVOR: ${{ inputs.build-flavor }}
|
||||
BUILD_TITLE: ${{ inputs.build-title }}
|
||||
with:
|
||||
result-encoding: string
|
||||
script: return require('.github/scripts/notify-embed.js')();
|
||||
|
||||
- name: Send Discord Message
|
||||
uses: Ilshidur/action-discord@0.3.2
|
||||
env:
|
||||
DISCORD_WEBHOOK: ${{ steps.webhook.outputs.result }}
|
||||
DISCORD_USERNAME: LunaSea Support
|
||||
DISCORD_AVATAR: https://raw.githubusercontent.com/JagandeepBrar/LunaSea/master/assets/icon/icon.png
|
||||
DISCORD_EMBEDS: ${{ steps.embed.outputs.result }}
|
||||
66
.github/workflows/publish_android.yml
vendored
66
.github/workflows/publish_android.yml
vendored
@@ -1,66 +0,0 @@
|
||||
name: Publish Android
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
build-changelog:
|
||||
required: true
|
||||
type: string
|
||||
build-flavor:
|
||||
required: true
|
||||
type: string
|
||||
build-title:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
secrets:
|
||||
GOOGLE_PLAY_API:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
play-store:
|
||||
name: Play Store
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
|
||||
with:
|
||||
channel: play-store
|
||||
google-play-key: ${{ secrets.GOOGLE_PLAY_API }}
|
||||
|
||||
- name: Download Play Store Package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: android-playstore-package
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Determine Release Channel
|
||||
id: channel
|
||||
uses: actions/github-script@v6
|
||||
env:
|
||||
FLAVOR: ${{ inputs.build-flavor }}
|
||||
with:
|
||||
result-encoding: string
|
||||
script: |
|
||||
const ref = process.env.FLAVOR || 'edge';
|
||||
switch (ref) {
|
||||
case 'beta': return 'alpha';
|
||||
case 'candidate': return 'beta';
|
||||
case 'stable': return 'production';
|
||||
case 'edge':
|
||||
default: return 'internal';
|
||||
}
|
||||
|
||||
- name: Generate Changelog
|
||||
env:
|
||||
CHANGELOG: ${{ inputs.build-changelog }}
|
||||
CHANGELOG_PATH: ${{ github.workspace }}/android/fastlane/metadata/android/en-CA/changelogs
|
||||
run: |
|
||||
mkdir -p $CHANGELOG_PATH
|
||||
echo $CHANGELOG > $CHANGELOG_PATH/default.txt
|
||||
|
||||
- name: Deploy to Google Play Store
|
||||
working-directory: ${{ github.workspace }}/android
|
||||
env:
|
||||
SUPPLY_JSON_KEY: ${{ github.workspace }}/keys/googleplay.json
|
||||
run: bundle exec fastlane deploy_playstore track:${{ steps.channel.outputs.result }} aab:${{ github.workspace }}/output/lunasea-android.aab version_name:${{ inputs.build-title }}
|
||||
61
.github/workflows/publish_ios.yml
vendored
61
.github/workflows/publish_ios.yml
vendored
@@ -1,61 +0,0 @@
|
||||
name: Publish iOS
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
build-changelog:
|
||||
required: true
|
||||
type: string
|
||||
build-flavor:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
secrets:
|
||||
APPLE_ID:
|
||||
required: true
|
||||
APPLE_ITC_TEAM_ID:
|
||||
required: true
|
||||
APPLE_STORE_CONNECT_ISSUER_ID:
|
||||
required: true
|
||||
APPLE_STORE_CONNECT_KEY:
|
||||
required: true
|
||||
APPLE_STORE_CONNECT_KEY_ID:
|
||||
required: true
|
||||
APPLE_TEAM_ID:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
app-store:
|
||||
name: App Store (iOS)
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
|
||||
with:
|
||||
channel: app-store
|
||||
appstore-connect-key: ${{ secrets.APPLE_STORE_CONNECT_KEY }}
|
||||
|
||||
- name: Download App Store Package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ios-appstore-package
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Generate Changelog
|
||||
env:
|
||||
CHANGELOG: ${{ inputs.build-changelog }}
|
||||
CHANGELOG_PATH: ${{ github.workspace }}/ios/fastlane
|
||||
run: |
|
||||
mkdir -p $CHANGELOG_PATH
|
||||
echo $CHANGELOG > $CHANGELOG_PATH/changelog.txt
|
||||
|
||||
- name: Deploy to App Store Connect
|
||||
working-directory: ${{ github.workspace }}/ios
|
||||
env:
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_ITC_TEAM_ID: ${{ secrets.APPLE_ITC_TEAM_ID }}
|
||||
APPLE_STORE_CONNECT_ISSUER_ID: ${{ secrets.APPLE_STORE_CONNECT_ISSUER_ID }}
|
||||
APPLE_STORE_CONNECT_KEY_FILEPATH: ${{ github.workspace }}/keys/appstore.p8
|
||||
APPLE_STORE_CONNECT_KEY_ID: ${{ secrets.APPLE_STORE_CONNECT_KEY_ID }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
run: bundle exec fastlane deploy_appstore groups:${{ inputs.build-flavor }} ipa:${{ github.workspace }}/output/lunasea-ios.ipa
|
||||
36
.github/workflows/publish_linux.yml
vendored
36
.github/workflows/publish_linux.yml
vendored
@@ -1,36 +0,0 @@
|
||||
name: Publish Linux
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
build-flavor:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
secrets:
|
||||
SNAPCRAFT_STORE_CREDENTIALS:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
snapcraft:
|
||||
name: Snapcraft
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
|
||||
with:
|
||||
channel: snapcraft
|
||||
|
||||
- name: Download Snap
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: linux-snapcraft
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Deploy to Snapcraft
|
||||
uses: snapcore/action-publish@master
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}
|
||||
with:
|
||||
release: ${{ inputs.build-flavor }}
|
||||
snap: ${{ github.workspace }}/output/lunasea-linux-amd64.snap
|
||||
61
.github/workflows/publish_macos.yml
vendored
61
.github/workflows/publish_macos.yml
vendored
@@ -1,61 +0,0 @@
|
||||
name: Publish macOS
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
build-changelog:
|
||||
required: true
|
||||
type: string
|
||||
build-flavor:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
secrets:
|
||||
APPLE_ID:
|
||||
required: true
|
||||
APPLE_ITC_TEAM_ID:
|
||||
required: true
|
||||
APPLE_STORE_CONNECT_ISSUER_ID:
|
||||
required: true
|
||||
APPLE_STORE_CONNECT_KEY:
|
||||
required: true
|
||||
APPLE_STORE_CONNECT_KEY_ID:
|
||||
required: true
|
||||
APPLE_TEAM_ID:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
app-store:
|
||||
name: App Store (macOS)
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
|
||||
with:
|
||||
channel: app-store
|
||||
appstore-connect-key: ${{ secrets.APPLE_STORE_CONNECT_KEY }}
|
||||
|
||||
- name: Download App Store Package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: macos-appstore-package
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Generate Changelog
|
||||
env:
|
||||
CHANGELOG: ${{ inputs.build-changelog }}
|
||||
CHANGELOG_PATH: ${{ github.workspace }}/macos/fastlane
|
||||
run: |
|
||||
mkdir -p $CHANGELOG_PATH
|
||||
echo $CHANGELOG > $CHANGELOG_PATH/changelog.txt
|
||||
|
||||
- name: Deploy to App Store Connect
|
||||
working-directory: ${{ github.workspace }}/macos
|
||||
env:
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_ITC_TEAM_ID: ${{ secrets.APPLE_ITC_TEAM_ID }}
|
||||
APPLE_STORE_CONNECT_ISSUER_ID: ${{ secrets.APPLE_STORE_CONNECT_ISSUER_ID }}
|
||||
APPLE_STORE_CONNECT_KEY_FILEPATH: ${{ github.workspace }}/keys/appstore.p8
|
||||
APPLE_STORE_CONNECT_KEY_ID: ${{ secrets.APPLE_STORE_CONNECT_KEY_ID }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
run: bundle exec fastlane deploy_appstore groups:${{ inputs.build-flavor }} pkg:${{ github.workspace }}/output/lunasea-macos-amd64.pkg
|
||||
121
.github/workflows/publish_s3.yml
vendored
121
.github/workflows/publish_s3.yml
vendored
@@ -1,121 +0,0 @@
|
||||
name: Publish s3
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
build-flavor:
|
||||
required: true
|
||||
type: string
|
||||
build-number:
|
||||
required: true
|
||||
type: string
|
||||
build-title:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
secrets:
|
||||
S3_ACCESS_KEY:
|
||||
required: true
|
||||
S3_BUCKET:
|
||||
required: true
|
||||
S3_ENDPOINT:
|
||||
required: true
|
||||
S3_KEY_ID:
|
||||
required: true
|
||||
S3_REGION:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
s3:
|
||||
name: S3
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
|
||||
with:
|
||||
channel: s3
|
||||
|
||||
- name: Download Android App Package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: android-app-package
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Download iOS App Package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: ios-appstore-package
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Download Linux Snap
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: linux-snapcraft
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Download macOS App Package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: macos-app-package
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Download macOS Disk Image
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: macos-disk-image
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Download Web Archive
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: web-archive
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Download Windows App Package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: windows-app-package
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Download Windows MSIX Installer
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: windows-msix-installer
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Create Version File
|
||||
working-directory: ${{ github.workspace }}/output
|
||||
run: |
|
||||
echo ${{ inputs.build-number }} > VERSION.txt
|
||||
echo ${{ inputs.build-number }} > VERSION_ANDROID.txt
|
||||
echo ${{ inputs.build-number }} > VERSION_IOS.txt
|
||||
echo ${{ inputs.build-number }} > VERSION_LINUX.txt
|
||||
echo ${{ inputs.build-number }} > VERSION_MACOS.txt
|
||||
echo ${{ inputs.build-number }} > VERSION_WEB.txt
|
||||
echo ${{ inputs.build-number }} > VERSION_WINDOWS.txt
|
||||
|
||||
- name: Upload to S3 Bucket (Build Title)
|
||||
uses: jakejarvis/s3-sync-action@v0.5.1
|
||||
with:
|
||||
args: --acl public-read --follow-symlinks
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.S3_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }}
|
||||
AWS_S3_BUCKET: ${{ secrets.S3_BUCKET }}
|
||||
AWS_S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }}
|
||||
AWS_REGION: ${{ secrets.S3_REGION }}
|
||||
SOURCE_DIR: ${{ github.workspace }}/output
|
||||
DEST_DIR: ${{ inputs.build-title }}
|
||||
|
||||
- name: Upload to S3 Bucket (Latest)
|
||||
uses: jakejarvis/s3-sync-action@v0.5.1
|
||||
with:
|
||||
args: --acl public-read --follow-symlinks
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.S3_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }}
|
||||
AWS_S3_BUCKET: ${{ secrets.S3_BUCKET }}
|
||||
AWS_S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }}
|
||||
AWS_REGION: ${{ secrets.S3_REGION }}
|
||||
SOURCE_DIR: ${{ github.workspace }}/output
|
||||
DEST_DIR: latest/${{ inputs.build-flavor }}
|
||||
81
.github/workflows/publish_web.yml
vendored
81
.github/workflows/publish_web.yml
vendored
@@ -1,81 +0,0 @@
|
||||
name: Publish Web (Docker)
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
build-flavor:
|
||||
required: true
|
||||
type: string
|
||||
build-title:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
secrets:
|
||||
NETLIFY_AUTH_TOKEN:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
name: Docker
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
|
||||
with:
|
||||
channel: docker
|
||||
ghcr-actor: ${{ github.actor }}
|
||||
ghcr-token: ${{ github.token }}
|
||||
|
||||
- name: Download Docker Image
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: web-docker
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Load Docker Image
|
||||
run: docker load --input ${{ github.workspace}}/output/lunasea-web-docker.tar
|
||||
|
||||
- name: Deploy to GitHub Container Registry
|
||||
run: docker image push --all-tags ghcr.io/jagandeepbrar/lunasea
|
||||
|
||||
netlify:
|
||||
name: Netlify
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
|
||||
with:
|
||||
channel: netlify
|
||||
|
||||
- name: Download Web Package
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: web-hosted
|
||||
path: ${{ github.workspace }}/output
|
||||
|
||||
- name: Determine Release Channel
|
||||
id: channel
|
||||
uses: actions/github-script@v6
|
||||
env:
|
||||
FLAVOR: ${{ inputs.build-flavor }}
|
||||
with:
|
||||
result-encoding: string
|
||||
script: |
|
||||
const ref = process.env.FLAVOR || 'edge';
|
||||
switch (ref) {
|
||||
case 'beta': return '11ef2676-fc31-41b5-897b-fd21273d87ed';
|
||||
case 'candidate': return '4636e6a1-17ef-45a2-a2b6-3d1c166fd1df';
|
||||
case 'stable': return '6634f0b1-323c-4a2f-bd0b-8f1f388673a9';
|
||||
case 'edge':
|
||||
default: return '325e197e-55f4-449a-b2bb-6831fe47bf2a';
|
||||
}
|
||||
|
||||
- name: Deploy to Netlify
|
||||
uses: nwtgck/actions-netlify@v1.2
|
||||
env:
|
||||
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
|
||||
NETLIFY_SITE_ID: ${{ steps.channel.outputs.result }}
|
||||
with:
|
||||
publish-dir: ${{ github.workspace}}/output
|
||||
production-deploy: true
|
||||
deploy-message: ${{ inputs.build-title }}
|
||||
191
.github/workflows/release.yml
vendored
191
.github/workflows/release.yml
vendored
@@ -1,191 +0,0 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
flavor:
|
||||
description: Build Flavor
|
||||
required: true
|
||||
default: edge
|
||||
type: choice
|
||||
options:
|
||||
- edge
|
||||
- beta
|
||||
- candidate
|
||||
- stable
|
||||
|
||||
jobs:
|
||||
prepare:
|
||||
name: Prepare
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/prepare.yml@master
|
||||
with:
|
||||
flavor: ${{ inputs.flavor }}
|
||||
secrets:
|
||||
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
|
||||
|
||||
build-android:
|
||||
name: Build Android
|
||||
needs: [ prepare ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/build_android.yml@master
|
||||
with:
|
||||
build-number: ${{ needs.prepare.outputs.build-number }}
|
||||
secrets:
|
||||
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
|
||||
KEY_JKS: ${{ secrets.KEY_JKS }}
|
||||
KEY_PROPERTIES: ${{ secrets.KEY_PROPERTIES }}
|
||||
|
||||
build-ios:
|
||||
name: Build iOS
|
||||
needs: [ prepare ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/build_ios.yml@master
|
||||
with:
|
||||
build-number: ${{ needs.prepare.outputs.build-number }}
|
||||
secrets:
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_ITC_TEAM_ID: ${{ secrets.APPLE_ITC_TEAM_ID }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
|
||||
IOS_CODESIGNING_IDENTITY: ${{ secrets.IOS_CODESIGNING_IDENTITY }}
|
||||
MATCH_KEYCHAIN_NAME: ${{ secrets.MATCH_KEYCHAIN_NAME }}
|
||||
MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }}
|
||||
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
|
||||
MATCH_SSH_PRIVATE_KEY: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
|
||||
|
||||
build-linux:
|
||||
name: Build Linux
|
||||
needs: [ prepare ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/build_linux.yml@master
|
||||
|
||||
build-macos:
|
||||
name: Build macOS
|
||||
needs: [ prepare ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/build_macos.yml@master
|
||||
with:
|
||||
build-number: ${{ needs.prepare.outputs.build-number }}
|
||||
build-version: ${{ needs.prepare.outputs.build-version }}
|
||||
secrets:
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_ITC_TEAM_ID: ${{ secrets.APPLE_ITC_TEAM_ID }}
|
||||
APPLE_STORE_CONNECT_ISSUER_ID: ${{ secrets.APPLE_STORE_CONNECT_ISSUER_ID }}
|
||||
APPLE_STORE_CONNECT_KEY: ${{ secrets.APPLE_STORE_CONNECT_KEY }}
|
||||
APPLE_STORE_CONNECT_KEY_ID: ${{ secrets.APPLE_STORE_CONNECT_KEY_ID }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
|
||||
MACOS_INSTALLER_CERT_APP_STORE: ${{ secrets.MACOS_INSTALLER_CERT_APP_STORE }}
|
||||
MACOS_INSTALLER_CERT_DIRECT: ${{ secrets.MACOS_INSTALLER_CERT_DIRECT }}
|
||||
MATCH_KEYCHAIN_NAME: ${{ secrets.MATCH_KEYCHAIN_NAME }}
|
||||
MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }}
|
||||
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
|
||||
MATCH_SSH_PRIVATE_KEY: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
|
||||
|
||||
build-web:
|
||||
name: Build Web
|
||||
needs: [ prepare ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/build_web.yml@master
|
||||
with:
|
||||
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
|
||||
build-title: ${{ needs.prepare.outputs.build-title }}
|
||||
secrets:
|
||||
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
|
||||
|
||||
build-windows:
|
||||
name: Build Windows
|
||||
needs: [ prepare ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/build_windows.yml@master
|
||||
secrets:
|
||||
CODE_SIGNING_CERTIFICATE: ${{ secrets.CODE_SIGNING_CERTIFICATE }}
|
||||
CODE_SIGNING_PASSWORD: ${{ secrets.CODE_SIGNING_PASSWORD }}
|
||||
CODE_SIGNING_PUBLISHER: ${{ secrets.CODE_SIGNING_PUBLISHER }}
|
||||
CODE_SIGNING_PUBLISHER_NAME: ${{ secrets.CODE_SIGNING_PUBLISHER_NAME }}
|
||||
|
||||
publish-android:
|
||||
name: Publish Android
|
||||
needs: [ prepare, build-android ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/publish_android.yml@master
|
||||
with:
|
||||
build-changelog: ${{ needs.prepare.outputs.build-changelog }}
|
||||
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
|
||||
build-title: ${{ needs.prepare.outputs.build-title }}
|
||||
secrets:
|
||||
GOOGLE_PLAY_API: ${{ secrets.GOOGLE_PLAY_API }}
|
||||
|
||||
publish-ios:
|
||||
name: Publish iOS
|
||||
needs: [ prepare, build-ios ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/publish_ios.yml@master
|
||||
with:
|
||||
build-changelog: ${{ needs.prepare.outputs.build-changelog }}
|
||||
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
|
||||
secrets:
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_ITC_TEAM_ID: ${{ secrets.APPLE_ITC_TEAM_ID }}
|
||||
APPLE_STORE_CONNECT_ISSUER_ID: ${{ secrets.APPLE_STORE_CONNECT_ISSUER_ID }}
|
||||
APPLE_STORE_CONNECT_KEY: ${{ secrets.APPLE_STORE_CONNECT_KEY }}
|
||||
APPLE_STORE_CONNECT_KEY_ID: ${{ secrets.APPLE_STORE_CONNECT_KEY_ID }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
|
||||
publish-linux:
|
||||
name: Publish Linux
|
||||
needs: [ prepare, build-linux ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/publish_linux.yml@master
|
||||
with:
|
||||
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
|
||||
secrets:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}
|
||||
|
||||
publish-macos:
|
||||
name: Publish macOS
|
||||
needs: [ prepare, build-macos ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/publish_macos.yml@master
|
||||
with:
|
||||
build-changelog: ${{ needs.prepare.outputs.build-changelog }}
|
||||
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
|
||||
secrets:
|
||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||
APPLE_ITC_TEAM_ID: ${{ secrets.APPLE_ITC_TEAM_ID }}
|
||||
APPLE_STORE_CONNECT_ISSUER_ID: ${{ secrets.APPLE_STORE_CONNECT_ISSUER_ID }}
|
||||
APPLE_STORE_CONNECT_KEY: ${{ secrets.APPLE_STORE_CONNECT_KEY }}
|
||||
APPLE_STORE_CONNECT_KEY_ID: ${{ secrets.APPLE_STORE_CONNECT_KEY_ID }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
|
||||
publish-web:
|
||||
name: Publish Web
|
||||
needs: [ prepare, build-web ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/publish_web.yml@master
|
||||
with:
|
||||
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
|
||||
build-title: ${{ needs.prepare.outputs.build-title }}
|
||||
secrets:
|
||||
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
|
||||
|
||||
publish-s3:
|
||||
name: Publish S3
|
||||
needs: [ prepare, build-android, build-ios, build-linux, build-macos, build-web, build-windows ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/publish_s3.yml@master
|
||||
with:
|
||||
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
|
||||
build-number: ${{ needs.prepare.outputs.build-number }}
|
||||
build-title: ${{ needs.prepare.outputs.build-title }}
|
||||
secrets:
|
||||
S3_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }}
|
||||
S3_BUCKET: ${{ secrets.S3_BUCKET }}
|
||||
S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }}
|
||||
S3_KEY_ID: ${{ secrets.S3_KEY_ID }}
|
||||
S3_REGION: ${{ secrets.S3_REGION }}
|
||||
|
||||
notify:
|
||||
name: Notify
|
||||
needs: [ prepare, publish-android, publish-ios, publish-linux, publish-macos, publish-web, publish-s3 ]
|
||||
uses: JagandeepBrar/LunaSea/.github/workflows/notify.yml@master
|
||||
with:
|
||||
build-changelog: ${{ needs.prepare.outputs.build-changelog }}
|
||||
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
|
||||
build-title: ${{ needs.prepare.outputs.build-title }}
|
||||
secrets:
|
||||
DISCORD_WEBHOOK_EDGE: ${{ secrets.DISCORD_WEBHOOK_EDGE }}
|
||||
DISCORD_WEBHOOK_BETA: ${{ secrets.DISCORD_WEBHOOK_BETA }}
|
||||
DISCORD_WEBHOOK_CANDIDATE: ${{ secrets.DISCORD_WEBHOOK_CANDIDATE }}
|
||||
DISCORD_WEBHOOK_STABLE: ${{ secrets.DISCORD_WEBHOOK_STABLE }}
|
||||
27
.github/workflows/validate.yml
vendored
27
.github/workflows/validate.yml
vendored
@@ -1,27 +0,0 @@
|
||||
name: Validate
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
secrets:
|
||||
FIREBASE_TOKEN:
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Environment
|
||||
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
|
||||
with:
|
||||
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
|
||||
platform: test
|
||||
|
||||
- name: Analyze Release
|
||||
uses: invertase/github-action-dart-analyzer@v1
|
||||
with:
|
||||
fatal-infos: false
|
||||
fatal-warnings: true
|
||||
|
||||
- name: Test Release
|
||||
run: flutter test
|
||||
82
.gitignore
vendored
82
.gitignore
vendored
@@ -1,83 +1 @@
|
||||
# Miscellaneous
|
||||
*.class
|
||||
*.log
|
||||
*.pyc
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
|
||||
# IntelliJ related
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/
|
||||
|
||||
# The .vscode folder contains launch configuration and tasks you configure in
|
||||
# VS Code which you may wish to be included in version control, so this line
|
||||
# is commented out by default.
|
||||
#.vscode/
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
**/doc/api/
|
||||
.dart_tool/
|
||||
.flutter-plugins
|
||||
.flutter-plugins-dependencies
|
||||
.packages
|
||||
.pub-cache/
|
||||
.pub/
|
||||
/build/
|
||||
*.g.dart
|
||||
|
||||
# Web related
|
||||
lib/generated_plugin_registrant.dart
|
||||
|
||||
# Exceptions to above rules.
|
||||
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||
ios/Flutter/.last_build_id
|
||||
|
||||
# LunaSea
|
||||
output/
|
||||
*.packages
|
||||
coverage/
|
||||
lib/system/environment.dart
|
||||
|
||||
# XCode Build Artifacts
|
||||
ios/build/
|
||||
ios/Runner.app.dSYM.zip
|
||||
macos/LunaSea.app
|
||||
macos/LunaSea.app.dSYM.zip
|
||||
macos/LunaSea.app.zip
|
||||
|
||||
# Fastlane
|
||||
/android/fastlane/report.xml
|
||||
/ios/fastlane/report.xml
|
||||
/macos/fastlane/report.xml
|
||||
/android/fastlane/Preview.html
|
||||
/ios/fastlane/Preview.html
|
||||
/macos/fastlane/Preview.html
|
||||
|
||||
# Keys & Service Accounts
|
||||
keys/
|
||||
android/key.jks
|
||||
android/key.properties
|
||||
|
||||
# Firebase
|
||||
android/firebase_app_id_file.json
|
||||
ios/firebase_app_id_file.json
|
||||
macos/firebase_app_id_file.json
|
||||
|
||||
# Node Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Artifacts
|
||||
output/
|
||||
*.apk
|
||||
*.aab
|
||||
*.ipa
|
||||
*.dmg
|
||||
*.pkg
|
||||
*.snap
|
||||
|
||||
10
.metadata
10
.metadata
@@ -1,10 +0,0 @@
|
||||
# This file tracks properties of this Flutter project.
|
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||
#
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: 7e9793dee1b85a243edd0e06cb1658e98b077561
|
||||
channel: stable
|
||||
|
||||
project_type: app
|
||||
@@ -1 +0,0 @@
|
||||
2.6.8
|
||||
72
.vscode/cspell.json
vendored
72
.vscode/cspell.json
vendored
@@ -1,72 +0,0 @@
|
||||
{
|
||||
"ignorePaths": [
|
||||
"*.lock",
|
||||
"*.yaml",
|
||||
"*.yml",
|
||||
/** Directories */
|
||||
".dart_tool",
|
||||
".git",
|
||||
"build",
|
||||
"shaders",
|
||||
/** Files */
|
||||
".all-contributorsrc",
|
||||
".commitlintrc",
|
||||
".czrc",
|
||||
".packages"
|
||||
],
|
||||
"useGitignore": true,
|
||||
"words": [
|
||||
"AMOLED",
|
||||
"appbundle",
|
||||
"autofocused",
|
||||
"blackbox",
|
||||
"CanvasKit",
|
||||
"cocoapods",
|
||||
"codecov",
|
||||
"colours",
|
||||
"deinitialize",
|
||||
"deintegrate",
|
||||
"Discogs",
|
||||
"emdash",
|
||||
"encrypter",
|
||||
"fanart",
|
||||
"fastlane",
|
||||
"Firestore",
|
||||
"Fluro",
|
||||
"Gitbook",
|
||||
"hardlink",
|
||||
"Hellonext",
|
||||
"IMDb",
|
||||
"keychain",
|
||||
"leechers",
|
||||
"Letterboxd",
|
||||
"Lidarr",
|
||||
"LunaBox",
|
||||
"LunaConfig",
|
||||
"lunasea",
|
||||
"LunaTable",
|
||||
"msix",
|
||||
"Newznab",
|
||||
"NZBGet",
|
||||
"Overseerr",
|
||||
"Plex",
|
||||
"podfile",
|
||||
"prefill",
|
||||
"Radarr",
|
||||
"Riverpod",
|
||||
"SABnzbd",
|
||||
"scrollview",
|
||||
"sksl",
|
||||
"snapcraft",
|
||||
"Sonarr",
|
||||
"stickied",
|
||||
"subheaders",
|
||||
"Tautulli",
|
||||
"TestFlight",
|
||||
"Trakt",
|
||||
"unencrypted",
|
||||
"unignore",
|
||||
"Weblate",
|
||||
"worktree"
|
||||
]
|
||||
}
|
||||
161
CHANGELOG.md
161
CHANGELOG.md
@@ -1,161 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
### [10.1.1](https://github.com/JagandeepBrar/LunaSea/compare/v10.1.0...v10.1.1) (2022-08-21)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **changelog:** do not show changelog on first boot of new installs ([52fd7fc](https://github.com/JagandeepBrar/LunaSea/commit/52fd7fca0c5076b4b98458d449a4b1f581726a52))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **config:** log restoration error after resetting the database to default ([b02fe81](https://github.com/JagandeepBrar/LunaSea/commit/b02fe81df697066be6172a7d423768490639593e))
|
||||
* **indexer:** remove LunaIndexerIcon from model definition ([cf3d9bb](https://github.com/JagandeepBrar/LunaSea/commit/cf3d9bbc17cd67f0c5e8be22b9450563046a2127))
|
||||
|
||||
## [10.1.0](https://github.com/JagandeepBrar/LunaSea/compare/v10.0.3...v10.1.0) (2022-08-21)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **calendar:** show current month in header ([925f163](https://github.com/JagandeepBrar/LunaSea/commit/925f163e1534aeb45e5b22e8254eaf391eabd79f))
|
||||
* **changelog:** prepare and show changelog on pre-release builds ([df65f53](https://github.com/JagandeepBrar/LunaSea/commit/df65f53a4b00d11abc998f681274d22d94254f14))
|
||||
* **locale:** support Vietnamese (vi) ([8b57450](https://github.com/JagandeepBrar/LunaSea/commit/8b5745044e3af64a6c9bc593a9877400ac8a2dc2))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **android:** correctly handle back-button to open drawer on applicable routes ([c91ba2c](https://github.com/JagandeepBrar/LunaSea/commit/c91ba2ce8134fdc796d0431ba1c9134908fddd91))
|
||||
* **changelog:** group changelog item rows by key feature change ([2ababbd](https://github.com/JagandeepBrar/LunaSea/commit/2ababbd1b32abd153fa73fcdfe292c7791edbf52))
|
||||
* **ci:** utilize latest standard for Snapcraft login ([aff6e2c](https://github.com/JagandeepBrar/LunaSea/commit/aff6e2ca184e9539f28dd326c06478ca2dbfee4c))
|
||||
* **database:** correctly store manually ordered module list ([8fe81d1](https://github.com/JagandeepBrar/LunaSea/commit/8fe81d11ab5c5aa484f0c2b471932d5364e6209c))
|
||||
* **database:** detect and recover from database corruption ([758756f](https://github.com/JagandeepBrar/LunaSea/commit/758756fcf2456996c7ee02be2bd523cca91c45d3))
|
||||
* **database:** fallback to defaults on null values in profile ([fb3e8e5](https://github.com/JagandeepBrar/LunaSea/commit/fb3e8e53255c457d0922505ad6c2d91f5c0fcf03))
|
||||
* **database:** safely type indexer fields and headers ([f1dcd0c](https://github.com/JagandeepBrar/LunaSea/commit/f1dcd0c36d558882bfbc7f4465ed56fac0743c55))
|
||||
* **database:** utilize stricter typing for module headers map ([d4d9816](https://github.com/JagandeepBrar/LunaSea/commit/d4d9816c945b1930ecfda0382d809a7c67839a26))
|
||||
* **database:** validate enabled profile exists on restore ([d8506ee](https://github.com/JagandeepBrar/LunaSea/commit/d8506ee2834ca6a83394c11f6d4d329f03a3647f))
|
||||
* display 0-length timestamps as "0 Minutes" instead of "Under a Minute" ([e05b17a](https://github.com/JagandeepBrar/LunaSea/commit/e05b17ae5ed35cec85ade5b910b82869cb7ad3f2))
|
||||
* **lidarr:** (history) sort list by date descending ([ad22820](https://github.com/JagandeepBrar/LunaSea/commit/ad22820d6662371d3d2bc7fbf596f86619002d20))
|
||||
* **lists:** reorderable lists could not be reordered on some platforms ([95a645c](https://github.com/JagandeepBrar/LunaSea/commit/95a645c06cf2a76231c4b8dbea87ec593961c205))
|
||||
* **locale:** create stub primary language localization assets ([18ef4cf](https://github.com/JagandeepBrar/LunaSea/commit/18ef4cf1d4032a3f9db54b5da56158ffaf9b50c8))
|
||||
* **overseerr:** issues/requests list view translation keys ([136b92b](https://github.com/JagandeepBrar/LunaSea/commit/136b92b8a7bdd5cd0ec2322444443d054df6daed))
|
||||
* **radarr:** (queue) allow loading queue list when associated movie is not found ([22bf728](https://github.com/JagandeepBrar/LunaSea/commit/22bf728a3dab6b7d76c7674cb4d97dc73e849201))
|
||||
* **sonarr:** fanart image requests not including headers ([b5bb300](https://github.com/JagandeepBrar/LunaSea/commit/b5bb300046431d8c1c26fd8ac4a26c42444f4f53))
|
||||
* **sonarr:** invalid linking to theTVDB content ([80678a7](https://github.com/JagandeepBrar/LunaSea/commit/80678a75bb871a4835d1c73934e043564d80b6b0))
|
||||
|
||||
|
||||
### Tweaks
|
||||
|
||||
* **changelog:** do not show documentation changes in in-app changelog ([2367050](https://github.com/JagandeepBrar/LunaSea/commit/2367050a66f2929d1ead17cc9191f47ddcb07f3a))
|
||||
* **core:** destructure core folder and reintegrate extensions ([5d52440](https://github.com/JagandeepBrar/LunaSea/commit/5d52440a43e4b605a8ac95bcb02b909f489ef7e2))
|
||||
* **database:** rewrite interface to key-value database ([a0eaca0](https://github.com/JagandeepBrar/LunaSea/commit/a0eaca084a399a2e249b142cb720cc50739a3f51))
|
||||
* **environment:** load environment using environment_config ([c4dd509](https://github.com/JagandeepBrar/LunaSea/commit/c4dd509e3210847c0ddba4c7982f38099228a2d6))
|
||||
* refactored in-app purchase interface ([9cb3fab](https://github.com/JagandeepBrar/LunaSea/commit/9cb3fabdf1f5fa10d65770a181ced937413642a2))
|
||||
* utilize statics and class functions for LunaModule enum ([9f3c3f7](https://github.com/JagandeepBrar/LunaSea/commit/9f3c3f779dda1b2da007abe5c2079dcfa834eb99))
|
||||
|
||||
### [10.0.3](https://github.com/JagandeepBrar/LunaSea/compare/v10.0.2...v10.0.3) (2022-05-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **-arr:** updated UI for viewing content links ([8b559e0](https://github.com/JagandeepBrar/LunaSea/commit/8b559e00b01305af6d1f8139a75aa25391127626))
|
||||
* **ci:** build web docker images ([73fbb10](https://github.com/JagandeepBrar/LunaSea/commit/73fbb1076ec8e951d99ad2df28a28454ca8189a1))
|
||||
* **notifications:** option to disable in-app notifications ([da0c44c](https://github.com/JagandeepBrar/LunaSea/commit/da0c44c8b1bc846acc4a1d0a4b7f1ee7c4c2e44d))
|
||||
* **settings:** ability to check for updates ([b3caf34](https://github.com/JagandeepBrar/LunaSea/commit/b3caf34074ecc72257b26d091a332e8f54a47587))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* correctly calculate age of releases in -arrs ([e35433a](https://github.com/JagandeepBrar/LunaSea/commit/e35433af314b13ff3c951eef4c99f42e460f2b28))
|
||||
* **ui:** enable interactivity on all scrollbars on all platforms ([174fa96](https://github.com/JagandeepBrar/LunaSea/commit/174fa969517b00e611534defc12ca3768348623a))
|
||||
|
||||
### [10.0.2](https://github.com/JagandeepBrar/LunaSea/compare/v10.0.1...v10.0.2) (2022-04-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **account:** ability to update account email and password ([5ea6269](https://github.com/JagandeepBrar/LunaSea/commit/5ea6269bca9cc21f9a3ec34ff9840ea22384b717))
|
||||
* **firebase:** allow building LunaSea without setting up Firebase [skip ci] ([d7431b1](https://github.com/JagandeepBrar/LunaSea/commit/d7431b110217ff868e662be4a34af656ca1d6515))
|
||||
* **firebase:** conditionally load Firebase depending on the platform ([91f556d](https://github.com/JagandeepBrar/LunaSea/commit/91f556d07833c9be6a4d176d663e7889361b8ec2))
|
||||
* **linux:** initial linux support ([12fab1d](https://github.com/JagandeepBrar/LunaSea/commit/12fab1d6c22104cbf18ff695b1c636cc48236126))
|
||||
* **resources:** add link to build bucket [skip ci] ([64db574](https://github.com/JagandeepBrar/LunaSea/commit/64db574155182942dabbaffba5dbf43e0cca950c))
|
||||
* **resources:** add link to information about build channels ([fb31aba](https://github.com/JagandeepBrar/LunaSea/commit/fb31aba7f9b2678736f2d9abacdbf244edd1048a))
|
||||
* **ui:** ability to set background color on LunaBlock tiles [skip ci] ([e108cfb](https://github.com/JagandeepBrar/LunaSea/commit/e108cfbac5f5bb2a1cd7404af0a331fadba85612))
|
||||
* **windows:** initial windows support ([313e05c](https://github.com/JagandeepBrar/LunaSea/commit/313e05c8f519ca0c17efbec3d0587418e712cb81))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **charts:** rollback to fl_charts@0.46.0 ([cc81ee7](https://github.com/JagandeepBrar/LunaSea/commit/cc81ee7f14adc49b84556224dfef54c735c54758))
|
||||
* **database:** write to LunaSea parent folder on Linux and Windows ([6e89796](https://github.com/JagandeepBrar/LunaSea/commit/6e89796a15622f82759a6f8f02a82b1494ea1f8d))
|
||||
* **desktop:** prevent flickering by waiting for window settings to apply ([5a2a9b7](https://github.com/JagandeepBrar/LunaSea/commit/5a2a9b780b94d27aa2005823e1a18e225970967f))
|
||||
* **desktop:** set initial and minimum window sizes ([dd30c3a](https://github.com/JagandeepBrar/LunaSea/commit/dd30c3a0a32201a6503c81685dfdbc928a4aee90))
|
||||
|
||||
|
||||
### Tweaks
|
||||
|
||||
* **flavor:** rename build flavors [skip ci] ([26cc258](https://github.com/JagandeepBrar/LunaSea/commit/26cc2585b28f17342caf034ef9ef76dad06eb474))
|
||||
* **settings:** do not show version code [skip ci] ([ac807a8](https://github.com/JagandeepBrar/LunaSea/commit/ac807a8a01993939b86baad2dcb11e7d2a73e509))
|
||||
* **ui:** remove usages of tab indentations [skip ci] ([d9e7009](https://github.com/JagandeepBrar/LunaSea/commit/d9e70090007b402d2596e09195da5324ac1aafd0))
|
||||
|
||||
### [10.0.1](https://github.com/JagandeepBrar/LunaSea/compare/v10.0.0...v10.0.1) (2022-03-25)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **config:** support retrying entering encryption password on failure ([cd9a3d2](https://github.com/JagandeepBrar/LunaSea/commit/cd9a3d295e87b7d8987e508e6c77b02c1c5290f8))
|
||||
* **filesystem:** rewrite filesystem interface for better compatibility ([4c60df5](https://github.com/JagandeepBrar/LunaSea/commit/4c60df5523b98da3a7f135bb26fa20b36ed653e9))
|
||||
* **ios:** enable landscape support on iOS devices ([f8e6760](https://github.com/JagandeepBrar/LunaSea/commit/f8e676015c26f1e33f8680043663ea4f25dbc872))
|
||||
* **web:** initial web support ([91e1fa0](https://github.com/JagandeepBrar/LunaSea/commit/91e1fa03d9fae7cf82d158f00587075b29c610ea))
|
||||
* **window_manager:** rewrite window manager to be platform-safe ([d6aed6c](https://github.com/JagandeepBrar/LunaSea/commit/d6aed6c707ad75c0a02c3a4fa496ee6d8adeb55e))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **android:** prevent multiple splash screens from appearing on Android 12 ([26523e5](https://github.com/JagandeepBrar/LunaSea/commit/26523e58ed12c8789c5c2c0df8d9f6e75e719f11))
|
||||
* **web:** set notification vapid key ([1ddcc27](https://github.com/JagandeepBrar/LunaSea/commit/1ddcc279dd6adf629a2f99939a567481e3675bd2))
|
||||
|
||||
|
||||
### Tweaks
|
||||
|
||||
* **images:** guard and fallback image cache implementation ([601d82c](https://github.com/JagandeepBrar/LunaSea/commit/601d82cf89a22890d4197d10e1b74dbe110b0755))
|
||||
* **platform:** guard usages of dart:io and dart:html for future compatibility ([c7bd62d](https://github.com/JagandeepBrar/LunaSea/commit/c7bd62de2ee5669b41e6ccbc5e706ecb237cbcac))
|
||||
* **wake_on_lan:** refactor wake on LAN support, support loading API with dart:html ([403edc1](https://github.com/JagandeepBrar/LunaSea/commit/403edc16fb8188bba9bb6dd5b60a128dc8c2b0d4))
|
||||
|
||||
## [10.0.0](https://github.com/JagandeepBrar/LunaSea/tree/v10.0.0) (2022-03-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **debug:** debug page for multiple UI elements ([80c5d21](https://github.com/JagandeepBrar/LunaSea/commit/80c5d2118a68129690cde5acbf70a23746d30acf))
|
||||
* **http:** set User-Agent to "LunaSea/{version} {build}" ([420d11c](https://github.com/JagandeepBrar/LunaSea/commit/420d11c37188fe1d56d76b51b98325b384a45cff))
|
||||
* **overseerr:** integrate request list and request tiles ([b7fc3c0](https://github.com/JagandeepBrar/LunaSea/commit/b7fc3c0a0fe917ca13513be74159af022c956465))
|
||||
* **overseerr:** issues (de)serialization & list integration ([db4dfda](https://github.com/JagandeepBrar/LunaSea/commit/db4dfdaf9ca1976d1a6e4b0ebc451b2e0f08b19e))
|
||||
* **overseerr:** serialized movie & tv objects ([2b778dc](https://github.com/JagandeepBrar/LunaSea/commit/2b778dc437559549df7404fa5266719979c3cce3))
|
||||
* **settings:** add test build information to resources ([be2d3e6](https://github.com/JagandeepBrar/LunaSea/commit/be2d3e63c27dc8eb5f2f01740df02d23b75eec8e))
|
||||
* **sonarr:** support for searching entire series for monitored episodes [skip ci] ([ba958b5](https://github.com/JagandeepBrar/LunaSea/commit/ba958b59a6445d422ae1ea9533f9a6ada188962b))
|
||||
* **ui:** support skeleton-state loading on LunaBlock ([8ab5f80](https://github.com/JagandeepBrar/LunaSea/commit/8ab5f80d004ead52a40a69f33482f371fe0f8c8b))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **desktop:** handle pull-to-refresh drag action ([d38fc77](https://github.com/JagandeepBrar/LunaSea/commit/d38fc770d2de4c2e2471aa4b61f8c4eb231ee134))
|
||||
* **firebase:** remove remaining references to crashlytics and analytics [skip ci] ([67afaa0](https://github.com/JagandeepBrar/LunaSea/commit/67afaa05f22163b95faff7be526c7a7ddbd5ac5e))
|
||||
* **overseerr:** rehydrate missing cached media content when required after cache ejection ([b09353b](https://github.com/JagandeepBrar/LunaSea/commit/b09353ba6e35992ce90613a198f7eb39759522a1))
|
||||
* **radarr:** localized strings and correctly display disk/root folder tiles ([490ecf6](https://github.com/JagandeepBrar/LunaSea/commit/490ecf60d1d2267a1e2a6677db8e58c0dea9e096))
|
||||
* **radarr:** match file details to web GUI ([a42aa41](https://github.com/JagandeepBrar/LunaSea/commit/a42aa4109ecde42dd2226ee13d398ca09c66a4b3))
|
||||
* **radarr:** prevent using preDB availability when adding movie ([9d71c1a](https://github.com/JagandeepBrar/LunaSea/commit/9d71c1ac9ae5505692c24c425be2ce22ae292a25))
|
||||
* **tautulli:** set graph padding to theme-default padding ([1229e5e](https://github.com/JagandeepBrar/LunaSea/commit/1229e5ee5ba1534d3e694fb85657b79b7dfcbf78))
|
||||
|
||||
|
||||
### Tweaks
|
||||
|
||||
* **flavor:** rename "internal" to "develop" ([5652cb0](https://github.com/JagandeepBrar/LunaSea/commit/5652cb04bc7a23292d0ea9d65d6e919218975905))
|
||||
* **modules:** remove canonical module import file [skip ci] ([0cbd61e](https://github.com/JagandeepBrar/LunaSea/commit/0cbd61eac5c8e8675b3dd5702977c99e06ca81d5))
|
||||
* **overseerr:** utilize JsonEnum generators in enum types [skip ci] ([76d530e](https://github.com/JagandeepBrar/LunaSea/commit/76d530ed0810724d9b61bb73b689d6afb23d4ebd))
|
||||
|
||||
---
|
||||
|
||||
Previous version changelogs are no longer available.
|
||||
@@ -1,4 +0,0 @@
|
||||
Welcome to the LunaSea community.
|
||||
|
||||
Settle differences by offering and accepting constructive critique, within desired privacy.
|
||||
Finding yourselves unable, e-mail the project maintainer at hello@lunasea.app.
|
||||
@@ -1,67 +0,0 @@
|
||||
# Contributors
|
||||
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||
[](#contributors-)
|
||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
Thank you to everyone who has helped contribute to LunaSea, from development to localization efforts!
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center"><a href="https://www.jagandeepbrar.io"><img src="https://avatars.githubusercontent.com/u/3048295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jagandeep Brar</b></sub></a><br /><a href="https://github.com/JagandeepBrar/LunaSea/commits?author=JagandeepBrar" title="Code">💻</a> <a href="#design-JagandeepBrar" title="Design">🎨</a> <a href="#ideas-JagandeepBrar" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||
<td align="center"><a href="https://github.com/lightglitch"><img src="https://avatars.githubusercontent.com/u/196953?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mário Franco</b></sub></a><br /><a href="https://github.com/JagandeepBrar/LunaSea/commits?author=lightglitch" title="Code">💻</a> <a href="#translation-lightglitch" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Qstick"><img src="https://avatars.githubusercontent.com/u/376117?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Qstick</b></sub></a><br /><a href="https://github.com/JagandeepBrar/LunaSea/commits?author=Qstick" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/AliMickey"><img src="https://avatars.githubusercontent.com/u/60691199?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Micky</b></sub></a><br /><a href="https://github.com/JagandeepBrar/LunaSea/commits?author=AliMickey" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="http://www.xrths.fr"><img src="https://avatars.githubusercontent.com/u/40337934?v=4?s=100" width="100px;" alt=""/><br /><sub><b>xrths</b></sub></a><br /><a href="https://github.com/JagandeepBrar/LunaSea/commits?author=xrths" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://pythonexplainedto.me/"><img src="https://avatars.githubusercontent.com/u/41962737?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Patrik Hauguth</b></sub></a><br /><a href="#translation-Phaugt" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://liberapay.com/kingu/"><img src="https://avatars.githubusercontent.com/u/13802408?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Allan Nordhøy</b></sub></a><br /><a href="#translation-comradekingu" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/cpt-kuesel"><img src="https://avatars.githubusercontent.com/u/79487102?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cpt-kuesel</b></sub></a><br /><a href="#translation-cpt-kuesel" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/KovalevArtem"><img src="https://avatars.githubusercontent.com/u/36500228?v=4?s=100" width="100px;" alt=""/><br /><sub><b>KovalevArtem</b></sub></a><br /><a href="#translation-KovalevArtem" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/iFelix18"><img src="https://avatars.githubusercontent.com/u/19800006?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Davide</b></sub></a><br /><a href="#translation-iFelix18" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://ersen.srht.site/"><img src="https://avatars.githubusercontent.com/u/88676873?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Oğuz Ersen</b></sub></a><br /><a href="#translation-ersen0" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/bittin"><img src="https://avatars.githubusercontent.com/u/43197?v=4?s=100" width="100px;" alt=""/><br /><sub><b>bittin</b></sub></a><br /><a href="#translation-bittin" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/almontegil"><img src="https://avatars.githubusercontent.com/u/68232356?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gil</b></sub></a><br /><a href="#translation-almontegil" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/TheSander562"><img src="https://avatars.githubusercontent.com/u/14059770?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sander Lambrechts</b></sub></a><br /><a href="#translation-TheSander562" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Guilhermerrrr"><img src="https://avatars.githubusercontent.com/u/92966143?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Guilhermerrrr</b></sub></a><br /><a href="#translation-Guilhermerrrr" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Ben-Wallner"><img src="https://avatars.githubusercontent.com/u/24373331?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ben Biber</b></sub></a><br /><a href="#translation-Ben-Wallner" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/Sytom"><img src="https://avatars.githubusercontent.com/u/30535521?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sytom</b></sub></a><br /><a href="#translation-Sytom" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://xxzj990.top"><img src="https://avatars.githubusercontent.com/u/5134154?v=4?s=100" width="100px;" alt=""/><br /><sub><b>xxzj990</b></sub></a><br /><a href="#translation-xxzj990" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://www.openflixr.com"><img src="https://avatars.githubusercontent.com/u/3245077?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mark Frelink</b></sub></a><br /><a href="#translation-mfrelink" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/diemade"><img src="https://avatars.githubusercontent.com/u/174809?v=4?s=100" width="100px;" alt=""/><br /><sub><b>diemade</b></sub></a><br /><a href="#translation-diemade" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://feikojoosten.com"><img src="https://avatars.githubusercontent.com/u/10920052?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Feiko Joosten</b></sub></a><br /><a href="#translation-FeikoJoosten" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/TheMaxul"><img src="https://avatars.githubusercontent.com/u/2436527?v=4?s=100" width="100px;" alt=""/><br /><sub><b>TheMaxul</b></sub></a><br /><a href="#translation-TheMaxul" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://lisacintosh.itch.io"><img src="https://avatars.githubusercontent.com/u/6952213?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maxime Leroy</b></sub></a><br /><a href="#translation-Lisapple" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/vc5"><img src="https://avatars.githubusercontent.com/u/13097192?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Vincent</b></sub></a><br /><a href="#translation-vc5" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/gmcinalli"><img src="https://avatars.githubusercontent.com/u/9024983?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gian Marco Cinalli</b></sub></a><br /><a href="#translation-gmcinalli" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://www.issacc.top/"><img src="https://avatars.githubusercontent.com/u/17275050?v=4?s=100" width="100px;" alt=""/><br /><sub><b>八月的蠢</b></sub></a><br /><a href="#translation-issaccv" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/neoestremi"><img src="https://avatars.githubusercontent.com/u/1340877?v=4?s=100" width="100px;" alt=""/><br /><sub><b>neoestremi</b></sub></a><br /><a href="#translation-neoestremi" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/marcosvdiasofc"><img src="https://avatars.githubusercontent.com/u/96720080?v=4?s=100" width="100px;" alt=""/><br /><sub><b>marcosvdiasofc</b></sub></a><br /><a href="#translation-marcosvdiasofc" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://liberapay.com/FSCorrupt/donate"><img src="https://avatars.githubusercontent.com/u/45659314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>FSCorrupt</b></sub></a><br /><a href="#translation-fscorrupt" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/iHunterX"><img src="https://avatars.githubusercontent.com/u/16854718?v=4?s=100" width="100px;" alt=""/><br /><sub><b>iHunterX</b></sub></a><br /><a href="#translation-iHunterX" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/Brokeos"><img src="https://avatars.githubusercontent.com/u/8388746?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brokeos</b></sub></a><br /><a href="#translation-Brokeos" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/punchy98"><img src="https://avatars.githubusercontent.com/u/12002902?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Maldonado</b></sub></a><br /><a href="#translation-punchy98" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/natiz"><img src="https://avatars.githubusercontent.com/u/3515888?v=4?s=100" width="100px;" alt=""/><br /><sub><b>natiz</b></sub></a><br /><a href="https://github.com/JagandeepBrar/LunaSea/commits?author=natiz" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/KevoM"><img src="https://avatars.githubusercontent.com/u/8274366?v=4?s=100" width="100px;" alt=""/><br /><sub><b>KevoM</b></sub></a><br /><a href="#translation-KevoM" title="Translation">🌍</a></td>
|
||||
<td align="center"><a href="https://github.com/rogeriomendes"><img src="https://avatars.githubusercontent.com/u/1494503?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rogeriomendes</b></sub></a><br /><a href="#translation-rogeriomendes" title="Translation">🌍</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
60
README.md
60
README.md
@@ -1,59 +1,3 @@
|
||||
# <img width="40px" src="./assets/images/branding_logo.png" alt="LunaSea"></img> LunaSea
|
||||
# <img width="40px" src="./lunasea/assets/images/branding_logo.png" alt="LunaSea"></img> LunaSea
|
||||
|
||||
LunaSea is a fully featured, open source self-hosted controller focused on giving you a seamless experience between all of your self-hosted media software remotely on your devices. LunaSea currently supports:
|
||||
|
||||
- [Lidarr](https://github.com/lidarr/lidarr)
|
||||
- [Radarr](https://github.com/radarr/radarr)
|
||||
- [Sonarr](https://github.com/sonarr/sonarr)
|
||||
- [NZBGet](https://github.com/nzbget/nzbget)
|
||||
- [SABnzbd](https://github.com/sabnzbd/sabnzbd)
|
||||
- [Newznab Indexer Searching](https://newznab.readthedocs.io/en/latest/misc/api/)
|
||||
- [NZBHydra2](https://github.com/theotherp/nzbhydra2)
|
||||
- [Tautulli](https://github.com/Tautulli/Tautulli)
|
||||
- [Wake on LAN](https://en.wikipedia.org/wiki/Wake-on-LAN)
|
||||
|
||||
LunaSea even comes with support for webhook-based push notifications, multiple instances of applications using profiles, backup and restore functionality for your configuration, an AMOLED black theme, and more!
|
||||
|
||||
> Please note that LunaSea is purely a remote control application, it does not offer any functionality without software installed on a server/computer.
|
||||
|
||||
## Releases
|
||||
|
||||
All releases for every build channel can be downloaded from the [build bucket](https://builds.lunasea.app), and all stable releases for all platforms are also available on [GitHub](https://github.com/JagandeepBrar/LunaSea/releases).
|
||||
|
||||
- [Android](https://docs.lunasea.app/releases/android)
|
||||
- [iOS](https://docs.lunasea.app/releases/ios)
|
||||
- [Linux](https://docs.lunasea.app/releases/linux)
|
||||
- [macOS](https://docs.lunasea.app/releases/macos)
|
||||
- [Web](https://docs.lunasea.app/releases/web)
|
||||
- [Windows](https://docs.lunasea.app/releases/windows)
|
||||
|
||||
Interested in using prerelease build channels of LunaSea? Learn the differences between all the build channels and how to join one [here](https://www.lunasea.app/build-channels)!
|
||||
|
||||
## Getting Started
|
||||
|
||||
- [Build Guide](https://github.com/JagandeepBrar/LunaSea/wiki/Build-Guide)
|
||||
- [Documentation](https://www.lunasea.app/docs)
|
||||
- [Feedback & Feature Requests Board](https://www.lunasea.app/feedback)
|
||||
- [Frequently Asked Questions](https://docs.lunasea.app/getting-started/frequently-asked-questions)
|
||||
|
||||
## Support
|
||||
|
||||
[](https://www.lunasea.app/discord)
|
||||
[](https://www.lunasea.app/reddit)
|
||||
|
||||
**Please only create an issue on GitHub for bugs and software issues**. Post in the [discussions board](https://github.com/JagandeepBrar/LunaSea/discussions) or the [feedback & feature requests board](https://www.lunasea.app/feedback) for requests and general feedback.
|
||||
|
||||
- [Discord](https://www.lunasea.app/discord)
|
||||
- [Email](mailto:hello@lunasea.app)
|
||||
- [Reddit](https://www.lunasea.app/reddit)
|
||||
- [Website](https://www.lunasea.app)
|
||||
|
||||
## Tools & Services
|
||||
|
||||
[](https://www.lunasea.app/translate)
|
||||
|
||||
Thank you to all tools and services for offering free subscriptions for open-source projects!
|
||||
|
||||
- [docs.page](https://docs.page/): docs.page is used to host LunaSea's documentation
|
||||
- [Hellonext](https://www.hellonext.co): Hellonext is used to host LunaSea's feedback board
|
||||
- [Weblate](https://weblate.org): Weblate is used to gather community localization for LunaSea
|
||||
> This is a mono-repository for archival of the entire LunaSea project.
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "fastlane"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.1 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 6.6 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 9.3 KiB |
@@ -1,31 +0,0 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.5.32'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.1.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.buildDir = '../build'
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
include ':app'
|
||||
|
||||
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
|
||||
|
||||
def plugins = new Properties()
|
||||
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
|
||||
if (pluginsFile.exists()) {
|
||||
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
|
||||
}
|
||||
|
||||
plugins.each { name, path ->
|
||||
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
|
||||
include ":$name"
|
||||
project(":$name").projectDir = pluginDirectory
|
||||
}
|
||||
@@ -1,97 +0,0 @@
|
||||
{
|
||||
"motd": "Welcome to LunaSea v10.1.0!\n\nThis release contains a wide variety of bug fixes including a completely rewritten database interface to detect and be resilient against corruption.",
|
||||
"feat": {
|
||||
"changelog": [
|
||||
{
|
||||
"commit": "df65f53a4b00d11abc998f681274d22d94254f14",
|
||||
"message": "prepare and show changelog on pre-release builds"
|
||||
}
|
||||
],
|
||||
"calendar": [
|
||||
{
|
||||
"commit": "925f163e1534aeb45e5b22e8254eaf391eabd79f",
|
||||
"message": "show current month in header"
|
||||
}
|
||||
]
|
||||
},
|
||||
"fix": {
|
||||
"database": [
|
||||
{
|
||||
"commit": "8fe81d11ab5c5aa484f0c2b471932d5364e6209c",
|
||||
"message": "correctly store manually ordered module list"
|
||||
},
|
||||
{
|
||||
"commit": "758756fcf2456996c7ee02be2bd523cca91c45d3",
|
||||
"message": "detect and recover from database corruption"
|
||||
},
|
||||
{
|
||||
"commit": "fb3e8e53255c457d0922505ad6c2d91f5c0fcf03",
|
||||
"message": "fallback to defaults on null values in profile"
|
||||
},
|
||||
{
|
||||
"commit": "f1dcd0c36d558882bfbc7f4465ed56fac0743c55",
|
||||
"message": "safely type indexer fields and headers"
|
||||
},
|
||||
{
|
||||
"commit": "d4d9816c945b1930ecfda0382d809a7c67839a26",
|
||||
"message": "utilize stricter typing for module headers map"
|
||||
},
|
||||
{
|
||||
"commit": "d8506ee2834ca6a83394c11f6d4d329f03a3647f",
|
||||
"message": "validate enabled profile exists on restore"
|
||||
}
|
||||
],
|
||||
"sonarr": [
|
||||
{
|
||||
"commit": "b5bb300046431d8c1c26fd8ac4a26c42444f4f53",
|
||||
"message": "fanart image requests did not including headers"
|
||||
},
|
||||
{
|
||||
"commit": "80678a75bb871a4835d1c73934e043564d80b6b0",
|
||||
"message": "invalid links to theTVDB content"
|
||||
}
|
||||
],
|
||||
"lidarr": [
|
||||
{
|
||||
"commit": "ad22820d6662371d3d2bc7fbf596f86619002d20",
|
||||
"message": "(history) sort list by date descending"
|
||||
}
|
||||
],
|
||||
"radarr": [
|
||||
{
|
||||
"commit": "22bf728a3dab6b7d76c7674cb4d97dc73e849201",
|
||||
"message": "(queue) allow loading queue list when associated movie is not found"
|
||||
}
|
||||
],
|
||||
"android": [
|
||||
{
|
||||
"commit": "c91ba2ce8134fdc796d0431ba1c9134908fddd91",
|
||||
"message": "correctly handle back-button to open drawer on applicable routes"
|
||||
}
|
||||
],
|
||||
"ui/ux": [
|
||||
{
|
||||
"commit": "95a645c06cf2a76231c4b8dbea87ec593961c205",
|
||||
"message": "(lists) reorderable lists could not be reordered on some platforms"
|
||||
},
|
||||
{
|
||||
"commit": "e05b17ae5ed35cec85ade5b910b82869cb7ad3f2",
|
||||
"message": "(timestamps) display 0-length timestamps as \"0 Minutes\" instead of \"Under a Minute\""
|
||||
}
|
||||
]
|
||||
},
|
||||
"refactor": {
|
||||
"purchases": [
|
||||
{
|
||||
"commit": "9cb3fabdf1f5fa10d65770a181ced937413642a2",
|
||||
"message": "rewrite interface to in-app purchase APIs"
|
||||
}
|
||||
],
|
||||
"database": [
|
||||
{
|
||||
"commit": "a0eaca084a399a2e249b142cb720cc50739a3f51",
|
||||
"message": "rewrite interface to key-value database"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
158
docs.json
158
docs.json
@@ -1,158 +0,0 @@
|
||||
{
|
||||
"name": "LunaSea",
|
||||
"favicon": "/assets/logo.png",
|
||||
"logo": "/assets/logo.png",
|
||||
"logoDark": "/assets/logo.png",
|
||||
"theme": "#4ECCA3",
|
||||
"sidebar": [
|
||||
[
|
||||
"Overview",
|
||||
"/"
|
||||
],
|
||||
[
|
||||
"Getting Started",
|
||||
[
|
||||
[
|
||||
"Build Channels",
|
||||
"/getting-started/build-channels"
|
||||
],
|
||||
[
|
||||
"Donations",
|
||||
"/getting-started/donations"
|
||||
],
|
||||
[
|
||||
"Frequently Asked Questions",
|
||||
"/getting-started/frequently-asked-questions"
|
||||
],
|
||||
[
|
||||
"Platform Restrictions",
|
||||
"/getting-started/platform-restrictions"
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
"LunaSea",
|
||||
[
|
||||
[
|
||||
"Account",
|
||||
"/lunasea/account"
|
||||
],
|
||||
[
|
||||
"Local Backup & Restore",
|
||||
"/lunasea/local-backup-restore"
|
||||
],
|
||||
[
|
||||
"Logs",
|
||||
"/lunasea/logs"
|
||||
],
|
||||
[
|
||||
"Notifications",
|
||||
"/lunasea/notifications"
|
||||
],
|
||||
[
|
||||
"Profiles",
|
||||
"/lunasea/profiles"
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
"Modules",
|
||||
[
|
||||
[
|
||||
"Lidarr",
|
||||
"/modules/lidarr"
|
||||
],
|
||||
[
|
||||
"Newznab Search",
|
||||
"/modules/newznab-search"
|
||||
],
|
||||
[
|
||||
"NZBGet",
|
||||
"/modules/nzbget"
|
||||
],
|
||||
[
|
||||
"Overseerr",
|
||||
"/modules/overseerr"
|
||||
],
|
||||
[
|
||||
"Radarr",
|
||||
"/modules/radarr"
|
||||
],
|
||||
[
|
||||
"SABnzbd",
|
||||
"/modules/sabnzbd"
|
||||
],
|
||||
[
|
||||
"Sonarr",
|
||||
"/modules/sonarr"
|
||||
],
|
||||
[
|
||||
"Tautulli",
|
||||
"/modules/tautulli"
|
||||
],
|
||||
[
|
||||
"Wake on LAN",
|
||||
"/modules/wake-on-lan"
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
"Notifications",
|
||||
[
|
||||
[
|
||||
"Custom",
|
||||
"/notifications/custom"
|
||||
],
|
||||
[
|
||||
"Lidarr",
|
||||
"/notifications/lidarr"
|
||||
],
|
||||
[
|
||||
"Overseerr",
|
||||
"/notifications/overseerr"
|
||||
],
|
||||
[
|
||||
"Radarr",
|
||||
"/notifications/radarr"
|
||||
],
|
||||
[
|
||||
"Sonarr",
|
||||
"/notifications/sonarr"
|
||||
],
|
||||
[
|
||||
"Tautulli",
|
||||
"/notifications/tautulli"
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
"Releases",
|
||||
[
|
||||
[
|
||||
"Android",
|
||||
"/releases/android"
|
||||
],
|
||||
[
|
||||
"iOS",
|
||||
"/releases/ios"
|
||||
],
|
||||
[
|
||||
"Linux",
|
||||
"/releases/linux"
|
||||
],
|
||||
[
|
||||
"macOS",
|
||||
"/releases/macos"
|
||||
],
|
||||
[
|
||||
"Web",
|
||||
"/releases/web"
|
||||
],
|
||||
[
|
||||
"Windows",
|
||||
"/releases/windows"
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 26 KiB |
@@ -1,26 +0,0 @@
|
||||
---
|
||||
title: Donations
|
||||
description: How to donate to the developer of LunaSea
|
||||
---
|
||||
|
||||
# Donations
|
||||
|
||||
Thanks for considering donating to LunaSea! Donations are what keep the project alive and completely free for everyone to use. There are a few options available:
|
||||
|
||||
## In-App Purchases
|
||||
|
||||
If you have downloaded LunaSea through the Play Store or App Store, you can directly donate using in-app purchases! Simply head to the Settings and tap the "Donations" tile. There are four options available (all scaled to USD): $0.99, $2.99, $4.99, and $9.99.
|
||||
|
||||
> If you are using TestFlight builds on iOS devices, you will need to switch to the App Store version to donate. Any in-app purchases executed on a TestFlight build do not actually get processed.
|
||||
|
||||
## Ko-Fi
|
||||
|
||||
I have setup a Ko-Fi account for LunaSea, available here: https://ko-fi.com/JagandeepBrar.
|
||||
|
||||
Ko-Fi allows you to make a one-time donation in $1 increments using PayPal.
|
||||
|
||||
## GitHub Sponsors
|
||||
|
||||
I also have setup a GitHub Sponsors account, which is available here: https://github.com/sponsors/JagandeepBrar.
|
||||
|
||||
GitHub Sponsors allow you to setup a recurring donation in the amount of $1 to $5.
|
||||
@@ -1,41 +0,0 @@
|
||||
---
|
||||
title: Platform Restrictions
|
||||
description: Breaking down what is and isn't supported on different platforms
|
||||
---
|
||||
|
||||
# Platform Restrictions
|
||||
|
||||
The tables below showcases which modules or features may not be supported on each platform. If a module or feature is not listed, you can assume that every platform has full support for said module or feature!
|
||||
|
||||
> Work will continuously be down to try to achieve 100% feature parity between all platforms when possible!
|
||||
|
||||
## Module Support
|
||||
|
||||
| Module | Android | iOS | Linux | macOS | Windows | Web (Hosted) | Web (Self-Hosted) |
|
||||
| :---------: | :-----: | :-: | :---: | :---: | :-----: | :----------: | :---------------: |
|
||||
| NZBGet | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
|
||||
| Overseerr | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
|
||||
| Tautulli | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
|
||||
| Wake on LAN | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
|
||||
|
||||
## Feature Support
|
||||
|
||||
| Feature | Android | iOS | Linux | macOS | Windows | Web (Hosted) | Web (Self-Hosted) |
|
||||
| :--------------------: | :-----: | :-: | :---: | :---: | :-----: | :----------: | :---------------: |
|
||||
| Local Backup & Restore | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
|
||||
| LunaSea Accounts | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ❌ |
|
||||
| Notifications | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
|
||||
|
||||
## Web-Specific Restrictions
|
||||
|
||||
#### HTTPS Requirement
|
||||
|
||||
LunaSea's web instances are hosted on [Netlify](https://www.netlify.com) and use [LetsEncrypt](https://letsencrypt.org/) TLS certificates to ensure that an encrypted connection is utilized when loading the LunaSea web application package.
|
||||
|
||||
One limitation this incurs is that most modern web browsers no longer support [mixed content](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content), so it is required when using these browsers to utilize a reverse proxy (or something similar) to expose a secure (`HTTPS`) connection to your instances even when hosted on the same machine.
|
||||
|
||||
**All network communication occurs directly between your web browser and host machine**, but this is a limitation put forward by the web browsers.
|
||||
|
||||
#### Wake on LAN Support
|
||||
|
||||
Wake on LAN support will **never** be supported when using LunaSea on the web, because the Wake on LAN protocol relies on the [User Datagram Protocol (UDP)](https://en.wikipedia.org/wiki/User_Datagram_Protocol). UDP connections are not supported in the web browser because of underlying security constraints, and so it will not be possible to utilize wake on LAN now or at any point in the future when using LunaSea on the web.
|
||||
@@ -1,47 +0,0 @@
|
||||
---
|
||||
title: LunaSea
|
||||
description: Self-hosted software controller built using Flutter
|
||||
---
|
||||
|
||||
<Image
|
||||
src="https://raw.githubusercontent.com/JagandeepBrar/LunaSea/master/assets/images/branding_logo.png"
|
||||
width="250px"
|
||||
alt="LunaSea"
|
||||
zoom={false}
|
||||
caption="Self-hosted software controller built using Flutter"
|
||||
/>
|
||||
|
||||
LunaSea is a fully featured, open source self-hosted controller focused on giving you a seamless experience between all of your self-hosted media software remotely on your devices.
|
||||
|
||||
## Modules
|
||||
|
||||
- [Lidarr](/modules/lidarr)
|
||||
- [Newznab Search + NZBHydra2](/modules/newznab-search)
|
||||
- [NZBGet](/modules/nzbget)
|
||||
- [Radarr](/modules/radarr)
|
||||
- [Overseerr (WIP)](/modules/radarr)
|
||||
- [SABnzbd](/modules/sabnzbd)
|
||||
- [Sonarr](/modules/sonarr)
|
||||
- [Tautulli](/modules/tautulli)
|
||||
- [Wake on LAN](/modules/wake-on-lan)
|
||||
|
||||
LunaSea even comes with support for webhook-based push notifications, multiple instances of applications using profiles, backup and restore functionality for your configuration, an AMOLED black theme, and more!
|
||||
|
||||
> LunaSea is purely a remote control application, it does not offer any functionality without software installed on a server/computer.
|
||||
|
||||
## Releases
|
||||
|
||||
All releases for every build channel can be downloaded from the [build bucket](https://builds.lunasea.app), and all stable releases for all platforms are also available on [GitHub](https://github.com/JagandeepBrar/LunaSea/releases).
|
||||
|
||||
- [Android](/releases/android)
|
||||
- [iOS](/releases/ios)
|
||||
- [Linux](/releases/linux)
|
||||
- [macOS](/releases/macos)
|
||||
- [Web](/releases/web)
|
||||
- [Windows](/releases/windows/)
|
||||
|
||||
Interested in using prerelease build channels of LunaSea? Learn the differences between all the build channels and how to join one [here](https://www.lunasea.app/build-channels)!
|
||||
|
||||
## License
|
||||
|
||||
See [LICENSE.md](https://github.com/JagandeepBrar/LunaSea/blob/master/LICENSE.md) for more information.
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
title: Account
|
||||
description: Accounts to extend LunaSea's functionality
|
||||
---
|
||||
|
||||
# Account
|
||||
|
||||
LunaSea currently offers a _free_ cloud account that can be used for extending the functionality of LunaSea. The only details required to register for an account are an email address and password. At no point will LunaSea or the developers send you any emails, unless you explicitly request a password reset email.
|
||||
|
||||
If you want to protect your privacy, you are free to use a fake email when registering for an account, as there is no required account verification. Be warned that you will be unable to reset your password if you decide to use a fake email, as these functions are handled through Firebase Authentication via email.
|
||||
|
||||
## Encrypted Cloud Configuration Storage
|
||||
|
||||
The three options related to backing up your encrypted backups should be self-explanatory. All configurations are encrypted on-device before being sent off the device. When restoring an encrypted backup, the encrypted backup is downloaded to the device and you will be prompted to decrypt the backup on-device.
|
||||
|
||||
Deleting a backup is a permanent action, **there is no way to restore that backup**.
|
||||
|
||||
> Because all encryption and decryption occurs on-device, it is fully end-to-end encrypted. Forgetting the encryption password will result in there being no way to retrieve the configuration.
|
||||
@@ -1,55 +0,0 @@
|
||||
---
|
||||
title: Logs
|
||||
description: Breaking down LunaSea's built-in on-device logger
|
||||
---
|
||||
|
||||
# Logs
|
||||
|
||||
LunaSea includes an on-device logging system that helps debug crashes, issues, and support requests. LunaSea stores 4 different levels of logs: **Debug**, **Warning**, **Error**, and **Critical**.
|
||||
|
||||
<Tabs
|
||||
defaultValue="debug"
|
||||
values={[
|
||||
{ label: "Debug", value: "debug" },
|
||||
{ label: "Warning", value: "warning" },
|
||||
{ label: "Error", value: "error" },
|
||||
{ label: "Critical", value: "critical" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="debug">
|
||||
_Debug logs are visible/available on prerelease builds only_
|
||||
|
||||
Debug logs are informational logs and messages that are intended to help debug processes.
|
||||
</TabItem>
|
||||
<TabItem value="warning">
|
||||
Warning logs are non-crashing and non-critical errors that have occurred on the device. Warning logs would occur when failing to load an image, passing an incorrect encryption key when trying to restore a backup, etc.
|
||||
</TabItem>
|
||||
<TabItem value="error">
|
||||
Error logs are non-crashing but critical errors that have occurred on the device. Error logs would occur on network errors, connection issues, errors returned from the module, etc.
|
||||
</TabItem>
|
||||
<TabItem value="critical">
|
||||
Fatal logs are crashing errors or unhandled errors that have occurred on the device. Fatal logs would occur when LunaSea fails to complete the boot process, fails to render the UI, etc.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Viewing Log History
|
||||
|
||||
When a _handled_ error occurs, a toast notification will appear that allows you to directly view the error that just occurred.
|
||||
|
||||
LunaSea also stores a list of the **last 100 logs** that have occurred on the device. To access the history of logs, go to Settings -> System -> Logs. The log database size is checked on startup, so all logs that have occurred in the active session will remain in the log history until LunaSea is closed and reopened.
|
||||
|
||||
## Exporting Logs
|
||||
|
||||
LunaSea offers the ability to export your logs into a JSON file, which can be easily sent to the developer to help debug the problems. The exported logs also include additional information, including the code-execution stack trace to see exactly where in the code the error occurred.
|
||||
|
||||
To export your logs, go to Settings -> System -> Logs -> "Export" to trigger an export of your logs. A system-level share menu or dialog prompt will appear with the ability to share or save the exported logs to your device.
|
||||
|
||||
> Because the exported logs contain code-execution stack traces, **the logs may unintentionally contain private information**.
|
||||
>
|
||||
> Please ensure you do not publicly share your exported logs (or before sharing, manually scrub the exported logs). Only share the logs to trusted parties through private channels such as email or direct messages.
|
||||
|
||||
## Clearing Logs
|
||||
|
||||
LunaSea offers the ability to clear all recorded logs from your device. While an available option, it is not recommended to clear your logs often as LunaSea will internally ensure the log database does not grow to an obscenely large size.
|
||||
|
||||
To clear your logs, go to Settings -> System -> Logs -> "Clear" to trigger a clean of the logs database.
|
||||
@@ -1,62 +0,0 @@
|
||||
---
|
||||
title: Notifications
|
||||
description: How to setup webhook-based push notifications with LunaSea
|
||||
---
|
||||
|
||||
# Notifications
|
||||
|
||||
Many of the supported modules have support for webhooks, which we can utilize with the hosted notification relay to get rich, instant notifications with deep-linking support sent as push notifications directly to your devices running LunaSea!
|
||||
|
||||
## Platform Support
|
||||
|
||||
Notifications are only supported on a limited set of platforms at this time. Plans are to support all platforms in the future as support from the underlying notification service is added!
|
||||
|
||||
| Platform | Supported? |
|
||||
| :------: | :--------: |
|
||||
| Android | ✅ |
|
||||
| iOS | ✅ |
|
||||
| Linux | ❌ |
|
||||
| macOS | ✅ |
|
||||
| Windows | ❌ |
|
||||
| Web | ❌ |
|
||||
|
||||
## Module Support
|
||||
|
||||
Not all modules are currently supported, below is a list of all supported modules and if they supported deep linking to the relevant content. Additional support and deeper integration will arrive in future updates!
|
||||
|
||||
| Module | Supported? | Deep Linking? |
|
||||
| :-----------------------------------: | :--------: | :-----------: |
|
||||
| [Lidarr](/notifications/lidarr) | ✅ | ❌ |
|
||||
| NZBGet | ❌ | ❌ |
|
||||
| [Overseerr](/notifications/overseerr) | ✅ | ❌ |
|
||||
| [Radarr](/notifications/radarr) | ✅ | ✅ |
|
||||
| SABnzbd | ❌ | ❌ |
|
||||
| [Sonarr](/notifications/sonarr) | ✅ | ✅ |
|
||||
| [Tautulli](/notifications/tautulli) | ✅ | ✅ |
|
||||
|
||||
## Notification Types
|
||||
|
||||
LunaSea supports two different types of notifications: **User-Based** and **Device-Based**.
|
||||
|
||||
<Tabs
|
||||
defaultValue="user"
|
||||
values={[
|
||||
{ label: "User-Based", value: "user" },
|
||||
{ label: "Device-Based", value: "device" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="user">
|
||||
User-based notifications send notifications to all devices that are linked to your LunaSea account. Your device is automatically linked when you register or sign in to your account. This means that any current and future devices that are signed-in to your account will receive notifications automatically.
|
||||
</TabItem>
|
||||
<TabItem value="device">
|
||||
Device-based notifications send notifications to a single, specific device. Device-based notifications do not require a LunaSea account, but require you to register every device as a new webhook in the module.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Getting Your Webhook URLs
|
||||
|
||||
To get the correct webhook URL for each module simply head to the Settings within LunaSea, then into the "Notifications" page! The buttons on each module card will copy the full, constructed webhook URL to receive user-based or device-based notifications for that specific module. Please ensure to copy and use the correct webhook URL for each module, as mixing them up can lead to unexpected results.
|
||||
|
||||
> **Do not publicly share your user-based or device-based URL!**
|
||||
>
|
||||
> Anyone with access to your user or device webhook URLs can send notifications to your account or device.
|
||||
@@ -1,3 +0,0 @@
|
||||
---
|
||||
redirect: /notifications/custom
|
||||
---
|
||||
@@ -1,3 +0,0 @@
|
||||
---
|
||||
redirect: /notifications/lidarr
|
||||
---
|
||||
@@ -1,3 +0,0 @@
|
||||
---
|
||||
redirect: /notifications/overseerr
|
||||
---
|
||||
@@ -1,3 +0,0 @@
|
||||
---
|
||||
redirect: /notifications/radarr
|
||||
---
|
||||
@@ -1,3 +0,0 @@
|
||||
---
|
||||
redirect: /notifications/sonarr
|
||||
---
|
||||
@@ -1,3 +0,0 @@
|
||||
---
|
||||
redirect: /notifications/tautulli
|
||||
---
|
||||
@@ -1,39 +0,0 @@
|
||||
---
|
||||
title: Profiles
|
||||
description: Use multiple instances of modules with LunaSea
|
||||
---
|
||||
|
||||
# Profiles
|
||||
|
||||
Do you have multiple instances of modules you want to add to LunaSea? Profiles are the way to do this! LunaSea allows you to have an infinite amount of profiles, each of which can contain a whole new set of configurations for modules.
|
||||
|
||||
## Adding, Deleting, and Renaming Profiles
|
||||
|
||||
To add, delete, or rename a profile, head to Settings -> Profiles. There are a small collection of simple options on this page, each of which should be self-explanatory.
|
||||
|
||||
## Changing Profiles
|
||||
|
||||
There are many ways to switch profiles within LunaSea, but let it be noted that switching profiles clears all state-stored data from memory, and all fetched data will be fully refreshed.
|
||||
|
||||
<Tabs
|
||||
defaultValue="drawer"
|
||||
values={[
|
||||
{ label: "Drawer", value: "drawer" },
|
||||
{ label: "AppBar", value: "appbar" },
|
||||
{ label: "Settings", value: "settings" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="drawer">
|
||||
When you have more than a single profile enabled, the top header of the drawer will show the currently active profile and can be tapped to trigger a dropdown allowing you to select any profile to switch to.
|
||||
|
||||
When in a module and you switch to a profile that does not have the module enabled, the only option available on that page will be to return to the dashboard.
|
||||
</TabItem>
|
||||
<TabItem value="appbar">
|
||||
When on the home/base route of a module that has another instance enabled in another profile, a dropdown arrow will be displayed beside the module title in the AppBar. Simply tap the module name to get a dropdown list of profiles that have that module enabled.
|
||||
|
||||
Any additional profiles that do not have the module enabled will not be shown within the dropdown. If you have additional profiles but no profile has that specific module enabled, the dropdown will not be accessible.
|
||||
</TabItem>
|
||||
<TabItem value="settings">
|
||||
You can change your profile within the Settings, either by entering the "Profiles" page and selecting the enabled profile or by entering the "Configuration" page and hitting the profile icon in the AppBar.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
@@ -1,64 +0,0 @@
|
||||
---
|
||||
title: Lidarr
|
||||
description: How to configure and add Lidarr to LunaSea
|
||||
---
|
||||
|
||||
# Lidarr
|
||||
|
||||
Adding your Lidarr instance to LunaSea only requires a few steps to get going!
|
||||
|
||||
> This documentation only covers adding Lidarr to LunaSea via local area network (LAN) connections, and does not cover exposing Lidarr externally and connecting remotely.
|
||||
|
||||
## Preparation
|
||||
|
||||
#### Find Your Local Area Network IP Address
|
||||
|
||||
Finding your local area network IP address of the machine running Lidarr is the first step to get setup. To find your local IP address, please look at the following guides:
|
||||
|
||||
- [Linux](https://ubuntuhandbook.org/index.php/2020/07/find-ip-address-ubuntu-20-04/)
|
||||
- [macOS](https://osxdaily.com/2010/11/21/find-ip-address-mac/)
|
||||
- [Windows](https://support.microsoft.com/en-us/windows/find-your-ip-address-in-windows-f21a9bbc-c582-55cd-35e0-73431160a1b9)
|
||||
|
||||
If you are running a different operating system, you can use any search engine to look up "Find local IP address on \<your operating system\>" to typically find tons of guides for any platform.
|
||||
|
||||
> It is recommended to set your host machine's IP address to be statically assigned instead of dynamic/DHCP. This ensures that the IP address will not change through machine or network reboots.
|
||||
|
||||
#### Check What Port is Being Used
|
||||
|
||||
If using the default installation, Lidarr runs on port **8686**. In most cases, this port is not changed and does not need to be changed.
|
||||
|
||||
The simplest way to check is to go to Lidarr's web GUI, go to Settings -> General and note the value entered into "Port Number".
|
||||
|
||||
#### Ensure Lidarr is Accessible Across Your Network
|
||||
|
||||
To ensure that Lidarr is accessible across your local network, check the following:
|
||||
|
||||
- In Lidarr's web GUI, go to Settings -> General and enable advanced settings, then ensure that the "Bind Address" is set to `*`
|
||||
- Check any enabled firewalls to confirm that the port running Lidarr is not being blocked
|
||||
- _(Windows Only)_: Ensure that Lidarr has been run as administrator at least once
|
||||
|
||||
#### Check If You Are Using a URL Base
|
||||
|
||||
In Lidarr's web GUI, go to Settings -> General and check the value of "URL Base". If you have nothing set, you can move on. If you do have a value set, please remember the set value as it will be necessary when setting the host within LunaSea.
|
||||
|
||||
## Connecting in LunaSea
|
||||
|
||||
#### Host
|
||||
|
||||
The host is a combination of multiple values found above:
|
||||
|
||||
- The local IP address
|
||||
- The port
|
||||
- If being used, the URL base
|
||||
|
||||
Combine all the values into the following format: `<IP address>:<port>/<URL base>`
|
||||
|
||||
For example, if Lidarr is running on port `8686` on a machine that has the IP address `192.168.100.100` with a URL base set to `/lidarr`, the host is: `http://192.168.100.100:8686/lidarr`. If it had no URL base set, it would be `http://192.168.100.100:8686`.
|
||||
|
||||
#### API Key
|
||||
|
||||
The API key is copied from Lidarr's web GUI, by going to Settings -> General and finding the API key value.
|
||||
|
||||
#### Custom Headers
|
||||
|
||||
Custom headers allows users to attach custom request headers to each API call that is made. This is typically an advanced feature, and is not necessary in most network configurations.
|
||||
@@ -1,50 +0,0 @@
|
||||
---
|
||||
title: Newznab Search
|
||||
description: How to configure and add Newznab Search to LunaSea
|
||||
---
|
||||
|
||||
# Newznab Search
|
||||
|
||||
LunaSea supports any indexer that supports the [Newznab API specification](https://newznab.readthedocs.io/en/latest/). Most modern indexers (including NZBHydra2) are fully compliant with this specification, and compatible with LunaSea.
|
||||
|
||||
> LunaSea supports infinite scrolling of search and category results, which can result in multiple API hits. It is only recommended to add indexers with high API limits to prevent quickly reaching your API limit.
|
||||
|
||||
## Adding an Indexer
|
||||
|
||||
#### Display Name
|
||||
|
||||
Your personal display name for the indexer. The display name can be anything, but indexers are displayed in _alphabetical order_ and the display name you choose will determine where it lands in your list of indexers.
|
||||
|
||||
#### Indexer API Host
|
||||
|
||||
This is the _API host_ from the indexer. Do not confused this with the homepage for the indexer! Some indexers use the same URL, but many indexers will use a separate URL (commonly https://api.indexer.tld).
|
||||
|
||||
If your indexer can and has been added to Lidarr, Radarr, or Sonarr, you can simply copy the URL from the indexer configuration page within their settings.
|
||||
|
||||
#### Indexer API Key
|
||||
|
||||
Your API key that is typically available in the dashboard of the indexer or received by email when originally signing up for the indexer.
|
||||
|
||||
If you are unable to find your API key, consider contacting the administrators of the indexer to get help! The LunaSea developer and community users can try to help, but we cannot guarantee support if nobody has access to said indexer.
|
||||
|
||||
#### Custom Headers
|
||||
|
||||
Custom headers allows users to attach custom request headers to each API call that is made. This is typically an advanced feature, and is not necessary for most public indexers.
|
||||
|
||||
## Indexer API Hosts
|
||||
|
||||
| Indexer | API Host |
|
||||
| :------------: | :----------------------------: |
|
||||
| DOGnzb | https://api.dognzb.cr/ |
|
||||
| DrunkenSlug | https://api.drunkenslug.com/ |
|
||||
| NZB.su | https://api.nzb.su/ |
|
||||
| NZBCat | https://nzb.cat |
|
||||
| NZBFinder | https://nzbfinder.ws |
|
||||
| NZBGeek | https://api.nzbgeek.info |
|
||||
| NZBPlanet | https://api.nzbplanet.net |
|
||||
| omgwtfnzbs | https://api.omgwtfnzbs.me |
|
||||
| OZnzb | https://api.oznzb.com |
|
||||
| SimplyNZBs | https://simplynzbs.com |
|
||||
| Usenet Crawler | https://www.usenet-crawler.com |
|
||||
|
||||
Want to add something to list? Make a pull request on [GitHub](https://www.lunasea.app/github)!
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: NZBGet
|
||||
description: How to configure and add NZBGet to LunaSea
|
||||
---
|
||||
|
||||
# NZBGet
|
||||
|
||||
> Coming soon!
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: Overseerr
|
||||
description: How to configure and add Overseerr to LunaSea
|
||||
---
|
||||
|
||||
# Overseerr
|
||||
|
||||
> Coming soon!
|
||||
@@ -1,64 +0,0 @@
|
||||
---
|
||||
title: Radarr
|
||||
description: How to configure and add Radarr to LunaSea
|
||||
---
|
||||
|
||||
# Radarr
|
||||
|
||||
Adding your Radarr instance to LunaSea only requires a few steps to get going!
|
||||
|
||||
> This documentation only covers adding Radarr to LunaSea via local area network (LAN) connections, and does not cover exposing Radarr externally and connecting remotely.
|
||||
|
||||
## Preparation
|
||||
|
||||
#### Find Your Local Area Network IP Address
|
||||
|
||||
Finding your local area network IP address of the machine running Radarr is the first step to get setup. To find your local IP address, please look at the following guides:
|
||||
|
||||
- [Linux](https://ubuntuhandbook.org/index.php/2020/07/find-ip-address-ubuntu-20-04/)
|
||||
- [macOS](https://osxdaily.com/2010/11/21/find-ip-address-mac/)
|
||||
- [Windows](https://support.microsoft.com/en-us/windows/find-your-ip-address-in-windows-f21a9bbc-c582-55cd-35e0-73431160a1b9)
|
||||
|
||||
If you are running a different operating system, you can use any search engine to look up "Find local IP address on \<your operating system\>" to typically find tons of guides for any platform.
|
||||
|
||||
> It is recommended to set your host machine's IP address to be statically assigned instead of dynamic/DHCP. This ensures that the IP address will not change through machine or network reboots.
|
||||
|
||||
#### Check What Port is Being Used
|
||||
|
||||
If using the default installation, Radarr runs on port **7878**. In most cases, this port is not changed and does not need to be changed.
|
||||
|
||||
The simplest way to check is to go to Radarr's web GUI, go to Settings -> General and note the value entered into "Port Number".
|
||||
|
||||
#### Ensure Radarr is Accessible Across Your Network
|
||||
|
||||
To ensure that Radarr is accessible across your local network, check the following:
|
||||
|
||||
- In Radarr's web GUI, go to Settings -> General and enable advanced settings, then ensure that the "Bind Address" is set to `*`
|
||||
- Check any enabled firewalls to confirm that the port running Radarr is not being blocked
|
||||
- _(Windows Only)_: Ensure that Radarr has been run as administrator at least once
|
||||
|
||||
#### Check If You Are Using a URL Base
|
||||
|
||||
In Radarr's web GUI, go to Settings -> General and check the value of "URL Base". If you have nothing set, you can move on. If you do have a value set, please remember the set value as it will be necessary when setting the host within LunaSea.
|
||||
|
||||
## Connecting in LunaSea
|
||||
|
||||
#### Host
|
||||
|
||||
The host is a combination of multiple values found above:
|
||||
|
||||
- The local IP address
|
||||
- The port
|
||||
- If being used, the URL base
|
||||
|
||||
Combine all the values into the following format: `<IP address>:<port>/<URL base>`
|
||||
|
||||
For example, if Radarr is running on port `7878` on a machine that has the IP address `192.168.100.100` with a URL base set to `/radarr`, the host is: `http://192.168.100.100:7878/radarr`. If it had no URL base set, it would be `http://192.168.100.100:7878`.
|
||||
|
||||
#### API Key
|
||||
|
||||
The API key is copied from Radarr's web GUI, by going to Settings -> General and finding the API key value.
|
||||
|
||||
#### Custom Headers
|
||||
|
||||
Custom headers allows users to attach custom request headers to each API call that is made. This is typically an advanced feature, and is not necessary in most network configurations.
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: SABnzbd
|
||||
description: How to configure and add SABnzbd to LunaSea
|
||||
---
|
||||
|
||||
# SABnzbd
|
||||
|
||||
> Coming soon!
|
||||
@@ -1,64 +0,0 @@
|
||||
---
|
||||
title: Sonarr
|
||||
description: How to configure and add Sonarr to LunaSea
|
||||
---
|
||||
|
||||
# Sonarr
|
||||
|
||||
Adding your Sonarr instance to LunaSea only requires a few steps to get going!
|
||||
|
||||
> This documentation only covers adding Sonarr to LunaSea via local area network (LAN) connections, and does not cover exposing Sonarr externally and connecting remotely.
|
||||
|
||||
## Preparation
|
||||
|
||||
#### Find Your Local Area Network IP Address
|
||||
|
||||
Finding your local area network IP address of the machine running Sonarr is the first step to get setup. To find your local IP address, please look at the following guides:
|
||||
|
||||
- [Linux](https://ubuntuhandbook.org/index.php/2020/07/find-ip-address-ubuntu-20-04/)
|
||||
- [macOS](https://osxdaily.com/2010/11/21/find-ip-address-mac/)
|
||||
- [Windows](https://support.microsoft.com/en-us/windows/find-your-ip-address-in-windows-f21a9bbc-c582-55cd-35e0-73431160a1b9)
|
||||
|
||||
If you are running a different operating system, you can use any search engine to look up "Find local IP address on \<your operating system\>" to typically find tons of guides for any platform.
|
||||
|
||||
> It is recommended to set your host machine's IP address to be statically assigned instead of dynamic/DHCP. This ensures that the IP address will not change through machine or network reboots.
|
||||
|
||||
#### Check What Port is Being Used
|
||||
|
||||
If using the default installation, Sonarr runs on port **8989**. In most cases, this port is not changed and does not need to be changed.
|
||||
|
||||
The simplest way to check is to go to Sonarr's web GUI, go to Settings -> General and note the value entered into "Port Number".
|
||||
|
||||
#### Ensure Sonarr is Accessible Across Your Network
|
||||
|
||||
To ensure that Sonarr is accessible across your local network, check the following:
|
||||
|
||||
- In Sonarr's web GUI, go to Settings -> General and enable advanced settings, then ensure that the "Bind Address" is set to `*`
|
||||
- Check any enabled firewalls to confirm that the port running Sonarr is not being blocked
|
||||
- _(Windows Only)_: Ensure that Sonarr has been run as administrator at least once
|
||||
|
||||
#### Check If You Are Using a URL Base
|
||||
|
||||
In Sonarr's web GUI, go to Settings -> General and check the value of "URL Base". If you have nothing set, you can move on. If you do have a value set, please remember the set value as it will be necessary when setting the host within LunaSea.
|
||||
|
||||
## Connecting in LunaSea
|
||||
|
||||
#### Host
|
||||
|
||||
The host is a combination of multiple values found above:
|
||||
|
||||
- The local IP address
|
||||
- The port
|
||||
- If being used, the URL base
|
||||
|
||||
Combine all the values into the following format: `<IP address>:<port>/<URL base>`
|
||||
|
||||
For example, if Sonarr is running on port `8989` on a machine that has the IP address `192.168.100.100` with a URL base set to `/sonarr`, the host is: `http://192.168.100.100:8989/sonarr`. If it had no URL base set, it would be `http://192.168.100.100:8989`.
|
||||
|
||||
#### API Key
|
||||
|
||||
The API key is copied from Sonarr's web GUI, by going to Settings -> General and finding the API key value.
|
||||
|
||||
#### Custom Headers
|
||||
|
||||
Custom headers allows users to attach custom request headers to each API call that is made. This is typically an advanced feature, and is not necessary in most network configurations.
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: Tautulli
|
||||
description: How to configure and add Tautulli to LunaSea
|
||||
---
|
||||
|
||||
# Tautulli
|
||||
|
||||
> Coming soon!
|
||||
@@ -1,8 +0,0 @@
|
||||
---
|
||||
title: Wake on LAN
|
||||
description: How to configure and add Wake on LAN to LunaSea
|
||||
---
|
||||
|
||||
# Wake on LAN
|
||||
|
||||
> Coming soon!
|
||||
@@ -1,125 +0,0 @@
|
||||
---
|
||||
title: Custom Notifications
|
||||
description: Setting up custom webhook-based push notifications
|
||||
---
|
||||
|
||||
# Custom Notifications
|
||||
|
||||
## Preparation
|
||||
|
||||
> Custom notifications are considered an advanced feature, and requires basic knowledge of JSON syntax and creating your own scripts/tools to handle sending the payloads.
|
||||
|
||||
1. Read through the main [Notifications](/lunasea/notifications) page
|
||||
2. Copy your device-based or user-based webhook URL from LunaSea
|
||||
|
||||
You will need to slightly modify the webhook URL you have copied from any of the modules. Simply replace the name of the module within the webhook URL to custom and you're good to go!
|
||||
|
||||
Alternatively, you can copy the content of the URL after the last slash (after `device/` or `user/`) to obtain your Firebase device or user identifier.
|
||||
|
||||
## Device-Based
|
||||
|
||||
Send a custom notification using a device token to a single device running LunaSea.
|
||||
|
||||
<Tabs
|
||||
defaultValue="endpoint"
|
||||
values={[
|
||||
{ label: "Endpoint", value: "endpoint" },
|
||||
{ label: "JSON Body Schema", value: "json_body_schema" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="endpoint">
|
||||
```bash
|
||||
POST https://notify.lunasea.app/v1/custom/device/:device_id
|
||||
```
|
||||
|
||||
`device_id`: Firebase device identifier
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="json_body_schema">
|
||||
```json
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"title": "Device-Based Custom Notification",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "The notification title"
|
||||
},
|
||||
"body": {
|
||||
"type": "string",
|
||||
"description": "The notification body content"
|
||||
},
|
||||
"image": {
|
||||
"type": "string",
|
||||
"description": "A publicly accessible image to be attached to the notification"
|
||||
}
|
||||
},
|
||||
"required": ["title", "body"]
|
||||
}
|
||||
```
|
||||
|
||||
If `title` or `body` are missing in the request, a notification will still be sent but with a default title or body respectively.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## User-Based
|
||||
|
||||
<Tabs
|
||||
defaultValue="endpoint"
|
||||
values={[
|
||||
{ label: "Endpoint", value: "endpoint" },
|
||||
{ label: "JSON Body Schema", value: "json_body_schema" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="endpoint">
|
||||
```bash
|
||||
POST https://notify.lunasea.app/v1/custom/user/:user_id
|
||||
```
|
||||
|
||||
`user_id`: Firebase user identifier
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="json_body_schema">
|
||||
```json
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"title": "User-Based Custom Notification",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "The notification title"
|
||||
},
|
||||
"body": {
|
||||
"type": "string",
|
||||
"description": "The notification body content"
|
||||
},
|
||||
"image": {
|
||||
"type": "string",
|
||||
"description": "A publicly accessible image to be attached to the notification"
|
||||
}
|
||||
},
|
||||
"required": ["title", "body"]
|
||||
}
|
||||
```
|
||||
|
||||
If `title` or `body` are missing in the request, a notification will still be sent but with a default title or body respectively.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- Ensure that the required `title` parameter is a string type
|
||||
- If the type is not a string, the notification will fail
|
||||
- Sending no value or a null value will result in the title "Unknown Title" being used
|
||||
- Ensure that the required `body` parameter is a string type
|
||||
- If the type is not a string, the notification will fail
|
||||
- Sending no value or a null value will result in the body "Unknown Content" being used
|
||||
- If sending an image, ensure that the content is a valid URL
|
||||
- If the content is not a valid URL, the notification will fail
|
||||
- The URL must contain the protocol, `http://` or `https://`
|
||||
- The URL must be a direct link to the image and does not redirect
|
||||
- The URL must be publicly accessible, not requiring any authentication to access
|
||||
- If sending an image, the image must be a supported image type
|
||||
- Supported types include JPGs, PNGs, and animated GIFs
|
||||
@@ -1,92 +0,0 @@
|
||||
---
|
||||
title: Lidarr Notifications
|
||||
description: Setting up Lidarr for webhook-based push notifications
|
||||
---
|
||||
|
||||
# Lidarr Notifications
|
||||
|
||||
## Preparation
|
||||
|
||||
1. Read through the main [Notifications](/lunasea/notifications) page
|
||||
2. Copy your device-based or user-based webhook URL from LunaSea
|
||||
|
||||
## Setup the Webhook
|
||||
|
||||
In Lidarr's web GUI, head to Settings -> Connect, hit the "+" button to add a new connection and select "Webhook". Please follow each section below to setup the webhook:
|
||||
|
||||
<Tabs
|
||||
defaultValue="name"
|
||||
values={[
|
||||
{ label: "Name", value: "name" },
|
||||
{ label: "Triggers", value: "triggers" },
|
||||
{ label: "Tags", value: "tags" },
|
||||
{ label: "URL", value: "url" },
|
||||
{ label: "Method", value: "method" },
|
||||
{ label: "Username", value: "username" },
|
||||
{ label: "Password", value: "password" },
|
||||
]}
|
||||
>
|
||||
|
||||
<TabItem value="name">
|
||||
Select any name, for example "LunaSea".
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="triggers">
|
||||
Select which events should trigger a push notification. The following triggers are supported:
|
||||
|
||||
| Trigger | Supported? |
|
||||
| :---------------------: | :--------: |
|
||||
| On Grab | ✅ |
|
||||
| On Release Import | ✅ |
|
||||
| On Upgrade | ✅ |
|
||||
| On Download Failure | ❌ |
|
||||
| On Import Failure | ❌ |
|
||||
| On Rename | ✅ |
|
||||
| On Track Retag | ✅ |
|
||||
| On Application Update | ❌ |
|
||||
| On Health Issue | ❌ |
|
||||
| Include Health Warnings | ❌ |
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="tags">
|
||||
You can _optionally_ select a tag that must be attached to an artist for the webhook to get triggered.
|
||||
|
||||
This can be useful when working with a large media collection to only receive notifications for content you are actively monitoring.
|
||||
|
||||
If you want to receive notifications for all artists, leave the tags area empty.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="url">
|
||||
Paste the full device-based or user-based URL that was copied from LunaSea.
|
||||
|
||||
Each webhook can support a single user-based or device-based webhook URL. Attaching multiple device-based or user-based webhooks to a single Lidarr instance requires setting up multiple webhooks.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="method">
|
||||
Keep the method on `POST`. Changing the method to `PUT` will cause the webhooks to fail.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="username">
|
||||
The username field should be an _exact match_ to the profile that this module instance was added to within LunaSea. Capitalization and punctuation does matter.
|
||||
|
||||
> This step is only required if you are not using the default LunaSea profile (`default`). LunaSea will assume the default profile when none is supplied.
|
||||
>
|
||||
> Correctly setting up this field is critically important to get full deep-linking support.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="password">
|
||||
Leave the password field empty. Setting this field will currently have no effect.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
Once setup, close LunaSea and run the webhook test in Lidarr. You should receive a new notification letting you know that LunaSea is ready to receive Lidarr notifications!
|
||||
|
||||
## Example
|
||||
|
||||
An example Lidarr webhook can be seen below:
|
||||
|
||||
- No tags are set for this webhook, meaning all artists will trigger a notification
|
||||
- This is a user-based notification webhook, meaning it will be sent to all devices that are linked to the user ID `1234567890`
|
||||
- The webhook is associated with the profile named `My Profile`
|
||||
|
||||

|
||||
@@ -1,67 +0,0 @@
|
||||
---
|
||||
title: Overseerr Notifications
|
||||
description: Setting up Overseerr for webhook-based push notifications
|
||||
---
|
||||
|
||||
# Overseerr Notifications
|
||||
|
||||
## Preparation
|
||||
|
||||
1. Read through the main [Notifications](/lunasea/notifications) page
|
||||
2. Copy your device-based or user-based webhook URL from LunaSea
|
||||
|
||||
## Setup the Webhook
|
||||
|
||||
In Overseerr's web GUI, head to Settings -> Notifications -> LunaSea. Ensure that the agent is enabled, then follow each section below to setup the webhook:
|
||||
|
||||
<Tabs
|
||||
defaultValue="webhook_url"
|
||||
values={[
|
||||
{ label: "Webhook URL", value: "webhook_url" },
|
||||
{ label: "Profile Name", value: "profile_name" },
|
||||
{ label: "Notification Types", value: "notification_types" },
|
||||
]}
|
||||
>
|
||||
|
||||
<TabItem value="webhook_url">
|
||||
Paste the full device-based or user-based URL that was copied from LunaSea.
|
||||
|
||||
Overseerr currently only supports 1 LunaSea notification agent, which means you can only setup a single user-based or device-based notification.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="profile_name">
|
||||
The profile name field should be an _exact match_ to the profile that this module instance was added to within LunaSea. Capitalization and punctuation does matter.
|
||||
|
||||
> This step is only required if you are not using the default LunaSea profile (`default`). LunaSea will assume the default profile when none is supplied.
|
||||
>
|
||||
> Correctly setting up this field is critically important to get full deep-linking support.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="notification_types">
|
||||
Select which events should trigger a push notification. The following triggers are supported:
|
||||
|
||||
| Trigger | Supported? |
|
||||
| :----------------------------: | :--------: |
|
||||
| Request Pending Approval | ✅ |
|
||||
| Request Automatically Approved | ✅ |
|
||||
| Request Approved | ✅ |
|
||||
| Request Declined | ✅ |
|
||||
| Request Available | ✅ |
|
||||
| Request Processing Failed | ✅ |
|
||||
| Issue Reported | ✅ |
|
||||
| Issue Comment | ✅ |
|
||||
| Issue Resolved | ✅ |
|
||||
| Issue Reopened | ✅ |
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
Once setup, close LunaSea and run the webhook test in Overseerr. You should receive a new notification letting you know that LunaSea is ready to receive Overseerr notifications!
|
||||
|
||||
## Example
|
||||
|
||||
An example Overseerr webhook can be seen below:
|
||||
|
||||
- This is a user-based notification webhook, meaning it will be sent to all devices that are linked to the user ID `1234567890`
|
||||
- The webhook is associated with the profile named `My Profile`
|
||||
|
||||

|
||||
@@ -1,92 +0,0 @@
|
||||
---
|
||||
title: Radarr Notifications
|
||||
description: Setting up Radarr for webhook-based push notifications
|
||||
---
|
||||
|
||||
# Radarr Notifications
|
||||
|
||||
## Preparation
|
||||
|
||||
1. Read through the main [Notifications](/lunasea/notifications) page
|
||||
2. Copy your device-based or user-based webhook URL from LunaSea
|
||||
|
||||
## Setup the Webhook
|
||||
|
||||
In Radarr's web GUI, head to Settings -> Connect, hit the "+" button to add a new connection and select "Webhook". Please follow each section below to setup the webhook:
|
||||
|
||||
<Tabs
|
||||
defaultValue="name"
|
||||
values={[
|
||||
{ label: "Name", value: "name" },
|
||||
{ label: "Triggers", value: "triggers" },
|
||||
{ label: "Tags", value: "tags" },
|
||||
{ label: "URL", value: "url" },
|
||||
{ label: "Method", value: "method" },
|
||||
{ label: "Username", value: "username" },
|
||||
{ label: "Password", value: "password" },
|
||||
]}
|
||||
>
|
||||
|
||||
<TabItem value="name">
|
||||
Select any name, for example "LunaSea".
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="triggers">
|
||||
Select which events should trigger a push notification. The following triggers are supported:
|
||||
|
||||
| Trigger | Supported? |
|
||||
| :------------------------------: | :--------: |
|
||||
| On Grab | ✅ |
|
||||
| On Import | ✅ |
|
||||
| On Upgrade | ✅ |
|
||||
| On Rename | ✅ |
|
||||
| On Movie Delete | ❌ |
|
||||
| On Movie File Delete | ❌ |
|
||||
| On Movie File Delete For Upgrade | ❌ |
|
||||
| On Health Issue | ✅ |
|
||||
| Include Health Warnings | ✅ |
|
||||
| On Application Update | ❌ |
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="tags">
|
||||
You can _optionally_ select a tag that must be attached to a movie for the webhook to get triggered.
|
||||
|
||||
This can be useful when working with a large media collection to only receive notifications for content you are actively monitoring.
|
||||
|
||||
If you want to receive notifications for all movies, leave the tags area empty.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="url">
|
||||
Paste the full device-based or user-based URL that was copied from LunaSea.
|
||||
|
||||
Each webhook can support a single user-based or device-based webhook URL. Attaching multiple device-based or user-based webhooks to a single Radarr instance requires setting up multiple webhooks.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="method">
|
||||
Keep the method on `POST`. Changing the method to `PUT` will cause the webhooks to fail.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="username">
|
||||
The username field should be an _exact match_ to the profile that this module instance was added to within LunaSea. Capitalization and punctuation does matter.
|
||||
|
||||
> This step is only required if you are not using the default LunaSea profile (`default`). LunaSea will assume the default profile when none is supplied.
|
||||
>
|
||||
> Correctly setting up this field is critically important to get full deep-linking support.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="password">
|
||||
Leave the password field empty. Setting this field will currently have no effect.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
Once setup, close LunaSea and run the webhook test in Radarr. You should receive a new notification letting you know that LunaSea is ready to receive Radarr notifications!
|
||||
|
||||
## Example
|
||||
|
||||
An example Radarr webhook can be seen below:
|
||||
|
||||
- No tags are set for this webhook, meaning all movies will trigger a notification
|
||||
- This is a user-based notification webhook, meaning it will be sent to all devices that are linked to the user ID `1234567890`
|
||||
- The webhook is associated with the profile named `My Profile`
|
||||
|
||||

|
||||
@@ -1,92 +0,0 @@
|
||||
---
|
||||
title: Sonarr Notifications
|
||||
description: Setting up Sonarr for webhook-based push notifications
|
||||
---
|
||||
|
||||
# Sonarr Notifications
|
||||
|
||||
## Preparation
|
||||
|
||||
1. Read through the main [Notifications](/lunasea/notifications) page
|
||||
2. Copy your device-based or user-based webhook URL from LunaSea
|
||||
|
||||
## Setup the Webhook
|
||||
|
||||
In Sonarr's web GUI, head to Settings -> Connect, hit the "+" button to add a new connection and select "Webhook". Please follow each section below to setup the webhook:
|
||||
|
||||
<Tabs
|
||||
defaultValue="name"
|
||||
values={[
|
||||
{ label: "Name", value: "name" },
|
||||
{ label: "Triggers", value: "triggers" },
|
||||
{ label: "Tags", value: "tags" },
|
||||
{ label: "URL", value: "url" },
|
||||
{ label: "Method", value: "method" },
|
||||
{ label: "Username", value: "username" },
|
||||
{ label: "Password", value: "password" },
|
||||
]}
|
||||
>
|
||||
|
||||
<TabItem value="name">
|
||||
Select any name, for example "LunaSea".
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="triggers">
|
||||
Select which events should trigger a push notification. The following triggers are supported:
|
||||
|
||||
| Trigger | Supported? |
|
||||
| :--------------------------------: | :--------: |
|
||||
| On Grab | ✅ |
|
||||
| On Import | ✅ |
|
||||
| On Upgrade | ✅ |
|
||||
| On Rename | ✅ |
|
||||
| On Series Delete | ❌ |
|
||||
| On Episode File Delete | ❌ |
|
||||
| On Episode File Delete For Upgrade | ❌ |
|
||||
| On Health Issue | ✅ |
|
||||
| Include Health Warnings | ✅ |
|
||||
| On Application Update | ❌ |
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="tags">
|
||||
You can _optionally_ select a tag that must be attached to a series for the webhook to get triggered.
|
||||
|
||||
This can be useful when working with a large media collection to only receive notifications for content you are actively monitoring.
|
||||
|
||||
If you want to receive notifications for all series, leave the tags area empty.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="url">
|
||||
Paste the full device-based or user-based URL that was copied from LunaSea.
|
||||
|
||||
Each webhook can support a single user-based or device-based webhook URL. Attaching multiple device-based or user-based webhooks to a single Sonarr instance requires setting up multiple webhooks.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="method">
|
||||
Keep the method on `POST`. Changing the method to `PUT` will cause the webhooks to fail.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="username">
|
||||
The username field should be an _exact match_ to the profile that this module instance was added to within LunaSea. Capitalization and punctuation does matter.
|
||||
|
||||
> This step is only required if you are not using the default LunaSea profile (`default`). LunaSea will assume the default profile when none is supplied.
|
||||
>
|
||||
> Correctly setting up this field is critically important to get full deep-linking support.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="password">
|
||||
Leave the password field empty. Setting this field will currently have no effect.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
Once setup, close LunaSea and run the webhook test in Sonarr. You should receive a new notification letting you know that LunaSea is ready to receive Sonarr notifications!
|
||||
|
||||
## Example
|
||||
|
||||
An example Sonarr webhook can be seen below:
|
||||
|
||||
- No tags are set for this webhook, meaning all series will trigger a notification
|
||||
- This is a user-based notification webhook, meaning it will be sent to all devices that are linked to the user ID `1234567890`
|
||||
- The webhook is associated with the profile named `My Profile`
|
||||
|
||||

|
||||
@@ -1,89 +0,0 @@
|
||||
---
|
||||
title: Tautulli Notifications
|
||||
description: Setting up Tautulli for webhook-based push notifications
|
||||
---
|
||||
|
||||
# Tautulli Notifications
|
||||
|
||||
## Preparation
|
||||
|
||||
1. Read through the main [Notifications](/lunasea/notifications) page
|
||||
2. Copy your device-based or user-based webhook URL from LunaSea
|
||||
|
||||
## Setup the Webhook
|
||||
|
||||
In Tautulli's web GUI, head to Settings -> Notification Agents, hit the "Add a new notification agent" button and select "LunaSea". Please follow each section below to setup the webhook:
|
||||
|
||||
<Tabs
|
||||
defaultValue="configuration"
|
||||
values={[
|
||||
{ label: "Configuration", value: "configuration" },
|
||||
{ label: "Triggers", value: "triggers" },
|
||||
{ label: "Conditions", value: "conditions" },
|
||||
{ label: "Text", value: "text" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="configuration">
|
||||
**LunaSea Webhook URL**
|
||||
|
||||
Paste the full device-based or user-based URL that was copied from LunaSea.
|
||||
|
||||
**LunaSea Profile**
|
||||
|
||||
Enter in the name of the profile which should be an _exact match_ to the profile that this module instance was added to within LunaSea. Capitalization and punctuation does matter.
|
||||
|
||||
> This step is only required if you are not using the default LunaSea profile (`default`). LunaSea will assume the default profile when none is supplied.
|
||||
>
|
||||
> Correctly setting up this field is critically important to get full deep-linking support.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="triggers">
|
||||
Select which events should trigger a push notification. The following triggers are supported:
|
||||
|
||||
| Trigger | Supported? |
|
||||
| :--------------------------: | :--------: |
|
||||
| Playback Start | ✅ |
|
||||
| Playback Stop | ✅ |
|
||||
| Playback Pause | ✅ |
|
||||
| Playback Resume | ✅ |
|
||||
| Playback Error | ✅ |
|
||||
| Transcode Decision Change | ✅ |
|
||||
| Watched | ✅ |
|
||||
| Buffer Warning | ✅ |
|
||||
| User Concurrent Streams | ✅ |
|
||||
| User New Device | ✅ |
|
||||
| Recently Added | ✅ |
|
||||
| Plex Server Down | ✅ |
|
||||
| Plex Server Back Up | ✅ |
|
||||
| Plex Remote Access Down | ✅ |
|
||||
| Plex Remote Access Back Up | ✅ |
|
||||
| Plex Update Available | ✅ |
|
||||
| Tautulli Update Available | ✅ |
|
||||
| Tautulli Database Corruption | ✅ |
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="conditions">
|
||||
You can _optionally_ add conditions that must be met for the webhook notifications to trigger.
|
||||
|
||||
You can set as many conditions as you like, and can combine different conditions for different triggers by adding separate webhooks to Tautulli.
|
||||
</TabItem>
|
||||
|
||||
<TabItem value="text">
|
||||
A default message is set for all trigger types, but on this page you can alter the exact text that would appear in the message.
|
||||
|
||||
Please read the top of this tab in Tautulli about how to utilize the different modifiers.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
Once setup, close LunaSea and run the webhook test in Tautulli. You should receive a new notification letting you know that LunaSea is ready to receive Tautulli notifications!
|
||||
|
||||
## Attach Images to Notifications
|
||||
|
||||
This step is **optional** but recommended. Unlike other modules, in order to receive the actual images (posters, etc.) instead of a generic poster along with the notification, you will need to setup an image host within Tautulli.
|
||||
|
||||
1. Go to Tautulli's web GUI
|
||||
2. Open the Settings, enter "3rd Party APIs"
|
||||
3. Select any of the available image providers
|
||||
- If selecting `Self-hosted on public domain`, ensure that the image path (`/tautulli/image`) is publicly accessible from the internet
|
||||
4. Follow the [3rd Party APIs Guide](https://github.com/Tautulli/Tautulli/wiki/3rd-Party-APIs-Guide) to acquire the required details for the chosen image provider
|
||||
5. Enter and save the acquired API/Client ID information
|
||||
@@ -1,62 +0,0 @@
|
||||
---
|
||||
title: Android Releases
|
||||
description: Where to download Android releases of LunaSea
|
||||
---
|
||||
|
||||
# Android Releases
|
||||
|
||||
> If you want a stable experience, stick with stable releases. Want to test new builds of LunaSea? Read about the [build channels](/getting-started/build-channels) to make the right choice!
|
||||
|
||||
LunaSea is available on Android 7.0+.
|
||||
|
||||
Note that Google Play Services are not required for core functionality, however LunaSea account features and push notifications are not supported at this time.
|
||||
|
||||
## Google Play Store
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_
|
||||
|
||||
The easiest way for most users with Android devices would be to download releases of LunaSea directly from the [Google Play Store](https://www.lunasea.app/playstore)!
|
||||
|
||||
<Tabs
|
||||
defaultValue="stable"
|
||||
values={[
|
||||
{ label: "Stable", value: "stable" },
|
||||
{ label: "Candidate", value: "candidate" },
|
||||
{ label: "Beta", value: "beta" },
|
||||
{ label: "Edge", value: "edge" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="stable">
|
||||
Head to the [Google Play Store](https://www.lunasea.app/playstore)!
|
||||
</TabItem>
|
||||
<TabItem value="candidate">
|
||||
1. Head to the [Google Play Store](https://www.lunasea.app/playstore)
|
||||
2. Register for the test directly on the store listing
|
||||
3. Download LunaSea via the Google Play Store
|
||||
</TabItem>
|
||||
<TabItem value="beta">
|
||||
1. Join the [LunaSea: Beta Testing](https://groups.google.com/g/lunasea-beta-test) Google Group
|
||||
2. Head to the [Google Play Store](https://www.lunasea.app/playstore)
|
||||
3. Register for the test directly on the store listing
|
||||
4. Download LunaSea via the Google Play Store
|
||||
</TabItem>
|
||||
<TabItem value="edge">
|
||||
Because of the limitations on internal testing set by the Google Play Store, develop builds on Android are only available upon request to a very limited amount of users.
|
||||
|
||||
Reach out via [email](mailto:hello@lunasea.app) for more information.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Build Bucket
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_<br/>
|
||||
_Format(s): `.apk`_
|
||||
|
||||
All Android releases are available in the [Build Bucket](https://builds.lunasea.app/#latest/)!
|
||||
|
||||
## GitHub Releases
|
||||
|
||||
_Channel(s): `Stable`_<br/>
|
||||
_Format(s): `.apk`_
|
||||
|
||||
All stable releases are available on GitHub via the [Releases](https://github.com/JagandeepBrar/LunaSea/releases) page!
|
||||
@@ -1,69 +0,0 @@
|
||||
---
|
||||
title: iOS Releases
|
||||
description: Where to download iOS releases of LunaSea
|
||||
---
|
||||
|
||||
# iOS Releases
|
||||
|
||||
> If you want a stable experience, stick with stable releases. Want to test new builds of LunaSea? Read about the [build channels](/getting-started/build-channels) to make the right choice!
|
||||
|
||||
LunaSea is available on iOS 11.0+.
|
||||
|
||||
Note that installation of iOS app package (`.ipa`) files is a relatively advanced task and instructions are outside the scope of LunaSea's documentation and no support will be provided.
|
||||
|
||||
## App Store
|
||||
|
||||
_Channel(s): `Stable`_
|
||||
|
||||
The easiest way for most users with iOS devices who want stable releases would be to download releases of LunaSea directly from the [App Store](https://www.lunasea.app/appstore)!
|
||||
|
||||
## TestFlight
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_
|
||||
|
||||
The easiest way for most users with iOS devices to use test channels is using the [TestFlight](https://apps.apple.com/app/testflight/id899247664) platform!
|
||||
|
||||
<Tabs
|
||||
defaultValue="stable"
|
||||
values={[
|
||||
{ label: "Stable", value: "stable" },
|
||||
{ label: "Candidate", value: "candidate" },
|
||||
{ label: "Beta", value: "beta" },
|
||||
{ label: "Edge", value: "edge" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="stable">
|
||||
1. [Download TestFlight for iOS](https://apps.apple.com/app/testflight/id899247664)
|
||||
2. Join the [TestFlight stable channel](https://www.lunasea.app/testflight/stable)
|
||||
3. Download LunaSea via the TestFlight application
|
||||
</TabItem>
|
||||
<TabItem value="candidate">
|
||||
1. [Download TestFlight for iOS](https://apps.apple.com/app/testflight/id899247664)
|
||||
2. Join the [TestFlight candidate channel](https://www.lunasea.app/testflight/candidate)
|
||||
3. Download LunaSea via the TestFlight application
|
||||
</TabItem>
|
||||
<TabItem value="beta">
|
||||
1. [Download TestFlight for iOS](https://apps.apple.com/app/testflight/id899247664)
|
||||
2. Join the [TestFlight beta channel](https://www.lunasea.app/testflight/beta)
|
||||
3. Download LunaSea via the TestFlight application
|
||||
</TabItem>
|
||||
<TabItem value="edge">
|
||||
1. [Download TestFlight for iOS](https://apps.apple.com/app/testflight/id899247664)
|
||||
2. Join the [TestFlight edge channel](https://www.lunasea.app/testflight/edge)
|
||||
3. Download LunaSea via the TestFlight application
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Build Bucket
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_<br/>
|
||||
_Format(s): `.ipa`_
|
||||
|
||||
All iOS releases are available in the [Build Bucket](https://builds.lunasea.app/#latest/)!
|
||||
|
||||
## GitHub Releases
|
||||
|
||||
_Channel(s): `Stable`_<br/>
|
||||
_Format(s): `.ipa`_
|
||||
|
||||
All stable releases are available on GitHub via the [Releases](https://github.com/JagandeepBrar/LunaSea/releases) page!
|
||||
@@ -1,62 +0,0 @@
|
||||
---
|
||||
title: Linux Releases
|
||||
description: Where to download Linux releases of LunaSea
|
||||
---
|
||||
|
||||
# Linux Releases
|
||||
|
||||
> If you want a stable experience, stick with stable releases. Want to test new builds of LunaSea? Read about the [build channels](/getting-started/build-channels) to make the right choice!
|
||||
|
||||
LunaSea is available on all graphical Linux distributions that have `snap` installed and configured.
|
||||
|
||||
## Snapcraft
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_
|
||||
|
||||
The easiest way for most users on graphic Linux distributions would be to download releases of LunaSea directly from [Snapcraft](https://www.lunasea.app/snapcraft)!
|
||||
|
||||
<Tabs
|
||||
groupId="channel"
|
||||
defaultValue="stable"
|
||||
values={[
|
||||
{ label: "Stable", value: "stable" },
|
||||
{ label: "Candidate", value: "candidate" },
|
||||
{ label: "Beta", value: "beta" },
|
||||
{ label: "Edge", value: "edge" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="stable">
|
||||
```bash
|
||||
sudo snap install lunasea
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="candidate">
|
||||
```bash
|
||||
sudo snap install lunasea --candidate
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="beta">
|
||||
```bash
|
||||
sudo snap install lunasea --beta
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="edge">
|
||||
```bash
|
||||
sudo snap install lunasea --edge
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Build Bucket
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_<br/>
|
||||
_Format(s): `.snap`_
|
||||
|
||||
All Linux releases are available in the [Build Bucket](https://builds.lunasea.app/#latest/)!
|
||||
|
||||
## GitHub Releases
|
||||
|
||||
_Channel(s): `Stable`_<br/>
|
||||
_Format(s): `.snap`_
|
||||
|
||||
All stable releases are available on GitHub via the [Releases](https://github.com/JagandeepBrar/LunaSea/releases) page!
|
||||
@@ -1,67 +0,0 @@
|
||||
---
|
||||
title: macOS Releases
|
||||
description: Where to download macOS releases of LunaSea
|
||||
---
|
||||
|
||||
# macOS Releases
|
||||
|
||||
> If you want a stable experience, stick with stable releases. Want to test new builds of LunaSea? Read about the [build channels](/getting-started/build-channels) to make the right choice!
|
||||
|
||||
LunaSea is available on macOS 10.14+.
|
||||
|
||||
## TestFlight
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_
|
||||
|
||||
The easiest way for most users with macOS devices would be to download releases of LunaSea using the [TestFlight](https://apps.apple.com/app/testflight/id899247664) platform!
|
||||
|
||||
<Tabs
|
||||
defaultValue="stable"
|
||||
values={[
|
||||
{ label: "Stable", value: "stable" },
|
||||
{ label: "Candidate", value: "candidate" },
|
||||
{ label: "Beta", value: "beta" },
|
||||
{ label: "Edge", value: "edge" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="stable">
|
||||
1. [Download TestFlight for macOS](https://apps.apple.com/app/testflight/id899247664)
|
||||
2. Join the [TestFlight stable channel](https://www.lunasea.app/testflight/stable)
|
||||
3. Download LunaSea via the TestFlight application
|
||||
</TabItem>
|
||||
<TabItem value="candidate">
|
||||
1. [Download TestFlight for macOS](https://apps.apple.com/app/testflight/id899247664)
|
||||
2. Join the [TestFlight candidate channel](https://www.lunasea.app/testflight/candidate)
|
||||
3. Download LunaSea via the TestFlight application
|
||||
</TabItem>
|
||||
<TabItem value="beta">
|
||||
1. [Download TestFlight for macOS](https://apps.apple.com/app/testflight/id899247664)
|
||||
2. Join the [TestFlight beta channel](https://www.lunasea.app/testflight/beta)
|
||||
3. Download LunaSea via the TestFlight application
|
||||
</TabItem>
|
||||
<TabItem value="edge">
|
||||
1. [Download TestFlight for macOS](https://apps.apple.com/app/testflight/id899247664)
|
||||
2. Join the [TestFlight edge channel](https://www.lunasea.app/testflight/edge)
|
||||
3. Download LunaSea via the TestFlight application
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Build Bucket
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_<br/>
|
||||
_Format(s): `.dmg`, `.zip`_
|
||||
|
||||
All macOS releases are available in the [Build Bucket](https://builds.lunasea.app/#latest/)!
|
||||
|
||||
## Homebrew Cask
|
||||
|
||||
_Channel(s): `Stable`_<br/>
|
||||
|
||||
All stable releases are available via [Homebrew Cask](https://formulae.brew.sh/cask/lunasea)!
|
||||
|
||||
## GitHub Releases
|
||||
|
||||
_Channel(s): `Stable`_<br/>
|
||||
_Format(s): `.dmg`, `.zip`_
|
||||
|
||||
All stable releases are available on GitHub via the [Releases](https://github.com/JagandeepBrar/LunaSea/releases) page!
|
||||
@@ -1,88 +0,0 @@
|
||||
---
|
||||
title: Web Releases
|
||||
description: Where to download Web releases of LunaSea
|
||||
---
|
||||
|
||||
# Web Releases
|
||||
|
||||
> If you want a stable experience, stick with stable releases. Want to test new builds of LunaSea? Read about the [build channels](/getting-started/build-channels) to make the right choice!
|
||||
|
||||
## Hosted Builds
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_<br/>
|
||||
|
||||
All web releases of LunaSea are available on hosted instances by the LunaSea team! All communication and data stored is client-side, but there are some limitations of the platform which can be [viewed here](/getting-started/platform-restrictions).
|
||||
|
||||
<Tabs
|
||||
defaultValue="stable"
|
||||
values={[
|
||||
{ label: "Stable", value: "stable" },
|
||||
{ label: "Candidate", value: "candidate" },
|
||||
{ label: "Beta", value: "beta" },
|
||||
{ label: "Edge", value: "edge" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="stable">
|
||||
Access the stable release [here](https://web.lunasea.app)!
|
||||
</TabItem>
|
||||
<TabItem value="candidate">
|
||||
Access the candidate release [here](https://candidate.web.lunasea.app)!
|
||||
</TabItem>
|
||||
<TabItem value="beta">
|
||||
Access the beta release [here](https://beta.web.lunasea.app)!
|
||||
</TabItem>
|
||||
<TabItem value="edge">
|
||||
Access the edge release [here](https://edge.web.lunasea.app)!
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Docker
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_<br/>
|
||||
|
||||
All web releases of LunaSea are also available in officially hosted Docker images! There is currently only one value that needs to be configured which is the port mapping. LunaSea functions as a frontend application with all data being stored client-side.
|
||||
|
||||
<Tabs
|
||||
defaultValue="stable"
|
||||
values={[
|
||||
{ label: "Stable", value: "stable" },
|
||||
{ label: "Candidate", value: "candidate" },
|
||||
{ label: "Beta", value: "beta" },
|
||||
{ label: "Edge", value: "edge" },
|
||||
]}
|
||||
>
|
||||
<TabItem value="stable">
|
||||
```bash
|
||||
docker run -p 80:80 ghcr.io/jagandeepbrar/lunasea:stable
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="candidate">
|
||||
```bash
|
||||
docker run -p 80:80 ghcr.io/jagandeepbrar/lunasea:candidate
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="beta">
|
||||
```bash
|
||||
docker run -p 80:80 ghcr.io/jagandeepbrar/lunasea:beta
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="edge">
|
||||
```bash
|
||||
docker run -p 80:80 ghcr.io/jagandeepbrar/lunasea:edge
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
## Build Bucket
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_<br/>
|
||||
_Format(s): `.zip`_
|
||||
|
||||
All web releases are available in the [Build Bucket](https://builds.lunasea.app/#latest/)!
|
||||
|
||||
## GitHub Releases
|
||||
|
||||
_Channel(s): `Stable`_<br/>
|
||||
_Format(s): `.zip`_
|
||||
|
||||
All stable releases are available on GitHub via the [Releases](https://github.com/JagandeepBrar/LunaSea/releases) page!
|
||||
@@ -1,24 +0,0 @@
|
||||
---
|
||||
title: Windows Releases
|
||||
description: Where to download Windows releases of LunaSea
|
||||
---
|
||||
|
||||
# Windows Releases
|
||||
|
||||
> If you want a stable experience, stick with stable releases. Want to test new builds of LunaSea? Read about the [build channels](/getting-started/build-channels) to make the right choice!
|
||||
|
||||
LunaSea is available on Windows 10+.
|
||||
|
||||
## Build Bucket
|
||||
|
||||
_Channel(s): `Stable`, `Candidate`, `Beta`, `Edge`_<br/>
|
||||
_Format(s): `.msix`, `.zip`_
|
||||
|
||||
All Windows releases are available in the [Build Bucket](https://builds.lunasea.app/#latest/)!
|
||||
|
||||
## GitHub Releases
|
||||
|
||||
_Channel(s): `Stable`_<br/>
|
||||
_Format(s): `.msix`, `.zip`_
|
||||
|
||||
All stable releases are available on GitHub via the [Releases](https://github.com/JagandeepBrar/LunaSea/releases) page!
|
||||
@@ -1,3 +0,0 @@
|
||||
#include? "Pods/Target Support Files/Pods-ImageNotification/Pods-ImageNotification.debug.xcconfig"
|
||||
#include "Pods/Target Support Files/Pods-ImageNotification/Pods-ImageNotification.debug.xcconfig"
|
||||
#include "Generated.xcconfig"
|
||||
@@ -1,3 +0,0 @@
|
||||
#include? "Pods/Target Support Files/Pods-ImageNotification/Pods-ImageNotification.release.xcconfig"
|
||||
#include "Pods/Target Support Files/Pods-ImageNotification/Pods-ImageNotification.release.xcconfig"
|
||||
#include "Generated.xcconfig"
|
||||
@@ -1,31 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>ImageNotification</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionPointIdentifier</key>
|
||||
<string>com.apple.usernotifications.service</string>
|
||||
<key>NSExtensionPrincipalClass</key>
|
||||
<string>NotificationService</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,13 +0,0 @@
|
||||
//
|
||||
// NotificationService.h
|
||||
// ImageNotification
|
||||
//
|
||||
// Created by Jagandeep Brar on 2021-02-25.
|
||||
// Copyright © 2021 The Chromium Authors. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UserNotifications/UserNotifications.h>
|
||||
|
||||
@interface NotificationService : UNNotificationServiceExtension
|
||||
|
||||
@end
|
||||
@@ -1,34 +0,0 @@
|
||||
//
|
||||
// NotificationService.m
|
||||
// ImageNotification
|
||||
//
|
||||
// Created by Jagandeep Brar on 2021-02-25.
|
||||
// Copyright © 2021 The Chromium Authors. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NotificationService.h"
|
||||
#import "FirebaseMessaging.h"
|
||||
|
||||
@interface NotificationService ()
|
||||
|
||||
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
|
||||
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
|
||||
|
||||
@end
|
||||
|
||||
@implementation NotificationService
|
||||
|
||||
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
|
||||
self.contentHandler = contentHandler;
|
||||
self.bestAttemptContent = [request.content mutableCopy];
|
||||
|
||||
[[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent withContentHandler:contentHandler];
|
||||
}
|
||||
|
||||
- (void)serviceExtensionTimeWillExpire {
|
||||
// Called just before the extension will be terminated by the system.
|
||||
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
|
||||
self.contentHandler(self.bestAttemptContent);
|
||||
}
|
||||
|
||||
@end
|
||||
307
ios/Podfile.lock
307
ios/Podfile.lock
@@ -1,307 +0,0 @@
|
||||
PODS:
|
||||
- cloud_firestore (3.4.3):
|
||||
- Firebase/Firestore (= 9.3.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- DKImagePickerController/Core (4.3.4):
|
||||
- DKImagePickerController/ImageDataManager
|
||||
- DKImagePickerController/Resource
|
||||
- DKImagePickerController/ImageDataManager (4.3.4)
|
||||
- DKImagePickerController/PhotoGallery (4.3.4):
|
||||
- DKImagePickerController/Core
|
||||
- DKPhotoGallery
|
||||
- DKImagePickerController/Resource (4.3.4)
|
||||
- DKPhotoGallery (0.0.17):
|
||||
- DKPhotoGallery/Core (= 0.0.17)
|
||||
- DKPhotoGallery/Model (= 0.0.17)
|
||||
- DKPhotoGallery/Preview (= 0.0.17)
|
||||
- DKPhotoGallery/Resource (= 0.0.17)
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Core (0.0.17):
|
||||
- DKPhotoGallery/Model
|
||||
- DKPhotoGallery/Preview
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Model (0.0.17):
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Preview (0.0.17):
|
||||
- DKPhotoGallery/Model
|
||||
- DKPhotoGallery/Resource
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Resource (0.0.17):
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- file_picker (0.0.1):
|
||||
- DKImagePickerController/PhotoGallery
|
||||
- Flutter
|
||||
- Firebase/Auth (9.3.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseAuth (~> 9.3.0)
|
||||
- Firebase/CoreOnly (9.3.0):
|
||||
- FirebaseCore (= 9.3.0)
|
||||
- Firebase/Firestore (9.3.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseFirestore (~> 9.3.0)
|
||||
- Firebase/Messaging (9.3.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseMessaging (~> 9.3.0)
|
||||
- Firebase/Storage (9.3.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseStorage (~> 9.3.0)
|
||||
- firebase_auth (3.6.2):
|
||||
- Firebase/Auth (= 9.3.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_core (1.20.0):
|
||||
- Firebase/CoreOnly (= 9.3.0)
|
||||
- Flutter
|
||||
- firebase_messaging (12.0.1):
|
||||
- Firebase/Messaging (= 9.3.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- firebase_storage (10.3.4):
|
||||
- Firebase/Storage (= 9.3.0)
|
||||
- firebase_core
|
||||
- Flutter
|
||||
- FirebaseAppCheckInterop (9.4.0)
|
||||
- FirebaseAuth (9.3.0):
|
||||
- FirebaseCore (~> 9.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.7)
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.7)
|
||||
- FirebaseAuthInterop (9.4.0)
|
||||
- FirebaseCore (9.3.0):
|
||||
- FirebaseCoreDiagnostics (~> 9.0)
|
||||
- FirebaseCoreInternal (~> 9.0)
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- GoogleUtilities/Logger (~> 7.7)
|
||||
- FirebaseCoreDiagnostics (9.4.0):
|
||||
- GoogleDataTransport (< 10.0.0, >= 9.1.4)
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- GoogleUtilities/Logger (~> 7.7)
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- FirebaseCoreExtension (9.4.0):
|
||||
- FirebaseCore (~> 9.0)
|
||||
- FirebaseCoreInternal (9.4.0):
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.7)"
|
||||
- FirebaseFirestore (9.3.0):
|
||||
- FirebaseFirestore/AutodetectLeveldb (= 9.3.0)
|
||||
- FirebaseFirestore/AutodetectLeveldb (9.3.0):
|
||||
- FirebaseFirestore/Base
|
||||
- FirebaseFirestore/WithLeveldb
|
||||
- FirebaseFirestore/Base (9.3.0)
|
||||
- FirebaseFirestore/WithLeveldb (9.3.0):
|
||||
- FirebaseFirestore/Base
|
||||
- FirebaseInstallations (9.4.0):
|
||||
- FirebaseCore (~> 9.0)
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- GoogleUtilities/UserDefaults (~> 7.7)
|
||||
- PromisesObjC (~> 2.1)
|
||||
- FirebaseMessaging (9.3.0):
|
||||
- FirebaseCore (~> 9.0)
|
||||
- FirebaseInstallations (~> 9.0)
|
||||
- GoogleDataTransport (< 10.0.0, >= 9.1.4)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.7)
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- GoogleUtilities/Reachability (~> 7.7)
|
||||
- GoogleUtilities/UserDefaults (~> 7.7)
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- FirebaseStorage (9.3.0):
|
||||
- FirebaseAppCheckInterop (~> 9.0)
|
||||
- FirebaseAuthInterop (~> 9.0)
|
||||
- FirebaseCore (~> 9.0)
|
||||
- FirebaseCoreExtension (~> 9.0)
|
||||
- FirebaseStorageInternal (~> 9.0)
|
||||
- FirebaseStorageInternal (9.4.0):
|
||||
- FirebaseCore (~> 9.0)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.7)
|
||||
- Flutter (1.0.0)
|
||||
- flutter_native_splash (0.0.1):
|
||||
- Flutter
|
||||
- FMDB (2.7.5):
|
||||
- FMDB/standard (= 2.7.5)
|
||||
- FMDB/standard (2.7.5)
|
||||
- GoogleDataTransport (9.2.0):
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.7.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Environment (7.7.0):
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/Logger (7.7.0):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Network (7.7.0):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (7.7.0)"
|
||||
- GoogleUtilities/Reachability (7.7.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/UserDefaults (7.7.0):
|
||||
- GoogleUtilities/Logger
|
||||
- GTMSessionFetcher/Core (2.0.0)
|
||||
- in_app_purchase_storekit (0.0.1):
|
||||
- Flutter
|
||||
- nanopb (2.30909.0):
|
||||
- nanopb/decode (= 2.30909.0)
|
||||
- nanopb/encode (= 2.30909.0)
|
||||
- nanopb/decode (2.30909.0)
|
||||
- nanopb/encode (2.30909.0)
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- path_provider_ios (0.0.1):
|
||||
- Flutter
|
||||
- PromisesObjC (2.1.1)
|
||||
- quick_actions_ios (0.0.1):
|
||||
- Flutter
|
||||
- SDWebImage (5.13.2):
|
||||
- SDWebImage/Core (= 5.13.2)
|
||||
- SDWebImage/Core (5.13.2)
|
||||
- share_plus (0.0.1):
|
||||
- Flutter
|
||||
- shared_preferences_ios (0.0.1):
|
||||
- Flutter
|
||||
- sqflite (0.0.2):
|
||||
- Flutter
|
||||
- FMDB (>= 2.7.5)
|
||||
- SwiftyGif (5.4.3)
|
||||
- url_launcher_ios (0.0.1):
|
||||
- Flutter
|
||||
|
||||
DEPENDENCIES:
|
||||
- cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)
|
||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||
- Firebase/Messaging
|
||||
- firebase_auth (from `.symlinks/plugins/firebase_auth/ios`)
|
||||
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
|
||||
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
|
||||
- firebase_storage (from `.symlinks/plugins/firebase_storage/ios`)
|
||||
- FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `9.3.0`)
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
|
||||
- in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/ios`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`)
|
||||
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
|
||||
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||
- shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`)
|
||||
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- DKImagePickerController
|
||||
- DKPhotoGallery
|
||||
- Firebase
|
||||
- FirebaseAppCheckInterop
|
||||
- FirebaseAuth
|
||||
- FirebaseAuthInterop
|
||||
- FirebaseCore
|
||||
- FirebaseCoreDiagnostics
|
||||
- FirebaseCoreExtension
|
||||
- FirebaseCoreInternal
|
||||
- FirebaseInstallations
|
||||
- FirebaseMessaging
|
||||
- FirebaseStorage
|
||||
- FirebaseStorageInternal
|
||||
- FMDB
|
||||
- GoogleDataTransport
|
||||
- GoogleUtilities
|
||||
- GTMSessionFetcher
|
||||
- nanopb
|
||||
- PromisesObjC
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
cloud_firestore:
|
||||
:path: ".symlinks/plugins/cloud_firestore/ios"
|
||||
file_picker:
|
||||
:path: ".symlinks/plugins/file_picker/ios"
|
||||
firebase_auth:
|
||||
:path: ".symlinks/plugins/firebase_auth/ios"
|
||||
firebase_core:
|
||||
:path: ".symlinks/plugins/firebase_core/ios"
|
||||
firebase_messaging:
|
||||
:path: ".symlinks/plugins/firebase_messaging/ios"
|
||||
firebase_storage:
|
||||
:path: ".symlinks/plugins/firebase_storage/ios"
|
||||
FirebaseFirestore:
|
||||
:git: https://github.com/invertase/firestore-ios-sdk-frameworks.git
|
||||
:tag: 9.3.0
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
flutter_native_splash:
|
||||
:path: ".symlinks/plugins/flutter_native_splash/ios"
|
||||
in_app_purchase_storekit:
|
||||
:path: ".symlinks/plugins/in_app_purchase_storekit/ios"
|
||||
package_info_plus:
|
||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_ios:
|
||||
:path: ".symlinks/plugins/path_provider_ios/ios"
|
||||
quick_actions_ios:
|
||||
:path: ".symlinks/plugins/quick_actions_ios/ios"
|
||||
share_plus:
|
||||
:path: ".symlinks/plugins/share_plus/ios"
|
||||
shared_preferences_ios:
|
||||
:path: ".symlinks/plugins/shared_preferences_ios/ios"
|
||||
sqflite:
|
||||
:path: ".symlinks/plugins/sqflite/ios"
|
||||
url_launcher_ios:
|
||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||
|
||||
CHECKOUT OPTIONS:
|
||||
FirebaseFirestore:
|
||||
:git: https://github.com/invertase/firestore-ios-sdk-frameworks.git
|
||||
:tag: 9.3.0
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
cloud_firestore: 08093e207dfb2e6c82a6b272def699e022548786
|
||||
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
|
||||
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
|
||||
file_picker: 817ab1d8cd2da9d2da412a417162deee3500fc95
|
||||
Firebase: ef75abb1cdbc746d5a38f4e26c422c807b189b8c
|
||||
firebase_auth: e4bd9a01f6c45764bf3bfb0cea4d5ce3673a92a2
|
||||
firebase_core: 96214f90497b808a2cf2a24517084c5f6de37b53
|
||||
firebase_messaging: a2cd2c6dd7b5430bb9e4e50e9a474413ae3bce09
|
||||
firebase_storage: e95ec41580e311cb30b1ed7459b9e94fb4bbe672
|
||||
FirebaseAppCheckInterop: 63119cdfc94b16c3e9421513c17f597aee2ea225
|
||||
FirebaseAuth: 9ebc3577fe0acf9092df21ac314024b70aebf21e
|
||||
FirebaseAuthInterop: 826d3d772b554e3675ceaab8c665008277ca9d1c
|
||||
FirebaseCore: c088995ece701a021a48a1348ea0174877de2a6a
|
||||
FirebaseCoreDiagnostics: aaa87098082c4d4bdd1a9557b1186d18ca85ce8c
|
||||
FirebaseCoreExtension: 2cf8c542b54ad3c2d4b746c22e8828b670dcd9b0
|
||||
FirebaseCoreInternal: a13302b0088fbf5f38b79b6ece49c2af7d3e05d6
|
||||
FirebaseFirestore: 46c6a5f8f633267208ff16e6b72d7aedc7e77c8d
|
||||
FirebaseInstallations: 61db1054e688d2bdc4e2b3f744c1b086e913b742
|
||||
FirebaseMessaging: 2f6e38b6133059eb796ec224104f09379298a8c3
|
||||
FirebaseStorage: 1414d27e15fa04f6350ef6602accef0e951c8bca
|
||||
FirebaseStorageInternal: 425c7dc7de44d9b7e07a9f8d6515bab0f1266b87
|
||||
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
|
||||
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
|
||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||
GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f
|
||||
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
|
||||
GTMSessionFetcher: 681175626052e03fdde7952f7e9c7a9785719506
|
||||
in_app_purchase_storekit: d7fcf4646136ec258e237872755da8ea6c1b6096
|
||||
nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
|
||||
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
|
||||
path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02
|
||||
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
|
||||
quick_actions_ios: 5ec8f5f1ae81512ac803fe10c197ebb875767a9e
|
||||
SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866
|
||||
share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
|
||||
shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad
|
||||
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
||||
SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780
|
||||
url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de
|
||||
|
||||
PODFILE CHECKSUM: 6bb30b45f4346b63e7fe082a3e16120ec991e70f
|
||||
|
||||
COCOAPODS: 1.11.3
|
||||
@@ -1,82 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>LunaSea</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Editor</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array/>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<false/>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>LSSupportsOpeningDocumentsInPlace</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
|
||||
<string>LunaSea would like to access your location for determining local-remote host switching</string>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>LunaSea would like to access your location for determining local-remote host switching</string>
|
||||
<key>NSPhotoLibraryAddUsageDescription</key>
|
||||
<string>LunaSea would like to save photos from the app to your gallery</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>LunaSea would like to access your photo gallery for uploading images to LunaSea</string>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>fetch</string>
|
||||
<string>remote-notification</string>
|
||||
</array>
|
||||
<key>UIFileSharingEnabled</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UIStatusBarHidden</key>
|
||||
<false/>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,4 +0,0 @@
|
||||
git_url("git@github.com:JagandeepBrar/LunaSea-Fastlane-Storage.git")
|
||||
storage_mode("git")
|
||||
app_identifier(["app.lunasea.lunasea", "app.lunasea.lunasea.ImageNotification"])
|
||||
platform("ios")
|
||||
@@ -1,14 +0,0 @@
|
||||
import 'package:lunasea/database/table.dart';
|
||||
|
||||
enum BIOSDatabase<T> with LunaTableMixin<T> {
|
||||
DATABASE_CORRUPTION<bool>(false),
|
||||
FIRST_BOOT<bool>(true);
|
||||
|
||||
@override
|
||||
LunaTable get table => LunaTable.bios;
|
||||
|
||||
@override
|
||||
final T fallback;
|
||||
|
||||
const BIOSDatabase(this.fallback);
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
import 'package:lunasea/database/table.dart';
|
||||
|
||||
enum OverseerrDatabase<T> with LunaTableMixin<T> {
|
||||
NAVIGATION_INDEX<int>(0),
|
||||
CONTENT_PAGE_SIZE<int>(10);
|
||||
|
||||
@override
|
||||
LunaTable get table => LunaTable.overseerr;
|
||||
|
||||
@override
|
||||
final T fallback;
|
||||
|
||||
const OverseerrDatabase(this.fallback);
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
import 'package:lunasea/vendor.dart';
|
||||
|
||||
abstract class LunaModuleRouter {
|
||||
/// Given the [FluroRouter], define all routes and handlers required for the module.
|
||||
void defineAllRoutes(FluroRouter router);
|
||||
GoRoute getRoutes();
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:lunasea/core.dart';
|
||||
|
||||
abstract class LunaPageRouter {
|
||||
/// The full string representation of the route without the named parameters being swapped out
|
||||
final String fullRoute;
|
||||
|
||||
/// Use [FluroRouter] to navigate to the page
|
||||
Future<dynamic> navigateTo(BuildContext context) {
|
||||
return LunaRouter.router.navigateTo(context, fullRoute);
|
||||
}
|
||||
|
||||
/// Get a string representation of the route with any named parameters inserted
|
||||
String route() => fullRoute;
|
||||
|
||||
/// Used to define the route in the passed in router.
|
||||
///
|
||||
/// If the route requires no parameters, call [noParameterRouteDefinition] with the route as the [Widget] parameter.
|
||||
void defineRoute(FluroRouter router);
|
||||
|
||||
/// Return an instance of the actual route widget.
|
||||
Widget widget();
|
||||
|
||||
/// Define the route in the passed in router without any parameters required.
|
||||
///
|
||||
/// Already defines:
|
||||
/// - Calls [FluroRouter.define] with the [fullRoute]
|
||||
/// - Creates a basic [Handler]
|
||||
/// - Sets the transition type to [LunaRouter.transitionType]
|
||||
/// - Checks that the module is enabled, and if not returns a `[NotEnabledPage] instead of the intended route
|
||||
void noParameterRouteDefinition(
|
||||
FluroRouter router, {
|
||||
bool homeRoute = false,
|
||||
});
|
||||
|
||||
/// Define the route in the passed in router with some parameters required.
|
||||
///
|
||||
/// Already defines:
|
||||
/// - Calls [FluroRouter.define] with the [fullRoute]
|
||||
/// - Creates a basic [Handler]
|
||||
/// - Sets the transition type to [LunaRouter.transitionType]
|
||||
/// - Checks that the module is enabled, and if not returns a `[NotEnabledPage] instead of the intended route
|
||||
/// - Parses and injects the required parameters into the route for the handler
|
||||
void withParameterRouteDefinition(
|
||||
FluroRouter router,
|
||||
Widget Function(BuildContext?, Map<String, List<String>>) handlerFunc, {
|
||||
bool homeRoute = false,
|
||||
});
|
||||
|
||||
LunaPageRouter(this.fullRoute);
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:lunasea/core.dart';
|
||||
import 'package:lunasea/main.dart';
|
||||
|
||||
import 'package:lunasea/modules/external_modules.dart';
|
||||
import 'package:lunasea/modules/search.dart';
|
||||
import 'package:lunasea/modules/settings.dart';
|
||||
|
||||
import 'package:lunasea/modules/lidarr.dart';
|
||||
import 'package:lunasea/modules/radarr.dart';
|
||||
import 'package:lunasea/modules/sonarr.dart';
|
||||
import 'package:lunasea/modules/overseerr.dart';
|
||||
import 'package:lunasea/modules/sabnzbd.dart';
|
||||
import 'package:lunasea/modules/nzbget.dart';
|
||||
import 'package:lunasea/modules/tautulli.dart';
|
||||
|
||||
import 'package:lunasea/modules/dashboard/routes/routes.dart' as dashboard;
|
||||
import 'package:lunasea/widgets/pages/invalid_route.dart';
|
||||
|
||||
class LunaRouter {
|
||||
static FluroRouter router = FluroRouter();
|
||||
static TransitionType get transitionType => TransitionType.native;
|
||||
|
||||
/// Calls `defineAllRoutes()` on all module routers that implement [LunaModuleRouter].
|
||||
void initialize() {
|
||||
router.notFoundHandler = Handler(
|
||||
handlerFunc: (context, params) => InvalidRoutePage(),
|
||||
);
|
||||
router.define(
|
||||
'/',
|
||||
handler: Handler(handlerFunc: (context, params) => const LunaOS()),
|
||||
transitionType: transitionType,
|
||||
);
|
||||
// Module routers
|
||||
dashboard.Router().defineAllRoutes(router);
|
||||
ExternalModulesRouter().defineAllRoutes(router);
|
||||
OverseerrRouter().defineAllRoutes(router);
|
||||
RadarrRouter().defineAllRoutes(router);
|
||||
SearchRouter().defineAllRoutes(router);
|
||||
SettingsRouter().defineAllRoutes(router);
|
||||
SonarrRouter().defineAllRoutes(router);
|
||||
TautulliRouter().defineAllRoutes(router);
|
||||
}
|
||||
|
||||
/// **Will be removed when all module routers are integrated.**
|
||||
///
|
||||
/// Returns a map of all module routes.
|
||||
Map<String, WidgetBuilder> get routes => <String, WidgetBuilder>{
|
||||
..._lidarr,
|
||||
..._sabnzbd,
|
||||
..._nzbget,
|
||||
};
|
||||
|
||||
Map<String, WidgetBuilder> get _lidarr => <String, WidgetBuilder>{
|
||||
Lidarr.ROUTE_NAME: (context) => const Lidarr(),
|
||||
LidarrAddSearch.ROUTE_NAME: (context) => const LidarrAddSearch(),
|
||||
LidarrAddDetails.ROUTE_NAME: (context) => const LidarrAddDetails(),
|
||||
LidarrEditArtist.ROUTE_NAME: (context) => const LidarrEditArtist(),
|
||||
LidarrDetailsAlbum.ROUTE_NAME: (context) => const LidarrDetailsAlbum(),
|
||||
LidarrDetailsArtist.ROUTE_NAME: (context) =>
|
||||
const LidarrDetailsArtist(),
|
||||
LidarrSearchResults.ROUTE_NAME: (context) =>
|
||||
const LidarrSearchResults(),
|
||||
};
|
||||
|
||||
Map<String, WidgetBuilder> get _nzbget => <String, WidgetBuilder>{
|
||||
NZBGet.ROUTE_NAME: (context) => const NZBGet(),
|
||||
NZBGetStatistics.ROUTE_NAME: (context) => const NZBGetStatistics(),
|
||||
};
|
||||
|
||||
Map<String, WidgetBuilder> get _sabnzbd => <String, WidgetBuilder>{
|
||||
SABnzbd.ROUTE_NAME: (context) => const SABnzbd(),
|
||||
SABnzbdStatistics.ROUTE_NAME: (context) => const SABnzbdStatistics(),
|
||||
SABnzbdHistoryStages.ROUTE_NAME: (context) =>
|
||||
const SABnzbdHistoryStages(),
|
||||
};
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
abstract class LunaModuleState extends ChangeNotifier {
|
||||
/// Reset the state back to the default
|
||||
void reset();
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:lunasea/modules/dashboard/core/state.dart' as dashboard;
|
||||
import 'package:lunasea/modules/lidarr/core/state.dart';
|
||||
import 'package:lunasea/modules/radarr/core/state.dart';
|
||||
import 'package:lunasea/modules/search/core/state.dart';
|
||||
import 'package:lunasea/modules/settings/core/state.dart';
|
||||
import 'package:lunasea/modules/sonarr/core/state.dart';
|
||||
import 'package:lunasea/modules/overseerr/core/state.dart';
|
||||
import 'package:lunasea/modules/sabnzbd/core/state.dart';
|
||||
import 'package:lunasea/modules/nzbget/core/state.dart';
|
||||
import 'package:lunasea/modules/tautulli/core/state.dart';
|
||||
import 'package:lunasea/modules.dart';
|
||||
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart' show ProviderScope;
|
||||
|
||||
class LunaState {
|
||||
LunaState._();
|
||||
|
||||
/// Key for the [NavigatorState] to globally access context and other usages.
|
||||
static final GlobalKey<NavigatorState> navigatorKey =
|
||||
GlobalKey<NavigatorState>();
|
||||
|
||||
/// Calls `.reset()` on all states which extend [LunaModuleState].
|
||||
static void reset([BuildContext? context]) {
|
||||
final ctx = context ?? navigatorKey.currentContext!;
|
||||
LunaModule.values.forEach((module) => module.state(ctx)?.reset());
|
||||
}
|
||||
|
||||
static ProviderScope providers({required Widget child}) {
|
||||
return ProviderScope(
|
||||
child: MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider(create: (_) => dashboard.ModuleState()),
|
||||
ChangeNotifierProvider(create: (_) => SettingsState()),
|
||||
ChangeNotifierProvider(create: (_) => SearchState()),
|
||||
ChangeNotifierProvider(create: (_) => LidarrState()),
|
||||
ChangeNotifierProvider(create: (_) => RadarrState()),
|
||||
ChangeNotifierProvider(create: (_) => SonarrState()),
|
||||
ChangeNotifierProvider(create: (_) => NZBGetState()),
|
||||
ChangeNotifierProvider(create: (_) => SABnzbdState()),
|
||||
ChangeNotifierProvider(create: (_) => OverseerrState()),
|
||||
ChangeNotifierProvider(create: (_) => TautulliState()),
|
||||
],
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
extension NavigatorStateExtension on NavigatorState {
|
||||
void safetyPop() {
|
||||
if (this.canPop()) this.pop();
|
||||
}
|
||||
|
||||
void popToRootRoute() {
|
||||
this.popUntil((route) => route.isFirst);
|
||||
}
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
import 'package:lunasea/core.dart';
|
||||
import 'package:lunasea/firebase/firestore.dart';
|
||||
import 'package:lunasea/firebase/types.dart';
|
||||
|
||||
class LunaFirebaseAuth {
|
||||
/// Return an instance of [FirebaseAuth].
|
||||
///
|
||||
/// Throws an error if [LunaFirebase.initialize] has not been called.
|
||||
static FirebaseAuth get instance => FirebaseAuth.instance;
|
||||
|
||||
/// Returns the [User] object.
|
||||
///
|
||||
/// If the user is not signed in, returns null.
|
||||
User? get user => instance.currentUser;
|
||||
|
||||
/// Returns if a user is signed in.
|
||||
bool get isSignedIn => instance.currentUser != null;
|
||||
|
||||
/// Returns the user's UID.
|
||||
///
|
||||
/// If the user is not signed in, returns null.
|
||||
String? get uid => instance.currentUser?.uid;
|
||||
|
||||
/// Return the user's email.
|
||||
///
|
||||
/// If the user is not signed in, returns null.
|
||||
String? get email => instance.currentUser?.email;
|
||||
|
||||
/// Sign out a logged in user.
|
||||
///
|
||||
/// If the user is not signed in, this is a non-op.
|
||||
Future<void> signOut() async => instance.signOut();
|
||||
|
||||
/// Register a new user using Firebase Authentication.
|
||||
///
|
||||
/// Returns a [LunaFirebaseResponse] which contains the state (true on success, false on failure), the [User] object, and [FirebaseAuthException] if applicable.
|
||||
Future<LunaFirebaseResponse> registerUser(
|
||||
String email, String password) async {
|
||||
try {
|
||||
UserCredential _user = await instance.createUserWithEmailAndPassword(
|
||||
email: email, password: password);
|
||||
LunaFirebaseFirestore().addDeviceToken();
|
||||
return LunaFirebaseResponse(state: true, user: _user);
|
||||
} on FirebaseAuthException catch (error) {
|
||||
return LunaFirebaseResponse(state: false, error: error);
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error("Failed to register user: $email", error, stack);
|
||||
return LunaFirebaseResponse(state: false);
|
||||
}
|
||||
}
|
||||
|
||||
/// Sign in a user using Firebase Authentication.
|
||||
///
|
||||
/// Returns a [LunaFirebaseResponse] which contains the state (true on success, false on failure), the [User] object, and [FirebaseAuthException] if applicable.
|
||||
Future<LunaFirebaseResponse> signInUser(String email, String password) async {
|
||||
try {
|
||||
UserCredential _user = await instance.signInWithEmailAndPassword(
|
||||
email: email,
|
||||
password: password,
|
||||
);
|
||||
LunaFirebaseFirestore().addDeviceToken();
|
||||
return LunaFirebaseResponse(state: true, user: _user);
|
||||
} on FirebaseAuthException catch (error) {
|
||||
return LunaFirebaseResponse(state: false, error: error);
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error("Failed to login user: $email", error, stack);
|
||||
return LunaFirebaseResponse(state: false);
|
||||
}
|
||||
}
|
||||
|
||||
/// Delete the currently logged in user from the Firebase project.
|
||||
///
|
||||
/// The user's password is required to validate and acquire fresh credentials to process the deletion.
|
||||
Future<LunaFirebaseResponse> deleteUser(String password) async {
|
||||
try {
|
||||
return await user!
|
||||
.reauthenticateWithCredential(EmailAuthProvider.credential(
|
||||
email: email!,
|
||||
password: password,
|
||||
))
|
||||
.then((credentials) => credentials.user!.delete())
|
||||
.then((_) => LunaFirebaseResponse(state: true));
|
||||
} on FirebaseAuthException catch (error) {
|
||||
return LunaFirebaseResponse(state: false, error: error);
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to delete user: ${user!.email}', error, stack);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<LunaFirebaseResponse> updateEmail(
|
||||
String newEmail,
|
||||
String password,
|
||||
) async {
|
||||
try {
|
||||
return await user!
|
||||
.reauthenticateWithCredential(EmailAuthProvider.credential(
|
||||
email: email!,
|
||||
password: password,
|
||||
))
|
||||
.then((credentials) => credentials.user!.updateEmail(newEmail))
|
||||
.then((_) => LunaFirebaseResponse(state: true));
|
||||
} on FirebaseAuthException catch (error) {
|
||||
return LunaFirebaseResponse(state: false, error: error);
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to set email: ${user!.email}', error, stack);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
Future<LunaFirebaseResponse> updatePassword(
|
||||
String newPassword,
|
||||
String password,
|
||||
) async {
|
||||
try {
|
||||
return await user!
|
||||
.reauthenticateWithCredential(EmailAuthProvider.credential(
|
||||
email: email!,
|
||||
password: password,
|
||||
))
|
||||
.then((credentials) => credentials.user!.updatePassword(newPassword))
|
||||
.then((_) => LunaFirebaseResponse(state: true));
|
||||
} on FirebaseAuthException catch (error) {
|
||||
return LunaFirebaseResponse(state: false, error: error);
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to set pass: ${user!.email}', error, stack);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
/// Reset a user's password by sending them a password reset email.
|
||||
Future<void> resetPassword(String email) async {
|
||||
instance.sendPasswordResetEmail(email: email);
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:lunasea/system/platform.dart';
|
||||
|
||||
// ignore: always_use_package_imports
|
||||
import 'options.dart';
|
||||
|
||||
class LunaFirebase {
|
||||
static bool get isSupported {
|
||||
if (LunaPlatform.isMobile || LunaPlatform.isMacOS || LunaPlatform.isWeb) {
|
||||
// Validate that the firebase config exists by trying to load it
|
||||
try {
|
||||
DefaultFirebaseOptions.currentPlatform;
|
||||
return true;
|
||||
// ignore: empty_catches
|
||||
} catch (_) {}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Initialize Firebase and configuration.
|
||||
///
|
||||
/// This must be called before anything accesses Firebase services, or an exception will be thrown.
|
||||
Future<void> initialize() async {
|
||||
await Firebase.initializeApp(
|
||||
options: DefaultFirebaseOptions.currentPlatform,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:lunasea/core.dart';
|
||||
import 'package:lunasea/firebase/auth.dart';
|
||||
import 'package:lunasea/firebase/messaging.dart';
|
||||
import 'package:lunasea/firebase/types.dart';
|
||||
|
||||
class LunaFirebaseFirestore {
|
||||
/// Returns an instance of [FirebaseFirestore].
|
||||
///
|
||||
/// Throws an errof if [LunaFirebase.initialize] has not been called.
|
||||
static FirebaseFirestore get instance => FirebaseFirestore.instance;
|
||||
|
||||
/// Add a backup entry to Firestore. Returns true if successful, and false on any error.
|
||||
///
|
||||
/// If the user is not signed in, returns false.
|
||||
Future<bool> addBackupEntry(
|
||||
String id,
|
||||
int timestamp, {
|
||||
String title = '',
|
||||
String description = '',
|
||||
}) async {
|
||||
if (!LunaFirebaseAuth().isSignedIn) return false;
|
||||
try {
|
||||
LunaFirebaseBackupDocument entry = LunaFirebaseBackupDocument(
|
||||
id: id,
|
||||
title: title,
|
||||
description: description,
|
||||
timestamp: timestamp,
|
||||
);
|
||||
instance
|
||||
.doc('users/${LunaFirebaseAuth().uid}/backups/$id')
|
||||
.set(entry.toJSON());
|
||||
return true;
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to add backup entry', error, stack);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Delete a backup entry from Firestore. Returns true if successful, and false on any error.
|
||||
///
|
||||
/// If the user is not signed in, returns false.
|
||||
Future<bool> deleteBackupEntry(String? id) async {
|
||||
if (!LunaFirebaseAuth().isSignedIn) return false;
|
||||
try {
|
||||
await instance
|
||||
.doc('users/${LunaFirebaseAuth().uid}/backups/$id')
|
||||
.delete();
|
||||
return true;
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to delete backup entry', error, stack);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns a list of all backups available for this account.
|
||||
///
|
||||
/// If the user is not signed in, returns an empty list.
|
||||
Future<List<LunaFirebaseBackupDocument>> getBackupEntries() async {
|
||||
if (!LunaFirebaseAuth().isSignedIn) return [];
|
||||
try {
|
||||
QuerySnapshot snapshot = await instance
|
||||
.collection('users/${LunaFirebaseAuth().uid}/backups')
|
||||
.orderBy('timestamp', descending: true)
|
||||
.get();
|
||||
return snapshot.docs
|
||||
.map<LunaFirebaseBackupDocument>((document) =>
|
||||
LunaFirebaseBackupDocument.fromQueryDocumentSnapshot(
|
||||
document as QueryDocumentSnapshot<Map<String, dynamic>>))
|
||||
.toList();
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to get backup list', error, stack);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/// Add the current device token to Firestore. Returns true if successful, and false on any error.
|
||||
Future<bool> addDeviceToken() async {
|
||||
if (!LunaFirebaseAuth().isSignedIn) return false;
|
||||
try {
|
||||
String? token = await LunaFirebaseMessaging.instance.getToken();
|
||||
instance.doc('users/${LunaFirebaseAuth().uid}').set({
|
||||
'devices': FieldValue.arrayUnion([token]),
|
||||
}, SetOptions(merge: true));
|
||||
return true;
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to add device token', error, stack);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:lunasea/core.dart';
|
||||
import 'package:lunasea/utils/profile_tools.dart';
|
||||
import 'package:lunasea/firebase/core.dart';
|
||||
import 'package:lunasea/system/platform.dart';
|
||||
|
||||
class LunaFirebaseMessaging {
|
||||
static const _VAPID_KEY =
|
||||
'BGCP2BO8JOTuvagaYl41btXiiC_XszsGCDduq6C-escc4xb2UMglX3RDojCY1YuGMAx2lXGVF-VYmTN3LQGvhYc';
|
||||
|
||||
static bool get isSupported {
|
||||
if (LunaFirebase.isSupported && !LunaPlatform.isWeb) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Returns an instance of [FirebaseMessaging].
|
||||
///
|
||||
/// Throws an error if [LunaFirebase.initialize] has not been called.
|
||||
static FirebaseMessaging get instance => FirebaseMessaging.instance;
|
||||
|
||||
/// Returns a [Stream] to handle any new messages that are received while the application is in the open and in foreground.
|
||||
Stream<RemoteMessage> get onMessage => FirebaseMessaging.onMessage;
|
||||
|
||||
/// Returns a [Stream] to handle any notifications that are tapped while the application is in the background (not terminated).
|
||||
Stream<RemoteMessage> get onMessageOpenedApp =>
|
||||
FirebaseMessaging.onMessageOpenedApp;
|
||||
|
||||
/// Returns the Firebase Cloud Messaging device token for this device.
|
||||
Future<String?> get token async => instance.getToken(vapidKey: _VAPID_KEY);
|
||||
|
||||
/// Request for permission to send a user notifications.
|
||||
///
|
||||
/// Returns true if permissions are allowed at either a full or provisional level.
|
||||
/// Returns false if permissions are denied or not determined.
|
||||
Future<bool> requestNotificationPermissions() async {
|
||||
try {
|
||||
NotificationSettings settings = await instance.requestPermission();
|
||||
switch (settings.authorizationStatus) {
|
||||
case AuthorizationStatus.authorized:
|
||||
case AuthorizationStatus.provisional:
|
||||
return true;
|
||||
case AuthorizationStatus.denied:
|
||||
case AuthorizationStatus.notDetermined:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
} catch (error, stack) {
|
||||
LunaLogger()
|
||||
.error('Failed to request notification permission', error, stack);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Return the current notification authorization status.
|
||||
Future<AuthorizationStatus> getAuthorizationStatus() async {
|
||||
return instance
|
||||
.getNotificationSettings()
|
||||
.then((settings) => settings.authorizationStatus);
|
||||
}
|
||||
|
||||
/// Returns true if permissions are allowed at either a full or provisional level.
|
||||
/// Returns false on any other status (denied, not determined, null, etc.).
|
||||
Future<bool> areNotificationsAllowed() async {
|
||||
return instance.getNotificationSettings().then((settings) {
|
||||
switch (settings.authorizationStatus) {
|
||||
case AuthorizationStatus.authorized:
|
||||
case AuthorizationStatus.provisional:
|
||||
return true;
|
||||
case AuthorizationStatus.denied:
|
||||
case AuthorizationStatus.notDetermined:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// Return a [StreamSubscription] that will show a notification banner on a newly received notification.
|
||||
///
|
||||
/// This listens on [FirebaseMessaging.onMessage], where the application must be open and in the foreground.
|
||||
StreamSubscription<RemoteMessage> registerOnMessageListener() {
|
||||
return onMessage.listen((message) {
|
||||
if (LunaSeaDatabase.ENABLE_IN_APP_NOTIFICATIONS.read()) return;
|
||||
|
||||
LunaModule? module = LunaModule.fromKey(message.data['module']);
|
||||
showLunaSnackBar(
|
||||
title: message.notification?.title ?? 'Unknown Content',
|
||||
message: message.notification?.body ?? LunaUI.TEXT_EMDASH,
|
||||
type: LunaSnackbarType.INFO,
|
||||
position: FlashPosition.top,
|
||||
duration: const Duration(seconds: 6, milliseconds: 750),
|
||||
showButton: module != null,
|
||||
buttonOnPressed: () async => _handleWebhook(message),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/// Returns a [StreamSubscription] that will handle messages/notifications that are opened while LunaSea is running in the background.
|
||||
///
|
||||
/// This listens on [FirebaseMessaging.onMessageOpenedApp], where the application must be open but in the background.
|
||||
StreamSubscription<RemoteMessage> registerOnMessageOpenedAppListener() =>
|
||||
onMessageOpenedApp.listen(_handleWebhook);
|
||||
|
||||
/// Check to see if there was an initial [RemoteMessage] available to be accessed.
|
||||
///
|
||||
/// If so, handles the notification webhook.
|
||||
Future<void> checkAndHandleInitialMessage() async {
|
||||
RemoteMessage? message =
|
||||
await FirebaseMessaging.instance.getInitialMessage();
|
||||
_handleWebhook(message);
|
||||
}
|
||||
|
||||
/// Shared webhook handler.
|
||||
Future<void> _handleWebhook(RemoteMessage? message) async {
|
||||
if (message == null || message.data.isEmpty) return;
|
||||
// Extract module
|
||||
LunaModule? module = LunaModule.fromKey(message.data['module']);
|
||||
if (module == null) {
|
||||
LunaLogger().warning(
|
||||
'Unknown module found inside of RemoteMessage: ${message.data['module'] ?? 'null'}',
|
||||
);
|
||||
return;
|
||||
}
|
||||
String profile = message.data['profile'] ?? '';
|
||||
if (profile.isEmpty) {
|
||||
LunaLogger().warning(
|
||||
'Invalid profile received in webhook: ${message.data['profile'] ?? 'null'}',
|
||||
);
|
||||
return;
|
||||
}
|
||||
bool result = LunaProfileTools().changeTo(profile, popToRootRoute: true);
|
||||
if (result) {
|
||||
module.handleWebhook(message.data);
|
||||
} else {
|
||||
showLunaErrorSnackBar(
|
||||
title: 'Unknown Profile',
|
||||
message: '"$profile" does not exist in LunaSea',
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
|
||||
|
||||
/// Stub that allows building the application but with Firebase disabled.
|
||||
class DefaultFirebaseOptions {
|
||||
static FirebaseOptions get currentPlatform {
|
||||
throw UnsupportedError('Firebase is not supported on this platform.');
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
import 'package:firebase_storage/firebase_storage.dart';
|
||||
import 'package:lunasea/core.dart';
|
||||
import 'package:lunasea/firebase/auth.dart';
|
||||
|
||||
class LunaFirebaseStorage {
|
||||
static const String _BACKUP_BUCKET = 'backup.lunasea.app';
|
||||
|
||||
/// Returns an instance of [FirebaseStorage] for the default bucket.
|
||||
///
|
||||
/// Throws an error if [LunaFirebase.initialize] has not been called.
|
||||
static FirebaseStorage get instanceDefault => FirebaseStorage.instance;
|
||||
|
||||
/// Returns an instance of [FirebaseStorage] for the backup bucket.
|
||||
///
|
||||
/// Throws an error if [LunaFirebase.initialize] has not been called.
|
||||
static FirebaseStorage get instanceBackup =>
|
||||
FirebaseStorage.instanceFor(bucket: _BACKUP_BUCKET);
|
||||
|
||||
/// Upload a backup configuration to Firebase storage.
|
||||
///
|
||||
/// If the user is not signed in, returns null.
|
||||
Future<bool> uploadBackup(String data, String id) async {
|
||||
if (!LunaFirebaseAuth().isSignedIn) return false;
|
||||
try {
|
||||
await instanceBackup
|
||||
.ref('${LunaFirebaseAuth().uid}/$id.lunasea')
|
||||
.putString(data);
|
||||
return true;
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to backup to Firebase', error, stack);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Delete a backup configuration from Firebase storage.
|
||||
///
|
||||
/// If the user is not signed in, returns null.
|
||||
Future<bool> deleteBackup(String? id) async {
|
||||
if (!LunaFirebaseAuth().isSignedIn) return false;
|
||||
try {
|
||||
await instanceBackup
|
||||
.ref('${LunaFirebaseAuth().uid}/$id.lunasea')
|
||||
.delete();
|
||||
return true;
|
||||
} catch (error, stack) {
|
||||
LunaLogger().error('Failed to delete backup from Firebase', error, stack);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Download a backup configuration from Firebase storage.
|
||||
///
|
||||
/// If the user is not signed in, returns null.
|
||||
Future<String?> downloadBackup(String? id) async {
|
||||
if (!LunaFirebaseAuth().isSignedIn) return null;
|
||||
try {
|
||||
Uint8List? data = await instanceBackup
|
||||
.ref('${LunaFirebaseAuth().uid}/$id.lunasea')
|
||||
.getData();
|
||||
return String.fromCharCodes(data!);
|
||||
} catch (error, stack) {
|
||||
LunaLogger()
|
||||
.error('Failed to download backup from Firebase', error, stack);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
export 'types/backup_document.dart';
|
||||
export 'types/response.dart';
|
||||
@@ -1,35 +0,0 @@
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
|
||||
class LunaFirebaseBackupDocument {
|
||||
final String? id;
|
||||
final int? timestamp;
|
||||
final String? title;
|
||||
final String? description;
|
||||
|
||||
LunaFirebaseBackupDocument({
|
||||
required this.id,
|
||||
required this.timestamp,
|
||||
required this.title,
|
||||
required this.description,
|
||||
});
|
||||
|
||||
factory LunaFirebaseBackupDocument.fromQueryDocumentSnapshot(
|
||||
QueryDocumentSnapshot<Map<String, dynamic>> document,
|
||||
) {
|
||||
return LunaFirebaseBackupDocument(
|
||||
id: document.data()['id'],
|
||||
timestamp: document.data()['timestamp'],
|
||||
title: document.data()['title'],
|
||||
description: document.data()['description'],
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJSON() {
|
||||
return <String, dynamic>{
|
||||
'id': id,
|
||||
'title': title,
|
||||
'timestamp': timestamp,
|
||||
'description': description,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
import 'package:firebase_auth/firebase_auth.dart';
|
||||
|
||||
class LunaFirebaseResponse {
|
||||
final bool state;
|
||||
final UserCredential? user;
|
||||
final FirebaseAuthException? error;
|
||||
|
||||
LunaFirebaseResponse({
|
||||
required this.state,
|
||||
this.user,
|
||||
this.error,
|
||||
});
|
||||
}
|
||||
149
lib/main.dart
149
lib/main.dart
@@ -1,149 +0,0 @@
|
||||
import 'package:device_preview/device_preview.dart';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:lunasea/core.dart';
|
||||
import 'package:lunasea/database/database.dart';
|
||||
import 'package:lunasea/database/tables/bios.dart';
|
||||
import 'package:lunasea/firebase/core.dart';
|
||||
import 'package:lunasea/firebase/firestore.dart';
|
||||
import 'package:lunasea/firebase/messaging.dart';
|
||||
import 'package:lunasea/modules/dashboard/routes/dashboard/route.dart'
|
||||
show HomeRouter;
|
||||
import 'package:lunasea/system/build.dart';
|
||||
import 'package:lunasea/system/cache/image/image_cache.dart';
|
||||
import 'package:lunasea/system/in_app_purchase/in_app_purchase.dart';
|
||||
import 'package:lunasea/system/localization.dart';
|
||||
import 'package:lunasea/system/network/network.dart';
|
||||
import 'package:lunasea/system/quick_actions/quick_actions.dart';
|
||||
import 'package:lunasea/system/window_manager/window_manager.dart';
|
||||
import 'package:lunasea/system/platform.dart';
|
||||
import 'package:lunasea/widgets/sheets/database_corruption/sheet.dart';
|
||||
import 'package:lunasea/widgets/sheets/changelog/sheet.dart';
|
||||
|
||||
/// LunaSea Entry Point: Initialize & Run Application
|
||||
///
|
||||
/// Runs app in guarded zone to attempt to capture fatal (crashing) errors
|
||||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
runZonedGuarded(
|
||||
() async {
|
||||
//LunaSea initialization
|
||||
await LunaDatabase().initialize();
|
||||
if (LunaFirebase.isSupported) await LunaFirebase().initialize();
|
||||
LunaLogger().initialize();
|
||||
LunaTheme().initialize();
|
||||
if (LunaWindowManager.isSupported) await LunaWindowManager().initialize();
|
||||
if (LunaNetwork.isSupported) LunaNetwork().initialize();
|
||||
if (LunaImageCache.isSupported) LunaImageCache().initialize();
|
||||
LunaRouter().initialize();
|
||||
if (LunaInAppPurchase.isSupported) LunaInAppPurchase().initialize();
|
||||
await LunaLocalization().initialize();
|
||||
// Run application
|
||||
return runApp(const LunaBIOS());
|
||||
},
|
||||
(error, stack) => LunaLogger().critical(error, stack),
|
||||
);
|
||||
}
|
||||
|
||||
class LunaBIOS extends StatelessWidget {
|
||||
const LunaBIOS({
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
LunaTheme theme = LunaTheme();
|
||||
LunaRouter router = LunaRouter();
|
||||
|
||||
return LunaState.providers(
|
||||
child: DevicePreview(
|
||||
enabled: kDebugMode && LunaPlatform.isDesktop,
|
||||
builder: (context) => EasyLocalization(
|
||||
supportedLocales: LunaLocalization().supportedLocales(),
|
||||
path: LunaLocalization.fileDirectory,
|
||||
fallbackLocale: LunaLocalization.fallbackLocale,
|
||||
startLocale: LunaLocalization.fallbackLocale,
|
||||
useFallbackTranslations: true,
|
||||
child: LunaBox.lunasea.watch(
|
||||
selectItems: [
|
||||
LunaSeaDatabase.THEME_AMOLED,
|
||||
LunaSeaDatabase.THEME_AMOLED_BORDER,
|
||||
],
|
||||
builder: (context, _) {
|
||||
return MaterialApp(
|
||||
localizationsDelegates: context.localizationDelegates,
|
||||
supportedLocales: context.supportedLocales,
|
||||
locale: context.locale,
|
||||
builder: DevicePreview.appBuilder,
|
||||
routes: router.routes,
|
||||
useInheritedMediaQuery: true,
|
||||
onGenerateRoute: LunaRouter.router.generator,
|
||||
navigatorKey: LunaState.navigatorKey,
|
||||
darkTheme: theme.activeTheme(),
|
||||
theme: theme.activeTheme(),
|
||||
scrollBehavior: LunaScrollBehavior(),
|
||||
title: 'LunaSea',
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class LunaOS extends StatefulWidget {
|
||||
const LunaOS({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => _State();
|
||||
}
|
||||
|
||||
class _State extends State<LunaOS> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
SchedulerBinding.instance.addPostFrameCallback(_boot);
|
||||
}
|
||||
|
||||
Future<void> _boot(Duration duration) async {
|
||||
LunaLanguage.current.use();
|
||||
_initNotifications();
|
||||
if (LunaQuickActions.isSupported) LunaQuickActions().initialize();
|
||||
|
||||
await _healthCheck();
|
||||
BIOSDatabase.FIRST_BOOT.update(false);
|
||||
}
|
||||
|
||||
Future<void> _initNotifications() async {
|
||||
if (LunaFirebaseMessaging.isSupported) {
|
||||
final messaging = LunaFirebaseMessaging();
|
||||
final firestore = LunaFirebaseFirestore();
|
||||
await messaging.requestNotificationPermissions();
|
||||
|
||||
firestore.addDeviceToken();
|
||||
messaging.checkAndHandleInitialMessage();
|
||||
messaging.registerOnMessageListener();
|
||||
messaging.registerOnMessageOpenedAppListener();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _healthCheck() async {
|
||||
final isLatest = LunaBuild().isLatestBuildVersion();
|
||||
final firstBoot = BIOSDatabase.FIRST_BOOT.read();
|
||||
|
||||
if (BIOSDatabase.DATABASE_CORRUPTION.read()) {
|
||||
DatabaseCorruptionSheet().show();
|
||||
BIOSDatabase.DATABASE_CORRUPTION.update(false);
|
||||
}
|
||||
|
||||
if (!firstBoot && !isLatest.item1) {
|
||||
ChangelogSheet().show();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => HomeRouter().widget();
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
import 'package:lunasea/deprecated/state/module_state.dart';
|
||||
import 'package:lunasea/database/tables/dashboard.dart';
|
||||
import 'package:lunasea/modules/dashboard/core/adapters/calendar_starting_type.dart';
|
||||
import 'package:lunasea/modules/dashboard/core/api/api.dart';
|
||||
import 'package:lunasea/modules/dashboard/core/api/data/abstract.dart';
|
||||
|
||||
class ModuleState extends LunaModuleState {
|
||||
ModuleState() {
|
||||
reset();
|
||||
}
|
||||
|
||||
@override
|
||||
void reset() {
|
||||
resetToday();
|
||||
resetAPI();
|
||||
resetUpcoming();
|
||||
}
|
||||
|
||||
CalendarStartingType _calendarStartingType =
|
||||
DashboardDatabase.CALENDAR_STARTING_TYPE.read();
|
||||
CalendarStartingType get calendarStartingType => _calendarStartingType;
|
||||
set calendarStartingType(CalendarStartingType calendarStartingType) {
|
||||
_calendarStartingType = calendarStartingType;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
API? _api;
|
||||
API? get api => _api;
|
||||
void resetAPI() {
|
||||
_api = API();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
DateTime? _today;
|
||||
DateTime? get today => _today;
|
||||
void resetToday() {
|
||||
_today = DateTime.now();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<Map<DateTime, List<CalendarData>>>? _upcoming;
|
||||
Future<Map<DateTime, List<CalendarData>>>? get upcoming => _upcoming;
|
||||
void resetUpcoming() {
|
||||
if (_api != null) _upcoming = _api!.getUpcoming(DateTime.now());
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:lunasea/database/tables/dashboard.dart';
|
||||
import 'package:lunasea/extensions/datetime.dart';
|
||||
import 'package:lunasea/vendor.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:lunasea/widgets/ui.dart';
|
||||
import 'package:lunasea/modules/dashboard/core/api/data/abstract.dart';
|
||||
import 'package:lunasea/modules/dashboard/core/state.dart';
|
||||
import 'package:lunasea/modules/dashboard/routes/dashboard/widgets/content_block.dart';
|
||||
import 'package:lunasea/modules/dashboard/routes/dashboard/widgets/navigation_bar.dart';
|
||||
|
||||
class ScheduleView extends StatefulWidget {
|
||||
final Map<DateTime, List<CalendarData>> events;
|
||||
|
||||
const ScheduleView({
|
||||
Key? key,
|
||||
required this.events,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<ScheduleView> createState() => _State();
|
||||
}
|
||||
|
||||
class _State extends State<ScheduleView> {
|
||||
late DateTime _today;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
DateTime _floored = context.read<ModuleState>().today!.floor();
|
||||
_today = _floored;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (widget.events.isEmpty) {
|
||||
return LunaListView(
|
||||
controller: HomeNavigationBar.scrollControllers[1],
|
||||
children: [
|
||||
LunaMessage.inList(text: 'dashboard.NoNewContent'.tr()),
|
||||
],
|
||||
);
|
||||
}
|
||||
return LunaListView(
|
||||
controller: HomeNavigationBar.scrollControllers[1],
|
||||
children: _buildSchedule().expand((e) => e).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
List<List<Widget>> _buildSchedule() {
|
||||
List<List<Widget>> days = [];
|
||||
List<DateTime> keys = widget.events.keys.toList();
|
||||
keys.sort();
|
||||
|
||||
for (var key in keys) {
|
||||
bool pastDays = DashboardDatabase.CALENDAR_SHOW_PAST_DAYS.read();
|
||||
bool dayInFuture = key.isAfter(_today.subtract(const Duration(days: 1)));
|
||||
bool hasEvents = widget.events[key]?.isNotEmpty ?? false;
|
||||
if ((pastDays || dayInFuture) && hasEvents) days.add(_buildDay(key));
|
||||
}
|
||||
|
||||
return days;
|
||||
}
|
||||
|
||||
List<Widget> _buildDay(DateTime day) {
|
||||
List<Widget> content = [];
|
||||
List<CalendarData> events = widget.events[day]!;
|
||||
for (final event in events) content.add(ContentBlock(event));
|
||||
|
||||
return [
|
||||
LunaHeader(text: DateFormat('EEEE / MMMM dd, y').format(day)),
|
||||
...content,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:lunasea/deprecated/router/module_router.dart';
|
||||
import 'package:lunasea/deprecated/router/page_router.dart';
|
||||
import 'package:lunasea/deprecated/router/router.dart';
|
||||
import 'package:lunasea/vendor.dart';
|
||||
import 'package:lunasea/modules/dashboard/routes/dashboard/route.dart';
|
||||
|
||||
enum Routes {
|
||||
HOME,
|
||||
}
|
||||
|
||||
extension RoutesExtension on Routes {
|
||||
String get path {
|
||||
switch (this) {
|
||||
case Routes.HOME:
|
||||
return '/dashboard';
|
||||
}
|
||||
}
|
||||
|
||||
DashboardPageRouter get router {
|
||||
switch (this) {
|
||||
case Routes.HOME:
|
||||
return HomeRouter();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Router extends LunaModuleRouter {
|
||||
@override
|
||||
void defineAllRoutes(FluroRouter router) {
|
||||
Routes.values.forEach((r) => r.router.defineRoute(router));
|
||||
}
|
||||
|
||||
@override
|
||||
GoRoute getRoutes() {
|
||||
return GoRoute(
|
||||
path: Routes.HOME.path,
|
||||
name: Routes.HOME.name,
|
||||
builder: (context, state) => const Home(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class DashboardPageRouter extends LunaPageRouter {
|
||||
DashboardPageRouter(String route) : super(route);
|
||||
|
||||
@override
|
||||
void noParameterRouteDefinition(
|
||||
FluroRouter router, {
|
||||
bool homeRoute = false,
|
||||
}) {
|
||||
router.define(
|
||||
fullRoute,
|
||||
handler: Handler(handlerFunc: (context, params) => widget()),
|
||||
transitionType: LunaRouter.transitionType,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void withParameterRouteDefinition(
|
||||
FluroRouter router,
|
||||
Widget Function(BuildContext?, Map<String, List<String>>) handlerFunc, {
|
||||
bool homeRoute = false,
|
||||
}) {
|
||||
router.define(
|
||||
fullRoute,
|
||||
handler: Handler(
|
||||
handlerFunc: (context, params) => handlerFunc(context, params),
|
||||
),
|
||||
transitionType: LunaRouter.transitionType,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
export 'external_modules/core.dart';
|
||||
export 'external_modules/routes.dart';
|
||||
@@ -1 +0,0 @@
|
||||
export 'core/router.dart';
|
||||
@@ -1,48 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:lunasea/core.dart';
|
||||
import 'package:lunasea/modules/external_modules.dart';
|
||||
|
||||
class ExternalModulesRouter extends LunaModuleRouter {
|
||||
@override
|
||||
void defineAllRoutes(FluroRouter router) {
|
||||
ExternalModulesHomeRouter().defineRoute(router);
|
||||
}
|
||||
|
||||
@override
|
||||
GoRoute getRoutes() {
|
||||
return GoRoute(path: '/external_modules');
|
||||
}
|
||||
}
|
||||
|
||||
abstract class ExternalModulesPageRouter extends LunaPageRouter {
|
||||
ExternalModulesPageRouter(String route) : super(route);
|
||||
|
||||
@override
|
||||
void noParameterRouteDefinition(
|
||||
FluroRouter router, {
|
||||
bool homeRoute = false,
|
||||
}) {
|
||||
router.define(
|
||||
fullRoute,
|
||||
handler: Handler(
|
||||
handlerFunc: (context, params) => widget(),
|
||||
),
|
||||
transitionType: LunaRouter.transitionType,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void withParameterRouteDefinition(
|
||||
FluroRouter router,
|
||||
Widget Function(BuildContext?, Map<String, List<String>>) handlerFunc, {
|
||||
bool homeRoute = false,
|
||||
}) {
|
||||
router.define(
|
||||
fullRoute,
|
||||
handler: Handler(
|
||||
handlerFunc: (context, params) => handlerFunc(context, params),
|
||||
),
|
||||
transitionType: LunaRouter.transitionType,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export 'routes/external_modules.dart';
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user