48 Commits

Author SHA1 Message Date
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
202 changed files with 3264 additions and 3599 deletions

View File

@@ -1,406 +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"
]
},
{
"login": "Irishsmurf",
"name": "David K",
"avatar_url": "https://avatars.githubusercontent.com/u/587220?v=4",
"profile": "http://www.paddez.com/",
"contributions": [
"design"
]
},
{
"login": "Slam4uk",
"name": "Slam4uk",
"avatar_url": "https://avatars.githubusercontent.com/u/78175288?v=4",
"profile": "https://github.com/Slam4uk",
"contributions": [
"translation"
]
},
{
"login": "timrettop",
"name": "Tim Potter",
"avatar_url": "https://avatars.githubusercontent.com/u/434913?v=4",
"profile": "https://github.com/timrettop",
"contributions": [
"translation"
]
},
{
"login": "carlesmu",
"name": "Carles Muñoz Gorriz",
"avatar_url": "https://avatars.githubusercontent.com/u/1310090?v=4",
"profile": "https://github.com/carlesmu",
"contributions": [
"translation"
]
},
{
"login": "osjurso",
"name": "Olav Markus Sjursø",
"avatar_url": "https://avatars.githubusercontent.com/u/17827103?v=4",
"profile": "https://github.com/osjurso",
"contributions": [
"translation"
]
},
{
"login": "fyu0h",
"name": "fyu0h",
"avatar_url": "https://avatars.githubusercontent.com/u/33602841?v=4",
"profile": "https://github.com/fyu0h",
"contributions": [
"translation"
]
},
{
"login": "johnflorin",
"name": "Florin",
"avatar_url": "https://avatars.githubusercontent.com/u/45756085?v=4",
"profile": "https://github.com/johnflorin",
"contributions": [
"translation"
]
},
{
"login": "tuzumbear",
"name": "tuzumbear",
"avatar_url": "https://avatars.githubusercontent.com/u/61370405?v=4",
"profile": "https://github.com/tuzumbear",
"contributions": [
"translation"
]
}
],
"contributorsPerLine": 8,
"projectName": "LunaSea",
"projectOwner": "JagandeepBrar",
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true,
"commitConvention": "none"
}

View File

@@ -4,7 +4,7 @@ contact_links:
url: https://www.lunasea.app/discord
about: Request new features and get support from the community
- name: Support via GitHub Discussions
url: https://github.com/JagandeepBrar/LunaSea/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

View File

@@ -1,28 +1,20 @@
name: 'Prepare for Deployment'
description: 'Setup all required dependencies and secrets for the given release channel'
name: "Prepare for Deployment"
description: "Setup all required dependencies and secrets for the given release channel"
inputs:
channel:
description: 'Release Channel'
description: "Release Channel"
required: true
# Secret Keys
appstore-connect-key:
description: 'App Store Connect API Key'
description: "App Store Connect API Key"
required: false
default: ''
ghcr-actor:
description: 'GitHub Container Registry Actor'
required: false
default: ''
ghcr-token:
description: 'GitHub Container Registry Token'
required: false
default: ''
default: ""
google-play-key:
description: 'Google Play Store API Key'
description: "Google Play Store API Key"
required: false
default: ''
default: ""
runs:
using: composite
@@ -43,25 +35,13 @@ runs:
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- name: Install XCode
if: ${{ inputs.channel == 'app-store' }}
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Set up Docker Buildx
if: ${{ inputs.channel == 'docker' }}
uses: docker/setup-buildx-action@v2
- name: Setup GitHub Package Registry
if: ${{ inputs.channel == 'docker' }}
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ inputs.ghcr-actor }}
password: ${{ inputs.ghcr-token }}
- name: Setup Secret Keys
shell: bash
run: |
@@ -79,7 +59,7 @@ runs:
shell: bash
run: |
cd ios && bundle install
- name: Setup macOS Platform
if: ${{ inputs.channel == 'app-store' }}
shell: bash

View File

@@ -1,4 +1,5 @@
name: Build
run-name: "Build Release: ${{ inputs.flavor || github.sha }}"
on:
push:
@@ -14,13 +15,12 @@ on:
options:
- edge
- beta
- candidate
- stable
jobs:
prepare:
name: Prepare
uses: JagandeepBrar/LunaSea/.github/workflows/prepare.yml@master
uses: JagandeepBrar/lunasea/.github/workflows/prepare.yml@master
with:
flavor: ${{ inputs.flavor }}
secrets:
@@ -29,8 +29,8 @@ jobs:
build-android:
name: Build Android
needs: [ prepare ]
uses: JagandeepBrar/LunaSea/.github/workflows/build_android.yml@master
needs: [prepare]
uses: JagandeepBrar/lunasea/.github/workflows/build_android.yml@master
with:
build-number: ${{ needs.prepare.outputs.build-number }}
secrets:
@@ -40,8 +40,8 @@ jobs:
build-ios:
name: Build iOS
needs: [ prepare ]
uses: JagandeepBrar/LunaSea/.github/workflows/build_ios.yml@master
needs: [prepare]
uses: JagandeepBrar/lunasea/.github/workflows/build_ios.yml@master
with:
build-number: ${{ needs.prepare.outputs.build-number }}
secrets:
@@ -57,16 +57,16 @@ jobs:
build-linux:
name: Build Linux
needs: [ prepare ]
uses: JagandeepBrar/LunaSea/.github/workflows/build_linux.yml@master
needs: [prepare]
uses: JagandeepBrar/lunasea/.github/workflows/build_linux.yml@master
with:
build-number: ${{ needs.prepare.outputs.build-number }}
build-version: ${{ needs.prepare.outputs.build-version }}
build-macos:
name: Build macOS
needs: [ prepare ]
uses: JagandeepBrar/LunaSea/.github/workflows/build_macos.yml@master
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 }}
@@ -87,8 +87,8 @@ jobs:
build-web:
name: Build Web
needs: [ prepare ]
uses: JagandeepBrar/LunaSea/.github/workflows/build_web.yml@master
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 }}
@@ -98,18 +98,16 @@ jobs:
build-windows:
name: Build Windows
needs: [ prepare ]
uses: JagandeepBrar/LunaSea/.github/workflows/build_windows.yml@master
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
needs: [prepare, build-android]
uses: JagandeepBrar/lunasea/.github/workflows/publish_android.yml@master
with:
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
build-motd: ${{ needs.prepare.outputs.build-motd }}
@@ -119,8 +117,8 @@ jobs:
publish-ios:
name: Publish iOS
needs: [ prepare, build-ios ]
uses: JagandeepBrar/LunaSea/.github/workflows/publish_ios.yml@master
needs: [prepare, build-ios]
uses: JagandeepBrar/lunasea/.github/workflows/publish_ios.yml@master
with:
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
build-motd: ${{ needs.prepare.outputs.build-motd }}
@@ -134,8 +132,8 @@ jobs:
publish-linux:
name: Publish Linux
needs: [ prepare, build-linux ]
uses: JagandeepBrar/LunaSea/.github/workflows/publish_linux.yml@master
needs: [prepare, build-linux]
uses: JagandeepBrar/lunasea/.github/workflows/publish_linux.yml@master
with:
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
secrets:
@@ -143,8 +141,8 @@ jobs:
publish-macos:
name: Publish macOS
needs: [ prepare, build-macos ]
uses: JagandeepBrar/LunaSea/.github/workflows/publish_macos.yml@master
needs: [prepare, build-macos]
uses: JagandeepBrar/lunasea/.github/workflows/publish_macos.yml@master
with:
build-flavor: ${{ needs.prepare.outputs.build-flavor }}
build-motd: ${{ needs.prepare.outputs.build-motd }}
@@ -158,8 +156,8 @@ jobs:
publish-web:
name: Publish Web
needs: [ prepare, build-web ]
uses: JagandeepBrar/LunaSea/.github/workflows/publish_web.yml@master
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 }}
@@ -168,8 +166,17 @@ jobs:
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
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 }}
@@ -183,13 +190,12 @@ jobs:
notify:
name: Notify
needs: [ prepare, publish-s3 ]
uses: JagandeepBrar/LunaSea/.github/workflows/notify.yml@master
needs: [prepare, publish-s3]
uses: JagandeepBrar/lunasea/.github/workflows/notify.yml@master
with:
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,4 +1,4 @@
name: 'Build Android'
name: "Build Android"
on:
workflow_call:
@@ -21,12 +21,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
platform: android
android-key-jks: ${{ secrets.KEY_JKS }}
android-key-properties: ${{ secrets.KEY_PROPERTIES }}
android-key-properties: ${{ secrets.KEY_PROPERTIES }}
- name: Build LunaSea
working-directory: ${{ github.workspace }}/android
@@ -43,12 +43,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
platform: android
android-key-jks: ${{ secrets.KEY_JKS }}
android-key-properties: ${{ secrets.KEY_PROPERTIES }}
android-key-properties: ${{ secrets.KEY_PROPERTIES }}
- name: Build LunaSea
working-directory: ${{ github.workspace }}/android

View File

@@ -1,4 +1,4 @@
name: 'Build iOS'
name: "Build iOS"
on:
workflow_call:
@@ -33,11 +33,11 @@ jobs:
runs-on: macos-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
platform: ios
match-ssh-private-key: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
match-ssh-private-key: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
- name: Build LunaSea
working-directory: ${{ github.workspace }}/ios
@@ -50,7 +50,7 @@ jobs:
MATCH_KEYCHAIN_NAME: ${{ secrets.MATCH_KEYCHAIN_NAME }}
MATCH_KEYCHAIN_PASSWORD: ${{ secrets.MATCH_KEYCHAIN_PASSWORD }}
run: bundle exec fastlane build_appstore build_number:${{ inputs.build-number }}
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:

View File

@@ -1,4 +1,4 @@
name: 'Build Linux'
name: "Build Linux"
on:
workflow_call:
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
platform: linux
@@ -25,7 +25,7 @@ jobs:
- name: Prepare Artifact
run: dart ${{github.workspace }}/scripts/generate_debian.dart "${{ inputs.build-version }}+${{ inputs.build-number }}"
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
@@ -37,7 +37,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
platform: linux
@@ -46,7 +46,7 @@ jobs:
- name: Prepare Artifact
run: tar czf output/lunasea-linux-amd64.tar.gz -C build/linux/x64/release/bundle/ .
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
@@ -58,14 +58,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
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
@@ -74,5 +74,3 @@ jobs:
with:
name: linux-snapcraft
path: ${{ github.workspace }}/output

View File

@@ -1,4 +1,4 @@
name: 'Build macOS'
name: "Build macOS"
on:
workflow_call:
@@ -44,12 +44,12 @@ jobs:
runs-on: macos-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
platform: macos
appstore-connect-key: ${{ secrets.APPLE_STORE_CONNECT_KEY }}
match-ssh-private-key: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
match-ssh-private-key: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
- name: Build LunaSea
working-directory: ${{ github.workspace }}/macos
@@ -77,12 +77,12 @@ jobs:
runs-on: macos-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
platform: macos
appstore-connect-key: ${{ secrets.APPLE_STORE_CONNECT_KEY }}
match-ssh-private-key: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
match-ssh-private-key: ${{ secrets.MATCH_SSH_PRIVATE_KEY }}
- name: Build LunaSea
working-directory: ${{ github.workspace }}/macos
@@ -110,7 +110,7 @@ jobs:
runs-on: macos-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
platform: macos

View File

@@ -1,4 +1,4 @@
name: 'Build Web'
name: "Build Web"
on:
workflow_call:
@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
firebase-service-worker: ${{ secrets.FIREBASE_SERVICE_WORKER }}
@@ -42,7 +42,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
platform: web
@@ -67,7 +67,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
platform: web
@@ -86,15 +86,18 @@ jobs:
if (process.env.BUILD_FLAVOR === 'stable') tags.push('latest');
return tags.map((tag) => `ghcr.io/jagandeepbrar/lunasea:${tag}`).join(',');
- name: Build LunaSea
uses: docker/build-push-action@v3
- name: Setup GitHub Package Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Build & Push LunaSea
uses: docker/build-push-action@v4
with:
context: .
outputs: type=docker,dest=${{ github.workspace}}/output/lunasea-web-docker.tar
platforms: linux/amd64,linux/arm64
provenance: false
push: true
tags: ${{ steps.tags.outputs.result }}
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: web-docker
path: ${{ github.workspace }}/output

View File

