Compare commits

...

189 Commits

Author SHA1 Message Date
Jamie Rees
9a048b1e23
fix(sonarr): #5215: Validate user root paths exist in Sonarr 2026-02-04 08:46:46 +00:00
Jamie
f770e8ffae Fix issue #5215: Validate user root paths exist in Sonarr
When users have a root path override set in their profile that no longer
exists in Sonarr, requests would fail with 'Root Folder Path must not be
empty' error.

This fix adds validation to check if user's configured root path ID
still exists in Sonarr before using it. If path doesn't exist, a
warning is logged and global default path is used instead.

Changes:
- Added validation for user's standard Sonarr root path override
- Added validation for user's anime Sonarr root path override
- Added detailed logging for fallback scenarios

Fixes #5215
2026-02-02 22:25:19 +00:00
Jamie Rees
c28de8820a
Merge pull request #5320 from Ombi-app/test-season-fix 2026-02-02 21:02:03 +00:00
tidusjar
a8fe9e67c0 space 2026-02-02 20:51:11 +00:00
tidusjar
5c4ef9c69c undo 2026-02-02 20:50:57 +00:00
Jamie Rees
ec46c40e1e
Merge pull request #5322 from Ombi-app/issue-5288-fix 2026-02-02 20:50:09 +00:00
tidusjar
63b284e4bb undo 2026-02-02 20:49:48 +00:00
Jamie Rees
ca74dde17b
Merge pull request #5321 from Ombi-app/issue-5287-fix 2026-02-02 20:48:54 +00:00
tidusjar
59caa764b5 undo 2026-02-02 20:48:37 +00:00
Jamie Rees
e684318506
Merge branch 'develop' into issue-5288-fix 2026-02-02 20:47:04 +00:00
tidusjar
ce7a5ebb58 Merge branch 'develop' into issue-5287-fix 2026-02-02 20:46:22 +00:00
Jamie
9adb2ed4ef fix: Correct EmbyHelper app.emby.media path detection
Fixes failing test EmbyHelper_GetMediaUrl_AppEmbyMedia_UsesCorrectHashFormat.

The check was using && (AND) instead of || (OR), so when a
custom URL explicitly containing 'app.emby.media' was passed,
the path was not being set to 'item' correctly.
2026-02-02 20:40:09 +00:00
Jamie
8009346647 Fix: Use season search when Sonarr has >= episodes than requested
Resolves #5319

Previously, Ombi would fall back to individual episode searches
when Sonarr had more episodes than Ombi requested.
This caused issues with older TV shows where backends don't support
individual episode searches, resulting in silent failures.

