218 Commits

Author SHA1 Message Date
Jagandeep Brar
6ee0bf9a6f monorepo: consolidate all public LunaSea repositories 2025-04-02 21:53:39 -04:00
Jagandeep Brar
9490355792 release: v11.0.0
[skip ci]
2025-04-02 21:18:51 -04:00
Jagandeep Brar
5d069a537a release: v10.2.6
[skip ci]
2023-10-04 10:56:38 -04:00
Jagandeep Brar
60cdc3e0b0 release(testflight): beta
[skip ci]
2023-10-04 09:46:20 -04:00
Weblate (bot)
642af12404 chore(locale): translations update from Hosted Weblate (#768)
* Translated using Weblate (German)

Currently translated at 100.0% (19 of 19 strings)

Translation: LunaSea/Dashboard
Translate-URL: https://hosted.weblate.org/projects/lunasea/dashboard/de/

* Translated using Weblate (German)

Currently translated at 100.0% (220 of 220 strings)

Translation: LunaSea/Sonarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/sonarr/de/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (35 of 35 strings)

Translation: LunaSea/Search
Translate-URL: https://hosted.weblate.org/projects/lunasea/search/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (24 of 24 strings)

Translation: LunaSea/SABnzbd
Translate-URL: https://hosted.weblate.org/projects/lunasea/sabnzbd/es/

---------

Co-authored-by: redoXiD <arvidjonas2004@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2023-10-04 08:57:42 -04:00
Jagandeep Brar
3da56b0194 chore(flutter): upgrade to 3.13.6/a794cf2681 2023-10-04 08:56:05 -04:00
Jagandeep Brar
08228ef0f9 fix(sonarr): correctly support Sonarr v4 season posters 2023-08-29 22:57:15 -04:00
Jagandeep Brar
ea0fe19efc fix(sonarr): correctly sort missing content list in descending order 2023-08-27 18:30:14 -04:00
Weblate (bot)
bf5d0ba6ec chore(localization): translations update from Hosted Weblate
Co-authored-by: BeardedWatermelon <periklis.karantonis@gmail.com>
Co-authored-by: DragoPrime <emperordrago@gmail.com>
Co-authored-by: Dominique Schlabach <nickis1305@gmail.com>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
Co-authored-by: redoXiD <arvidjonas2004@gmail.com>

[skip ci]
2023-08-27 18:27:16 -04:00
Jagandeep Brar
55c417f761 fix(ui): upgrade to flash@3.0.5+1 2023-08-27 14:27:00 -04:00
Jagandeep Brar
8bd3368e99 chore(flutter): upgrade packages 2023-08-27 14:27:00 -04:00
Jagandeep Brar
69f094135c release: v10.2.5
[skip ci]
2023-07-03 12:16:36 -04:00
Jagandeep Brar
ce69e8ea90 release(testflight): beta
[skip ci]
2023-06-23 13:49:50 -04:00
Jagandeep Brar
d81052d817 fix(search): profile could not be changed on download prompt 2023-06-21 23:22:56 -04:00
Jagandeep Brar
1c18d007d3 chore(flutter): update packages
[skip ci]
2023-06-21 23:19:13 -04:00
Weblate (bot)
14e4f6a036 chore: translations update from Hosted Weblate (#760)
[skip ci]

Co-authored-by: 愿你多年归来仍是少年 <onestime@126.com>
Co-authored-by: Guillaume Chatelain <chatelain.guillaume@gmail.com>
2023-06-21 23:06:01 -04:00
Weblate (bot)
83dd953a06 chore: translations update from Hosted Weblate (#759)
Co-authored-by: Sulli <susu.leduc@gmail.com>
Co-authored-by: Jagandeep Brar <me@jagandeepbrar.io>
2023-06-06 22:17:42 -04:00
Jagandeep Brar
f3fdf6d5f3 chore(flutter): update packages 2023-05-25 12:26:56 -04:00
Jagandeep Brar
93d740bb9b release(testflight): beta
[skip ci]
2023-05-13 14:58:42 -04:00
Jagandeep Brar
85f8558e5d chore(locale): translations updates from Weblate
[skip ci]
2023-05-13 14:54:35 -04:00
Jagandeep Brar
896f24f5b6 chore(ci): automatically extract publisher and publisher name from signing certificate 2023-05-13 13:14:17 -04:00
Jagandeep Brar
d271412a99 chore(ci): update nwtgck/actions-netlify to v2.0 2023-05-13 12:55:09 -04:00
Jagandeep Brar
b1a513973d fix(ios): update App Store signing certificate 2023-05-13 12:11:16 -04:00
Jagandeep Brar
e2e1c7449b chore: regenerated plugin registrants 2023-05-13 01:54:50 -04:00
Jagandeep Brar
8e3c477bf7 fix(windows): revert Firebase packages to maintain Windows support 2023-05-12 23:04:27 -04:00
Jagandeep Brar
335aaa3acd fix(sonarr): remove duplicate episode file IDs on multi-select deletion 2023-05-12 21:20:09 -04:00
Jagandeep Brar
021a08e4e4 chore(flutter): upgrade to 3.10.0/d44b5a94c9 2023-05-12 21:18:43 -04:00
Jagandeep Brar
7ea7dfc2d6 chore(ci): disable provenance attestations for Docker builds 2023-05-01 09:26:14 -05:00
Jagandeep Brar
cfa78fb6ec chore(ci): update workflows to support arm64 build and push 2023-05-01 00:56:47 -05:00
Jagandeep Brar
89b0906eab feat(web): build multi-platform Docker image for amd64 and arm64 2023-05-01 00:11:33 -05:00
Jagandeep Brar
79d13889f2 feat(sonarr): re-implementation of multi-select episode actions 2023-05-01 01:10:20 -04:00
Jagandeep Brar
5adaf059c8 chore(fastlane): update match repository url
[skip ci]
2023-04-22 01:18:56 -04:00
Jagandeep Brar
44e2611008 chore(repo): update repository name to lowercase
[skip ci]
2023-04-22 01:15:16 -04:00
Jagandeep Brar
9d17eea143 chore: bump version to 10.2.5 2023-04-13 23:07:00 -04:00
Jagandeep Brar
ebf85f0f79 chore(scripts): automatically version pubspec and snapcraft configurations on npm versioning 2023-04-13 23:06:20 -04:00
Jagandeep Brar
5a04fd95ed release: v10.2.4
[skip ci]
2023-04-09 14:20:11 -04:00
Jagandeep Brar
e3a21d2817 chore: update changelog_stable.json
[skip ci]
2023-04-09 14:19:36 -04:00
Jagandeep Brar
50714fa603 release(testflight): beta
[skip ci]
2023-04-07 02:32:27 -04:00
Jagandeep Brar
fe3d41af57 refactor(flavors): remove candidate flavor and merge with beta 2023-04-07 01:46:04 -04:00
Jagandeep Brar
1304ae327d release(testflight): candidate
[skip ci]
2023-04-05 23:09:52 -04:00
Jagandeep Brar
aeb80fcf08 release(testflight): beta
[skip ci]
2023-04-05 12:28:53 -04:00
Jagandeep Brar
a44ec79b3d chore(ci): fallback to commit hash for build run-name 2023-04-05 11:30:08 -04:00
Jagandeep Brar
a15d09b455 chore(locale): regenerate localization assets 2023-04-05 11:26:50 -04:00
Weblate (bot)
3aa2cc974c chore(locale): translations update from Weblate (#751)
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Notis pap <notispap@hotmail.com>

[skip ci]
2023-04-05 11:25:06 -04:00
Jagandeep Brar
605002f5bd refactor: remove cupertino_icons and email_validator packages 2023-03-30 11:43:23 -04:00
Jagandeep Brar
2f94c42da1 refactor: remove riverpod state management 2023-03-30 11:43:23 -04:00
Jagandeep Brar
b65af75075 chore(locale): enable Greek (el) language 2023-03-30 04:12:40 -04:00
Weblate (bot)
4b149b58d0 chore(locale): translations update from Weblate
Co-authored-by: Notis pap <notispap@hotmail.com>
2023-03-30 04:10:41 -04:00
Jagandeep Brar
5ce12795e7 feat(settings): replace all strings with localizable strings 2023-03-30 04:07:10 -04:00
Jagandeep Brar
0f4ac9a893 feat(settings): add direct link to documentation for service notifications 2023-03-30 04:07:10 -04:00
Jagandeep Brar
4e243d6f30 release(testflight): beta
[skip ci]
2023-03-28 00:06:06 -04:00
Jagandeep Brar
568c28cd92 chore(ci): add run-name to build workflow
[skip ci]
2023-03-28 00:05:26 -04:00
Jagandeep Brar
3500d83477 fix(routing): handle pushing route which may return data 2023-03-27 17:41:23 -04:00
Jagandeep Brar
b515a0d14e chore(flutter): update packages 2023-03-27 16:42:31 -04:00
Jagandeep Brar
6a2e7d83f3 chore(locale): enable Slovak (sk) language 2023-03-27 16:39:07 -04:00
Jagandeep Brar
f1a82c06aa fix(images): utilize new technique to persistently cache images 2023-03-27 16:38:41 -04:00
Weblate (bot)
c5eace4352 chore(localization): translations update from Weblate
[skip ci]
2023-03-27 15:17:28 -04:00
Jagandeep Brar
781727abba fix(uiux): remove fading edge on horizontal scrollviews 2023-03-27 04:40:34 -04:00
Jagandeep Brar
7c8e17e59f chore: bump version to v10.2.4
[skip ci]
2023-03-27 04:36:15 -04:00
Jagandeep Brar
074e8fa756 release: v10.2.3
[skip ci]
2023-03-22 01:37:47 -04:00
Jagandeep Brar
228cc4140f release(testflight): candidate
[skip ci]
2023-03-21 23:04:17 -04:00
Jagandeep Brar
3f6d138b8d chore(ci): utilize flutterfire_cli 0.3.0-dev.16
[skip ci]
2023-03-21 19:21:52 -04:00
Jagandeep Brar
ac560ba655 release(testflight): beta
[skip ci]
2023-03-21 18:48:26 -04:00
Jagandeep Brar
c0403d7333 release(testflight): edge
[skip ci]
2023-03-21 16:41:18 -04:00
Jagandeep Brar
e591f93791 chore(ci): increase Upload to Play Store timeout 2023-03-21 13:31:43 -04:00
Jagandeep Brar
96abd83d98 chore: upgrade packages and re-integrate pods 2023-03-21 12:10:38 -04:00
Jagandeep Brar
28b9037ca5 release(testflight): edge
[skip ci]
2023-03-21 08:45:48 -04:00
Jagandeep Brar
3b2bb794c9 chore(macos): update Podfile.lock
[skip ci]
2023-03-21 08:43:53 -04:00
Jagandeep Brar
596eab4bad fix(links): use platform default method to laucnh URLs 2023-03-20 02:03:35 -04:00
Jagandeep Brar
fa01702362 release(testflight): candidate
[skip ci]
2023-03-18 15:24:24 -04:00
Jagandeep Brar
76525b201e release(testflight): beta
[skip ci]
2023-03-18 04:18:13 -04:00
Jagandeep Brar
26314ca5a5 chore(locale): generate localization assets
[skip ci]
2023-03-18 04:17:48 -04:00
Weblate (bot)
2f04edebfb chore: translations update from Weblate
Co-authored-by: cpt-kuesel <cpt-kuesel@tuta.io>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: 愿你多年归来仍是少年 <onestime@126.com>
Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: Uxose <nathan.renault@live.fr>
Co-authored-by: Zsigus Attila <zsigus.attila@gmail.com>
Co-authored-by: Carles Muñoz Gorriz <carlesmu@internautas.org>
Co-authored-by: Rémi Guerrero <remidu34070@hotmail.fr>
2023-03-18 00:57:41 -04:00
Jagandeep Brar
c53d83b22f release(testflight): beta
[skip ci]
2023-03-17 23:14:36 -04:00
Jagandeep Brar
aca5d0eb82 fix(http): correctly set content type for POST requests 2023-02-17 00:07:44 -05:00
Jagandeep Brar
26a35aadb1 chore(ci): always build using the latest Flutter stable release 2023-02-16 17:24:10 -05:00
Jagandeep Brar
8888795f27 chore(flutter): update packages 2023-02-16 17:22:58 -05:00
Jagandeep Brar
5cf1a06cec feat(tautulli): add ability to open media in Plex 2023-02-16 17:07:56 -05:00
Mário Franco
47ff2628a2 chore(android): rename development installation (#740)
[skip ci]
2023-02-16 16:29:44 -05:00
Jagandeep Brar
94488e2df8 chore(ci): update Fastlane match storage repository
[skip ci]
2023-02-10 21:53:13 -05:00
Jagandeep Brar
4e3dfbf794 release(testflight): beta
[skip ci]
2023-02-10 20:37:44 -05:00
Jagandeep Brar
6de806316e feat(tautulli): display audio language, subtitle language, and video dynamic range for activity 2023-01-27 19:33:18 -05:00
Jagandeep Brar
b98a0f8046 chore(ci): update to Flutter 3.7/b06b8b2710 2023-01-27 12:45:28 -05:00
Jagandeep Brar
449df1d104 chore: update Ruby packages 2023-01-27 12:41:55 -05:00
Jagandeep Brar
268b5e3693 chore: bump version to v10.2.3 2023-01-27 12:41:55 -05:00
Jagandeep Brar
8042c0475e fix(uiux): update bottom modal sheet package to support Flutter 3.7 2023-01-27 12:41:55 -05:00
Jagandeep Brar
6241ee4629 feat(flutter): replace Skia with Impeller rendering engine 2023-01-27 12:41:55 -05:00
Jagandeep Brar
d612ae221c fix(macos): set minimum platform version to 10.15 2023-01-27 12:41:55 -05:00
Jagandeep Brar
f1b831a118 feat(flutter): upgrade to Flutter 3.7/b06b8b2710 2023-01-27 12:41:55 -05:00
Jagandeep Brar
0b59b7202d release: v10.2.2
[skip ci]
2022-12-22 10:49:42 -06:00
Jagandeep Brar
d86a5a0c72 release(testflight): candidate
[skip ci]
2022-12-21 15:14:01 -06:00
Jagandeep Brar
7a6c9772f3 release(testflight): beta
[skip ci]
2022-12-21 14:25:41 -06:00
Weblate (bot)
b22b87b6d8 chore: translations update from Hosted Weblate (#723)
Co-authored-by: Gil <almontegil@gmail.com>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: 愿你多年归来仍是少年 <onestime@126.com>
2022-12-21 13:59:32 -05:00
Jagandeep Brar
d4774b0542 feat(android): add option to disable back action to open drawer
[skip ci]
2022-12-21 12:57:44 -06:00
Jagandeep Brar
e6d7e50a45 docs: remove documentation from main repository
[skip ci]
2022-12-18 01:38:04 -05:00
Jagandeep Brar
7ba4b2f018 release(testflight): beta
[skip ci]
2022-12-17 19:47:49 -05:00
Jagandeep Brar
4c99ecf927 fix(tautulli): cached or downloaded activity sessions could not be opened 2022-12-16 16:57:59 -05:00
Jagandeep Brar
edb645f887 fix(linux): install binaries to /usr/share instead of /usr/local/lib
[skip ci]
2022-11-30 16:35:28 -05:00
Jagandeep Brar
d688fe84ef release(testflight): beta
[skip ci]
2022-11-28 22:11:42 -05:00
Jagandeep Brar
c46924c996 feat(linux): include MD5 sums in Debian distributions 2022-11-27 13:34:18 -05:00
Jagandeep Brar
56f26e701e chore(flutter): upgrade Flutter packages 2022-11-27 13:34:18 -05:00
Jagandeep Brar
968fe9cbbc refactor(uiux): disable horizontal swiping/scrolling between pages 2022-11-27 13:34:18 -05:00
Jagandeep Brar
19f7ecf885 chore(flutter): upgrade to Flutter 3.3.9/8f2221fbef 2022-11-27 13:34:18 -05:00
Jagandeep Brar
3f10675422 fix(calendar): scroll to last past date with content when selected date has no content 2022-11-27 13:34:18 -05:00
Jagandeep Brar
746bcc5ac9 chore(ci): update using actions versions 2022-11-24 22:38:09 -05:00
Jagandeep Brar
721c1c957e chore(ci): set required iptables policy for Ubuntu 22.04 2022-11-24 22:26:14 -05:00
Jagandeep Brar
0e09821842 chore(ci): supply web-app-id to Firebase configuration tool 2022-11-24 22:00:27 -05:00
Jagandeep Brar
607ac4391a chore: bump version to v10.2.2 2022-11-24 21:52:43 -05:00
Jagandeep Brar
b1d01e02ca feat(linux): publish Linux builds as Debian archive (.deb)
[skip ci]
2022-11-24 21:51:21 -05:00
Jagandeep Brar
3858de8d65 chore(ci): install required Linux build tools
[skip ci]
2022-11-24 20:19:08 -05:00
Jagandeep Brar
a390a80ef1 feat(linux): publish Linux builds as tarball (.tar.gz)
[skip ci]
2022-11-24 19:50:50 -05:00
Jagandeep Brar
322ec55546 release: v10.2.1
[skip ci]
2022-11-06 18:40:32 -05:00
Jagandeep Brar
34169bb1ff release(testflight): candidate
[skip ci]
2022-11-05 01:32:23 -04:00
Jagandeep Brar
0f4aef0e32 release(testflight): beta
[skip ci]
2022-11-04 19:39:21 -04:00
Jagandeep Brar
cf5bfca265 chore(flutter): upgrade to Flutter 3.3.7/857bd6b74c 2022-11-04 16:53:53 -04:00
Jagandeep Brar
affac3abc6 chore(flutter): update packages
[skip ci]
2022-11-04 15:43:33 -04:00
Jagandeep Brar
9826c5604d chore(node): update packages
[ski ci]
2022-11-04 15:21:26 -04:00
Jagandeep Brar
ea7a8ffc22 chore(ruby): update to Ruby@2.7.6, update gems
[skip ci]
2022-11-04 15:20:21 -04:00
Jagandeep Brar
4cb8caaa1d release(testflight): candidate
[skip ci]
2022-10-26 14:12:21 -05:00
Jagandeep Brar
53cb7f6675 release(testflight): beta
[skip ci]
2022-10-26 13:06:00 -05:00
Jagandeep Brar
123ab7f6a7 chore(locale): generate localizations 2022-10-26 11:00:53 -05:00
Jagandeep Brar
caf054aea2 chore: update CONTRIBUTORS.md
[skip ci]
2022-10-26 11:00:23 -05:00
Weblate (bot)
125596498e chore(locale): translations update from Hosted Weblate (#712)
Co-authored-by: Robert <rob2310@yahoo.de>
Co-authored-by: Florin Voicu <florin.bkk@gmail.com>
Co-authored-by: fyu0h <biiigback@gmail.com>

[skip ci]
2022-10-26 11:57:35 -04:00
Jagandeep Brar
38f2eb4cb2 fix(firebase): inject service file for older OS versions 2022-10-26 11:52:20 -04:00
Jagandeep Brar
7d437d5c3a feat(web): support local filesystem read/save actions 2022-10-25 12:32:30 -04:00
Jagandeep Brar
3d794099a5 chore(flutter): upgrade packages 2022-10-22 14:17:09 -05:00
Jagandeep Brar
b7ceebcb67 fix(android): utilize Kotlin v1.7.20 & Gradle v7.1.2 2022-10-22 14:15:56 -05:00
Jagandeep Brar
25e0d05142 fix(android): support Android 13 filesystem access 2022-10-22 13:19:36 -05:00
Jagandeep Brar
250a494903 fix(android): revert applying Google Play Services plugin during gradle build
[skip ci]
2022-10-22 13:08:57 -05:00
Jagandeep Brar
b47ef16001 chore(fastlane): update gems
[skip ci]
2022-10-22 12:50:05 -05:00
Jagandeep Brar
71f597baa7 fix(android): apply Google Play Services plugin during gradle build
[skip ci]
2022-10-21 18:36:17 -05:00
Jagandeep Brar
abf117ac92 chore(ci): fix typo in workflow configuration 2022-10-21 14:47:47 -05:00
Jagandeep Brar
f3a3f222bd fix(firebase): upgrade to Firebase v10 (#717) 2022-10-21 15:45:52 -04:00
Jagandeep Brar
f9a2a1c85c chore(flutter): lock Flutter version during CI/CD builds 2022-10-20 15:56:42 -05:00
Jagandeep Brar
7d469e7bad chore(github): update issue template links
[skip ci]
2022-10-20 15:32:33 -05:00
Mário Franco
137a52ccd4 chore(build): rename Android debug build (#714)
[skip ci]
2022-10-20 16:18:59 -04:00
Jagandeep Brar
9a1769595d release(testflight): beta
[skip ci]
2022-09-28 14:03:10 -04:00
Jagandeep Brar
9b930493d7 chore(contributors): add @osjurso for translation
[skip ci]
2022-09-28 13:05:34 -04:00
Weblate (bot)
bfe5dc77a0 chore: translations update from Hosted Weblate (#706)
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
Co-authored-by: Olav Markus Sjursø <olav.markus@sjurso.no>
Co-authored-by: 愿你多年归来仍是少年 <onestime@126.com>

[skip ci]
2022-09-28 13:03:40 -04:00
Jagandeep Brar
3ac2c5d791 feat(calendar): remove option to show previous days in schedule view, now always shows them 2022-09-28 01:43:53 -04:00
Jagandeep Brar
f1226e5638 feat(calendar): scroll to selected date when switching from calendar to schedule view 2022-09-28 01:28:16 -04:00
Jagandeep Brar
ee91085b07 release(testflight): beta
[skip ci]
2022-09-27 22:59:34 -04:00
Jagandeep Brar
e287baf046 chore(window): do not initialize window manager in debug mode
[skip ci]
2022-09-27 22:57:36 -04:00
Jagandeep Brar
8788f76e5c chore(recovery): small refactoring of recovery mode implementation
[skip ci]
2022-09-27 22:53:49 -04:00
Jagandeep Brar
6eff6c902c fix(calendar): start to current date when past days are enabled 2022-09-27 02:03:21 -04:00
Jagandeep Brar
d9623e992d fix(uiux): add circular radius to linear progression bars 2022-09-26 21:02:50 -04:00
Jagandeep Brar
958e6f1568 refactor(uiux): remove forced-upper case on headers 2022-09-26 18:41:10 -04:00
Jagandeep Brar
f3931c6b08 fix(backup): edge-case where backup/restore would fail 2022-09-26 12:54:14 -04:00
Jagandeep Brar
3dd087e361 feat(modules): ability to set the boot module 2022-09-26 11:48:14 -04:00
Jagandeep Brar
ac838f99a9 refactor(settings): consolidate appearance, network, and localization pages 2022-09-26 11:44:07 -04:00
Jagandeep Brar
c9bd02b750 feat(radarr): support moving files when editing the storage path 2022-09-26 11:07:19 -04:00
Jagandeep Brar
cfbfb2b3ad docs: update platform restrictions
[skip ci]
2022-09-25 14:31:29 -04:00
Jagandeep Brar
bccd1a43c4 feat(-arr): button to open indexer information page 2022-09-23 23:51:56 -04:00
Jagandeep Brar
70ed750652 fix(calendar): label unreleased movies as unreleased instead of missing 2022-09-23 23:34:57 -04:00
Jagandeep Brar
c76418d26f feat(lidarr): add MusicBrainz to links 2022-09-23 23:25:02 -04:00
Jagandeep Brar
c062b3d786 feat: launch recovery mode on bootstrap failure 2022-09-23 17:13:37 -04:00
Jagandeep Brar
a9d551df5e chore: bump version to v10.2.1
[skip ci]
2022-09-22 14:55:24 -04:00
Jagandeep Brar
dc617ed151 chore(ci): do not overwrite PATH environmental variable
[skip ci]
2022-09-22 13:05:56 -04:00
Jagandeep Brar
9f31120cd5 release: v10.2.0
[skip ci]
2022-09-22 12:14:26 -04:00
Jagandeep Brar
e9c922ff39 chore(ci): notify Discord after successful S3 deployment
[skip ci]
2022-09-22 11:34:22 -04:00
Jagandeep Brar
2ab098962d chore(router): migrate to go_router v5
[skip ci]
2022-09-22 11:09:23 -04:00
Jagandeep Brar
863972cf86 release(testflight): candidate
[skip ci]
2022-09-22 11:06:29 -04:00
Jagandeep Brar
fd170106b4 release(testflight): beta
[skip ci]
2022-09-22 10:29:19 -04:00
Jagandeep Brar
af83820b85 chore(api): create stub APIs for remaining modules (#707) 2022-09-22 09:28:17 -04:00
Jagandeep Brar
a6be658164 feat(search): view download client queue via overlay sheet 2022-09-22 00:57:31 -04:00
Jagandeep Brar
0c59886657 feat(-arr): view download client queue via overlay sheet 2022-09-21 23:43:55 -04:00
Jagandeep Brar
a78aa001fa release(testflight): candidate
[skip ci]
2022-09-19 18:40:13 -04:00
Jagandeep Brar
1e94621ce6 release(testflight): beta
[skip ci]
2022-09-19 11:12:42 -04:00
Jagandeep Brar
e477ecafcc fix(sonarr): support Sonarr v4 API changes 2022-09-18 21:31:58 -04:00
Jagandeep Brar
da20cbb127 docs(contributors): add @carlesmu & @timrettop for translation
[skip ci]
2022-09-17 12:03:14 -04:00
Jagandeep Brar
fb5cd59d6b chore(locale): add support for Catalan
[skip ci]
2022-09-17 11:59:32 -04:00
Jagandeep Brar
d3d090e277 fix(resources): remove feedback board resource 2022-09-17 11:16:15 -04:00
Jagandeep Brar
3a5e19b02c fix(sheets): set default overlay theme for sheets, remove bottom radius clipping 2022-09-17 02:06:24 -04:00
Jagandeep Brar
83e8374c33 fix(android): support Android 13 notification prompt 2022-09-17 00:27:53 -04:00
Jagandeep Brar
82ef5f0c52 fix(notifications): correctly inject service worker for notification handling 2022-09-17 00:14:53 -04:00
Jagandeep Brar
7aae480722 fix(cache): add type-safety to LRU cache 2022-09-17 00:07:29 -04:00
Jagandeep Brar
750d96ec13 chore: upgrade to Flutter 3.3.2/a4ff2c53d8 2022-09-17 00:07:17 -04:00
Jagandeep Brar
35cba0ab27 chore: update node & ruby packages
[skip ci]
2022-09-15 15:38:22 -04:00
Jagandeep Brar
b23f8ad633 release(testflight): candidate
[skip ci]
2022-09-10 11:55:25 -04:00
Jagandeep Brar
85d9aff094 release(testflight): beta
[skip ci]
2022-09-10 11:54:26 -04:00
Jagandeep Brar
a8827b5c9e chore(ci): install Firebase configuration via pregenerated options via secrets 2022-09-08 17:33:21 -04:00
Jagandeep Brar
d76713dcd6 chore(ci): install xcodeproj gem during build 2022-09-08 15:13:57 -04:00
Jagandeep Brar
e3b771bed1 chore(ci): inject service worker only during web build 2022-09-08 14:33:17 -04:00
Jagandeep Brar
136cda5215 fix(settings): show notification settings area on web 2022-09-08 10:00:33 -04:00
Jagandeep Brar
579531c30a fix(web): correctly register notification service worker 2022-09-08 00:51:05 -04:00
Jagandeep Brar
dcb59667c1 chore: upgrade to Flutter 3.3.1/3efdf03e73 2022-09-08 00:47:58 -04:00
Jagandeep Brar
4b411107f7 feat(web): enable service worker processing of notifications
[skip ci]
2022-09-08 00:14:21 -04:00
Jagandeep Brar
c0810574ce chore(sabnzbd): remove cononical export files
[skip ci]
2022-09-07 23:55:41 -04:00
Jagandeep Brar
3c9d705f80 chore(wake_on_lan): refactor wake on LAN integration
[skip ci]
2022-09-07 23:44:07 -04:00
Jagandeep Brar
6f9e0e87ce fix(images): validate image availability before fading-in
[skip ci]
2022-09-07 23:40:08 -04:00
Jagandeep Brar
c4945351ca release(testflight): beta
[skip ci]
2022-09-03 02:22:19 -04:00
Jagandeep Brar
a1b736ae0c feat(sabnzbd): rewrite SABnzbd API interface
[skip ci]
2022-09-03 02:04:50 -04:00
David K
2adfe59bd5 refactor(remove logos): removes unused logo pngs 2022-09-02 19:43:39 -04:00
David K
113b294346 feat(logo): add Vectorized app logos 2022-09-02 19:43:39 -04:00
Jagandeep Brar
19133df94b release(testflight): beta
[skip ci]
2022-09-02 19:41:54 -04:00
Jagandeep Brar
731e3c93c8 chore(contributors): add @Slam4uk for translation
[skip ci]
2022-09-01 16:35:54 -04:00
Jagandeep Brar
a160f0941f feat(locale): support Croatian 2022-09-01 16:32:18 -04:00
Weblate (bot)
65d1478b00 chore: translations update from Hosted Weblate (#697)
Co-authored-by: Gil <almontegil@gmail.com>
Co-authored-by: 愿你多年归来仍是少年 <onestime@126.com>
Co-authored-by: Darinko Stojanovic <tee_feste.0t@icloud.com>
Co-authored-by: Александр Лахин <slam4uk@gmail.com>
2022-09-01 16:22:54 -04:00
Jagandeep Brar
b851b87515 chore(contributors): add @Irishsmurf for design
[skip ci]
2022-09-01 16:20:15 -04:00
David K
96b2b1b5b0 feat(android): add support for monochromatic adaptive icon (#701) 2022-09-01 16:18:53 -04:00
Jagandeep Brar
3d0c5209cb feat(settings): re-add option to disable Sentry logging 2022-09-01 16:14:10 -04:00
Jagandeep Brar
57bbb80a01 feat(logging): integrate Sentry logging support for all platforms 2022-09-01 16:14:10 -04:00
Jagandeep Brar
3593eb329b fix(notifications): enable in-app notifications config was inversed 2022-08-31 23:22:45 -04:00
Jagandeep Brar
f8dca60331 chore(android): target Android SDK 33 2022-08-31 23:22:45 -04:00
Jagandeep Brar
864082fd40 fix(scrolling): remove custom scrolling behaviour 2022-08-31 23:22:45 -04:00
Jagandeep Brar
b963ddf401 chore: upgrade to Flutter 3.3.0/5e9e0e0aa8 2022-08-31 23:22:45 -04:00
Jagandeep Brar
83d3ec42e3 chore(flutter): update packages 2022-08-30 09:29:39 -04:00
Jagandeep Brar
8ba4fb3b8d docs: add app ID to Algolia configuration
[skip ci]
2022-08-30 09:10:34 -04:00
Jagandeep Brar
383c728481 docs: remove Overseerr from docs homepage
[skip ci]
2022-08-30 09:07:46 -04:00
Jagandeep Brar
ea01a21189 docs: integrate Algolia search
[skip ci]
2022-08-30 09:06:25 -04:00
Jagandeep Brar
b812c7b4a1 fix(graphs): support fl_chart@0.55.1
[skip ci]
2022-08-29 23:25:38 -04:00
Jagandeep Brar
96b2067577 chore(refactor): move API models, types, controllers to root of module API
[skip ci]
2022-08-29 22:59:37 -04:00
Jagandeep Brar
1d4207ae51 feat(router): re-implementation of routing via go_router
[skip ci]
2022-08-29 22:51:21 -04:00
Jagandeep Brar
9960124d32 fix(database): prevent deadlock in database deletion actions 2022-08-29 14:56:37 -04:00
Jagandeep Brar
aed7e8526f release(testflight): candidate
[skip ci]
2022-08-21 19:20:25 -04:00
Jagandeep Brar
b67c916ac6 release(testflight): beta
[skip ci]
2022-08-21 18:52:13 -04:00
Jagandeep Brar
77b12bc969 release(testflight): edge
[skip ci]
2022-08-21 18:03:23 -04:00
Jagandeep Brar
11ae4a2644 chore(version): bump to 10.1.2
[skip ci]
2022-08-21 17:38:41 -04:00
2313 changed files with 36990 additions and 22896 deletions

View File

@@ -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"
}

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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'

View File

@@ -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 }}

View File

@@ -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 }}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 }}

View File

@@ -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 }}

View File

@@ -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 }}

View File

@@ -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
View File

@@ -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

View File

@@ -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

View File

@@ -1 +0,0 @@
2.6.8

72
.vscode/cspell.json vendored
View File

@@ -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"
]
}

