diff --git a/.github/workflows/automation-tests.yml b/.github/workflows/automation-tests.yml
index 5c40edd58..97572ad25 100644
--- a/.github/workflows/automation-tests.yml
+++ b/.github/workflows/automation-tests.yml
@@ -24,7 +24,7 @@ jobs:
with:
node-version: '18'
- - uses: actions/cache@v4
+ - uses: actions/cache@v2
with:
path: |
'**/node_modules'
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 998b8387c..54b623518 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -15,7 +15,7 @@ jobs:
node-version: '18'
- name: NodeModules Cache
- uses: actions/cache@v4
+ uses: actions/cache@v2
with:
path: '**/node_modules'
key: node_modules-${{ hashFiles('**/yarn.lock') }}
@@ -42,7 +42,7 @@ jobs:
dotnet-version: '8.0.x'
- name: Nuget Cache
- uses: actions/cache@v4
+ uses: actions/cache@v2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
@@ -112,7 +112,7 @@ jobs:
dotnet-version: '5.0.x'
- name: Nuget Cache
- uses: actions/cache@v4
+ uses: actions/cache@v2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml
index d142c46c8..f068794be 100644
--- a/.github/workflows/chromatic.yml
+++ b/.github/workflows/chromatic.yml
@@ -17,7 +17,7 @@
# fetch-depth: 0
# - name: NodeModules Cache
-# uses: actions/cache@v4
+# uses: actions/cache@v2
# with:
# path: '**/node_modules'
# key: node_modules-${{ hashFiles('**/yarn.lock') }}
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
index 5a0e0a46d..ea65cfaa6 100644
--- a/.github/workflows/pr.yml
+++ b/.github/workflows/pr.yml
@@ -20,7 +20,7 @@ jobs:
node-version: '18'
- name: NodeModules Cache
- uses: actions/cache@v4
+ uses: actions/cache@v2
with:
path: '**/node_modules'
key: node_modules-${{ hashFiles('**/yarn.lock') }}
@@ -41,7 +41,7 @@ jobs:
dotnet-version: '8.0.x'
- name: Nuget Cache
- uses: actions/cache@v4
+ uses: actions/cache@v2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
@@ -101,7 +101,7 @@ jobs:
dotnet-version: '8.0.x'
- name: Nuget Cache
- uses: actions/cache@v4
+ uses: actions/cache@v2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 115942b8b..3f01e65c8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,117 +1,3 @@
-## [4.49.3](https://github.com/Ombi-app/Ombi/compare/v4.49.2...v4.49.3) (2025-08-17)
-
-
-### Bug Fixes
-
-* **plex-api:** update Plex Watchlist URL ([11fd7a5](https://github.com/Ombi-app/Ombi/commit/11fd7a5fc853da75974a16bf4fdecd72a836f54b))
-
-
-
-## [4.49.2](https://github.com/Ombi-app/Ombi/compare/v4.49.1...v4.49.2) (2025-07-12)
-
-
-### Performance Improvements
-
-* **discover:** :zap: Improve the loading performance on the discover page ([97d5167](https://github.com/Ombi-app/Ombi/commit/97d5167db6c9f915021f32b96b281d7db3741d7f))
-
-
-
-## [4.49.1](https://github.com/Ombi-app/Ombi/compare/v4.49.0...v4.49.1) (2025-07-12)
-
-
-### Bug Fixes
-
-* **auth:** Fixed an issue where refreshing the page as a power user would stop the application from loading [#5242](https://github.com/Ombi-app/Ombi/issues/5242) ([cee4014](https://github.com/Ombi-app/Ombi/commit/cee40146ee02f7fb79e2019d6fe2f9d5c5dbdfc8))
-
-
-
-# [4.49.0](https://github.com/Ombi-app/Ombi/compare/v4.48.5...v4.49.0) (2025-07-11)
-
-
-### Features
-
-* Added the ability for the Watchlist to automatically refresh the users token. This will reduce the need for the user to log in ([067c029](https://github.com/Ombi-app/Ombi/commit/067c029f42e9fd853d060fdb2093013b15ac14c0))
-
-
-
-## [4.48.5](https://github.com/Ombi-app/Ombi/compare/v4.48.4...v4.48.5) (2025-05-14)
-
-
-### Bug Fixes
-
-* filter out excluded notification agents from user preferences ([c9ab4f4](https://github.com/Ombi-app/Ombi/commit/c9ab4f4f9faa66dbf263da693db1eefcf68beeec)), closes [#5196](https://github.com/Ombi-app/Ombi/issues/5196)
-
-
-
-## [4.48.4](https://github.com/Ombi-app/Ombi/compare/v4.48.3...v4.48.4) (2025-05-14)
-
-
-### Bug Fixes
-
-* **translations:** 🌐 New translations from Crowdin [skip ci] ([dbbfdd9](https://github.com/Ombi-app/Ombi/commit/dbbfdd926f0808f6d16f0b2cd8b5406e6b610c82))
-* **translations:** 🌐 New translations from Crowdin [skip ci] ([53a6a09](https://github.com/Ombi-app/Ombi/commit/53a6a092b14b8b8bdbff95d066926d3dbe6951f4))
-* **ui:** correct timezone handling in OmbiDatePipe ([f88c5ad](https://github.com/Ombi-app/Ombi/commit/f88c5ad818fadea7064e7dfbe46f07eae855109a)), closes [#5102](https://github.com/Ombi-app/Ombi/issues/5102)
-
-
-
-## [4.48.3](https://github.com/Ombi-app/Ombi/compare/v4.48.2...v4.48.3) (2025-05-14)
-
-
-### Bug Fixes
-
-* Correct 4K movie request existence check ([ba6e708](https://github.com/Ombi-app/Ombi/commit/ba6e708e189f52f2ff4ebc073fa38a4f53f1061c)), closes [#4798](https://github.com/Ombi-app/Ombi/issues/4798)
-
-
-
-## [4.48.2](https://github.com/Ombi-app/Ombi/compare/v4.48.1...v4.48.2) (2025-05-14)
-
-
-### Bug Fixes
-
-* **radarr:** ensure RequestedUser is loaded when creating tags ([f8658fe](https://github.com/Ombi-app/Ombi/commit/f8658fe6d56488aa5caa68093245cbf021a31810)), closes [#5045](https://github.com/Ombi-app/Ombi/issues/5045)
-
-
-
-## [4.48.1](https://github.com/Ombi-app/Ombi/compare/v4.48.0...v4.48.1) (2025-05-14)
-
-
-
-# [4.48.0](https://github.com/Ombi-app/Ombi/compare/v4.47.3...v4.48.0) (2025-05-14)
-
-
-### Features
-
-* added the watchlist notification ([0dfd453](https://github.com/Ombi-app/Ombi/commit/0dfd4533dba01cb04ea2217c020de8833ddf39c6))
-
-
-
-## [4.47.3](https://github.com/Ombi-app/Ombi/compare/v4.47.2...v4.47.3) (2025-04-13)
-
-
-### Bug Fixes
-
-* [#5223](https://github.com/Ombi-app/Ombi/issues/5223) ([cf0c161](https://github.com/Ombi-app/Ombi/commit/cf0c1614a496b4f7cf19d78e885c3e37dae5cf0f))
-
-
-
-## [4.47.2](https://github.com/Ombi-app/Ombi/compare/v4.47.0...v4.47.2) (2025-03-11)
-
-
-### Bug Fixes
-
-* **user-import:** Do not import users that do not have access to the server [#5064](https://github.com/Ombi-app/Ombi/issues/5064) ([a801cfd](https://github.com/Ombi-app/Ombi/commit/a801cfdb0946cbee3c35b7e917a240f69020f221))
-
-
-
-# [4.47.0](https://github.com/Ombi-app/Ombi/compare/v4.46.8...v4.47.0) (2025-01-03)
-
-
-### Features
-
-* **wizard:** :sparkles: Added the ability to start with a different database ([#5208](https://github.com/Ombi-app/Ombi/issues/5208)) ([cc98fc6](https://github.com/Ombi-app/Ombi/commit/cc98fc6aca27111a8afc3b7b5b8e53207b73fe15))
-
-
-
## [4.46.8](https://github.com/Ombi-app/Ombi/compare/v4.46.7...v4.46.8) (2025-01-03)
@@ -2211,3 +2097,879 @@
+## [4.43.5](https://github.com/Ombi-app/Ombi/compare/v4.43.4...v4.43.5) (2023-08-24)
+
+
+
+## [4.43.4](https://github.com/Ombi-app/Ombi/compare/v4.43.3...v4.43.4) (2023-07-28)
+
+
+### Bug Fixes
+
+* **user-importer:** Fixed not importing all correct users [#4989](https://github.com/Ombi-app/Ombi/issues/4989) ([34c32f8](https://github.com/Ombi-app/Ombi/commit/34c32f8338705ea3f790d95b91c9ada21a41b9f2))
+
+
+
+## [4.43.3](https://github.com/Ombi-app/Ombi/compare/v4.43.2...v4.43.3) (2023-07-28)
+
+
+### Bug Fixes
+
+* switch back to the old plex friends API [#4989](https://github.com/Ombi-app/Ombi/issues/4989) ([c8ad12e](https://github.com/Ombi-app/Ombi/commit/c8ad12eb5f53889609d1793ae907afd33ba6ef38))
+
+
+
+## [4.43.2](https://github.com/Ombi-app/Ombi/compare/v4.43.1...v4.43.2) (2023-07-19)
+
+
+### Bug Fixes
+
+* **plex-api:** Switch over to the new API to avoid deprecation & save… ([#4986](https://github.com/Ombi-app/Ombi/issues/4986)) ([2f2d35e](https://github.com/Ombi-app/Ombi/commit/2f2d35ec867a8e5488e368db294bd37bcf92d843))
+* Remove old trending source ([#4987](https://github.com/Ombi-app/Ombi/issues/4987)) ([aacaa3e](https://github.com/Ombi-app/Ombi/commit/aacaa3e140b43f5d196da612f785cc4451717752))
+
+
+
+## [4.43.1](https://github.com/Ombi-app/Ombi/compare/v4.43.0...v4.43.1) (2023-07-16)
+
+
+### Bug Fixes
+
+* **user-importer:** don't delete admins in the cleanup ([895b9bf](https://github.com/Ombi-app/Ombi/commit/895b9bf6a060a678d4b0cca8083aa96c38e47b95))
+
+
+
+# [4.43.0](https://github.com/Ombi-app/Ombi/compare/v4.42.3...v4.43.0) (2023-07-14)
+
+
+### Features
+
+* Add Auto Approve 4K role ([#4982](https://github.com/Ombi-app/Ombi/issues/4982)) ([#4983](https://github.com/Ombi-app/Ombi/issues/4983)) ([ac05495](https://github.com/Ombi-app/Ombi/commit/ac054954254b9d77a42e057f1065570c7fdc1093)), closes [#4957](https://github.com/Ombi-app/Ombi/issues/4957)
+
+
+
+## [4.42.3](https://github.com/Ombi-app/Ombi/compare/v4.42.2...v4.42.3) (2023-07-13)
+
+
+### Bug Fixes
+
+* **user-importer:** Do not delete the Plex Admin as part of the user Importer cleanup [#4870](https://github.com/Ombi-app/Ombi/issues/4870) ([#4981](https://github.com/Ombi-app/Ombi/issues/4981)) ([4e80e7b](https://github.com/Ombi-app/Ombi/commit/4e80e7b7c3239a46a645ab6d1054993734ad4dd6))
+
+
+
+## [4.42.2](https://github.com/Ombi-app/Ombi/compare/v4.42.1...v4.42.2) (2023-07-03)
+
+
+### Bug Fixes
+
+* Remove Angular TSLint ([#4973](https://github.com/Ombi-app/Ombi/issues/4973)) ([93969b5](https://github.com/Ombi-app/Ombi/commit/93969b5a2d82f442299bee418fae43cb590d7743))
+* upgrade jquery from 3.6.1 to 3.7.0 ([#4974](https://github.com/Ombi-app/Ombi/issues/4974)) ([f2552ef](https://github.com/Ombi-app/Ombi/commit/f2552ef6ede011080a8d5499e11930c4d41d04c2))
+* upgrade multiple dependencies with Snyk ([#4961](https://github.com/Ombi-app/Ombi/issues/4961)) ([3c3edf6](https://github.com/Ombi-app/Ombi/commit/3c3edf6273fa98c420989ebcebfee52b2545e402))
+* upgrade zone.js from 0.11.8 to 0.13.0 ([#4975](https://github.com/Ombi-app/Ombi/issues/4975)) ([37f6564](https://github.com/Ombi-app/Ombi/commit/37f65648a2f8742020b0954acec4168aee048942))
+
+
+
+## [4.42.1](https://github.com/Ombi-app/Ombi/compare/v4.42.0...v4.42.1) (2023-06-20)
+
+
+### Bug Fixes
+
+* More automation tests mainly around the Plex Settings page ([#4821](https://github.com/Ombi-app/Ombi/issues/4821)) ([21bfc5a](https://github.com/Ombi-app/Ombi/commit/21bfc5a45adf6da6a80854e19494a8ffdc9c0761))
+* src/Ombi.Notifications/Ombi.Notifications.csproj to reduce vulnerabilities ([#4969](https://github.com/Ombi-app/Ombi/issues/4969)) [skip ci] ([8584ad4](https://github.com/Ombi-app/Ombi/commit/8584ad46053c51f5da40b24f3efd1b9e5a031ddd))
+* upgrade @fortawesome/fontawesome-free from 6.1.2 to 6.4.0 ([#4965](https://github.com/Ombi-app/Ombi/issues/4965)) [skip ci] ([84454e5](https://github.com/Ombi-app/Ombi/commit/84454e53c00c808e8a393c7750bdc418a7593e91))
+* upgrade @microsoft/signalr from 6.0.11 to 6.0.16 ([#4964](https://github.com/Ombi-app/Ombi/issues/4964)) [skip ci] ([a0201e3](https://github.com/Ombi-app/Ombi/commit/a0201e3f585dc52f717e33c46ede35a4eccac736))
+* upgrade cypress-real-events from 1.7.4 to 1.8.1 ([#4968](https://github.com/Ombi-app/Ombi/issues/4968)) [skip ci] ([8a24b56](https://github.com/Ombi-app/Ombi/commit/8a24b56299c3bc98bf0d719ba448972aaa7f7461))
+* upgrade multiple dependencies with Snyk ([#4963](https://github.com/Ombi-app/Ombi/issues/4963)) [skip ci] ([6025c5e](https://github.com/Ombi-app/Ombi/commit/6025c5ed757438d3a5d79bd36fd789ef0297ce70))
+* upgrade primeng from 15.0.0-rc.1 to 15.4.1 ([#4962](https://github.com/Ombi-app/Ombi/issues/4962)) [skip ci] ([23a4fed](https://github.com/Ombi-app/Ombi/commit/23a4fede69898a25b342aed78a8cda553c1fd18d))
+
+
+
+# [4.42.0](https://github.com/Ombi-app/Ombi/compare/v4.41.1...v4.42.0) (2023-06-02)
+
+
+### Bug Fixes
+
+* **translations:** 🌐 New translations from Crowdin [skip ci] ([#4926](https://github.com/Ombi-app/Ombi/issues/4926)) ([151efe1](https://github.com/Ombi-app/Ombi/commit/151efe19d0012b85f317c175da5ab4802ea14e20))
+
+
+### Features
+
+* **emby:** Show watched status for TV requests ([1f37de0](https://github.com/Ombi-app/Ombi/commit/1f37de08888812b6d130d92bb664a89e89149105))
+
+
+
+## [4.41.1](https://github.com/Ombi-app/Ombi/compare/v4.41.0...v4.41.1) (2023-05-27)
+
+
+
+# [4.41.0](https://github.com/Ombi-app/Ombi/compare/v4.40.0...v4.41.0) (2023-05-27)
+
+
+### Bug Fixes
+
+* Fix various styling issues ([#4935](https://github.com/Ombi-app/Ombi/issues/4935)) ([90b934a](https://github.com/Ombi-app/Ombi/commit/90b934a36996c0f489096f3641350a1c0d3b7c89))
+
+
+### Features
+
+* **emby:** Show end-user external IP address to Emby when logging in as an Emby user ([#4949](https://github.com/Ombi-app/Ombi/issues/4949)) ([79cef7e](https://github.com/Ombi-app/Ombi/commit/79cef7e0f8643e36536a9ea84dd1a07c232403a9)), closes [#4947](https://github.com/Ombi-app/Ombi/issues/4947)
+
+
+
+# [4.40.0](https://github.com/Ombi-app/Ombi/compare/v4.39.1...v4.40.0) (2023-05-18)
+
+
+
+# [4.39.0](https://github.com/Ombi-app/Ombi/compare/v4.35.11...v4.39.0) (2023-05-17)
+
+
+### Bug Fixes
+
+* **emby:** Fix Emby played sync running a full sync during recently added sync ([#4932](https://github.com/Ombi-app/Ombi/issues/4932)) ([9424586](https://github.com/Ombi-app/Ombi/commit/9424586e9c1b622b6475aeb8ee3cf4a8f346da6e))
+
+
+### Features
+
+* Hide watched status when request is not available ([#4934](https://github.com/Ombi-app/Ombi/issues/4934)) ([82c7f1c](https://github.com/Ombi-app/Ombi/commit/82c7f1c44fd7c87d57cc2b0c34a10fcda7628f4e))
+
+
+
+## [4.38.2](https://github.com/Ombi-app/Ombi/compare/v4.38.1...v4.38.2) (2023-05-17)
+
+
+
+## [4.38.1](https://github.com/Ombi-app/Ombi/compare/v4.38.0...v4.38.1) (2023-05-09)
+
+
+### Bug Fixes
+
+* **API:** Allow RequestOnBehalf rights if requested from the API ([#4919](https://github.com/Ombi-app/Ombi/issues/4919)) ([bb6dedd](https://github.com/Ombi-app/Ombi/commit/bb6deddfaecb3d6c7c3c6970414444b619bb9106))
+* **notificaitons:** Add the RequestedByAlias field to the Notification Message ([7e9c8be](https://github.com/Ombi-app/Ombi/commit/7e9c8bec6b02bb4e11f8db50394e493d4dd07723))
+
+
+
+# [4.38.0](https://github.com/Ombi-app/Ombi/compare/v4.37.3...v4.38.0) (2023-05-07)
+
+
+### Bug Fixes
+
+* remove sort header ([969bc7b](https://github.com/Ombi-app/Ombi/commit/969bc7bb25ea900ab9199509b079b36843e5bd6f))
+
+
+### Features
+
+* **emby:** Show watched status for Movie requests ([9cfb10b](https://github.com/Ombi-app/Ombi/commit/9cfb10bb1ee69067a6f47bd2c8a72d4e6834350e))
+
+
+
+## [4.37.3](https://github.com/Ombi-app/Ombi/compare/v4.37.2...v4.37.3) (2023-05-07)
+
+
+### Bug Fixes
+
+* Show the ApiAlias in the requests-list ([9ff624c](https://github.com/Ombi-app/Ombi/commit/9ff624ce4646815b239fbb8327117947f0a90e4b))
+
+
+
+## [4.37.2](https://github.com/Ombi-app/Ombi/compare/v4.37.1...v4.37.2) (2023-05-03)
+
+
+### Bug Fixes
+
+* **jellyfin:** Fixed an issue where the sync could stop working. Removed unused properties so the deseralization no longer fails ([0e5e0ad](https://github.com/Ombi-app/Ombi/commit/0e5e0adf862701d0f672beff14ec0aa75e4b5220))
+
+
+
+## [4.37.1](https://github.com/Ombi-app/Ombi/compare/v4.37.0...v4.37.1) (2023-05-02)
+
+
+### Bug Fixes
+
+* Cron Validation ([#4842](https://github.com/Ombi-app/Ombi/issues/4842)) ([97cc42f](https://github.com/Ombi-app/Ombi/commit/97cc42ffa8672e7d0d0996b5fbda7f7fe699da2d))
+* **discover:** :children_crossing: Improved the new Genre buttons, it now includes TV results ([b087d60](https://github.com/Ombi-app/Ombi/commit/b087d606ff36565208e564f8856903f2a4098db5))
+* **lidarr:** Change monitor to Existing to properly add artist [#3597](https://github.com/Ombi-app/Ombi/issues/3597) ([506f607](https://github.com/Ombi-app/Ombi/commit/506f60773bf1031d0be51ccd34289b855a04ea40)), closes [/github.com/Lidarr/Lidarr/issues/3597#issuecomment-1530804055](https://github.com//github.com/Lidarr/Lidarr/issues/3597/issues/issuecomment-1530804055)
+
+
+
+# [4.37.0](https://github.com/Ombi-app/Ombi/compare/v4.36.1...v4.37.0) (2023-04-24)
+
+
+### Features
+
+* Search by genre ([1837419](https://github.com/Ombi-app/Ombi/commit/18374198f9f2462ba85c5781b0fcc05892728b21))
+
+
+
+## [4.36.1](https://github.com/Ombi-app/Ombi/compare/v4.36.0...v4.36.1) (2023-04-20)
+
+
+### Bug Fixes
+
+* **healthchecks:** Removed redundant ping check ([1751305](https://github.com/Ombi-app/Ombi/commit/1751305064176d2c0135f867773ccc46b03915ec))
+
+
+
+# [4.36.0](https://github.com/Ombi-app/Ombi/compare/v4.35.19...v4.36.0) (2023-04-20)
+
+
+### Features
+
+* **discover:** Add deny option to recently requested ([#4907](https://github.com/Ombi-app/Ombi/issues/4907)) ([78f340e](https://github.com/Ombi-app/Ombi/commit/78f340ee5f309c55690497170897533801957668))
+
+
+
+## [4.35.19](https://github.com/Ombi-app/Ombi/compare/v4.35.18...v4.35.19) (2023-04-20)
+
+
+### Bug Fixes
+
+* **radarr:** Fixed an issue where the radarr sync would break ([de4baad](https://github.com/Ombi-app/Ombi/commit/de4baade9f87248d77106ff1a313a498870f4fb3))
+
+
+
+## [4.35.18](https://github.com/Ombi-app/Ombi/compare/v4.35.17...v4.35.18) (2023-04-15)
+
+
+### Bug Fixes
+
+* **#4906:** :bug: Fixed an issue with power users and permissions ([80884bc](https://github.com/Ombi-app/Ombi/commit/80884bcd725c329867c278ad235cd4096cd4fe7a))
+
+
+
+## [4.35.17](https://github.com/Ombi-app/Ombi/compare/v4.35.16...v4.35.17) (2023-04-15)
+
+
+### Bug Fixes
+
+* **discover:** Fix denied requests displayed as approved ([#4901](https://github.com/Ombi-app/Ombi/issues/4901)) ([1e87f20](https://github.com/Ombi-app/Ombi/commit/1e87f2010491b0f3fdda70d2b19d9afd94438df7))
+* Fix denied movie shown as 'processing request' in details view ([#4900](https://github.com/Ombi-app/Ombi/issues/4900)) ([0069bfd](https://github.com/Ombi-app/Ombi/commit/0069bfdf54e0785bad45c832ca052f19fd4b940b))
+
+
+
+## [4.35.16](https://github.com/Ombi-app/Ombi/compare/v4.35.15...v4.35.16) (2023-04-13)
+
+
+### Bug Fixes
+
+* Support duplicates in Emby/JF collections ([#4902](https://github.com/Ombi-app/Ombi/issues/4902)) ([141f96d](https://github.com/Ombi-app/Ombi/commit/141f96da5e45d5b3fa5f496806b102e473da6607))
+
+
+
+## [4.35.15](https://github.com/Ombi-app/Ombi/compare/v4.35.14...v4.35.15) (2023-04-06)
+
+
+### Bug Fixes
+
+* **sonarr:** :bug: Stop the sonarr version endpoint from breaking when Sonarr is down [#4895](https://github.com/Ombi-app/Ombi/issues/4895) ([7bb8bec](https://github.com/Ombi-app/Ombi/commit/7bb8becfb140ef6012356752a71d53b5b404e482))
+
+
+
+## [4.35.14](https://github.com/Ombi-app/Ombi/compare/v4.35.13...v4.35.14) (2023-04-06)
+
+
+### Bug Fixes
+
+* Some minor tweaks to the movie info panel ([#4883](https://github.com/Ombi-app/Ombi/issues/4883)) ([1244487](https://github.com/Ombi-app/Ombi/commit/12444871df2f7602200f73971fce962f06b4a80b))
+
+
+
+## [4.35.13](https://github.com/Ombi-app/Ombi/compare/v4.35.12...v4.35.13) (2023-03-28)
+
+
+### Bug Fixes
+
+* **sonarr:** :bug: Added some more error handling and information around testing sonarr ([bd2c2d3](https://github.com/Ombi-app/Ombi/commit/bd2c2d3901e239393010fd582b207f1571fb4b7e)), closes [#4877](https://github.com/Ombi-app/Ombi/issues/4877)
+
+
+
+## [4.35.12](https://github.com/Ombi-app/Ombi/compare/v4.35.10...v4.35.12) (2023-03-25)
+
+
+### Bug Fixes
+
+* **sonarr:** :bug: Improved the error handling in the sonarr settings page in the UI ([fcd78fe](https://github.com/Ombi-app/Ombi/commit/fcd78fee619d10ec7d78e8c8ec6c3ac4b0a361a1)), closes [#4877](https://github.com/Ombi-app/Ombi/issues/4877)
+
+
+
+## [4.35.9](https://github.com/Ombi-app/Ombi/compare/v4.35.8...v4.35.9) (2023-02-24)
+
+
+
+## [4.35.8](https://github.com/Ombi-app/Ombi/compare/v4.35.7...v4.35.8) (2023-02-17)
+
+
+### Bug Fixes
+
+* **plex-oauth:** 🐛 Fixed an issue where using OAuth you could log in as a Ombi Local user [#4835](https://github.com/Ombi-app/Ombi/issues/4835) ([4098da3](https://github.com/Ombi-app/Ombi/commit/4098da305aaea9dae9a552644268a4fed7204cfe))
+
+
+
+## [4.35.7](https://github.com/Ombi-app/Ombi/compare/v4.35.6...v4.35.7) (2023-02-10)
+
+
+### Bug Fixes
+
+* **wizard:** :bug: Stop access to the wizard when you have already setup ombi ([#4866](https://github.com/Ombi-app/Ombi/issues/4866)) ([353de98](https://github.com/Ombi-app/Ombi/commit/353de981a462e1753288d225ec4644a44a62d2bc))
+
+
+
+## [4.35.6](https://github.com/Ombi-app/Ombi/compare/v4.35.5...v4.35.6) (2023-01-31)
+
+
+### Bug Fixes
+
+* Fixed the issue where the login page is still present after logging in with oauth ([aca4ee3](https://github.com/Ombi-app/Ombi/commit/aca4ee37915a28200e5233be3dc711ccc4a5aee9))
+
+
+
+## [4.35.5](https://github.com/Ombi-app/Ombi/compare/v4.35.4...v4.35.5) (2023-01-24)
+
+
+### Bug Fixes
+
+* **radarr-settings:** 🐛 Fixed a typo ([4a50a00](https://github.com/Ombi-app/Ombi/commit/4a50a00d4729d99f4359874b9af4dbc58a0c220b))
+
+
+
+## [4.35.4](https://github.com/Ombi-app/Ombi/compare/v4.35.3...v4.35.4) (2023-01-22)
+
+
+### Bug Fixes
+
+* **discover:** :bug: Fixed the default poster not taking into account the base url in some scenarios [#4845](https://github.com/Ombi-app/Ombi/issues/4845) ([8eda250](https://github.com/Ombi-app/Ombi/commit/8eda250367953183daec03ccb5cdf9fe94275b27))
+* **Hide music from navbar and request list when not enabled:** :bug: ([5123a76](https://github.com/Ombi-app/Ombi/commit/5123a76954e9f81d58c05e31afc7a29aec19cb7a))
+
+
+
+## [4.35.3](https://github.com/Ombi-app/Ombi/compare/v4.35.2...v4.35.3) (2023-01-13)
+
+
+### Bug Fixes
+
+* **#4847:** Invalid Discord request fixed, also fixed an issue where App Only users would not show as logged in on the user management page ([#4848](https://github.com/Ombi-app/Ombi/issues/4848)) ([f229d88](https://github.com/Ombi-app/Ombi/commit/f229d88bd744bc5253b5d3db69ae5ef22d014230))
+
+
+
+## [4.35.2](https://github.com/Ombi-app/Ombi/compare/v4.35.1...v4.35.2) (2023-01-08)
+
+
+### Bug Fixes
+
+* **database:** Just some tweaks, shouldn't notice any difference, maybe a less error in the log ([67fb992](https://github.com/Ombi-app/Ombi/commit/67fb9921c0c025025286eb6c0a9d09fd01b18465))
+
+
+
+## [4.35.1](https://github.com/Ombi-app/Ombi/compare/v4.35.0...v4.35.1) (2023-01-06)
+
+
+### Bug Fixes
+
+* **plex-watchlist:** Index out of bounds error ([8cd556e](https://github.com/Ombi-app/Ombi/commit/8cd556e268931596b9c1d1ae0ce533bfaaf330f4))
+
+
+
+# [4.35.0](https://github.com/Ombi-app/Ombi/compare/v4.34.1...v4.35.0) (2023-01-04)
+
+
+### Features
+
+* Add the option for header authentication to create users ([#4841](https://github.com/Ombi-app/Ombi/issues/4841)) ([e6c9ce5](https://github.com/Ombi-app/Ombi/commit/e6c9ce5ad0056608ecda8273fb8124ed292e2942))
+
+
+
+## [4.34.1](https://github.com/Ombi-app/Ombi/compare/v4.34.0...v4.34.1) (2023-01-04)
+
+
+### Bug Fixes
+
+* **plex-watchlist:** Lookup the ID from different sources when Plex doesn't contain the metadata ([#4843](https://github.com/Ombi-app/Ombi/issues/4843)) ([a2cc23b](https://github.com/Ombi-app/Ombi/commit/a2cc23b351c4a568c44e6c855f94db9f71ad084a))
+
+
+
+# [4.34.0](https://github.com/Ombi-app/Ombi/compare/v4.33.1...v4.34.0) (2023-01-04)
+
+
+### Features
+
+* Radarr tags ([#4815](https://github.com/Ombi-app/Ombi/issues/4815)) ([6fa5064](https://github.com/Ombi-app/Ombi/commit/6fa506491fe867cdeef9df79991ae49319d71c3d))
+
+
+
+## [4.33.1](https://github.com/Ombi-app/Ombi/compare/v4.33.0...v4.33.1) (2022-12-22)
+
+
+### Bug Fixes
+
+* **plex:** Added the watchlist request whole show back into the settings ([10701c4](https://github.com/Ombi-app/Ombi/commit/10701c4a0b6190eebb75c5d8b18224f3d0bc8502))
+
+
+
+# [4.33.0](https://github.com/Ombi-app/Ombi/compare/v4.32.3...v4.33.0) (2022-12-01)
+
+
+### Features
+
+* Angular 15 and Dependency upgrades ([#4818](https://github.com/Ombi-app/Ombi/issues/4818)) ([4816acf](https://github.com/Ombi-app/Ombi/commit/4816acf6f94443d23ebef6091d4cfcbca580f9ca))
+
+
+
+## [4.32.3](https://github.com/Ombi-app/Ombi/compare/v4.32.2...v4.32.3) (2022-11-24)
+
+
+### Bug Fixes
+
+* **sonarr:** V4 actually works this time around ([f62e70f](https://github.com/Ombi-app/Ombi/commit/f62e70fc493c7971da5e4508ce10522f5df0bbf7))
+
+
+
+## [4.32.2](https://github.com/Ombi-app/Ombi/compare/v4.32.1...v4.32.2) (2022-11-23)
+
+
+### Bug Fixes
+
+* **sonarr:** :bug: Sonarr V4 should work now ([#4810](https://github.com/Ombi-app/Ombi/issues/4810)) ([37655af](https://github.com/Ombi-app/Ombi/commit/37655aff9d3d133b42f5664bc9445d6571e966d6))
+
+
+
+## [4.32.1](https://github.com/Ombi-app/Ombi/compare/v4.32.0...v4.32.1) (2022-11-21)
+
+
+### Bug Fixes
+
+* **plex:** :bug: Fixed the issue where you couldn't add a new server on a fresh setup after the settings page rework ([187b18d](https://github.com/Ombi-app/Ombi/commit/187b18d5c01f6a13831e4a410b5d7c349e27d847))
+
+
+
+# [4.32.0](https://github.com/Ombi-app/Ombi/compare/v4.31.0...v4.32.0) (2022-11-18)
+
+
+### Bug Fixes
+
+* **translations:** 🌐 New translations from Crowdin [skip ci] ([#4801](https://github.com/Ombi-app/Ombi/issues/4801)) ([4692003](https://github.com/Ombi-app/Ombi/commit/46920032baed04675b2ffbe1700afdc0740a4ac4))
+
+
+### Features
+
+* **plex:** Rework the Plex Settings page ([#4805](https://github.com/Ombi-app/Ombi/issues/4805)) ([1b8c47f](https://github.com/Ombi-app/Ombi/commit/1b8c47f3163f618851d4904732cb07015e1e93ff))
+
+
+
+# [4.31.0](https://github.com/Ombi-app/Ombi/compare/v4.30.0...v4.31.0) (2022-11-18)
+
+
+### Features
+
+* **sonarr:** Added the ability to add default tags when sending to Sonarr ([#4803](https://github.com/Ombi-app/Ombi/issues/4803)) ([ecfbb8e](https://github.com/Ombi-app/Ombi/commit/ecfbb8eda91e1a90239dcf8be847afcc2394a78e))
+
+
+
+# [4.30.0](https://github.com/Ombi-app/Ombi/compare/v4.29.3...v4.30.0) (2022-11-17)
+
+
+### Features
+
+* **sonarr:** :sparkles: Add the username to a Sonarr tag when sent to Sonarr ([#4802](https://github.com/Ombi-app/Ombi/issues/4802)) ([1d5fabd](https://github.com/Ombi-app/Ombi/commit/1d5fabd317e3ce8f6dd31f06d15dc81277f39dbd))
+
+
+
+## [4.29.3](https://github.com/Ombi-app/Ombi/compare/v4.29.2...v4.29.3) (2022-11-14)
+
+
+### Bug Fixes
+
+* **notifications:** Fixed the Partially TV notifications going to the admin [#4797](https://github.com/Ombi-app/Ombi/issues/4797) ([#4799](https://github.com/Ombi-app/Ombi/issues/4799)) ([bcb3e7f](https://github.com/Ombi-app/Ombi/commit/bcb3e7f00380a4c4278f59dc55febf43e6d05d47))
+* Only log error messages from Microsoft ([#4787](https://github.com/Ombi-app/Ombi/issues/4787)) ([c614e0c](https://github.com/Ombi-app/Ombi/commit/c614e0ca5fe5023cbe7ced326145273cd75be85d))
+
+
+
+## [4.29.2](https://github.com/Ombi-app/Ombi/compare/v4.29.1...v4.29.2) (2022-10-24)
+
+
+### Bug Fixes
+
+* **plex:** Fixed an issue where sometimes the availability checker would throw an exception when checking episodes ([17ba202](https://github.com/Ombi-app/Ombi/commit/17ba2020ee0950c2c0e0e03fdb7835b579da75a9))
+
+
+
+## [4.29.1](https://github.com/Ombi-app/Ombi/compare/v4.29.0...v4.29.1) (2022-10-22)
+
+
+### Bug Fixes
+
+* Consistently reset loading flag when requesting movies on discover page. ([#4777](https://github.com/Ombi-app/Ombi/issues/4777)) ([a40ab5c](https://github.com/Ombi-app/Ombi/commit/a40ab5cddf769d4147696eca50c1610b466ab99b))
+* **sonarr:** :bug: Fixed an issue where the language list didn't correctly load for power users in the advanced options [#4782](https://github.com/Ombi-app/Ombi/issues/4782) ([2173670](https://github.com/Ombi-app/Ombi/commit/217367047d1568070dd507e54ad3fd2c68f05b88))
+
+
+
+# [4.29.0](https://github.com/Ombi-app/Ombi/compare/v4.28.1...v4.29.0) (2022-10-19)
+
+
+### Bug Fixes
+
+* Partially Available prevents further TV requests ([#4768](https://github.com/Ombi-app/Ombi/issues/4768)) ([#4779](https://github.com/Ombi-app/Ombi/issues/4779)) ([031e2b9](https://github.com/Ombi-app/Ombi/commit/031e2b9283b239827cabaca4e35f69f2f93a4d7b))
+* Unable to Delete Jellyfin Server ([#4705](https://github.com/Ombi-app/Ombi/issues/4705)) ([#4780](https://github.com/Ombi-app/Ombi/issues/4780)) ([76a0d0d](https://github.com/Ombi-app/Ombi/commit/76a0d0d26893bd480fea4735f77522ac6261a425))
+
+
+### Features
+
+* Provide a flag for missing users on Plex Server ([#4688](https://github.com/Ombi-app/Ombi/issues/4688)) ([#4778](https://github.com/Ombi-app/Ombi/issues/4778)) ([b4a14c2](https://github.com/Ombi-app/Ombi/commit/b4a14c2d28218409390e517b226130e3e84efee1))
+
+
+
+## [4.28.1](https://github.com/Ombi-app/Ombi/compare/v4.28.0...v4.28.1) (2022-10-19)
+
+
+### Bug Fixes
+
+* **plex:** :bug: Fixed not being able to enable watchlist requests in the Plex settings ([3e5158e](https://github.com/Ombi-app/Ombi/commit/3e5158ef9cda58ea2dd3be143f07aa5433691d79))
+* Reworked the version check ([#4719](https://github.com/Ombi-app/Ombi/issues/4719)) ([#4781](https://github.com/Ombi-app/Ombi/issues/4781)) ([55855c5](https://github.com/Ombi-app/Ombi/commit/55855c5adda3cd1c51b7fbd0c19b469fc813f98e))
+
+
+
+# [4.28.0](https://github.com/Ombi-app/Ombi/compare/v4.27.8...v4.28.0) (2022-10-07)
+
+
+### Features
+
+* **plex:** ✨ Added the ability to configure the watchlist to request the whole TV show rather than latest season ([#4774](https://github.com/Ombi-app/Ombi/issues/4774)) ([fa65712](https://github.com/Ombi-app/Ombi/commit/fa65712bd570fe8d5d21b8ca0abe182b84960017))
+
+
+
+## [4.27.8](https://github.com/Ombi-app/Ombi/compare/v4.27.7...v4.27.8) (2022-10-07)
+
+
+
+## [4.27.7](https://github.com/Ombi-app/Ombi/compare/v4.27.6...v4.27.7) (2022-10-07)
+
+
+### Bug Fixes
+
+* Fixes default image for recently requested items. ([#4767](https://github.com/Ombi-app/Ombi/issues/4767)) ([2e6f35f](https://github.com/Ombi-app/Ombi/commit/2e6f35f89abb3dd3685ec8289f8620c7ef7072cd))
+
+
+
+## [4.27.6](https://github.com/Ombi-app/Ombi/compare/v4.27.5...v4.27.6) (2022-10-01)
+
+
+### Bug Fixes
+
+* **notifications:** Fixed the error when sending multiple test notifications. Added more logging when Discord complains the message is invalid ([fc14780](https://github.com/Ombi-app/Ombi/commit/fc14780bd354483119ddcbb55a8c382e1890a783))
+
+
+
+## [4.27.5](https://github.com/Ombi-app/Ombi/compare/v4.27.4...v4.27.5) (2022-09-30)
+
+
+### Bug Fixes
+
+* **importer:** 🐛 Allow you to only import Plex Admins without the Plex Users ([8c9ad9b](https://github.com/Ombi-app/Ombi/commit/8c9ad9b414fdc6c88bdb911d6057ae5d38783b98))
+
+
+
+## [4.27.4](https://github.com/Ombi-app/Ombi/compare/v4.27.3...v4.27.4) (2022-09-30)
+
+
+
+## [4.27.3](https://github.com/Ombi-app/Ombi/compare/v4.27.2...v4.27.3) (2022-09-30)
+
+
+### Bug Fixes
+
+* **availability:** 🐛 Fixed a issue with the availability checker after the previous update. Added full test coverage around that area ([28e2480](https://github.com/Ombi-app/Ombi/commit/28e248046ad56390595f84172bbd5f5961325b4d))
+
+
+
+## [4.27.2](https://github.com/Ombi-app/Ombi/compare/v4.27.1...v4.27.2) (2022-09-29)
+
+
+### Bug Fixes
+
+* **sonarr:** :bug: Cleaned up and removed Sonarr v3 option, sonarr v3 is now the default. This allows us to get ready for the upcoming Sonarr v4 ([#4764](https://github.com/Ombi-app/Ombi/issues/4764)) ([2cddec7](https://github.com/Ombi-app/Ombi/commit/2cddec759004b6490f686ff74cb092238e3dc946))
+
+
+
+## [4.27.1](https://github.com/Ombi-app/Ombi/compare/v4.27.0...v4.27.1) (2022-09-20)
+
+
+### Bug Fixes
+
+* **plex:** stop the plex sync from deleting episodes when we can't find the plex key ([66b05e5](https://github.com/Ombi-app/Ombi/commit/66b05e5a85dbfe1fec5f9366e80987f2cfa1f4fe))
+
+
+
+# [4.27.0](https://github.com/Ombi-app/Ombi/compare/v4.26.0...v4.27.0) (2022-09-14)
+
+
+### Features
+
+* Recently requested improvements ([#4755](https://github.com/Ombi-app/Ombi/issues/4755)) ([ff04d87](https://github.com/Ombi-app/Ombi/commit/ff04d875343604c77c391bf55d0968977e480281))
+
+
+
+# [4.26.0](https://github.com/Ombi-app/Ombi/compare/v4.25.1...v4.26.0) (2022-09-07)
+
+
+### Features
+
+* **notifications:** Add more curly variables for partially available notification ([66aa101](https://github.com/Ombi-app/Ombi/commit/66aa101019c4c4b34e186db9d303049d02b9c781))
+
+
+
+## [4.25.1](https://github.com/Ombi-app/Ombi/compare/v4.25.0...v4.25.1) (2022-09-07)
+
+
+### Bug Fixes
+
+* **webhook:** Remove added trailing slash from webhook URL [#4710](https://github.com/Ombi-app/Ombi/issues/4710) ([369eb33](https://github.com/Ombi-app/Ombi/commit/369eb339171671101be219486e2aab27a20f3d74))
+
+
+
+# [4.25.0](https://github.com/Ombi-app/Ombi/compare/v4.24.0...v4.25.0) (2022-08-23)
+
+
+### Bug Fixes
+
+* fixed stats controller ([#4742](https://github.com/Ombi-app/Ombi/issues/4742)) ([47ea64b](https://github.com/Ombi-app/Ombi/commit/47ea64b5a401770f1943b575ca40f84d515e96b3))
+
+
+### Features
+
+* Watchlist history errors([#4741](https://github.com/Ombi-app/Ombi/issues/4741)) ([c222f1a](https://github.com/Ombi-app/Ombi/commit/c222f1a945e944ef34e68cad2b61f40e57cab823))
+
+
+
+# [4.24.0](https://github.com/Ombi-app/Ombi/compare/v4.23.2...v4.24.0) (2022-08-22)
+
+
+### Features
+
+* add crew on movie page ([#4722](https://github.com/Ombi-app/Ombi/issues/4722)) ([1d53261](https://github.com/Ombi-app/Ombi/commit/1d532613823804b25984bd1d223d081a54ad143d))
+
+
+
+## [4.23.2](https://github.com/Ombi-app/Ombi/compare/v4.23.1...v4.23.2) (2022-08-22)
+
+
+### Bug Fixes
+
+* Fix conflicting property name for Swagger ([#4733](https://github.com/Ombi-app/Ombi/issues/4733)) ([d661f32](https://github.com/Ombi-app/Ombi/commit/d661f32e8a9e105faab6380b4b7b642896b98163))
+
+
+
+## [4.23.1](https://github.com/Ombi-app/Ombi/compare/v4.23.0...v4.23.1) (2022-08-12)
+
+
+### Bug Fixes
+
+* Localize recently requested on discover page ([#4729](https://github.com/Ombi-app/Ombi/issues/4729)) ([bf65c76](https://github.com/Ombi-app/Ombi/commit/bf65c76ff9ce38f65a9e5feb872734e8d8e35eb6))
+
+
+
+# [4.23.0](https://github.com/Ombi-app/Ombi/compare/v4.22.5...v4.23.0) (2022-08-09)
+
+
+### Bug Fixes
+
+* Log Microsoft warnings to log file ([#4723](https://github.com/Ombi-app/Ombi/issues/4723)) ([26ac75f](https://github.com/Ombi-app/Ombi/commit/26ac75f0c223c2a91e3471797ae46ede3fde89cc))
+
+
+### Features
+
+* ✨ Recently Requested on Discover Page ([#4387](https://github.com/Ombi-app/Ombi/issues/4387)) ([44d38fb](https://github.com/Ombi-app/Ombi/commit/44d38fbaae521dbb467b61c7471b2384015ac52e))
+
+
+
+## [4.22.4](https://github.com/Ombi-app/Ombi/compare/v4.22.3...v4.22.4) (2022-08-04)
+
+
+### Bug Fixes
+
+* :bug: Fixed missing externals ([#4712](https://github.com/Ombi-app/Ombi/issues/4712)) ([fcc1eaa](https://github.com/Ombi-app/Ombi/commit/fcc1eaaa377683dcdc81d62a2a688fb0c4490c7b))
+* fixed trakt image not loading when base url present ([#4711](https://github.com/Ombi-app/Ombi/issues/4711)) ([f102dcf](https://github.com/Ombi-app/Ombi/commit/f102dcf751c2eb62ebfe30f9f8e4b2ad863c3b0d))
+* **translations:** 🌐 New translations from Crowdin [skip ci] ([#4713](https://github.com/Ombi-app/Ombi/issues/4713)) ([ff142b0](https://github.com/Ombi-app/Ombi/commit/ff142b09abbb2f9540387284222552e6e12639fe))
+
+
+
+## [4.22.3](https://github.com/Ombi-app/Ombi/compare/v4.22.2...v4.22.3) (2022-07-28)
+
+
+### Bug Fixes
+
+* Override Sonarr V3 Profiles endpoint ([#4678](https://github.com/Ombi-app/Ombi/issues/4678)) ([875da95](https://github.com/Ombi-app/Ombi/commit/875da959f353119b05138d68ee6d32a49e14b91e))
+
+
+
+## [4.22.2](https://github.com/Ombi-app/Ombi/compare/v4.22.1...v4.22.2) (2022-07-25)
+
+
+### Bug Fixes
+
+* fixed an issue where I broke images for some users ([81ddc85](https://github.com/Ombi-app/Ombi/commit/81ddc8553b9094c3f6843b036daebb2eb9262e00))
+
+
+
+## [4.22.1](https://github.com/Ombi-app/Ombi/compare/v4.22.0...v4.22.1) (2022-07-25)
+
+
+### Bug Fixes
+
+* **discover:** :bug: Created new Image component to handle 429's from TMDB ([#4698](https://github.com/Ombi-app/Ombi/issues/4698)) and fixed [#4635](https://github.com/Ombi-app/Ombi/issues/4635) ([#4699](https://github.com/Ombi-app/Ombi/issues/4699)) ([f22d3da](https://github.com/Ombi-app/Ombi/commit/f22d3da765799365455b919027f7563e52b347c3))
+
+
+
+# [4.22.0](https://github.com/Ombi-app/Ombi/compare/v4.21.2...v4.22.0) (2022-07-22)
+
+
+### Features
+
+* **discover:** ✨ Added infinite scroll on advanced search results ([898bc89](https://github.com/Ombi-app/Ombi/commit/898bc89fa78245c1f3de9481f6c724f087a16e39))
+
+
+
+## [4.21.2](https://github.com/Ombi-app/Ombi/compare/v4.21.1...v4.21.2) (2022-07-22)
+
+
+### Bug Fixes
+
+* Landing and Login page improvements ([#4690](https://github.com/Ombi-app/Ombi/issues/4690)) ([6d423b5](https://github.com/Ombi-app/Ombi/commit/6d423b5447c52c5e59d8d2bd92a23b47468eb736))
+
+
+
+## [4.21.1](https://github.com/Ombi-app/Ombi/compare/v4.21.0...v4.21.1) (2022-07-11)
+
+
+### Bug Fixes
+
+* **images:** Retry images with a backoff when we get a Too Many requests from TheMovieDb [#4685](https://github.com/Ombi-app/Ombi/issues/4685) ([3f1f35d](https://github.com/Ombi-app/Ombi/commit/3f1f35df3164db6739691cdda8f925c296239791))
+
+
+
+# [4.21.0](https://github.com/Ombi-app/Ombi/compare/v4.20.4...v4.21.0) (2022-06-22)
+
+
+### Features
+
+* Upgrade to Angular14 ([#4668](https://github.com/Ombi-app/Ombi/issues/4668)) ([b9d55a4](https://github.com/Ombi-app/Ombi/commit/b9d55a469b412558cbf67c1e25db7fdda5964cd8))
+
+
+### Performance Improvements
+
+* stop populating obsolete subscribe fields ([#4625](https://github.com/Ombi-app/Ombi/issues/4625)) ([9a73463](https://github.com/Ombi-app/Ombi/commit/9a734637665f671b17c2bb440d93b35a891c142b))
+
+
+
+## [4.20.4](https://github.com/Ombi-app/Ombi/compare/v4.20.3...v4.20.4) (2022-06-15)
+
+
+### Bug Fixes
+
+* fixed build ([f877921](https://github.com/Ombi-app/Ombi/commit/f8779219146051ea74f8b6408658ff7975afb88b))
+
+
+
+## [4.20.3](https://github.com/Ombi-app/Ombi/compare/v4.20.2...v4.20.3) (2022-06-05)
+
+
+### Bug Fixes
+
+* **plex:** 🐛 Fixed an issue with the Plex Sync ([ab1a11a](https://github.com/Ombi-app/Ombi/commit/ab1a11af78efbe9d37bd55aa80a640796c138a98))
+
+
+
+## [4.20.2](https://github.com/Ombi-app/Ombi/compare/v4.20.1...v4.20.2) (2022-06-03)
+
+
+### Bug Fixes
+
+* :bug: Fixed the Request on Behalf of having blanks ([#4667](https://github.com/Ombi-app/Ombi/issues/4667)) ([7dd9b1c](https://github.com/Ombi-app/Ombi/commit/7dd9b1cac07f571dd35b362544e4fe0226c4b817))
+
+
+
+## [4.20.1](https://github.com/Ombi-app/Ombi/compare/v4.20.0...v4.20.1) (2022-05-27)
+
+
+### Bug Fixes
+
+* added media type tag to media type text ([#4638](https://github.com/Ombi-app/Ombi/issues/4638)) ([fe501d3](https://github.com/Ombi-app/Ombi/commit/fe501d34a0c36ac9f000b107eca49dbc6694d006))
+* **API:** Fix pagination in some edge cases ([#4649](https://github.com/Ombi-app/Ombi/issues/4649)) ([a70bf8f](https://github.com/Ombi-app/Ombi/commit/a70bf8f46c76d74c9dfdf908c53bd9955ca0a35d))
+* **discover:** Carousel touch not working when scrolling page and recommendations and similar movie navigation ([#4633](https://github.com/Ombi-app/Ombi/issues/4633)) ([d5ef1d5](https://github.com/Ombi-app/Ombi/commit/d5ef1d53e5f77d19dba8b8059c80b538a3e14f2a))
+* Improve Swagger documentation ([#4652](https://github.com/Ombi-app/Ombi/issues/4652)) ([181892b](https://github.com/Ombi-app/Ombi/commit/181892bcfe88e6d76febf49ef57745d04552d08e))
+* Missing Poster broken link fix ([#4637](https://github.com/Ombi-app/Ombi/issues/4637)) ([4070f0d](https://github.com/Ombi-app/Ombi/commit/4070f0d093b1c92487a1c80cabad8283a9650f51))
+* **sickrage:** Fixed issue with incorrect handling of SiCKRAGE episode results returned during episode status changes, now expects array of objects from data path if present ([#4648](https://github.com/Ombi-app/Ombi/issues/4648)) ([6d16442](https://github.com/Ombi-app/Ombi/commit/6d16442d4d714920367df065a3ced42b729f4233))
+* **sync:** Emby+Jellyfin - sync multi-episode files of 3+ episodes ([bd8fd89](https://github.com/Ombi-app/Ombi/commit/bd8fd890554c9d85d6da4d2cee813e82ce698e52))
+
+
+
+# [4.20.0](https://github.com/Ombi-app/Ombi/compare/v4.19.1...v4.20.0) (2022-04-28)
+
+
+### Features
+
+* **discover:** Show more relevant shows in upcoming TV ([8357819](https://github.com/Ombi-app/Ombi/commit/8357819b53b8c675c0b246d7006b5a778bdba33f))
+
+
+
+## [4.19.1](https://github.com/Ombi-app/Ombi/compare/v4.19.0...v4.19.1) (2022-04-27)
+
+
+
+# [4.19.0](https://github.com/Ombi-app/Ombi/compare/v4.18.0...v4.19.0) (2022-04-27)
+
+
+### Features
+
+* **sync:** Detect reidentified movies in Emby and Jellyfin ([5938077](https://github.com/Ombi-app/Ombi/commit/5938077d82a5357f79c07b218b3986557a5816e8))
+* **sync:** Detect reidentified series in Emby and Jellyfin ([9096e91](https://github.com/Ombi-app/Ombi/commit/9096e91d55d268819bce22831f8a8b27f2a1776b))
+
+
+
+# [4.18.0](https://github.com/Ombi-app/Ombi/compare/v4.17.0...v4.18.0) (2022-04-26)
+
+
+### Bug Fixes
+
+* **discover:** Fix cache mix up ([03d9422](https://github.com/Ombi-app/Ombi/commit/03d94220c7eaafb50c6c80a6ed1150794b873ac3))
+* **discover:** Fix new trending feature detection ([6794b88](https://github.com/Ombi-app/Ombi/commit/6794b887f6544fb41528bdd9728b7824b65e47ee))
+* **settings:** Allow toggling features when there are more than one ([a373359](https://github.com/Ombi-app/Ombi/commit/a373359ae8e6bad42b558a6e01a8ff2840d3bbaa))
+
+
+### Features
+
+* **discover:** Add new trending source experimental feature ([1a0823c](https://github.com/Ombi-app/Ombi/commit/1a0823ca80559417c67323aaeaa1ef5243e98031))
+* **discover:** Default trending source to new logic ([4f12939](https://github.com/Ombi-app/Ombi/commit/4f12939e22020a67a5ee75e2907923faea136e8d))
+
+
+
+# [4.17.0](https://github.com/Ombi-app/Ombi/compare/v4.16.17...v4.17.0) (2022-04-25)
+
+
+
+## [4.16.17](https://github.com/Ombi-app/Ombi/compare/v4.16.16...v4.16.17) (2022-04-25)
+
+
+
+## [4.16.16](https://github.com/Ombi-app/Ombi/compare/v4.16.15...v4.16.16) (2022-04-25)
+
+
+### Bug Fixes
+
+* **4616:** :bug: fixed mandatory fields ([d8f2260](https://github.com/Ombi-app/Ombi/commit/d8f2260c7ae3ed48386743b7adbd06e284487034))
+
+
+
+## [4.16.15](https://github.com/Ombi-app/Ombi/compare/v4.16.14...v4.16.15) (2022-04-24)
+
+
+### Features
+
+* **discover:** Add original language filter ([ef7ec86](https://github.com/Ombi-app/Ombi/commit/ef7ec861d8aede2a4817752c990617f583805391))
+
+
+
+## [4.16.14](https://github.com/Ombi-app/Ombi/compare/v4.16.13...v4.16.14) (2022-04-19)
+
+
+
+## [4.16.13](https://github.com/Ombi-app/Ombi/compare/v4.16.12...v4.16.13) (2022-04-19)
+
+
+
diff --git a/README.md b/README.md
index 8fb37b8f8..8091207a6 100644
--- a/README.md
+++ b/README.md
@@ -122,10 +122,10 @@ Here are some of the features Ombi has:
-
-
+
+
- Amy Jeanes
+ Matt Jeanes
@@ -752,8 +752,8 @@ Here are some of the features Ombi has:
-
-
+
+
Aljosa Asanovic
diff --git a/src/.idea/.idea.Ombi/.idea/contentModel.xml b/src/.idea/.idea.Ombi/.idea/contentModel.xml
new file mode 100644
index 000000000..ffc2d3ce6
--- /dev/null
+++ b/src/.idea/.idea.Ombi/.idea/contentModel.xml
@@ -0,0 +1,2309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.idea/.idea.Ombi/.idea/dbnavigator.xml b/src/.idea/.idea.Ombi/.idea/dbnavigator.xml
deleted file mode 100644
index 4e210d20a..000000000
--- a/src/.idea/.idea.Ombi/.idea/dbnavigator.xml
+++ /dev/null
@@ -1,440 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.idea/.idea.Ombi/.idea/indexLayout.xml b/src/.idea/.idea.Ombi/.idea/indexLayout.xml
index 7b08163ce..27ba142e9 100644
--- a/src/.idea/.idea.Ombi/.idea/indexLayout.xml
+++ b/src/.idea/.idea.Ombi/.idea/indexLayout.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/src/.idea/.idea.Ombi/.idea/modules.xml b/src/.idea/.idea.Ombi/.idea/modules.xml
new file mode 100644
index 000000000..4d6d71637
--- /dev/null
+++ b/src/.idea/.idea.Ombi/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.idea/.idea.Ombi/.idea/projectSettingsUpdater.xml b/src/.idea/.idea.Ombi/.idea/projectSettingsUpdater.xml
deleted file mode 100644
index 64af657f5..000000000
--- a/src/.idea/.idea.Ombi/.idea/projectSettingsUpdater.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/.idea/.idea.Ombi/.idea/workspace.xml b/src/.idea/.idea.Ombi/.idea/workspace.xml
index d008ba9a7..30951a63b 100644
--- a/src/.idea/.idea.Ombi/.idea/workspace.xml
+++ b/src/.idea/.idea.Ombi/.idea/workspace.xml
@@ -1,20 +1,25 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
@@ -232,75 +237,27 @@
- {
- "lastFilter": {
- "state": "OPEN",
- "assignee": "tidusjar"
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {
- "selectedUrlAndAccountId": {
- "url": "https://github.com/ombi-app/ombi",
- "accountId": "22dd09fe-fb9e-48a4-bfcc-3c152edf3f25"
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -318,17 +275,12 @@
- {
- "customColor": "",
- "associatedIndex": 0
-}
-
@@ -391,26 +343,27 @@
-
-
-
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -423,7 +376,7 @@
-
+
@@ -438,7 +391,7 @@
-
+
@@ -453,7 +406,7 @@
-
+
@@ -468,7 +421,7 @@
-
+
@@ -483,11 +436,10 @@
-
+
-
@@ -496,9 +448,6 @@
1563957157468
-
-
-
@@ -544,11 +493,7 @@
-
-
-
-
-
+
@@ -560,7 +505,7 @@
file://$PROJECT_DIR$/Ombi/Controllers/V1/TokenController.cs
48
-
+
@@ -573,12 +518,12 @@
file://$PROJECT_DIR$/Ombi.Core/Engine/V2/MultiSearchEngine.cs
59
-
+
-
+
-
+
@@ -586,12 +531,12 @@
file://$PROJECT_DIR$/Ombi.Core/Engine/V2/MultiSearchEngine.cs
49
-
+
-
+
-
+
@@ -599,55 +544,16 @@
file://$PROJECT_DIR$/Ombi.Api.MusicBrainz/MusicBrainzApi.cs
30
-
+
-
+
-
+
-
- file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs
- 110
-
-
-
-
-
-
-
-
-
-
-
- file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs
- 77
-
-
-
-
-
-
-
-
-
-
-
- file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs
- 100
-
-
-
-
-
-
-
-
-
-
diff --git a/src/.idea/.idea.Ombi/riderModule.iml b/src/.idea/.idea.Ombi/riderModule.iml
new file mode 100644
index 000000000..d716cec6d
--- /dev/null
+++ b/src/.idea/.idea.Ombi/riderModule.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/.vscode/tasks.json b/src/.vscode/tasks.json
index ad83d25c8..ad868d2dc 100644
--- a/src/.vscode/tasks.json
+++ b/src/.vscode/tasks.json
@@ -1,31 +1,22 @@
{
- "version": "2.0.0",
+ "version": "0.1.0",
"command": "dotnet",
+ "isShellCommand": true,
"args": [],
"tasks": [
{
- "label": "build",
- "type": "shell",
- "command": "dotnet",
+ "taskName": "build",
"args": [
- "build",
"${workspaceRoot}/Ombi/Ombi.csproj"
],
- "problemMatcher": "$msCompile",
- "group": {
- "_id": "build",
- "isDefault": false
- }
+ "isBuildCommand": true,
+ "problemMatcher": "$msCompile"
},
{
- "label": "lint",
- "type": "shell",
+ "taskName": "lint",
"command": "npm",
- "args": [
- "run",
- "lint"
- ],
- "problemMatcher": []
+ "isShellCommand": true,
+ "args": ["run", "lint"]
}
]
}
\ No newline at end of file
diff --git a/src/Ombi.Api.Plex/IPlexApi.cs b/src/Ombi.Api.Plex/IPlexApi.cs
index be6a61c16..6632da875 100644
--- a/src/Ombi.Api.Plex/IPlexApi.cs
+++ b/src/Ombi.Api.Plex/IPlexApi.cs
@@ -29,6 +29,5 @@ namespace Ombi.Api.Plex
Task AddUser(string emailAddress, string serverId, string authToken, int[] libs);
Task GetWatchlist(string plexToken, CancellationToken cancellationToken);
Task GetWatchlistMetadata(string ratingKey, string plexToken, CancellationToken cancellationToken);
- Task Ping(string authToken, CancellationToken cancellationToken = default);
}
}
\ No newline at end of file
diff --git a/src/Ombi.Api.Plex/Models/Friends/PlexFriends.cs b/src/Ombi.Api.Plex/Models/Friends/PlexFriends.cs
index c0442da03..1e597d916 100644
--- a/src/Ombi.Api.Plex/Models/Friends/PlexFriends.cs
+++ b/src/Ombi.Api.Plex/Models/Friends/PlexFriends.cs
@@ -22,18 +22,6 @@ namespace Ombi.Api.Plex.Models.Friends
///
[XmlAttribute(AttributeName = "home")]
public bool HomeUser { get; set; }
-
- [XmlElement(ElementName = "Server")]
- public PlexUserServer[] Server { get; set; }
- }
-
- public class PlexUserServer
- {
- [XmlAttribute(AttributeName = "id")]
- public string Id { get; set; }
-
- [XmlAttribute(AttributeName = "serverId")]
- public string ServerId { get; set; }
}
[XmlRoot(ElementName = "MediaContainer")]
diff --git a/src/Ombi.Api.Plex/PlexApi.cs b/src/Ombi.Api.Plex/PlexApi.cs
index 8babba05d..cc0d13aaa 100644
--- a/src/Ombi.Api.Plex/PlexApi.cs
+++ b/src/Ombi.Api.Plex/PlexApi.cs
@@ -68,7 +68,7 @@ namespace Ombi.Api.Plex
private const string FriendsUri = "https://plex.tv/api/users";
private const string GetAccountUri = "https://plex.tv/users/account.json";
private const string ServerUri = "https://plex.tv/pms/servers.xml";
- private const string WatchlistUri = "https://discover.provider.plex.tv/";
+ private const string WatchlistUri = "https://metadata.provider.plex.tv/";
///
/// Sign into the Plex API
@@ -320,30 +320,6 @@ namespace Ombi.Api.Plex
return result;
}
- ///
- /// Pings the Plex API to validate if a token is still valid
- ///
- /// The authentication token to validate
- /// Cancellation token
- /// True if the token is valid, false otherwise
- public async Task Ping(string authToken, CancellationToken cancellationToken = default)
- {
- try
- {
- var request = new Request("api/v2/ping", "https://plex.tv/", HttpMethod.Get);
- await AddHeaders(request, authToken);
-
- // We don't need to parse the response, just check if the request succeeds
- await Api.Request(request, cancellationToken);
- return true;
- }
- catch
- {
- // If the request fails (401, 403, etc.), the token is invalid
- return false;
- }
- }
-
///
/// Adds the required headers and also the authorization header
diff --git a/src/Ombi.Core/Authentication/PlexTokenKeepAliveService.cs b/src/Ombi.Core/Authentication/PlexTokenKeepAliveService.cs
deleted file mode 100644
index d29da4a5a..000000000
--- a/src/Ombi.Core/Authentication/PlexTokenKeepAliveService.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.Extensions.Logging;
-using Ombi.Api.Plex;
-
-namespace Ombi.Core.Authentication
-{
- public interface IPlexTokenKeepAliveService
- {
- Task KeepTokenAliveAsync(string token, CancellationToken cancellationToken);
- }
-
- public class PlexTokenKeepAliveService : IPlexTokenKeepAliveService
- {
- private readonly IPlexApi _plexApi;
- private readonly ILogger _logger;
-
- public PlexTokenKeepAliveService(IPlexApi plexApi, ILogger logger)
- {
- _plexApi = plexApi;
- _logger = logger;
- }
-
- public async Task KeepTokenAliveAsync(string token, CancellationToken cancellationToken)
- {
- try
- {
- if (string.IsNullOrEmpty(token))
- {
- _logger.LogWarning("Token is null or empty");
- return false;
- }
-
- // Use the Ping method to validate the token
- var isValid = await _plexApi.Ping(token, cancellationToken);
-
- if (!isValid)
- {
- _logger.LogWarning("Token validation failed - token may be expired or invalid");
- }
-
- return isValid;
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Error occurred while keeping token alive");
- return false;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/Ombi.Core/Engine/MovieRequestEngine.cs b/src/Ombi.Core/Engine/MovieRequestEngine.cs
index 82a6bce21..4d3cd2cf9 100644
--- a/src/Ombi.Core/Engine/MovieRequestEngine.cs
+++ b/src/Ombi.Core/Engine/MovieRequestEngine.cs
@@ -598,13 +598,13 @@ namespace Ombi.Core.Engine
public async Task ApproveMovieById(int requestId, bool is4K)
{
- var request = await MovieRepository.GetWithUser().FirstOrDefaultAsync(x => x.Id == requestId);
+ var request = await MovieRepository.Find(requestId);
return await ApproveMovie(request, is4K);
}
public async Task DenyMovieById(int modelId, string denyReason, bool is4K)
{
- var request = await MovieRepository.GetWithUser().FirstOrDefaultAsync(x => x.Id == modelId);
+ var request = await MovieRepository.Find(modelId);
if (request == null)
{
return new RequestEngineResult
@@ -790,7 +790,7 @@ namespace Ombi.Core.Engine
public async Task ReProcessRequest(int requestId, bool is4K, CancellationToken cancellationToken)
{
- var request = await MovieRepository.GetWithUser().FirstOrDefaultAsync(x => x.Id == requestId);
+ var request = await MovieRepository.Find(requestId);
if (request == null)
{
return new RequestEngineResult
@@ -805,7 +805,7 @@ namespace Ombi.Core.Engine
public async Task MarkUnavailable(int modelId, bool is4K)
{
- var request = await MovieRepository.GetWithUser().FirstOrDefaultAsync(x => x.Id == modelId);
+ var request = await MovieRepository.Find(modelId);
if (request == null)
{
return new RequestEngineResult
@@ -834,7 +834,7 @@ namespace Ombi.Core.Engine
public async Task MarkAvailable(int modelId, bool is4K)
{
- var request = await MovieRepository.GetWithUser().FirstOrDefaultAsync(x => x.Id == modelId);
+ var request = await MovieRepository.Find(modelId);
if (request == null)
{
return new RequestEngineResult
diff --git a/src/Ombi.Core/Helpers/DatabaseConfigurationSetup.cs b/src/Ombi.Core/Helpers/DatabaseConfigurationSetup.cs
deleted file mode 100644
index 2f1933184..000000000
--- a/src/Ombi.Core/Helpers/DatabaseConfigurationSetup.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using System;
-using System.Text;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Storage;
-using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal;
-using Ombi.Core.Models;
-using Polly;
-using Pomelo.EntityFrameworkCore.MySql.Storage.Internal;
-
-namespace Ombi.Core.Helpers;
-
-public static class DatabaseConfigurationSetup
-{
- public static void ConfigurePostgres(DbContextOptionsBuilder options, PerDatabaseConfiguration config)
- {
- options.UseNpgsql(config.ConnectionString, b =>
- {
- b.EnableRetryOnFailure();
- }).ReplaceService();
- }
-
- public static void ConfigureMySql(DbContextOptionsBuilder options, PerDatabaseConfiguration config)
- {
- if (string.IsNullOrEmpty(config.ConnectionString))
- {
- throw new ArgumentNullException("ConnectionString for the MySql/Mariadb database is empty");
- }
-
- options.UseMySql(config.ConnectionString, GetServerVersion(config.ConnectionString), b =>
- {
- //b.CharSetBehavior(Pomelo.EntityFrameworkCore.MySql.Infrastructure.CharSetBehavior.NeverAppend); // ##ISSUE, link to migrations?
- b.EnableRetryOnFailure();
- });
- }
-
- private static ServerVersion GetServerVersion(string connectionString)
- {
- // Workaround Windows bug, that can lead to the following exception:
- //
- // MySqlConnector.MySqlException (0x80004005): SSL Authentication Error
- // ---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception.
- // ---> System.ComponentModel.Win32Exception (0x8009030F): The message or signature supplied for verification has been altered
- //
- // See https://github.com/dotnet/runtime/issues/17005#issuecomment-305848835
- //
- // Also workaround for the fact, that ServerVersion.AutoDetect() does not use any retrying strategy.
- ServerVersion serverVersion = null;
-#pragma warning disable EF1001
- var retryPolicy = Policy.Handle(exception => MySqlTransientExceptionDetector.ShouldRetryOn(exception))
-#pragma warning restore EF1001
- .WaitAndRetry(3, (count, context) => TimeSpan.FromMilliseconds(count * 250));
-
- serverVersion = retryPolicy.Execute(() => serverVersion = ServerVersion.AutoDetect(connectionString));
-
- return serverVersion;
- }
- public class NpgsqlCaseInsensitiveSqlGenerationHelper : NpgsqlSqlGenerationHelper
- {
- const string EFMigrationsHisory = "__EFMigrationsHistory";
- public NpgsqlCaseInsensitiveSqlGenerationHelper(RelationalSqlGenerationHelperDependencies dependencies)
- : base(dependencies) { }
- public override string DelimitIdentifier(string identifier) =>
- base.DelimitIdentifier(identifier == EFMigrationsHisory ? identifier : identifier.ToLower());
- public override void DelimitIdentifier(StringBuilder builder, string identifier)
- => base.DelimitIdentifier(builder, identifier == EFMigrationsHisory ? identifier : identifier.ToLower());
- }
-}
\ No newline at end of file
diff --git a/src/Ombi.Core/Helpers/FileSystem.cs b/src/Ombi.Core/Helpers/FileSystem.cs
deleted file mode 100644
index 97b9da0bf..000000000
--- a/src/Ombi.Core/Helpers/FileSystem.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Ombi.Core.Helpers;
-
-public class FileSystem : IFileSystem
-{
- public bool FileExists(string path)
- {
- return System.IO.File.Exists(path);
- }
- // Implement other file system operations as needed
-}
\ No newline at end of file
diff --git a/src/Ombi.Core/Helpers/IFileSystem.cs b/src/Ombi.Core/Helpers/IFileSystem.cs
deleted file mode 100644
index da2c9bba5..000000000
--- a/src/Ombi.Core/Helpers/IFileSystem.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace Ombi.Core.Helpers;
-
-public interface IFileSystem
-{
- bool FileExists(string path);
- // Add other file system operations as needed
-}
\ No newline at end of file
diff --git a/src/Ombi.Core/Models/DatabaseConfiguration.cs b/src/Ombi.Core/Models/DatabaseConfiguration.cs
deleted file mode 100644
index 550800108..000000000
--- a/src/Ombi.Core/Models/DatabaseConfiguration.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System.IO;
-
-namespace Ombi.Core.Models;
-
-public class DatabaseConfiguration
-{
- public const string SqliteDatabase = "Sqlite";
-
- public DatabaseConfiguration()
- {
-
- }
-
- public DatabaseConfiguration(string defaultSqlitePath)
- {
- OmbiDatabase = new PerDatabaseConfiguration(SqliteDatabase, $"Data Source={Path.Combine(defaultSqlitePath, "Ombi.db")}");
- SettingsDatabase = new PerDatabaseConfiguration(SqliteDatabase, $"Data Source={Path.Combine(defaultSqlitePath, "OmbiSettings.db")}");
- ExternalDatabase = new PerDatabaseConfiguration(SqliteDatabase, $"Data Source={Path.Combine(defaultSqlitePath, "OmbiExternal.db")}");
- }
- public PerDatabaseConfiguration OmbiDatabase { get; set; }
- public PerDatabaseConfiguration SettingsDatabase { get; set; }
- public PerDatabaseConfiguration ExternalDatabase { get; set; }
-}
-
-public class PerDatabaseConfiguration
-{
- public PerDatabaseConfiguration(string type, string connectionString)
- {
- Type = type;
- ConnectionString = connectionString;
- }
-
- // Used in Deserialization
- public PerDatabaseConfiguration()
- {
-
- }
- public string Type { get; set; }
- public string ConnectionString { get; set; }
-}
\ No newline at end of file
diff --git a/src/Ombi.Core/Senders/MovieSender.cs b/src/Ombi.Core/Senders/MovieSender.cs
index a7ae4a6e7..26da3465c 100644
--- a/src/Ombi.Core/Senders/MovieSender.cs
+++ b/src/Ombi.Core/Senders/MovieSender.cs
@@ -182,10 +182,7 @@ namespace Ombi.Core.Senders
if (settings.SendUserTags)
{
var userTag = await GetOrCreateTag(model, settings);
- if (userTag != null)
- {
- tags.Add(userTag.id);
- }
+ tags.Add(userTag.id);
}
// Overrides on the request take priority
@@ -201,9 +198,7 @@ namespace Ombi.Core.Senders
List movies;
// Check if the movie already exists? Since it could be unmonitored
- // Get the appropriate Radarr instance settings for existence check
- var existenceCheckSettings = is4k ? await _radarr4KSettings.GetSettingsAsync() : settings;
- movies = await _radarrV3Api.GetMovies(existenceCheckSettings.ApiKey, existenceCheckSettings.FullUri);
+ movies = await _radarrV3Api.GetMovies(settings.ApiKey, settings.FullUri);
var existingMovie = movies.FirstOrDefault(x => x.tmdbId == model.TheMovieDbId);
if (existingMovie == null)
@@ -251,12 +246,6 @@ namespace Ombi.Core.Senders
private async Task GetOrCreateTag(MovieRequests model, RadarrSettings s)
{
- if (model.RequestedUser == null)
- {
- _log.LogWarning("Cannot create tag - RequestedUser is null for movie request {MovieTitle}", model.Title);
- return null;
- }
-
var tagName = model.RequestedUser.UserName;
// Does tag exist?
diff --git a/src/Ombi.Core/Senders/TvSender.cs b/src/Ombi.Core/Senders/TvSender.cs
index 1928ecea9..247ce8b6e 100644
--- a/src/Ombi.Core/Senders/TvSender.cs
+++ b/src/Ombi.Core/Senders/TvSender.cs
@@ -133,14 +133,7 @@ namespace Ombi.Core.Senders
string seriesType;
int? tagToUse = null;
- Logger.LogInformation("Starting SendToSonarr for series {Title} (TvDbId: {TvDbId})", model.ParentRequest.Title, model.ParentRequest.TvDbId);
- Logger.LogInformation("Series type: {SeriesType}", model.SeriesType);
-
var profiles = await UserQualityProfiles.GetAll().FirstOrDefaultAsync(x => x.UserId == model.RequestedUserId);
- if (profiles != null)
- {
- Logger.LogInformation("Found user quality profile for user {UserId}", model.RequestedUserId);
- }
if (model.SeriesType == SeriesType.Anime)
{
@@ -148,10 +141,8 @@ namespace Ombi.Core.Senders
// For some reason, if we haven't got one use the first root folder in Sonarr
if (!int.TryParse(s.RootPathAnime, out int animePath))
{
- Logger.LogWarning("Failed to parse RootPathAnime: {RootPathAnime}, falling back to main root path", s.RootPathAnime);
animePath = int.Parse(s.RootPath); // Set it to the main root folder if we have no anime folder.
}
- Logger.LogInformation("Using anime path ID: {AnimePath}", animePath);
rootFolderPath = await GetSonarrRootPath(animePath, s);
languageProfileId = s.LanguageProfileAnime > 0 ? s.LanguageProfileAnime : s.LanguageProfile;
@@ -163,7 +154,6 @@ namespace Ombi.Core.Senders
{
if (profiles.SonarrRootPathAnime > 0)
{
- Logger.LogInformation("Using user's anime root path override: {RootPath}", profiles.SonarrRootPathAnime);
rootFolderPath = await GetSonarrRootPath(profiles.SonarrRootPathAnime, s);
}
if (profiles.SonarrQualityProfileAnime > 0)
@@ -179,13 +169,11 @@ namespace Ombi.Core.Senders
int.TryParse(s.QualityProfile, out qualityToUse);
// Get the root path from the rootfolder selected.
// For some reason, if we haven't got one use the first root folder in Sonarr
- Logger.LogInformation("Using standard path ID: {RootPath}", s.RootPath);
rootFolderPath = await GetSonarrRootPath(int.Parse(s.RootPath), s);
if (profiles != null)
{
if (profiles.SonarrRootPath > 0)
{
- Logger.LogInformation("Using user's standard root path override: {RootPath}", profiles.SonarrRootPath);
rootFolderPath = await GetSonarrRootPath(profiles.SonarrRootPath, s);
}
if (profiles.SonarrQualityProfile > 0)
@@ -205,7 +193,6 @@ namespace Ombi.Core.Senders
if (model.ParentRequest.RootFolder.HasValue && model.ParentRequest.RootFolder.Value > 0)
{
- Logger.LogInformation("Using request root folder override: {RootFolder}", model.ParentRequest.RootFolder.Value);
rootFolderPath = await GetSonarrRootPath(model.ParentRequest.RootFolder.Value, s);
}
@@ -214,8 +201,6 @@ namespace Ombi.Core.Senders
languageProfileId = model.ParentRequest.LanguageProfile.Value;
}
- Logger.LogInformation("Final root folder path: {RootFolderPath}", rootFolderPath);
-
try
{
if (tagToUse.HasValue)
@@ -535,36 +520,17 @@ namespace Ombi.Core.Senders
private async Task GetSonarrRootPath(int pathId, SonarrSettings sonarrSettings)
{
- Logger.LogInformation("Getting Sonarr root path for ID: {PathId}", pathId);
var rootFoldersResult = await SonarrApi.GetRootFolders(sonarrSettings.ApiKey, sonarrSettings.FullUri);
-
- if (rootFoldersResult == null || !rootFoldersResult.Any())
- {
- Logger.LogError("No root folders returned from Sonarr API");
- return string.Empty;
- }
-
- Logger.LogInformation("Found {Count} root folders in Sonarr", rootFoldersResult.Count());
- foreach (var folder in rootFoldersResult)
- {
- Logger.LogDebug("Root folder - ID: {Id}, Path: {Path}", folder.id, folder.path);
- }
if (pathId == 0)
{
- var defaultPath = rootFoldersResult.FirstOrDefault()?.path;
- Logger.LogInformation("Using first root folder as default: {Path}", defaultPath);
- return defaultPath;
+ return rootFoldersResult.FirstOrDefault().path;
}
- var matchingFolder = rootFoldersResult.FirstOrDefault(r => r.id == pathId);
- if (matchingFolder != null)
+ foreach (var r in rootFoldersResult?.Where(r => r.id == pathId))
{
- Logger.LogInformation("Found matching root folder for ID {PathId}: {Path}", pathId, matchingFolder.path);
- return matchingFolder.path;
+ return r.path;
}
-
- Logger.LogError("No matching root folder found for ID: {PathId}", pathId);
return string.Empty;
}
}
diff --git a/src/Ombi.Core/Services/DatabaseConfigurationService.cs b/src/Ombi.Core/Services/DatabaseConfigurationService.cs
deleted file mode 100644
index 750499b19..000000000
--- a/src/Ombi.Core/Services/DatabaseConfigurationService.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-using System;
-using System.IO;
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.Extensions.Logging;
-using Newtonsoft.Json;
-using Ombi.Core.Helpers;
-using Ombi.Core.Models;
-using Ombi.Helpers;
-
-namespace Ombi.Core.Services;
-
-public class DatabaseConfigurationService : IDatabaseConfigurationService
-{
-
- private readonly ILogger _logger;
- private readonly IFileSystem _fileSystem;
-
- public DatabaseConfigurationService(
- ILogger logger,
- IFileSystem fileSystem)
- {
- _logger = logger;
- _fileSystem = fileSystem;
- }
-
- public async Task ConfigureDatabase(string databaseType, string connectionString, CancellationToken token)
- {
- var i = StartupSingleton.Instance;
- if (string.IsNullOrEmpty(i.StoragePath))
- {
- i.StoragePath = string.Empty;
- }
-
- var databaseFileLocation = Path.Combine(i.StoragePath, "database.json");
- if (_fileSystem.FileExists(databaseFileLocation))
- {
- var error = $"The database file at '{databaseFileLocation}' already exists";
- _logger.LogError(error);
- return false;
- }
-
- var configuration = new DatabaseConfiguration
- {
- ExternalDatabase = new PerDatabaseConfiguration(databaseType, connectionString),
- OmbiDatabase = new PerDatabaseConfiguration(databaseType, connectionString),
- SettingsDatabase = new PerDatabaseConfiguration(databaseType, connectionString)
- };
-
- var json = JsonConvert.SerializeObject(configuration, Formatting.Indented);
-
- _logger.LogInformation("Writing database configuration to file");
-
- try
- {
- await File.WriteAllTextAsync(databaseFileLocation, json, token);
- }
- catch (Exception e)
- {
- _logger.LogError(e, "Failed to write database configuration to file");
- return false;
- }
-
- _logger.LogInformation("Database configuration written to file");
-
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/src/Ombi.Core/Services/IDatabaseConfigurationService.cs b/src/Ombi.Core/Services/IDatabaseConfigurationService.cs
deleted file mode 100644
index 3530bf913..000000000
--- a/src/Ombi.Core/Services/IDatabaseConfigurationService.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace Ombi.Core.Services;
-
-public interface IDatabaseConfigurationService
-{
- const string MySqlDatabase = "MySQL";
- const string PostgresDatabase = "Postgres";
- Task ConfigureDatabase(string databaseType, string connectionString, CancellationToken token);
-}
\ No newline at end of file
diff --git a/src/Ombi.DependencyInjection/IocExtensions.cs b/src/Ombi.DependencyInjection/IocExtensions.cs
index 027717bbe..8a5509963 100644
--- a/src/Ombi.DependencyInjection/IocExtensions.cs
+++ b/src/Ombi.DependencyInjection/IocExtensions.cs
@@ -107,7 +107,6 @@ namespace Ombi.DependencyInjection
services.AddTransient();
services.AddTransient();
services.AddTransient();
- services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
@@ -237,8 +236,6 @@ namespace Ombi.DependencyInjection
services.AddScoped();
services.AddTransient();
services.AddTransient();
- services.AddSingleton();
- services.AddSingleton();
}
public static void RegisterJobs(this IServiceCollection services)
diff --git a/src/Ombi.Helpers/NotificationType.cs b/src/Ombi.Helpers/NotificationType.cs
index 274813531..bd6bd6f87 100644
--- a/src/Ombi.Helpers/NotificationType.cs
+++ b/src/Ombi.Helpers/NotificationType.cs
@@ -14,7 +14,6 @@
IssueResolved = 9,
IssueComment = 10,
Newsletter = 11,
- PartiallyAvailable = 12,
- PlexWatchlistTokenExpired = 13
+ PartiallyAvailable = 12
}
}
diff --git a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj
index 0ca27a075..97c999497 100644
--- a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj
+++ b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj
@@ -2,9 +2,6 @@
net8.0
-
- false
-
Debug;Release;NonUiBuild
@@ -16,7 +13,7 @@
-
+
diff --git a/src/Ombi.Schedule.Tests/PlexUserImporterTests.cs b/src/Ombi.Schedule.Tests/PlexUserImporterTests.cs
index f03d0e7e8..022190bd2 100644
--- a/src/Ombi.Schedule.Tests/PlexUserImporterTests.cs
+++ b/src/Ombi.Schedule.Tests/PlexUserImporterTests.cs
@@ -182,6 +182,8 @@ namespace Ombi.Schedule.Tests
_mocker.Verify(x => x.UpdateAsync(It.IsAny()), Times.Never);
}
+
+
[Test]
public async Task Import_Doesnt_Import_Banned_Users()
{
@@ -245,15 +247,7 @@ namespace Ombi.Schedule.Tests
Id = "id",
Title = "title",
Username = "username",
- HomeUser = true,
- Server = new PlexUserServer[]
- {
- new PlexUserServer
- {
- Id = "1",
- ServerId = "123"
- }
- }
+ HomeUser = true
}
}
});
@@ -263,6 +257,7 @@ namespace Ombi.Schedule.Tests
_mocker.Setup>(x => x.AddToRoleAsync(It.Is(x => x.UserName == "plex"), OmbiRoles.RequestMovie))
.ReturnsAsync(IdentityResult.Success);
+
await _subject.Execute(null);
_mocker.Verify(x => x.CreateAsync(It.IsAny()), Times.Once);
@@ -311,15 +306,7 @@ namespace Ombi.Schedule.Tests
{
Email = "email",
Id = "id",
- Username = "plex",
- Server = new PlexUserServer[]
- {
- new PlexUserServer
- {
- Id = "1",
- ServerId = "123"
- }
- }
+ Username = "plex"
}
}
});
@@ -344,9 +331,9 @@ namespace Ombi.Schedule.Tests
ImportPlexAdmin = false,
ImportPlexUsers = true,
DefaultRoles = new List
- {
- OmbiRoles.RequestMovie
- }
+ {
+ OmbiRoles.RequestMovie
+ }
});
_mocker.Setup>(x => x.GetUsers(It.IsAny())).ReturnsAsync(new PlexUsers
{
@@ -356,15 +343,7 @@ namespace Ombi.Schedule.Tests
{
Email = "email",
Id = "PLEX_ID",
- Username = "user",
- Server = new PlexUserServer[]
- {
- new PlexUserServer
- {
- Id = "1",
- ServerId = "123"
- }
- }
+ Username = "user"
}
}
});
@@ -461,98 +440,5 @@ namespace Ombi.Schedule.Tests
_mocker.Verify(x => x.DeleteUser(It.Is(x => x.ProviderUserId == "ADMIN_ID" && x.Email == "ADMIN@ADMIN.CO" && x.UserName == "Admin")), Times.Never);
}
-
- [Test]
- public async Task Import_Skips_Users_Without_Server_Access()
- {
- _mocker.Setup, Task>(x => x.GetSettingsAsync())
- .ReturnsAsync(new UserManagementSettings { ImportPlexAdmin = false, ImportPlexUsers = true });
- _mocker.Setup>(x => x.GetUsers(It.IsAny())).ReturnsAsync(new PlexUsers
- {
- User = new UserFriends[]
- {
- new UserFriends
- {
- Email = "email",
- Id = "NoServer",
- Title = "title",
- Username = "username",
- Server = null
- }
- }
- });
-
- await _subject.Execute(null);
-
- _mocker.Verify(x => x.CreateAsync(It.IsAny()), Times.Never);
- }
-
- [Test]
- public async Task Import_Skips_Users_With_Empty_Server_Array()
- {
- _mocker.Setup, Task>(x => x.GetSettingsAsync())
- .ReturnsAsync(new UserManagementSettings { ImportPlexAdmin = false, ImportPlexUsers = true });
- _mocker.Setup>(x => x.GetUsers(It.IsAny())).ReturnsAsync(new PlexUsers
- {
- User = new UserFriends[]
- {
- new UserFriends
- {
- Email = "email",
- Id = "EmptyServer",
- Title = "title",
- Username = "username",
- Server = new PlexUserServer[0]
- }
- }
- });
-
- await _subject.Execute(null);
-
- _mocker.Verify(x => x.CreateAsync(It.IsAny()), Times.Never);
- }
-
- [Test]
- public async Task Import_Creates_User_With_Server_Access()
- {
- _mocker.Setup, Task>(x => x.GetSettingsAsync())
- .ReturnsAsync(new UserManagementSettings { ImportPlexAdmin = false, ImportPlexUsers = true });
- _mocker.Setup>(x => x.GetUsers(It.IsAny())).ReturnsAsync(new PlexUsers
- {
- User = new UserFriends[]
- {
- new UserFriends
- {
- Email = "email",
- Id = "HasServer",
- Title = "title",
- Username = "username",
- Server = new PlexUserServer[]
- {
- new PlexUserServer
- {
- Id = "1",
- ServerId = "123"
- }
- }
- }
- }
- });
-
- _mocker.Setup>(x => x.CreateAsync(It.Is(x =>
- x.UserName == "username" &&
- x.Email == "email" &&
- x.ProviderUserId == "HasServer" &&
- x.UserType == UserType.PlexUser)))
- .ReturnsAsync(IdentityResult.Success);
-
- await _subject.Execute(null);
-
- _mocker.Verify(x => x.CreateAsync(It.Is(x =>
- x.UserName == "username" &&
- x.Email == "email" &&
- x.ProviderUserId == "HasServer" &&
- x.UserType == UserType.PlexUser)), Times.Once);
- }
}
}
diff --git a/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs b/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs
index 87a1d5e28..4af981363 100644
--- a/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs
+++ b/src/Ombi.Schedule.Tests/PlexWatchlistImportTests.cs
@@ -20,11 +20,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using Ombi.Notifications.Models;
-using Ombi.Core.Notifications;
-using Ombi.Helpers;
-using Ombi.Core;
-using Ombi.Core.Authentication;
namespace Ombi.Schedule.Tests
{
@@ -40,15 +35,12 @@ namespace Ombi.Schedule.Tests
public void Setup()
{
_mocker = new AutoMocker();
- var um = MockHelper.MockUserManager(new List { new OmbiUser { Id = "abc", Email = "email@email.com", UserType = UserType.PlexUser, MediaServerToken = "token1", UserName = "abc", NormalizedUserName = "ABC" } });
+ var um = MockHelper.MockUserManager(new List { new OmbiUser { Id = "abc", UserType = UserType.PlexUser, MediaServerToken = "token1", UserName = "abc", NormalizedUserName = "ABC" } });
_mocker.Use(um);
_context = _mocker.GetMock();
_context.Setup(x => x.CancellationToken).Returns(CancellationToken.None);
- // Mock the keep-alive service to return true by default
- _mocker.Use(Mock.Of(s => s.KeepTokenAliveAsync(It.IsAny(), It.IsAny()) == Task.FromResult(true)));
_subject = _mocker.CreateInstance();
_mocker.Setup, IQueryable>(x => x.GetAll()).Returns(new List().AsQueryable().BuildMock());
- _mocker.Setup(x => x.Notify(It.IsAny()));
}
[Test]
@@ -785,99 +777,5 @@ namespace Ombi.Schedule.Tests
_mocker.Verify>(x => x.GetAll(), Times.Once);
_mocker.Verify>(x => x.Add(It.IsAny()), Times.Once);
}
-
- [Test]
- public async Task AuthenticationError_NotificationsEnabled_WithEmail_SendsNotification()
- {
- _mocker.Setup, Task>(x => x.GetSettingsAsync())
- .ReturnsAsync(new PlexSettings { Enable = true, EnableWatchlistImport = true, NotifyOnWatchlistTokenExpiration = true });
- _mocker.Setup>(x => x.GetWatchlist(It.IsAny(), It.IsAny()))
- .ReturnsAsync(new PlexWatchlistContainer { AuthError = true });
-
- // Act
- await _subject.Execute(_context.Object);
-
- // Assert
- _mocker.Verify(x => x.Notify(It.Is(n =>
- n.NotificationType == NotificationType.PlexWatchlistTokenExpired &&
- n.Recipient == "email@email.com" &&
- n.Substitutes["UserName"] == "abc"
- )), Times.Once);
- }
-
- [Test]
- public async Task AuthenticationError_NotificationsDisabled_WithEmail_DoesNotSendNotification()
- {
- _mocker.Setup, Task>(x => x.GetSettingsAsync())
- .ReturnsAsync(new PlexSettings { Enable = true, EnableWatchlistImport = true, NotifyOnWatchlistTokenExpiration = false });
- _mocker.Setup>(x => x.GetWatchlist(It.IsAny(), It.IsAny()))
- .ReturnsAsync(new PlexWatchlistContainer { AuthError = true });
-
- // Act
- await _subject.Execute(_context.Object);
-
- // Assert
- _mocker.Verify(x => x.Notify(It.IsAny()), Times.Never);
- }
-
- [Test]
- public async Task AuthenticationError_NotificationsEnabled_NoEmail_DoesNotSendNotification()
- {
- // Arrange
- var user = new OmbiUser { Id = "abc", UserType = UserType.PlexUser, MediaServerToken = "token1", UserName = "abc", NormalizedUserName = "ABC" };
- var um = MockHelper.MockUserManager(new List { user });
- _mocker.Use(um);
-
- _mocker.Setup, Task>(x => x.GetSettingsAsync())
- .ReturnsAsync(new PlexSettings { Enable = true, EnableWatchlistImport = true, NotifyOnWatchlistTokenExpiration = true });
- _mocker.Setup>(x => x.GetWatchlist(It.IsAny(), It.IsAny()))
- .ReturnsAsync(new PlexWatchlistContainer { AuthError = true });
-
- _subject = _mocker.CreateInstance();
-
- // Act
- await _subject.Execute(_context.Object);
-
- // Assert
- _mocker.Verify(x => x.Notify(It.IsAny()), Times.Never);
- }
-
- [Test]
- public async Task SkipsUserIfTokenKeepAliveFails()
- {
- // Arrange: Set up the keep-alive service to return false (token invalid/expired)
- var keepAliveMock = new Mock();
- keepAliveMock.Setup(x => x.KeepTokenAliveAsync(It.IsAny(), It.IsAny())).ReturnsAsync(false);
- _mocker.Use(keepAliveMock.Object);
- _subject = _mocker.CreateInstance();
- _mocker.Setup, Task>(x => x.GetSettingsAsync()).ReturnsAsync(new PlexSettings { Enable = true, EnableWatchlistImport = true });
- // Act
- await _subject.Execute(_context.Object);
- // Assert: Should not attempt to import watchlist if keep-alive fails
- keepAliveMock.Verify(x => x.KeepTokenAliveAsync(It.IsAny(), It.IsAny()), Times.Once);
- _mocker.Verify(x => x.GetWatchlist(It.IsAny(), It.IsAny()), Times.Never);
- _mocker.Verify(x => x.Notify(It.IsAny()), Times.Never); // or Times.Once if notification is expected
- }
- [Test]
- public async Task CallsKeepAliveForEachPlexUser()
- {
- // Arrange: Multiple Plex users
- var users = new List
- {
- new OmbiUser { Id = "abc1", UserType = UserType.PlexUser, MediaServerToken = "abc1", UserName = "abc1", NormalizedUserName = "ABC1" },
- new OmbiUser { Id = "abc2", UserType = UserType.PlexUser, MediaServerToken = "abc2", UserName = "abc2", NormalizedUserName = "ABC2" },
- };
- var um = MockHelper.MockUserManager(users);
- _mocker.Use(um);
- var keepAliveMock = new Mock();
- keepAliveMock.Setup(x => x.KeepTokenAliveAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true);
- _mocker.Use(keepAliveMock.Object);
- _subject = _mocker.CreateInstance();
- _mocker.Setup, Task>(x => x.GetSettingsAsync()).ReturnsAsync(new PlexSettings { Enable = true, EnableWatchlistImport = true });
- // Act
- await _subject.Execute(_context.Object);
- // Assert: KeepAlive should be called for each user
- keepAliveMock.Verify(x => x.KeepTokenAliveAsync(It.IsAny(), It.IsAny()), Times.Exactly(users.Count));
- }
}
}
diff --git a/src/Ombi.Schedule.Tests/Properties/launchSettings.json b/src/Ombi.Schedule.Tests/Properties/launchSettings.json
new file mode 100644
index 000000000..57de33708
--- /dev/null
+++ b/src/Ombi.Schedule.Tests/Properties/launchSettings.json
@@ -0,0 +1,27 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:62604/",
+ "sslPort": 0
+ }
+ },
+ "profiles": {
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "Ombi.Schedule.Tests": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "http://localhost:62605/"
+ }
+ }
+}
diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexUserImporter.cs b/src/Ombi.Schedule/Jobs/Plex/PlexUserImporter.cs
index bf89e8fa0..6c90dd20f 100644
--- a/src/Ombi.Schedule/Jobs/Plex/PlexUserImporter.cs
+++ b/src/Ombi.Schedule/Jobs/Plex/PlexUserImporter.cs
@@ -120,13 +120,6 @@ namespace Ombi.Schedule.Jobs.Plex
foreach (var plexUser in users.User)
{
- // Skip users without server access
- if (plexUser.Server == null || !plexUser.Server.Any())
- {
- _log.LogInformation($"Skipping user {plexUser.Username ?? plexUser.Id} as they have no server access");
- continue;
- }
-
// Check if we should import this user
if (userManagementSettings.BannedPlexUserIds.Contains(plexUser.Id))
{
diff --git a/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs b/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs
index 3de332879..dc1aa5d56 100644
--- a/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs
+++ b/src/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs
@@ -22,11 +22,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using Ombi.Notifications.Models;
-using Ombi.Core.Notifications;
-using Microsoft.AspNetCore.Identity;
-using Ombi.Store.Repository.Requests;
-using Ombi.Core;
namespace Ombi.Schedule.Jobs.Plex
{
@@ -42,13 +37,11 @@ namespace Ombi.Schedule.Jobs.Plex
private readonly IExternalRepository _watchlistRepo;
private readonly IRepository _userError;
private readonly IMovieDbApi _movieDbApi;
- private readonly INotificationHelper _notificationHelper;
- private readonly IPlexTokenKeepAliveService _tokenKeepAliveService;
public PlexWatchlistImport(IPlexApi plexApi, ISettingsService settings, OmbiUserManager ombiUserManager,
IMovieRequestEngine movieRequestEngine, ITvRequestEngine tvRequestEngine, INotificationHubService notificationHubService,
ILogger logger, IExternalRepository watchlistRepo, IRepository userError,
- IMovieDbApi movieDbApi, INotificationHelper notificationHelper, IPlexTokenKeepAliveService tokenKeepAliveService)
+ IMovieDbApi movieDbApi)
{
_plexApi = plexApi;
_settings = settings;
@@ -60,8 +53,6 @@ namespace Ombi.Schedule.Jobs.Plex
_watchlistRepo = watchlistRepo;
_userError = userError;
_movieDbApi = movieDbApi;
- _notificationHelper = notificationHelper;
- _tokenKeepAliveService = tokenKeepAliveService;
}
public async Task Execute(IJobExecutionContext context)
@@ -99,36 +90,6 @@ namespace Ombi.Schedule.Jobs.Plex
}
_logger.LogDebug($"Starting Watchlist Import for {user.UserName} with token {user.MediaServerToken}");
-
- // Keep the token alive before attempting watchlist import
- var keepAliveSuccess = await _tokenKeepAliveService.KeepTokenAliveAsync(user.MediaServerToken, context?.CancellationToken ?? CancellationToken.None);
- if (!keepAliveSuccess)
- {
- _logger.LogWarning($"Token for user '{user.UserName}' is invalid or expired (keep-alive failed). Recording error and skipping.");
- await _userError.Add(new PlexWatchlistUserError
- {
- UserId = user.Id,
- MediaServerToken = user.MediaServerToken,
- });
-
- // Send notification to user about token expiration
- if (settings.NotifyOnWatchlistTokenExpiration && !string.IsNullOrEmpty(user.Email))
- {
- var notificationModel = new NotificationOptions
- {
- NotificationType = NotificationType.PlexWatchlistTokenExpired,
- Recipient = user.Email,
- DateTime = DateTime.Now,
- Substitutes = new Dictionary
- {
- { "UserName", user.UserName }
- }
- };
- await _notificationHelper.Notify(notificationModel);
- }
- continue;
- }
-
var watchlist = await _plexApi.GetWatchlist(user.MediaServerToken, context?.CancellationToken ?? CancellationToken.None);
if (watchlist?.AuthError ?? false)
{
@@ -138,22 +99,6 @@ namespace Ombi.Schedule.Jobs.Plex
UserId = user.Id,
MediaServerToken = user.MediaServerToken,
});
-
- // Send notification to user about token expiration
- if (settings.NotifyOnWatchlistTokenExpiration && !string.IsNullOrEmpty(user.Email))
- {
- var notificationModel = new NotificationOptions
- {
- NotificationType = NotificationType.PlexWatchlistTokenExpired,
- Recipient = user.Email,
- DateTime = DateTime.Now,
- Substitutes = new Dictionary
- {
- { "UserName", user.UserName }
- }
- };
- await _notificationHelper.Notify(notificationModel);
- }
continue;
}
if (watchlist == null || !(watchlist.MediaContainer?.Metadata?.Any() ?? false))
diff --git a/src/Ombi.Settings/Settings/Models/External/PlexSettings.cs b/src/Ombi.Settings/Settings/Models/External/PlexSettings.cs
index 649f1d0c7..6edfe0351 100644
--- a/src/Ombi.Settings/Settings/Models/External/PlexSettings.cs
+++ b/src/Ombi.Settings/Settings/Models/External/PlexSettings.cs
@@ -9,7 +9,6 @@ namespace Ombi.Core.Settings.Models.External
public bool Enable { get; set; }
public bool EnableWatchlistImport { get; set; }
public bool MonitorAll { get; set; }
- public bool NotifyOnWatchlistTokenExpiration { get; set; }
///
/// This is the ClientId for OAuth
///
diff --git a/src/Ombi.Store/Context/OmbiContext.cs b/src/Ombi.Store/Context/OmbiContext.cs
index d3540965f..eea83a03d 100644
--- a/src/Ombi.Store/Context/OmbiContext.cs
+++ b/src/Ombi.Store/Context/OmbiContext.cs
@@ -217,16 +217,6 @@ namespace Ombi.Store.Context
Enabled = true,
};
break;
- case NotificationType.PlexWatchlistTokenExpired:
- notificationToAdd = new NotificationTemplates
- {
- NotificationType = notificationType,
- Message = "Hello {UserName}! Your Plex watchlist token has expired. Please re-authenticate with Ombi to continue using the watchlist feature.",
- Subject = "Plex Watchlist Token Expired",
- Agent = agent,
- Enabled = true,
- };
- break;
default:
throw new ArgumentOutOfRangeException();
}
diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html
index f8dbaf257..a1b3bc81b 100644
--- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html
+++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.html
@@ -5,17 +5,13 @@
{{'Discovery.Tv' | translate}}
-@defer (when discoverResults.length > 0; prefetch on idle) {
+@defer (when discoverResults.length > 0) {
}
-@placeholder(minimum 300) {
-
+@placeholder(minimum 500) {
+
}
\ No newline at end of file
diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.scss b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.scss
index 9b62c9256..81c559a83 100644
--- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.scss
+++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.scss
@@ -105,30 +105,6 @@
padding: 5px;
}
-.loading-container {
- display: flex;
- gap: 10px;
- padding: 0 20px;
- margin-top: 20px;
-}
-
-.loading-container .col-2 {
- flex: 0 0 auto;
- width: calc(10% - 9px);
-}
-
-@media (max-width: 768px) {
- .loading-container .col-2 {
- width: calc(50% - 5px);
- }
-}
-
-@media (max-width: 480px) {
- .loading-container .col-2 {
- width: calc(100% - 0px);
- }
-}
-
@media (min-width:755px){
::ng-deep .p-carousel-item{
flex: 1 0 200px !important;
diff --git a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts
index 2463af3c4..36b8122ff 100644
--- a/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts
+++ b/src/Ombi/ClientApp/src/app/discover/components/carousel-list/carousel-list.component.ts
@@ -43,7 +43,7 @@ export class CarouselListComponent implements OnInit {
get mediaTypeStorageKey() {
return "DiscoverOptions" + this.discoverType.toString();
};
- private amountToLoad = 10;
+ private amountToLoad = 17;
private currentlyLoaded = 0;
private baseUrl: string = "";
@@ -148,7 +148,6 @@ export class CarouselListComponent implements OnInit {
}
public async ngOnInit() {
-
this.is4kEnabled = this.featureFacade.is4kEnabled();
this.currentlyLoaded = 0;
const localDiscoverOptions = +this.storageService.get(this.mediaTypeStorageKey);
@@ -156,15 +155,11 @@ export class CarouselListComponent implements OnInit {
this.discoverOptions = DiscoverOption[DiscoverOption[localDiscoverOptions]];
}
- // Load initial data - just enough to fill the first carousel page
- // This reduces initial API calls and improves loading performance
- await this.loadData(false);
-
- // If we don't have enough results to fill the carousel, load one more batch
- if (this.discoverResults.length < 10) {
+ let currentIteration = 0;
+ while (this.discoverResults.length <= 14 && currentIteration <= 3) {
+ currentIteration++;
await this.loadData(false);
}
-
}
public async toggleChanged(event: MatButtonToggleChange) {
diff --git a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html
index dc4e33be1..16a46c0d6 100644
--- a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html
+++ b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.html
@@ -1,108 +1,46 @@
- @defer (on viewport; prefetch on idle) {
-
-
{{ 'Discovery.Genres' | translate }}
-
+
+
{{ 'Discovery.Genres' | translate }}
+
+
+
+
{{ 'Discovery.RecentlyRequestedTab' | translate }}
+
+
- } @placeholder(minimum 300) {
-
-
{{ 'Discovery.Genres' | translate }}
-
-
- }
+
- @defer (on viewport; prefetch on idle) {
-
-
{{ 'Discovery.RecentlyRequestedTab' | translate }}
-
-
-
-
- } @placeholder(minimum 300) {
-
-
{{ 'Discovery.RecentlyRequestedTab' | translate }}
-
-
- }
- @defer (on viewport; prefetch on idle) {
-
-
{{ 'Discovery.SeasonalTab' | translate }}
-
-
-
+
+
{{ 'Discovery.SeasonalTab' | translate }}
+
+
- } @placeholder(minimum 300) {
-
-
{{ 'Discovery.SeasonalTab' | translate }}
-
-
- }
+
- @defer (on viewport; prefetch on idle) {
-
-
{{ 'Discovery.PopularTab' | translate }}
-
-
-
+
+
{{ 'Discovery.PopularTab' | translate }}
+
+
- } @placeholder(minimum 300) {
-
-
{{ 'Discovery.PopularTab' | translate }}
-
-
- }
+
- @defer (on viewport; prefetch on idle) {
-
-
{{ 'Discovery.TrendingTab' | translate }}
-
-
-
+
+
{{ 'Discovery.TrendingTab' | translate }}
+
+
- } @placeholder(minimum 300) {
-
-
{{ 'Discovery.TrendingTab' | translate }}
-
-
- }
+
- @defer (on viewport; prefetch on idle) {
-
-
{{ 'Discovery.UpcomingTab' | translate }}
-
-
-
+
+
{{ 'Discovery.UpcomingTab' | translate }}
+
+
- } @placeholder(minimum 300) {
-
-
{{ 'Discovery.UpcomingTab' | translate }}
-
-
- }
+
diff --git a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.scss b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.scss
index 9ba892e01..d95586507 100644
--- a/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.scss
+++ b/src/Ombi/ClientApp/src/app/discover/components/discover/discover.component.scss
@@ -9,28 +9,4 @@ h2{
margin-top:40px;
margin-left:40px;
font-size: 24px;
-}
-
-.loading-container {
- display: flex;
- gap: 10px;
- padding: 0 20px;
- margin-top: 20px;
-}
-
-.loading-container .col-2 {
- flex: 0 0 auto;
- width: calc(10% - 9px);
-}
-
-@media (max-width: 768px) {
- .loading-container .col-2 {
- width: calc(50% - 5px);
- }
-}
-
-@media (max-width: 480px) {
- .loading-container .col-2 {
- width: calc(100% - 0px);
- }
}
\ No newline at end of file
diff --git a/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.html b/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.html
index a6db36865..6da28c744 100644
--- a/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.html
+++ b/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.html
@@ -1,4 +1,4 @@
-@defer (when requests(); prefetch on idle) {
+@defer (when requests()) {
-}@placeholder(minimum 300) {
+}@placeholder(minimum 500) {
-
diff --git a/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.scss b/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.scss
index c7fef78f9..01c68db4d 100644
--- a/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.scss
+++ b/src/Ombi/ClientApp/src/app/discover/components/recently-requested-list/recently-requested-list.component.scss
@@ -105,32 +105,12 @@
padding: 5px;
}
-.loading-container {
- display: flex;
- gap: 10px;
- padding: 0 20px;
- margin-top: 20px;
-}
-
-.loading-container .col-2 {
- flex: 0 0 auto;
- width: calc(20% - 8px);
-}
-
-@media (max-width: 768px) {
- .loading-container .col-2 {
- width: calc(50% - 5px);
- }
-}
-
-@media (max-width: 480px) {
- .loading-container .col-2 {
- width: calc(100% - 0px);
- }
-}
-
@media (min-width:755px){
::ng-deep .p-carousel-item{
flex: 1 0 200px !important;
}
+}
+
+.loading-container {
+ margin-left: 10rem;
}
\ No newline at end of file
diff --git a/src/Ombi/ClientApp/src/app/interfaces/INotificationSettings.ts b/src/Ombi/ClientApp/src/app/interfaces/INotificationSettings.ts
index 5f6085362..460a970fe 100644
--- a/src/Ombi/ClientApp/src/app/interfaces/INotificationSettings.ts
+++ b/src/Ombi/ClientApp/src/app/interfaces/INotificationSettings.ts
@@ -52,7 +52,6 @@ export enum NotificationType {
IssueComment = 10,
Newsletter = 11,
PartiallyAvailable = 12,
- PlexWatchlistTokenExpired = 13
}
export interface IDiscordNotifcationSettings extends INotificationSettings {
diff --git a/src/Ombi/ClientApp/src/app/interfaces/ISettings.ts b/src/Ombi/ClientApp/src/app/interfaces/ISettings.ts
index 008628c16..532b8625f 100644
--- a/src/Ombi/ClientApp/src/app/interfaces/ISettings.ts
+++ b/src/Ombi/ClientApp/src/app/interfaces/ISettings.ts
@@ -114,7 +114,6 @@ export interface IPlexSettings extends ISettings {
enable: boolean;
enableWatchlistImport: boolean;
monitorAll: boolean;
- notifyOnWatchlistTokenExpiration: boolean;
servers: IPlexServer[];
}
diff --git a/src/Ombi/ClientApp/src/app/pipes/OmbiDatePipe.ts b/src/Ombi/ClientApp/src/app/pipes/OmbiDatePipe.ts
index 5c0cc5c3b..d7e902242 100644
--- a/src/Ombi/ClientApp/src/app/pipes/OmbiDatePipe.ts
+++ b/src/Ombi/ClientApp/src/app/pipes/OmbiDatePipe.ts
@@ -1,6 +1,5 @@
import { Pipe, PipeTransform } from "@angular/core";
import { FormatPipe } from 'ngx-date-fns';
-import { parseISO, format } from 'date-fns';
@Pipe({
name: "ombiDate",
@@ -11,16 +10,8 @@ export class OmbiDatePipe implements PipeTransform {
private FormatPipe: FormatPipe,
) {}
- public transform(value: string, formatStr: string ) {
- if (!value) {
- return '';
- }
-
- // Parse the ISO string as UTC
- const utcDate = parseISO(value);
-
- // Format the date using date-fns format function
- // This will automatically handle the UTC to local conversion
- return format(utcDate, formatStr);
+ public transform(value: string, format: string ) {
+ const date = new Date(value);
+ return this.FormatPipe.transform(date, format);
}
}
diff --git a/src/Ombi/ClientApp/src/app/settings/plex/components/watchlist/plex-watchlist.component.html b/src/Ombi/ClientApp/src/app/settings/plex/components/watchlist/plex-watchlist.component.html
index 03809d317..dd1ae2f87 100644
--- a/src/Ombi/ClientApp/src/app/settings/plex/components/watchlist/plex-watchlist.component.html
+++ b/src/Ombi/ClientApp/src/app/settings/plex/components/watchlist/plex-watchlist.component.html
@@ -1,40 +1,38 @@
-
-
-
- Watchlist User Errors
-
-
-
- error_outline
-
- If there is an authentication error, this is because of an authentication issue with Plex (Token has expired).
- If this happens the user needs to re-login to Ombi.
-
-
-
- check_circle Successfully syncing the watchlist
- cancel Authentication error syncing the watchlist
- person_off Not enabled for user (They need to log into Ombi via Plex)
-
-
-
- Username
- {{element.userName}}
-
-
- Watchlist Sync Result
-
- check_circle
- cancel
- person_off
-
-
-
-
-
-
-
- Close
-
-
+
+
+ Watchlist User Errors
+
+
+ If there is an authentication error, this is because of an authentication issue with Plex (Token has expired).
+ If this happens the user needs to re-login to Ombi.
+
+
+ Successfully syncing the watchlist
+
+ Authentication error syncing the watchlist
+
+ Not enabled for user (They need to log into Ombi via Plex)
+
+
+
+ Username
+ {{element.userName}}
+
+
+ Watchlist Sync Result
+
+
+
+
+
+
+
+
+
+
+
+
+ Close
+
+
\ No newline at end of file
diff --git a/src/Ombi/ClientApp/src/app/settings/plex/components/watchlist/plex-watchlist.component.scss b/src/Ombi/ClientApp/src/app/settings/plex/components/watchlist/plex-watchlist.component.scss
index 29e8cae20..f96dda122 100644
--- a/src/Ombi/ClientApp/src/app/settings/plex/components/watchlist/plex-watchlist.component.scss
+++ b/src/Ombi/ClientApp/src/app/settings/plex/components/watchlist/plex-watchlist.component.scss
@@ -10,96 +10,4 @@
.key {
width: 40px;
-}
-
-.watchlist-dialog-container {
- display: flex;
- justify-content: center;
- align-items: flex-start;
- margin: 0 auto;
-}
-
-.watchlist-dialog-card {
- background: #23272f;
- color: #f1f3f6;
- border-radius: 12px;
- border: 1px solid #353a45;
- box-shadow: 0 2px 12px 0 rgba(0,0,0,0.25);
- min-width: 420px;
- max-width: 600px;
- width: 100%;
- max-height: 70vh;
- display: flex;
- flex-direction: column;
-}
-
-mat-card-content {
- flex: 1 1 auto;
- overflow-y: auto;
- min-height: 0;
-}
-
-mat-card-header {
- border-bottom: 1px solid #353a45;
- margin-bottom: 12px;
- flex: 0 0 auto;
-}
-
-mat-card-title {
- color: #fff !important;
- font-weight: 700 !important;
- letter-spacing: 0.5px;
-}
-
-.watchlist-info-section {
- display: flex;
- align-items: center;
- background: #23272f;
- color: #e0e3ea;
- padding: 12px 0 8px 0;
- font-size: 15px;
- gap: 12px;
-}
-
-.info-icon {
- font-size: 28px;
- color: #ffb300;
-}
-
-.watchlist-legend {
- display: flex;
- flex-direction: column;
- gap: 4px;
- margin-bottom: 18px;
- margin-top: 8px;
- font-size: 14px;
- color: #b0b6c3;
-}
-
-.watchlist-legend mat-icon {
- vertical-align: middle;
- margin-right: 6px;
-}
-
-.modern-table {
- background: transparent;
- color: #f1f3f6;
- border-radius: 8px;
- margin-top: 10px;
-}
-
-.modern-table th, .modern-table td {
- color: #f1f3f6;
- font-size: 15px;
-}
-
-mat-card-actions {
- padding-top: 16px;
- flex: 0 0 auto;
- background: #23272f;
-}
-
-button[mat-stroked-button] {
- font-weight: 600;
- border-radius: 6px;
}
\ No newline at end of file
diff --git a/src/Ombi/ClientApp/src/app/settings/plex/plex.component.html b/src/Ombi/ClientApp/src/app/settings/plex/plex.component.html
index 3be3300fc..4bfcbf1c5 100644
--- a/src/Ombi/ClientApp/src/app/settings/plex/plex.component.html
+++ b/src/Ombi/ClientApp/src/app/settings/plex/plex.component.html
@@ -1,179 +1,137 @@
-
-
-
-
- Plex Configuration
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- When a Plex User adds something to their watchlist in Plex, it will turn up in Ombi as a Request if enabled.
- This only applies to users that are logging in with their Plex Account.
- Request limits if set are all still applied
-
-
-
-
-
-
-
-
- If enabled then watchlist requests for TV Shows will request the whole show.
- If not enabled it will only request the latest season.
-
-
-
-
-
-
-
-
- When enabled, users will receive a notification if their Plex watchlist token expires and they need to log into Ombi again to continue using the watchlist feature.
- Note: This requires email notifications to be configured in the notification settings, and users must have an email address set on their account to receive these notifications.
-
-
-
-
-
- info
-
- Some users may need to re-log in to use the watchlist feature.
-
-
- View Users
-
-
+
+
+ Plex Configuration
+
+
+ Watchlist User Errors
-
-
-
-
-
-
-
Plex Servers
-
-
-
-
- dns
- {{server.name}}
-
-
-
+
+
-
-
-
- add_circle
- Add Server
-
-
-
-
-
+
+ When a Plex User adds something to their watchlist in Plex, it will turn up in Ombi as a Request if enabled. This only applies to users that are logging in with their Plex Account
+ Request limits if set are all still applied
+
+
-
-
-
Sync Actions
-
-
- sync
- Full Sync
-
-
- update
- Partial Sync
-
-
- cleaning_services
- Clear & Resync
-
-
- playlist_add
- Run Watchlist Import
-
-
-
-
+
+ If enabled then watchlist requests for TV Shows will request the whole show. If not enabled it will only request the latest season.
+
+
-
-
-
-
+
+
+
+ Manually Add Server
+
+
+
-
-
- save
- Save Changes
+
+
+
+
+
+ Full
+ Sync
+
+
+ Partial Sync
+
+
+
+ Clear Data And Resync
-
-
+
+
+
+ Run Watchlist Import
+
+
+
+
+
+
+
+
+
+
+ Plex Credentials
+ These fields are optional to automatically fill in your Plex server settings.
+ This will pass your username and password to the Plex.tv API to grab the servers associated with this user.
+
+ If you have 2FA enabled on your account, you need to append the 2FA code to the end of your password.
+
+
+
+
+
+
+
+
+
+
+ Please select the server:
+
+
+
+
+
+
+
+
+
diff --git a/src/Ombi/ClientApp/src/app/settings/plex/plex.component.scss b/src/Ombi/ClientApp/src/app/settings/plex/plex.component.scss
index 6449d548f..443e033a9 100644
--- a/src/Ombi/ClientApp/src/app/settings/plex/plex.component.scss
+++ b/src/Ombi/ClientApp/src/app/settings/plex/plex.component.scss
@@ -43,258 +43,4 @@
h3 {
margin: 0;
}
- }
-
-.plex-settings-container {
- padding: 20px;
- max-width: 1400px;
- margin: 0 auto;
-}
-
-.settings-card {
- margin-bottom: 20px;
- background: transparent;
- box-shadow: 0 2px 12px 0 rgba(0,0,0,0.25);
- border-radius: 12px;
- border: 1px solid #353a45;
-}
-
-.section-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 20px;
-}
-
-.settings-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
- gap: 24px;
- margin-bottom: 30px;
-}
-
-.setting-card {
- height: 100%;
- background: transparent;
- border-radius: 10px;
- border: 1px solid #353a45;
- box-shadow: 0 1px 6px 0 rgba(0,0,0,0.18);
- color: #f1f3f6;
-}
-
-.setting-card.disabled {
- opacity: 0.6;
-}
-
-.setting-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 10px;
- font-weight: 600;
- color: #fff;
-}
-
-.setting-description {
- color: #e0e3ea;
- font-size: 15px;
- margin: 0;
- font-weight: 400;
- line-height: 1.6;
-}
-
-.main-content {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 36px;
- margin-top: 36px;
-}
-
-.servers-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
- gap: 18px;
-}
-
-.server-card {
- text-align: center;
- background: transparent;
- border-radius: 10px;
- border: 1px solid #353a45;
- box-shadow: 0 1px 6px 0 rgba(0,0,0,0.18);
- color: #f1f3f6;
-}
-
-.server-card button {
- width: 100%;
- height: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: 24px;
- color: #f1f3f6;
- font-weight: 500;
-}
-
-.server-card mat-icon {
- font-size: 32px;
- height: 32px;
- width: 32px;
- margin-bottom: 10px;
- color: #90caf9;
-}
-
-.sync-actions-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
- gap: 18px;
-}
-
-.sync-actions-grid button {
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 24px;
- color: #f1f3f6;
- background: transparent;
- border: 1px solid #353a45;
- border-radius: 10px;
- font-weight: 500;
- box-shadow: 0 1px 6px 0 rgba(0,0,0,0.18);
-}
-
-.sync-actions-grid mat-icon {
- font-size: 32px;
- height: 32px;
- width: 32px;
- margin-bottom: 10px;
- color: #90caf9;
-}
-
-.credentials-card {
- padding: 24px;
- background: transparent;
- border-radius: 10px;
- border: 1px solid #353a45;
- box-shadow: 0 1px 6px 0 rgba(0,0,0,0.18);
- color: #f1f3f6;
-}
-
-.credentials-description {
- color: #e0e3ea;
- margin-bottom: 20px;
- font-size: 15px;
- font-weight: 400;
-}
-
-mat-card-title, h2, h3 {
- color: #fff !important;
- font-weight: 700 !important;
- letter-spacing: 0.5px;
-}
-
-mat-card-header {
- border-bottom: 1px solid #353a45;
- margin-bottom: 16px;
-}
-
-mat-form-field {
- color: #f1f3f6 !important;
-}
-
-mat-label, .mat-form-field-label {
- color: #b0b6c3 !important;
- font-weight: 500;
-}
-
-input[matInput], .mat-input-element {
- color: #f1f3f6 !important;
- background: transparent !important;
-}
-
-mat-select {
- color: #f1f3f6 !important;
- background: transparent !important;
-}
-
-.full-width {
- width: 100%;
-}
-
-.mt-3 {
- margin-top: 1rem;
-}
-
-.mat-slide-toggle.mat-checked .mat-slide-toggle-bar {
- background-color: #90caf9 !important;
-}
-
-.mat-slide-toggle-thumb {
- background-color: #2196f3 !important;
-}
-
-button[mat-flat-button], button[mat-raised-button], button[mat-stroked-button], button[mat-button] {
- font-weight: 600;
- letter-spacing: 0.2px;
- color: #f1f3f6;
- background: #2196f3;
- border-radius: 6px;
- box-shadow: 0 1px 4px 0 rgba(0,0,0,0.12);
- transition: background 0.2s;
-}
-button[mat-flat-button]:hover, button[mat-raised-button]:hover, button[mat-stroked-button]:hover, button[mat-button]:hover {
- background: #42a5f5;
-}
-
-@media (max-width: 1200px) {
- .main-content {
- grid-template-columns: 1fr;
- }
-}
-
-@media (max-width: 768px) {
- .settings-grid {
- grid-template-columns: 1fr;
- }
-
- .servers-grid {
- grid-template-columns: 1fr;
- }
-
- .sync-actions-grid {
- grid-template-columns: 1fr;
- }
-}
-
-.watchlist-errors-btn-row {
- display: flex;
- justify-content: center;
- margin-top: 18px;
-}
-
-.info-banner {
- display: flex;
- align-items: center;
- background: #23272f;
- color: #e0e3ea;
- border: 1px solid #1976d2;
- box-shadow: 0 1px 6px 0 rgba(0,0,0,0.12);
- border-radius: 8px;
- padding: 16px 20px;
- margin-top: 18px;
- margin-bottom: 0;
- font-size: 16px;
- font-weight: 500;
- gap: 12px;
-}
-
-.info-banner mat-icon {
- font-size: 28px;
- color: #42a5f5;
-}
-
-.info-banner button[mat-button] {
- margin-left: 16px;
- font-weight: 600;
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/Ombi/ClientApp/src/app/usermanagement/usermanagement-user.component.ts b/src/Ombi/ClientApp/src/app/usermanagement/usermanagement-user.component.ts
index a2e1872f9..1110490b9 100644
--- a/src/Ombi/ClientApp/src/app/usermanagement/usermanagement-user.component.ts
+++ b/src/Ombi/ClientApp/src/app/usermanagement/usermanagement-user.component.ts
@@ -37,13 +37,6 @@ export class UserManagementUserComponent implements OnInit {
private appUrl: string = this.customizationFacade.appUrl();
private accessToken: string;
- // List of excluded notification agents that should not be shown in user preferences
- private readonly excludedAgents = [
- INotificationAgent.Email,
- INotificationAgent.Mobile,
- INotificationAgent.Webhook
- ];
-
constructor(private identityService: IdentityService,
private notificationService: MessageService,
private router: Router,
@@ -81,15 +74,9 @@ export class UserManagementUserComponent implements OnInit {
}
});
if(this.edit) {
- this.identityService.getNotificationPreferencesForUser(this.userId).subscribe(x => {
- // Filter out excluded notification agents
- this.notificationPreferences = x.filter(pref => !this.excludedAgents.includes(pref.agent));
- });
+ this.identityService.getNotificationPreferencesForUser(this.userId).subscribe(x => this.notificationPreferences = x);
} else {
- this.identityService.getNotificationPreferences().subscribe(x => {
- // Filter out excluded notification agents
- this.notificationPreferences = x.filter(pref => !this.excludedAgents.includes(pref.agent));
- });
+ this.identityService.getNotificationPreferences().subscribe(x => this.notificationPreferences = x);
}
this.sonarrService.getQualityProfilesWithoutSettings().subscribe(x => {
this.sonarrQualities = x;
diff --git a/src/Ombi/ClientApp/src/app/wizard/database/database.component.html b/src/Ombi/ClientApp/src/app/wizard/database/database.component.html
deleted file mode 100644
index 40aa353b6..000000000
--- a/src/Ombi/ClientApp/src/app/wizard/database/database.component.html
+++ /dev/null
@@ -1,104 +0,0 @@
-
diff --git a/src/Ombi/ClientApp/src/app/wizard/database/database.component.ts b/src/Ombi/ClientApp/src/app/wizard/database/database.component.ts
deleted file mode 100644
index 8c037f07f..000000000
--- a/src/Ombi/ClientApp/src/app/wizard/database/database.component.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import { Component, EventEmitter, OnInit, Output } from "@angular/core";
-import { FormBuilder, FormGroup, Validators } from "@angular/forms";
-import { BehaviorSubject } from "rxjs";
-import { WizardService } from "../services/wizard.service";
-import { NotificationService } from "app/services";
-import { MatTabChangeEvent } from "@angular/material/tabs";
-
-@Component({
- templateUrl: "./database.component.html",
- styleUrls: ["../welcome/welcome.component.scss"],
- selector: "wizard-database-selector",
-})
-export class DatabaseComponent implements OnInit {
- public constructor(private fb: FormBuilder, private service: WizardService, private notification: NotificationService) { }
- @Output() public configuredDatabase = new EventEmitter
();
-
- public form: FormGroup;
-
- public connectionString = new BehaviorSubject("Server=;Port=3306;Database=ombi");
-
- public ngOnInit(): void {
- this.form = this.fb.group({
- type: [""],
- host: ["", [Validators.required]],
- port: [3306, [Validators.required]],
- name: ["ombi", [Validators.required]],
- user: [""],
- password: [""],
- });
-
- this.form.valueChanges.subscribe(x => {
- console.log(x);
- let connection = `Server=${x.host};Port=${x.port};Database=${x.name}`;
-
- if (x.user) {
- connection += `;User=${x.user}`;
- if (x.password) {
- connection += `;Password=*******`;
- }
- }
-
- if (x.type !== "MySQL") {
- connection = connection.replace("Server", "Host").replace("User", "Username");
- }
-
- this.connectionString.next(connection);
- });
- }
-
- public tabChange(event: MatTabChangeEvent) {
- if (event.index === 0) {
- this.form.reset();
- }
- if (event.index === 1) {
- this.form.reset({
- type: "MySQL",
- host: "",
- name: "ombi",
- port: 3306,
- });
- this.form.controls.type.setValue("MySQL");
-
- }
- if (event.index === 2) {
- this.form.reset({
- type:"Postgres",
- host: "",
- name: "ombi",
- port: 5432,
- });
-
- }
- this.form.markAllAsTouched();
- }
-
- public save() {
- this.service.addDatabaseConfig(this.form.value).subscribe({
- next: () => {
- this.notification.success(`Database configuration updated! Please now restart Ombi!`);
- this.configuredDatabase.emit();
- },
- error: error => {
- if (error.error.message) {
- this.notification.error(error.error.message);
- } else {
- this.notification.error("Something went wrong, please check the logs");
- }
- },
- });
- }
-
-}
diff --git a/src/Ombi/ClientApp/src/app/wizard/models/DatabaseSettings.ts b/src/Ombi/ClientApp/src/app/wizard/models/DatabaseSettings.ts
deleted file mode 100644
index 41043a24b..000000000
--- a/src/Ombi/ClientApp/src/app/wizard/models/DatabaseSettings.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export interface DatabaseSettings {
- type: string;
- host: string;
- port: number;
- name: string;
- user: string;
- password: string;
-}
-
-export interface DatabaseConfigurationResult {
- success: boolean;
- message: string;
-}
\ No newline at end of file
diff --git a/src/Ombi/ClientApp/src/app/wizard/services/wizard.service.ts b/src/Ombi/ClientApp/src/app/wizard/services/wizard.service.ts
index 03cf9768d..0f6511265 100644
--- a/src/Ombi/ClientApp/src/app/wizard/services/wizard.service.ts
+++ b/src/Ombi/ClientApp/src/app/wizard/services/wizard.service.ts
@@ -5,7 +5,6 @@ import { Observable } from "rxjs";
import { ICustomizationSettings } from "../../interfaces";
import { ServiceHelpers } from "../../services";
import { IOmbiConfigModel } from "../models/OmbiConfigModel";
-import { DatabaseConfigurationResult, DatabaseSettings } from "../models/DatabaseSettings";
@Injectable()
@@ -17,8 +16,4 @@ export class WizardService extends ServiceHelpers {
public addOmbiConfig(config: IOmbiConfigModel): Observable {
return this.http.post(`${this.url}config`, config, {headers: this.headers});
}
-
- public addDatabaseConfig(config: DatabaseSettings): Observable {
- return this.http.post(`${this.url}database`, config, {headers: this.headers});
- }
}
diff --git a/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.html b/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.html
index f2958ccc4..5d693f834 100644
--- a/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.html
+++ b/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.html
@@ -1,7 +1,6 @@
- @if (!needsRestart) {
-
+
-
- Database
-
- Back
- Next
-
- } @else {
-
-
- Restart
-
-
-
-
-
-
-
Please Restart Ombi for the database changes to take effect!
-
-
-
-
-
- }
\ No newline at end of file
diff --git a/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.scss b/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.scss
index b8974e52f..8f15f503a 100644
--- a/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.scss
+++ b/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.scss
@@ -151,12 +151,6 @@ p.space-or{
color: #A45FC4;
}
-
-.viewon-btn.database {
- border: 1px solid #A45FC4;
- color: #A45FC4;
-}
-
.text-logo{
font-size:12em;
}
diff --git a/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.ts b/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.ts
index a2a38e461..e8a905530 100644
--- a/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.ts
+++ b/src/Ombi/ClientApp/src/app/wizard/welcome/welcome.component.ts
@@ -17,7 +17,6 @@ export class WelcomeComponent implements OnInit {
@ViewChild('stepper', {static: false}) public stepper: MatStepper;
public localUser: ICreateWizardUser;
- public needsRestart: boolean = false;
public config: IOmbiConfigModel;
constructor(private router: Router, private identityService: IdentityService,
@@ -49,7 +48,7 @@ export class WelcomeComponent implements OnInit {
this.settingsService.verifyUrl(this.config.applicationUrl).subscribe(x => {
if (!x) {
this.notificationService.error(`The URL "${this.config.applicationUrl}" is not valid. Please format it correctly e.g. http://www.google.com/`);
- this.stepper.selectedIndex = 4;
+ this.stepper.selectedIndex = 3;
return;
}
this.saveConfig();
@@ -59,10 +58,6 @@ export class WelcomeComponent implements OnInit {
}
}
- public databaseConfigured() {
- this.needsRestart = true;
- }
-
private saveConfig() {
this.WizardService.addOmbiConfig(this.config).subscribe({
next: (config) => {
diff --git a/src/Ombi/ClientApp/src/app/wizard/wizard.module.ts b/src/Ombi/ClientApp/src/app/wizard/wizard.module.ts
index 917f46ad3..501995ce6 100644
--- a/src/Ombi/ClientApp/src/app/wizard/wizard.module.ts
+++ b/src/Ombi/ClientApp/src/app/wizard/wizard.module.ts
@@ -12,7 +12,6 @@ import { MediaServerComponent } from "./mediaserver/mediaserver.component";
import { PlexComponent } from "./plex/plex.component";
import { WelcomeComponent } from "./welcome/welcome.component";
import { OmbiConfigComponent } from "./ombiconfig/ombiconfig.component";
-import { DatabaseComponent } from "./database/database.component";
import { EmbyService } from "../services";
import { JellyfinService } from "../services";
@@ -49,7 +48,6 @@ const routes: Routes = [
EmbyComponent,
JellyfinComponent,
OmbiConfigComponent,
- DatabaseComponent,
],
exports: [
RouterModule,
diff --git a/src/Ombi/Controllers/V1/SettingsController.cs b/src/Ombi/Controllers/V1/SettingsController.cs
index a23d56124..c77913e48 100644
--- a/src/Ombi/Controllers/V1/SettingsController.cs
+++ b/src/Ombi/Controllers/V1/SettingsController.cs
@@ -40,6 +40,7 @@ namespace Ombi.Controllers.V1
///
/// The Settings Controller
///
+ [Admin]
[ApiV1]
[Produces("application/json")]
[ApiController]
@@ -77,7 +78,6 @@ namespace Ombi.Controllers.V1
/// Gets the Ombi settings.
///
///
- [Admin]
[HttpGet("ombi")]
public async Task
OmbiSettings()
{
@@ -110,7 +110,6 @@ namespace Ombi.Controllers.V1
///
/// The ombi.
///
- [Admin]
[HttpPost("ombi")]
public async Task OmbiSettings([FromBody]OmbiSettings ombi)
{
@@ -146,7 +145,6 @@ namespace Ombi.Controllers.V1
return model;
}
- [Admin]
[HttpPost("ombi/resetApi")]
public async Task ResetApiKey()
{
@@ -161,7 +159,6 @@ namespace Ombi.Controllers.V1
/// Gets the Plex Settings.
///
///
- [Admin]
[HttpGet("plex")]
public async Task PlexSettings()
{
@@ -188,7 +185,6 @@ namespace Ombi.Controllers.V1
///
/// The plex.
///
- [Admin]
[HttpPost("plex")]
public async Task PlexSettings([FromBody]PlexSettings plex)
{
@@ -211,7 +207,6 @@ namespace Ombi.Controllers.V1
/// Gets the Emby Settings.
///
///
- [Admin]
[HttpGet("emby")]
public async Task EmbySettings()
{
@@ -223,7 +218,6 @@ namespace Ombi.Controllers.V1
///
/// The emby.
///
- [Admin]
[HttpPost("emby")]
public async Task EmbySettings([FromBody]EmbySettings emby)
{
@@ -249,7 +243,6 @@ namespace Ombi.Controllers.V1
/// Gets the Jellyfin Settings.
///
///
- [Admin]
[HttpGet("jellyfin")]
public async Task JellyfinSettings()
{
@@ -261,7 +254,6 @@ namespace Ombi.Controllers.V1
///
/// The jellyfin.
///
- [Admin]
[HttpPost("jellyfin")]
public async Task JellyfinSettings([FromBody]JellyfinSettings jellyfin)
{
@@ -299,7 +291,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("landingpage")]
public async Task LandingPageSettings([FromBody]LandingPageSettings settings)
{
@@ -335,7 +326,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("customization")]
public async Task CustomizationSettings([FromBody]CustomizationSettings settings)
{
@@ -354,7 +344,6 @@ namespace Ombi.Controllers.V1
/// Get's the preset themes available
///
///
- [Admin]
[HttpGet("themes")]
public async Task> GetThemes()
{
@@ -388,7 +377,6 @@ namespace Ombi.Controllers.V1
///
///
[HttpGet("sonarr")]
- [PowerUser]
public async Task SonarrSettings()
{
return await Get();
@@ -400,7 +388,6 @@ namespace Ombi.Controllers.V1
/// The settings.
///
[HttpPost("sonarr")]
- [Admin]
public async Task SonarrSettings([FromBody]SonarrSettings settings)
{
var result = await Save(settings);
@@ -416,7 +403,6 @@ namespace Ombi.Controllers.V1
///
///
[HttpGet("radarr")]
- [PowerUser]
public async Task RadarrSettings()
{
return new RadarrCombinedModel
@@ -430,7 +416,6 @@ namespace Ombi.Controllers.V1
/// Gets the Lidarr Settings.
///
///
- [Admin]
[HttpGet("lidarr")]
public async Task LidarrSettings()
{
@@ -454,7 +439,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("lidarr")]
public async Task LidarrSettings([FromBody]LidarrSettings settings)
{
@@ -471,7 +455,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("authentication")]
public async Task AuthenticationsSettings([FromBody]AuthenticationSettings settings)
{
@@ -494,7 +477,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("radarr")]
public async Task RadarrSettings([FromBody]RadarrCombinedModel settings)
{
@@ -516,7 +498,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("Update")]
public async Task UpdateSettings([FromBody]UpdateSettings settings)
{
@@ -527,7 +508,6 @@ namespace Ombi.Controllers.V1
/// Gets the UserManagement Settings.
///
///
- [Admin]
[HttpGet("UserManagement")]
public async Task UserManagementSettings()
{
@@ -539,7 +519,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("UserManagement")]
public async Task UserManagementSettings([FromBody]UserManagementSettings settings)
{
@@ -550,7 +529,6 @@ namespace Ombi.Controllers.V1
/// Gets the Update Settings.
///
///
- [Admin]
[HttpGet("Update")]
public async Task UpdateSettings()
{
@@ -563,7 +541,6 @@ namespace Ombi.Controllers.V1
/// Gets the CouchPotatoSettings Settings.
///
///
- [Admin]
[HttpGet("CouchPotato")]
public async Task CouchPotatoSettings()
{
@@ -575,7 +552,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("CouchPotato")]
public async Task CouchPotatoSettings([FromBody]CouchPotatoSettings settings)
{
@@ -586,7 +562,6 @@ namespace Ombi.Controllers.V1
/// Gets the DogNzbSettings Settings.
///
///
- [Admin]
[HttpGet("DogNzb")]
public async Task DogNzbSettings()
{
@@ -598,7 +573,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("DogNzb")]
public async Task DogNzbSettings([FromBody]DogNzbSettings settings)
{
@@ -610,7 +584,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("SickRage")]
public async Task SickRageSettings([FromBody]SickRageSettings settings)
{
@@ -621,7 +594,6 @@ namespace Ombi.Controllers.V1
/// Gets the SickRage Settings.
///
///
- [Admin]
[HttpGet("SickRage")]
public async Task SickRageSettings()
{
@@ -632,7 +604,6 @@ namespace Ombi.Controllers.V1
/// Gets the JobSettings Settings.
///
///
- [Admin]
[HttpGet("jobs")]
public async Task JobSettings()
{
@@ -665,7 +636,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
///
- [Admin]
[HttpPost("jobs")]
public async Task JobSettings([FromBody]JobSettings settings)
{
@@ -709,7 +679,6 @@ namespace Ombi.Controllers.V1
}
[HttpPost("testcron")]
- [Admin]
public CronTestModel TestCron([FromBody] CronViewModelBody body)
{
var model = new CronTestModel();
@@ -743,7 +712,6 @@ namespace Ombi.Controllers.V1
/// The settings.
///
[HttpPost("Issues")]
- [Admin]
public async Task IssueSettings([FromBody]IssueSettings settings)
{
return await Save(settings);
@@ -774,7 +742,6 @@ namespace Ombi.Controllers.V1
/// The settings.
///
[HttpPost("vote")]
- [Admin]
public async Task VoteSettings([FromBody]VoteSettings settings)
{
return await Save(settings);
@@ -785,7 +752,6 @@ namespace Ombi.Controllers.V1
///
///
[HttpGet("vote")]
- [Admin]
public async Task VoteSettings()
{
return await Get();
@@ -804,7 +770,6 @@ namespace Ombi.Controllers.V1
///
/// The settings.
[HttpPost("themoviedb")]
- [Admin]
public async Task TheMovieDbSettings([FromBody]TheMovieDbSettings settings)
{
return await Save(settings);
@@ -813,7 +778,6 @@ namespace Ombi.Controllers.V1
///
/// Get The Movie DB settings.
///
- [Admin]
[HttpGet("themoviedb")]
public async Task TheMovieDbSettings()
{
@@ -825,7 +789,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/email")]
public async Task EmailNotificationSettings([FromBody] EmailNotificationsViewModel model)
{
@@ -843,7 +806,6 @@ namespace Ombi.Controllers.V1
/// Gets the Email Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/email")]
public async Task EmailNotificationSettings()
{
@@ -874,7 +836,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/discord")]
public async Task DiscordNotificationSettings([FromBody] DiscordNotificationsViewModel model)
{
@@ -892,7 +853,6 @@ namespace Ombi.Controllers.V1
/// Gets the discord Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/discord")]
public async Task DiscordNotificationSettings()
{
@@ -911,7 +871,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/telegram")]
public async Task TelegramNotificationSettings([FromBody] TelegramNotificationsViewModel model)
{
@@ -929,7 +888,6 @@ namespace Ombi.Controllers.V1
/// Gets the telegram Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/telegram")]
public async Task TelegramNotificationSettings()
{
@@ -947,7 +905,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/pushbullet")]
public async Task PushbulletNotificationSettings([FromBody] PushbulletNotificationViewModel model)
{
@@ -965,7 +922,6 @@ namespace Ombi.Controllers.V1
/// Gets the pushbullet Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/pushbullet")]
public async Task PushbulletNotificationSettings()
{
@@ -983,7 +939,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/pushover")]
public async Task PushoverNotificationSettings([FromBody] PushoverNotificationViewModel model)
{
@@ -1001,7 +956,6 @@ namespace Ombi.Controllers.V1
/// Gets the pushover Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/pushover")]
public async Task PushoverNotificationSettings()
{
@@ -1020,7 +974,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/slack")]
public async Task SlacktNotificationSettings([FromBody] SlackNotificationsViewModel model)
{
@@ -1038,7 +991,6 @@ namespace Ombi.Controllers.V1
/// Gets the slack Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/slack")]
public async Task SlackNotificationSettings()
{
@@ -1056,7 +1008,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/mattermost")]
public async Task MattermostNotificationSettings([FromBody] MattermostNotificationsViewModel model)
{
@@ -1074,7 +1025,6 @@ namespace Ombi.Controllers.V1
/// Gets the Mattermost Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/mattermost")]
public async Task MattermostNotificationSettings()
{
@@ -1091,7 +1041,6 @@ namespace Ombi.Controllers.V1
/// Gets the Twilio Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/twilio")]
public async Task TwilioNotificationSettings()
{
@@ -1113,7 +1062,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/twilio")]
public async Task TwilioNotificationSettings([FromBody] TwilioSettingsViewModel model)
{
@@ -1132,7 +1080,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/mobile")]
public async Task MobileNotificationSettings([FromBody] MobileNotificationsViewModel model)
{
@@ -1150,7 +1097,6 @@ namespace Ombi.Controllers.V1
/// Gets the Mobile Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/mobile")]
public async Task MobileNotificationSettings()
{
@@ -1168,7 +1114,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/gotify")]
public async Task GotifyNotificationSettings([FromBody] GotifyNotificationViewModel model)
{
@@ -1186,7 +1131,6 @@ namespace Ombi.Controllers.V1
/// Gets the gotify Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/gotify")]
public async Task GotifyNotificationSettings()
{
@@ -1204,7 +1148,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/webhook")]
public async Task WebhookNotificationSettings([FromBody] WebhookNotificationViewModel model)
{
@@ -1218,7 +1161,6 @@ namespace Ombi.Controllers.V1
/// Gets the webhook notification settings.
///
///
- [Admin]
[HttpGet("notifications/webhook")]
public async Task WebhookNotificationSettings()
{
@@ -1233,7 +1175,6 @@ namespace Ombi.Controllers.V1
///
/// The model.
///
- [Admin]
[HttpPost("notifications/newsletter")]
public async Task NewsletterSettings([FromBody] NewsletterNotificationViewModel model)
{
@@ -1248,7 +1189,6 @@ namespace Ombi.Controllers.V1
}
[ApiExplorerSettings(IgnoreApi = true)]
- [Admin]
[HttpPost("notifications/newsletterdatabase")]
public async Task UpdateNewsletterDatabase()
{
@@ -1259,7 +1199,6 @@ namespace Ombi.Controllers.V1
/// Gets the Newsletter Notification Settings.
///
///
- [Admin]
[HttpGet("notifications/newsletter")]
public async Task NewsletterSettings()
{
diff --git a/src/Ombi/Controllers/V2/WizardController.cs b/src/Ombi/Controllers/V2/WizardController.cs
index 2b3ab4f62..bb3bed5b6 100644
--- a/src/Ombi/Controllers/V2/WizardController.cs
+++ b/src/Ombi/Controllers/V2/WizardController.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Threading;
-using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Ombi.Attributes;
using Ombi.Core.Settings;
@@ -8,10 +6,6 @@ using Ombi.Helpers;
using Ombi.Models.V2;
using Ombi.Settings.Settings.Models;
using System.Threading.Tasks;
-using Microsoft.Extensions.Logging;
-using MySqlConnector;
-using Npgsql;
-using Ombi.Core.Services;
namespace Ombi.Controllers.V2
{
@@ -19,25 +13,15 @@ namespace Ombi.Controllers.V2
[AllowAnonymous]
public class WizardController : V2Controller
{
- private readonly ISettingsService _ombiSettings;
- private readonly IDatabaseConfigurationService _databaseConfigurationService;
- private readonly ILogger _logger;
private ISettingsService _customizationSettings { get; }
- public WizardController(
- ISettingsService customizationSettings,
- ISettingsService ombiSettings,
- IDatabaseConfigurationService databaseConfigurationService,
- ILogger logger)
+ public WizardController(ISettingsService customizationSettings)
{
- _ombiSettings = ombiSettings;
- _databaseConfigurationService = databaseConfigurationService;
- _logger = logger;
_customizationSettings = customizationSettings;
}
[HttpPost("config")]
- [ApiExplorerSettings(IgnoreApi = true)]
+ [ApiExplorerSettings(IgnoreApi =true)]
public async Task OmbiConfig([FromBody] OmbiConfigModel config)
{
if (config == null)
@@ -45,13 +29,6 @@ namespace Ombi.Controllers.V2
return BadRequest();
}
- var ombiSettings = await _ombiSettings.GetSettingsAsync();
- if (ombiSettings.Wizard)
- {
- _logger.LogError("Wizard has already been completed");
- return BadRequest();
- }
-
var settings = await _customizationSettings.GetSettingsAsync();
if (config.ApplicationName.HasValue())
@@ -73,67 +50,5 @@ namespace Ombi.Controllers.V2
return new OkObjectResult(settings);
}
-
- [HttpPost("database")]
- [ApiExplorerSettings(IgnoreApi = true)]
- public async Task DatabaseConfig([FromBody] WizardDatabaseConfiguration config, CancellationToken token)
- {
- if (config == null)
- {
- return BadRequest();
- }
-
- var ombiSettings = await _ombiSettings.GetSettingsAsync();
- if (ombiSettings.Wizard)
- {
- _logger.LogError("Wizard has already been completed");
- return BadRequest();
- }
-
- var sanitizedType = config.Type.Replace(Environment.NewLine, "").Replace("\n", "").Replace("\r", "");
- _logger.LogInformation("Setting up database type: {0}", sanitizedType);
-
- var connectionString = string.Empty;
- if (config.Type == IDatabaseConfigurationService.MySqlDatabase)
- {
- _logger.LogInformation("Building MySQL connectionstring");
- var builder = new MySqlConnectionStringBuilder
- {
- Database = config.Name,
- Port = Convert.ToUInt32(config.Port),
- Server = config.Host,
- UserID = config.User,
- Password = config.Password
- };
-
- connectionString = builder.ToString();
- }
-
- if (config.Type == IDatabaseConfigurationService.PostgresDatabase)
- {
- _logger.LogInformation("Building Postgres connectionstring");
- var builder = new NpgsqlConnectionStringBuilder
- {
- Host = config.Host,
- Port = config.Port,
- Database = config.Name,
- Username = config.User,
- Password = config.Password
- };
- connectionString = builder.ToString();
- }
-
- var result = await _databaseConfigurationService.ConfigureDatabase(config.Type, connectionString, token);
-
- if (!result)
- {
- return BadRequest(new DatabaseConfigurationResult(false, "Could not configure the database, please check the logs"));
- }
-
- return Ok(new DatabaseConfigurationResult(true, "Database configured successfully"));
- }
-
- public record DatabaseConfigurationResult(bool Success, string Message);
-
}
}
diff --git a/src/Ombi/Extensions/DatabaseExtensions.cs b/src/Ombi/Extensions/DatabaseExtensions.cs
index b0f04d730..c56e2f52d 100644
--- a/src/Ombi/Extensions/DatabaseExtensions.cs
+++ b/src/Ombi/Extensions/DatabaseExtensions.cs
@@ -8,8 +8,6 @@ using Microsoft.Extensions.Diagnostics.HealthChecks;
using MySqlConnector;
using Newtonsoft.Json;
using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal;
-using Ombi.Core.Helpers;
-using Ombi.Core.Models;
using Ombi.Helpers;
using Ombi.Store.Context;
using Ombi.Store.Context.MySql;
@@ -40,11 +38,11 @@ namespace Ombi.Extensions
AddSqliteHealthCheck(hcBuilder, "Ombi Database", configuration.OmbiDatabase);
break;
case var type when type.Equals(MySqlDatabase, StringComparison.InvariantCultureIgnoreCase):
- services.AddDbContext(x => DatabaseConfigurationSetup.ConfigureMySql(x, configuration.OmbiDatabase));
+ services.AddDbContext(x => ConfigureMySql(x, configuration.OmbiDatabase));
AddMySqlHealthCheck(hcBuilder, "Ombi Database", configuration.OmbiDatabase);
break;
case var type when type.Equals(PostgresDatabase, StringComparison.InvariantCultureIgnoreCase):
- services.AddDbContext(x => DatabaseConfigurationSetup.ConfigurePostgres(x, configuration.OmbiDatabase));
+ services.AddDbContext(x => ConfigurePostgres(x, configuration.OmbiDatabase));
AddPostgresHealthCheck(hcBuilder, "Ombi Database", configuration.OmbiDatabase);
break;
}
@@ -56,11 +54,11 @@ namespace Ombi.Extensions
AddSqliteHealthCheck(hcBuilder, "External Database", configuration.ExternalDatabase);
break;
case var type when type.Equals(MySqlDatabase, StringComparison.InvariantCultureIgnoreCase):
- services.AddDbContext(x => DatabaseConfigurationSetup.ConfigureMySql(x, configuration.ExternalDatabase));
+ services.AddDbContext(x => ConfigureMySql(x, configuration.ExternalDatabase));
AddMySqlHealthCheck(hcBuilder, "External Database", configuration.ExternalDatabase);
break;
case var type when type.Equals(PostgresDatabase, StringComparison.InvariantCultureIgnoreCase):
- services.AddDbContext(x => DatabaseConfigurationSetup.ConfigurePostgres(x, configuration.ExternalDatabase));
+ services.AddDbContext(x => ConfigurePostgres(x, configuration.ExternalDatabase));
AddPostgresHealthCheck(hcBuilder, "External Database", configuration.ExternalDatabase);
break;
}
@@ -72,11 +70,11 @@ namespace Ombi.Extensions
AddSqliteHealthCheck(hcBuilder, "Settings Database", configuration.SettingsDatabase);
break;
case var type when type.Equals(MySqlDatabase, StringComparison.InvariantCultureIgnoreCase):
- services.AddDbContext(x => DatabaseConfigurationSetup.ConfigureMySql(x, configuration.SettingsDatabase));
+ services.AddDbContext(x => ConfigureMySql(x, configuration.SettingsDatabase));
AddMySqlHealthCheck(hcBuilder, "Settings Database", configuration.SettingsDatabase);
break;
case var type when type.Equals(PostgresDatabase, StringComparison.InvariantCultureIgnoreCase):
- services.AddDbContext(x => DatabaseConfigurationSetup.ConfigurePostgres(x, configuration.SettingsDatabase));
+ services.AddDbContext(x => ConfigurePostgres(x, configuration.SettingsDatabase));
AddPostgresHealthCheck(hcBuilder, "Settings Database", configuration.SettingsDatabase);
break;
}
@@ -152,5 +150,95 @@ namespace Ombi.Extensions
SQLitePCL.raw.sqlite3_config(raw.SQLITE_CONFIG_MULTITHREAD);
options.UseSqlite(config.ConnectionString);
}
+
+ public static void ConfigureMySql(DbContextOptionsBuilder options, PerDatabaseConfiguration config)
+ {
+ if (string.IsNullOrEmpty(config.ConnectionString))
+ {
+ throw new ArgumentNullException("ConnectionString for the MySql/Mariadb database is empty");
+ }
+
+ options.UseMySql(config.ConnectionString, GetServerVersion(config.ConnectionString), b =>
+ {
+ //b.CharSetBehavior(Pomelo.EntityFrameworkCore.MySql.Infrastructure.CharSetBehavior.NeverAppend); // ##ISSUE, link to migrations?
+ b.EnableRetryOnFailure();
+ });
+ }
+
+ public static void ConfigurePostgres(DbContextOptionsBuilder options, PerDatabaseConfiguration config)
+ {
+ options.UseNpgsql(config.ConnectionString, b =>
+ {
+ b.EnableRetryOnFailure();
+ }).ReplaceService();
+ }
+
+ private static ServerVersion GetServerVersion(string connectionString)
+ {
+ // Workaround Windows bug, that can lead to the following exception:
+ //
+ // MySqlConnector.MySqlException (0x80004005): SSL Authentication Error
+ // ---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception.
+ // ---> System.ComponentModel.Win32Exception (0x8009030F): The message or signature supplied for verification has been altered
+ //
+ // See https://github.com/dotnet/runtime/issues/17005#issuecomment-305848835
+ //
+ // Also workaround for the fact, that ServerVersion.AutoDetect() does not use any retrying strategy.
+ ServerVersion serverVersion = null;
+#pragma warning disable EF1001
+ var retryPolicy = Policy.Handle(exception => MySqlTransientExceptionDetector.ShouldRetryOn(exception))
+#pragma warning restore EF1001
+ .WaitAndRetry(3, (count, context) => TimeSpan.FromMilliseconds(count * 250));
+
+ serverVersion = retryPolicy.Execute(() => serverVersion = ServerVersion.AutoDetect(connectionString));
+
+ return serverVersion;
+ }
+
+ public class DatabaseConfiguration
+ {
+ public DatabaseConfiguration()
+ {
+
+ }
+
+ public DatabaseConfiguration(string defaultSqlitePath)
+ {
+ OmbiDatabase = new PerDatabaseConfiguration(SqliteDatabase, $"Data Source={Path.Combine(defaultSqlitePath, "Ombi.db")}");
+ SettingsDatabase = new PerDatabaseConfiguration(SqliteDatabase, $"Data Source={Path.Combine(defaultSqlitePath, "OmbiSettings.db")}");
+ ExternalDatabase = new PerDatabaseConfiguration(SqliteDatabase, $"Data Source={Path.Combine(defaultSqlitePath, "OmbiExternal.db")}");
+ }
+ public PerDatabaseConfiguration OmbiDatabase { get; set; }
+ public PerDatabaseConfiguration SettingsDatabase { get; set; }
+ public PerDatabaseConfiguration ExternalDatabase { get; set; }
+ }
+
+ public class PerDatabaseConfiguration
+ {
+ public PerDatabaseConfiguration(string type, string connectionString)
+ {
+ Type = type;
+ ConnectionString = connectionString;
+ }
+
+ // Used in Deserialization
+ public PerDatabaseConfiguration()
+ {
+
+ }
+ public string Type { get; set; }
+ public string ConnectionString { get; set; }
+ }
+
+ public class NpgsqlCaseInsensitiveSqlGenerationHelper : NpgsqlSqlGenerationHelper
+ {
+ const string EFMigrationsHisory = "__EFMigrationsHistory";
+ public NpgsqlCaseInsensitiveSqlGenerationHelper(RelationalSqlGenerationHelperDependencies dependencies)
+ : base(dependencies) { }
+ public override string DelimitIdentifier(string identifier) =>
+ base.DelimitIdentifier(identifier == EFMigrationsHisory ? identifier : identifier.ToLower());
+ public override void DelimitIdentifier(StringBuilder builder, string identifier)
+ => base.DelimitIdentifier(builder, identifier == EFMigrationsHisory ? identifier : identifier.ToLower());
+ }
}
}
diff --git a/src/Ombi/Models/V2/WizardDatabaseConfiguration.cs b/src/Ombi/Models/V2/WizardDatabaseConfiguration.cs
deleted file mode 100644
index 923b23b77..000000000
--- a/src/Ombi/Models/V2/WizardDatabaseConfiguration.cs
+++ /dev/null
@@ -1,3 +0,0 @@
-namespace Ombi.Models.V2;
-
-public record WizardDatabaseConfiguration(string Type, string Host, int Port, string Name, string User, string Password);
\ No newline at end of file
diff --git a/src/Ombi/Ombi.csproj b/src/Ombi/Ombi.csproj
index 0de46e8c5..4e7b55b8b 100644
--- a/src/Ombi/Ombi.csproj
+++ b/src/Ombi/Ombi.csproj
@@ -54,6 +54,10 @@
+
+
+
+
diff --git a/src/Ombi/wwwroot/translations/ca.json b/src/Ombi/wwwroot/translations/ca.json
index 7ac957b11..2c7e21fc2 100644
--- a/src/Ombi/wwwroot/translations/ca.json
+++ b/src/Ombi/wwwroot/translations/ca.json
@@ -159,7 +159,7 @@
"RequestedBy": "Sol·licitat per",
"Status": "Estat",
"RequestStatus": "Estat de la sol·licitud",
- "Watched": "Vist",
+ "Watched": "Watched",
"WatchedTooltip": "The user who made the request has watched it",
"WatchedProgressTooltip": "Shows how much the user who made the request has watched it",
"WatchedByUsersCount": "{{count}} users have watched this.",
@@ -408,7 +408,7 @@
"Movies": "Pel·lícules",
"Combined": "Combinat",
"Tv": "TV",
- "Genres": "Gèneres",
+ "Genres": "Genres",
"CardDetails": {
"Availability": "Disponibilitat",
"Studio": "Estudi",
diff --git a/src/Ombi/wwwroot/translations/nl.json b/src/Ombi/wwwroot/translations/nl.json
index fb78ae68f..4a3dab266 100644
--- a/src/Ombi/wwwroot/translations/nl.json
+++ b/src/Ombi/wwwroot/translations/nl.json
@@ -159,10 +159,10 @@
"RequestedBy": "Verzocht Door",
"Status": "Status",
"RequestStatus": "Aanvraagstatus",
- "Watched": "Bekeken",
- "WatchedTooltip": "De gebruiker die het verzoek heeft ingediend, heeft het bekeken",
- "WatchedProgressTooltip": "Laat zien hoeveel de gebruiker die het verzoek heeft gemaakt het heeft bekeken",
- "WatchedByUsersCount": "{{count}} gebruikers hebben dit bekeken.",
+ "Watched": "Watched",
+ "WatchedTooltip": "The user who made the request has watched it",
+ "WatchedProgressTooltip": "Shows how much the user who made the request has watched it",
+ "WatchedByUsersCount": "{{count}} users have watched this.",
"Denied": " Geweigerd:",
"TheatricalRelease": "Cinema Uitgave: {{date}}",
"ReleaseDate": "Uitgekomen: {{date}}",
@@ -225,7 +225,7 @@
"Denied": "Geselecteerde items succesvol afgekeurd"
},
"SuccessfullyApproved": "Succesvol goedgekeurd",
- "SuccessfullyDenied": "Succesvol Geweigerd",
+ "SuccessfullyDenied": "Successfully Denied",
"SuccessfullyDeleted": "Verzoek succesvol verwijderd",
"NowAvailable": "Verzoek is nu beschikbaar",
"NowUnavailable": "Verzoek is nu niet beschikbaar",
@@ -241,7 +241,7 @@
"NoPermissionsOnBehalf": "Je hebt niet de juiste rechten om namens gebruikers aan te vragen!",
"NoPermissions": "Je hebt de juiste rechten niet!",
"RequestDoesNotExist": "Verzoek bestaat niet",
- "ChildRequestDoesNotExist": "Kindverzoek bestaat niet",
+ "ChildRequestDoesNotExist": "Child Request does not exist",
"NoPermissionsRequestMovie": "Je bent niet gemachtigd om een film aan te vragen",
"NoPermissionsRequestTV": "Je bent niet gemachtigd om een serie aan te vragen",
"NoPermissionsRequestAlbum": "Je bent niet gemachtigd om een album aan te vragen",
diff --git a/tests/cypress.config.ts b/tests/cypress.config.ts
index 53d177e2f..124acd30e 100644
--- a/tests/cypress.config.ts
+++ b/tests/cypress.config.ts
@@ -5,7 +5,6 @@ import createEsbuildPlugin from "@badeball/cypress-cucumber-preprocessor/esbuild
export default defineConfig({
watchForFileChanges: true,
- video: true,
chromeWebSecurity: false,
viewportWidth: 2560,
viewportHeight: 1440,
diff --git a/tests/cypress/features/01-wizard/wizard.ts b/tests/cypress/features/01-wizard/wizard.ts
index 53d3bfe7c..7ce819d1a 100644
--- a/tests/cypress/features/01-wizard/wizard.ts
+++ b/tests/cypress/features/01-wizard/wizard.ts
@@ -11,7 +11,6 @@ When("I visit Ombi", () => {
When("I click through all of the pages", () => {
Page.welcomeTab.next.click();
- Page.databaseTab.next.click();
Page.mediaServerTab.next.click();
Page.localUserTab.next.click();
Page.ombiConfigTab.next.click();
@@ -23,7 +22,6 @@ When("I click through all of the pages", () => {
When("I click through to the user page", () => {
Page.welcomeTab.next.click();
- Page.databaseTab.next.click();
Page.mediaServerTab.next.click();
});
@@ -50,6 +48,6 @@ Then("I should get a notification {string}", (string) => {
Then("I should be on the User tab", () => {
Page.matStepsHeader.then((_) => {
- cy.get('#cdk-step-label-0-3').should('have.attr', 'aria-selected', 'true');
+ cy.get('#cdk-step-label-0-2').should('have.attr', 'aria-selected', 'true');
});
});
\ No newline at end of file
diff --git a/tests/cypress/fixtures/api/v1/tv-search-extra-info.json b/tests/cypress/fixtures/api/v1/tv-search-extra-info.json
index 78f644acb..3421514a2 100644
--- a/tests/cypress/fixtures/api/v1/tv-search-extra-info.json
+++ b/tests/cypress/fixtures/api/v1/tv-search-extra-info.json
@@ -25,7 +25,7 @@
{
"episodeNumber": 1,
"title": "Our Cup Runneth Over",
- "airDate": "2015-01-13T00:00:00Z",
+ "airDate": "2015-01-13T00:00:00",
"url": "https://www.tvmaze.com/episodes/153107/schitts-creek-1x01-our-cup-runneth-over",
"available": false,
"approved": false,
diff --git a/tests/cypress/integration/page-objects/wizard/wizard.page.ts b/tests/cypress/integration/page-objects/wizard/wizard.page.ts
index 2a3bee1ec..0b0f7d2c2 100644
--- a/tests/cypress/integration/page-objects/wizard/wizard.page.ts
+++ b/tests/cypress/integration/page-objects/wizard/wizard.page.ts
@@ -20,12 +20,6 @@ class WelcomeTab {
}
}
-class DatabaseTab {
- get next(): Cypress.Chainable {
- return cy.getByData('nextDatabase');
- }
-}
-
class MediaServerTab {
get next(): Cypress.Chainable {
return cy.getByData('nextMediaServer');
@@ -41,7 +35,6 @@ class OmbiConfigTab {
class WizardPage extends BasePage {
- databaseTab: DatabaseTab;
localUserTab: LocalUserTab;
welcomeTab: WelcomeTab;
mediaServerTab: MediaServerTab;
@@ -61,7 +54,6 @@ class WizardPage extends BasePage {
this.welcomeTab = new WelcomeTab();
this.mediaServerTab = new MediaServerTab();
this.ombiConfigTab = new OmbiConfigTab();
- this.databaseTab = new DatabaseTab();
}
visit(options: Cypress.VisitOptions): Cypress.Chainable;
diff --git a/tests/package.json b/tests/package.json
index 07450868a..54470c379 100644
--- a/tests/package.json
+++ b/tests/package.json
@@ -3,7 +3,7 @@
"@badeball/cypress-cucumber-preprocessor": "^14.0.0",
"@bahmutov/cy-api": "^1.5.0",
"@bahmutov/cypress-esbuild-preprocessor": "^2.1.5",
- "cypress": "13.17.0",
+ "cypress": "12.14.0",
"cypress-wait-until": "^1.7.1",
"typescript": "^4.2.3"
},
diff --git a/tests/yarn.lock b/tests/yarn.lock
index 806873571..2201f0bcf 100644
--- a/tests/yarn.lock
+++ b/tests/yarn.lock
@@ -126,10 +126,10 @@
resolved "https://registry.yarnpkg.com/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz#9a91b0e0dd2f2ba703e3038c52b49b9ac06c2c6f"
integrity sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA==
-"@cypress/request@^3.0.6":
- version "3.0.7"
- resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.7.tgz#6a74a4da98d9e5ae9121d6e2d9c14780c9b5cf1a"
- integrity sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==
+"@cypress/request@^2.88.10":
+ version "2.88.10"
+ resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce"
+ integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
@@ -137,16 +137,16 @@
combined-stream "~1.0.6"
extend "~3.0.2"
forever-agent "~0.6.1"
- form-data "~4.0.0"
- http-signature "~1.4.0"
+ form-data "~2.3.2"
+ http-signature "~1.3.6"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.19"
performance-now "^2.1.0"
- qs "6.13.1"
+ qs "~6.5.2"
safe-buffer "^5.1.2"
- tough-cookie "^5.0.0"
+ tough-cookie "~2.5.0"
tunnel-agent "^0.6.0"
uuid "^8.3.2"
@@ -168,6 +168,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34"
integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==
+"@types/node@^14.14.31":
+ version "14.18.34"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.34.tgz#cd2e6fa0dbfb08a62582a7b967558e73c32061ec"
+ integrity sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==
+
"@types/parse-json@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
@@ -321,7 +326,7 @@ buffer-crc32@~0.2.3:
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
-buffer@^5.7.1:
+buffer@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -334,22 +339,6 @@ cachedir@^2.3.0:
resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8"
integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==
-call-bind-apply-helpers@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840"
- integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==
- dependencies:
- es-errors "^1.3.0"
- function-bind "^1.1.2"
-
-call-bound@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681"
- integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==
- dependencies:
- call-bind-apply-helpers "^1.0.1"
- get-intrinsic "^1.2.6"
-
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
@@ -382,10 +371,10 @@ check-more-types@^2.24.0:
resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==
-ci-info@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.1.0.tgz#92319d2fa29d2620180ea5afed31f589bc98cf83"
- integrity sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==
+ci-info@^3.2.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef"
+ integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==
class-transformer@0.5.1:
version "0.5.1"
@@ -462,7 +451,7 @@ colors@1.0.3:
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==
-combined-stream@^1.0.8, combined-stream@~1.0.6:
+combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -524,23 +513,23 @@ cypress-wait-until@^1.7.1:
resolved "https://registry.yarnpkg.com/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz#7f534dd5a11c89b65359e7a0210f20d3dfc22107"
integrity sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==
-cypress@13.17.0:
- version "13.17.0"
- resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.17.0.tgz#34c3d68080c4497eace0f353bd1629587a5f600d"
- integrity sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==
+cypress@12.14.0:
+ version "12.14.0"
+ resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.14.0.tgz#37a19b85f5e9d881995e9fee1ddf41b3d3a623dd"
+ integrity sha512-HiLIXKXZaIT1RT7sw1sVPt+qKtis3uYNm6KwC4qoYjabwLKaqZlyS/P+uVvvlBNcHIwL/BC6nQZajpbUd7hOgQ==
dependencies:
- "@cypress/request" "^3.0.6"
+ "@cypress/request" "^2.88.10"
"@cypress/xvfb" "^1.2.4"
+ "@types/node" "^14.14.31"
"@types/sinonjs__fake-timers" "8.1.1"
"@types/sizzle" "^2.3.2"
arch "^2.2.0"
blob-util "^2.0.2"
bluebird "^3.7.2"
- buffer "^5.7.1"
+ buffer "^5.6.0"
cachedir "^2.3.0"
chalk "^4.1.0"
check-more-types "^2.24.0"
- ci-info "^4.0.0"
cli-cursor "^3.1.0"
cli-table3 "~0.6.1"
commander "^6.2.1"
@@ -555,6 +544,7 @@ cypress@13.17.0:
figures "^3.2.0"
fs-extra "^9.1.0"
getos "^3.2.1"
+ is-ci "^3.0.0"
is-installed-globally "~0.4.0"
lazy-ass "^1.6.0"
listr2 "^3.8.3"
@@ -563,13 +553,11 @@ cypress@13.17.0:
minimist "^1.2.8"
ospath "^1.2.2"
pretty-bytes "^5.6.0"
- process "^0.11.10"
proxy-from-env "1.0.0"
request-progress "^3.0.0"
- semver "^7.5.3"
+ semver "^7.3.2"
supports-color "^8.1.1"
- tmp "~0.2.3"
- tree-kill "1.2.2"
+ tmp "~0.2.1"
untildify "^4.0.0"
yauzl "^2.10.0"
@@ -604,15 +592,6 @@ delayed-stream@~1.0.0:
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
-dunder-proto@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
- integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
- dependencies:
- call-bind-apply-helpers "^1.0.1"
- es-errors "^1.3.0"
- gopd "^1.2.0"
-
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -654,23 +633,6 @@ error-stack-parser@^2.0.7:
dependencies:
stackframe "^1.3.4"
-es-define-property@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
- integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
-
-es-errors@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
- integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
-
-es-object-atoms@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
- integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
- dependencies:
- es-errors "^1.3.0"
-
esbuild-android-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
@@ -875,13 +837,13 @@ forever-agent@~0.6.1:
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
-form-data@~4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
- integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
dependencies:
asynckit "^0.4.0"
- combined-stream "^1.0.8"
+ combined-stream "^1.0.6"
mime-types "^2.1.12"
fs-extra@^9.1.0:
@@ -899,35 +861,6 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-function-bind@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
- integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-
-get-intrinsic@^1.2.5, get-intrinsic@^1.2.6:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.7.tgz#dcfcb33d3272e15f445d15124bc0a216189b9044"
- integrity sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==
- dependencies:
- call-bind-apply-helpers "^1.0.1"
- es-define-property "^1.0.1"
- es-errors "^1.3.0"
- es-object-atoms "^1.0.0"
- function-bind "^1.1.2"
- get-proto "^1.0.0"
- gopd "^1.2.0"
- has-symbols "^1.1.0"
- hasown "^2.0.2"
- math-intrinsics "^1.1.0"
-
-get-proto@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
- integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
- dependencies:
- dunder-proto "^1.0.1"
- es-object-atoms "^1.0.0"
-
get-stream@^5.0.0, get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
@@ -949,7 +882,7 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
-glob@^7.1.6, glob@^7.2.0:
+glob@^7.1.3, glob@^7.1.6, glob@^7.2.0:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -968,11 +901,6 @@ global-dirs@^3.0.0:
dependencies:
ini "2.0.0"
-gopd@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
- integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
-
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
@@ -988,26 +916,14 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-has-symbols@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
- integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
-
-hasown@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
- integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
- dependencies:
- function-bind "^1.1.2"
-
-http-signature@~1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.4.0.tgz#dee5a9ba2bf49416abc544abd6d967f6a94c8c3f"
- integrity sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==
+http-signature@~1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9"
+ integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==
dependencies:
assert-plus "^1.0.0"
jsprim "^2.0.2"
- sshpk "^1.18.0"
+ sshpk "^1.14.1"
human-signals@^1.1.1:
version "1.1.1"
@@ -1055,6 +971,13 @@ is-arrayish@^0.2.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+is-ci@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867"
+ integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==
+ dependencies:
+ ci-info "^3.2.0"
+
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
@@ -1194,10 +1117,12 @@ log-update@^4.0.0:
slice-ansi "^4.0.0"
wrap-ansi "^6.2.0"
-math-intrinsics@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
- integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
merge-stream@^2.0.0:
version "2.0.0"
@@ -1260,11 +1185,6 @@ npm-run-path@^4.0.0:
dependencies:
path-key "^3.0.0"
-object-inspect@^1.13.3:
- version "1.13.3"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a"
- integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==
-
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -1343,16 +1263,16 @@ pretty-bytes@^5.6.0:
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
-process@^0.11.10:
- version "0.11.10"
- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
- integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
-
proxy-from-env@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee"
integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==
+psl@^1.1.28:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
@@ -1361,12 +1281,15 @@ pump@^3.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
-qs@6.13.1:
- version "6.13.1"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e"
- integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==
- dependencies:
- side-channel "^1.0.6"
+punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@~6.5.2:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
+ integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
reflect-metadata@0.1.13:
version "0.1.13"
@@ -1422,6 +1345,13 @@ rfdc@^1.3.0:
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
+rimraf@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
rxjs@^7.5.1:
version "7.5.7"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39"
@@ -1439,10 +1369,12 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-semver@^7.5.3:
- version "7.6.3"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
- integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+semver@^7.3.2:
+ version "7.3.8"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
+ integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
+ dependencies:
+ lru-cache "^6.0.0"
shebang-command@^2.0.0:
version "2.0.0"
@@ -1456,46 +1388,6 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-side-channel-list@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
- integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
- dependencies:
- es-errors "^1.3.0"
- object-inspect "^1.13.3"
-
-side-channel-map@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
- integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
- dependencies:
- call-bound "^1.0.2"
- es-errors "^1.3.0"
- get-intrinsic "^1.2.5"
- object-inspect "^1.13.3"
-
-side-channel-weakmap@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
- integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
- dependencies:
- call-bound "^1.0.2"
- es-errors "^1.3.0"
- get-intrinsic "^1.2.5"
- object-inspect "^1.13.3"
- side-channel-map "^1.0.1"
-
-side-channel@^1.0.6:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
- integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
- dependencies:
- es-errors "^1.3.0"
- object-inspect "^1.13.3"
- side-channel-list "^1.0.0"
- side-channel-map "^1.0.1"
- side-channel-weakmap "^1.0.2"
-
signal-exit@^3.0.2:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
@@ -1524,10 +1416,10 @@ source-map@^0.7.4:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
-sshpk@^1.18.0:
- version "1.18.0"
- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028"
- integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==
+sshpk@^1.14.1:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
+ integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
@@ -1596,34 +1488,20 @@ through@^2.3.8:
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
-tldts-core@^6.1.70:
- version "6.1.70"
- resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.70.tgz#a954e93237ece2e1705b438600793c86a25f8c00"
- integrity sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg==
-
-tldts@^6.1.32:
- version "6.1.70"
- resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.70.tgz#b571e5645ab9dc6f289453115d52602b8a384cfe"
- integrity sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA==
+tmp@~0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
+ integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
dependencies:
- tldts-core "^6.1.70"
+ rimraf "^3.0.0"
-tmp@~0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae"
- integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==
-
-tough-cookie@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af"
- integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
dependencies:
- tldts "^6.1.32"
-
-tree-kill@1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
- integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+ psl "^1.1.28"
+ punycode "^2.1.1"
tslib@^2.1.0:
version "2.4.1"
@@ -1711,6 +1589,11 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
yaml@^1.10.0:
version "1.10.2"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
diff --git a/version.json b/version.json
index dc01ed894..6412f862a 100644
--- a/version.json
+++ b/version.json
@@ -1,3 +1,3 @@
{
- "version": "4.49.3"
+ "version": "4.46.8"
}