Now we do a season search when Sonarr has equal or more episodes
than requested (the common case), which handles incomplete Ombi metadata
and respects user intent for full season requests.
2026-02-02 20:39:33 +00:00
tidusjar
40f9bb6f65 chore: gitignore 2026-02-02 20:38:28 +00:00
Jamie Rees
7e8e05736d
Merge pull request #5323 from Ombi-app/issue-5306-sonarr-cache-fix 2026-02-02 20:32:54 +00:00
Jamie
7a6e8f0b1f Merge develop into issue-5288-fix
Resolved conflict in EmbyHelper.cs by taking develop version
(EmbyHelper changes are part of separate PR #5324)
2026-02-02 19:28:06 +00:00
Jamie Rees
9b2d90894c
Merge branch 'develop' into issue-5306-sonarr-cache-fix 2026-02-02 19:22:59 +00:00
Jamie Rees
fe14148ac6
Merge pull request #5324 from Ombi-app/fix-emby-app-media
fix: Correct EmbyHelper app.emby.media path detection
2026-02-02 19:20:12 +00:00
Jamie
1e4d3f8fe0 fix: Correct EmbyHelper app.emby.media path detection
Fixes #5312 - Wrong Emby Web URL generated by Ombi

The /web/index.html path causes 404 errors on app.emby.media.
Now properly handles both explicit app.emby.media URLs and default case.

Changes:
- app.emby.media URLs omit /web/index.html (e.g., https://app.emby.media/#!/item?id=1)
- Custom Emby server URLs still include /web/index.html (e.g., http://google.com/web/index.html#!/item?id=1)
- Default URL (no custom server) also uses app.emby.media format without /web/index.html
- Updated test expectations to match fix
2026-02-02 19:09:32 +00:00
Jamie
89b8c5255b fix: SonarrSync now deletes episodes per-series to prevent incomplete cache
Fixes #5306 - Sonarr items are not showing as available

Root cause:
SonarrSync was deleting ALL episodes from SonarrEpisodeCache at the start of
the job, then re-adding them one series at a time. If the job failed
partway through (API timeout, network issue, etc.), the cache would be
left incomplete with only some series' episodes. This caused shows to be
incorrectly marked as unavailable.

Changes:
- Moved DELETE FROM SonarrEpisodeCache inside the series loop
- Now deletes episodes per series (by TvDbId) before adding new ones
- If job fails mid-way, cache for already-processed series remains intact

This ensures that partial failures don't result in completely empty cache.
2026-02-02 18:55:16 +00:00
Jamie
88b52159e7 fix: Correct EmbyHelper app.emby.media path detection
Fixes failing test in PR #689 - EmbyHelper_GetMediaUrl_AppEmbyMedia_UsesCorrectHashFormat

The test expected app.emby.media URLs to NOT include /web/index.html,
but the helper was always adding it for all URLs.

Changes:
- app.emby.media URLs now omit /web/index.html (e.g., https://app.emby.media/#!/item?id=1)
- Custom Emby server URLs still include /web/index.html (e.g., http://google.com/web/index.html#!/item?id=1)
- Default URL (no custom server) now also uses app.emby.media format without /web/index.html
2026-02-02 18:54:16 +00:00
Jamie
840d740cd0 fix: Correct EmbyHelper app.emby.media path detection
Fixes failing test in PR #689 - EmbyHelper_GetMediaUrl_AppEmbyMedia_UsesCorrectHashFormat

The test expected app.emby.media URLs to NOT include /web/index.html,
but the helper was always adding it for all URLs.

Changes:
- app.emby.media URLs now omit /web/index.html (e.g., https://app.emby.media/#!/item?id=1)
- Custom Emby server URLs still include /web/index.html (e.g., http://google.com/web/index.html#!/item?id=1)
- Default URL (no custom server) now also uses app.emby.media format without /web/index.html
2026-02-02 18:52:54 +00:00
Jamie
40cd1cdbaf Add Denied field to RequestCount API response
Fixes #5288 - Request/count API endpoint: pending field false

Changes:
- Added Denied property to RequestCountModel
- Updated RequestCount method to count denied requests separately
- Fixed pending count to exclude denied requests
- Denied requests are now properly tracked and not included in pending

This fixes the issue where denied requests were being counted as pending
in the API response, which affected third-party tools like Homepage.
2026-02-02 18:39:56 +00:00
Jamie
ae3648aba2 Fix NullReferenceException in PlexUserImporter
Fixes #5287 - Issue importing users from Plex

The ImportAdmin method was calling .Equals() on potentially null
ProviderUserId strings, causing a NullReferenceException when
importing Plex users. Changed to use string.Equals() which
handles nulls properly.

This could occur when:
- ProviderUserId is null for existing users in the database
- plexAdmin.id is null in the Plex API response
2026-02-02 18:33:00 +00:00
Jamie
d16858dbbc fix: Correct EmbyHelper app.emby.media path detection
Fixes failing test EmbyHelper_GetMediaUrl_AppEmbyMedia_UsesCorrectHashFormat.

The check was using && (AND) instead of || (OR), so when a
custom URL explicitly containing 'app.emby.media' was passed,
the path was not being set to 'item' correctly.
2026-02-02 18:09:33 +00:00
Jamie
a2d346ce2c Fix: Use season search when Sonarr has >= episodes than requested
Resolves #5319

Previously, Ombi would fall back to individual episode searches
when Sonarr had more episodes than Ombi requested.
This caused issues with older TV shows where backends don't support
individual episode searches, resulting in silent failures.

Now we do a season search when Sonarr has equal or more episodes
than requested (the common case), which handles incomplete Ombi metadata
and respects user intent for full season requests.
2026-02-02 18:01:03 +00:00
Jamie
bb6300fe98 fix: Add missing using System to EmbyHelper
Fixes compilation error where StringComparison enum was not found
because namespace System was not imported.
2026-02-02 18:00:52 +00:00
contrib-readme-bot
d32690f4df chore: 👥 Updated Contributors [skip ci] 2026-02-01 23:50:45 +00:00
Jamie
8456a0a6de Fix Emby URL format for app.emby.media
- Use #!/item instead of #!/details when targeting app.emby.media
- Fixes issue #5312 where URLs with #!/details path return 404
- Add unit test to verify correct format

Co-authored-by: Jamie <jamie@tidusjar.com>
2026-02-01 23:50:31 +00:00
Jamie
6b608fe19f Fix Emby URL format for app.emby.media
- Use #!/item instead of #!/details when targeting app.emby.media
- Fixes issue #5312 where URLs with #!/details path return 404
- Add unit test to verify correct format

Co-authored-by: Jamie <jamie@tidusjar.com>
2026-02-01 23:40:52 +00:00
Conventional Changelog Action
e24088e380 chore(release): 🚀 v4.54.1 [skip ci] 2026-01-10 22:05:28 +00:00
contrib-readme-bot
26de71653b chore: 👥 Updated Contributors [skip ci] 2026-01-10 22:03:47 +00:00
tidusjar
8af1d678ac fix(availability): Make sure we check radarr/sonarr in the availability rules for it's prioritization #5286 2026-01-10 22:03:35 +00:00
Jamie Rees
08a6aa73d2
Merge pull request #5285 from GodKratos/issue/5283 [skip ci]
Resolve inconsistencies in view at 768px screen width for #5283
2026-01-08 21:39:48 +00:00
Conventional Changelog Action
e8ec50a055 chore(release): 🚀 v4.54.0 [skip ci] 2026-01-08 21:39:10 +00:00
Jamie Rees
33cb5ff70e
Merge pull request #5284 from GodKratos/feature/carousel_runtime_calculation
fix: Feature/carousel runtime calculation
2026-01-08 21:37:13 +00:00
Conventional Changelog Action
1ad7f1f4e0 chore(release): 🚀 v4.53.3 [skip ci] 2026-01-08 21:33:19 +00:00
contrib-readme-bot
c263e3ed6f chore: 👥 Updated Contributors [skip ci] 2026-01-08 21:31:38 +00:00
tidusjar
7da1721a55 fix: small fix to search by decade 2026-01-08 21:31:27 +00:00
Jamie Rees
fa9bd1ab67
Merge pull request #5305 from Crosenhain/decades [skip ci]
Search by decade
2026-01-08 21:27:45 +00:00
Conventional Changelog Action
736db42b2c chore(release): 🚀 v4.53.2 [skip ci] 2026-01-08 21:11:02 +00:00
tidusjar
8f3f87a189 fix(availability): Ensure that when Radarr/Sonarr has priority, stick to it #5286 2026-01-08 21:09:12 +00:00
Conventional Changelog Action
d2e5bbcd9c chore(release): 🚀 v4.53.1 [skip ci] 2026-01-08 20:28:24 +00:00
contrib-readme-bot
5ae3e6bf30 chore: 👥 Updated Contributors [skip ci] 2026-01-08 20:25:38 +00:00
tidusjar
d3d1d380d5 fix(radarr/sonarr): 🐛 Sanitize usernames when adding them as tags to Radarr/Sonarr #5307 2026-01-08 20:25:25 +00:00
Chris Rosenhain
d816311171 Search by decade 2025-12-06 15:35:25 +10:30
Conventional Changelog Action
414052a0e1 chore(release): 🚀 v4.53.0 [skip ci] 2025-11-06 22:43:15 +00:00
Jamie Rees
c6b7512245
feat(availability): Add the option for the *arr to take media availability priority
feat(availability):  Add the option for the *arr to take media availability priority
2025-11-06 22:41:27 +00:00
Conventional Changelog Action
8215fdc098 chore(release): 🚀 v4.52.0 [skip ci] 2025-11-06 22:39:26 +00:00
contrib-readme-bot
0bda11c768 chore: 👥 Updated Contributors [skip ci] 2025-11-06 22:36:34 +00:00
Jamie Rees
ffb0303639
feat(watchlist): add the ability to force a recheck on plex watchlist failed users
Feature/add force recheck watchlist
2025-11-06 22:36:25 +00:00
tidusjar
d43a2e4efc feat(availability): Add the option for the *arr to take media availability priority
#5286
2025-11-06 22:29:11 +00:00
GodKratos
6902895402 fix: remove negated condition 2025-10-20 23:23:28 +13:00
GodKratos
acc5bb8a06 fix: reduce cognitive complexity 2025-10-20 23:13:45 +13:00
GodKratos
4fd47c18b5 fix: window size check 2025-10-20 23:10:42 +13:00
GodKratos
7cd42257a3 fix: resolve inconsistencies in view at 768px screen width 2025-10-20 22:00:01 +13:00
GodKratos
01c4fa916f feat: centre requested carousel items 2025-10-20 17:41:56 +13:00
GodKratos
5d79c80462 fix: remove hard-coded item width for recently requested carousel 2025-10-20 17:27:42 +13:00
GodKratos
5b0f3252f6 feat: use dynamic scroll sizing for recently requested carousel 2025-10-20 17:27:29 +13:00
Conventional Changelog Action
1bbfd7749e chore(release): 🚀 v4.51.6 [skip ci] 2025-10-15 19:59:10 +00:00
Jamie Rees
10dd02198c
Merge pull request #5282 from Ombi-app/multipart
fix(emby): 🐛 Skip very large multipart episodes
2025-10-15 20:57:21 +01:00
tidusjar
fb70aa16de fix(emby): 🐛 Skip very large multipart episodes 2025-10-15 20:55:04 +01:00
Conventional Changelog Action
df428bf0ab chore(release): 🚀 v4.51.5 [skip ci] 2025-10-14 21:54:10 +00:00
Jamie Rees
b030cdbe98
Merge pull request #5281 from Ombi-app/fix-dupes-2
fix(emby): actually fix the dupes
2025-10-14 22:52:17 +01:00
tidusjar
41679427f6 fix(emby): actually fix the dupes 2025-10-14 22:51:58 +01:00
Conventional Changelog Action
bc923b788d chore(release): 🚀 v4.51.4 [skip ci] 2025-10-14 21:38:51 +00:00
Jamie Rees
016b6ed42f
Merge pull request #5280 from Ombi-app/fix-dupes
fix(emby): fixed duplicate episodes
2025-10-14 22:36:58 +01:00
tidusjar
a1d37554bd fix(emby): fixed duplicate episodes 2025-10-14 22:36:12 +01:00
Conventional Changelog Action
758c5d102c chore(release): 🚀 v4.51.3 [skip ci] 2025-10-14 19:37:37 +00:00
Jamie Rees
39f987d207
Merge pull request #5279 from Ombi-app/emby-optimizations
Emby optimizations
2025-10-14 20:35:15 +01:00
tidusjar
03f38401e7 improve batching 2025-10-14 20:34:49 +01:00
tidusjar
e43c1c428f Pull back all the ID's rather than quering per episode 2025-10-14 20:20:35 +01:00
Conventional Changelog Action
3115ccdedc chore(release): 🚀 v4.51.2 [skip ci] 2025-10-10 21:10:22 +00:00
Jamie Rees
e78cb4a650
Merge pull request #5278 from Ombi-app/emby-episode-fix
fix(emby): 🐛 Fixed where we didn't scan episodes for mixed content libs
2025-10-10 22:08:15 +01:00
tidusjar
7b245cbe25 more 2025-10-10 22:05:12 +01:00
tidusjar
b949ea65ba actions read 2025-10-10 22:01:52 +01:00
tidusjar
b81585363f fix(emby): 🐛 Fixed where we didn't scan episodes for mixed content libraries 2025-10-10 21:57:33 +01:00
Conventional Changelog Action
f6691b7c37 chore(release): 🚀 v4.51.1 [skip ci] 2025-10-09 19:08:38 +00:00
contrib-readme-bot
be9cfd928a chore: 👥 Updated Contributors [skip ci] 2025-10-09 19:06:55 +00:00
tidusjar
cb63060c77 fix(user-management): Put back the user filter 2025-10-09 20:06:44 +01:00
Michael Paulauski
a8bd01793f Revert "deterministic refresh (rather than 3 second wait)"
This reverts commit 7f072dc3ee28024e8bf0cd296b35d03566f7f8e1.
2025-10-06 19:24:43 -04:00
Michael Paulauski
10992c78b6 Revert "address sonarqube feedback"
This reverts commit ce5fae83553c96098f90178de29921163de44728.
2025-10-06 19:24:27 -04:00
Michael Paulauski
ce5fae8355 address sonarqube feedback 2025-10-06 19:22:02 -04:00
Michael Paulauski
7f072dc3ee deterministic refresh (rather than 3 second wait) 2025-10-06 18:51:19 -04:00
Michael Paulauski
19e7db241c
Merge branch 'develop' into feature/add-force-recheck-watchlist 2025-10-06 18:49:26 -04:00
Conventional Changelog Action
9166f232c9 chore(release): 🚀 v4.51.0 [skip ci] 2025-10-06 22:01:44 +00:00
Michael Paulauski
c0456b88de
Merge branch 'Ombi-app:develop' into feature/add-force-recheck-watchlist 2025-10-06 17:17:39 -04:00
Jamie Rees
37abfc74db
Merge pull request #5241 from Ombi-app/translations [skip ci]
🌐 Translations Update
2025-10-06 20:59:10 +01:00
tidusjar
19ce14b5a5 [skip ci] fix workflow permissions 2025-10-06 20:53:47 +01:00
Jamie Rees
1883c3ae31
fix(watchlist): Delete bad tokens when user logs in #5246
Bugfix/plex user and watchlist import
2025-10-06 20:52:05 +01:00
Michael Paulauski
4fa17a8f81 feat: allow admins to force Plex watchlist revalidation
Add a backend endpoint and UI control to clear stale watchlist errors
    and retrigger the Plex import job on demand. Update the Angular watchlist
    view to show progress while the recheck runs, and cover the new service
    logic with unit tests to verify we only delete existing errors when
    needed.
2025-10-05 15:47:57 -04:00
Michael Paulauski
0294dba4cc Revert "Update src/Ombi/Controllers/V1/TokenController.cs"
This reverts commit a148a610f74ab353c6e9b4183c7badf5c3c024f6.
2025-10-05 14:45:11 -04:00
Michael Paulauski
a148a610f7
Update src/Ombi/Controllers/V1/TokenController.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-05 14:39:46 -04:00
Michael Paulauski
0d219e4612 feat(TvSender): add logging for missing seasons in Sonarr during monitoring updates 2025-10-05 13:22:03 -04:00
Michael Paulauski
d7ed8e03db refactor(TokenController): reorganize using directives and add watchlist error handling for Plex users 2025-10-05 13:09:37 -04:00
tidusjar
5f9dd8935f fix [skip ci] 2025-10-04 21:43:17 +01:00
Jamie Rees
951aecfa7c
Merge pull request #5268 from Ombi-app/contrib
feat: improve contributor guidance
2025-10-04 21:40:42 +01:00
tidusjar
d045f32b85 feat: improve contributor guidance 2025-10-04 21:36:04 +01:00
Conventional Changelog Action
6135a0b1b2 chore(release): 🚀 v4.50.2 [skip ci] 2025-10-04 20:14:04 +00:00
tidusjar
110bdfb219 tests(watchlist): added additional tests around the Plex Watchlist 2025-10-04 21:11:03 +01:00
tidusjar
d07fade874 refactor(watchlist): 🔊 Added some more logging around the watchlist authentication #5246 2025-10-04 21:08:49 +01:00
Conventional Changelog Action
711f84ce63 chore(release): 🚀 v4.50.1 [skip ci] 2025-09-26 20:07:12 +00:00
contrib-readme-bot
73031071da chore: 👥 Updated Contributors [skip ci] 2025-09-26 20:05:30 +00:00
tidusjar
bf83c95da0 fix(sonarr): 🐛 Ensure we are monitoring shows that already exist in Sonarr #5257 2025-09-26 21:05:13 +01:00
Conventional Changelog Action
a2f4c12c8d chore(release): 🚀 v4.50.0 [skip ci] 2025-09-21 17:37:25 +00:00
contrib-readme-bot
4ad550afed chore: 👥 Updated Contributors [skip ci] 2025-09-21 17:35:41 +00:00
Jamie Rees
ae4f3e4093
Merge pull request #5267 from Ombi-app/angular-migration-standalone 2025-09-21 18:35:30 +01:00
tidusjar
4ba8905f02 removed 2025-09-20 21:12:35 +01:00
tidusjar
561791ef8e remaining changes 2025-09-20 21:01:04 +01:00
tidusjar
85357f32e8 more fixes 2025-09-19 22:47:28 +01:00
tidusjar
4fad0b233c issue fixes 2025-09-19 22:40:30 +01:00
tidusjar
43bb292646 fixes 2025-09-19 22:23:46 +01:00
Conventional Changelog Action
d8ad69b096 chore(release): 🚀 v4.49.10 [skip ci] 2025-09-19 20:38:58 +00:00
Jamie Rees
6a562af60b
fix(plex): Filter the servers on the plex dropdown
filter server plex
2025-09-19 21:37:06 +01:00
Conventional Changelog Action
0c7fad2a91 chore(release): 🚀 v4.49.9 [skip ci] 2025-09-16 20:46:59 +00:00
contrib-readme-bot
0daabe13db chore: 👥 Updated Contributors [skip ci] 2025-09-16 20:45:13 +00:00
Jamie Rees
3d5066c595
fix: Plex OAuth: fix X-Plex-Client-Identifier mismatch causing PIN 1020 error
Plex OAuth: fix X-Plex-Client-Identifier mismatch causing PIN 1020 er…
2025-09-16 21:45:03 +01:00
tidusjar
9c54b0ba3b more refactoring 2025-09-16 21:39:15 +01:00
tidusjar
dffb10b314 migrated the rest but it's all broke 2025-09-15 22:26:31 +01:00
tidusjar
3d367f34de refacotr: migrate settings to standalone 2025-09-15 21:48:29 +01:00
tidusjar
7e2888ab9a settings 2025-09-15 07:32:53 +01:00
tidusjar
129894aa03 app.module done 2025-09-14 21:31:11 +01:00
Michael Paulauski
d42ba7b596
Update src/Ombi.Core/Authentication/PlexOAuthManager.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-14 02:14:42 -04:00
Michael Paulauski
02b9fa05c0
Update src/Ombi.Core/Authentication/PlexOAuthManager.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-14 02:14:31 -04:00
Michael Paulauski
c81ea63b0e Plex OAuth: fix X-Plex-Client-Identifier mismatch causing PIN 1020 errors and failing watchlist import; add sanity logging
Root cause:
- UI created Plex OAuth PIN using PlexSettings.InstallId A, while server polled PIN using a different InstallId B due to settings caching and duplicate InstallId generation in PlexApi.
- Plex treats mismatched client identifiers as a different device, returning NotFound/1020 ("Code not found or expired"). This blocked token refresh and watchlist sync, showing red X for users.

Changes:
- PlexApi: remove InstallId generation and cached settings; always read current PlexSettings and use its InstallId for X-Plex-Client-Identifier and OAuth clientID.
- PlexOAuthManager: inject PlexSettings and add sanity log comparing PIN.clientIdentifier vs server InstallId to flag mismatches.

Impact:
- Ensures UI and server use the same client identifier throughout OAuth, restoring PIN polling and watchlist import.
- Provides actionable logs if configuration drifts.

Tests:
- Added PlexOAuthManagerTests covering GetAccessTokenFromPin with matching and mismatching client identifiers (behavior preserved; logs warn on mismatch).
2025-09-14 02:05:53 -04:00
tidusjar
eacaee4476 standalone 2025-09-13 23:20:24 +01:00
tidusjar
c72a37557b pipes 2025-09-13 23:10:15 +01:00
devildant
d0610741a2 filter server plex 2025-09-14 00:03:05 +02:00
tidusjar
1ac20e84db feat: pipes 2025-09-13 23:01:59 +01:00
Conventional Changelog Action
f78ab52fb0 chore(release): 🚀 v4.49.8 [skip ci] 2025-09-13 21:19:48 +00:00
Jamie Rees
9cff3157e9
Merge pull request #5256 from Ombi-app/backend-refactor
refactor: Backend refactor
2025-09-13 22:16:59 +01:00
tidusjar
38af7b138e refactor: update cypress 2025-09-13 22:16:41 +01:00
tidusjar
1934292891 fixed tests 2025-09-13 22:09:47 +01:00
tidusjar
28a397836e merge 2025-09-11 19:52:01 +01:00
tidusjar
143992f241 Merge branch 'develop' into backend-refactor 2025-09-11 19:52:00 +01:00
Conventional Changelog Action
1031c3803c chore(release): 🚀 v4.49.7 [skip ci] 2025-09-11 18:51:25 +00:00
tidusjar
56a91d6240 fix: Use new server discovery url #5260 2025-09-11 19:48:33 +01:00
tidusjar
e255f0f06b fixes 2025-08-26 22:45:14 +01:00
tidusjar
d151ffcd6e more tests 2025-08-26 22:27:32 +01:00
tidusjar
251269ac6b remove 2025-08-26 21:47:03 +01:00
tidusjar
b6dc8de152 refactor: remove the api assemblies 2025-08-26 21:35:11 +01:00
Conventional Changelog Action
ddea55a2eb chore(release): 🚀 v4.49.6 [skip ci] 2025-08-24 22:04:49 +00:00
Jamie Rees
81de60187c
Merge pull request #5255 from Ombi-app/tests
Tests
2025-08-25 00:01:42 +02:00
tidusjar
07eae25a21 aaaa 2025-08-24 22:51:27 +01:00
tidusjar
167ef231d3 `````` 2025-08-24 22:44:29 +01:00
tidusjar
ca8d998731 try again 2025-08-24 22:35:11 +01:00
tidusjar
610507d1f7 a 2025-08-24 22:28:54 +01:00
tidusjar
71bfbb1d44 again 2025-08-24 22:24:34 +01:00
tidusjar
6d82490ca2 port 2025-08-24 22:18:33 +01:00
tidusjar
2b7eabc3e5 .net 2025-08-24 22:14:08 +01:00
tidusjar
6022b85e3a simple 2025-08-24 22:12:04 +01:00
tidusjar
bfcb0e5e95 lock 2025-08-24 22:04:06 +01:00
tidusjar
bed06745b5 stuff 2025-08-24 22:03:40 +01:00
tidusjar
7b418673c8 fixes 2025-08-24 21:52:47 +01:00
tidusjar
906ee83c6e Merge branch 'angular-20-improvements' into tests 2025-08-23 22:30:30 +01:00
tidusjar
9b49fe0208 improvements 2025-08-23 22:30:19 +01:00
tidusjar
de9cdf2984 tests 2025-08-23 22:30:05 +01:00
Conventional Changelog Action
48c358eff0 chore(release): 🚀 v4.49.5 [skip ci] 2025-08-23 20:55:02 +00:00
Jamie Rees
65b96c3ea9
Merge pull request #5250 from lukeheals/tv-request-marked-as-approved
fix: set MarkedAsApproved on TV requests
2025-08-23 22:53:03 +02:00
tidusjar
e2acd01507 Merge branch 'develop' into angular-20-improvements 2025-08-23 21:50:00 +01:00
Conventional Changelog Action
2a96b40756 chore(release): 🚀 v4.49.4 [skip ci] 2025-08-23 20:46:09 +00:00
tidusjar
4114c2356a tests 2025-08-23 21:44:22 +01:00
contrib-readme-bot
f3964ef94a chore: 👥 Updated Contributors [skip ci] 2025-08-23 20:43:24 +00:00
Jamie Rees
736ff31566
refactor: Upgrade to latest angular version
Angular 20
2025-08-23 22:43:13 +02:00
tidusjar
e8c64b777b optimize 2025-08-23 21:40:42 +01:00
tidusjar
a21032364c Merge branch 'angular-2' into angular-20-improvements 2025-08-23 21:33:40 +01:00
tidusjar
9027401604 others 2025-08-23 21:32:54 +01:00
tidusjar
3d08c4af96 fixed node version 2025-08-23 21:32:33 +01:00
tidusjar
9524608c1f modernise the discover 2025-08-23 21:31:26 +01:00
tidusjar
33e5706afa issues 2025-08-23 21:23:36 +01:00
tidusjar
532ee7e0af update 2025-08-23 21:14:30 +01:00
Conventional Changelog Action
b72f47470c chore(release): 🚀 v4.49.3 [skip ci] 2025-08-17 16:01:24 +00:00
Jamie Rees
72d4115378
Merge pull request #5248 from emma-the-rock/patch-1
fix(plex-api): update Plex Watchlist URL
2025-08-17 17:58:51 +02:00
Luke
57d3880115 fix: set MarkedAsApproved on TV requests 2025-08-16 00:56:36 -04:00
emmatherock
11fd7a5fc8
fix(plex-api): update Plex Watchlist URL 2025-08-14 21:17:10 -03:00
tidusjar
69c556929b Upgrade Angular to v20 and TypeScript to 5.8.3 2025-07-12 22:56:09 +01:00
Conventional Changelog Action
d2be48a921 chore(release): 🚀 v4.49.2 [skip ci] 2025-07-12 21:47:40 +00:00
tidusjar
a92c76021a Merge branch 'develop' of https://github.com/tidusjar/ombi into develop 2025-07-12 22:45:50 +01:00
tidusjar
97d5167db6 perf(discover): Improve the loading performance on the discover page 2025-07-12 22:35:11 +01:00
Conventional Changelog Action
2519cca9f6 chore(release): 🚀 v4.49.1 [skip ci] 2025-07-12 21:27:34 +00:00
tidusjar
cfeee39978 Merge remote-tracking branch 'origin/develop' into develop 2025-07-12 22:25:45 +01:00
tidusjar
cee40146ee fix(auth): Fixed an issue where refreshing the page as a power user would stop the application from loading #5242 2025-07-12 22:25:31 +01:00
Conventional Changelog Action
1eff48e58e chore(release): 🚀 v4.49.0 [skip ci] 2025-07-11 21:51:32 +00:00
tidusjar
3b2a0d84be fix 2025-07-11 22:49:21 +01:00
contrib-readme-bot
ed5bc3f873 chore: 👥 Updated Contributors [skip ci] 2025-07-11 21:20:26 +00:00
tidusjar
067c029f42 feat: Added the ability for the Watchlist to automatically refresh the users token. This will reduce the need for the user to log in 2025-07-11 22:19:10 +01:00
Jamie Rees
102c84edb0 fix(translations): 🌐 New translations from Crowdin [skip ci] 2025-07-06 12:18:21 +01:00
Conventional Changelog Action
cfe2b6ac0f chore(release): 🚀 v4.48.5 [skip ci] 2025-05-14 21:18:32 +00:00
tidusjar
c9ab4f4f9f fix: filter out excluded notification agents from user preferences
The webhook notification field was inconsistently showing up for some users despite being excluded in the backend. This was happening because the frontend was displaying all notification preferences without filtering out the excluded agents.

Changes:
- Added excludedAgents array to match backend's excluded notification types
- Filter notification preferences in both edit and create user flows
- Prevents webhook, email, and mobile notification fields from appearing in user preferences

This change aligns the frontend behavior with the backend's intended design where webhook notifications are managed globally rather than per-user.

Fixes #5196
2025-05-14 22:16:34 +01:00
794 changed files with 15129 additions and 8364 deletions

View File

@ -1,11 +1,14 @@
blank_issues_enabled: false
contact_links:
- name: Docs
- name: 📚 Documentation
url: https://docs.ombi.app/
about: The Ombi documentation should help guide you through installation and setup as well as help resolve common problems and answer frequently asked questions
- name: Discord support
- name: 💬 Discord Community
url: https://discord.gg/Sa7wNWb
about: Ask questions about Ombi
- name: Feature suggestions
about: Ask questions about Ombi, get help with contributions, or chat with other users
- name: ✨ Feature Suggestions
url: https://ombifeatures.featureupvote.com
about: Share your suggestions or ideas to make Ombi better!
- name: 🤝 Contributing Guide
url: https://github.com/ombi-app/Ombi/blob/develop/CONTRIBUTING.md
about: Learn how to contribute to Ombi development

View File

@ -0,0 +1,66 @@
name: "🤝 Contribution Help"
description: 'Get help with contributing to Ombi'
body:
- type: markdown
attributes:
value: |
This template is for contributors who need help with the contribution process, development setup, or have questions about the codebase.
- type: dropdown
attributes:
label: Type of Help Needed
options:
- Development setup issues
- Understanding the codebase
- Testing guidance
- Code review feedback
- Git/GitHub workflow help
- Other
validations:
required: true
- type: textarea
attributes:
label: Question or Issue
description: Describe what you need help with in detail.
placeholder: "I'm trying to..."
validations:
required: true
- type: textarea
attributes:
label: What I've Tried
description: Describe what you've already tried or researched.
placeholder: "I've already tried..."
- type: textarea
attributes:
label: Error Messages
description: If you're encountering errors, please paste them here.
render: shell
- type: input
attributes:
label: Ombi Version
description: What version of Ombi are you working with?
placeholder: "e.g., develop branch, v4.40.0"
- type: dropdown
attributes:
label: Development Environment
options:
- Windows
- macOS
- Linux
- Docker
validations:
required: true
- type: checkboxes
attributes:
label: Checklist
options:
- label: I have read the [Contributing Guide](CONTRIBUTING.md)
- label: I have searched existing issues for similar questions
- label: I have checked the [Discord community](https://discord.gg/Sa7wNWb) for help
- label: I have reviewed the [documentation](https://docs.ombi.app/)

View File

@ -0,0 +1,66 @@
name: "🚀 Contributor Onboarding"
description: 'Checklist for new contributors to get started'
body:
- type: markdown
attributes:
value: |
Welcome to the Ombi contributor community! This checklist will help you get started with contributing to the project.
- type: checkboxes
attributes:
label: "📋 Pre-Contribution Checklist"
options:
- label: I have read and understood the [Code of Conduct](CODE_OF_CONDUCT.md)
- label: I have read the [Contributing Guide](CONTRIBUTING.md)
- label: I have set up my development environment
- label: I have successfully built and run Ombi locally
- label: I have run the test suite and all tests pass
- label: I have joined the [Discord community](https://discord.gg/Sa7wNWb)
- label: I have reviewed the [project documentation](https://docs.ombi.app/)
- type: checkboxes
attributes:
label: "🎯 Contribution Goals"
options:
- label: I want to fix bugs
- label: I want to add new features
- label: I want to improve documentation
- label: I want to help with testing
- label: I want to help with code review
- label: I want to help with community support
- type: dropdown
attributes:
label: Experience Level
options:
- Complete beginner
- Some programming experience
- Experienced developer
- Expert in .NET/Angular
validations:
required: true
- type: textarea
attributes:
label: Areas of Interest
description: What parts of Ombi are you most interested in working on?
placeholder: "e.g., UI/UX, backend APIs, database, integrations, etc."
- type: textarea
attributes:
label: Questions or Concerns
description: Any questions about the contribution process or concerns you'd like to address?
placeholder: "I'm not sure about..."
- type: markdown
attributes:
value: |
## 🎉 Next Steps
Once you've completed this checklist:
1. Look for issues labeled "good first issue" or "help wanted"
2. Start with small contributions to get familiar with the codebase
3. Don't hesitate to ask questions in Discord or create a "Contribution Help" issue
4. Remember: every contribution, no matter how small, is valuable!
**Welcome to the team! 🎉**

View File

@ -0,0 +1,55 @@
name: "✨ Feature Request"
description: 'Suggest a new feature for Ombi'
body:
- type: markdown
attributes:
value: |
**Note:** Feature requests are primarily handled on [Feature Upvote](https://features.ombi.io).
Please check if your feature has already been requested there before creating a GitHub issue.
If you're proposing a significant feature or architectural change, please use this template to discuss it with the maintainers first.
- type: textarea
attributes:
label: Feature Summary
description: A clear and concise description of the feature you'd like to see implemented.
placeholder: "I would like Ombi to..."
validations:
required: true
- type: textarea
attributes:
label: Problem Description
description: What problem does this feature solve? What is the current limitation?
placeholder: "Currently, users have to..."
validations:
required: true
- type: textarea
attributes:
label: Proposed Solution
description: Describe your proposed solution in detail.
placeholder: "I propose that Ombi should..."
validations:
required: true
- type: textarea
attributes:
label: Alternative Solutions
description: Describe any alternative solutions or workarounds you've considered.
placeholder: "Alternative approaches could include..."
- type: checkboxes
attributes:
label: Additional Context
options:
- label: I have searched existing issues and this hasn't been requested before
- label: I have checked Feature Upvote and this hasn't been requested there
- label: I am willing to contribute to the implementation of this feature
- label: This feature would benefit a significant number of users
- type: textarea
attributes:
label: Additional Context
description: Add any other context, mockups, or screenshots about the feature request here.
render: markdown

45
.github/pull_request_template.md vendored Normal file
View File

@ -0,0 +1,45 @@
## 📝 Description
<!-- Provide a brief description of the changes in this PR -->
## 🔗 Related Issues
<!-- Link to related issues using "Fixes #123" or "Closes #123" -->
## 🧪 Testing
<!-- Describe the tests you ran to verify your changes -->
- [ ] Unit tests pass
- [ ] Integration tests pass
- [ ] Manual testing completed
- [ ] No breaking changes
## 📸 Screenshots (if applicable)
<!-- Add screenshots for UI changes -->
## 📋 Checklist
- [ ] My code follows the project's coding standards
- [ ] I have mentioned if this is a vibe coded PR
- [ ] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published
## 🎯 Type of Change
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring
## 📚 Additional Notes
<!-- Any additional information that reviewers should know -->

View File

@ -19,10 +19,10 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
dotnet-version: 8.0.x
- uses: actions/setup-node@v2
with:
node-version: '18'
node-version: '20'
- uses: actions/cache@v4
with:
@ -34,14 +34,22 @@ jobs:
- name: Install Frontend Deps
run: yarn --cwd ./src/Ombi/ClientApp install
- name: Build Frontend
run: yarn --cwd ./src/Ombi/ClientApp build
- name: Install Test Dependencies
run: yarn --cwd ./tests install
- name: Build Docker Image
run: docker build -t ombi src/
- name: Start Frontend
run: |
nohup yarn --cwd ./src/Ombi/ClientApp start &
- name: Run Docker Image
run: nohup docker run --rm -p 5000:5000 ombi &
- name: Restore .NET Dependencies
run: dotnet restore ./src/Ombi/Ombi.csproj
- name: Build .NET Project
run: dotnet build ./src/Ombi/Ombi.csproj --no-restore
- name: Start Backend
run: |
nohup dotnet run --project ./src/Ombi -- --host http://*:3577 &
- name: Run Wiremock
run: nohup docker run --rm -p 32400:8080 --name wiremock wiremock/wiremock:2.35.0 &
@ -49,17 +57,6 @@ jobs:
- name: Sleep for server to start
run: sleep 20
# - name: Start Frontend
# run: |
# nohup yarn --cwd ./src/Ombi/ClientApp start &
# - name: Install Automation Deps
# run: yarn --cwd ./tests install
# - name: Start Backend
# run: |
# nohup dotnet run --project ./src/Ombi -- --host http://*:3577 &
- name: Cypress Tests
uses: cypress-io/github-action@v4
with:
@ -67,15 +64,15 @@ jobs:
browser: chrome
headless: true
working-directory: tests
wait-on: http://localhost:5000/
wait-on: http://localhost:3577/
# 10 minutes
wait-on-timeout: 600
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Stop Docker
- name: Stop Services
if: always()
run: |
docker ps -q | xargs -I {} docker logs {}
docker container kill $(docker ps -q)
pkill -f "dotnet.*Ombi" || true
docker container kill wiremock || true

View File

@ -12,7 +12,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '18'
node-version: '20'
- name: NodeModules Cache
uses: actions/cache@v4

View File

@ -0,0 +1,102 @@
name: Contributor Recognition
on:
pull_request:
types: [closed]
workflow_dispatch:
jobs:
recognize-contributors:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
- name: Get contributor info
id: contributor
uses: actions/github-script@v7
with:
script: |
const pr = context.payload.pull_request;
const author = pr.user.login;
const isFirstTime = pr.author_association === 'FIRST_TIME_CONTRIBUTOR';
return {
author,
isFirstTime,
prNumber: pr.number,
prTitle: pr.title,
prUrl: pr.html_url
};
- name: Comment on merged PR
uses: actions/github-script@v7
with:
script: |
const contributor = ${{ toJson(steps.contributor.outputs) }};
const isFirstTime = contributor.isFirstTime === 'true';
let message = `🎉 **Thank you for your contribution!**\n\n`;
if (isFirstTime) {
message += `🎊 **Congratulations on your first merged PR!** Welcome to the Ombi contributor community!\n\n`;
}
message += `Your changes have been successfully merged and will be included in the next release.\n\n`;
message += `**What you contributed:**\n`;
message += `- ${contributor.prTitle}\n`;
message += `- [PR #${contributor.prNumber}](${contributor.prUrl})\n\n`;
if (isFirstTime) {
message += `**Next steps:**\n`;
message += `- Join our [Discord community](https://discord.gg/Sa7wNWb) to connect with other contributors\n`;
message += `- Check out more [good first issues](https://github.com/ombi-app/Ombi/labels/good%20first%20issue) if you'd like to contribute more\n`;
message += `- Your contribution will be automatically added to our contributors list in the README\n\n`;
}
message += `Thank you for helping make Ombi better! 🙏`;
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: message
});
- name: Add contributor badge
if: steps.contributor.outputs.isFirstTime == 'true'
uses: actions/github-script@v7
with:
script: |
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: ['first-contribution']
});
# Weekly contributor summary
weekly-summary:
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch'
steps:
- name: Get recent contributors
uses: actions/github-script@v7
with:
script: |
const { data: prs } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'closed',
sort: 'updated',
direction: 'desc',
per_page: 50
});
const recentMergedPRs = prs.filter(pr =>
pr.merged_at &&
new Date(pr.merged_at) > new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)
);
const contributors = [...new Set(recentMergedPRs.map(pr => pr.user.login))];
console.log(`Recent contributors (last 7 days): ${contributors.join(', ')}`);
console.log(`Total merged PRs: ${recentMergedPRs.length}`);

View File

@ -0,0 +1,73 @@
name: First Time Contributor Welcome
on:
pull_request:
types: [opened]
branches: [develop]
jobs:
welcome:
runs-on: ubuntu-latest
if: github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
steps:
- name: Welcome first-time contributor
uses: actions/github-script@v7
with:
script: |
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
// Check if welcome comment already exists
const hasWelcomeComment = comments.some(comment =>
comment.user.type === 'Bot' &&
comment.body.includes('🎉 Welcome to Ombi!')
);
if (!hasWelcomeComment) {
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `🎉 **Welcome to Ombi!**
Thank you for your first contribution! We're excited to have you join our community.
## 📚 Helpful Resources
- [Contributing Guide](CONTRIBUTING.md) - Everything you need to know about contributing
- [Discord Community](https://discord.gg/Sa7wNWb) - Get help and chat with other contributors
- [Documentation](https://docs.ombi.app/) - Comprehensive project documentation
## 🚀 What Happens Next
1. Our automated checks will run to validate your changes
2. A maintainer will review your PR
3. We'll provide feedback and guidance if needed
4. Once approved, your contribution will be merged!
## 💡 Tips for Success
- Keep your PR focused and small
- Include tests for new functionality
- Update documentation if needed
- Be patient - we'll review as soon as possible
Thanks again for contributing to Ombi! 🙏`
});
}
# Add helpful labels for first-time contributors
add-labels:
runs-on: ubuntu-latest
if: github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
steps:
- name: Add first-time contributor label
uses: actions/github-script@v7
with:
script: |
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: ['first-time-contributor', 'needs-review']
});

View File

@ -6,26 +6,32 @@ on:
workflow_dispatch:
permissions:
statuses: write
checks: write
contents: write
pull-requests: write
issues: write
repository-projects: write
actions: write
jobs:
build-ui:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '18'
- name: Checkout code
uses: actions/checkout@v4
- name: NodeModules Cache
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Cache node modules
uses: actions/cache@v4
with:
path: '**/node_modules'
key: node_modules-${{ hashFiles('**/yarn.lock') }}
- name: UI Install
- name: Install UI dependencies
run: yarn --cwd ./src/Ombi/ClientApp install
- name: Build UI
@ -40,7 +46,7 @@ jobs:
with:
dotnet-version: '8.0.x'
- name: Nuget Cache
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
@ -48,59 +54,48 @@ jobs:
restore-keys: |
${{ runner.os }}-nuget
- name: Run Unit Tests
- name: Run unit tests
run: |
cd src
dotnet test --configuration "Release" --logger "trx;LogFileName=test-results.trx"
dotnet test --configuration "Release" --logger "trx;LogFileName=test-results.trx" --results-directory "TestResults"
analysis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
# Disabling shallow clone is recommended for improving relevancy of reporting
fetch-depth: 0
- name: SonarCloud Scan
uses: sonarsource/sonarcloud-github-action@master
with:
args: >
-Dsonar.organization=ombi-app
-Dsonar.projectKey=Ombi-app_Ombi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- name: Publish test results
uses: dorny/test-reporter@v1
if: always()
with:
name: Unit Test Results
path: '**/test-results.trx'
reporter: dotnet-trx
publish:
# Build and test backend for multiple platforms
build-backend:
runs-on: ubuntu-latest
needs: [ unit-test ]
needs: [unit-test]
strategy:
matrix:
include:
- os: win-x64
format: zip
compression: zip
- os: win-x86
format: zip
compression: zip
- os: linux-x64
format: tar.gz
compression: tar
- os: linux-arm
format: tar.gz
compression: tar
- os: linux-arm64
compression: tar
format: tar.gz
- os: osx-x64
compression: tar
format: tar.gz
steps:
- uses: actions/checkout@v2
- uses: actions/setup-dotnet@v1
- name: Checkout code
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Nuget Cache
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
@ -108,9 +103,52 @@ jobs:
restore-keys: |
${{ runner.os }}-nuget
- name: Publish Backend ${{ matrix.os }}
- name: Build backend for ${{ matrix.os }}
run: dotnet publish -c Release -r ${{ matrix.os }} -o "${{ matrix.os }}" --self-contained true -p:PublishSingleFile=true
working-directory: src/Ombi
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: backend-${{ matrix.os }}-${{ github.sha }}
path: ./${{ matrix.os }}
retention-days: 1
# PR status check
pr-status:
runs-on: ubuntu-latest
needs: [build-ui, unit-test, build-backend]
if: always()
steps:
- name: Check all jobs status
run: |
if [[ "${{ needs.build-ui.result }}" == "failure" || "${{ needs.unit-test.result }}" == "failure" || "${{ needs.build-backend.result }}" == "failure" ]]; then
echo "❌ Some checks failed"
exit 1
else
echo "✅ All checks passed"
fi
# Comment on PR with build status
pr-comment:
runs-on: ubuntu-latest
needs: [pr-status]
if: always() && github.event_name == 'pull_request'
steps:
- name: Comment PR
uses: actions/github-script@v7
with:
script: |
const status = '${{ needs.pr-status.result }}';
const emoji = status === 'success' ? '✅' : '❌';
const message = status === 'success'
? 'All checks passed! Your PR is ready for review.'
: 'Some checks failed. Please review the logs and fix any issues.';
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `${emoji} **PR Build Status**\n\n${message}\n\n[View workflow run](${context.payload.pull_request.html_url}/checks)`
});