View File

@@ -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.

View File

@@ -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.

View File

@@ -1,67 +0,0 @@
# Contributors
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-35-orange.svg?style=flat-square)](#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 -->

View File

@@ -1,59 +1,3 @@
# <img width="40px" src="./assets/images/branding_logo.png" alt="LunaSea"></img>&nbsp;&nbsp;LunaSea
# <img width="40px" src="./lunasea/assets/images/branding_logo.png" alt="LunaSea"></img>&nbsp;&nbsp;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
[![Discord](https://img.shields.io/discord/673591529834807358?label=Discord&style=flat)](https://www.lunasea.app/discord)
[![Reddit](https://img.shields.io/reddit/subreddit-subscribers/LunaSeaApp?label=r%2FLunaSeaApp&style=flat)](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
[![Translation status](https://hosted.weblate.org/widgets/lunasea/-/svg-badge.svg)](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.

View File

@@ -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

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
View File

@@ -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

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -1,3 +0,0 @@
---
redirect: /notifications/custom
---

View File

@@ -1,3 +0,0 @@
---
redirect: /notifications/lidarr
---

View File

@@ -1,3 +0,0 @@
---
redirect: /notifications/overseerr
---

View File

@@ -1,3 +0,0 @@
---
redirect: /notifications/radarr
---

View File

@@ -1,3 +0,0 @@
---
redirect: /notifications/sonarr
---

View File

@@ -1,3 +0,0 @@
---
redirect: /notifications/tautulli
---

View File

@@ -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>

View File

@@ -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.

View File

@@ -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)!

View File

@@ -1,8 +0,0 @@
---
title: NZBGet
description: How to configure and add NZBGet to LunaSea
---
# NZBGet
> Coming soon!

View File

@@ -1,8 +0,0 @@
---
title: Overseerr
description: How to configure and add Overseerr to LunaSea
---
# Overseerr
> Coming soon!

View File

@@ -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.

View File

@@ -1,8 +0,0 @@
---
title: SABnzbd
description: How to configure and add SABnzbd to LunaSea
---
# SABnzbd
> Coming soon!

View File

@@ -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.

View File

@@ -1,8 +0,0 @@
---
title: Tautulli
description: How to configure and add Tautulli to LunaSea
---
# Tautulli
> Coming soon!

View File

@@ -1,8 +0,0 @@
---
title: Wake on LAN
description: How to configure and add Wake on LAN to LunaSea
---
# Wake on LAN
> Coming soon!

View File

@@ -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

View File

@@ -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`
![Lidarr Notification Example](/assets/notification-lidarr-example.png)

View File

@@ -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`
![Overseerr Notification Example](/assets/notification-overseerr-example.png)

View File

@@ -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`
![Radarr Notification Example](/assets/notification-radarr-example.png)

View File

@@ -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`
![Sonarr Notification Example](/assets/notification-sonarr-example.png)

View File

@@ -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

View File

@@ -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!

View File

@@ -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!

View File

@@ -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!

View File

@@ -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!

View File

@@ -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!

View File

@@ -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!

View File

@@ -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"

View File

@@ -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"

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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")

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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(),
};
}

View File

@@ -1,6 +0,0 @@
import 'package:flutter/material.dart';
abstract class LunaModuleState extends ChangeNotifier {
/// Reset the state back to the default
void reset();
}

View File

@@ -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,
),
);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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,
);
}
}

View File

@@ -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;
}
}
}

View File

@@ -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',
);
}
}
}

View File

@@ -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.');
}
}

View File

@@ -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;
}
}
}

View File

@@ -1,2 +0,0 @@
export 'types/backup_document.dart';
export 'types/response.dart';

View File

@@ -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,
};
}
}

View File

@@ -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,
});
}

View File

@@ -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();
}

View File

@@ -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();
}
}

View File

@@ -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,
];
}
}

View File

@@ -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,
);
}
}

View File

@@ -1,2 +0,0 @@
export 'external_modules/core.dart';
export 'external_modules/routes.dart';

View File

@@ -1 +0,0 @@
export 'core/router.dart';

View File

@@ -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,
);
}
}

View File

@@ -1 +0,0 @@
export 'routes/external_modules.dart';

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