@@ -1,4 +1,4 @@
name: 'Build Windows'
name: "Build Windows"
on:
workflow_call:
@@ -7,10 +7,6 @@ on:
required: true
CODE_SIGNING_PASSWORD:
required: true
CODE_SIGNING_PUBLISHER:
required: true
CODE_SIGNING_PUBLISHER_NAME:
required: true
jobs:
build-app-package:
@@ -18,7 +14,7 @@ jobs:
runs-on: windows-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
platform: windows
@@ -27,7 +23,7 @@ jobs:
- name: Prepare Artifact
run: Compress-Archive -path ${{ github.workspace }}\build\windows\runner\Release\* ${{github.workspace}}\output\lunasea-windows-amd64.zip
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
@@ -39,7 +35,7 @@ jobs:
runs-on: windows-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
platform: windows
code-signing-certificate: ${{ secrets.CODE_SIGNING_CERTIFICATE }}
@@ -49,9 +45,7 @@ jobs:
flutter pub run msix:create `
--certificate-password=${{ secrets.CODE_SIGNING_PASSWORD }} `
--certificate-path=${{ github.workspace }}/keys/codesigning.pfx `
--output-path=${{ github.workspace }}/output `
--publisher=${{ secrets.CODE_SIGNING_PUBLISHER }} `
--publisher-display-name=${{ secrets.CODE_SIGNING_PUBLISHER_NAME }}
--output-path=${{ github.workspace }}/output
- name: Upload Artifact
uses: actions/upload-artifact@v3

View File

@@ -1,4 +1,4 @@
name: 'GitHub Issue Labels'
name: "GitHub Issue Labels"
on:
issues:
@@ -12,7 +12,7 @@ jobs:
uses: dessant/support-requests@v2
with:
github-token: ${{ github.token }}
support-label: 'feature request'
support-label: "feature request"
issue-comment: >
Hi @{issue-author}! We use the issue tracker exclusively
for bug reports and issues. However, this issue appears
@@ -20,13 +20,13 @@ jobs:
to request new features.
close-issue: true
lock-issue: true
issue-lock-reason: 'off-topic'
issue-lock-reason: "off-topic"
- name: Support
uses: dessant/support-requests@v2
with:
github-token: ${{ github.token }}
support-label: 'support'
support-label: "support"
issue-comment: >
Hi @{issue-author}! We use the issue tracker exclusively
for bug reports and issues. However, this issue appears
@@ -34,9 +34,9 @@ jobs:
- [Discord](https://www.lunasea.app/discord)
- [GitHub Discussions](https://github.com/JagandeepBrar/LunaSea/discussions)
- [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'
issue-lock-reason: "off-topic"

View File

@@ -15,8 +15,6 @@ on:
required: true
DISCORD_WEBHOOK_BETA:
required: true
DISCORD_WEBHOOK_CANDIDATE:
required: true
DISCORD_WEBHOOK_STABLE:
required: true
@@ -36,7 +34,6 @@ jobs:
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:
@@ -44,7 +41,6 @@ jobs:
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;
@@ -65,5 +61,5 @@ jobs:
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_AVATAR: https://raw.githubusercontent.com/JagandeepBrar/lunasea/master/assets/icon/icon.png
DISCORD_EMBEDS: ${{ steps.embed.outputs.result }}

View File

@@ -51,7 +51,7 @@ jobs:
run: |
COUNT=`git rev-list HEAD --count`
echo "commit-count=$COUNT" >> $GITHUB_OUTPUT
- name: Build Flavor
id: build-flavor
uses: actions/github-script@v6
@@ -64,7 +64,6 @@ jobs:
if (flavor) switch (flavor) {
case 'edge':
case 'beta':
case 'candidate':
case 'stable':
return flavor;
}
@@ -122,7 +121,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
platform: test
@@ -135,7 +134,7 @@ jobs:
export BUILD=${{ needs.build-details.outputs.build-number }}
export SENTRY_DSN=${{ secrets.SENTRY_DSN }}
flutter packages pub run environment_config:generate
- name: Generate Localization
run: dart ${{github.workspace }}/scripts/generate_localization.dart

View File

@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_deployment@master
with:
channel: play-store
google-play-key: ${{ secrets.GOOGLE_PLAY_API }}
@@ -44,11 +44,10 @@ jobs:
script: |
const ref = process.env.FLAVOR || 'edge';
switch (ref) {
case 'beta': return 'alpha';
case 'candidate': return 'beta';
case 'beta': return 'beta';
case 'stable': return 'production';
case 'edge':
default: return 'internal';
default: return 'alpha';
}
- name: Generate Changelog
@@ -58,7 +57,7 @@ jobs:
run: |
mkdir -p $OUTPUT_PATH
echo $MOTD > $OUTPUT_PATH/default.txt
- name: Deploy to Google Play Store
working-directory: ${{ github.workspace }}/android
env:

View File

@@ -30,7 +30,7 @@ jobs:
runs-on: macos-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_deployment@master
with:
channel: app-store
appstore-connect-key: ${{ secrets.APPLE_STORE_CONNECT_KEY }}

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_deployment@master
with:
channel: snapcraft

View File

@@ -30,7 +30,7 @@ jobs:
runs-on: macos-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_deployment@master
with:
channel: app-store
appstore-connect-key: ${{ secrets.APPLE_STORE_CONNECT_KEY }}

View File

@@ -31,7 +31,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_deployment@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_deployment@master
with:
channel: s3
@@ -109,7 +109,7 @@ jobs:
- name: Upload to S3 Bucket (Build Title)
uses: jakejarvis/s3-sync-action@v0.5.1
with:
args: --acl public-read --follow-symlinks
args: --acl public-read --follow-symlinks
env:
AWS_ACCESS_KEY_ID: ${{ secrets.S3_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }}
@@ -122,7 +122,7 @@ jobs:
- name: Upload to S3 Bucket (Latest)
uses: jakejarvis/s3-sync-action@v0.5.1
with:
args: --acl public-read --follow-symlinks
args: --acl public-read --follow-symlinks
env:
AWS_ACCESS_KEY_ID: ${{ secrets.S3_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY }}

View File

@@ -15,35 +15,12 @@ on:
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
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_deployment@master
with:
channel: netlify
@@ -64,14 +41,13 @@ jobs:
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
uses: nwtgck/actions-netlify@v2.0
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ steps.channel.outputs.result }}

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Setup Environment
uses: JagandeepBrar/LunaSea/.github/actions/prepare_for_build@master
uses: JagandeepBrar/lunasea/.github/actions/prepare_for_build@master
with:
firebase-token: ${{ secrets.FIREBASE_TOKEN }}
platform: test

76
.vscode/cspell.json vendored
View File

@@ -1,76 +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",
"microtask",
"msix",
"Newznab",
"NZBGet",
"Overseerr",
"Plex",
"podfile",
"prefill",
"Radarr",
"Riverpod",
"roboto",
"SABnzbd",
"scrollview",
"sksl",
"snapcraft",
"Sonarr",
"stickied",
"subheaders",
"subroutes",
"Tautulli",
"TestFlight",
"Trakt",
"typescale",
"unencrypted",
"unignore",
"Weblate",
"worktree"
]
}

View File

@@ -1,5 +0,0 @@
{
"yaml.schemas": {
"https://json.schemastore.org/github-issue-config.json": "file:///Users/jagandeepbrar/Git/LunaSea/.github/ISSUE_TEMPLATE/config.yml"
}
}

View File

@@ -2,271 +2,309 @@
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.2.3](https://github.com/JagandeepBrar/LunaSea/compare/v10.2.2...v10.2.3) (2023-03-22)
### [10.2.5](https://github.com/JagandeepBrar/lunasea/compare/v10.2.4...v10.2.5) (2023-07-03)
### Features
* **flutter:** replace Skia with Impeller rendering engine ([6241ee4](https://github.com/JagandeepBrar/LunaSea/commit/6241ee462989f1f65fa8f1e18378579e2e77197b))
* **flutter:** upgrade to Flutter 3.7/b06b8b2710 ([f1b831a](https://github.com/JagandeepBrar/LunaSea/commit/f1b831a118e56c480aae72042ee4eb7013f954b2))
* **tautulli:** add ability to open media in Plex ([5cf1a06](https://github.com/JagandeepBrar/LunaSea/commit/5cf1a06cec079aa66c77425c0ed8d4fa7897bbd3))
* **tautulli:** display audio language, subtitle language, and video dynamic range for activity ([6de8063](https://github.com/JagandeepBrar/LunaSea/commit/6de806316efaa61c5ddbac1b8f5b214949f0bcf8))
* **sonarr:** re-implementation of multi-select episode actions ([79d1388](https://github.com/JagandeepBrar/lunasea/commit/79d13889f2eb0668b1fbb4d29ea9b11b1d82d9bb))
* **web:** build multi-platform Docker image for amd64 and arm64 ([89b0906](https://github.com/JagandeepBrar/lunasea/commit/89b0906eab883bddb860583cc6e4bf86efd2b115))
### Bug Fixes
* **http:** correctly set content type for POST requests ([aca5d0e](https://github.com/JagandeepBrar/LunaSea/commit/aca5d0eb826b38ebeec33e3495045bf21e8a49c7))
* **links:** use platform default method to laucnh URLs ([596eab4](https://github.com/JagandeepBrar/LunaSea/commit/596eab4bad1aa183e3c0dfc8d20a32c15ecdb78d))
* **macos:** set minimum platform version to 10.15 ([d612ae2](https://github.com/JagandeepBrar/LunaSea/commit/d612ae221cac741b3a36893d4bc7f05f5055c7b8))
* **uiux:** update bottom modal sheet package to support Flutter 3.7 ([8042c04](https://github.com/JagandeepBrar/LunaSea/commit/8042c0475ecff05d9337842eef7cfe4117d05528))
* **ios:** update App Store signing certificate ([b1a5139](https://github.com/JagandeepBrar/lunasea/commit/b1a513973d16a1a17cf0805da6cdd8e7929072c9))
* **search:** profile could not be changed on download prompt ([d81052d](https://github.com/JagandeepBrar/lunasea/commit/d81052d81783df6d93d9f41e2c543782299e7067))
* **sonarr:** remove duplicate episode file IDs on multi-select deletion ([335aaa3](https://github.com/JagandeepBrar/lunasea/commit/335aaa3acd7ff7645018e305639586a25411771c))
* **windows:** revert Firebase packages to maintain Windows support ([8e3c477](https://github.com/JagandeepBrar/lunasea/commit/8e3c477bf7d8a0fa47276ba5bb2096f07c6dc69d))
### [10.2.2](https://github.com/JagandeepBrar/LunaSea/compare/v10.2.1...v10.2.2) (2022-12-22)
### [10.2.4](https://github.com/JagandeepBrar/lunasea/compare/v10.2.3...v10.2.4) (2023-04-09)
### Features
* **android:** add option to disable back action to open drawer ([d4774b0](https://github.com/JagandeepBrar/LunaSea/commit/d4774b054204546490ef9f78090e28303eefc1fc))
* **linux:** include MD5 sums in Debian distributions ([c46924c](https://github.com/JagandeepBrar/LunaSea/commit/c46924c99645a2d9c27e2d3532d30ecf93882e2a))
* **linux:** publish Linux builds as Debian archive (.deb) ([b1d01e0](https://github.com/JagandeepBrar/LunaSea/commit/b1d01e02ca4cdb8a2775700930ada2d1d40a1031))
* **linux:** publish Linux builds as tarball (.tar.gz) ([a390a80](https://github.com/JagandeepBrar/LunaSea/commit/a390a80ef1897d4c95812045a3472527ff38fd49))
* **settings:** add direct link to documentation for service notifications ([0f4ac9a](https://github.com/JagandeepBrar/lunasea/commit/0f4ac9a893d5b13a732db49e0bfc7b09fe7c05d9))
* **settings:** replace all strings with localizable strings ([5ce1279](https://github.com/JagandeepBrar/lunasea/commit/5ce12795e7223a543bd037151b1a3eaa484f2634))
### Bug Fixes
* **calendar:** scroll to last past date with content when selected date has no content ([3f10675](https://github.com/JagandeepBrar/LunaSea/commit/3f10675422b9a32c43f4f49c16b6e9723f267f50))
* **linux:** install binaries to /usr/share instead of /usr/local/lib ([edb645f](https://github.com/JagandeepBrar/LunaSea/commit/edb645f8871d8f3a59c122191e8d8219e9957924))
* **tautulli:** cached or downloaded activity sessions could not be opened ([4c99ecf](https://github.com/JagandeepBrar/LunaSea/commit/4c99ecf927e21538f875bb7ee93fc7aaf20de479))
* **images:** utilize new technique to persistently cache images ([f1a82c0](https://github.com/JagandeepBrar/lunasea/commit/f1a82c06aa58fe493af2b2b0bf9ef8a93011802b))
* **routing:** handle pushing route which may return data ([3500d83](https://github.com/JagandeepBrar/lunasea/commit/3500d83477880b8ee490132bc270e632af4a4bb1))
* **uiux:** remove fading edge on horizontal scrollviews ([781727a](https://github.com/JagandeepBrar/lunasea/commit/781727abbab0dc70d959c723c3d101e66430ac60))
### Tweaks
* **uiux:** disable horizontal swiping/scrolling between pages ([968fe9c](https://github.com/JagandeepBrar/LunaSea/commit/968fe9cbbc4aff3ae584682e462defbf09ea5699))
* **flavors:** remove candidate flavor and merge with beta ([fe3d41a](https://github.com/JagandeepBrar/lunasea/commit/fe3d41af57717b994e71370968404fc05f20f72b))
* remove cupertino_icons and email_validator packages ([605002f](https://github.com/JagandeepBrar/lunasea/commit/605002f5bd4b015791d3d1f260e03b4127c5020d))
* remove riverpod state management ([2f94c42](https://github.com/JagandeepBrar/lunasea/commit/2f94c42da1a97847be4a77e79d096eb0212a9657))
### [10.2.1](https://github.com/JagandeepBrar/LunaSea/compare/v10.2.0...v10.2.1) (2022-11-06)
### [10.2.3](https://github.com/JagandeepBrar/lunasea/compare/v10.2.2...v10.2.3) (2023-03-22)
### Features
* **-arr:** button to open indexer information page ([bccd1a4](https://github.com/JagandeepBrar/LunaSea/commit/bccd1a43c42b349901137f8fc605f393b51d541a))
* **calendar:** remove option to show previous days in schedule view, now always shows them ([3ac2c5d](https://github.com/JagandeepBrar/LunaSea/commit/3ac2c5d791f94208a4004d161bb046c24b698345))
* **calendar:** scroll to selected date when switching from calendar to schedule view ([f1226e5](https://github.com/JagandeepBrar/LunaSea/commit/f1226e563899cfc0950865a9734448d4e00601b9))
* launch recovery mode on bootstrap failure ([c062b3d](https://github.com/JagandeepBrar/LunaSea/commit/c062b3d786e55bc3ba7fe767dd946d73efbef64f))
* **lidarr:** add MusicBrainz to links ([c76418d](https://github.com/JagandeepBrar/LunaSea/commit/c76418d26f1a5f52f5cb1e46951f1cf6726508c2))
* **modules:** ability to set the boot module ([3dd087e](https://github.com/JagandeepBrar/LunaSea/commit/3dd087e361619889057a0b037b1eef35157a0988))
* **radarr:** support moving files when editing the storage path ([c9bd02b](https://github.com/JagandeepBrar/LunaSea/commit/c9bd02b75086579f60ad8987c42ab217c12f6d43))
* **web:** support local filesystem read/save actions ([7d437d5](https://github.com/JagandeepBrar/LunaSea/commit/7d437d5c3a34a8681c372570fc366e869f0b2090))
* **flutter:** replace Skia with Impeller rendering engine ([6241ee4](https://github.com/JagandeepBrar/lunasea/commit/6241ee462989f1f65fa8f1e18378579e2e77197b))
* **flutter:** upgrade to Flutter 3.7/b06b8b2710 ([f1b831a](https://github.com/JagandeepBrar/lunasea/commit/f1b831a118e56c480aae72042ee4eb7013f954b2))
* **tautulli:** add ability to open media in Plex ([5cf1a06](https://github.com/JagandeepBrar/lunasea/commit/5cf1a06cec079aa66c77425c0ed8d4fa7897bbd3))
* **tautulli:** display audio language, subtitle language, and video dynamic range for activity ([6de8063](https://github.com/JagandeepBrar/lunasea/commit/6de806316efaa61c5ddbac1b8f5b214949f0bcf8))
### Bug Fixes
* **android:** apply Google Play Services plugin during gradle build ([71f597b](https://github.com/JagandeepBrar/LunaSea/commit/71f597baa7c23102b711c3ca3c1ea5b2f8e1f5e9))
* **android:** revert applying Google Play Services plugin during gradle build ([250a494](https://github.com/JagandeepBrar/LunaSea/commit/250a49490333f4de726226dc4aa15a681f32a70c))
* **android:** support Android 13 filesystem access ([25e0d05](https://github.com/JagandeepBrar/LunaSea/commit/25e0d051422b399de8c90e0fc71e57349e3355b7))
* **android:** utilize Kotlin v1.7.20 & Gradle v7.1.2 ([b7ceebc](https://github.com/JagandeepBrar/LunaSea/commit/b7ceebcb679dbca935b6a1810c0c67a14002e358))
* **backup:** edge-case where backup/restore would fail ([f3931c6](https://github.com/JagandeepBrar/LunaSea/commit/f3931c6b08025a70920039e5cbbc9cf7120c0b36))
* **calendar:** label unreleased movies as unreleased instead of missing ([70ed750](https://github.com/JagandeepBrar/LunaSea/commit/70ed750652ff419e6fed659a0785adc5064654e7))
* **calendar:** start to current date when past days are enabled ([6eff6c9](https://github.com/JagandeepBrar/LunaSea/commit/6eff6c902cd7bcd523d83be09034098234679a79))
* **firebase:** inject service file for older OS versions ([38f2eb4](https://github.com/JagandeepBrar/LunaSea/commit/38f2eb4cb2a8e400ce2ecb0b6f2854469c9626fc))
* **firebase:** upgrade to Firebase v10 ([#717](https://github.com/JagandeepBrar/LunaSea/issues/717)) ([f3a3f22](https://github.com/JagandeepBrar/LunaSea/commit/f3a3f222bd56beb4e961817b18d71f01fb7c5e81))
* **uiux:** add circular radius to linear progression bars ([d9623e9](https://github.com/JagandeepBrar/LunaSea/commit/d9623e992d2ac2039eaa4f069c739d968c921cc6))
* **http:** correctly set content type for POST requests ([aca5d0e](https://github.com/JagandeepBrar/lunasea/commit/aca5d0eb826b38ebeec33e3495045bf21e8a49c7))
* **links:** use platform default method to laucnh URLs ([596eab4](https://github.com/JagandeepBrar/lunasea/commit/596eab4bad1aa183e3c0dfc8d20a32c15ecdb78d))
* **macos:** set minimum platform version to 10.15 ([d612ae2](https://github.com/JagandeepBrar/lunasea/commit/d612ae221cac741b3a36893d4bc7f05f5055c7b8))
* **uiux:** update bottom modal sheet package to support Flutter 3.7 ([8042c04](https://github.com/JagandeepBrar/lunasea/commit/8042c0475ecff05d9337842eef7cfe4117d05528))
### [10.2.2](https://github.com/JagandeepBrar/lunasea/compare/v10.2.1...v10.2.2) (2022-12-22)
### Features
* **android:** add option to disable back action to open drawer ([d4774b0](https://github.com/JagandeepBrar/lunasea/commit/d4774b054204546490ef9f78090e28303eefc1fc))
* **linux:** include MD5 sums in Debian distributions ([c46924c](https://github.com/JagandeepBrar/lunasea/commit/c46924c99645a2d9c27e2d3532d30ecf93882e2a))
* **linux:** publish Linux builds as Debian archive (.deb) ([b1d01e0](https://github.com/JagandeepBrar/lunasea/commit/b1d01e02ca4cdb8a2775700930ada2d1d40a1031))
* **linux:** publish Linux builds as tarball (.tar.gz) ([a390a80](https://github.com/JagandeepBrar/lunasea/commit/a390a80ef1897d4c95812045a3472527ff38fd49))
### Bug Fixes
* **calendar:** scroll to last past date with content when selected date has no content ([3f10675](https://github.com/JagandeepBrar/lunasea/commit/3f10675422b9a32c43f4f49c16b6e9723f267f50))
* **linux:** install binaries to /usr/share instead of /usr/local/lib ([edb645f](https://github.com/JagandeepBrar/lunasea/commit/edb645f8871d8f3a59c122191e8d8219e9957924))
* **tautulli:** cached or downloaded activity sessions could not be opened ([4c99ecf](https://github.com/JagandeepBrar/lunasea/commit/4c99ecf927e21538f875bb7ee93fc7aaf20de479))
### Tweaks
* **settings:** consolidate appearance, network, and localization pages ([ac838f9](https://github.com/JagandeepBrar/LunaSea/commit/ac838f99a9c839ce4e36e5eae80f1100e2787dc5))
* **uiux:** remove forced-upper case on headers ([958e6f1](https://github.com/JagandeepBrar/LunaSea/commit/958e6f156862c1092399649baa361cd955299c88))
* **uiux:** disable horizontal swiping/scrolling between pages ([968fe9c](https://github.com/JagandeepBrar/lunasea/commit/968fe9cbbc4aff3ae584682e462defbf09ea5699))
## [10.2.0](https://github.com/JagandeepBrar/LunaSea/compare/v10.1.1...v10.2.0) (2022-09-22)
### [10.2.1](https://github.com/JagandeepBrar/lunasea/compare/v10.2.0...v10.2.1) (2022-11-06)
### Features
* **-arr:** view download client queue via overlay sheet ([0c59886](https://github.com/JagandeepBrar/LunaSea/commit/0c59886657db0ed05a9d741c82689cb1272c6ad2))
* **android:** add support for monochromatic adaptive icon ([#701](https://github.com/JagandeepBrar/LunaSea/issues/701)) ([96b2b1b](https://github.com/JagandeepBrar/LunaSea/commit/96b2b1b5b010507dd7ece3421bf02eac6ba32486))
* **locale:** support Croatian ([a160f09](https://github.com/JagandeepBrar/LunaSea/commit/a160f0941f2e0c86d2e2fab5e01a577ceba2a8f3))
* **logging:** integrate Sentry logging support for all platforms ([57bbb80](https://github.com/JagandeepBrar/LunaSea/commit/57bbb80a0188d3bed9ca70846a89df6a3c2c0953))
* **logo:** add Vectorized app logos ([113b294](https://github.com/JagandeepBrar/LunaSea/commit/113b2943469464598ce07b931818c7e29c6cc63a))
* **router:** re-implementation of routing via go_router ([1d4207a](https://github.com/JagandeepBrar/LunaSea/commit/1d4207ae5106c2a0648b77a3b3ef6508665561e8))
* **sabnzbd:** rewrite SABnzbd API interface ([a1b736a](https://github.com/JagandeepBrar/LunaSea/commit/a1b736ae0c9bf754d913e86c69d15c27f256c413))
* **search:** view download client queue via overlay sheet ([a6be658](https://github.com/JagandeepBrar/LunaSea/commit/a6be658164fed7dd2411a167dec6b4c53eab70f0))
* **settings:** re-add option to disable Sentry logging ([3d0c520](https://github.com/JagandeepBrar/LunaSea/commit/3d0c5209cb3e796629817dee986634154e7ffe9e))
* **web:** enable service worker processing of notifications ([4b41110](https://github.com/JagandeepBrar/LunaSea/commit/4b411107f74f048e6f3d571845590a5d29720ac3))
* **-arr:** button to open indexer information page ([bccd1a4](https://github.com/JagandeepBrar/lunasea/commit/bccd1a43c42b349901137f8fc605f393b51d541a))
* **calendar:** remove option to show previous days in schedule view, now always shows them ([3ac2c5d](https://github.com/JagandeepBrar/lunasea/commit/3ac2c5d791f94208a4004d161bb046c24b698345))
* **calendar:** scroll to selected date when switching from calendar to schedule view ([f1226e5](https://github.com/JagandeepBrar/lunasea/commit/f1226e563899cfc0950865a9734448d4e00601b9))
* launch recovery mode on bootstrap failure ([c062b3d](https://github.com/JagandeepBrar/lunasea/commit/c062b3d786e55bc3ba7fe767dd946d73efbef64f))
* **lidarr:** add MusicBrainz to links ([c76418d](https://github.com/JagandeepBrar/lunasea/commit/c76418d26f1a5f52f5cb1e46951f1cf6726508c2))
* **modules:** ability to set the boot module ([3dd087e](https://github.com/JagandeepBrar/lunasea/commit/3dd087e361619889057a0b037b1eef35157a0988))
* **radarr:** support moving files when editing the storage path ([c9bd02b](https://github.com/JagandeepBrar/lunasea/commit/c9bd02b75086579f60ad8987c42ab217c12f6d43))
* **web:** support local filesystem read/save actions ([7d437d5](https://github.com/JagandeepBrar/lunasea/commit/7d437d5c3a34a8681c372570fc366e869f0b2090))
### Bug Fixes
* **android:** support Android 13 notification prompt ([83e8374](https://github.com/JagandeepBrar/LunaSea/commit/83e8374c33977c82096fcf8d5a4d94da5c291f8f))
* **cache:** add type-safety to LRU cache ([7aae480](https://github.com/JagandeepBrar/LunaSea/commit/7aae4807221184dbe1d02454f73998a0458dd7f6))
* **database:** prevent deadlock in database deletion actions ([9960124](https://github.com/JagandeepBrar/LunaSea/commit/9960124d3219e2ab72e14443a1a79a1bac6b2cd3))
* **graphs:** support fl_chart@0.55.1 ([b812c7b](https://github.com/JagandeepBrar/LunaSea/commit/b812c7b4a12b4766e04b5d4023b45320e6b7927c))
* **images:** validate image availability before fading-in ([6f9e0e8](https://github.com/JagandeepBrar/LunaSea/commit/6f9e0e87ce3d02dfff7dec439a2e975585c5b986))
* **notifications:** correctly inject service worker for notification handling ([82ef5f0](https://github.com/JagandeepBrar/LunaSea/commit/82ef5f0c529a9e30475f86f496fa63c18785e87c))
* **notifications:** enable in-app notifications config was inversed ([3593eb3](https://github.com/JagandeepBrar/LunaSea/commit/3593eb329b38fb4a5b776cf1b165ad6f463e371b))
* **resources:** remove feedback board resource ([d3d090e](https://github.com/JagandeepBrar/LunaSea/commit/d3d090e277f7dda7d4ef3d7808e7341cf79178fe))
* **scrolling:** remove custom scrolling behaviour ([864082f](https://github.com/JagandeepBrar/LunaSea/commit/864082fd4045ef7dea0e0ab6a17d41ca86015fcb))
* **settings:** show notification settings area on web ([136cda5](https://github.com/JagandeepBrar/LunaSea/commit/136cda5215ae1d44dcd898e8e8e0b1e1912b3a41))
* **sheets:** set default overlay theme for sheets, remove bottom radius clipping ([3a5e19b](https://github.com/JagandeepBrar/LunaSea/commit/3a5e19b02c048df21bd169a0a06f1e9ae741debb))
* **sonarr:** support Sonarr v4 API changes ([e477eca](https://github.com/JagandeepBrar/LunaSea/commit/e477ecafcce268d7de112f33711fc02a089a4206))
* **web:** correctly register notification service worker ([579531c](https://github.com/JagandeepBrar/LunaSea/commit/579531c30a17e2c8d53d011dbecf710f42598ec8))
* **android:** apply Google Play Services plugin during gradle build ([71f597b](https://github.com/JagandeepBrar/lunasea/commit/71f597baa7c23102b711c3ca3c1ea5b2f8e1f5e9))
* **android:** revert applying Google Play Services plugin during gradle build ([250a494](https://github.com/JagandeepBrar/lunasea/commit/250a49490333f4de726226dc4aa15a681f32a70c))
* **android:** support Android 13 filesystem access ([25e0d05](https://github.com/JagandeepBrar/lunasea/commit/25e0d051422b399de8c90e0fc71e57349e3355b7))
* **android:** utilize Kotlin v1.7.20 & Gradle v7.1.2 ([b7ceebc](https://github.com/JagandeepBrar/lunasea/commit/b7ceebcb679dbca935b6a1810c0c67a14002e358))
* **backup:** edge-case where backup/restore would fail ([f3931c6](https://github.com/JagandeepBrar/lunasea/commit/f3931c6b08025a70920039e5cbbc9cf7120c0b36))
* **calendar:** label unreleased movies as unreleased instead of missing ([70ed750](https://github.com/JagandeepBrar/lunasea/commit/70ed750652ff419e6fed659a0785adc5064654e7))
* **calendar:** start to current date when past days are enabled ([6eff6c9](https://github.com/JagandeepBrar/lunasea/commit/6eff6c902cd7bcd523d83be09034098234679a79))
* **firebase:** inject service file for older OS versions ([38f2eb4](https://github.com/JagandeepBrar/lunasea/commit/38f2eb4cb2a8e400ce2ecb0b6f2854469c9626fc))
* **firebase:** upgrade to Firebase v10 ([#717](https://github.com/JagandeepBrar/lunasea/issues/717)) ([f3a3f22](https://github.com/JagandeepBrar/lunasea/commit/f3a3f222bd56beb4e961817b18d71f01fb7c5e81))
* **uiux:** add circular radius to linear progression bars ([d9623e9](https://github.com/JagandeepBrar/lunasea/commit/d9623e992d2ac2039eaa4f069c739d968c921cc6))
### Tweaks
* **remove logos:** removes unused logo pngs ([2adfe59](https://github.com/JagandeepBrar/LunaSea/commit/2adfe59bd5cd289beb7f7c703fe26397310dbc90))
* **settings:** consolidate appearance, network, and localization pages ([ac838f9](https://github.com/JagandeepBrar/lunasea/commit/ac838f99a9c839ce4e36e5eae80f1100e2787dc5))
* **uiux:** remove forced-upper case on headers ([958e6f1](https://github.com/JagandeepBrar/lunasea/commit/958e6f156862c1092399649baa361cd955299c88))
### [10.1.1](https://github.com/JagandeepBrar/LunaSea/compare/v10.1.0...v10.1.1) (2022-08-21)
## [10.2.0](https://github.com/JagandeepBrar/lunasea/compare/v10.1.1...v10.2.0) (2022-09-22)
### Features
* **changelog:** do not show changelog on first boot of new installs ([52fd7fc](https://github.com/JagandeepBrar/LunaSea/commit/52fd7fca0c5076b4b98458d449a4b1f581726a52))
* **-arr:** view download client queue via overlay sheet ([0c59886](https://github.com/JagandeepBrar/lunasea/commit/0c59886657db0ed05a9d741c82689cb1272c6ad2))
* **android:** add support for monochromatic adaptive icon ([#701](https://github.com/JagandeepBrar/lunasea/issues/701)) ([96b2b1b](https://github.com/JagandeepBrar/lunasea/commit/96b2b1b5b010507dd7ece3421bf02eac6ba32486))
* **locale:** support Croatian ([a160f09](https://github.com/JagandeepBrar/lunasea/commit/a160f0941f2e0c86d2e2fab5e01a577ceba2a8f3))
* **logging:** integrate Sentry logging support for all platforms ([57bbb80](https://github.com/JagandeepBrar/lunasea/commit/57bbb80a0188d3bed9ca70846a89df6a3c2c0953))
* **logo:** add Vectorized app logos ([113b294](https://github.com/JagandeepBrar/lunasea/commit/113b2943469464598ce07b931818c7e29c6cc63a))
* **router:** re-implementation of routing via go_router ([1d4207a](https://github.com/JagandeepBrar/lunasea/commit/1d4207ae5106c2a0648b77a3b3ef6508665561e8))
* **sabnzbd:** rewrite SABnzbd API interface ([a1b736a](https://github.com/JagandeepBrar/lunasea/commit/a1b736ae0c9bf754d913e86c69d15c27f256c413))
* **search:** view download client queue via overlay sheet ([a6be658](https://github.com/JagandeepBrar/lunasea/commit/a6be658164fed7dd2411a167dec6b4c53eab70f0))
* **settings:** re-add option to disable Sentry logging ([3d0c520](https://github.com/JagandeepBrar/lunasea/commit/3d0c5209cb3e796629817dee986634154e7ffe9e))
* **web:** enable service worker processing of notifications ([4b41110](https://github.com/JagandeepBrar/lunasea/commit/4b411107f74f048e6f3d571845590a5d29720ac3))
### 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))
* **android:** support Android 13 notification prompt ([83e8374](https://github.com/JagandeepBrar/lunasea/commit/83e8374c33977c82096fcf8d5a4d94da5c291f8f))
* **cache:** add type-safety to LRU cache ([7aae480](https://github.com/JagandeepBrar/lunasea/commit/7aae4807221184dbe1d02454f73998a0458dd7f6))
* **database:** prevent deadlock in database deletion actions ([9960124](https://github.com/JagandeepBrar/lunasea/commit/9960124d3219e2ab72e14443a1a79a1bac6b2cd3))
* **graphs:** support fl_chart@0.55.1 ([b812c7b](https://github.com/JagandeepBrar/lunasea/commit/b812c7b4a12b4766e04b5d4023b45320e6b7927c))
* **images:** validate image availability before fading-in ([6f9e0e8](https://github.com/JagandeepBrar/lunasea/commit/6f9e0e87ce3d02dfff7dec439a2e975585c5b986))
* **notifications:** correctly inject service worker for notification handling ([82ef5f0](https://github.com/JagandeepBrar/lunasea/commit/82ef5f0c529a9e30475f86f496fa63c18785e87c))
* **notifications:** enable in-app notifications config was inversed ([3593eb3](https://github.com/JagandeepBrar/lunasea/commit/3593eb329b38fb4a5b776cf1b165ad6f463e371b))
* **resources:** remove feedback board resource ([d3d090e](https://github.com/JagandeepBrar/lunasea/commit/d3d090e277f7dda7d4ef3d7808e7341cf79178fe))
* **scrolling:** remove custom scrolling behaviour ([864082f](https://github.com/JagandeepBrar/lunasea/commit/864082fd4045ef7dea0e0ab6a17d41ca86015fcb))
* **settings:** show notification settings area on web ([136cda5](https://github.com/JagandeepBrar/lunasea/commit/136cda5215ae1d44dcd898e8e8e0b1e1912b3a41))
* **sheets:** set default overlay theme for sheets, remove bottom radius clipping ([3a5e19b](https://github.com/JagandeepBrar/lunasea/commit/3a5e19b02c048df21bd169a0a06f1e9ae741debb))
* **sonarr:** support Sonarr v4 API changes ([e477eca](https://github.com/JagandeepBrar/lunasea/commit/e477ecafcce268d7de112f33711fc02a089a4206))
* **web:** correctly register notification service worker ([579531c](https://github.com/JagandeepBrar/lunasea/commit/579531c30a17e2c8d53d011dbecf710f42598ec8))
### 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))
* **remove logos:** removes unused logo pngs ([2adfe59](https://github.com/JagandeepBrar/lunasea/commit/2adfe59bd5cd289beb7f7c703fe26397310dbc90))
### [10.0.3](https://github.com/JagandeepBrar/LunaSea/compare/v10.0.2...v10.0.3) (2022-05-26)
### [10.1.1](https://github.com/JagandeepBrar/lunasea/compare/v10.1.0...v10.1.1) (2022-08-21)
### 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))
* **changelog:** do not show changelog on first boot of new installs ([52fd7fc](https://github.com/JagandeepBrar/lunasea/commit/52fd7fca0c5076b4b98458d449a4b1f581726a52))
### 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))
* **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.0.2](https://github.com/JagandeepBrar/LunaSea/compare/v10.0.1...v10.0.2) (2022-04-12)
## [10.1.0](https://github.com/JagandeepBrar/lunasea/compare/v10.0.3...v10.1.0) (2022-08-21)
### 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))
* **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
* **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))
* **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
* **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))
* **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.1](https://github.com/JagandeepBrar/LunaSea/compare/v10.0.0...v10.0.1) (2022-03-25)
### [10.0.3](https://github.com/JagandeepBrar/lunasea/compare/v10.0.2...v10.0.3) (2022-05-26)
### 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))
* **-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
* **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))
* 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))
### 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)
### [10.0.2](https://github.com/JagandeepBrar/lunasea/compare/v10.0.1...v10.0.2) (2022-04-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))
* **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
* **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))
* **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 "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))
* **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))
---

View File

@@ -1,79 +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-43-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>
<tbody>
<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>
<td align="center"><a href="http://www.paddez.com/"><img src="https://avatars.githubusercontent.com/u/587220?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David K</b></sub></a><br /><a href="#design-Irishsmurf" title="Design">🎨</a></td>
<td align="center"><a href="https://github.com/Slam4uk"><img src="https://avatars.githubusercontent.com/u/78175288?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Slam4uk</b></sub></a><br /><a href="#translation-Slam4uk" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/timrettop"><img src="https://avatars.githubusercontent.com/u/434913?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Potter</b></sub></a><br /><a href="#translation-timrettop" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/carlesmu"><img src="https://avatars.githubusercontent.com/u/1310090?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Carles Muñoz Gorriz</b></sub></a><br /><a href="#translation-carlesmu" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/osjurso"><img src="https://avatars.githubusercontent.com/u/17827103?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Olav Markus Sjursø</b></sub></a><br /><a href="#translation-osjurso" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/fyu0h"><img src="https://avatars.githubusercontent.com/u/33602841?v=4?s=100" width="100px;" alt=""/><br /><sub><b>fyu0h</b></sub></a><br /><a href="#translation-fyu0h" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/johnflorin"><img src="https://avatars.githubusercontent.com/u/45756085?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Florin</b></sub></a><br /><a href="#translation-johnflorin" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/tuzumbear"><img src="https://avatars.githubusercontent.com/u/61370405?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tuzumbear</b></sub></a><br /><a href="#translation-tuzumbear" title="Translation">🌍</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->

View File

@@ -1,5 +1,5 @@
# Build
FROM debian:latest as build
FROM --platform=$BUILDPLATFORM debian:latest as build
ENV PATH="/usr/local/flutter/bin:/usr/local/flutter/bin/cache/dart-sdk/bin:$PATH"
RUN apt-get update
@@ -16,6 +16,6 @@ WORKDIR /lunasea/
RUN flutter build web
# Runtime
FROM nginx:alpine
LABEL org.opencontainers.image.source="https://github.com/JagandeepBrar/LunaSea"
FROM --platform=$TARGETPLATFORM nginx:alpine
LABEL org.opencontainers.image.source="https://github.com/JagandeepBrar/lunasea"
COPY --from=build /lunasea/build/web /usr/share/nginx/html

View File

@@ -18,7 +18,7 @@ LunaSea even comes with support for webhook-based push notifications, multiple i
## 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).
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)
@@ -31,7 +31,7 @@ Interested in using prerelease build channels of LunaSea? Learn the differences
## Getting Started
- [Build Guide](https://github.com/JagandeepBrar/LunaSea/wiki/Build-Guide)
- [Build Guide](https://github.com/JagandeepBrar/lunasea/wiki/Build-Guide)
- [Documentation](https://www.lunasea.app/docs)
- [Frequently Asked Questions](https://docs.lunasea.app/getting-started/frequently-asked-questions)
@@ -40,7 +40,7 @@ Interested in using prerelease build channels of LunaSea? Learn the differences
[![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 [Discord forum](https://www.lunasea.app/discord) for requests and general feedback.
**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 [Discord forum](https://www.lunasea.app/discord) for requests and general feedback.
- [Email](mailto:hello@lunasea.app)
- [Reddit](https://www.lunasea.app/reddit)

View File

@@ -3,22 +3,22 @@ GEM
specs:
CFPropertyList (3.0.6)
rexml
addressable (2.8.1)
addressable (2.8.4)
public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.731.0)
aws-sdk-core (3.170.1)
aws-partitions (1.781.0)
aws-sdk-core (3.175.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.63.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (1.67.0)
aws-sdk-core (~> 3, >= 3.174.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.119.1)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-s3 (1.126.0)
aws-sdk-core (~> 3, >= 3.174.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.2)
@@ -36,7 +36,7 @@ GEM
unf (>= 0.0.5, < 1.0.0)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.99.0)
excon (0.100.0)
faraday (1.10.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@@ -65,8 +65,8 @@ GEM
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.6)
fastlane (2.212.1)
fastimage (2.2.7)
fastlane (2.213.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -90,7 +90,7 @@ GEM
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (~> 2.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (~> 0.1.1)
plist (>= 3.1.0, < 4.0.0)
@@ -106,7 +106,7 @@ GEM
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.37.0)
google-apis-androidpublisher_v3 (0.44.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.0)
addressable (~> 2.5, >= 2.5.1)
@@ -137,7 +137,7 @@ GEM
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.3.0)
googleauth (1.5.2)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
@@ -150,12 +150,12 @@ GEM
httpclient (2.8.3)
jmespath (1.6.2)
json (2.6.3)
jwt (2.7.0)
jwt (2.7.1)
memoist (0.16.2)
mini_magick (4.12.0)
mini_mime (1.1.2)
multi_json (1.15.0)
multipart-post (2.0.0)
multipart-post (2.3.0)
nanaimo (0.3.0)
naturally (2.2.1)
optparse (0.1.1)

View File

@@ -1,46 +1,37 @@
{
"motd": "Welcome to LunaSea v10.2.3!\n\nThis update adds the ability to open Tautulli library items directly in Plex and more details about activity streams.",
"motd": "Welcome to LunaSea v10.2.5!\n\nThis releases adds support for multi-select actions on Sonarr episodes and fixes an issue preventing users from selecting a new active profile when triggering a download via search.",
"feat": {
"tautulli": [
"web": [
{
"commit": "5cf1a06cec079aa66c77425c0ed8d4fa7897bbd3",
"message": "add ability to open media in Plex"
},
{
"commit": "6de806316efaa61c5ddbac1b8f5b214949f0bcf8",
"message": "display audio language, subtitle language, and video dynamic range for activity"
"commit": "89b0906eab883bddb860583cc6e4bf86efd2b115",
"message": "build multi-platform Docker image for amd64 and arm64"
}
],
"flutter": [
"sonarr": [
{
"commit": "6241ee462989f1f65fa8f1e18378579e2e77197b",
"message": "replace Skia with Impeller rendering engine"
},
{
"commit": "f1b831a118e56c480aae72042ee4eb7013f954b2",
"message": "upgrade to Flutter 3.7.7/1837b5be5f"
"commit": "79d13889f2eb0668b1fbb4d29ea9b11b1d82d9bb",
"message": "multi-select episodes and trigger bulk actions"
}
]
},
"fix": {
"links": [
"search": [
{
"commit": "596eab4bad1aa183e3c0dfc8d20a32c15ecdb78d",
"message": "use platform default method to launch URLs"
}
],
"http": [
{
"commit": "aca5d0eb826b38ebeec33e3495045bf21e8a49c7",
"message": "correctly set content type for POST requests"
}
],
"macos": [
{
"commit": "d612ae221cac741b3a36893d4bc7f05f5055c7b8",
"message": "set minimum platform version to 10.15"
"commit": "d81052d81783df6d93d9f41e2c543782299e7067",
"message": "profile could not be changed on download prompt"
}
]
},
"refactor": {}
"refactor": {
"system": [
{
"commit": "f3fdf6d5f3583af14dd0046e09f9a84f8af2a972",
"message": "update packages"
},
{
"commit": "021a08e4e44009ffcfdd613a49d455855e7838bb",
"message": "upgrade to Flutter 3.10.5/45f6e00911"
}
]
}
}

118
assets/localization/el.json Normal file
View File

@@ -0,0 +1,118 @@
{
"dashboard.Friday": "Παρασκευή",
"dashboard.FutureDays": "Μελλοντικό χρόνο",
"dashboard.OneMonth": "Ένας μήνας",
"dashboard.Tuesday": "Τρίτη",
"dashboard.MinimumOfOneDay": "1 ημέρα το ελάχιστο",
"dashboard.Modules": "Ενότητες",
"dashboard.Monday": "Δευτέρα",
"dashboard.NoNewContent": "Τίποτα νέο",
"dashboard.OneWeek": "Μία εβδομάδα",
"dashboard.PastDays": "Παλαιότερες ημέρες",
"dashboard.Saturday": "Σάββατο",
"dashboard.Schedule": "Πρόγραμμα",
"dashboard.Sunday": "Κυριακή",
"dashboard.Thursday": "Πέμπτη",
"dashboard.Calendar": "Ημερολόγιο",
"dashboard.PastDaysDescription": "Τοποθετήσει τον αριθμό ημερών στο παρελθόν για εισαγωγή των εγγραφών του ημερολογίου.",
"dashboard.TwoWeeks": "Δύο εβδομάδες",
"dashboard.Wednesday": "Τετάρτη",
"dashboard.FutureDaysDescription": "Τοποθετήσει τον αριθμό ημερών στο μέλλον για εισαγωγή των εγγραφών του ημερολογίου.",
"lidarr.StartSearchForMissingAlbums": "Ξεκίνα αναζήτηση για άλμπουμ που λείπουν",
"lidarr.StartSearchFor": "Ξεκίνα αναζήτηση…",
"lunasea.Add": "Προσέθεσε",
"lunasea.Alpha": "Πρώτη",
"lunasea.AnErrorHasOccurred": "Κάποιο σφάλμα δημιουργήθηκε",
"lunasea.Ascending": "Αύξουσα",
"lunasea.BackUp": "Αντίγραφα ασφαλείας",
"lunasea.Beta": "Δοκιμαστική",
"lunasea.BlockView": "Εμφάνιση σε blocks",
"lunasea.BuyMeABeer": "Κέρασε με μια μπύρα",
"lunasea.BuyMeABurger": "Κέρασε με ένα burger",
"lunasea.BuyMeACoffee": "Κέρασε με ένα καφέ",
"lunasea.BuyMeASoda": "Κέρασε με ένα αναψυκτικό",
"lunasea.Cancel": "Ακύρωση",
"lunasea.Candidate": "Υποψήφιος",
"lunasea.ChangeProfiles": "Αλλαγή προφίλ",
"lunasea.Changelog": "Αλλαγές",
"lunasea.CheckLogsMessage": "Δες τις καταγραφές για περισσότερες λεπτομέρειες",
"lunasea.Chores": "Μικρό δουλειές",
"lunasea.Clear": "Καθαρισμός",
"lunasea.Close": "Κοντά",
"lunasea.ComingSoon": "Έρχονται σύντομα",
"lunasea.Copied": "Αντιγράφτηκε",
"lunasea.Critical": "Κρίσιμο",
"lunasea.Dashboard": "Ταμπλό",
"lunasea.Days": "{} ημέρες",
"lunasea.DaysAgo": "{} παλαιότερες ημέρες",
"lunasea.Debug": "Εντοπισμός σφαλμάτων",
"lunasea.Delete": "Διαγράφω",
"lunasea.Descending": "Φθίνουσα",
"lunasea.Develop": "Ανάπτυξη",
"lunasea.Disable": "Απενεργοποιώ",
"lunasea.Disabled": "Ανενεργός",
"lunasea.Dismiss": "Απόρριψη",
"lunasea.Docs": "Έγγραφα",
"lunasea.DownloadClient": "Πρόγραμμα λήψης",
"lunasea.Edge": "Χείλος",
"lunasea.Error": "Σφάλμα",
"lunasea.ExternalModules": "Εξωτερικές μονάδες",
"lunasea.Features": "Χαρακτηριστικά",
"lunasea.Fixes": "Επιδιορθώσεις",
"lunasea.FullChangelog": "Πλήρες ημερολόγιο αλλαγών",
"lunasea.GoBack": "Επιστροφή",
"lunasea.GoToSettings": "Πήγαινε στις ρυθμίσεις",
"lunasea.GridView": "Προβολή πλέγματος",
"lunasea.Home": "Αρχική σελίδα",
"lunasea.Hours": "{} ώρες",
"lunasea.HoursAgo": "{} ώρες πριν",
"lunasea.IncorrectEncryptionKey": "Λανθασμένο κλειδί κρυπτογράφησης",
"lunasea.Internal": "Εσωτερικό",
"lunasea.InvalidFileTypeSelected": "Επιλέχθηκε μη έγκυρος τύπος αρχείου",
"lunasea.JustNow": "Αμέσως",
"lunasea.Minutes": "{} Λεπτά",
"lunasea.MinutesAgo": "{} λεπτά πριν",
"lunasea.Module": "Μονάδα",
"overseerr.Audio": "Ήχος",
"overseerr.Approved": "Έγκριση",
"overseerr.Available": "Διαθέσιμο",
"overseerr.Declined": "Απορρίφθηκε",
"overseerr.Issues": "Θέματα",
"overseerr.NoIssues": "Κανένα Θέμα",
"overseerr.NoIssuesFound": "Κανένα θέμα δεν βρέθηκε",
"overseerr.NoRequests": "Χωρίς αιτήματα",
"overseerr.NoRequestsFound": "Κανένα αίτημα δεν βρέθηκε",
"overseerr.OneRequest": "1 Αίτημα",
"overseerr.Open": "Ανοιχτό",
"radarr.AddMovie": "Προσθήκη ταινίας",
"radarr.AddMovieAndSearch": "Προσθήκη + αναζήτηση",
"radarr.AddedTag": "Προσθήκη ετικέτας",
"radarr.Age": "Ηλικία",
"radarr.All": "Όλα",
"sabnzbd.All": "Όλα",
"sabnzbd.Ascending": "Αύξουσα",
"sabnzbd.Age": "Ηλικία",
"sabnzbd.CategoryDefault": "Προεπιλογή κατηγορίας",
"search.AddIndexer": "Προσθήκη Indexer",
"search.Age": "Ηλικία",
"search.AllSubcategories": "Όλες οι υποκατηγορίες",
"search.Alphabetical": "Αλφαβητικά",
"search.Category": "Κατηγορία",
"settings.AccountDeleted": "Διαγραφή λογαριασμού",
"settings.AccountDescription": "Ο LunaSea λογαριασμός σου",
"settings.AccountDeletedMessage": "Διαγραφή λογαριασμού LunaSea",
"settings.Account": "Λογαριασμός",
"sonarr.AddedSeries": "Προστέθηκε σειρά",
"sonarr.AddedTag": "Προσθήκη ετικέτας",
"sonarr.AddReleaseToBlocklist": "Προσθήκη έκδοσης στην λίστα αποκλεισμού",
"sonarr.AddedOn": "Προστέθηκε στις",
"sonarr.AddSeries": "Προσθήκη σειρών",
"tautulli.Activity": "Δραστηριότητα",
"tautulli.ActivityDetails": "Λεπτομέρειες δραστηριότητας",
"tautulli.ActivityRefreshRate": "Ρυθμός ανανέωσης δραστηριότητας",
"tautulli.Audio": "Ήχος",
"tautulli.BackingUpConfiguration": "Δημιουργία αντιγράφων ασφαλείας διαμόρφωσης…",
"wake_on_lan.MagicPacketSent": "Αποστολή Magic Packet",
"wake_on_lan.MagicPacketSentMessage": "Το μηχάνημα πρέπει να εκκινεί!",
"wake_on_lan.MagicPacketFailedToSend": "Αποτυχία αποστολής Magic Packet"
}

View File

@@ -57,6 +57,8 @@
"lunasea.DownloadClient": "Download Client",
"lunasea.Edge": "Edge",
"lunasea.Error": "Error",
"lunasea.EverySecond": "Every Second",
"lunasea.EverySeconds": "Every {} Seconds",
"lunasea.ExternalModules": "External Modules",
"lunasea.Features": "Features",
"lunasea.Fixes": "Fixes",
@@ -70,6 +72,7 @@
"lunasea.IncorrectEncryptionKey": "Incorrect encryption key",
"lunasea.Internal": "Internal",
"lunasea.InvalidFileTypeSelected": "Invalid File Type Selected",
"lunasea.Items": "{} Items",
"lunasea.JustNow": "Just Now",
"lunasea.Minutes": "{} Minutes",
"lunasea.MinutesAgo": "{} Minutes Ago",
@@ -85,6 +88,7 @@
"lunasea.OneDayAgo": "1 Day Ago",
"lunasea.OneHour": "1 Hour",
"lunasea.OneHourAgo": "1 Hour Ago",
"lunasea.OneItem": "1 Item",
"lunasea.OneMinute": "1 Minute",
"lunasea.OneMinuteAgo": "1 Minute Ago",
"lunasea.OneMonth": "1 Month",
@@ -113,6 +117,8 @@
"lunasea.Settings": "Settings",
"lunasea.Stable": "Stable",
"lunasea.StartingView": "Starting View",
"lunasea.ThankYou": "Thank You",
"lunasea.ThankYouMessage": "Thank you for supporting the open-source community!",
"lunasea.Today": "Today",
"lunasea.TransactionFailure": "Transaction Failure",
"lunasea.TryAgain": "Try Again",
@@ -155,11 +161,11 @@
"overseerr.UnknownUser": "Unknown User",
"overseerr.Users": "Users",
"overseerr.Video": "Video",
"radarr.Age": "Age",
"radarr.All": "All",
"radarr.AddedTag": "Added Tag",
"radarr.AddMovie": "Add Movie",
"radarr.AddMovieAndSearch": "Add + Search",
"radarr.AddedTag": "Added Tag",
"radarr.Age": "Age",
"radarr.All": "All",
"radarr.Alphabetical": "Alphabetical",
"radarr.Approved": "Approved",
"radarr.Audio": "Audio",
@@ -181,15 +187,17 @@
"radarr.DigitalRelease": "Digital Release",
"radarr.DirectoryNotFound": "Directory Not Found",
"radarr.Discover": "Discover",
"radarr.DiscoverSuggestions": "Discover Suggestions",
"radarr.DiscoverSuggestionsDescription": "Add Suggested Releases in Discover",
"radarr.Disks": "Disks",
"radarr.DownloadFailed": "Download Failed",
"radarr.DownloadIgnored": "Download Ignored",
"radarr.DynamicRange": "Dynamic Range",
"radarr.EditMovie": "Edit Movie",
"radarr.FPS": "FPS",
"radarr.FailedToAddTag": "Failed to Add Tag",
"radarr.FileBrowser": "File Browser…",
"radarr.FilterCatalogue": "Filter Catalogue",
"radarr.FPS": "FPS",
"radarr.GrabbedFrom": "Grabbed from {}",
"radarr.History": "History",
"radarr.HistoryDescription": "View Recent Activity",
@@ -206,30 +214,31 @@
"radarr.MinimumAvailability": "Minimum Availability",
"radarr.Missing": "Missing",
"radarr.Monitor": "Monitor",
"radarr.MonitorMovie": "Monitor Movie",
"radarr.Monitored": "Monitored",
"radarr.MonitoredDescription": "Monitor for new releases",
"radarr.MonitorMovie": "Monitor Movie",
"radarr.More": "More",
"radarr.Move": "Move",
"radarr.MoveFiles": "Move Files",
"radarr.MoveFilesDescription": "Would you like to move the files?",
"radarr.MoveFull": "Move Files",
"radarr.Movie": "Movie",
"radarr.Movies": "Movies",
"radarr.MovieDetails": "Movie Details",
"radarr.MovieFileDeleted": "Movie File Deleted",
"radarr.MovieFileRenamed": "Movie File Renamed",
"radarr.MovieImported": "Movie Imported ({})",
"radarr.MovieNotFound": "Movie Not Found",
"radarr.MoviePath": "Movie Path",
"radarr.Movies": "Movies",
"radarr.NoDisksFound": "No Disks Found",
"radarr.NoFilesFound": "No Files Found",
"radarr.NoHistoryFound": "No History Found",
"radarr.NoTagsFound": "No Tags Found",
"radarr.NoMoviesFound": "No Movies Found",
"radarr.NoResultsFound": "No Results Found",
"radarr.NoRootFoldersFound": "No Root Folders Found",
"radarr.NoSubdirectoriesFound": "No Subdirectories Found",
"radarr.NoSummaryIsAvailable": "No summary is available.",
"radarr.NoTagsFound": "No Tags Found",
"radarr.Other": "Other",
"radarr.ParentDirectory": "Parent Directory",
"radarr.PhysicalRelease": "Physical Release",
@@ -237,18 +246,19 @@
"radarr.QualityProfile": "Quality Profile",
"radarr.Queue": "Queue",
"radarr.QueueDescription": "View Active & Queued Content",
"radarr.QueueSize": "Queue Size",
"radarr.Quick": "Quick",
"radarr.RefreshMovie": "Refresh Movie",
"radarr.Rejected": "Rejected",
"radarr.Releases": "Releases",
"radarr.Released": "Released",
"radarr.ReleasedToday": "Released Today",
"radarr.Releases": "Releases",
"radarr.RemoveMovie": "Remove Movie",
"radarr.Resolution": "Resolution",
"radarr.RootFolder": "Root Folder",
"radarr.RootFolders": "Root Folders",
"radarr.Runtime": "Runtime",
"radarr.RunRSSSync": "Run RSS Sync",
"radarr.Runtime": "Runtime",
"radarr.ScanType": "Scan Type",
"radarr.Search": "Search",
"radarr.SearchAllMissing": "Search All Missing",
@@ -271,8 +281,8 @@
"radarr.Type": "Type",
"radarr.UnmappedFolder": "1 Unmapped Folder",
"radarr.UnmappedFolders": "{} Unmapped Folders",
"radarr.Unmonitored": "Unmonitored",
"radarr.UnmonitorMovie": "Unmonitor Movie",
"radarr.Unmonitored": "Unmonitored",
"radarr.Unreleased": "Unreleased",
"radarr.Upcoming": "Upcoming",
"radarr.UpdateLibrary": "Update Library",
@@ -306,25 +316,39 @@
"sabnzbd.ShutdownSABnzbd": "Shutdown SABnzbd",
"sabnzbd.StandbyPC": "Standby PC",
"sabnzbd.Stop": "Stop",
"search.AddIndexer": "Add Indexer",
"search.Age": "Age",
"search.AllSubcategories": "All Subcategories",
"search.Alphabetical": "Alphabetical",
"search.Category": "Category",
"search.Categories": "Categories",
"search.Comments": "Comments",
"search.DeleteIndexer": "Delete Indexer",
"search.Download": "Download",
"search.Downloading": "Downloading…",
"search.DownloadingNZBToDevice": "Downloading NZB to your device",
"search.DownloadToDevice": "Download to Device",
"search.EditIndexer": "Edit Indexer",
"search.FailedToAddIndexer": "Failed to Add indexer",
"search.FailedToDownloadNZB": "Failed to Download NZB",
"search.FailedToSend": "Failed to Send",
"search.HideAdultCategories": "Hide Adult Categories",
"search.HideAdultCategoriesDescription": "Hide Adult Content",
"search.IndexerAPIHost": "Indexer API Host",
"search.IndexerAPIKey": "Indexer API Key",
"search.IndexerAdded": "Indexer Added",
"search.IndexerDeleted": "Indexer Deleted",
"search.IndexerNotFound": "Indexer Not Found",
"search.NoCategoriesFound": "No Categories Found",
"search.NoIndexersFound": "No Indexers Found",
"search.NoResultsFound": "No Results Found",
"search.NoSubcategoriesFound": "No Subcategories Found",
"search.Results": "Results",
"search.Search": "Search",
"search.SentNZBData": "Sent NZB Data",
"search.SentTo": "Sent to {}",
"search.ShowLinks": "Show Links",
"search.ShowLinksDescription": "Show Download and Comments Links",
"search.Size": "Size",
"search.Subcategories": "Subcategories",
"settings.Account": "Account",
@@ -343,6 +367,8 @@
"settings.AddProfileDescription": "Add a New Profile",
"settings.AddedProfile": "Added Profile",
"settings.AllFieldsAreRequired": "All fields are required",
"settings.AllLogs": "All Logs",
"settings.AllLogsDescription": "View Logs of All Types",
"settings.AmoledTheme": "AMOLED Theme",
"settings.AmoledThemeBorders": "AMOLED Theme Borders",
"settings.AmoledThemeBordersDescription": "Add Subtle Borders Across the UI",
@@ -381,25 +407,35 @@
"settings.BuildChannels": "Build Channels",
"settings.BuildChannelsDescription": "Learn About Additional Build Channels",
"settings.CalendarSettings": "Calendar Settings",
"settings.CalendarSettingsDescription": "Customize the Unified Calendar",
"settings.ChangedProfile": "Changed Profile",
"settings.Channel": "Channel",
"settings.Class": "Class",
"settings.CleanSlate": "Clean Slate",
"settings.Clear": "Clear",
"settings.ClearConfiguration": "Clear Configuration",
"settings.ClearConfigurationHint1": "Are you sure you want to clear your configuration?",
"settings.ClearConfigurationHint2": "You will be starting from a clean slate, please ensure you backup your current configuration first!",
"settings.ClearConfigurationHint3": "If you are signed into a LunaSea account, you will be signed out.",
"settings.ClearImageCache": "Clear Image Cache",
"settings.ClearImageCacheDescription": "Clear Images From Persistent Storage",
"settings.ClearImageCacheHint1": "Are you sure you want to clear all images from the cache?",
"settings.ClearImageCacheHint2": "Redownloading images for a large library can consume a large amount of data.",
"settings.ClearImageCacheHint2": "Re-downloading images for a large library can consume a large amount of data.",
"settings.ClearLogs": "Clear Logs",
"settings.ClearLogsHint1": "Are you sure you want to clear all recorded logs?\n\nLogs can be useful for bug reports and debugging.",
"settings.ConfigureModule": "Configure {}",
"settings.Configuration": "Configuration",
"settings.ConfigurationCleared": "Configuration Cleared",
"settings.ConfigurationClearedDescription": "Your configuration has been cleared",
"settings.ConfigurationDescription": "Configure & Setup LunaSea",
"settings.ConnectedSuccessfully": "Connected",
"settings.ConnectedSuccessfullyMessage": "{} is ready to use with LunaSea!",
"settings.ConnectionDetails": "Connection Details",
"settings.ConnectionDetailsDescription": "Connection Details for {}",
"settings.ConnectionTestFailed": "Connection Test Failed",
"settings.CopiedURLFor": "Copied URL for {}",
"settings.CopiedDeviceURL": "Copied your device-based URL to the clipboard",
"settings.CopiedUserURL": "Copied your user-based URL to the clipboard",
"settings.CurrentPassword": "Current Password",
"settings.Custom": "Custom…",
"settings.CustomHeader": "Custom Header",
@@ -440,6 +476,7 @@
"settings.DeleteModuleSuccess": "Module Deleted",
"settings.DeleteProfile": "Delete Profile",
"settings.DeleteProfileDescription": "Delete an Existing Profile",
"settings.Device": "Device",
"settings.DiscordDescription": "Request Features & Get Support",
"settings.DismissBanners": "Dismiss Banners",
"settings.DismissBannersHint1": "Are you sure you want to dismiss all tooltip banners?",
@@ -463,6 +500,12 @@
"settings.EnableModule": "Enable {}",
"settings.EnabledProfile": "Enabled Profile",
"settings.EncryptionKey": "Encryption Key",
"settings.Exception": "Exception",
"settings.Export": "Export",
"settings.ExportedLogs": "Exported Logs",
"settings.ExportedLogsMessage": "Logs have been successfully exported",
"settings.FailedToClearImageCache": "Failed to Clear Image Cache",
"settings.FailedToClearImageCacheDescription": "The image cache could not be cleared",
"settings.FailedToDeleteAccount": "Failed to Delete Account",
"settings.FailedToUpdateEmail": "Failed to Update Email",
"settings.FailedToUpdatePassword": "Failed to Update Password",
@@ -471,6 +514,8 @@
"settings.FutureDays": "Future Days",
"settings.General": "General",
"settings.GeneralDescription": "Customize LunaSea",
"settings.GettingStarted": "Getting Started",
"settings.GettingStartedDescription": "Information & Setup Instructions",
"settings.GitHubDescription": "View the Source Code",
"settings.HeaderAdded": "Header Added",
"settings.HeaderDeleted": "Header Deleted",
@@ -491,6 +536,8 @@
"settings.ImageBackgroundOpacity": "Image Background Opacity",
"settings.ImageBackgroundOpacityHint1": "Set the opacity of background images.",
"settings.ImageBackgroundOpacityHint2": "To completely disable fetching background images, set the value to 0.",
"settings.ImageCacheCleared": "Image Cache Cleared",
"settings.ImageCacheClearedDescription": "The image cache has been cleared",
"settings.InvalidEmail": "Invalid Email Address",
"settings.InvalidEmailMessage": "The email address is invalid",
"settings.InvalidPassword": "Invalid Password",
@@ -498,11 +545,16 @@
"settings.Language": "Language",
"settings.Localization": "Localization",
"settings.LocalizationDescription": "Customize to your Locale",
"settings.Logs": "Logs",
"settings.LogsCleared": "Logs Cleared",
"settings.LogsClearedDescription": "All recorded logs have been cleared",
"settings.LogsDescription": "View, Export, and Clear Logs",
"settings.Method": "Method",
"settings.MACAddress": "MAC Address",
"settings.MACAddressHint1": "This is the MAC address of the machine that you want to wake up",
"settings.MACAddressHint2": "MAC addresses contain six two-digit hexidecimal nibbles (an octet)",
"settings.MACAddressHint3": "Hexidecimal digits range from 0-9 and A-F",
"settings.MACAddressHint4": "Each hexidecimal octet should be separated by a colon",
"settings.MACAddressHint2": "MAC addresses contain six two-digit hexadecimal nibbles (an octet)",
"settings.MACAddressHint3": "Hexadecimal digits range from 0-9 and A-F",
"settings.MACAddressHint4": "Each hexadecimal octet should be separated by a colon",
"settings.MACAddressValidation": "Invalid MAC Address",
"settings.MinimumCharacters": "Minimum of {} characters",
"settings.ModuleNotFound": "Module Not Found",
@@ -510,12 +562,16 @@
"settings.Network": "Network",
"settings.NetworkDescription": "Customize Network Features",
"settings.NewPassword": "New Password",
"settings.NotAuthorized": "Not Authorized",
"settings.NotAuthorizedMessage": "LunaSea is not authorized to show notifications. Please go to your device's settings to enable notifications.",
"settings.NotAvailable": "Not Available",
"settings.Notifications": "Notifications",
"settings.NotificationsDescription": "Set up Webhooks for Push Notifications",
"settings.NoAdditionalProfilesAdded": "No additional profiles have been added",
"settings.NoBackupsFound": "No Backups Found",
"settings.NoExternalModulesFound": "No External Modules Found",
"settings.NoHeadersAdded": "No Headers Added",
"settings.NoLogsFound": "No Logs Found",
"settings.NoProfilesFound": "No Profiles Found",
"settings.OpenDrawerOnBackAction": "Open Drawer on Back Action",
"settings.OpenDrawerOnBackActionDescription": "Open the drawer instead of closing LunaSea",
@@ -586,6 +642,7 @@
"settings.UpToDate": "Up To Date",
"settings.Use24HourTime": "Use 24 Hour Time",
"settings.Use24HourTimeDescription": "Show Timestamps in 24 Hour Style",
"settings.User": "User",
"settings.Username": "Username",
"settings.UsernameValidation": "Username Required",
"settings.Version": "Version",
@@ -646,14 +703,17 @@
"sonarr.Episode": "Episode",
"sonarr.Episodes": "Episodes",
"sonarr.EpisodesAvailable": "Episodes Available",
"sonarr.EpisodesCount": "{} Episodes",
"sonarr.EpisodeFileDeleted": "Episode File Deleted",
"sonarr.EpisodeFileRenamed": "Episode File Renamed",
"sonarr.EpisodeFilesDeleted": "Episode Files Deleted",
"sonarr.EpisodeImported": "Episode Imported ({})",
"sonarr.EpisodeNumber": "Episode {}",
"sonarr.FailedToAddSeries": "Failed to Add Series",
"sonarr.FailedToAddTag": "Failed to Add Tag",
"sonarr.FailedToBackupDatabase": "Failed to Backup Database",
"sonarr.FailedToDeleteEpisodeFile": "Failed to Delete Episode File",
"sonarr.FailedToDeleteEpisodeFiles": "Failed to Delete Episode Files",
"sonarr.FailedToDownloadRelease": "Failed to Download Release",
"sonarr.FailedToMonitorEpisode": "Failed to Monitor Episode",
"sonarr.FailedToMonitorSeason": "Failed to Monitor Season",
@@ -662,6 +722,7 @@
"sonarr.FailedToRemoveFromQueue": "Failed to Remove From Queue",
"sonarr.FailedToRemoveSeries": "Failed to Remove Series",
"sonarr.FailedToRunRSSSync": "Failed to Run RSS Sync",
"sonarr.FailedToSearchForEpisodes": "Failed to Search for Episodes",
"sonarr.FailedToSearchForMonitoredEpisodes": "Failed to Search for Monitored Episodes",
"sonarr.FailedToSeasonSearch": "Failed to Season Search",
"sonarr.FailedToSearch": "Failed to Search",
@@ -706,6 +767,8 @@
"sonarr.More": "More",
"sonarr.Name": "Name",
"sonarr.NoEpisodesFound": "No Episodes Found",
"sonarr.NoEpisodeFilesFound": "No Episode Files Found",
"sonarr.NoEpisodeFilesFoundDeleteMessage": "No selected episodes have files to delete",
"sonarr.NoHistoryFound": "No History Found",
"sonarr.NoLongerMonitoring": "No Longer Monitoring",
"sonarr.NoMessagesFound": "No Messages Found",
@@ -715,6 +778,7 @@
"sonarr.NoSeriesFound": "No Series Found",
"sonarr.NoSummaryAvailable": "No Summary Available",
"sonarr.NoTagsFound": "No Tags Found",
"sonarr.OneEpisode": "1 Episode",
"sonarr.OneSeason": "1 Season",
"sonarr.Other": "Other",
"sonarr.Overview": "Overview",
@@ -728,6 +792,7 @@
"sonarr.Queue": "Queue",
"sonarr.Queued": "Queued",
"sonarr.QueueDescription": "View Active & Queued Content",
"sonarr.QueueSize": "Queue Size",
"sonarr.Reason": "Reason",
"sonarr.RefreshSeries": "Refresh Series",
"sonarr.Rejected": "Rejected",
@@ -750,6 +815,7 @@
"sonarr.Search": "Search",
"sonarr.Searching": "Searching{}",
"sonarr.SearchingForEpisode": "Searching for Episode…",
"sonarr.SearchingForEpisodes": "Searching for Episodes…",
"sonarr.SearchingForSeason": "Searching for Season…",
"sonarr.SearchingForMonitoredEpisodes": "Searching for Monitored Episodes…",
"sonarr.SearchingDescription": "Searching for all missing episodes",
@@ -807,6 +873,7 @@
"sonarr.WordScore": "Word Score",
"tautulli.Activity": "Activity",
"tautulli.ActivityDetails": "Activity Details",
"tautulli.ActivityRefreshRate": "Activity Refresh Rate",
"tautulli.Audio": "Audio",
"tautulli.BackingUpConfiguration": "Backing Up Configuration…",
"tautulli.BackingUpConfigurationDescription": "Backing up your configuration in the background",
@@ -821,6 +888,7 @@
"tautulli.Converting": "Converting",
"tautulli.Container": "Container",
"tautulli.Copy": "Copy",
"tautulli.DefaultTerminationMessage": "Default Termination Message",
"tautulli.DeleteCache": "Delete Cache",
"tautulli.DeleteImageCache": "Delete Image Cache",
"tautulli.DeleteTemporarySessions": "Delete Temporary Sessions",
@@ -840,9 +908,12 @@
"tautulli.Duration": "Duration",
"tautulli.Episode": "Episode {}",
"tautulli.ETA": "ETA",
"tautulli.Graphs": "Graphs",
"tautulli.History": "History",
"tautulli.Library": "Library",
"tautulli.LibraryDetails": "Library Details",
"tautulli.Location": "Location",
"tautulli.MediaDetails": "Media Details",
"tautulli.Metadata": "Metadata",
"tautulli.More": "More",
"tautulli.None": "None",
@@ -857,6 +928,8 @@
"tautulli.SessionsOne": "1 Session",
"tautulli.SessionsMany": "{} Sessions",
"tautulli.Speed": "Speed: {}x",
"tautulli.Statistics": "Statistics",
"tautulli.StatisticsItemCount": "Statistics Item Count",
"tautulli.Stream": "Stream",
"tautulli.Subtitle": "Subtitle",
"tautulli.Terminate": "Terminate",
@@ -872,6 +945,7 @@
"tautulli.Transcodes": "Transcodes",
"tautulli.User": "User",
"tautulli.Users": "Users",
"tautulli.UserDetails": "User Details",
"tautulli.Video": "Video",
"tautulli.ViewWebGUI": "View Web GUI",
"tautulli.Year": "Year",

View File

@@ -57,6 +57,8 @@
"lunasea.DownloadClient": "Client de téléchargement",
"lunasea.Edge": "Limite",
"lunasea.Error": "Erreur",
"lunasea.EverySecond": "Chaque seconde",
"lunasea.EverySeconds": "Toutes les {} secondes",
"lunasea.ExternalModules": "Modules externes",
"lunasea.Features": "Fonctionnalités",
"lunasea.Fixes": "Corrections",
@@ -70,6 +72,7 @@
"lunasea.IncorrectEncryptionKey": "Clé de chiffrement incorrecte",
"lunasea.Internal": "Interne",
"lunasea.InvalidFileTypeSelected": "Type de fichier sélectionné invalide",
"lunasea.Items": "{} article",
"lunasea.JustNow": "À l'instant",
"lunasea.Minutes": "{} Minutes",
"lunasea.MinutesAgo": "Il y a {} minutes",
@@ -85,6 +88,7 @@
"lunasea.OneDayAgo": "Il y a 1 jour",
"lunasea.OneHour": "1 Heure",
"lunasea.OneHourAgo": "Il y a 1 heure",
"lunasea.OneItem": "1 article",
"lunasea.OneMinute": "1 Minute",
"lunasea.OneMinuteAgo": "Il y a 1 minute",
"lunasea.OneMonth": "1 mois",
@@ -101,7 +105,7 @@
"lunasea.Production": "Production",
"lunasea.Refresh": "Actualiser",
"lunasea.Refreshing": "Actualisation…",
"lunasea.Remove": "Supprimer",
"lunasea.Remove": "Retirer",
"lunasea.Rename": "Renommer",
"lunasea.Restore": "Restaurer",
"lunasea.Retry": "Réessayer",
@@ -113,6 +117,8 @@
"lunasea.Settings": "Réglages",
"lunasea.Stable": "Stable",
"lunasea.StartingView": "Page d'accueil",
"lunasea.ThankYou": "Merci",
"lunasea.ThankYouMessage": "Merci de soutenir la communauté open-source !",
"lunasea.Today": "Aujourd'hui",
"lunasea.TransactionFailure": "Transaction échouée",
"lunasea.TryAgain": "Réessayer",
@@ -181,6 +187,8 @@
"radarr.DigitalRelease": "Sortie numérique",
"radarr.DirectoryNotFound": "Répertoire non trouvé",
"radarr.Discover": "Découvrir",
"radarr.DiscoverSuggestions": "Découvertes suggérées",
"radarr.DiscoverSuggestionsDescription": "Ajouter les sorties suggérées dans découvertes",
"radarr.Disks": "Disques",
"radarr.DownloadFailed": "Échec du téléchargement",
"radarr.DownloadIgnored": "Téléchargement ignoré",
@@ -215,6 +223,7 @@
"radarr.MoveFilesDescription": "Voulez-vous déplacer les fichiers ?",
"radarr.MoveFull": "Déplacer les fichiers",
"radarr.Movie": "Film",
"radarr.MovieDetails": "Détails du film",
"radarr.MovieFileDeleted": "Fichier vidéo supprimé",
"radarr.MovieFileRenamed": "Fichier vidéo renommé",
"radarr.MovieImported": "Film importé ({})",
@@ -237,6 +246,7 @@
"radarr.QualityProfile": "Profil de qualité",
"radarr.Queue": "File d'attente",
"radarr.QueueDescription": "Voir le contenu actif et en attente",
"radarr.QueueSize": "Taille de la file d'attente",
"radarr.Quick": "Rapide",
"radarr.RefreshMovie": "Rafraichir le film",
"radarr.Rejected": "Rejeté",
@@ -327,6 +337,20 @@
"search.Alphabetical": "Alphabétique",
"search.AllSubcategories": "Toutes les sous-catégories",
"search.Age": "Âge",
"search.AddIndexer": "Ajouter un indexeur",
"search.HideAdultCategories": "Masquer les catégories adultes",
"search.ShowLinks": "Afficher les liens",
"search.FailedToAddIndexer": "Échec de l'ajout de l'indexeur",
"search.IndexerDeleted": "Indexeur supprimé",
"search.DeleteIndexer": "Supprimer l'indexeur",
"search.EditIndexer": "Modifier l'indexeur",
"search.HideAdultCategoriesDescription": "Masquer le contenu pour adultes",
"search.IndexerAdded": "Indexeur ajouté",
"search.IndexerNotFound": "Indexeur introuvable",
"search.NoIndexersFound": "Aucun indexeur trouvé",
"search.IndexerAPIHost": "API Host de lIndexer",
"search.IndexerAPIKey": "Clé API de lIndexer",
"search.ShowLinksDescription": "Afficher les liens de téléchargements et commentaires",
"settings.MustBeValueBetween": "Doit être une valeur entre {} et {}",
"settings.UsernameValidation": "Nom d'utilisateur requis",
"settings.Username": "Nom d'utilisateur",
@@ -522,7 +546,7 @@
"settings.SortDirection": "Direction du tri",
"settings.ClearImageCache": "Effacer le cache d'image",
"settings.ClearImageCacheHint1": "Êtes-vous sûr(e) de vouloir effacer toutes les images du cache ?",
"settings.ClearImageCacheHint2": "Le retéléchargement d'images pour une grande bibliothèque peut consommer une grande quantité de données.",
"settings.ClearImageCacheHint2": "Le re-téléchargement d'images pour une grande bibliothèque peut consommer une grande quantité de données.",
"settings.Network": "Réseau",
"settings.NetworkDescription": "Personnaliser les fonctionnalités du réseau",
"settings.TLSCertificateValidation": "Validation du certificat TLS",
@@ -596,6 +620,39 @@
"settings.BootModule": "Module de démarrage",
"settings.General": "Général",
"settings.GeneralDescription": "Personnaliser LunsaSea",
"settings.ExportedLogsMessage": "Les journaux (logs) ont été exportés avec succès",
"settings.ImageCacheCleared": "Image cache effacée",
"settings.NotAuthorizedMessage": "LunaSea nest pas autorisé à afficher les notifications. Merci daller dans les réglages de votre appareil pour activer les notifications.",
"settings.User": "Utilisateur",
"settings.Logs": "Journaux (logs)",
"settings.LogsDescription": "Voir, exporter et effacer les journaux (logs)",
"settings.AllLogs": "Tous les journaux",
"settings.AllLogsDescription": "Voir tous les types de journaux",
"settings.CalendarSettingsDescription": "Personnaliser le calendrier commun",
"settings.Class": "Classe",
"settings.CleanSlate": "Repartir à zéro",
"settings.Clear": "Effacer",
"settings.ClearImageCacheDescription": "Effacer les images de la mémoire permanente",
"settings.ConfigurationCleared": "Configuration annulée",
"settings.ConfigurationClearedDescription": "Votre configuration a été effacée",
"settings.CopiedURLFor": "Copier le lien pour {}",
"settings.CopiedDeviceURL": "Copier le lien de votre appareil dans le presse-papiers",
"settings.CopiedUserURL": "Copier votre lien utilisateur dans le presse-papiers",
"settings.Device": "Appareil",
"settings.Exception": "Exception",
"settings.Export": "Exporter",
"settings.ExportedLogs": "Journaux (logs) exportés",
"settings.FailedToClearImageCache": "Impossible deffacer limage cache",
"settings.FailedToClearImageCacheDescription": "Limage cache na pas pu être effacé",
"settings.GettingStarted": "Débuter",
"settings.GettingStartedDescription": "Information & instruction de configuration",
"settings.ImageCacheClearedDescription": "Limage cache a été effacée",
"settings.LogsCleared": "Journaux (logs) effacés",
"settings.LogsClearedDescription": "Lensemble des journaux (logs) ont été effacés",
"settings.Method": "Méthode",
"settings.NotAuthorized": "Non autorisé",
"settings.NotAvailable": "Non disponible",
"settings.NoLogsFound": "Aucun journaux (logs) trouvés",
"sonarr.AddedOn": "Ajouté le",
"sonarr.AddedSeries": "Série ajoutée",
"sonarr.AddedTag": "Étiquette ajoutée",
@@ -709,7 +766,7 @@
"sonarr.FailedToUpdateLibrary": "Échec de la mise à jour de la bibliothèque",
"sonarr.FailedToUpdateSeries": "Échec de la mise à jour des séries",
"sonarr.FilterCatalogue": "Trier le catalogue",
"sonarr.FilterReleases": "Trier les versions",
"sonarr.FilterReleases": "Filtrer les versions",
"sonarr.GrabbedFrom": "Récupéré depuis {}",
"sonarr.HistoryDescription": "Afficher les activités récentes",
"sonarr.InfoURL": "Infos de l'URL",
@@ -807,14 +864,23 @@
"sonarr.SearchingForMonitoredEpisodes": "Recherche d'épisodes suivis…",
"sonarr.SearchMonitored": "Rechercher des suivis",
"sonarr.FailedToSearchForMonitoredEpisodes": "Échec de la recherche des épisodes suivis",
"sonarr.EpisodesCount": "{} épisodes",
"sonarr.EpisodeFilesDeleted": "Fichiers d'épisodes supprimés",
"sonarr.FailedToDeleteEpisodeFiles": "Échec de la suppression des fichiers d'épisode",
"sonarr.FailedToSearchForEpisodes": "Échec de la recherche d'épisodes",
"sonarr.NoEpisodeFilesFound": "Aucun fichier d'épisode trouvé",
"sonarr.NoEpisodeFilesFoundDeleteMessage": "Aucun épisode sélectionné n'a de fichiers à supprimer",
"sonarr.OneEpisode": "1 épisode",
"sonarr.SearchingForEpisodes": "Recherche d'épisodes…",
"sonarr.QueueSize": "Taille de la file dattente",
"tautulli.Burn": "Graver",
"tautulli.Year": "Année",
"tautulli.ViewWebGUI": "Afficher l'interface Web",
"tautulli.Video": "Vidéo",
"tautulli.Users": "Utilisateurs",
"tautulli.User": "Utilisateur",
"tautulli.Transcodes": "Conversions",
"tautulli.Transcode": "Conversion",
"tautulli.Transcodes": "Transcodés",
"tautulli.Transcode": "Transcoder",
"tautulli.Title": "Titre",
"tautulli.Throttled": "Limité",
"tautulli.TerminateSessionFailed": "Échec de la fin de la session",
@@ -829,7 +895,7 @@
"tautulli.SessionsMany": "{} Sessions",
"tautulli.SessionsOne": "1 session",
"tautulli.Sessions": "Sessions",
"tautulli.SessionEnded": "Session terminée",
"tautulli.SessionEnded": "Session cloturée",
"tautulli.Season": "Saison {}",
"tautulli.Quality": "Qualité",
"tautulli.Product": "Produit",
@@ -839,10 +905,10 @@
"tautulli.None": "Aucun",
"tautulli.More": "Plus",
"tautulli.Metadata": "Métadonnées",
"tautulli.Location": "Localisation",
"tautulli.Location": "Emplacement",
"tautulli.Library": "Bibliothèque",
"tautulli.History": "Historique",
"tautulli.ETA": "Temps restant",
"tautulli.ETA": "Heure d'arrivée estimée",
"tautulli.Episode": "Épisode {}",
"tautulli.Duration": "Durée",
"tautulli.DirectStreams": "Flux directs",
@@ -877,6 +943,14 @@
"tautulli.Activity": "Activité",
"tautulli.Speed": "Vitesse : x{}",
"tautulli.Converting": "Conversion",
"tautulli.Statistics": "Statistiques",
"tautulli.MediaDetails": "Détails des médias",
"tautulli.UserDetails": "Détails de l'utilisateur",
"tautulli.ActivityRefreshRate": "Temps dactualisation de lactivité",
"tautulli.DefaultTerminationMessage": "Message de clôture par défaut",
"tautulli.Graphs": "Graphiques",
"tautulli.LibraryDetails": "Détails de la librairie",
"tautulli.StatisticsItemCount": "Nombre déléments statistiques",
"wake_on_lan.MagicPacketSent": "Paquet magique envoyé",
"wake_on_lan.MagicPacketSentMessage": "Votre machine devrait se réveiller !",
"wake_on_lan.MagicPacketFailedToSend": "Échec de l'envoi du paquet magique"

View File

@@ -52,6 +52,8 @@
"lunasea.Edge": "Edge",
"lunasea.Error": "Erro",
"lunasea.ExternalModules": "Módulos Externos",
"lunasea.Features": "Recursos",
"lunasea.Fixes": "Correções",
"lunasea.FullChangelog": "Registro de alterações completo",
"lunasea.GoBack": "Voltar",
"lunasea.GoToSettings": "Ir para as Definições",
@@ -62,6 +64,7 @@
"lunasea.IncorrectEncryptionKey": "Chave de encriptação incorreta",
"lunasea.Internal": "Interno",
"lunasea.InvalidFileTypeSelected": "Tipo de arquivo selecionado inválido",
"lunasea.Items": "{} Itens",
"lunasea.JustNow": "Agora mesmo",
"lunasea.Minutes": "{} Minutos",
"lunasea.MinutesAgo": "{} Minutos atrás",
@@ -70,12 +73,14 @@
"lunasea.Months": "{} Meses",
"lunasea.MonthsAgo": "{} Meses atrás",
"lunasea.New": "Novo",
"lunasea.No": "Não",
"lunasea.NoModulesEnabled": "Nenhum Módulo Ativado",
"lunasea.NotSet": "Não Definido",
"lunasea.OneDay": "1 Dia",
"lunasea.OneDayAgo": "1 Dia atrás",
"lunasea.OneHour": "1 Hora",
"lunasea.OneHourAgo": "1 Hora atrás",
"lunasea.OneItem": "1 Item",
"lunasea.OneMinute": "1 Minuto",
"lunasea.OneMinuteAgo": "1 Minuto atrás",
"lunasea.OneMonth": "1 Mês",
@@ -85,6 +90,7 @@
"lunasea.OneYear": "1 Ano",
"lunasea.OneYearAgo": "1 Ano atrás",
"lunasea.Options": "Opções",
"lunasea.Other": "Outro",
"lunasea.Page": "Página",
"lunasea.PlatformSpecific": "Específico da plataforma",
"lunasea.PleaseTryAgain": "Por favor, tente novamente",
@@ -102,6 +108,7 @@
"lunasea.Set": "Definir",
"lunasea.Settings": "Definições",
"lunasea.Stable": "Estável",
"lunasea.ThankYou": "Obrigado",
"lunasea.Today": "Hoje",
"lunasea.TransactionFailure": "Falha na transação",
"lunasea.TryAgain": "Tente novamente",
@@ -117,6 +124,7 @@
"lunasea.Website": "Website",
"lunasea.Years": "{} Anos",
"lunasea.YearsAgo": "{} Anos atrás",
"lunasea.Yes": "Sim",
"overseerr.NoRequestsFound": "Nenhum Pedido Encontrado",
"overseerr.Requests": "Pedidos",
"overseerr.NoUsersFound": "Nenhum Usuário Encontrado",
@@ -477,6 +485,15 @@
"settings.TLSCertificateValidationDescription": "Validar certificados em conexões TLS",
"settings.UpdateEmail": "Atualizar e-mail",
"settings.UpdatePassword": "Atualizar senha",
"settings.Clear": "Limpar",
"settings.Device": "Dispositivo",
"settings.Export": "Exportar",
"settings.General": "Geral",
"settings.NotAuthorized": "Não Autorizado",
"settings.NotAvailable": "Não Disponível",
"settings.User": "Usuário",
"settings.AllLogs": "Todos os Registros",
"settings.GeneralDescription": "Customizar LunaSea",
"sonarr.AddedTag": "Tag Adicionada",
"sonarr.AddSeries": "Adicionar Série",
"sonarr.DeleteFile": "Apagar Ficheiro",

132
assets/localization/sk.json Normal file
View File

@@ -0,0 +1,132 @@
{
"dashboard.Calendar": "Kalendár",
"dashboard.Friday": "Piatok",
"dashboard.MinimumOfOneDay": "Minimálne 1 deň",
"dashboard.Modules": "Moduly",
"dashboard.Monday": "Pondelok",
"dashboard.OneMonth": "Jeden mesiac",
"dashboard.OneWeek": "Jeden týždeň",
"dashboard.PastDays": "Uplynulé dni",
"dashboard.PastDaysDescription": "Vyberte počet dní v minulosti, pre ktoré sa majú načítať záznamy z kalendára.",
"dashboard.Saturday": "Sobota",
"dashboard.Schedule": "Prehľad",
"dashboard.Sunday": "Nedeľa",
"dashboard.FutureDaysDescription": "Vyberte počet dní v budúcnosti, pre ktoré sa majú načítať záznamy z kalendára.",
"dashboard.TwoWeeks": "Dva týždne",
"dashboard.Wednesday": "Streda",
"dashboard.FutureDays": "Budúce dni",
"dashboard.Tuesday": "Utorok",
"dashboard.NoNewContent": "Žiadny nový obsah",
"dashboard.Thursday": "Štvrtok",
"lidarr.StartSearchFor": "Začnite hľadať…",
"lidarr.StartSearchForMissingAlbums": "Začnite hľadať chýbajúce albumy",
"overseerr.Approved": "Schválené",
"overseerr.Issues": "Problémy",
"overseerr.NoIssues": "Žiadne problémy",
"overseerr.NoIssuesFound": "Nenašli sa žiadne problémy",
"overseerr.NoRequests": "Žiadne požiadavky",
"overseerr.NoRequestsFound": "Nenašli sa žiadne požiadavky",
"overseerr.OneRequest": "1 požiadavka",
"overseerr.Open": "Otvorené",
"overseerr.Other": "Iné",
"overseerr.PartiallyAvailable": "Čiastočne dostupné",
"overseerr.Pending": "Čakajúce",
"overseerr.SomeRequests": "Požiadavky",
"overseerr.Resolved": "Vyriešené",
"overseerr.RequestedBy": "Vyžiadané {}",
"overseerr.Requests": "Požiadavky",
"overseerr.Subtitle": "Titulky",
"overseerr.Users": "Používatelia",
"overseerr.Video": "Video",
"overseerr.Requested": "Vyžiadané",
"overseerr.Declined": "Zamietnuté",
"overseerr.OpenedBy": "Otvorené",
"overseerr.Audio": "Audio",
"overseerr.Processing": "Spracovávané",
"overseerr.Available": "Dostupné",
"overseerr.NoUsersFound": "Žiadni nájdení používatelia",
"overseerr.UnknownUser": "Neznámy používateľ",
"sabnzbd.All": "Všetky",
"sabnzbd.Ascending": "Vzostupne",
"sabnzbd.CategoryDefault": "Predvolená kategória",
"sabnzbd.Completed": "Dokončené",
"sabnzbd.Descending": "Zostupne",
"sabnzbd.Duplicate": "Duplikát",
"sabnzbd.Force": "Vynútiť",
"sabnzbd.High": "Vysoká",
"sabnzbd.Name": "Názov",
"sabnzbd.Normal": "Normálna",
"sabnzbd.Repair": "Opraviť",
"sabnzbd.RepairUnpackDelete": "Opraviť/rozbaliť/vymazať",
"sabnzbd.Size": "Veľkosť",
"sabnzbd.StandbyPC": "Pohotovostný režim PC",
"sabnzbd.Stop": "Stop",
"sabnzbd.RepairUnpack": "Opraviť/rozbaliť",
"sabnzbd.Low": "Nízka",
"sabnzbd.None": "Žiadne",
"sabnzbd.Age": "Vek",
"sabnzbd.Failed": "Neúspešné",
"sabnzbd.HibernatePC": "Hibernovať PC",
"sabnzbd.Paused": "Pozastavené",
"sabnzbd.ShutdownPC": "Vypnúť PC",
"sabnzbd.ShutdownSABnzbd": "Vypnúť SABnzbd",
"search.AllSubcategories": "Všetky podkategórie",
"search.Category": "Kategória",
"search.Download": "Stiahnuť",
"search.Downloading": "Sťahovanie…",
"search.DownloadingNZBToDevice": "Sťahuje sa NZB do zariadenia",
"search.DownloadToDevice": "Stiahnuť do zariadenia",
"search.FailedToDownloadNZB": "Nepodarilo sa stiahnuť NZB",
"search.FailedToSend": "Nepodarilo sa odoslať",
"search.NoSubcategoriesFound": "Nenašli sa žiadne podkategórie",
"search.Results": "Výsledky",
"search.Search": "Vyhľadávanie",
"search.SentTo": "Odoslané {}",
"search.Size": "Veľkosť",
"search.Subcategories": "Podkategórie",
"search.Age": "Vek",
"search.Alphabetical": "Abecedné",
"search.Categories": "Kategórie",
"search.Comments": "Komentáre",
"search.NoCategoriesFound": "Nenašli sa žiadne kategórie",
"search.NoResultsFound": "Nenašli sa žiadne výsledky",
"search.SentNZBData": "Odoslané NZB údaje",
"settings.Account": "Účet",
"settings.AccountDeleted": "Účet zmazaný",
"settings.AccountDescription": "Váš účet LunaSea",
"settings.AccountHelp": "Účet LunaSea",
"settings.AccountSettings": "Nastavenia účtu",
"settings.Add": "Pridať",
"settings.AddHeader": "Pridať hlavičku",
"settings.AddProfile": "Pridať profil",
"settings.AddProfileDescription": "Pridať nový profil",
"settings.AmoledTheme": "AMOLED téma",
"settings.AmoledThemeBorders": "AMOLED Okraje témy",
"settings.AmoledThemeBordersDescription": "Pridanie jemných hraníc v celom UI",
"settings.ApiKey": "API kľúč",
"settings.ApiKeyRequiredMessage": "API kľúč je potrebný na pripojenie k {}",
"settings.AccountDeletedMessage": "Odstránený účet LunaSea",
"settings.AccountHelpHint1": "LunaSea ponúka bezplatný účet na zálohovanie vašej konfigurácie do cloudu, pričom v budúcnosti pribudnú ďalšie funkcie!",
"settings.AddModule": "Pridať modul",
"settings.AddModuleFailed": "Nepodarilo sa pridať modul",
"settings.AddModuleSuccess": "Modul pridaný",
"settings.AddedProfile": "Pridaný profil",
"settings.AllFieldsAreRequired": "Všetky polia sú povinné",
"settings.AmoledThemeDescription": "Čisto čierna tmavá téma",
"settings.ApiKeyRequired": "API kľúč požadovaný",
"settings.AppearanceDescription": "Prispôsobenie vzhľadu a funkcií",
"settings.Appearance": "Vzhľad",
"tautulli.ActivityDetails": "Podrobnosti o aktivite",
"tautulli.BackingUpConfiguration": "Zálohovanie konfigurácie…",
"tautulli.BackingUpConfigurationDescription": "Zálohovanie konfigurácie na pozadí",
"tautulli.BackingUpConfigurationFailed": "Zlyhalo zálohovanie konfigurácie",
"tautulli.BackingUpDatabaseFailed": "Zlyhalo zálohovanie databázy",
"tautulli.BackupConfiguration": "Konfigurácia zálohovania",
"tautulli.Activity": "Aktivita",
"tautulli.Audio": "Audio",
"tautulli.BackingUpDatabase": "Zálohovanie databázy…",
"tautulli.BackingUpDatabaseDescription": "Zálohovanie databázy na pozadí",
"wake_on_lan.MagicPacketSent": "Odoslaný magický balík",
"wake_on_lan.MagicPacketFailedToSend": "Nepodarilo sa odoslať magický balík",
"wake_on_lan.MagicPacketSentMessage": "Váš počítač by sa mal prebúdzať!"
}

View File

@@ -57,6 +57,8 @@
"lunasea.DownloadClient": "İstemciyi İndir",
"lunasea.Edge": "Kenar",
"lunasea.Error": "Hata",
"lunasea.EverySecond": "Her Saniye",
"lunasea.EverySeconds": "Her {} Saniyede Bir",
"lunasea.ExternalModules": "Harici Modüller",
"lunasea.Features": "Özellikler",
"lunasea.Fixes": "Düzeltmeler",
@@ -70,6 +72,7 @@
"lunasea.IncorrectEncryptionKey": "Yanlış şifreleme anahtarı",
"lunasea.Internal": "Dahili",
"lunasea.InvalidFileTypeSelected": "Geçersiz Dosya Türü Seçildi",
"lunasea.Items": "{} Öge",
"lunasea.JustNow": "Az Önce",
"lunasea.Minutes": "{} Dakika",
"lunasea.MinutesAgo": "{} Dakika Önce",
@@ -85,6 +88,7 @@
"lunasea.OneDayAgo": "1 Gün Önce",
"lunasea.OneHour": "1 Saat",
"lunasea.OneHourAgo": "1 Saat Önce",
"lunasea.OneItem": "1 Öge",
"lunasea.OneMinute": "1 Dakika",
"lunasea.OneMinuteAgo": "1 Dakika Önce",
"lunasea.OneMonth": "1 Ay",
@@ -113,6 +117,8 @@
"lunasea.Settings": "Ayarlar",
"lunasea.Stable": "Kararlı",
"lunasea.StartingView": "Başlangıç Görünümü",
"lunasea.ThankYou": "Teşekkürler",
"lunasea.ThankYouMessage": "Açık kaynak topluluğunu desteklediğiniz için teşekkür ederiz!",
"lunasea.Today": "Bugün",
"lunasea.TransactionFailure": "İşlem Hatası",
"lunasea.TryAgain": "Tekrar Deneyin",

View File

@@ -57,6 +57,8 @@
"lunasea.DownloadClient": "下载客户端",
"lunasea.Edge": "边缘",
"lunasea.Error": "错误",
"lunasea.EverySecond": "每一秒",
"lunasea.EverySeconds": "每{}秒",
"lunasea.ExternalModules": "外部模块",
"lunasea.Features": "特征",
"lunasea.Fixes": "修复",
@@ -70,6 +72,7 @@
"lunasea.IncorrectEncryptionKey": "不正确的加密密匙",
"lunasea.Internal": "内部的",
"lunasea.InvalidFileTypeSelected": "不正确的文件类型",
"lunasea.Items": "{}项目",
"lunasea.JustNow": "刚才",
"lunasea.Minutes": "{} 分钟",
"lunasea.MinutesAgo": "{} 几分钟前",
@@ -181,6 +184,8 @@
"radarr.DigitalRelease": "数字发行",
"radarr.DirectoryNotFound": "找不到目录",
"radarr.Discover": "发现",
"radarr.DiscoverSuggestions": "发现建议",
"radarr.DiscoverSuggestionsDescription": "在发现中添加建议的版本",
"radarr.Disks": "磁盘",
"radarr.DownloadFailed": "下载失败",
"radarr.DownloadIgnored": "下载被忽略",
@@ -327,6 +332,20 @@
"search.Subcategories": "子类别",
"search.Age": "年龄",
"search.Download": "下载",
"search.AddIndexer": "添加索引器",
"search.FailedToAddIndexer": "添加索引器失败",
"search.HideAdultCategories": "隐藏成人类别",
"search.DeleteIndexer": "删除索引器",
"search.EditIndexer": "编辑索引器",
"search.IndexerDeleted": "索引器已删除",
"search.IndexerAdded": "添加索引器",
"search.IndexerNotFound": "未找到索引器",
"search.ShowLinks": "显示链接",
"search.ShowLinksDescription": "显示下载和评论链接",
"search.NoIndexersFound": "未找到索引器",
"search.HideAdultCategoriesDescription": "隐藏成人内容",
"search.IndexerAPIHost": "索引器API主机",
"search.IndexerAPIKey": "索引器API键",
"settings.AccountDescription": "账户描述",
"settings.AccountHelp": "账户帮助",
"settings.AddModule": "添加模块",
@@ -596,6 +615,10 @@
"settings.BootModule": "启动模块",
"settings.OpenDrawerOnBackAction": "从背面打开抽屉",
"settings.OpenDrawerOnBackActionDescription": "打开抽屉而不关闭LunaSea",
"settings.AllLogs": "所有日志",
"settings.AllLogsDescription": "查看所有类型的日志",
"settings.CalendarSettingsDescription": "自定义统一日历",
"settings.Class": "分类",
"sonarr.AddSeries": "添加系列",
"sonarr.AddedOn": "添加到",
"sonarr.Age": "年龄",
@@ -807,6 +830,8 @@
"sonarr.SearchMonitored": "监视搜索",
"sonarr.FailedToSearchForMonitoredEpisodes": "搜索监控剧集失败",
"sonarr.SearchingForMonitoredEpisodes": "正在搜索受监控的剧集…",
"sonarr.EpisodesCount": "{}剧集",
"sonarr.EpisodeFilesDeleted": "剧集文件已删除",
"tautulli.Activity": "活动",
"tautulli.Audio": "音频",
"tautulli.BackingUpConfiguration": "正在备份配置…",
@@ -877,6 +902,13 @@
"tautulli.TerminateSessionFailed": "终止会话失败",
"tautulli.Converting": "转换",
"tautulli.Speed": "倍速:{}x",
"tautulli.ActivityRefreshRate": "活动刷新率",
"tautulli.LibraryDetails": "库详细信息",
"tautulli.DefaultTerminationMessage": "默认终止消息",
"tautulli.Graphs": "曲线图",
"tautulli.MediaDetails": "媒体详细信息",
"tautulli.Statistics": "统计数据",
"tautulli.StatisticsItemCount": "统计项目计数",
"wake_on_lan.MagicPacketSent": "已发送幻包",
"wake_on_lan.MagicPacketSentMessage": "您的机器正在唤醒!",
"wake_on_lan.MagicPacketFailedToSend": "幻包发送失败"

View File

@@ -16,5 +16,5 @@ targets:
include_if_null: false
# Retrofit
retrofit_generator|retrofit:
retrofit_generator:
enabled: true

View File

@@ -3,12 +3,12 @@ GEM
specs:
CFPropertyList (3.0.6)
rexml
activesupport (7.0.4.3)
activesupport (7.0.5)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.1)
addressable (2.8.4)
public_suffix (>= 2.0.2, < 6.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
@@ -16,27 +16,27 @@ GEM
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.731.0)
aws-sdk-core (3.170.1)
aws-partitions (1.781.0)
aws-sdk-core (3.175.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.63.0)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-kms (1.67.0)
aws-sdk-core (~> 3, >= 3.174.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.119.1)
aws-sdk-core (~> 3, >= 3.165.0)
aws-sdk-s3 (1.126.0)
aws-sdk-core (~> 3, >= 3.174.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.2)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.1.0)
cocoapods (1.12.0)
cocoapods (1.12.1)
addressable (~> 2.8)
claide (>= 1.0.2, < 2.0)
cocoapods-core (= 1.12.0)
cocoapods-core (= 1.12.1)
cocoapods-deintegrate (>= 1.0.3, < 2.0)
cocoapods-downloader (>= 1.6.0, < 2.0)
cocoapods-plugins (>= 1.0.0, < 2.0)
@@ -51,7 +51,7 @@ GEM
nap (~> 1.0)
ruby-macho (>= 2.3.0, < 3.0)
xcodeproj (>= 1.21.0, < 2.0)
cocoapods-core (1.12.0)
cocoapods-core (1.12.1)
activesupport (>= 5.0, < 8)
addressable (~> 2.8)
algoliasearch (~> 1.0)
@@ -85,7 +85,7 @@ GEM
escape (0.0.4)
ethon (0.16.0)
ffi (>= 1.15.0)
excon (0.99.0)
excon (0.100.0)
faraday (1.10.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@@ -114,8 +114,8 @@ GEM
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.6)
fastlane (2.212.1)
fastimage (2.2.7)
fastlane (2.213.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -139,7 +139,7 @@ GEM
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (~> 2.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (~> 0.1.1)
plist (>= 3.1.0, < 4.0.0)
@@ -158,7 +158,7 @@ GEM
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.37.0)
google-apis-androidpublisher_v3 (0.44.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.0)
addressable (~> 2.5, >= 2.5.1)
@@ -189,7 +189,7 @@ GEM
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.3.0)
googleauth (1.5.2)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
@@ -200,18 +200,18 @@ GEM
http-cookie (1.0.5)
domain_name (~> 0.5)
httpclient (2.8.3)
i18n (1.12.0)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
jmespath (1.6.2)
json (2.6.3)
jwt (2.7.0)
jwt (2.7.1)
memoist (0.16.2)
mini_magick (4.12.0)
mini_mime (1.1.2)
minitest (5.18.0)
minitest (5.18.1)
molinillo (0.8.0)
multi_json (1.15.0)
multipart-post (2.0.0)
multipart-post (2.3.0)
nanaimo (0.3.0)
nap (1.1.0)
naturally (2.2.1)

View File

@@ -1,5 +1,5 @@
platform :ios, '11.0'
$FirebaseSDKVersion = '10.5.0'
$FirebaseSDKVersion = '10.10.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

View File

@@ -1,6 +1,6 @@
PODS:
- cloud_firestore (4.4.5):
- Firebase/Firestore (= 10.5.0)
- cloud_firestore (4.8.1):
- Firebase/Firestore (= 10.10.0)
- firebase_core
- Flutter
- nanopb (< 2.30910.0, >= 2.30908.0)
@@ -38,64 +38,65 @@ PODS:
- file_picker (0.0.1):
- DKImagePickerController/PhotoGallery
- Flutter
- Firebase/Auth (10.5.0):
- Firebase/Auth (10.10.0):
- Firebase/CoreOnly
- FirebaseAuth (~> 10.5.0)
- Firebase/CoreOnly (10.5.0):
- FirebaseCore (= 10.5.0)
- Firebase/Firestore (10.5.0):
- FirebaseAuth (~> 10.10.0)
- Firebase/CoreOnly (10.10.0):
- FirebaseCore (= 10.10.0)
- Firebase/Firestore (10.10.0):
- Firebase/CoreOnly
- FirebaseFirestore (~> 10.5.0)
- Firebase/Messaging (10.5.0):
- FirebaseFirestore (~> 10.10.0)
- Firebase/Messaging (10.10.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 10.5.0)
- Firebase/Storage (10.5.0):
- FirebaseMessaging (~> 10.10.0)
- Firebase/Storage (10.10.0):
- Firebase/CoreOnly
- FirebaseStorage (~> 10.5.0)
- firebase_auth (4.3.0):
- Firebase/Auth (= 10.5.0)
- FirebaseStorage (~> 10.10.0)
- firebase_auth (4.6.3):
- Firebase/Auth (= 10.10.0)
- firebase_core
- Flutter
- firebase_core (2.8.0):
- Firebase/CoreOnly (= 10.5.0)
- firebase_core (2.14.0):
- Firebase/CoreOnly (= 10.10.0)
- Flutter
- firebase_messaging (14.3.0):
- Firebase/Messaging (= 10.5.0)
- firebase_messaging (14.6.3):
- Firebase/Messaging (= 10.10.0)
- firebase_core
- Flutter
- firebase_storage (11.0.16):
- Firebase/Storage (= 10.5.0)
- firebase_storage (11.2.3):
- Firebase/Storage (= 10.10.0)
- firebase_core
- Flutter
- FirebaseAppCheckInterop (10.7.0)
- FirebaseAuth (10.5.0):
- FirebaseAppCheckInterop (10.11.0)
- FirebaseAuth (10.10.0):
- FirebaseAppCheckInterop (~> 10.0)
- FirebaseCore (~> 10.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
- GoogleUtilities/Environment (~> 7.8)
- GTMSessionFetcher/Core (< 4.0, >= 2.1)
- FirebaseAuthInterop (10.7.0)
- FirebaseCore (10.5.0):
- FirebaseAuthInterop (10.11.0)
- FirebaseCore (10.10.0):
- FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/Logger (~> 7.8)
- FirebaseCoreExtension (10.7.0):
- FirebaseCoreExtension (10.11.0):
- FirebaseCore (~> 10.0)
- FirebaseCoreInternal (10.7.0):
- FirebaseCoreInternal (10.11.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)"
- FirebaseFirestore (10.5.0):
- FirebaseFirestore/AutodetectLeveldb (= 10.5.0)
- FirebaseFirestore/AutodetectLeveldb (10.5.0):
- FirebaseFirestore (10.10.0):
- FirebaseFirestore/AutodetectLeveldb (= 10.10.0)
- FirebaseFirestore/AutodetectLeveldb (10.10.0):
- FirebaseFirestore/Base
- FirebaseFirestore/WithLeveldb
- FirebaseFirestore/Base (10.5.0)
- FirebaseFirestore/WithLeveldb (10.5.0):
- FirebaseFirestore/Base (10.10.0)
- FirebaseFirestore/WithLeveldb (10.10.0):
- FirebaseFirestore/Base
- FirebaseInstallations (10.7.0):
- FirebaseInstallations (10.11.0):
- FirebaseCore (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- PromisesObjC (~> 2.1)
- FirebaseMessaging (10.5.0):
- FirebaseMessaging (10.10.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleDataTransport (~> 9.2)
@@ -104,7 +105,7 @@ PODS:
- GoogleUtilities/Reachability (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- nanopb (< 2.30910.0, >= 2.30908.0)
- FirebaseStorage (10.5.0):
- FirebaseStorage (10.10.0):
- FirebaseAppCheckInterop (~> 10.0)
- FirebaseAuthInterop (~> 10.0)
- FirebaseCore (~> 10.0)
@@ -116,28 +117,28 @@ PODS:
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- GoogleDataTransport (9.2.1):
- GoogleDataTransport (9.2.3):
- GoogleUtilities/Environment (~> 7.7)
- nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/AppDelegateSwizzler (7.11.0):
- GoogleUtilities/AppDelegateSwizzler (7.11.1):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Environment (7.11.0):
- GoogleUtilities/Environment (7.11.1):
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.11.0):
- GoogleUtilities/Logger (7.11.1):
- GoogleUtilities/Environment
- GoogleUtilities/Network (7.11.0):
- GoogleUtilities/Network (7.11.1):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.11.0)"
- GoogleUtilities/Reachability (7.11.0):
- "GoogleUtilities/NSData+zlib (7.11.1)"
- GoogleUtilities/Reachability (7.11.1):
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (7.11.0):
- GoogleUtilities/UserDefaults (7.11.1):
- GoogleUtilities/Logger
- GTMSessionFetcher/Core (3.1.0)
- GTMSessionFetcher/Core (3.1.1)
- in_app_purchase_storekit (0.0.1):
- Flutter
- FlutterMacOS
@@ -154,22 +155,22 @@ PODS:
- PromisesObjC (2.2.0)
- quick_actions_ios (0.0.1):
- Flutter
- SDWebImage (5.15.5):
- SDWebImage/Core (= 5.15.5)
- SDWebImage/Core (5.15.5)
- Sentry/HybridSDK (8.3.1):
- SentryPrivate (= 8.3.1)
- SDWebImage (5.16.0):
- SDWebImage/Core (= 5.16.0)
- SDWebImage/Core (5.16.0)
- Sentry/HybridSDK (8.8.0):
- SentryPrivate (= 8.8.0)
- sentry_flutter (0.0.1):
- Flutter
- FlutterMacOS
- Sentry/HybridSDK (= 8.3.1)
- SentryPrivate (8.3.1)
- Sentry/HybridSDK (= 8.8.0)
- SentryPrivate (8.8.0)
- share_plus (0.0.1):
- Flutter
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- sqflite (0.0.2):
- sqflite (0.0.3):
- Flutter
- FMDB (>= 2.7.5)
- SwiftyGif (5.4.4)
@@ -184,16 +185,16 @@ DEPENDENCIES:
- 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 `10.5.0`)
- FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `10.10.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`)
- in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
@@ -237,17 +238,17 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/firebase_storage/ios"
FirebaseFirestore:
:git: https://github.com/invertase/firestore-ios-sdk-frameworks.git
:tag: 10.5.0
:tag: 10.10.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"
:path: ".symlinks/plugins/in_app_purchase_storekit/darwin"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/ios"
:path: ".symlinks/plugins/path_provider_foundation/darwin"
quick_actions_ios:
:path: ".symlinks/plugins/quick_actions_ios/ios"
sentry_flutter:
@@ -255,7 +256,7 @@ EXTERNAL SOURCES:
share_plus:
:path: ".symlinks/plugins/share_plus/ios"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
sqflite:
:path: ".symlinks/plugins/sqflite/ios"
url_launcher_ios:
@@ -264,50 +265,50 @@ EXTERNAL SOURCES:
CHECKOUT OPTIONS:
FirebaseFirestore:
:git: https://github.com/invertase/firestore-ios-sdk-frameworks.git
:tag: 10.5.0
:tag: 10.10.0
SPEC CHECKSUMS:
cloud_firestore: 29dafcfe235974cd3907d6212400629838180a16
cloud_firestore: eb6bea100a5957ac15e911a317a52738813e72ef
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
Firebase: 3d6637234ab163e31852834617b4fe1df3b7af6d
firebase_auth: 94ca572cd6a84385096c5a8f6328d5ee6cf84a16
firebase_core: d9c8f891a986a99a60ab81eabb5ef2ea2edcfee1
firebase_messaging: b9ce7e6dbd0c80fca3c8b9ba112eb59e50e178ae
firebase_storage: b6a95fdcb9cc14e4ae44121764e893e08fd65020
FirebaseAppCheckInterop: 8e907eea79958960a8bd2058e067f31e03a7914b
FirebaseAuth: 1028326bcaa7a61391386e74b9078cc558ae14f1
FirebaseAuthInterop: 46201190fe90ef1f581513eb0f9fa3d7820e7d6d
FirebaseCore: 324b8d182d9ff7e3f6d1fa2f04b082d1c7a3e366
FirebaseCoreExtension: f17247ba8c61e4d3c8d136b5e2de3cb4ac6a85b6
FirebaseCoreInternal: 8845798510aae74703467480f71ac613788d0696
FirebaseFirestore: 41e14a56b72dfdf579790c42b7ac361b30d171f2
FirebaseInstallations: 59c0e4c7a816a0f76710d83f77e5369b3e45eb96
FirebaseMessaging: 35ecbbc68ff547fca80f9326c9622e79288c7149
FirebaseStorage: 858ba102341232ad8f4e3a457090858200716966
Firebase: facd334e557a979bd03a0b58d90fd56b52b8aba0
firebase_auth: 9905bc3d82328b5050a8b7cb410a959f150b6549
firebase_core: 85b6664038311940ad60584eaabc73103c61f5de
firebase_messaging: db0dab2713aafcf69591a1dc4ee8af7d8bba2abd
firebase_storage: 1fe4f5725285159f87dd30aca1a5825105a09dcd
FirebaseAppCheckInterop: 255b6c0292fe5da995c8b2df0c02f6a3ca7f61b4
FirebaseAuth: 5ddbe23ebc4e647469261f5c59cd12a04f37c8e6
FirebaseAuthInterop: 44e34efef7145776a107b9e7f79ed44beb4738fa
FirebaseCore: d027ff503d37edb78db98429b11f580a24a7df2a
FirebaseCoreExtension: cacdad57fdb60e0b86dcbcac058ec78237946759
FirebaseCoreInternal: 9e46c82a14a3b3a25be4e1e151ce6d21536b89c0
FirebaseFirestore: b4b875bbcf4c2f7edac19064e5fc31bf814e963e
FirebaseInstallations: 2a2c6859354cbec0a228a863d4daf6de7c74ced4
FirebaseMessaging: 8a3b9a8b98ce72a42d22e69865cf662e38d2d6f5
FirebaseStorage: a12297f786e81e653864d87723ec30381eb90220
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
GoogleDataTransport: ea169759df570f4e37bdee1623ec32a7e64e67c4
GoogleUtilities: c2bdc4cf2ce786c4d2e6b3bcfd599a25ca78f06f
GTMSessionFetcher: c9e714f7eec91a55641e2bab9f45fd83a219b882
GoogleDataTransport: f0308f5905a745f94fb91fea9c6cbaf3831cb1bd
GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749
GTMSessionFetcher: e8647203b65cee28c5f73d0f473d096653945e72
in_app_purchase_storekit: 4fb7ee9e824b1f09107fbfbbce8c4b276366dc43
nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9
package_info_plus: fd030dabf36271f146f1f3beacd48f564b0f17f7
path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef
quick_actions_ios: bb09d1c35b4a89f9dbb15487039fa1b983ca375e
SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe
Sentry: 316f997b2f89557014ae9919f0d0c71e6e43c01e
sentry_flutter: f0e51fac01e46af2e16f0a7458e3014bbc131ff5
SentryPrivate: 63dd9ee25187d20427ab7b5d03054df149912c23
share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
quick_actions_ios: 9e80dcfadfbc5d47d9cf8f47bcf428b11cf383d4
SDWebImage: 2aea163b50bfcb569a2726b6a754c54a4506fcf6
Sentry: 927dfb29d18a14d924229a59cc2ad149f43349f2
sentry_flutter: cf7da03b65520b631330ecb498deb592aa7640be
SentryPrivate: 4350d865f898224ab9fa02b37d6ee7fbb623f47e
share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028
shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
PODFILE CHECKSUM: e27cc29c7cdd07e9428874a7c32df1ab5677bbc7
PODFILE CHECKSUM: 7d6f4079a4732744fb66360892b0f67dd3bc6b85
COCOAPODS: 1.12.0
COCOAPODS: 1.12.1

View File

@@ -7,9 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
0076D3D6D60E83034A1E0D0E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09FE6EE3FA652F683E30D461 /* Pods_Runner.framework */; };
007DE1E782B48FF895CE4B6C /* Pods_ImageNotification.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BD8A9D1D71899A3A89676B04 /* Pods_ImageNotification.framework */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
1C9E766CFE5995EA84CF3A05 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58F09DEDC33DBF8717EC9CF7 /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
@@ -18,6 +17,7 @@
9C2991242453FE3100B93AB2 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C2991232453FE3100B93AB2 /* StoreKit.framework */; };
9C7092B325E77E470056AE0B /* NotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C7092B225E77E470056AE0B /* NotificationService.m */; };
9C7092B725E77E470056AE0B /* ImageNotification.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 9C7092AF25E77E470056AE0B /* ImageNotification.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
B3E01A6E82278334590CFFB8 /* Pods_ImageNotification.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E70C4E30E956CF2855F3EE4 /* Pods_ImageNotification.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -55,14 +55,19 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
09FE6EE3FA652F683E30D461 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0518C562F1A93B6CFBC76CAB /* Pods-ImageNotification.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.profile.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.profile.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
1A61E842B29AA4C4DEE28EDE /* Pods-ImageNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.debug.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.debug.xcconfig"; sourceTree = "<group>"; };
2B0EC9E113D3B567E7EB7A16 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
41C8A354026F2EAC476D0FF6 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
58F09DEDC33DBF8717EC9CF7 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
8D3B7B67E1BB6745AD368CC8 /* Pods-ImageNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.debug.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.debug.xcconfig"; sourceTree = "<group>"; };
8E70C4E30E956CF2855F3EE4 /* Pods_ImageNotification.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ImageNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; };
949A157272F0977267339849 /* Pods-ImageNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.release.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.release.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -78,12 +83,7 @@
9C7092B125E77E470056AE0B /* NotificationService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationService.h; sourceTree = "<group>"; };
9C7092B225E77E470056AE0B /* NotificationService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationService.m; sourceTree = "<group>"; };
9C7092B425E77E470056AE0B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
A0A8F8D04139A672EDF6A85F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
B4DF18831CC2053BF748706B /* Pods-ImageNotification.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.profile.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.profile.xcconfig"; sourceTree = "<group>"; };
BB3E22A8716743EFBC805A48 /* Pods-ImageNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.release.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.release.xcconfig"; sourceTree = "<group>"; };
BD8A9D1D71899A3A89676B04 /* Pods_ImageNotification.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ImageNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C4DA1502BC108DB9BB52F223 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
D9B67C19C099711F4CDD87D9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
C5C41D15654448BC4DA2E895 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -92,7 +92,7 @@
buildActionMask = 2147483647;
files = (
9C2991242453FE3100B93AB2 /* StoreKit.framework in Frameworks */,
0076D3D6D60E83034A1E0D0E /* Pods_Runner.framework in Frameworks */,
1C9E766CFE5995EA84CF3A05 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -100,7 +100,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
007DE1E782B48FF895CE4B6C /* Pods_ImageNotification.framework in Frameworks */,
B3E01A6E82278334590CFFB8 /* Pods_ImageNotification.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -179,8 +179,8 @@
isa = PBXGroup;
children = (
9C2991232453FE3100B93AB2 /* StoreKit.framework */,
BD8A9D1D71899A3A89676B04 /* Pods_ImageNotification.framework */,
09FE6EE3FA652F683E30D461 /* Pods_Runner.framework */,
8E70C4E30E956CF2855F3EE4 /* Pods_ImageNotification.framework */,
58F09DEDC33DBF8717EC9CF7 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -188,12 +188,12 @@
F5D05D221249C73674C5DB0D /* Pods */ = {
isa = PBXGroup;
children = (
8D3B7B67E1BB6745AD368CC8 /* Pods-ImageNotification.debug.xcconfig */,
BB3E22A8716743EFBC805A48 /* Pods-ImageNotification.release.xcconfig */,
B4DF18831CC2053BF748706B /* Pods-ImageNotification.profile.xcconfig */,
D9B67C19C099711F4CDD87D9 /* Pods-Runner.debug.xcconfig */,
A0A8F8D04139A672EDF6A85F /* Pods-Runner.release.xcconfig */,
C4DA1502BC108DB9BB52F223 /* Pods-Runner.profile.xcconfig */,
1A61E842B29AA4C4DEE28EDE /* Pods-ImageNotification.debug.xcconfig */,
949A157272F0977267339849 /* Pods-ImageNotification.release.xcconfig */,
0518C562F1A93B6CFBC76CAB /* Pods-ImageNotification.profile.xcconfig */,
2B0EC9E113D3B567E7EB7A16 /* Pods-Runner.debug.xcconfig */,
C5C41D15654448BC4DA2E895 /* Pods-Runner.release.xcconfig */,
41C8A354026F2EAC476D0FF6 /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@@ -205,7 +205,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
5AC1B074EBDF4B45CD073933 /* [CP] Check Pods Manifest.lock */,
D670900334F678B67DC0DDC7 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
@@ -213,8 +213,8 @@
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
9C7092B825E77E470056AE0B /* Embed App Extensions */,
E6A6BAA8A7CCB50967DD02A1 /* [CP] Embed Pods Frameworks */,
8FC36251779B316E672E05BD /* [CP] Copy Pods Resources */,
36E498A92AF6479A68EF7C46 /* [CP] Embed Pods Frameworks */,
EE9DA6BBE28F03508CB05591 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -230,7 +230,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 9C7092BC25E77E470056AE0B /* Build configuration list for PBXNativeTarget "ImageNotification" */;
buildPhases = (
1D89D7AEADC332B0D3E033A0 /* [CP] Check Pods Manifest.lock */,
EE8210042C5635E7F97B098F /* [CP] Check Pods Manifest.lock */,
9C7092AB25E77E470056AE0B /* Sources */,
9C7092AC25E77E470056AE0B /* Frameworks */,
9C7092AD25E77E470056AE0B /* Resources */,
@@ -308,99 +308,7 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
1D89D7AEADC332B0D3E033A0 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-ImageNotification-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
5AC1B074EBDF4B45CD073933 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
8FC36251779B316E672E05BD /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh",
"${PODS_ROOT}/FirebaseFirestore/FirebaseFirestore/Resources/gRPCCertificates-Cpp.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates-Cpp.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
E6A6BAA8A7CCB50967DD02A1 /* [CP] Embed Pods Frameworks */ = {
36E498A92AF6479A68EF7C46 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -480,6 +388,99 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
D670900334F678B67DC0DDC7 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
EE8210042C5635E7F97B098F /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-ImageNotification-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
EE9DA6BBE28F03508CB05591 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh",
"${PODS_ROOT}/FirebaseFirestore/FirebaseFirestore/Resources/gRPCCertificates-Cpp.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates-Cpp.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -765,9 +766,11 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = VPH33JQH4R;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = VPH33JQH4R;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@@ -786,6 +789,7 @@
PRODUCT_BUNDLE_IDENTIFIER = app.lunasea.lunasea;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "match AppStore app.lunasea.lunasea";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore app.lunasea.lunasea";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@@ -835,8 +839,10 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
DEVELOPMENT_TEAM = VPH33JQH4R;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = VPH33JQH4R;
ENABLE_BITCODE = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = ImageNotification/Info.plist;
@@ -850,6 +856,7 @@
PRODUCT_BUNDLE_IDENTIFIER = app.lunasea.lunasea.ImageNotification;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "match AppStore app.lunasea.lunasea.ImageNotification";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore app.lunasea.lunasea.ImageNotification";
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};

View File

@@ -1,4 +1,4 @@
git_url("git@github.com:RoninComputer/fastlane-match-storage.git")
git_url("git@github.com:JagandeepBrar/fastlane-match-storage.git")
storage_mode("git")
app_identifier(["app.lunasea.lunasea", "app.lunasea.lunasea.ImageNotification"])
platform("ios")

View File

@@ -1,29 +0,0 @@
import 'package:lunasea/vendor.dart';
part 'api.g.dart';
String _baseUrl(String host) {
String base = host.endsWith('/') ? host.substring(0, host.length - 1) : host;
return '$base/api/v3/';
}
@RestApi()
abstract class LidarrAPI {
factory LidarrAPI({
required String host,
required String apiKey,
Map<String, dynamic> headers = const {},
}) {
Dio dio = Dio(BaseOptions(
headers: headers,
followRedirects: true,
maxRedirects: 5,
queryParameters: {
if (apiKey.isNotEmpty) 'apikey': apiKey,
},
contentType: Headers.jsonContentType,
responseType: ResponseType.json,
));
return _LidarrAPI(dio, baseUrl: _baseUrl(host));
}
}

View File

@@ -26,6 +26,7 @@ part 'controllers/command/series_search.dart';
// Episode File
part 'controllers/episode_file.dart';
part 'controllers/episode_file/delete_episode_file.dart';
part 'controllers/episode_file/delete_episode_files.dart';
part 'controllers/episode_file/get_episode_file.dart';
part 'controllers/episode_file/get_series_episode_files.dart';

View File

@@ -20,6 +20,12 @@ class SonarrControllerEpisodeFile {
}) async =>
_commandDeleteEpisodeFile(_client, episodeFileId: episodeFileId);
/// Delete the given episode files.
Future<void> deleteBulk({
required List<int> episodeFileIds,
}) async =>
_commandDeleteEpisodeFiles(_client, episodeFileIds: episodeFileIds);
/// Handler for [episodefile/{id}](https://github.com/Sonarr/Sonarr/wiki/EpisodeFile#get).
///
/// Returns the episode file with the matching episode ID.

View File

@@ -0,0 +1,10 @@
part of sonarr_commands;
Future<void> _commandDeleteEpisodeFiles(
Dio client, {
required List<int> episodeFileIds,
}) async {
await client.delete('episodefile/bulk', data: {
'episodeFileIds': episodeFileIds,
});
}

View File

@@ -1,7 +1,7 @@
/// This file is deprecated and should no longer be actively used.
/// All imports should happen directly and canonical export files will not be used anymore.
export 'state/state.dart';
export 'system/state.dart';
export 'types/loading_state.dart';
export 'database/box.dart';
export 'database/models/profile.dart';

View File

@@ -20,9 +20,10 @@ import 'package:lunasea/system/platform.dart';
///
/// Runs app in guarded zone to attempt to capture fatal (crashing) errors
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
runZonedGuarded(
() async {
WidgetsFlutterBinding.ensureInitialized();
try {
await bootstrap();
runApp(const LunaBIOS());
@@ -81,7 +82,6 @@ class LunaBIOS extends StatelessWidget {
supportedLocales: context.supportedLocales,
locale: context.locale,
builder: DevicePreview.appBuilder,
useInheritedMediaQuery: true,
darkTheme: theme.activeTheme(),
theme: theme.activeTheme(),
title: 'LunaSea',

View File

@@ -17,7 +17,7 @@ import 'package:lunasea/modules/sabnzbd.dart';
import 'package:lunasea/modules/nzbget.dart';
import 'package:lunasea/modules/tautulli.dart';
import 'package:lunasea/modules/dashboard/core/state.dart' as dashboard_state;
import 'package:lunasea/modules/dashboard/core/state.dart';
import 'package:lunasea/api/wake_on_lan/wake_on_lan.dart';
import 'package:lunasea/system/flavor.dart';
@@ -436,6 +436,23 @@ extension LunaModuleWebhookExtension on LunaModule {
}
}
String? get webhookDocs {
switch (this) {
case LunaModule.LIDARR:
return 'https://docs.lunasea.app/lunasea/notifications/lidarr';
case LunaModule.RADARR:
return 'https://docs.lunasea.app/lunasea/notifications/radarr';
case LunaModule.SONARR:
return 'https://docs.lunasea.app/lunasea/notifications/sonarr';
case LunaModule.OVERSEERR:
return 'https://docs.lunasea.app/lunasea/notifications/overseerr';
case LunaModule.TAUTULLI:
return 'https://docs.lunasea.app/lunasea/notifications/tautulli';
default:
return null;
}
}
Future<void> handleWebhook(Map<String, dynamic> data) async {
switch (this) {
case LunaModule.LIDARR:
@@ -467,7 +484,7 @@ extension LunaModuleExtension on LunaModule {
case LunaModule.WAKE_ON_LAN:
return null;
case LunaModule.DASHBOARD:
return context.read<dashboard_state.ModuleState>();
return context.read<DashboardState>();
case LunaModule.SETTINGS:
return context.read<SettingsState>();
case LunaModule.SEARCH:

View File

@@ -4,11 +4,11 @@ import 'package:lunasea/modules/dashboard/core/adapters/calendar_starting_size.d
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';
import 'package:lunasea/state/state.dart';
import 'package:lunasea/system/state.dart';
import 'package:lunasea/vendor.dart';
class ModuleState extends LunaModuleState {
ModuleState() {
class DashboardState extends LunaModuleState {
DashboardState() {
reset();
}

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:lunasea/widgets/ui.dart';
import 'package:lunasea/system/logger.dart';
@@ -26,8 +25,8 @@ class _State extends State<CalendarPage>
@override
Future<void> loadCallback() async {
context.read<ModuleState>().resetToday();
context.read<ModuleState>().resetUpcoming();
context.read<DashboardState>().resetToday();
context.read<DashboardState>().resetUpcoming();
}
@override
@@ -38,7 +37,7 @@ class _State extends State<CalendarPage>
key: _refreshKey,
onRefresh: loadCallback,
child: FutureBuilder(
future: context.watch<ModuleState>().upcoming,
future: context.watch<DashboardState>().upcoming,
builder: (
BuildContext context,
AsyncSnapshot<Map<DateTime, List<CalendarData>>> snapshot,
@@ -55,7 +54,7 @@ class _State extends State<CalendarPage>
if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) {
final events = snapshot.data!;
return Selector<ModuleState, CalendarStartingType>(
return Selector<DashboardState, CalendarStartingType>(
selector: (_, s) => s.calendarType,
builder: (context, type, _) {
if (type == CalendarStartingType.CALENDAR)

View File

@@ -44,7 +44,7 @@ class _State extends State<CalendarView> {
void _onDaySelected(DateTime selected, DateTime focused) {
HapticFeedback.selectionClick();
context.read<ModuleState>().selected = selected.floor();
context.read<DashboardState>().selected = selected.floor();
}
@override
@@ -108,10 +108,10 @@ class _State extends State<CalendarView> {
DashboardDatabase.CALENDAR_STARTING_SIZE,
],
builder: (context, _) {
DateTime firstDay = context.watch<ModuleState>().today.subtract(
DateTime firstDay = context.watch<DashboardState>().today.subtract(
Duration(days: DashboardDatabase.CALENDAR_DAYS_PAST.read()),
);
DateTime lastDay = context.watch<ModuleState>().today.add(
DateTime lastDay = context.watch<DashboardState>().today.add(
Duration(days: DashboardDatabase.CALENDAR_DAYS_FUTURE.read()),
);
return SafeArea(
@@ -124,7 +124,7 @@ class _State extends State<CalendarView> {
),
rowHeight: 48.0,
rangeSelectionMode: RangeSelectionMode.disabled,
focusedDay: context.watch<ModuleState>().selected,
focusedDay: context.watch<DashboardState>().selected,
firstDay: firstDay,
lastDay: lastDay,
//events: widget.events,
@@ -142,7 +142,8 @@ class _State extends State<CalendarView> {
startingDayOfWeek:
DashboardDatabase.CALENDAR_STARTING_DAY.read().data,
selectedDayPredicate: (date) {
return date.floor() == context.read<ModuleState>().selected;
return date.floor() ==
context.read<DashboardState>().selected;
},
calendarStyle: CalendarStyle(
markersMaxCount: 1,
@@ -170,7 +171,7 @@ class _State extends State<CalendarView> {
todayTextStyle: dayStyle,
),
onFormatChanged: (format) {
context.read<ModuleState>().calendarFormat = format;
context.read<DashboardState>().calendarFormat = format;
},
daysOfWeekStyle: DaysOfWeekStyle(
weekendStyle: weekdayStyle,
@@ -180,7 +181,7 @@ class _State extends State<CalendarView> {
if (widget.events.isEmpty) return [];
return widget.events[date.floor()] ?? [];
},
calendarFormat: context.watch<ModuleState>().calendarFormat,
calendarFormat: context.watch<DashboardState>().calendarFormat,
availableCalendarFormats: const {
CalendarFormat.month: 'Month',
CalendarFormat.twoWeeks: '2 Weeks',
@@ -228,7 +229,7 @@ class _State extends State<CalendarView> {
}
Widget _calendarList() {
final selected = context.read<ModuleState>().selected;
final selected = context.read<DashboardState>().selected;
final events = widget.events[selected.floor()] ?? [];
if (events.isEmpty) {
return Expanded(

View File

@@ -62,7 +62,7 @@ class _State extends State<ScheduleView> {
keys.sort();
for (final key in keys) {
final selected = context.read<ModuleState>().selected;
final selected = context.read<DashboardState>().selected;
if (key.isBefore(selected) || key.isAtSameMomentAs(selected)) {
offsetOfSelected = offset;
}

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:lunasea/widgets/ui.dart';
import 'package:lunasea/vendor.dart';
@@ -44,14 +43,14 @@ class _State extends State<SwitchViewAction> with LunaLoadCallbackMixin {
@override
Widget build(BuildContext context) {
return Selector<ModuleState, CalendarStartingType>(
return Selector<DashboardState, CalendarStartingType>(
selector: (_, state) => state.calendarType,
builder: (context, view, _) {
if (_showButton) {
return LunaIconButton.appBar(
icon: view.icon,
onPressed: () {
final state = context.read<ModuleState>();
final state = context.read<DashboardState>();
if (view == CalendarStartingType.CALENDAR)
state.calendarType = CalendarStartingType.SCHEDULE;
else

View File

@@ -66,7 +66,7 @@ class LidarrAPI {
));
}
return entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch artists', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -83,7 +83,7 @@ class LidarrAPI {
_entries.add(entry['foreignArtistId'] ?? '');
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch artist IDs', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -102,7 +102,7 @@ class LidarrAPI {
}),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to refresh artist ($artistID)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -144,7 +144,7 @@ class LidarrAPI {
? response.data['statistics']['sizeOnDisk'] ?? 0
: 0,
);
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch artist ($artistID)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -162,7 +162,7 @@ class LidarrAPI {
},
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to remove artist ($artistID)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -192,7 +192,7 @@ class LidarrAPI {
data: json.encode(artist),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to edit artist ($artistID)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -228,7 +228,7 @@ class LidarrAPI {
return b.releaseDateObject!.compareTo(a.releaseDateObject!);
});
return entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch albums ($artistID)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -257,7 +257,7 @@ class LidarrAPI {
: response.data[0]['statistics']['percentOfTracks'] ?? 0,
releaseDate: response.data[0]['releaseDate'] ?? '',
);
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch album ($albumID)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -286,7 +286,7 @@ class LidarrAPI {
));
}
return entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch album tracks ($albumID)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -306,7 +306,7 @@ class LidarrAPI {
);
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch quality profiles', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -326,7 +326,7 @@ class LidarrAPI {
);
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch metadata profiles', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -347,7 +347,7 @@ class LidarrAPI {
));
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch root folders', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -459,7 +459,7 @@ class LidarrAPI {
}
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch history', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -492,7 +492,7 @@ class LidarrAPI {
));
}
return entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch missing albums', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -511,7 +511,7 @@ class LidarrAPI {
}),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError(
'Failed to search for albums (${albums.toString()})', error, stack);
return Future.error(error);
@@ -533,7 +533,7 @@ class LidarrAPI {
}),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to search for all missing albums', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -551,7 +551,7 @@ class LidarrAPI {
}),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to update library', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -569,7 +569,7 @@ class LidarrAPI {
}),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to trigger RSS sync', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -587,7 +587,7 @@ class LidarrAPI {
}),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to backup database', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -606,7 +606,7 @@ class LidarrAPI {
data: json.encode(body),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError(
'Failed to toggle artist monitored status ($artistID)', error, stack);
return Future.error(error);
@@ -629,7 +629,7 @@ class LidarrAPI {
data: json.encode(body),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError(
'Failed to toggle album monitored status ($albumID)', error, stack);
return Future.error(error);
@@ -661,7 +661,7 @@ class LidarrAPI {
));
}
return entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to search ($search)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -695,7 +695,7 @@ class LidarrAPI {
}),
);
return response.data['id'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to add artist (${entry.title})', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -732,7 +732,7 @@ class LidarrAPI {
));
}
return entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch releases ($albumID)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -751,7 +751,7 @@ class LidarrAPI {
}),
);
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to download release ($guid)', error, stack);
return Future.error(error);
} catch (error, stack) {

View File

@@ -30,7 +30,11 @@ class _State extends State<LidarrCatalogue>
Future<void> loadCallback() async {
if (mounted) setState(() => _results = []);
final _api = LidarrAPI.from(LunaProfile.current);
if (mounted) setState(() => {_future = _api.getAllArtists()});
if (mounted) {
setState(() {
_future = _api.getAllArtists();
});
}
}
void _refreshState() => setState(() {});

View File

@@ -46,7 +46,11 @@ class _State extends State<ArtistEditRoute> with LunaScrollControllerMixin {
bottomNavigationBar: _bottomActionBar(),
);
Future<void> _refresh() async => setState(() => {_future = _fetch()});
Future<void> _refresh() async {
setState(() {
_future = _fetch();
});
}
Future<bool> _fetch() async {
final _api = LidarrAPI.from(LunaProfile.current);

View File

@@ -27,7 +27,9 @@ class _State extends State<ArtistAlbumReleasesRoute>
Future<void> loadCallback() async {
if (mounted) setState(() => _results = []);
final _api = LidarrAPI.from(LunaProfile.current);
setState(() => {_future = _api.getReleases(widget.albumId)});
setState(() {
_future = _api.getReleases(widget.albumId);
});
//Clear the search filter using a microtask
Future.microtask(
() => context.read<LidarrState>().searchReleasesFilter = '');

View File

@@ -78,7 +78,7 @@ class NZBGetAPI {
postPaused: response.data['result']['PostPaused'] ?? true,
scanPaused: response.data['result']['ScanPaused'] ?? true,
);
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch statistics', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -109,7 +109,7 @@ class NZBGetAPI {
));
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch logs ($amount)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -143,7 +143,7 @@ class NZBGetAPI {
_entries.add(_entry);
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch queue', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -177,7 +177,7 @@ class NZBGetAPI {
));
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch history', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -195,7 +195,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to pause queue', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -217,7 +217,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to pause queue for $minutes minutes', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -235,7 +235,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to resume queue', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -257,7 +257,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to move queue entry ($id, $offset)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -279,7 +279,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to pause job ($id)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -301,7 +301,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to resume job ($id)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -323,7 +323,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to delete job ($id)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -345,7 +345,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to rename job ($id, $name)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -367,7 +367,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError(
'Failed to set job priority ($id, ${priority.name})', error, stack);
return Future.error(error, stack);
@@ -391,7 +391,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError(
'Failed to set job category ($id, ${category.name})', error, stack);
return Future.error(error, stack);
@@ -415,7 +415,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to set job password ($id, $password)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -437,7 +437,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to delete history entry ($id, $hide)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -459,7 +459,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to retry history entry ($id)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -485,7 +485,7 @@ class NZBGetAPI {
));
}
return _entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch categories', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -507,7 +507,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to sort queue (${sort.name})', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -539,7 +539,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] > 0)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to add NZB by URL ($url)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -572,7 +572,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] > 0)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to add NZB by file ($name)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {
@@ -593,7 +593,7 @@ class NZBGetAPI {
if (response.data['result'] != null && response.data['result'] == true)
return true;
throw (Error());
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to set speed limit ($limit)', error, stack);
return Future.error(error, stack);
} catch (error, stack) {

View File

@@ -40,11 +40,15 @@ class _State extends State<StatisticsRoute> with LunaScrollControllerMixin {
}
Future<void> _fetchStatistics(NZBGetAPI api) async {
return await api.getStatistics().then((stats) => {_statistics = stats});
return await api.getStatistics().then((stats) {
_statistics = stats;
});
}
Future<void> _fetchLogs(NZBGetAPI api) async {
return await api.getLogs().then((logs) => {_logs = logs});
return await api.getLogs().then((logs) {
_logs = logs;
});
}
@override

View File

@@ -72,7 +72,7 @@ class SABnzbdAPI {
monthlyUsage: statistics.data['month'] ?? 0,
totalUsage: statistics.data['total'] ?? 0,
);
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch statistics', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -90,7 +90,7 @@ class SABnzbdAPI {
},
);
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to pause queue', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -107,7 +107,7 @@ class SABnzbdAPI {
'value': minutes,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to pause queue for $minutes minutes', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -122,7 +122,7 @@ class SABnzbdAPI {
'mode': 'resume',
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to resume queue', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -139,7 +139,7 @@ class SABnzbdAPI {
'value': nzoId,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to pause job ($nzoId)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -156,7 +156,7 @@ class SABnzbdAPI {
'value': nzoId,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to resume job ($nzoId)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -177,7 +177,7 @@ class SABnzbdAPI {
},
);
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to delete job ($nzoId)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -195,7 +195,7 @@ class SABnzbdAPI {
'value2': name,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to rename job ($nzoId, $name)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -215,7 +215,7 @@ class SABnzbdAPI {
'value3': password,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to set job password ($nzoId, $password)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -233,7 +233,7 @@ class SABnzbdAPI {
'value2': priority,
});
return true;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to set job priority ($nzoId, $priority)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -251,7 +251,7 @@ class SABnzbdAPI {
'value': nzoId,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to delete history entry ($nzoId)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -292,7 +292,7 @@ class SABnzbdAPI {
status,
queue,
];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch status and queue', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -324,7 +324,7 @@ class SABnzbdAPI {
));
}
return entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch history', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -342,7 +342,7 @@ class SABnzbdAPI {
});
return response.data['result'] != null &&
response.data['result']['position'] != null;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to move queue entry ($nzoId, $index)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -360,7 +360,7 @@ class SABnzbdAPI {
'dir': dir,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to sort queue ($sort, $dir)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -380,7 +380,7 @@ class SABnzbdAPI {
SABnzbdCategoryData(category: entry == '*' ? 'Default' : entry));
}
return entries;
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to fetch categories', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -397,7 +397,7 @@ class SABnzbdAPI {
'value2': category,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to set category ($nzoId, $category)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -414,7 +414,7 @@ class SABnzbdAPI {
'value': limit,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to set speed limit ($limit)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -430,7 +430,7 @@ class SABnzbdAPI {
'name': url,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to upload NZB by URL ($url)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -451,7 +451,7 @@ class SABnzbdAPI {
}),
);
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to upload nzb file ($name)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -471,7 +471,7 @@ class SABnzbdAPI {
},
);
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to set on-complete action ($action)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -489,7 +489,7 @@ class SABnzbdAPI {
if (delete) 'del_files': 1,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to clear history ($action, $delete)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -508,7 +508,7 @@ class SABnzbdAPI {
},
);
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to retry job ($nzoId)', error, stack);
return Future.error(error);
} catch (error, stack) {
@@ -525,7 +525,7 @@ class SABnzbdAPI {
'password': password,
});
return response.data['status'] != null && response.data['status'];
} on DioError catch (error, stack) {
} on DioException catch (error, stack) {
logError('Failed to retry job with new password ($nzoId, $password)',
error, stack);
return Future.error(error);

View File

@@ -59,12 +59,11 @@ class SearchDialogs {
},
itemBuilder: (context) {
return <PopupMenuEntry<String>>[
for (String? profile
in LunaBox.profiles.keys as Iterable<String?>)
for (final profile in LunaBox.profiles.keys.cast<String>())
PopupMenuItem<String>(
value: profile,
child: Text(
profile!,
profile,
style: TextStyle(
fontSize: LunaUI.FONT_SIZE_H3,
color: LunaSeaDatabase.ENABLED_PROFILE.read() ==

View File

@@ -1,11 +1,11 @@
import 'package:email_validator/email_validator.dart';
import 'package:flutter/material.dart';
import 'package:lunasea/database/tables/lunasea.dart';
import 'package:lunasea/firebase/types.dart';
import 'package:lunasea/modules.dart';
import 'package:lunasea/modules/settings/core/types/header.dart';
import 'package:lunasea/state/state.dart';
import 'package:lunasea/system/state.dart';
import 'package:lunasea/system/localization.dart';
import 'package:lunasea/utils/validator.dart';
import 'package:lunasea/vendor.dart';
import 'package:lunasea/widgets/ui.dart';
import 'package:lunasea/modules/dashboard/core/adapters/calendar_starting_day.dart';
@@ -591,7 +591,7 @@ class SettingsDialogs {
title: 'settings.Email'.tr(),
onSubmitted: (_) => _setValues(true),
validator: (value) {
return EmailValidator.validate(value ?? '')
return LunaValidator().email(value ?? '')
? null
: 'settings.EmailValidation'.tr();
},

View File

@@ -125,9 +125,9 @@ class _State extends State<SettingsHeaderRoute> with LunaScrollControllerMixin {
Future<void> _resetState() async {
switch (widget.module) {
case LunaModule.DASHBOARD:
throw Exception('Dashboard does not have a headers page');
throw Exception('Dashboard does not have a global state');
case LunaModule.EXTERNAL_MODULES:
throw Exception('External modules do not have a headers page');
throw Exception('External modules do not have a global state');
case LunaModule.LIDARR:
return;
case LunaModule.RADARR:
@@ -139,11 +139,11 @@ class _State extends State<SettingsHeaderRoute> with LunaScrollControllerMixin {
case LunaModule.NZBGET:
return;
case LunaModule.SEARCH:
throw Exception('Search does not have a headers page');
throw Exception('Search does not have a global state');
case LunaModule.SETTINGS:
throw Exception('Settings does not have a headers page');
throw Exception('Settings does not have a global state');
case LunaModule.WAKE_ON_LAN:
throw Exception('Wake on LAN does not have a headers page');
throw Exception('Wake on LAN does not have a global state');
case LunaModule.TAUTULLI:
return context.read<TautulliState>().reset();
case LunaModule.OVERSEERR:

View File

@@ -45,9 +45,7 @@ class HeaderUtility {
await _genericHeader(context, headers, indexer);
break;
default:
LunaLogger().warning(
'Unknown case: ${result.item2}',
);
LunaLogger().warning('Unknown case: ${result.item2}');
}
}

View File

@@ -3,7 +3,7 @@ import 'package:lunasea/core.dart';
import 'package:lunasea/firebase/auth.dart';
import 'package:lunasea/utils/validator.dart';
class AccountPasswordResetRoute extends ConsumerStatefulWidget {
class AccountPasswordResetRoute extends StatefulWidget {
const AccountPasswordResetRoute({
Key? key,
}) : super(key: key);
@@ -12,7 +12,7 @@ class AccountPasswordResetRoute extends ConsumerStatefulWidget {
_State createState() => _State();
}
class _State extends ConsumerState<AccountPasswordResetRoute>
class _State extends State<AccountPasswordResetRoute>
with LunaScrollControllerMixin {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final TextEditingController _emailController = TextEditingController();
@@ -99,7 +99,7 @@ class _State extends ConsumerState<AccountPasswordResetRoute>
}
bool _validateEmailAddress({bool showSnackBarOnFailure = true}) {
if (!ref.watch(validatorProvider).email(_emailController.text)) {
if (!LunaValidator().email(_emailController.text)) {
if (showSnackBarOnFailure) {
showLunaErrorSnackBar(
title: 'settings.InvalidEmail'.tr(),

View File

@@ -4,7 +4,7 @@ import 'package:lunasea/firebase/auth.dart';
import 'package:lunasea/router/routes/settings.dart';
import 'package:lunasea/utils/validator.dart';
class SettingsAccountSignedOutPage extends ConsumerStatefulWidget {
class SettingsAccountSignedOutPage extends StatefulWidget {
final ScrollController scrollController;
const SettingsAccountSignedOutPage({
@@ -16,7 +16,7 @@ class SettingsAccountSignedOutPage extends ConsumerStatefulWidget {
_State createState() => _State();
}
class _State extends ConsumerState<SettingsAccountSignedOutPage> {
class _State extends State<SettingsAccountSignedOutPage> {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final TextEditingController _emailController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
@@ -124,7 +124,7 @@ class _State extends ConsumerState<SettingsAccountSignedOutPage> {
}
bool _validateEmailAddress({bool showSnackBarOnFailure = true}) {
if (!ref.watch(validatorProvider).email(_emailController.text)) {
if (!LunaValidator().email(_emailController.text)) {
if (showSnackBarOnFailure)
showLunaErrorSnackBar(
title: 'settings.InvalidEmail'.tr(),

View File

@@ -7,7 +7,7 @@ import 'package:lunasea/modules/settings.dart';
import 'package:lunasea/utils/encryption.dart';
import 'package:lunasea/utils/uuid.dart';
class SettingsAccountBackupConfigurationTile extends ConsumerStatefulWidget {
class SettingsAccountBackupConfigurationTile extends StatefulWidget {
const SettingsAccountBackupConfigurationTile({
Key? key,
}) : super(key: key);
@@ -16,7 +16,7 @@ class SettingsAccountBackupConfigurationTile extends ConsumerStatefulWidget {
_State createState() => _State();
}
class _State extends ConsumerState<SettingsAccountBackupConfigurationTile> {
class _State extends State<SettingsAccountBackupConfigurationTile> {
LunaLoadingState _loadingState = LunaLoadingState.INACTIVE;
void updateState(LunaLoadingState state) {
@@ -44,12 +44,10 @@ class _State extends ConsumerState<SettingsAccountBackupConfigurationTile> {
Tuple2<bool, String> _values =
await SettingsDialogs().backupConfiguration(context);
if (_values.item1) {
final encryption = ref.watch(encryptionProvider);
String decrypted = LunaConfig().export();
String encrypted = encryption.encrypt(_values.item2, decrypted);
String encrypted = LunaEncryption().encrypt(_values.item2, decrypted);
int timestamp = DateTime.now().millisecondsSinceEpoch;
String id = ref.watch(uuidProvider).generate();
String id = LunaUUID().generate();
String format = 'MMMM dd, yyyy\nhh:mm:ss a';
String title = DateFormat(format).format(DateTime.now());

View File

@@ -6,7 +6,7 @@ import 'package:lunasea/firebase/storage.dart';
import 'package:lunasea/modules/settings.dart';
import 'package:lunasea/utils/encryption.dart';
class SettingsAccountRestoreConfigurationTile extends ConsumerStatefulWidget {
class SettingsAccountRestoreConfigurationTile extends StatefulWidget {
const SettingsAccountRestoreConfigurationTile({
Key? key,
}) : super(key: key);
@@ -15,7 +15,7 @@ class SettingsAccountRestoreConfigurationTile extends ConsumerStatefulWidget {
_State createState() => _State();
}
class _State extends ConsumerState<SettingsAccountRestoreConfigurationTile> {
class _State extends State<SettingsAccountRestoreConfigurationTile> {
LunaLoadingState _loadingState = LunaLoadingState.INACTIVE;
void updateState(LunaLoadingState state) {
@@ -61,8 +61,7 @@ class _State extends ConsumerState<SettingsAccountRestoreConfigurationTile> {
Tuple2<bool, String> _key = await SettingsDialogs().decryptBackup(context);
if (_key.item1) {
try {
final encryption = ref.watch(encryptionProvider);
String decrypted = encryption.decrypt(_key.item2, encrypted);
String decrypted = LunaEncryption().decrypt(_key.item2, encrypted);
await LunaConfig().import(context, decrypted);
showLunaSuccessSnackBar(
title: 'settings.RestoreFromCloudSuccess'.tr(),

View File

@@ -52,8 +52,8 @@ class _State extends State<ConfigurationDashboardRoute>
Widget _calendarSettingsPage() {
return LunaBlock(
title: 'Calendar Settings',
body: const [TextSpan(text: 'Customize the Unified Calendar')],
title: 'settings.CalendarSettings'.tr(),
body: [TextSpan(text: 'settings.CalendarSettingsDescription'.tr())],
trailing: const LunaIconButton.arrow(),
onTap: SettingsRoutes.CONFIGURATION_DASHBOARD_CALENDAR.go,
);

View File

@@ -46,7 +46,7 @@ class _State extends State<ConfigurationOverseerrRoute>
Widget _enabledToggle() {
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Enable ${LunaModule.OVERSEERR.title}',
title: 'settings.EnableModule'.tr(args: [LunaModule.OVERSEERR.title]),
trailing: LunaSwitch(
value: LunaProfile.current.overseerrEnabled,
onChanged: (value) {

View File

@@ -66,7 +66,7 @@ class _State extends State<ConfigurationRadarrDefaultPagesRoute>
const _db = RadarrDatabase.NAVIGATION_INDEX_MOVIE_DETAILS;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Movie Details',
title: 'radarr.MovieDetails'.tr(),
body: [
TextSpan(text: RadarrMovieDetailsNavigationBar.titles[_db.read()]),
],
@@ -89,7 +89,7 @@ class _State extends State<ConfigurationRadarrDefaultPagesRoute>
const _db = RadarrDatabase.NAVIGATION_INDEX_ADD_MOVIE;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Add Movie',
title: 'radarr.AddMovie'.tr(),
body: [TextSpan(text: RadarrAddMovieNavigationBar.titles[_db.read()])],
trailing:
LunaIconButton(icon: RadarrAddMovieNavigationBar.icons[_db.read()]),
@@ -109,7 +109,7 @@ class _State extends State<ConfigurationRadarrDefaultPagesRoute>
const _db = RadarrDatabase.NAVIGATION_INDEX_SYSTEM_STATUS;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'System Status',
title: 'radarr.SystemStatus'.tr(),
body: [
TextSpan(text: RadarrSystemStatusNavigationBar.titles[_db.read()]),
],

View File

@@ -27,7 +27,7 @@ class _State extends State<ConfigurationRadarrRoute>
Widget _appBar() {
return LunaAppBar(
title: 'Radarr',
title: LunaModule.RADARR.title,
scrollControllers: [scrollController],
);
}
@@ -51,7 +51,7 @@ class _State extends State<ConfigurationRadarrRoute>
Widget _enabledToggle() {
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Enable ${LunaModule.RADARR.title}',
title: 'settings.EnableModule'.tr(args: [LunaModule.RADARR.title]),
trailing: LunaSwitch(
value: LunaProfile.current.radarrEnabled,
onChanged: (value) {
@@ -66,8 +66,14 @@ class _State extends State<ConfigurationRadarrRoute>
Widget _connectionDetailsPage() {
return LunaBlock(
title: 'Connection Details',
body: const [TextSpan(text: 'Connection Details for Radarr')],
title: 'settings.ConnectionDetails'.tr(),
body: [
TextSpan(
text: 'settings.ConnectionDetailsDescription'.tr(
args: [LunaModule.RADARR.title],
),
),
],
trailing: const LunaIconButton.arrow(),
onTap: SettingsRoutes.CONFIGURATION_RADARR_CONNECTION_DETAILS.go,
);
@@ -84,8 +90,8 @@ class _State extends State<ConfigurationRadarrRoute>
Widget _defaultPagesPage() {
return LunaBlock(
title: 'Default Pages',
body: const [TextSpan(text: 'Set Default Landing Pages')],
title: 'settings.DefaultPages'.tr(),
body: [TextSpan(text: 'settings.DefaultPagesDescription'.tr())],
trailing: const LunaIconButton.arrow(),
onTap: SettingsRoutes.CONFIGURATION_RADARR_DEFAULT_PAGES.go,
);
@@ -95,8 +101,8 @@ class _State extends State<ConfigurationRadarrRoute>
const _db = RadarrDatabase.ADD_DISCOVER_USE_SUGGESTIONS;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Discover Suggestions',
body: const [TextSpan(text: 'Add Suggested Releases in Discover')],
title: 'radarr.DiscoverSuggestions'.tr(),
body: [TextSpan(text: 'radarr.DiscoverSuggestionsDescription'.tr())],
trailing: LunaSwitch(
value: _db.read(),
onChanged: (value) => _db.update(value),
@@ -109,9 +115,13 @@ class _State extends State<ConfigurationRadarrRoute>
const _db = RadarrDatabase.QUEUE_PAGE_SIZE;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Queue Size',
title: 'radarr.QueueSize'.tr(),
body: [
TextSpan(text: _db.read() == 1 ? '1 Item' : '${_db.read()} Items')
TextSpan(
text: _db.read() == 1
? 'lunasea.OneItem'.tr()
: 'lunasea.Items'.tr(args: [_db.read().toString()]),
),
],
trailing: const LunaIconButton(icon: Icons.queue_play_next_rounded),
onTap: () async {

View File

@@ -29,7 +29,7 @@ class _State extends State<ConfigurationSABnzbdConnectionDetailsRoute>
Widget _appBar() {
return LunaAppBar(
title: 'Connection Details',
title: 'settings.ConnectionDetails'.tr(),
scrollControllers: [scrollController],
);
}
@@ -104,34 +104,37 @@ class _State extends State<ConfigurationSABnzbdConnectionDetailsRoute>
Widget _testConnection() {
return LunaButton.text(
text: 'Test Connection',
text: 'settings.TestConnection'.tr(),
icon: Icons.wifi_tethering_rounded,
onTap: () async {
LunaProfile _profile = LunaProfile.current;
if (_profile.sabnzbdHost.isEmpty) {
showLunaErrorSnackBar(
title: 'Host Required',
message: 'Host is required to connect to SABnzbd',
title: 'settings.HostRequired'.tr(),
message: 'settings.HostRequiredMessage'
.tr(args: [LunaModule.SABNZBD.title]),
);
return;
}
if (_profile.sabnzbdKey.isEmpty) {
showLunaErrorSnackBar(
title: 'API Key Required',
message: 'API key is required to connect to SABnzbd',
title: 'settings.ApiKeyRequired'.tr(),
message: 'settings.ApiKeyRequiredMessage'
.tr(args: [LunaModule.SABNZBD.title]),
);
return;
}
SABnzbdAPI.from(LunaProfile.current)
.testConnection()
.then((_) => showLunaSuccessSnackBar(
title: 'Connected Successfully',
message: 'SABnzbd is ready to use with LunaSea',
title: 'settings.ConnectedSuccessfully'.tr(),
message: 'settings.ConnectedSuccessfullyMessage'
.tr(args: [LunaModule.SABNZBD.title]),
))
.catchError((error, trace) {
LunaLogger().error('Connection Test Failed', error, trace);
showLunaErrorSnackBar(
title: 'Connection Test Failed',
title: 'settings.ConnectionTestFailed'.tr(),
error: error,
);
});

View File

@@ -27,7 +27,7 @@ class _State extends State<ConfigurationSABnzbdRoute>
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'SABnzbd',
title: LunaModule.SABNZBD.title,
scrollControllers: [scrollController],
);
}
@@ -49,7 +49,7 @@ class _State extends State<ConfigurationSABnzbdRoute>
Widget _enabledToggle() {
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Enable ${LunaModule.SABNZBD.title}',
title: 'settings.EnableModule'.tr(args: [LunaModule.SABNZBD.title]),
trailing: LunaSwitch(
value: LunaProfile.current.sabnzbdEnabled,
onChanged: (value) {

View File

@@ -29,7 +29,7 @@ class _State extends State<ConfigurationSearchAddIndexerRoute>
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Add Indexer',
title: 'search.AddIndexer'.tr(),
scrollControllers: [scrollController],
);
}
@@ -38,20 +38,20 @@ class _State extends State<ConfigurationSearchAddIndexerRoute>
return LunaBottomActionBar(
actions: [
LunaButton.text(
text: 'Add Indexer',
text: 'search.AddIndexer'.tr(),
icon: Icons.add_rounded,
onTap: () async {
if (_indexer.displayName.isEmpty ||
_indexer.host.isEmpty ||
_indexer.apiKey.isEmpty) {
showLunaErrorSnackBar(
title: 'Failed to Add Indexer',
message: 'All fields are required',
title: 'search.FailedToAddIndexer'.tr(),
message: 'settings.AllFieldsAreRequired'.tr(),
);
} else {
LunaBox.indexers.create(_indexer);
showLunaSuccessSnackBar(
title: 'Indexer Added',
title: 'search.IndexerAdded'.tr(),
message: _indexer.displayName,
);
Navigator.of(context).pop();
@@ -77,13 +77,13 @@ class _State extends State<ConfigurationSearchAddIndexerRoute>
Widget _displayName() {
String _name = _indexer.displayName;
return LunaBlock(
title: 'Display Name',
title: 'settings.DisplayName'.tr(),
body: [TextSpan(text: _name.isEmpty ? 'lunasea.NotSet'.tr() : _name)],
trailing: const LunaIconButton.arrow(),
onTap: () async {
Tuple2<bool, String> values = await LunaDialogs().editText(
context,
'Display Name',
'settings.DisplayName'.tr(),
prefill: _name,
);
if (values.item1 && mounted) {
@@ -96,13 +96,13 @@ class _State extends State<ConfigurationSearchAddIndexerRoute>
Widget _apiURL() {
String _host = _indexer.host;
return LunaBlock(
title: 'Indexer API Host',
title: 'search.IndexerAPIHost'.tr(),
body: [TextSpan(text: _host.isEmpty ? 'lunasea.NotSet'.tr() : _host)],
trailing: const LunaIconButton.arrow(),
onTap: () async {
Tuple2<bool, String> values = await LunaDialogs().editText(
context,
'Indexer API Host',
'search.IndexerAPIHost'.tr(),
prefill: _host,
);
if (values.item1 && mounted) {
@@ -115,13 +115,13 @@ class _State extends State<ConfigurationSearchAddIndexerRoute>
Widget _apiKey() {
String _key = _indexer.apiKey;
return LunaBlock(
title: 'Indexer API Key',
title: 'search.IndexerAPIKey'.tr(),
body: [TextSpan(text: _key.isEmpty ? 'lunasea.NotSet'.tr() : _key)],
trailing: const LunaIconButton.arrow(),
onTap: () async {
Tuple2<bool, String> values = await LunaDialogs().editText(
context,
'Indexer API Key',
'search.IndexerAPIKey'.tr(),
prefill: _key,
);
if (values.item1 && mounted) {

View File

@@ -24,8 +24,8 @@ class _State extends State<ConfigurationSearchAddIndexerHeadersRoute>
Widget build(BuildContext context) {
if (widget.indexer == null) {
return InvalidRoutePage(
title: 'Custom Headers',
message: 'Indexer Not Found',
title: 'settings.CustomHeaders'.tr(),
message: 'search.IndexerNotFound'.tr(),
);
}
@@ -39,7 +39,7 @@ class _State extends State<ConfigurationSearchAddIndexerHeadersRoute>
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Custom Headers',
title: 'settings.CustomHeaders'.tr(),
scrollControllers: [scrollController],
);
}
@@ -48,7 +48,7 @@ class _State extends State<ConfigurationSearchAddIndexerHeadersRoute>
return LunaBottomActionBar(
actions: [
LunaButton.text(
text: 'Add Header',
text: 'settings.AddHeader'.tr(),
icon: Icons.add_rounded,
onTap: () async {
await HeaderUtility()
@@ -65,7 +65,7 @@ class _State extends State<ConfigurationSearchAddIndexerHeadersRoute>
controller: scrollController,
children: [
if (widget.indexer!.headers.isEmpty)
LunaMessage.inList(text: 'No Headers Added'),
LunaMessage.inList(text: 'settings.NoHeadersAdded'.tr()),
..._list(),
],
);

View File

@@ -24,23 +24,24 @@ class _State extends State<ConfigurationSearchEditIndexerRoute>
@override
Widget build(BuildContext context) {
if (widget.id < 0)
if (widget.id < 0 || !LunaBox.indexers.contains(widget.id)) {
return InvalidRoutePage(
title: 'Edit Indexer', message: 'Indexer Not Found');
if (!LunaBox.indexers.contains(widget.id))
return InvalidRoutePage(
title: 'Edit Indexer', message: 'Indexer Not Found');
title: 'search.EditIndexer'.tr(),
message: 'search.IndexerNotFound'.tr(),
);
}
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
bottomNavigationBar: _bottomActionBar(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Edit Indexer',
title: 'search.EditIndexer'.tr(),
scrollControllers: [scrollController],
);
}
@@ -49,14 +50,16 @@ class _State extends State<ConfigurationSearchEditIndexerRoute>
return LunaBottomActionBar(
actions: [
LunaButton.text(
text: 'Delete Indexer',
text: 'search.DeleteIndexer'.tr(),
icon: Icons.delete_rounded,
color: LunaColours.red,
onTap: () async {
bool result = await SettingsDialogs().deleteIndexer(context);
if (result) {
showLunaSuccessSnackBar(
title: 'Indexer Deleted', message: _indexer!.displayName);
title: 'search.IndexerDeleted'.tr(),
message: _indexer!.displayName,
);
_indexer!.delete();
Navigator.of(context).pop();
}
@@ -86,56 +89,60 @@ class _State extends State<ConfigurationSearchEditIndexerRoute>
}
Widget _displayName() {
String _name = _indexer!.displayName;
return LunaBlock(
title: 'Display Name',
body: [
TextSpan(
text: _indexer?.displayName.isEmpty ?? true
? 'Not Set'
: _indexer!.displayName,
),
],
title: 'settings.DisplayName'.tr(),
body: [TextSpan(text: _name.isEmpty ? 'lunasea.NotSet'.tr() : _name)],
trailing: const LunaIconButton.arrow(),
onTap: () async {
Tuple2<bool, String> values = await LunaDialogs()
.editText(context, 'Display Name', prefill: _indexer!.displayName);
if (values.item1) _indexer!.displayName = values.item2;
Tuple2<bool, String> values = await LunaDialogs().editText(
context,
'settings.DisplayName'.tr(),
prefill: _indexer!.displayName,
);
if (values.item1) {
_indexer!.displayName = values.item2;
}
_indexer!.save();
},
);
}
Widget _apiURL() {
String _host = _indexer!.host;
return LunaBlock(
title: 'Indexer API Host',
body: [
TextSpan(
text: _indexer?.host.isEmpty ?? true ? 'Not Set' : _indexer!.host,
),
],
title: 'search.IndexerAPIHost'.tr(),
body: [TextSpan(text: _host.isEmpty ? 'lunasea.NotSet'.tr() : _host)],
trailing: const LunaIconButton.arrow(),
onTap: () async {
Tuple2<bool, String> values = await LunaDialogs()
.editText(context, 'Indexer API Host', prefill: _indexer!.host);
if (values.item1) _indexer!.host = values.item2;
Tuple2<bool, String> values = await LunaDialogs().editText(
context,
'search.IndexerAPIHost'.tr(),
prefill: _host,
);
if (values.item1 && mounted) {
_indexer!.host = values.item2;
}
_indexer!.save();
},
);
}
Widget _apiKey() {
String _key = _indexer!.apiKey;
return LunaBlock(
title: 'Indexer API Key',
body: [
TextSpan(
text: _indexer?.apiKey.isEmpty ?? true ? 'Not Set' : _indexer!.apiKey,
),
],
title: 'search.IndexerAPIKey'.tr(),
body: [TextSpan(text: _key.isEmpty ? 'lunasea.NotSet'.tr() : _key)],
trailing: const LunaIconButton.arrow(),
onTap: () async {
Tuple2<bool, String> values = await LunaDialogs()
.editText(context, 'Indexer API Key', prefill: _indexer!.apiKey);
if (values.item1) _indexer!.apiKey = values.item2;
Tuple2<bool, String> values = await LunaDialogs().editText(
context,
'search.IndexerAPIKey'.tr(),
prefill: _key,
);
if (values.item1) {
_indexer!.apiKey = values.item2;
}
_indexer!.save();
},
);

View File

@@ -25,8 +25,8 @@ class _State extends State<ConfigurationSearchEditIndexerHeadersRoute>
Widget build(BuildContext context) {
if (widget.id < 0 || !LunaBox.indexers.contains(widget.id)) {
return InvalidRoutePage(
title: 'Custom Headers',
message: 'Indexer Not Found',
title: 'settings.CustomHeaders'.tr(),
message: 'search.IndexerNotFound'.tr(),
);
}
@@ -40,7 +40,7 @@ class _State extends State<ConfigurationSearchEditIndexerHeadersRoute>
Widget _appBar() {
return LunaAppBar(
title: 'Custom Headers',
title: 'settings.CustomHeaders'.tr(),
scrollControllers: [scrollController],
);
}
@@ -49,7 +49,7 @@ class _State extends State<ConfigurationSearchEditIndexerHeadersRoute>
return LunaBottomActionBar(
actions: [
LunaButton.text(
text: 'Add Header',
text: 'settings.AddHeader'.tr(),
icon: Icons.add_rounded,
onTap: () async => HeaderUtility().addHeader(context,
headers: _indexer!.headers, indexer: _indexer),
@@ -68,7 +68,7 @@ class _State extends State<ConfigurationSearchEditIndexerHeadersRoute>
controller: scrollController,
children: [
if (_indexer!.headers.isEmpty)
LunaMessage.inList(text: 'No Headers Added'),
LunaMessage.inList(text: 'settings.NoHeadersAdded'.tr()),
..._list(),
],
);

View File

@@ -21,15 +21,15 @@ class _State extends State<ConfigurationSearchRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
bottomNavigationBar: _bottomNavigationBar(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Search',
title: 'search.Search'.tr(),
scrollControllers: [scrollController],
);
}
@@ -38,7 +38,7 @@ class _State extends State<ConfigurationSearchRoute>
return LunaBottomActionBar(
actions: [
LunaButton.text(
text: 'Add Indexer',
text: 'search.AddIndexer'.tr(),
icon: Icons.add_rounded,
onTap: SettingsRoutes.CONFIGURATION_SEARCH_ADD_INDEXER.go,
),
@@ -61,7 +61,7 @@ class _State extends State<ConfigurationSearchRoute>
List<Widget> _indexerSection() {
if (LunaBox.indexers.isEmpty) {
return [const LunaMessage(text: 'No Indexers Found')];
return [LunaMessage(text: 'search.NoIndexersFound'.tr())];
}
return _indexers;
}
@@ -103,8 +103,8 @@ class _State extends State<ConfigurationSearchRoute>
const _db = SearchDatabase.HIDE_XXX;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Hide Adult Categories',
body: const [TextSpan(text: 'Hide Adult Content')],
title: 'search.HideAdultCategories'.tr(),
body: [TextSpan(text: 'search.HideAdultCategoriesDescription'.tr())],
trailing: LunaSwitch(
value: _db.read(),
onChanged: _db.update,
@@ -117,8 +117,8 @@ class _State extends State<ConfigurationSearchRoute>
const _db = SearchDatabase.SHOW_LINKS;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Show Links',
body: const [TextSpan(text: 'Show Download and Comments Links')],
title: 'search.ShowLinks'.tr(),
body: [TextSpan(text: 'search.ShowLinksDescription'.tr())],
trailing: LunaSwitch(
value: _db.read(),
onChanged: _db.update,

View File

@@ -29,7 +29,7 @@ class _State extends State<ConfigurationSonarrConnectionDetailsRoute>
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Connection Details',
title: 'settings.ConnectionDetails'.tr(),
scrollControllers: [scrollController],
);
}
@@ -110,15 +110,17 @@ class _State extends State<ConfigurationSonarrConnectionDetailsRoute>
LunaProfile _profile = LunaProfile.current;
if (_profile.sonarrHost.isEmpty) {
showLunaErrorSnackBar(
title: 'Host Required',
message: 'Host is required to connect to Sonarr',
title: 'settings.HostRequired'.tr(),
message: 'settings.HostRequiredMessage'
.tr(args: [LunaModule.SONARR.title]),
);
return;
}
if (_profile.sonarrKey.isEmpty) {
showLunaErrorSnackBar(
title: 'API Key Required',
message: 'API key is required to connect to Sonarr',
title: 'settings.ApiKeyRequired'.tr(),
message: 'settings.ApiKeyRequiredMessage'
.tr(args: [LunaModule.SONARR.title]),
);
return;
}
@@ -130,8 +132,9 @@ class _State extends State<ConfigurationSonarrConnectionDetailsRoute>
),
).system.getStatus().then((_) {
showLunaSuccessSnackBar(
title: 'Connected Successfully',
message: 'Sonarr is ready to use with LunaSea',
title: 'settings.ConnectedSuccessfully'.tr(),
message: 'settings.ConnectedSuccessfullyMessage'
.tr(args: [LunaModule.SONARR.title]),
);
}).catchError((error, trace) {
LunaLogger().error(
@@ -140,7 +143,7 @@ class _State extends State<ConfigurationSonarrConnectionDetailsRoute>
trace,
);
showLunaErrorSnackBar(
title: 'Connection Test Failed',
title: 'settings.ConnectionTestFailed'.tr(),
error: error,
);
});

View File

@@ -21,12 +21,12 @@ class _State extends State<ConfigurationSonarrDefaultOptionsRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'settings.DefaultOptions'.tr(),
scrollControllers: [scrollController],

View File

@@ -19,12 +19,12 @@ class _State extends State<ConfigurationSonarrDefaultPagesRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'settings.DefaultPages'.tr(),
scrollControllers: [scrollController],

View File

@@ -20,14 +20,14 @@ class _State extends State<ConfigurationSonarrRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Sonarr',
title: LunaModule.SONARR.title,
scrollControllers: [scrollController],
);
}
@@ -50,7 +50,7 @@ class _State extends State<ConfigurationSonarrRoute>
Widget _enabledToggle() {
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Enable ${LunaModule.SONARR.title}',
title: 'settings.EnableModule'.tr(args: [LunaModule.SONARR.title]),
trailing: LunaSwitch(
value: LunaProfile.current.sonarrEnabled,
onChanged: (value) {
@@ -102,9 +102,13 @@ class _State extends State<ConfigurationSonarrRoute>
const _db = SonarrDatabase.QUEUE_PAGE_SIZE;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Queue Size',
title: 'sonarr.QueueSize'.tr(),
body: [
TextSpan(text: _db.read() == 1 ? '1 Item' : '${_db.read()} Items')
TextSpan(
text: _db.read() == 1
? 'lunasea.OneItem'.tr()
: 'lunasea.Items'.tr(args: [_db.read().toString()]),
),
],
trailing: const LunaIconButton(icon: Icons.queue_play_next_rounded),
onTap: () async {

View File

@@ -21,15 +21,15 @@ class _State extends State<ConfigurationTautulliConnectionDetailsRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
bottomNavigationBar: _bottomActionBar(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Connection Details',
title: 'settings.ConnectionDetails'.tr(),
scrollControllers: [scrollController],
);
}
@@ -110,15 +110,17 @@ class _State extends State<ConfigurationTautulliConnectionDetailsRoute>
LunaProfile _profile = LunaProfile.current;
if (_profile.tautulliHost.isEmpty) {
showLunaErrorSnackBar(
title: 'Host Required',
message: 'Host is required to connect to Tautulli',
title: 'settings.HostRequired'.tr(),
message: 'settings.HostRequiredMessage'
.tr(args: [LunaModule.TAUTULLI.title]),
);
return;
}
if (_profile.tautulliKey.isEmpty) {
showLunaErrorSnackBar(
title: 'API Key Required',
message: 'API key is required to connect to Tautulli',
title: 'settings.ApiKeyRequired'.tr(),
message: 'settings.ApiKeyRequiredMessage'
.tr(args: [LunaModule.TAUTULLI.title]),
);
return;
}
@@ -129,13 +131,14 @@ class _State extends State<ConfigurationTautulliConnectionDetailsRoute>
.miscellaneous
.arnold()
.then((_) => showLunaSuccessSnackBar(
title: 'Connected Successfully',
message: 'Tautulli is ready to use with LunaSea',
title: 'settings.ConnectedSuccessfully'.tr(),
message: 'settings.ConnectedSuccessfullyMessage'
.tr(args: [LunaModule.TAUTULLI.title]),
))
.catchError((error, trace) {
LunaLogger().error('Connection Test Failed', error, trace);
showLunaErrorSnackBar(
title: 'Connection Test Failed',
title: 'settings.ConnectionTestFailed'.tr(),
error: error,
);
});

View File

@@ -26,7 +26,7 @@ class _State extends State<ConfigurationTautulliDefaultPagesRoute>
Widget _appBar() {
return LunaAppBar(
title: 'Default Pages',
title: 'settings.DefaultPages'.tr(),
scrollControllers: [scrollController],
);
}
@@ -67,7 +67,7 @@ class _State extends State<ConfigurationTautulliDefaultPagesRoute>
const _db = TautulliDatabase.NAVIGATION_INDEX_GRAPHS;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Graphs',
title: 'tautulli.Graphs'.tr(),
body: [TextSpan(text: TautulliGraphsNavigationBar.titles[_db.read()])],
trailing:
LunaIconButton(icon: TautulliGraphsNavigationBar.icons[_db.read()]),
@@ -87,7 +87,7 @@ class _State extends State<ConfigurationTautulliDefaultPagesRoute>
const _db = TautulliDatabase.NAVIGATION_INDEX_LIBRARIES_DETAILS;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Library Details',
title: 'tautulli.LibraryDetails'.tr(),
body: [
TextSpan(
text: TautulliLibrariesDetailsNavigationBar.titles[_db.read()])
@@ -110,7 +110,7 @@ class _State extends State<ConfigurationTautulliDefaultPagesRoute>
const _db = TautulliDatabase.NAVIGATION_INDEX_MEDIA_DETAILS;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Media Details',
title: 'tautulli.MediaDetails'.tr(),
body: [
TextSpan(text: TautulliMediaDetailsNavigationBar.titles[_db.read()]),
],
@@ -132,7 +132,7 @@ class _State extends State<ConfigurationTautulliDefaultPagesRoute>
const _db = TautulliDatabase.NAVIGATION_INDEX_USER_DETAILS;
return _db.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'User Details',
title: 'tautulli.UserDetails'.tr(),
body: [
TextSpan(text: TautulliUserDetailsNavigationBar.titles[_db.read()]),
],

View File

@@ -20,14 +20,14 @@ class _State extends State<ConfigurationTautulliRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Tautulli',
title: LunaModule.TAUTULLI.title,
scrollControllers: [scrollController],
);
}
@@ -51,7 +51,7 @@ class _State extends State<ConfigurationTautulliRoute>
Widget _enabledToggle() {
return LunaBox.profiles.listenableBuilder(
builder: (context, _) => LunaBlock(
title: 'Enable ${LunaModule.TAUTULLI.title}',
title: 'settings.EnableModule'.tr(args: [LunaModule.TAUTULLI.title]),
trailing: LunaSwitch(
value: LunaProfile.current.tautulliEnabled,
onChanged: (value) {
@@ -66,9 +66,13 @@ class _State extends State<ConfigurationTautulliRoute>
Widget _connectionDetailsPage() {
return LunaBlock(
title: 'Connection Details',
body: const [
TextSpan(text: 'Connection Details for Tautulli'),
title: 'settings.ConnectionDetails'.tr(),
body: [
TextSpan(
text: 'settings.ConnectionDetailsDescription'.tr(
args: [LunaModule.TAUTULLI.title],
),
),
],
trailing: const LunaIconButton.arrow(),
onTap: SettingsRoutes.CONFIGURATION_TAUTULLI_CONNECTION_DETAILS.go,
@@ -77,8 +81,8 @@ class _State extends State<ConfigurationTautulliRoute>
Widget _defaultPagesPage() {
return LunaBlock(
title: 'Default Pages',
body: const [TextSpan(text: 'Set Default Landing Pages')],
title: 'settings.DefaultPages'.tr(),
body: [TextSpan(text: 'settings.DefaultPagesDescription'.tr())],
trailing: const LunaIconButton.arrow(),
onTap: SettingsRoutes.CONFIGURATION_TAUTULLI_DEFAULT_PAGES.go,
);
@@ -90,8 +94,10 @@ class _State extends State<ConfigurationTautulliRoute>
builder: (context, _) {
String message = _db.read();
return LunaBlock(
title: 'Default Termination Message',
body: [TextSpan(text: message.isEmpty ? 'Not Set' : message)],
title: 'tautulli.DefaultTerminationMessage'.tr(),
body: [
TextSpan(text: message.isEmpty ? 'lunasea.NotSet'.tr() : message),
],
trailing: const LunaIconButton(icon: Icons.videocam_off_rounded),
onTap: () async {
Tuple2<bool, String> result =
@@ -106,11 +112,11 @@ class _State extends State<ConfigurationTautulliRoute>
Widget _activityRefreshRate() {
const _db = TautulliDatabase.REFRESH_RATE;
return _db.listenableBuilder(builder: (context, _) {
String? refreshRate;
if (_db.read() == 1) refreshRate = 'Every Second';
if (_db.read() != 1) refreshRate = 'Every ${_db.read()} Seconds';
String refreshRate = _db.read() == 1
? 'lunasea.EverySecond'.tr()
: 'lunasea.EverySeconds'.tr(args: [_db.read().toString()]);
return LunaBlock(
title: 'Activity Refresh Rate',
title: 'tautulli.ActivityRefreshRate'.tr(),
body: [TextSpan(text: refreshRate)],
trailing: const LunaIconButton(icon: LunaIcons.REFRESH),
onTap: () async {
@@ -125,11 +131,11 @@ class _State extends State<ConfigurationTautulliRoute>
const _db = TautulliDatabase.STATISTICS_STATS_COUNT;
return _db.listenableBuilder(
builder: (context, _) {
String? statisticsItems;
if (_db.read() == 1) statisticsItems = '1 Item';
if (_db.read() != 1) statisticsItems = '${_db.read()} Items';
String statisticsItems = _db.read() == 1
? 'lunasea.OneItem'.tr()
: 'lunasea.Items'.tr(args: [_db.read().toString()]);
return LunaBlock(
title: 'Statistics Item Count',
title: 'tautulli.StatisticsItemCount'.tr(),
body: [TextSpan(text: statisticsItems)],
trailing: const LunaIconButton(icon: Icons.format_list_numbered),
onTap: () async {

View File

@@ -27,7 +27,7 @@ class _State extends State<ConfigurationWakeOnLANRoute>
PreferredSizeWidget _appBar() {
return LunaAppBar(
scrollControllers: [scrollController],
title: 'Wake on LAN',
title: LunaModule.WAKE_ON_LAN.title,
);
}
@@ -47,7 +47,7 @@ class _State extends State<ConfigurationWakeOnLANRoute>
Widget _enabledToggle() {
return LunaBlock(
title: 'Enable Wake on LAN',
title: 'settings.EnableModule'.tr(args: [LunaModule.WAKE_ON_LAN.title]),
trailing: LunaSwitch(
value: LunaProfile.current.wakeOnLANEnabled,
onChanged: (value) {
@@ -63,7 +63,10 @@ class _State extends State<ConfigurationWakeOnLANRoute>
return LunaBlock(
title: 'settings.BroadcastAddress'.tr(),
body: [
TextSpan(text: broadcastAddress == '' ? 'Not Set' : broadcastAddress),
TextSpan(
text:
broadcastAddress == '' ? 'lunasea.NotSet'.tr() : broadcastAddress,
),
],
trailing: const LunaIconButton.arrow(),
onTap: () async {
@@ -85,7 +88,7 @@ class _State extends State<ConfigurationWakeOnLANRoute>
return LunaBlock(
title: 'settings.MACAddress'.tr(),
body: [
TextSpan(text: macAddress == '' ? 'Not Set' : macAddress),
TextSpan(text: macAddress == '' ? 'lunasea.NotSet'.tr() : macAddress),
],
trailing: const LunaIconButton.arrow(),
onTap: () async {

View File

@@ -1 +0,0 @@
export 'pages/ui.dart';

View File

@@ -1,240 +0,0 @@
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/modules/tautulli.dart';
import 'package:lunasea/utils/links.dart';
class DebugMenuUIRoute extends StatefulWidget {
const DebugMenuUIRoute({
Key? key,
}) : super(key: key);
@override
State<DebugMenuUIRoute> createState() => _State();
}
class _State extends State<DebugMenuUIRoute>
with LunaScrollControllerMixin, TickerProviderStateMixin {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
late AnimationController _iconController;
late AnimationController _hideController;
bool _isFabVisible = true;
bool _isFabPaused = false;
@override
void initState() {
super.initState();
_setupIconController();
_setupHideController();
}
@override
void dispose() {
_iconController.dispose();
_hideController.dispose();
scrollController.removeListener(scrollControllerListener);
super.dispose();
}
void scrollControllerListener() {
if (!scrollController.hasClients) return;
switch (scrollController.position.userScrollDirection) {
case ScrollDirection.forward:
if (!_isFabVisible) {
_hideController.forward();
_isFabVisible = true;
}
break;
case ScrollDirection.reverse:
if (_isFabVisible) {
_hideController.reverse();
_isFabVisible = false;
}
break;
case ScrollDirection.idle:
break;
}
}
void _setupIconController() {
_iconController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: LunaUI.ANIMATION_SPEED),
);
}
void _setupHideController() {
_hideController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: LunaUI.ANIMATION_SPEED),
);
_hideController.forward();
scrollController.addListener(scrollControllerListener);
}
Future<void> _toggle(BuildContext context) async {
HapticFeedback.lightImpact();
_isFabPaused ? _iconController.reverse() : _iconController.forward();
setState(() => _isFabPaused = !_isFabPaused);
}
@override
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
body: _body(),
floatingActionButton: _floatingActionButton(),
);
}
Widget _appBar() {
return LunaAppBar(
title: 'settings.DebugMenu'.tr(),
scrollControllers: [scrollController],
);
}
Widget _floatingActionButton() {
return ScaleTransition(
scale: _hideController,
child: InkWell(
child: LunaFloatingActionButtonAnimated(
controller: _iconController,
icon: AnimatedIcons.pause_play,
onPressed: () => _toggle(context),
),
borderRadius: BorderRadius.circular(28.0),
),
);
}
Widget _body() {
return LunaListView(
controller: scrollController,
children: [
..._lunaBlock(),
..._tableContents(),
..._graphs(),
],
);
}
List<TextSpan> _generateBody(int l) =>
List.generate(l, (i) => TextSpan(text: 'Body ${i + 1}'));
List<LunaTableContent> _generateTableContent(int l) => List.generate(l,
(i) => LunaTableContent(title: 'Title ${i + 1}', body: 'Body ${i + 1}'));
List<Widget> _tableContents() {
return [
LunaExpandableListTile(
title: 'Expandable 1',
collapsedSubtitles: _generateBody(2),
expandedTableContent: _generateTableContent(4),
collapsedTrailing: const LunaIconButton(icon: LunaIcons.ARROW_RIGHT),
),
LunaTableCard(content: _generateTableContent(4)),
];
}
List<Widget> _lunaBlock() {
return [
LunaBlock(
title: 'Title 1',
body: _generateBody(1),
bodyLeadingIcons: const [LunaIcons.DOWNLOAD],
leading: const LunaIconButton(icon: LunaIcons.ARROW_RIGHT),
trailing: const LunaIconButton(icon: LunaIcons.ARROW_RIGHT),
),
LunaBlock(
disabled: true,
title: 'Title 1',
body: _generateBody(1),
bodyLeadingIcons: const [LunaIcons.DOWNLOAD],
leading: const LunaIconButton(icon: LunaIcons.ARROW_RIGHT),
trailing: const LunaIconButton(icon: LunaIcons.ARROW_RIGHT),
),
const LunaBlock(
skeletonEnabled: true,
skeletonPoster: true,
skeletonSubtitles: 2,
),
LunaBlock(
title: 'Title 1',
body: _generateBody(2),
posterPlaceholderIcon: LunaIcons.VIDEO_CAM,
posterUrl: LunaLinkedContent.theMovieDB(
'/qLX91FhHWCVrxDVsw0g2UD5c3Zk.jpg',
LinkedContentType.IMAGE_POSTER,
),
backgroundUrl: LunaLinkedContent.theMovieDB(
'/wR3ZbCWM55qbJBcIO7rHm0MB68j.jpg',
LinkedContentType.IMAGE_BACKDROP,
),
onTap: () {},
),
];
}
List<Widget> _graphs() {
TautulliGraphData data = TautulliGraphData.fromJson(json.decode(
'{"categories":["2022-02-05","2022-02-06","2022-02-07","2022-02-08","2022-02-09","2022-02-10","2022-02-11","2022-02-12","2022-02-13","2022-02-14","2022-02-15","2022-02-16","2022-02-17","2022-02-18"],"series":[{"name":"Direct Play","data":[65,27,38,33,31,48,60,33,32,33,20,22,28,68]},{"name":"Direct Stream","data":[0,0,0,0,0,2,0,4,0,0,2,1,0,2]},{"name":"Transcode","data":[9,12,23,12,20,20,9,7,8,5,21,19,23,33]}]}',
));
return [
LunaCard(
context: context,
child: Column(
children: [
SizedBox(
height: TautulliGraphHelper.GRAPH_HEIGHT,
width: MediaQuery.of(context).size.width,
child: Padding(
child: LineChart(
LineChartData(
gridData: TautulliGraphHelper().gridData(),
titlesData: TautulliLineGraphHelper.titlesData(data),
borderData: TautulliGraphHelper().borderData(),
lineBarsData: TautulliLineGraphHelper.lineBarsData(data),
lineTouchData:
TautulliLineGraphHelper.lineTouchData(context, data),
),
),
padding: LunaUI.MARGIN_DEFAULT,
),
),
TautulliGraphHelper().createLegend(data.series!),
],
),
),
LunaCard(
context: context,
child: Column(
children: [
SizedBox(
height: TautulliGraphHelper.GRAPH_HEIGHT,
width: MediaQuery.of(context).size.width,
child: Padding(
child: BarChart(
BarChartData(
alignment: TautulliGraphHelper().chartAlignment(),
gridData: TautulliGraphHelper().gridData(),
titlesData: TautulliGraphHelper().titlesData(data),
borderData: TautulliGraphHelper().borderData(),
barGroups: TautulliBarGraphHelper.barGroups(context, data),
barTouchData:
TautulliBarGraphHelper.barTouchData(context, data),
),
),
padding: LunaUI.MARGIN_DEFAULT,
),
),
TautulliGraphHelper().createLegend(data.series!),
],
),
),
];
}
}

View File

@@ -1,78 +0,0 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/router/routes/settings.dart';
class DebugMenuRoute extends StatefulWidget {
const DebugMenuRoute({
Key? key,
}) : super(key: key);
@override
State<DebugMenuRoute> createState() => _State();
}
class _State extends State<DebugMenuRoute> with LunaScrollControllerMixin {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar(),
body: _body(),
);
}
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'settings.DebugMenu'.tr(),
scrollControllers: [scrollController],
);
}
Widget _body() {
return LunaListView(
controller: scrollController,
children: [
LunaBlock(
title: 'UI',
trailing: const LunaIconButton(icon: LunaIcons.ARROW_RIGHT),
onTap: SettingsRoutes.DEBUG_MENU_UI.go,
),
const LunaHeader(text: 'Boxes'),
LunaBlock(
title: 'Clear Alerts Box',
onTap: () async {
await LunaBox.alerts.clear();
showLunaSuccessSnackBar(
title: 'Cleared',
message: 'Cleared Alerts Box',
);
},
),
const LunaHeader(text: 'Toasts'),
LunaBlock(
title: 'Info',
onTap: () async => showLunaInfoSnackBar(
title: 'Info',
message: null,
),
),
LunaBlock(
title: 'Success',
onTap: () async => showLunaSuccessSnackBar(
title: 'Success',
message: null,
),
),
LunaBlock(
title: 'Error',
onTap: () async => showLunaErrorSnackBar(
title: 'Error',
message: null,
),
),
],
);
}
}

View File

@@ -18,14 +18,14 @@ class _State extends State<DonationsThankYouRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'Donations',
title: 'settings.Donations'.tr(),
scrollControllers: [scrollController],
);
}
@@ -35,11 +35,8 @@ class _State extends State<DonationsThankYouRoute>
controller: scrollController,
children: [
LunaHeader(
text: 'Thank You',
subtitle: [
"Thank you for supporting the open-source community!",
"Donations are never expected or assumed, so thank you for giving back and helping LunaSea remain free, forever!",
].join("\n\n"),
text: 'lunasea.ThankYou'.tr(),
subtitle: 'lunasea.ThankYouMessage'.tr(),
),
],
);

View File

@@ -27,7 +27,7 @@ class _State extends State<DonationsRoute> with LunaScrollControllerMixin {
Widget _appBar() {
return LunaAppBar(
title: 'Donations',
title: 'settings.Donations'.tr(),
scrollControllers: [scrollController],
);
}
@@ -45,7 +45,7 @@ class _State extends State<DonationsRoute> with LunaScrollControllerMixin {
} else {
return LunaMessage.goBack(
context: context,
text: 'Not Available',
text: 'settings.NotAvailable'.tr(),
);
}
},

View File

@@ -28,7 +28,7 @@ class _State extends State<NotificationsRoute> with LunaScrollControllerMixin {
Widget _appBar() {
return LunaAppBar(
title: 'Notifications',
title: 'settings.Notifications'.tr(),
scrollControllers: [scrollController],
);
}
@@ -41,10 +41,9 @@ class _State extends State<NotificationsRoute> with LunaScrollControllerMixin {
future: LunaFirebaseMessaging().areNotificationsAllowed(),
builder: (context, AsyncSnapshot<bool> snapshot) {
if (snapshot.hasData && !snapshot.data!)
return const LunaBanner(
headerText: 'Not Authorized',
bodyText:
'LunaSea is not authorized to show notifications. Please go to your device\'s settings to enable notifications.',
return LunaBanner(
headerText: 'settings.NotAuthorized'.tr(),
bodyText: 'settings.NotAuthorizedMessage'.tr(),
icon: Icons.error_outline_rounded,
iconColor: LunaColours.red,
);
@@ -53,8 +52,8 @@ class _State extends State<NotificationsRoute> with LunaScrollControllerMixin {
),
SettingsBanners.NOTIFICATIONS_MODULE_SUPPORT.banner(),
LunaBlock(
title: 'Getting Started',
body: const [TextSpan(text: 'Information & Setup Instructions')],
title: 'settings.GettingStarted'.tr(),
body: [TextSpan(text: 'settings.GettingStartedDescription'.tr())],
trailing: const LunaIconButton.arrow(),
onTap: LunaLinkedContent.NOTIFICATIONS_DOC.launch,
),

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string/links.dart';
import 'package:lunasea/firebase/auth.dart';
import 'package:lunasea/firebase/messaging.dart';
import 'package:lunasea/system/webhooks.dart';
@@ -21,9 +22,22 @@ class SettingsNotificationsModuleTile extends StatelessWidget {
iconColor: module.color,
bodyText: module.information,
buttons: [
LunaButton.text(
text: 'settings.Device'.tr(),
icon: Icons.devices_rounded,
onTap: () async {
String deviceId = (await LunaFirebaseMessaging().token)!;
await Clipboard.setData(ClipboardData(
text: LunaWebhooks.buildDeviceTokenURL(deviceId, module)));
showLunaInfoSnackBar(
title: 'settings.CopiedURLFor'.tr(args: [module.title]),
message: 'settings.CopiedDeviceURL'.tr(),
);
},
),
if (LunaFirebaseAuth().isSignedIn)
LunaButton.text(
text: 'User',
text: 'settings.User'.tr(),
icon: Icons.person_rounded,
onTap: () async {
if (!LunaFirebaseAuth().isSignedIn) return;
@@ -31,23 +45,16 @@ class SettingsNotificationsModuleTile extends StatelessWidget {
await Clipboard.setData(ClipboardData(
text: LunaWebhooks.buildUserTokenURL(userId, module)));
showLunaInfoSnackBar(
title: 'Copied URL for ${module.title}',
message: 'Copied your user-based URL to the clipboard',
title: 'settings.CopiedURLFor'.tr(args: [module.title]),
message: 'settings.CopiedUserURL'.tr(),
);
},
),
LunaButton.text(
text: 'Device',
icon: Icons.devices_rounded,
onTap: () async {
String deviceId = (await LunaFirebaseMessaging().token)!;
await Clipboard.setData(ClipboardData(
text: LunaWebhooks.buildDeviceTokenURL(deviceId, module)));
showLunaInfoSnackBar(
title: 'Copied URL for ${module.title}',
message: 'Copied your device-based URL to the clipboard',
);
},
text: 'settings.Documentation'.tr(),
icon: LunaIcons.DOCUMENTATION,
color: LunaColours.blue,
onTap: module.webhookDocs!.openLink,
),
],
);

View File

@@ -3,7 +3,6 @@ import 'package:lunasea/core.dart';
import 'package:lunasea/firebase/core.dart';
import 'package:lunasea/firebase/messaging.dart';
import 'package:lunasea/router/routes/settings.dart';
import 'package:lunasea/system/flavor.dart';
import 'package:lunasea/system/in_app_purchase/in_app_purchase.dart';
class SettingsRoute extends StatefulWidget {
@@ -22,7 +21,7 @@ class _State extends State<SettingsRoute> with LunaScrollControllerMixin {
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
drawer: _drawer(),
body: _body(),
);
@@ -30,7 +29,7 @@ class _State extends State<SettingsRoute> with LunaScrollControllerMixin {
Widget _drawer() => LunaDrawer(page: LunaModule.SETTINGS.key);
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
useDrawer: true,
scrollControllers: [scrollController],
@@ -88,13 +87,6 @@ class _State extends State<SettingsRoute> with LunaScrollControllerMixin {
trailing: const LunaIconButton(icon: Icons.settings_rounded),
onTap: SettingsRoutes.SYSTEM.go,
),
if (LunaFlavor.CANDIDATE.isRunningFlavor())
LunaBlock(
title: 'settings.DebugMenu'.tr(),
body: [TextSpan(text: 'settings.DebugMenuDescription'.tr())],
trailing: const LunaIconButton(icon: Icons.bug_report_rounded),
onTap: SettingsRoutes.DEBUG_MENU.go,
),
],
);
}

View File

@@ -26,14 +26,14 @@ class _State extends State<SystemRoute> with LunaScrollControllerMixin {
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: 'System',
title: 'settings.System'.tr(),
scrollControllers: [scrollController],
);
}
@@ -48,7 +48,7 @@ class _State extends State<SystemRoute> with LunaScrollControllerMixin {
const SettingsSystemBackupRestoreRestoreTile(),
LunaDivider(),
_logs(),
if (LunaImageCache.isSupported) _clearImageCache(),
_clearImageCache(),
_clearConfiguration(),
],
);
@@ -56,8 +56,8 @@ class _State extends State<SystemRoute> with LunaScrollControllerMixin {
Widget _logs() {
return LunaBlock(
title: 'Logs',
body: const [TextSpan(text: 'View, Export, and Clear Logs')],
title: 'settings.Logs'.tr(),
body: [TextSpan(text: 'settings.LogsDescription'.tr())],
trailing: const LunaIconButton(icon: Icons.developer_mode_rounded),
onTap: SettingsRoutes.SYSTEM_LOGS.go,
);
@@ -65,17 +65,24 @@ class _State extends State<SystemRoute> with LunaScrollControllerMixin {
Widget _clearImageCache() {
return LunaBlock(
title: 'Clear Image Cache',
body: const [TextSpan(text: 'Clear Cached Images From the Disk')],
title: 'settings.ClearImageCache'.tr(),
body: [TextSpan(text: 'settings.ClearImageCacheDescription'.tr())],
trailing: const LunaIconButton(icon: Icons.image_not_supported_rounded),
onTap: () async {
bool result = await SettingsDialogs().clearImageCache(context);
if (result) {
LunaImageCache().clear();
showLunaSuccessSnackBar(
title: 'Image Cache Cleared',
message: 'Your image cache has been cleared',
);
result = await LunaImageCache().clear();
if (result) {
showLunaSuccessSnackBar(
title: 'settings.ImageCacheCleared'.tr(),
message: 'settings.ImageCacheClearedDescription'.tr(),
);
} else {
showLunaErrorSnackBar(
title: 'settings.FailedToClearImageCache'.tr(),
message: 'settings.FailedToClearImageCacheDescription'.tr(),
);
}
}
},
);
@@ -83,8 +90,8 @@ class _State extends State<SystemRoute> with LunaScrollControllerMixin {
Widget _clearConfiguration() {
return LunaBlock(
title: 'Clear Configuration',
body: const [TextSpan(text: 'Clean Slate')],
title: 'settings.ClearConfiguration'.tr(),
body: [TextSpan(text: 'settings.CleanSlate'.tr())],
trailing: const LunaIconButton(icon: Icons.delete_sweep_rounded),
onTap: () async {
bool result = await SettingsDialogs().clearConfiguration(context);
@@ -93,8 +100,8 @@ class _State extends State<SystemRoute> with LunaScrollControllerMixin {
if (LunaFirebase.isSupported) LunaFirebaseAuth().signOut();
LunaState.reset(context);
showLunaSuccessSnackBar(
title: 'Configuration Cleared',
message: 'Your configuration has been cleared',
title: 'settings.ConfigurationCleared'.tr(),
message: 'settings.ConfigurationClearedDescription'.tr(),
);
}
},

View File

@@ -5,28 +5,27 @@ import 'package:lunasea/modules/settings.dart';
import 'package:lunasea/system/filesystem/filesystem.dart';
import 'package:lunasea/utils/encryption.dart';
class SettingsSystemBackupRestoreBackupTile extends ConsumerWidget {
class SettingsSystemBackupRestoreBackupTile extends StatelessWidget {
const SettingsSystemBackupRestoreBackupTile({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
Widget build(BuildContext context) {
return LunaBlock(
title: 'settings.BackupToDevice'.tr(),
body: [TextSpan(text: 'settings.BackupToDeviceDescription'.tr())],
trailing: const LunaIconButton(icon: Icons.upload_rounded),
onTap: () async => _backup(context, ref),
onTap: () async => _backup(context),
);
}
Future<void> _backup(BuildContext context, WidgetRef ref) async {
Future<void> _backup(BuildContext context) async {
try {
final _values = await SettingsDialogs().backupConfiguration(context);
if (_values.item1) {
final encryption = ref.watch(encryptionProvider);
String data = LunaConfig().export();
String encrypted = encryption.encrypt(_values.item2, data);
String encrypted = LunaEncryption().encrypt(_values.item2, data);
String name = DateFormat('y-MM-dd kk-mm-ss').format(DateTime.now());
bool result = await LunaFileSystem().save(
context,

View File

@@ -8,14 +8,14 @@ import 'package:lunasea/vendor.dart';
import 'package:lunasea/widgets/sheets/changelog/sheet.dart';
import 'package:lunasea/widgets/ui.dart';
class BuildDetails extends ConsumerStatefulWidget {
class BuildDetails extends StatefulWidget {
const BuildDetails({Key? key}) : super(key: key);
@override
ConsumerState<BuildDetails> createState() => _State();
State<BuildDetails> createState() => _State();
}
class _State extends ConsumerState<BuildDetails> {
class _State extends State<BuildDetails> {
Future<PackageInfo> packageInfo = PackageInfo.fromPlatform();
Future<Tuple2<bool, int?>> checkUpdates = LunaBuild().isLatestBuildNumber();
@@ -69,7 +69,7 @@ class _State extends ConsumerState<BuildDetails> {
if (updates.hasError) {
return LunaButton.text(
icon: LunaIcons.ERROR,
text: 'Error',
text: 'lunasea.Error'.tr(),
);
}
if (updates.connectionState == ConnectionState.done && updates.hasData) {

View File

@@ -6,25 +6,25 @@ import 'package:lunasea/system/filesystem/file.dart';
import 'package:lunasea/system/filesystem/filesystem.dart';
import 'package:lunasea/utils/encryption.dart';
class SettingsSystemBackupRestoreRestoreTile extends ConsumerWidget {
class SettingsSystemBackupRestoreRestoreTile extends StatelessWidget {
const SettingsSystemBackupRestoreRestoreTile({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
Widget build(BuildContext context) {
return LunaBlock(
title: 'settings.RestoreFromDevice'.tr(),
body: [TextSpan(text: 'settings.RestoreFromDeviceDescription'.tr())],
trailing: const LunaIconButton(icon: Icons.download_rounded),
onTap: () async => _restore(context, ref),
onTap: () async => _restore(context),
);
}
Future<void> _restore(BuildContext context, WidgetRef ref) async {
Future<void> _restore(BuildContext context) async {
try {
LunaFile? file = await LunaFileSystem().read(context, ['lunasea']);
if (file != null) await _decryptBackup(context, ref, file);
if (file != null) await _decryptBackup(context, file);
} catch (error, stack) {
LunaLogger().error('Failed to restore device backup', error, stack);
showLunaErrorSnackBar(
@@ -36,15 +36,13 @@ class SettingsSystemBackupRestoreRestoreTile extends ConsumerWidget {
Future<void> _decryptBackup(
BuildContext context,
WidgetRef ref,
LunaFile file,
) async {
Tuple2<bool, String> _key = await SettingsDialogs().decryptBackup(context);
if (_key.item1) {
final encryption = ref.watch(encryptionProvider);
String encrypted = String.fromCharCodes(file.data);
try {
String decrypted = encryption.decrypt(_key.item2, encrypted);
String decrypted = LunaEncryption().decrypt(_key.item2, encrypted);
await LunaConfig().import(context, decrypted);
showLunaSuccessSnackBar(
title: 'settings.RestoreFromCloudSuccess'.tr(),
@@ -56,7 +54,7 @@ class SettingsSystemBackupRestoreRestoreTile extends ConsumerWidget {
message: 'lunasea.IncorrectEncryptionKey'.tr(),
showButton: true,
buttonText: 'lunasea.Retry'.tr(),
buttonOnPressed: () async => _decryptBackup(context, ref, file),
buttonOnPressed: () async => _decryptBackup(context, file),
);
}
}

View File

@@ -24,14 +24,14 @@ class _State extends State<SystemLogsDetailsRoute>
Widget build(BuildContext context) {
return LunaScaffold(
scaffoldKey: _scaffoldKey,
appBar: _appBar() as PreferredSizeWidget?,
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
PreferredSizeWidget _appBar() {
return LunaAppBar(
title: '${widget.type?.title ?? 'All'} Logs',
title: 'settings.Logs'.tr(),
scrollControllers: [scrollController],
);
}
@@ -42,7 +42,7 @@ class _State extends State<SystemLogsDetailsRoute>
if (logs.isEmpty) {
return LunaMessage.goBack(
context: context,
text: 'No Logs Found',
text: 'settings.NoLogsFound'.tr(),
);
}
return LunaListViewBuilder(

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