2
.gitignore vendored
View File

@ -253,3 +253,5 @@ _Pvt_Extensions
/src/Ombi/ClientApp/package-lock.json
/src/Ombi.Core/Properties/launchSettings.json
.yarn
.DS_Store

File diff suppressed because it is too large Load Diff

167
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,167 @@
# Contributing to Ombi
Thank you for your interest in contributing to Ombi! This document provides guidelines and information for contributors.
## 🚀 Getting Started
### Prerequisites
- [.NET 8.0 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
- [Node.js 20+](https://nodejs.org/)
- [Yarn](https://yarnpkg.com/)
- [Git](https://git-scm.com/)
### Development Setup
1. **Fork and clone the repository**
```bash
git clone https://github.com/YOUR_USERNAME/Ombi.git
cd Ombi
```
2. **Install dependencies**
```bash
# Install backend dependencies
dotnet restore
# Install frontend dependencies
yarn --cwd ./src/Ombi/ClientApp install
```
3. **Run the application**
```bash
# Start the backend
dotnet run --project src/Ombi
# In another terminal, start the frontend
yarn --cwd ./src/Ombi/ClientApp start
```
4. **Run tests**
```bash
dotnet test
```
## 📝 How to Contribute
### Reporting Issues
- Use the [bug report template](.github/ISSUE_TEMPLATE/bug_report.yml)
- Search existing issues before creating new ones
- Provide clear reproduction steps and logs
### Suggesting Features
- Feature requests are handled on [Feature Upvote](https://features.ombi.io)
- Search existing requests before creating new ones
- Vote on existing requests if similar to your idea
### Code Contributions
1. **Create a feature branch**
```bash
git checkout -b feature/your-feature-name
```
2. **Make your changes**
- Follow the coding standards (see below)
- Write tests for new functionality
- Update documentation if needed
3. **Test your changes**
```bash
# Run all tests
dotnet test
yarn --cwd ./src/Ombi/ClientApp test
# Run linting
yarn --cwd ./src/Ombi/ClientApp lint
```
4. **Commit your changes**
```bash
git add .
git commit -m "feat: add your feature description"
```
5. **Push and create a Pull Request**
```bash
git push origin feature/your-feature-name
```
## 🎯 Coding Standards
### Backend (.NET)
- Follow C# naming conventions
- Use meaningful variable and method names
- Add XML documentation for public APIs
- Write unit tests for new functionality
- Use `async/await` for I/O operations
### Frontend (Angular)
- Follow Angular best practices
- Use standalone components
- Prefer signals over observables for state management
- Use `OnPush` change detection strategy
- Write component tests
### General
- Keep functions small and focused
- Use meaningful commit messages
- Follow the existing code style
- Add comments for complex logic
## 🧪 Testing
### Running Tests
```bash
# Backend unit tests
dotnet test
# Frontend unit tests
yarn --cwd ./src/Ombi/ClientApp test
# E2E tests
yarn --cwd ./tests cypress:run
```
### Test Requirements
- New features must include tests
- Bug fixes should include regression tests
- Aim for good test coverage
- Tests should be fast and reliable
## 📋 Pull Request Process
1. **Before submitting**
- Ensure all tests pass
- Update documentation if needed
- Rebase on latest develop branch
- Squash commits if necessary
2. **PR Requirements**
- Clear description of changes
- Reference related issues
- Include screenshots for UI changes
- Ensure CI passes
3. **Review Process**
- Maintainers will review your PR
- Address feedback promptly
- Be open to suggestions
- Keep PRs focused and small
## ❓ Getting Help
- [Discord Community](https://discord.gg/Sa7wNWb)
- [Documentation](https://docs.ombi.app/)
- [FAQ](https://docs.ombi.app/info/faq/)
## 📜 Code of Conduct
Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md).
## 🙏 Recognition
Contributors are automatically recognized in our README. Thank you for contributing!
---
**Happy coding! 🎉**

215
README.md
View File

@ -122,10 +122,10 @@ Here are some of the features Ombi has:
</a>
</td>
<td align="center">
<a href="https://github.com/MattJeanes">
<img src="https://avatars.githubusercontent.com/u/2363642?v=4" width="50;" alt="MattJeanes"/>
<a href="https://github.com/AmyJeanes">
<img src="https://avatars.githubusercontent.com/u/2363642?v=4" width="50;" alt="AmyJeanes"/>
<br />
<sub><b>Matt Jeanes</b></sub>
<sub><b>Amy Jeanes</b></sub>
</a>
</td>
<td align="center">
@ -157,6 +157,13 @@ Here are some of the features Ombi has:
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/mike10010100">
<img src="https://avatars.githubusercontent.com/u/3506604?v=4" width="50;" alt="mike10010100"/>
<br />
<sub><b>Michael Paulauski</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/louis-lau">
<img src="https://avatars.githubusercontent.com/u/1346804?v=4" width="50;" alt="louis-lau"/>
@ -191,6 +198,14 @@ Here are some of the features Ombi has:
<br />
<sub><b>Jim MacKenize</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/GodKratos">
<img src="https://avatars.githubusercontent.com/u/692616?v=4" width="50;" alt="GodKratos"/>
<br />
<sub><b>GodKratos</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Unimatrix0">
@ -198,14 +213,6 @@ Here are some of the features Ombi has:
<br />
<sub><b>Avi</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/kitzin">
<img src="https://avatars.githubusercontent.com/u/3277321?v=4" width="50;" alt="kitzin"/>
<br />
<sub><b>Emil Kitti</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/grimsan55">
@ -215,10 +222,10 @@ Here are some of the features Ombi has:
</a>
</td>
<td align="center">
<a href="https://github.com/gtbuchanan">
<img src="https://avatars.githubusercontent.com/u/715687?v=4" width="50;" alt="gtbuchanan"/>
<a href="https://github.com/kitzin">
<img src="https://avatars.githubusercontent.com/u/3277321?v=4" width="50;" alt="kitzin"/>
<br />
<sub><b>Taylor Buchanan</b></sub>
<sub><b>Emil Kitti</b></sub>
</a>
</td>
<td align="center">
@ -228,6 +235,14 @@ Here are some of the features Ombi has:
<sub><b>Shannon Barrett</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/gtbuchanan">
<img src="https://avatars.githubusercontent.com/u/715687?v=4" width="50;" alt="gtbuchanan"/>
<br />
<sub><b>Taylor Buchanan</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/fservida">
<img src="https://avatars.githubusercontent.com/u/501958?v=4" width="50;" alt="fservida"/>
@ -241,8 +256,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Patrick Collins</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/xweskingx">
<img src="https://avatars.githubusercontent.com/u/6268446?v=4" width="50;" alt="xweskingx"/>
@ -270,7 +284,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Ombi-bot</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/mhann">
<img src="https://avatars.githubusercontent.com/u/17162399?v=4" width="50;" alt="mhann"/>
@ -284,8 +299,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Dr3amer</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/aptalca">
<img src="https://avatars.githubusercontent.com/u/541623?v=4" width="50;" alt="aptalca"/>
@ -313,7 +327,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Chris Pritchard</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/vsc55">
<img src="https://avatars.githubusercontent.com/u/13438676?v=4" width="50;" alt="vsc55"/>
@ -327,8 +342,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Sorano</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/Vbgf">
<img src="https://avatars.githubusercontent.com/u/5571734?v=4" width="50;" alt="Vbgf"/>
@ -356,7 +370,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Jeffrey Peters</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/jackodsteel">
<img src="https://avatars.githubusercontent.com/u/9209504?v=4" width="50;" alt="jackodsteel"/>
@ -370,8 +385,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Guillaume Taquet Gasperini</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/Fredrik81">
<img src="https://avatars.githubusercontent.com/u/21292774?v=4" width="50;" alt="Fredrik81"/>
@ -399,7 +413,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Austin Jackson</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/andrewjmetzger">
<img src="https://avatars.githubusercontent.com/u/590246?v=4" width="50;" alt="andrewjmetzger"/>
@ -407,14 +422,27 @@ Here are some of the features Ombi has:
<sub><b>Andrew Metzger</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/zobe123">
<img src="https://avatars.githubusercontent.com/u/13840542?v=4" width="50;" alt="zobe123"/>
<br />
<sub><b>Zobe123</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Torkiliuz">
<img src="https://avatars.githubusercontent.com/u/460764?v=4" width="50;" alt="Torkiliuz"/>
<br />
<sub><b>Torkil</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/tombomb">
<img src="https://avatars.githubusercontent.com/u/544509?v=4" width="50;" alt="tombomb"/>
<br />
<sub><b>Tom McClellan</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/Tim-Trott">
<img src="https://avatars.githubusercontent.com/u/8249434?v=4" width="50;" alt="Tim-Trott"/>
@ -428,7 +456,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Thomas Van Tilburg</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/Teifun2">
<img src="https://avatars.githubusercontent.com/u/7461832?v=4" width="50;" alt="Teifun2"/>
@ -456,8 +485,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Samuel Bartík</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/rob1998">
<img src="https://avatars.githubusercontent.com/u/1560707?v=4" width="50;" alt="rob1998"/>
@ -471,7 +499,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Qiming Chen</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/beast3334">
<img src="https://avatars.githubusercontent.com/u/20631046?v=4" width="50;" alt="beast3334"/>
@ -499,8 +528,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Maxence Lecanu</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/mattmattmatt">
<img src="https://avatars.githubusercontent.com/u/927830?v=4" width="50;" alt="mattmattmatt"/>
@ -514,26 +542,13 @@ Here are some of the features Ombi has:
<br />
<sub><b>Marley</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/devbymadde">
<img src="https://avatars.githubusercontent.com/u/6094593?v=4" width="50;" alt="devbymadde"/>
<a href="https://github.com/onedr0p">
<img src="https://avatars.githubusercontent.com/u/213795?v=4" width="50;" alt="onedr0p"/>
<br />
<sub><b>Madeleine Schönemann</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Lucane">
<img src="https://avatars.githubusercontent.com/u/7999446?v=4" width="50;" alt="Lucane"/>
<br />
<sub><b>Lucane</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/zobe123">
<img src="https://avatars.githubusercontent.com/u/13840542?v=4" width="50;" alt="zobe123"/>
<br />
<sub><b>Zobe123</b></sub>
<sub><b>Devin Buhl</b></sub>
</a>
</td>
<td align="center">
@ -542,8 +557,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Mike</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/tdorsey">
<img src="https://avatars.githubusercontent.com/u/1218404?v=4" width="50;" alt="tdorsey"/>
@ -571,7 +585,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Mkgeeky</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/masterhuck">
<img src="https://avatars.githubusercontent.com/u/4671442?v=4" width="50;" alt="masterhuck"/>
@ -585,8 +600,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Maartenheebink</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/m4tta">
<img src="https://avatars.githubusercontent.com/u/427218?v=4" width="50;" alt="m4tta"/>
@ -594,6 +608,13 @@ Here are some of the features Ombi has:
<sub><b>M4tta</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/emma-the-rock">
<img src="https://avatars.githubusercontent.com/u/16837067?v=4" width="50;" alt="emma-the-rock"/>
<br />
<sub><b>Emmatherock</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/echel0n">
<img src="https://avatars.githubusercontent.com/u/1128022?v=4" width="50;" alt="echel0n"/>
@ -607,7 +628,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Dorian ALKOUM</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/distaula">
<img src="https://avatars.githubusercontent.com/u/33949?v=4" width="50;" alt="distaula"/>
@ -615,6 +637,13 @@ Here are some of the features Ombi has:
<sub><b>Michael DiStaula</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/devildant">
<img src="https://avatars.githubusercontent.com/u/8700106?v=4" width="50;" alt="devildant"/>
<br />
<sub><b>Devildant</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/camjac251">
<img src="https://avatars.githubusercontent.com/u/6313132?v=4" width="50;" alt="camjac251"/>
@ -628,8 +657,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Blake Drumm</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/bazhip">
<img src="https://avatars.githubusercontent.com/u/10350445?v=4" width="50;" alt="bazhip"/>
@ -643,7 +671,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Xirg</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/bybeet">
<img src="https://avatars.githubusercontent.com/u/1662279?v=4" width="50;" alt="bybeet"/>
@ -651,28 +680,6 @@ Here are some of the features Ombi has:
<sub><b>Travis Bybee</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Torkiliuz">
<img src="https://avatars.githubusercontent.com/u/460764?v=4" width="50;" alt="Torkiliuz"/>
<br />
<sub><b>Torkil</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/sussycatgirl">
<img src="https://avatars.githubusercontent.com/u/26145882?v=4" width="50;" alt="sussycatgirl"/>
<br />
<sub><b>Lea</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/onedr0p">
<img src="https://avatars.githubusercontent.com/u/213795?v=4" width="50;" alt="onedr0p"/>
<br />
<sub><b>Devin Buhl</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/davidtorosyan">
<img src="https://avatars.githubusercontent.com/u/46736285?v=4" width="50;" alt="davidtorosyan"/>
@ -707,15 +714,22 @@ Here are some of the features Ombi has:
<br />
<sub><b>Codehhh</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/cdemi">
<img src="https://avatars.githubusercontent.com/u/8025435?v=4" width="50;" alt="cdemi"/>
<br />
<sub><b>Christopher Demicoli</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/Crosenhain">
<img src="https://avatars.githubusercontent.com/u/1342284?v=4" width="50;" alt="Crosenhain"/>
<br />
<sub><b>Chris</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/origamirobot">
<img src="https://avatars.githubusercontent.com/u/1346803?v=4" width="50;" alt="origamirobot"/>
@ -743,7 +757,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Ashyni</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/Antonin-Bruzard">
<img src="https://avatars.githubusercontent.com/u/82907030?v=4" width="50;" alt="Antonin-Bruzard"/>
@ -757,8 +772,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Aljosa Asanovic</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/AlexandrePicavet">
<img src="https://avatars.githubusercontent.com/u/25816980?v=4" width="50;" alt="AlexandrePicavet"/>
@ -786,6 +800,14 @@ Here are some of the features Ombi has:
<br />
<sub><b>Abe Kline</b></sub>
</a>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/Lucane">
<img src="https://avatars.githubusercontent.com/u/7999446?v=4" width="50;" alt="Lucane"/>
<br />
<sub><b>Lucane</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/kmlucy">
@ -800,8 +822,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Kris Klosterman</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/jonocairns">
<img src="https://avatars.githubusercontent.com/u/182836?v=4" width="50;" alt="jonocairns"/>
@ -822,7 +843,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Joel Samson</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/errorhandler">
<img src="https://avatars.githubusercontent.com/u/17112958?v=4" width="50;" alt="errorhandler"/>
@ -843,8 +865,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>James White</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/JPyke3">
<img src="https://avatars.githubusercontent.com/u/13283054?v=4" width="50;" alt="JPyke3"/>
@ -865,7 +886,8 @@ Here are some of the features Ombi has:
<br />
<sub><b>Igor Borges</b></sub>
</a>
</td>
</td></tr>
<tr>
<td align="center">
<a href="https://github.com/hariesramdhani">
<img src="https://avatars.githubusercontent.com/u/24251244?v=4" width="50;" alt="hariesramdhani"/>
@ -886,8 +908,7 @@ Here are some of the features Ombi has:
<br />
<sub><b>Grygon</b></sub>
</a>
</td></tr>
<tr>
</td>
<td align="center">
<a href="https://github.com/Fish2">
<img src="https://avatars.githubusercontent.com/u/2311734?v=4" width="50;" alt="Fish2"/>

View File

@ -0,0 +1,376 @@
# Angular Standalone Components Migration Progress
## Overview
This document tracks the progress of migrating the Ombi Angular application from NgModules to standalone components, which is a prerequisite for implementing Vite as the build system.
## Migration Strategy
We're using a **bottom-up approach** to minimize breaking changes and ensure stability:
1. **Phase 1**: Convert Pipes to Standalone ✅
2. **Phase 2**: Convert Shared Components to Standalone ✅
3. **Phase 3**: Convert Feature Modules to Standalone ✅
4. **Phase 4**: Convert Main App Module to Standalone ✅
5. **Phase 5**: Update Routing to Use Standalone Components ⏳
6. **Phase 6**: Test and Validate Migration ✅
---
## Phase 1: Pipes Migration ✅ COMPLETED
### Status: ✅ COMPLETED
**Date Completed**: 2025-01-13
**Duration**: ~30 minutes
**Components Converted**: 7 pipes
### Components Converted
| Component | Status | Dependencies | Notes |
|-----------|--------|--------------|-------|
| `HumanizePipe` | ✅ | None | Converts camelCase to readable text |
| `ThousandShortPipe` | ✅ | None | Formats numbers with K/M/G suffixes |
| `SafePipe` | ✅ | DomSanitizer | Sanitizes URLs for safe display |
| `QualityPipe` | ✅ | None | Formats video quality strings |
| `TranslateStatusPipe` | ✅ | TranslateService | Translates status values |
| `OrderPipe` | ✅ | lodash | Sorts arrays using lodash |
| `OmbiDatePipe` | ✅ | FormatPipe, date-fns | Formats dates using date-fns |
### Technical Changes
- Changed `standalone: false` to `standalone: true` in all pipe decorators
- Updated `PipeModule` to import standalone pipes instead of declaring them
- Created barrel file (`standalone-pipes.ts`) for easy imports
- Maintained backward compatibility
### Build Results
- **Status**: ✅ Successful
- **Build Time**: ~5.4 seconds
- **Bundle Size**: No significant change
- **Linting Errors**: 0
---
## Phase 2: Shared Components Migration ✅ COMPLETED
### Status: ✅ COMPLETED
**Date Completed**: 2025-01-13
**Duration**: ~45 minutes
**Components Converted**: 7 shared components
### Components Converted
| Component | Status | Dependencies | Complexity |
|-----------|--------|--------------|------------|
| `IssuesReportComponent` | ✅ | FormsModule, SidebarModule | Simple |
| `EpisodeRequestComponent` | ✅ | Material Dialog, Checkbox, Expansion, Tooltip, Translate, OmbiDatePipe | Medium |
| `AdminRequestDialogComponent` | ✅ | ReactiveForms, Material Autocomplete, Button, Dialog, FormField, Input, Select, Translate | Complex |
| `AdvancedSearchDialogComponent` | ✅ | ReactiveForms, Material components, Translate, 3 child components | Complex |
| `KeywordSearchComponent` | ✅ | ReactiveForms, Material Autocomplete, Chips, FormField, Icon, Input, Translate | Medium |
| `GenreSelectComponent` | ✅ | ReactiveForms, Material Autocomplete, Chips, FormField, Icon, Input, Translate | Medium |
| `WatchProvidersSelectComponent` | ✅ | ReactiveForms, Material Autocomplete, Chips, FormField, Icon, Input, Translate | Medium |
### Technical Changes
- Converted all components to `standalone: true`
- Added comprehensive `imports` arrays with all required dependencies
- Updated `SharedModule` to import standalone components instead of declaring them
- Created barrel file (`standalone-components.ts`) for easy imports
- Maintained all existing functionality and dependencies
### Build Results
- **Status**: ✅ Successful
- **Build Time**: ~4.2 seconds (improved after cache clear)
- **Bundle Size**: +70KB (due to additional imports)
- **Linting Errors**: 0 (only false positive warnings)
### Issues Resolved
- **DetailsGroupComponent Error**: Fixed by removing incorrect import from SharedModule
- **Build Cache Issue**: Resolved by clearing dist/ directory
- **ngIf Directive Error**: Fixed by adding CommonModule to AdvancedSearchDialogComponent imports
- **Async Pipe Error**: Fixed by adding CommonModule to GenreSelectComponent imports
- **Missing CommonModule**: Fixed by adding CommonModule to all shared components (KeywordSearchComponent, EpisodeRequestComponent, AdminRequestDialogComponent, IssuesReportComponent, WatchProvidersSelectComponent)
---
## Control Flow Migration 🔄 PENDING
### Overview
Modern Angular applications should use the new control flow syntax (`@if`, `@for`, `@switch`) instead of the old structural directives (`*ngIf`, `*ngFor`, `*ngSwitch`). This provides better performance and developer experience.
### Migration Strategy
1. **Phase 1**: Convert shared component templates to use control flow syntax
2. **Phase 2**: Convert feature module component templates
3. **Phase 3**: Convert main app component templates
4. **Phase 4**: Remove CommonModule imports where no longer needed
### Control Flow Syntax Examples
```html
<!-- Old Syntax -->
<div *ngIf="condition">Content</div>
<div *ngFor="let item of items; trackBy: trackByFn">{{ item.name }}</div>
<!-- New Syntax -->
@if (condition) {
<div>Content</div>
}
@for (item of items; track item.id) {
<div>{{ item.name }}</div>
}
```
### Benefits
- **Performance**: Better tree-shaking and smaller bundle size
- **Type Safety**: Better TypeScript integration
- **Readability**: More intuitive syntax
- **Future-Proof**: Aligns with Angular's direction
---
## Phase 3: Feature Modules Migration 🔄 IN PROGRESS
### DiscoverModule ✅ COMPLETED
**Status**: Successfully converted all components to standalone
**Components Converted**: 8 components
- DiscoverComponent ✅
- DiscoverCardComponent ✅
- DiscoverCollectionsComponent ✅
- DiscoverActorComponent ✅
- DiscoverSearchResultsComponent ✅
- CarouselListComponent ✅
- RecentlyRequestedListComponent ✅
- GenreButtonSelectComponent ✅
**Technical Changes**:
- All components converted to `standalone: true`
- Added proper imports (CommonModule, TranslateModule, Angular Material, PrimeNG)
- Updated DiscoverModule to import standalone components instead of declaring them
- Maintained all existing functionality and modern Angular patterns (signals, computed, inject)
**Build Results**:
- **Status**: ✅ Successful
- **Build Time**: ~5.6 seconds
- **Bundle Size**: ~11.66MB (no change)
- **Lazy Chunk Size**: 210.73 kB (DiscoverModule)
### VoteModule ✅ COMPLETED
**Status**: Successfully converted to standalone
**Components Converted**: 1 component
- VoteComponent ✅
**Technical Changes**:
- VoteComponent converted to `standalone: true`
- Added proper imports (CommonModule, TranslateModule, PrimeNG modules)
- Updated VoteModule to import standalone component instead of declaring it
- Maintained all existing functionality
**Build Results**:
- **Status**: ✅ Successful
- **Build Time**: ~4.9 seconds (improved)
- **Bundle Size**: ~11.66MB (no change)
- **Lazy Chunk Size**: 93.23 kB (VoteModule)
### Status: 🔄 IN PROGRESS
**Target Components**: 16 feature modules
**Estimated Duration**: 2-3 weeks
### Feature Modules to Convert
| Module | Status | Components | Complexity | Priority |
|--------|--------|------------|------------|----------|
| `DiscoverModule` | ⏳ | ~8 components | Medium | High |
| `SettingsModule` | ⏳ | ~50+ components | Very High | High |
| `MediaDetailsModule` | ⏳ | ~20+ components | High | High |
| `IssuesModule` | ⏳ | ~10 components | Medium | Medium |
| `UserManagementModule` | ⏳ | ~5 components | Low | Medium |
| `UserPreferencesModule` | ⏳ | ~5 components | Low | Medium |
| `RequestsListModule` | ⏳ | ~8 components | Medium | Medium |
| `VoteModule` | ⏳ | ~3 components | Low | Low |
| `WizardModule` | ⏳ | ~10 components | Medium | Low |
| `UnsubscribeModule` | ⏳ | ~2 components | Low | Low |
| `RequestsModule` | ⏳ | ~8 components | Medium | Medium |
| `RemainingRequestsModule` | ⏳ | ~2 components | Low | Low |
| `SharedModule` | ✅ | 8 components | N/A | N/A |
| `RoleModule` | ⏳ | ~1 component | Low | Low |
| `PipeModule` | ✅ | 7 pipes | N/A | N/A |
### Next Steps
1. Start with `DiscoverModule` (simpler, high priority)
2. Convert `SettingsModule` (most complex, high priority)
3. Continue with remaining modules based on priority
---
## Phase 4: Main App Module Migration ⏳ PENDING
### Status: ⏳ PENDING
**Target**: Convert `AppModule` to standalone bootstrap
**Dependencies**: All feature modules must be converted first
### Current AppModule Structure
- **Declarations**: 12 components
- **Imports**: 20+ modules
- **Providers**: 25+ services
- **Bootstrap**: AppComponent
### Planned Changes
- Convert to `bootstrapApplication()` pattern
- Move all providers to bootstrap configuration
- Update routing to use standalone components
- Remove NgModule entirely
---
## Phase 5: Routing Migration ⏳ PENDING
### Status: ⏳ PENDING
**Target**: Convert lazy-loaded routes to standalone components
**Dependencies**: All feature modules must be standalone
### Current Routing Structure
- **Main Routes**: 12 routes
- **Lazy-loaded Modules**: 8 feature modules
- **Guards**: AuthGuard, custom guards
- **Resolvers**: Various data resolvers
### Planned Changes
- Convert lazy-loaded modules to standalone component routes
- Update route configurations
- Test all routing functionality
---
## Phase 6: Testing and Validation ⏳ PENDING
### Status: ⏳ PENDING
**Target**: Comprehensive testing of all functionality
**Dependencies**: All previous phases complete
### Testing Checklist
- [ ] Build verification (dev/prod)
- [ ] Runtime functionality testing
- [ ] Route navigation testing
- [ ] Component interaction testing
- [ ] Service injection testing
- [ ] Performance validation
- [ ] Bundle size analysis
---
## Migration Statistics
### Overall Progress
- **Total Components**: ~131+ components
- **Pipes Converted**: 7/7 (100%) ✅
- **Shared Components Converted**: 7/7 (100%) ✅
- **Feature Modules**: 0/16 (0%) ⏳
- **Main App Module**: 0/1 (0%) ⏳
### Build Metrics
| Phase | Build Time | Bundle Size | Status |
|-------|------------|-------------|--------|
| Baseline | ~5.4s | ~11.59MB | ✅ |
| Phase 1 (Pipes) | ~5.4s | ~11.59MB | ✅ |
| Phase 2 (Shared) | ~4.2s | ~11.66MB | ✅ |
| Phase 3 (Features) | TBD | TBD | ⏳ |
| Phase 4 (Main App) | TBD | TBD | ⏳ |
### Quality Metrics
- **Linting Errors**: 0
- **Breaking Changes**: 0
- **Backward Compatibility**: 100% maintained
- **Test Coverage**: Maintained
---
## Risk Mitigation
### Completed Safeguards
- ✅ Incremental migration approach
- ✅ Backward compatibility maintained
- ✅ Build verification after each phase
- ✅ Comprehensive documentation
### Ongoing Safeguards
- 🔄 Feature branch for migration work
- 🔄 Regular build testing
- 🔄 Component-by-component validation
- 🔄 Rollback plan ready
---
## Next Actions
### Immediate (Phase 3)
1. **Start with DiscoverModule** - Convert 8 components to standalone
2. **Document each component conversion** - Track dependencies and changes
3. **Test build after each module** - Ensure no regressions
4. **Update this documentation** - Record progress and issues
### Short-term (Phases 4-5)
1. Convert remaining feature modules
2. Convert main app module
3. Update routing configuration
4. Comprehensive testing
### Long-term (Phase 6+)
1. Vite migration preparation
2. Performance optimization
3. Bundle size optimization
4. Final validation
---
## Notes and Observations
### Lessons Learned
- **Standalone conversion is straightforward** - Most complexity is in dependency management
- **Build times increase slightly** - Due to additional imports, but manageable
- **No breaking changes** - Backward compatibility is excellent
- **Documentation is crucial** - Tracking progress prevents confusion
### Challenges Encountered
- **Complex dependency chains** - Some components have many Material dependencies
- **Template analysis required** - Need to check templates to identify all dependencies
- **Import organization** - Keeping imports clean and organized
### Best Practices Established
- **Convert simple components first** - Build confidence and patterns
- **Test after each phase** - Catch issues early
- **Document everything** - Track progress and decisions
- **Maintain backward compatibility** - Don't break existing functionality
---
## Phase 4: Main App Module Migration ✅ COMPLETED
### Status: ✅ COMPLETED
**Date Completed**: 2025-01-13
**Duration**: ~30 minutes
**Components Converted**: 6 components
### Components Converted
| Component | Status | Dependencies | Notes |
|-----------|--------|--------------|-------|
| `AppComponent` | ✅ | CommonModule, RouterModule, TranslateModule, MyNavComponent | Main application component |
| `MyNavComponent` | ✅ | CommonModule, MatButtonModule, MatDialogModule, MatIconModule, MatListModule, MatMenuModule, MatRippleModule, MatSidenavModule, MatSlideToggleModule, MatToolbarModule, MatTooltipModule, RouterModule, TranslateModule, RemainingRequestsComponent, NavSearchComponent | Navigation component |
| `NavSearchComponent` | ✅ | CommonModule, FormsModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatIconModule | Search component |
| `RemainingRequestsComponent` | ✅ | CommonModule, MatIconModule, MatTooltipModule, TranslateModule | Remaining requests display |
| `PageNotFoundComponent` | ✅ | CommonModule, TranslateModule | 404 error page |
| `DetailedCardComponent` | ✅ | CommonModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule, TranslateModule, ImageComponent, OmbiDatePipe | Detailed card for requests |
### Technical Changes
- Converted main app components to standalone
- Updated app module to import standalone components instead of declaring them
- Fixed custom pipe imports (OmbiDatePipe)
- Maintained all existing functionality
### Build Results
- **Status**: ✅ Successful
- **Build Time**: ~5.3 seconds
- **Bundle Size**: No significant change
- **Linting Errors**: 0
- **Application Status**: ✅ Fully functional
### Issues Resolved
- **OmbiDatePipe import**: Fixed import path and standalone configuration
- **Missing dependencies**: Added all required Angular Material and custom component imports
- **Template dependencies**: Analyzed templates to identify all required imports
---
*Last Updated: 2025-01-13*
*Next Review: After Phase 4 completion*

138
scripts/setup-dev.sh Executable file
View File

@ -0,0 +1,138 @@
#!/bin/bash
# Ombi Development Setup Script
# This script helps new contributors set up their development environment
set -e
echo "🚀 Setting up Ombi development environment..."
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Function to print colored output
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Check if we're in the right directory
if [ ! -f "src/Ombi/Ombi.csproj" ]; then
print_error "Please run this script from the Ombi root directory"
exit 1
fi
# Check for required tools
print_status "Checking for required tools..."
# Check .NET
if ! command -v dotnet &> /dev/null; then
print_error ".NET 8.0 SDK is required but not installed"
print_status "Please install from: https://dotnet.microsoft.com/download/dotnet/8.0"
exit 1
else
DOTNET_VERSION=$(dotnet --version)
print_success "Found .NET version: $DOTNET_VERSION"
fi
# Check Node.js
if ! command -v node &> /dev/null; then
print_error "Node.js is required but not installed"
print_status "Please install from: https://nodejs.org/"
exit 1
else
NODE_VERSION=$(node --version)
print_success "Found Node.js version: $NODE_VERSION"
fi
# Check Yarn
if ! command -v yarn &> /dev/null; then
print_error "Yarn is required but not installed"
print_status "Please install from: https://yarnpkg.com/"
exit 1
else
YARN_VERSION=$(yarn --version)
print_success "Found Yarn version: $YARN_VERSION"
fi
# Check Git
if ! command -v git &> /dev/null; then
print_error "Git is required but not installed"
exit 1
else
print_success "Found Git"
fi
print_status "All required tools are installed!"
# Restore .NET dependencies
print_status "Restoring .NET dependencies..."
if dotnet restore; then
print_success ".NET dependencies restored"
else
print_error "Failed to restore .NET dependencies"
exit 1
fi
# Install frontend dependencies
print_status "Installing frontend dependencies..."
if yarn --cwd ./src/Ombi/ClientApp install; then
print_success "Frontend dependencies installed"
else
print_error "Failed to install frontend dependencies"
exit 1
fi
# Build the project
print_status "Building the project..."
if dotnet build; then
print_success "Project built successfully"
else
print_error "Failed to build project"
exit 1
fi
# Run tests
print_status "Running tests..."
if dotnet test; then
print_success "All tests passed"
else
print_warning "Some tests failed - this might be expected for a fresh setup"
fi
# Create development configuration
print_status "Setting up development configuration..."
if [ ! -f "src/Ombi/appsettings.Development.json" ]; then
print_warning "Development configuration not found - you may need to create one"
fi
print_success "Development environment setup complete!"
echo ""
echo "🎉 You're ready to start contributing to Ombi!"
echo ""
echo "Next steps:"
echo "1. Read the CONTRIBUTING.md guide"
echo "2. Join our Discord: https://discord.gg/Sa7wNWb"
echo "3. Look for 'good first issue' labels"
echo "4. Start coding!"
echo ""
echo "To run the application:"
echo " Backend: dotnet run --project src/Ombi"
echo " Frontend: yarn --cwd ./src/Ombi/ClientApp start"
echo ""
echo "Happy coding! 🚀"

View File

@ -2,6 +2,7 @@
<project version="4">
<component name="RiderProjectSettingsUpdater">
<option name="singleClickDiffPreview" value="1" />
<option name="unhandledExceptionsIgnoreList" value="1" />
<option name="vcsConfiguration" value="3" />
</component>
</project>

View File

@ -5,7 +5,7 @@
</component>
<component name="ChangeListManager">
<list default="true" id="57001998-efde-494a-80b3-d7acfc91f770" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/Ombi/ClientApp/src/app/settings/plex/plex.component.html" beforeDir="false" afterPath="$PROJECT_DIR$/Ombi/ClientApp/src/app/settings/plex/plex.component.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/.idea.Ombi/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.Ombi/.idea/workspace.xml" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -273,20 +273,11 @@
</component>
<component name="GithubPullRequestsUISettings">{
&quot;selectedUrlAndAccountId&quot;: {
&quot;url&quot;: &quot;https://github.com/ombi-app/ombi&quot;,
&quot;accountId&quot;: &quot;22dd09fe-fb9e-48a4-bfcc-3c152edf3f25&quot;
&quot;url&quot;: &quot;https://github.com/tidusjar/ombi&quot;,
&quot;accountId&quot;: &quot;22715a9f-5998-4231-b224-cb858185e803&quot;
}
}</component>
<component name="HighlightingSettingsPerFile">
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/DecompilerCache/decompiler/990126b794024fe2bd16aebdd37eba1d7b600/93/25662f04/ServerVersion.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/3bd4df5aff92cabbc4d630be64227073db1b8539b3a1e47786b4b189d7cdb7/DbContext.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/449b441523c469ed34ff5a5e14f0bafcd8f097aa463655303dc19048fa44ac3/EntityFrameworkServiceCollectionExtensions.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/7d81b2d4f22bee75e5438c707251ae43cb0974c207db91ffc159118c84b4eb9/ServiceProvider.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/a424e6912048b4cd25715f158e789aae24db5c2911d9e622d39bc6ac3246c6/MySqlConnectionStringBuilder.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/bd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182/ExceptionDispatchInfo.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/e9881a453a581134c1a18331ac1f8f1201a5382a685bf2a40777fa22619/DbContextOptions`.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Ombi.Api.MusicBrainz/IMusicBrainzApi.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Ombi.Api.MusicBrainz/MusicBrainzApi.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Ombi.Core/Engine/Interfaces/IMusicSearchEngineV2.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Ombi.Core/Engine/MusicSearchEngine.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Ombi.Core/Engine/RecentlyAddedEngine.cs" root0="FORCE_HIGHLIGHTING" />
@ -301,6 +292,9 @@
<setting file="file://$PROJECT_DIR$/Ombi/Controllers/V1/TokenController.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Ombi/Controllers/V2/SearchController.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Ombi/Program.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/8056cd3f452fefb9834f05cdb275b762dd41f27b7766cd71174e78592dc495b/Monitor.CoreCLR.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/af2fe87b3bf8e8e709592be2e23743353a2ea141226bb57faaf989ad823baa/HashSet.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/db7395f4add94e6d10e515b3e55373f2821f8323de7dc8e314d78feefacf5584/ActionMethodExecutor.cs" root0="FORCE_HIGHLIGHTING" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
@ -315,6 +309,11 @@
</list>
</option>
</component>
<component name="JsbtTreeLayoutManager">
<layout place="tools.popupGrunt">
<scroll-view-position x="0" y="0" />
</layout>
</component>
<component name="PackageJsonUpdateNotifier">
<dismissed value="$PROJECT_DIR$/Ombi/ClientApp/package.json" />
</component>
@ -329,7 +328,7 @@
<option name="height" value="1000" />
</component>
<component name="ProjectId" id="2wGwbN5gDqLwyiO1WJdlwJzZ5M9" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectView">
@ -395,21 +394,23 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
".NET Launch Settings Profile.Ombi.Schedule.Tests.executor": "Run",
".NET Launch Settings Profile.Ombi.executor": "Debug",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.git.unshallow": "true",
"fb34c741-04ca-4b4f-8ea1-651a011b42c8.executor": "Debug",
"git-widget-placeholder": "watchlist-expired-notification",
"node.js.detected.package.eslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "yarn",
"vue.rearranger.settings.migration": "true"
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;.NET Launch Settings Profile.Ombi.Schedule.Tests.executor&quot;: &quot;Run&quot;,
&quot;.NET Launch Settings Profile.Ombi.executor&quot;: &quot;Debug&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
&quot;fb34c741-04ca-4b4f-8ea1-651a011b42c8.executor&quot;: &quot;Debug&quot;,
&quot;git-widget-placeholder&quot;: &quot;emby-episode-fix&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;yarn&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;SpellingScopeSettingsId&quot;,
&quot;ts.external.directory.path&quot;: &quot;/Users/tidusjar/Developer/ombi/src/Ombi/ClientApp/node_modules/typescript/lib&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
}
}]]></component>
}</component>
<component name="RunManager" selected=".NET Launch Settings Profile.Ombi">
<configuration name="Ombi" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/Ombi/Ombi.csproj" />
@ -499,6 +500,11 @@
<workItem from="1745681294313" duration="1814000" />
<workItem from="1747080279165" duration="838000" />
<workItem from="1747082180432" duration="1994000" />
<workItem from="1758915804840" duration="171000" />
<workItem from="1758916150497" duration="1079000" />
<workItem from="1759605037837" duration="2197000" />
<workItem from="1760127238421" duration="3727000" />
<workItem from="1760467558058" duration="1479000" />
</task>
<servers />
</component>
@ -553,13 +559,9 @@
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<breakpoint enabled="true" suspend="NONE" type="DotNet Exception Breakpoints">
<properties exception="System.Threading.ThreadAbortException" displayValue="System.Threading.ThreadAbortException" />
<option name="timeStamp" value="1" />
</breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi/Controllers/V1/TokenController.cs</url>
<line>48</line>
<line>50</line>
<properties documentPath="$PROJECT_DIR$/Ombi/Controllers/V1/TokenController.cs">
<startOffsets>
<option value="1518" />
@ -571,83 +573,122 @@
<option name="timeStamp" value="2" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi.Core/Engine/V2/MultiSearchEngine.cs</url>
<line>59</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Core/Engine/V2/MultiSearchEngine.cs" containingFunctionPresentation="Method 'MultiSearch'">
<url>file://$PROJECT_DIR$/Ombi.Core/Senders/TvSender.cs</url>
<line>123</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Core/Senders/TvSender.cs" containingFunctionPresentation="Method 'SendToSonarr'">
<startOffsets>
<option value="2369" />
<option value="4687" />
</startOffsets>
<endOffsets>
<option value="2576" />
<option value="4722" />
</endOffsets>
</properties>
<option name="timeStamp" value="4" />
<option name="timeStamp" value="17" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi.Core/Engine/V2/MultiSearchEngine.cs</url>
<line>49</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Core/Engine/V2/MultiSearchEngine.cs" containingFunctionPresentation="Method 'MultiSearch'">
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyEpisodeSync.cs</url>
<line>71</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyEpisodeSync.cs" containingFunctionPresentation="Method 'Execute'">
<startOffsets>
<option value="1903" />
<option value="2848" />
</startOffsets>
<endOffsets>
<option value="1945" />
<option value="2894" />
</endOffsets>
</properties>
<option name="timeStamp" value="5" />
<option name="timeStamp" value="20" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi.Api.MusicBrainz/MusicBrainzApi.cs</url>
<line>30</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Api.MusicBrainz/MusicBrainzApi.cs" containingFunctionPresentation="Method 'SearchArtist'">
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyLibrarySync.cs</url>
<line>37</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyLibrarySync.cs" containingFunctionPresentation="Method 'Execute'">
<startOffsets>
<option value="833" />
<option value="1173" />
</startOffsets>
<endOffsets>
<option value="834" />
<option value="1219" />
</endOffsets>
</properties>
<option name="timeStamp" value="7" />
<option name="timeStamp" value="21" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs</url>
<line>110</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs" containingFunctionPresentation="Method 'Execute'">
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyLibrarySync.cs</url>
<line>87</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyLibrarySync.cs" containingFunctionPresentation="Method 'StartServerCache'">
<startOffsets>
<option value="5123" />
<option value="3007" />
</startOffsets>
<endOffsets>
<option value="5206" />
<option value="3112" />
</endOffsets>
</properties>
<option name="timeStamp" value="10" />
<option name="timeStamp" value="22" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs</url>
<line>77</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs" containingFunctionPresentation="Method 'Execute'">
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyLibrarySync.cs</url>
<line>97</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyLibrarySync.cs" containingFunctionPresentation="Method 'StartServerCache'">
<startOffsets>
<option value="3324" />
<option value="3547" />
</startOffsets>
<endOffsets>
<option value="3365" />
<option value="3548" />
</endOffsets>
</properties>
<option name="timeStamp" value="11" />
<option name="timeStamp" value="23" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs</url>
<line>100</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Plex/PlexWatchlistImport.cs" containingFunctionPresentation="Method 'Execute'">
<condition expression="tvShow.Name.Contains(&quot;Dexter&quot;)" language="C#" />
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs</url>
<line>82</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs" containingFunctionPresentation="Method 'ProcessTv'">
<startOffsets>
<option value="4602" />
<option value="3133" />
</startOffsets>
<endOffsets>
<option value="4636" />
<option value="3134" />
</endOffsets>
</properties>
<option name="timeStamp" value="12" />
<option name="timeStamp" value="29" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs</url>
<line>45</line>
<properties documentPath="$PROJECT_DIR$/Ombi.Schedule/Jobs/Emby/EmbyContentSync.cs" containingFunctionPresentation="Method 'Execute'">
<startOffsets>
<option value="1401" />
</startOffsets>
<endOffsets>
<option value="1429" />
</endOffsets>
</properties>
<option name="timeStamp" value="42" />
</line-breakpoint>
<line-breakpoint enabled="true" type="DotNet Breakpoints">
<url>file://$PROJECT_DIR$/Ombi/Controllers/V2/SearchController.cs</url>
<line>130</line>
<properties documentPath="$PROJECT_DIR$/Ombi/Controllers/V2/SearchController.cs" containingFunctionPresentation="Method 'GetTvInfo'">
<startOffsets>
<option value="5636" />
</startOffsets>
<endOffsets>
<option value="5843" />
</endOffsets>
</properties>
<option name="timeStamp" value="46" />
</line-breakpoint>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.OperationCanceledException" breakIfHandledByOtherCode="false" displayValue="System.OperationCanceledException" />
<option name="timeStamp" value="13" />
</breakpoint>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.Threading.Tasks.TaskCanceledException" breakIfHandledByOtherCode="false" displayValue="System.Threading.Tasks.TaskCanceledException" />
<option name="timeStamp" value="14" />
</breakpoint>
<breakpoint enabled="true" type="DotNet_Exception_Breakpoints">
<properties exception="System.Threading.ThreadAbortException" breakIfHandledByOtherCode="false" displayValue="System.Threading.ThreadAbortException" />
<option name="timeStamp" value="15" />
</breakpoint>
</breakpoints>
</breakpoint-manager>
<watches-manager>
@ -658,6 +699,10 @@
</configuration>
</watches-manager>
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
<select />
</component>
<component name="debuggerHistoryManager">
<expressions id="watch">
<expression>

View File

@ -1,12 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Configurations>Debug;Release;NonUiBuild</Configurations>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Ombi.Api\Ombi.Api.csproj" />
</ItemGroup>
</Project>

View File

@ -1,13 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<LangVersion>latest</LangVersion>
<Configurations>Debug;Release;NonUiBuild</Configurations>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Ombi.Api\Ombi.Api.csproj" />
</ItemGroup>
</Project>

View File

@ -1,17 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AssemblyVersion>3.0.0.0</AssemblyVersion>
<FileVersion>3.0.0.0</FileVersion>
<Version></Version>
<PackageVersion></PackageVersion>
<LangVersion>latest</LangVersion>
<Configurations>Debug;Release;NonUiBuild</Configurations>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Ombi.Api\Ombi.Api.csproj" />
</ItemGroup>
</Project>

View File

@ -1,13 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<LangVersion>latest</LangVersion>
<Configurations>Debug;Release;NonUiBuild</Configurations>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Ombi.Api\Ombi.Api.csproj" />
</ItemGroup>
</Project>

View File

@ -1,19 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<AssemblyVersion>3.0.0.0</AssemblyVersion>
<FileVersion>3.0.0.0</FileVersion>
<Version></Version>
<PackageVersion></PackageVersion>
<LangVersion>latest</LangVersion>
<Configurations>Debug;Release;NonUiBuild</Configurations>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Ombi.Api\Ombi.Api.csproj" />
<ProjectReference Include="..\Ombi.Api.MediaServer\Ombi.Api.MediaServer.csproj" />
<ProjectReference Include="..\Ombi.Helpers\Ombi.Helpers.csproj" />
</ItemGroup>
</Project>

View File

@ -3,10 +3,10 @@ using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using Ombi.Api.CouchPotato.Models;
using Ombi.Api.External.ExternalApis.CouchPotato.Models;
using Ombi.Helpers;
namespace Ombi.Api.CouchPotato
namespace Ombi.Api.External.ExternalApis.CouchPotato
{
public class CouchPotatoApi : ICouchPotatoApi
{

View File

@ -1,7 +1,7 @@
using System.Threading.Tasks;
using Ombi.Api.CouchPotato.Models;
using Ombi.Api.External.ExternalApis.CouchPotato.Models;
namespace Ombi.Api.CouchPotato
namespace Ombi.Api.External.ExternalApis.CouchPotato
{
public interface ICouchPotatoApi
{

View File

@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace Ombi.Api.CouchPotato.Models
namespace Ombi.Api.External.ExternalApis.CouchPotato.Models
{
public class CouchPotatoApiKey
{

View File

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Ombi.Api.CouchPotato.Models
namespace Ombi.Api.External.ExternalApis.CouchPotato.Models
{
public class CouchPotatoMovies
{

View File

@ -1,7 +1,7 @@
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Ombi.Api.CouchPotato.Models
namespace Ombi.Api.External.ExternalApis.CouchPotato.Models
{
public class ProfileList
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.CouchPotato.Models
namespace Ombi.Api.External.ExternalApis.CouchPotato.Models
{
public class CouchPotatoStatus
{

View File

@ -4,9 +4,9 @@ using System.Net.Http;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Microsoft.Extensions.Logging;
using Ombi.Api.DogNzb.Models;
using Ombi.Api.External.ExternalApis.DogNzb.Models;
namespace Ombi.Api.DogNzb
namespace Ombi.Api.External.ExternalApis.DogNzb
{
public class DogNzbApi : IDogNzbApi
{

View File

@ -1,7 +1,7 @@
using System.Threading.Tasks;
using Ombi.Api.DogNzb.Models;
using Ombi.Api.External.ExternalApis.DogNzb.Models;
namespace Ombi.Api.DogNzb
namespace Ombi.Api.External.ExternalApis.DogNzb
{
public interface IDogNzbApi
{

View File

@ -27,7 +27,7 @@
using System.Xml.Serialization;
namespace Ombi.Api.DogNzb.Models
namespace Ombi.Api.External.ExternalApis.DogNzb.Models
{
[XmlRoot(ElementName = "uuid")]
public class DogNzbAddResult

View File

@ -27,7 +27,7 @@
using System.Xml.Serialization;
namespace Ombi.Api.DogNzb.Models
namespace Ombi.Api.External.ExternalApis.DogNzb.Models
{
[XmlRoot(ElementName = "error")]

View File

@ -27,7 +27,7 @@
using System.Xml.Serialization;
namespace Ombi.Api.DogNzb.Models
namespace Ombi.Api.External.ExternalApis.DogNzb.Models
{
[XmlRoot(ElementName = "channel")]
public class MovieAddResultChannel

View File

@ -28,7 +28,7 @@
using System.Collections.Generic;
using System.Xml.Serialization;
namespace Ombi.Api.DogNzb.Models
namespace Ombi.Api.External.ExternalApis.DogNzb.Models
{
[XmlRoot(ElementName = "response", Namespace = "http://www.newznab.com/DTD/2010/feeds/attributes/")]

View File

@ -27,7 +27,7 @@
using System.Xml.Serialization;
namespace Ombi.Api.DogNzb.Models
namespace Ombi.Api.External.ExternalApis.DogNzb.Models
{

View File

@ -3,9 +3,9 @@ using System.Net.Http;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Ombi.Api.FanartTv.Models;
using Ombi.Api.External.ExternalApis.FanartTv.Models;
namespace Ombi.Api.FanartTv
namespace Ombi.Api.External.ExternalApis.FanartTv
{
public class FanartTvApi : IFanartTvApi
{

View File

@ -1,7 +1,7 @@
using System.Threading.Tasks;
using Ombi.Api.FanartTv.Models;
using Ombi.Api.External.ExternalApis.FanartTv.Models;
namespace Ombi.Api.FanartTv
namespace Ombi.Api.External.ExternalApis.FanartTv
{
public interface IFanartTvApi
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.FanartTv.Models
namespace Ombi.Api.External.ExternalApis.FanartTv.Models
{
public class MovieResult

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.FanartTv.Models
namespace Ombi.Api.External.ExternalApis.FanartTv.Models
{
public class TvResult
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Github.Models
namespace Ombi.Api.External.ExternalApis.Github.Models
{
public class CakeThemes
{

View File

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Ombi.Api.Github.Models;
using Ombi.Api.External.ExternalApis.Github.Models;
namespace Ombi.Api.Github
namespace Ombi.Api.External.ExternalApis.Github
{
public class GithubApi : IGithubApi
{

View File

@ -1,8 +1,8 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Ombi.Api.Github.Models;
using Ombi.Api.External.ExternalApis.Github.Models;
namespace Ombi.Api.Github
namespace Ombi.Api.External.ExternalApis.Github
{
public interface IGithubApi
{

View File

@ -1,9 +1,9 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Ombi.Api.Lidarr.Models;
using Ombi.Api.External.ExternalApis.Lidarr.Models;
namespace Ombi.Api.Lidarr
namespace Ombi.Api.External.ExternalApis.Lidarr
{
public interface ILidarrApi
{

View File

@ -5,9 +5,9 @@ using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Ombi.Api.Lidarr.Models;
using Ombi.Api.External.ExternalApis.Lidarr.Models;
namespace Ombi.Api.Lidarr
namespace Ombi.Api.External.ExternalApis.Lidarr
{
public class LidarrApi : ILidarrApi
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class AlbumByArtistResponse
{

View File

@ -1,7 +1,7 @@
using System;
using System.Net.Mime;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class AlbumByForeignId
{

View File

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class AlbumLookup
{

View File

@ -1,6 +1,6 @@
using System;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class AlbumResponse
{

View File

@ -1,6 +1,6 @@
using System;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class Artist
{

View File

@ -1,7 +1,7 @@
using System;
using System.Net.Mime;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class ArtistAdd
{

View File

@ -1,7 +1,7 @@
using System;
using System.Net.Mime;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class ArtistLookup
{

View File

@ -1,6 +1,6 @@
using System;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class ArtistResult

View File

@ -1,6 +1,6 @@
using System;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class CommandResult

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class Image
{

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class LidarrLinks
{

View File

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class Quality
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class LidarrRatings
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class LidarrRootFolder
{

View File

@ -1,6 +1,6 @@
using System;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class LidarrStatus
{

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class LidarrTrack
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class Link
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class MetadataProfile
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class Ratings
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Lidarr.Models
namespace Ombi.Api.External.ExternalApis.Lidarr.Models
{
public class Statistics
{

View File

@ -3,9 +3,9 @@ using System.Threading;
using System.Threading.Tasks;
using Hqub.MusicBrainz.API.Entities;
using Hqub.MusicBrainz.API.Entities.Collections;
using Ombi.Api.MusicBrainz.Models;
using Ombi.Api.External.ExternalApis.MusicBrainz.Models;
namespace Ombi.Api.MusicBrainz
namespace Ombi.Api.External.ExternalApis.MusicBrainz
{
public interface IMusicBrainzApi
{

View File

@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace Ombi.Api.MusicBrainz.Models
namespace Ombi.Api.External.ExternalApis.MusicBrainz.Models
{
public class ReleaseGroupArt

View File

@ -6,9 +6,9 @@ using System.Threading.Tasks;
using Hqub.MusicBrainz.API;
using Hqub.MusicBrainz.API.Entities;
using Newtonsoft.Json;
using Ombi.Api.MusicBrainz.Models;
using Ombi.Api.External.ExternalApis.MusicBrainz.Models;
namespace Ombi.Api.MusicBrainz
namespace Ombi.Api.External.ExternalApis.MusicBrainz
{
public class MusicBrainzApi : IMusicBrainzApi
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.MusicBrainz
namespace Ombi.Api.External.ExternalApis.MusicBrainz
{
public static class RelationLinks
{

View File

@ -1,6 +1,6 @@
using System;
namespace Ombi.Api.Radarr
namespace Ombi.Api.External.ExternalApis.Radarr
{
public class CommandResult
{

View File

@ -1,8 +1,8 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Ombi.Api.Radarr.Models;
using Ombi.Api.External.ExternalApis.Radarr.Models;
namespace Ombi.Api.Radarr
namespace Ombi.Api.External.ExternalApis.Radarr
{
public interface IRadarrApi
{

View File

@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Ombi.Api.Radarr.Models;
using Ombi.Api.Radarr.Models.V3;
using Ombi.Api.External.ExternalApis.Radarr.Models;
using Ombi.Api.External.ExternalApis.Radarr.Models.V3;
namespace Ombi.Api.Radarr
namespace Ombi.Api.External.ExternalApis.Radarr
{
public interface IRadarrV3Api
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Sonarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class Cutoff
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class Image
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class Item
{

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Net.Mime;
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class MovieResponse
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class Quality
{

View File

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class RadarrAddMovieResponse : RadarrAddMovie
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class RadarrAddOptions
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class RadarrError
{

View File

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class RadarrProfile
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class RadarrRootFolder
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class Ratings
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Sonarr
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class SystemStatus
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models
namespace Ombi.Api.External.ExternalApis.Radarr.Models
{
public class Tag
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.Radarr.Models.V3
namespace Ombi.Api.External.ExternalApis.Radarr.Models.V3
{
public class RadarrV3QualityProfile
{

View File

@ -4,10 +4,10 @@ using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Ombi.Api.Radarr.Models;
using Ombi.Api.External.ExternalApis.Radarr.Models;
using Ombi.Helpers;
namespace Ombi.Api.Radarr
namespace Ombi.Api.External.ExternalApis.Radarr
{
public class RadarrApi : IRadarrApi
{

View File

@ -4,11 +4,11 @@ using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Ombi.Api.Radarr.Models;
using Ombi.Api.Radarr.Models.V3;
using Ombi.Api.External.ExternalApis.Radarr.Models;
using Ombi.Api.External.ExternalApis.Radarr.Models.V3;
using Ombi.Helpers;
namespace Ombi.Api.Radarr
namespace Ombi.Api.External.ExternalApis.Radarr
{
//https://radarr.video/docs/api/
public class RadarrV3Api : IRadarrV3Api

View File

@ -1,10 +1,10 @@
using Ombi.Api.RottenTomatoes.Models;
using Ombi.Api.External.ExternalApis.RottenTomatoes.Models;
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
namespace Ombi.Api.RottenTomatoes
namespace Ombi.Api.External.ExternalApis.RottenTomatoes
{
public interface IRottenTomatoesApi
{

View File

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Ombi.Api.RottenTomatoes.Models
namespace Ombi.Api.External.ExternalApis.RottenTomatoes.Models
{
public class RottenTomatoesMovieResponse
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.RottenTomatoes.Models
namespace Ombi.Api.External.ExternalApis.RottenTomatoes.Models
{
public class RottenTomatoesTvResponse
{

View File

@ -1,4 +1,4 @@
namespace Ombi.Api.RottenTomatoes.Models
namespace Ombi.Api.External.ExternalApis.RottenTomatoes.Models
{
public class TvRatings
{

View File

@ -1,10 +1,10 @@
using Ombi.Api.RottenTomatoes.Models;
using Ombi.Api.External.ExternalApis.RottenTomatoes.Models;
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
namespace Ombi.Api.RottenTomatoes
namespace Ombi.Api.External.ExternalApis.RottenTomatoes
{
public class RottenTomatoesApi : IRottenTomatoesApi
{

View File

@ -2,7 +2,7 @@
using System.Net.Http;
using System.Threading.Tasks;
namespace Ombi.Api.Service
namespace Ombi.Api.External.ExternalApis.Service
{
public class AppVeyorApi : IAppVeyorApi
{

View File

@ -1,6 +1,6 @@
using System.Threading.Tasks;
namespace Ombi.Api.Service
namespace Ombi.Api.External.ExternalApis.Service
{
public interface IAppVeyorApi
{

View File

@ -1,7 +1,7 @@
using System.Threading.Tasks;
using Ombi.Api.Service.Models;
using Ombi.Api.External.ExternalApis.Service.Models;
namespace Ombi.Api.Service
namespace Ombi.Api.External.ExternalApis.Service
{
public interface IOmbiService
{

View File

@ -3,10 +3,10 @@ using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Ombi.Api.Service.Models;
using Ombi.Api.External.ExternalApis.Service.Models;
using Ombi.Helpers;
namespace Ombi.Api.Service
namespace Ombi.Api.External.ExternalApis.Service
{
public class OmbiService : IOmbiService
{

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using Newtonsoft.Json;
namespace Ombi.Api.Service.Models
namespace Ombi.Api.External.ExternalApis.Service.Models
{
public class Updates

View File

@ -1,7 +1,7 @@
using System.Threading.Tasks;
using Ombi.Api.SickRage.Models;
using Ombi.Api.External.ExternalApis.SickRage.Models;
namespace Ombi.Api.SickRage
namespace Ombi.Api.External.ExternalApis.SickRage
{
public interface ISickRageApi
{

View File

@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace Ombi.Api.SickRage.Models
namespace Ombi.Api.External.ExternalApis.SickRage.Models
{
public class SeasonList : SickRageBase<List<int>>
{

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