Compare commits

...

1459 Commits
v3 ... develop

Author SHA1 Message Date
Bogdan 2f04b037a1 Fixed nlog deprecated calls 2024-08-11 09:08:38 -07:00
Bogdan 7b87de2e93
Clear pending changes for edit import list exclusions on modal close 2024-08-11 11:53:17 -04:00
Bogdan eb2fd13509
Fixed: Overwriting query params for remove item handler (#7075) 2024-08-11 11:51:11 -04:00
Bogdan ffdb08cfe6 Fixed: Dedupe titles to avoid similar search requests 2024-08-11 08:49:22 -07:00
Mark McDowall 37c4647f24 Fix typos and improve log messages 2024-08-11 08:48:33 -07:00
Mark McDowall f7a58aab33 Align queue action buttons on right 2024-08-11 08:48:33 -07:00
Mark McDowall 4b186e894e
Fixed: Marking queued item as failed not blocking the correct Torrent Info Hash 2024-08-11 11:48:22 -04:00
kephasdev 35a2bc9403
Fix: Use indexer's Multi Languages setting for pushed releases
Closes #7059
2024-08-11 11:47:59 -04:00
Bogdan cc03ce04f1 Fixed: Formatting empty size on disk values 2024-08-11 08:46:56 -07:00
Bogdan 363f8fc347
New: Match search releases using IMDb ID if available 2024-08-11 11:46:46 -04:00
RaZaSB 0877a6718d
New: Remove all single quote characters from searches 2024-08-11 11:46:02 -04:00
Bogdan 8b253c36ea
Validation for bulk series editor 2024-08-11 11:45:15 -04:00
Bogdan e6f82270a9
Parse TVDB ID for releases from HDBits
ignore-downstream
2024-08-11 11:45:00 -04:00
Mark McDowall 813965e6a2 New: Configurable log file size limit 2024-08-11 08:44:35 -07:00
Mark McDowall 0d914f4c53 New: Add Compact Log Event Format option for console logging
Closes #7045
2024-08-11 08:44:35 -07:00
Mark McDowall ae7f73208a Upgrade nlog to 5.3.2 2024-08-11 08:44:35 -07:00
Weblate 4c86d673ea Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ano10 <arnaudthommeray+github@ik.me>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-08-11 08:44:27 -07:00
Weblate b1527f9abb Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: iMohmmedSA <i.mohmmed.i+1@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-07-31 22:26:09 -07:00
Bogdan 291d792810
Fixed: Moving files on import for usenet clients
Closes #7043
2024-08-01 01:17:10 -04:00
Mark McDowall 9b528eb829
New: Default file log level changed to debug 2024-08-01 01:16:24 -04:00
Mark McDowall 4c0b896174 Improve messaging for for Send Notifications setting in Emby / Jellyfin
Closes #7042
2024-07-31 22:16:01 -07:00
Bogdan 4ff83f9efc
Fixed: Persist Indexer Flags for automatic imports
Revert "Fixed: Persist Indexer Flags when manual importing from queue"

This reverts commit 217611d716.
2024-08-01 01:15:36 -04:00
Bogdan 217611d716
Fixed: Persist Indexer Flags when manual importing from queue 2024-07-31 00:28:01 -04:00
Mark McDowall 1299a97579 Update React Lint rules for TSX 2024-07-30 21:27:33 -07:00
Mark McDowall 4c0de55672 Fixed: Setting page size in Queue, History and Blocklist
Closes #7035
2024-07-30 21:27:33 -07:00
Bogdan 78a0def46a
Fixed: Moving files for torrents when Remove Completed is disabled 2024-07-31 00:27:19 -04:00
Mark McDowall 11a9dcb389
New: Return downloading magnets from Transmission
Closes #7029
2024-07-31 00:26:24 -04:00
Mark McDowall 4eab168267
New: Add metadata links to telegram messages
Closes #5342
---------

Co-authored-by: Ivar Stangeby <istangeby@gmail.com>
2024-07-31 00:25:48 -04:00
Bogdan c9b5a1258a New: Title filter for Series Index 2024-07-30 21:25:10 -07:00
Mark McDowall 9127a91dfc Fixed: Allow leading/trailing spaces on non-Windows
Closes #6971
2024-07-30 21:25:00 -07:00
Weblate cc85a28ff7 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Wolfy The Broccoly <theproviderofsolace@gmail.com>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-07-30 21:24:50 -07:00
Mark McDowall 72db8099e0 Convert System to TypeScript 2024-07-28 17:47:08 -07:00
Weblate ebc5cdb335 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translation: Servarr/Sonarr
2024-07-28 17:27:52 -07:00
Mark McDowall d6d90a64a3 Convert App to TypeScript 2024-07-28 17:27:13 -07:00
Mark McDowall d46f4b2154 Convert Utilities to TypeScript 2024-07-28 17:27:13 -07:00
Mark McDowall 76650af9fd Convert Queue to TypeScript 2024-07-28 16:59:48 -07:00
Mark McDowall 824ed0a369 Convert History to TypeScript 2024-07-28 16:59:48 -07:00
Mark McDowall ee80564dd4 Convert Blocklist to TypeScript 2024-07-28 16:59:48 -07:00
Mark McDowall 3824eff5eb New: Parse Chinese Anime that separates titles with vertical bar
Closes #7014
2024-07-28 16:59:38 -07:00
Bogdan 15e3c3efb1 Include available version in update health check 2024-07-28 16:59:32 -07:00
Stevie Robinson f2f4a98eed Fixed: Interactive Import dropdown width on mobile
Closes #7015
2024-07-28 16:59:21 -07:00
Mark McDowall bc7799139e Don't hash files in development builds 2024-07-28 16:59:21 -07:00
Bogdan 33b62a2def
New: Add TVMaze and TMDB IDs to Kodi .nfo (#7011)
Closes #6895
ignore-downstream
2024-07-28 19:59:10 -04:00
Mark McDowall 5ac6c0e651 Fix height of tags in tag inputs 2024-07-28 16:58:44 -07:00
Bogdan 60cba74c39 Bump ImageSharp to 3.1.5
https://github.com/advisories/GHSA-63p8-c4ww-9cg7
2024-07-28 16:58:39 -07:00
Bogdan 5c2c490cb2 Improve messaging for renamed episode files progress info 2024-07-28 16:58:32 -07:00
Mark McDowall 63fdf8ca8f
Cache root folders and improve getting disk space for series path roots 2024-07-28 19:58:16 -04:00
Mark McDowall e791f4b743
Fixed: Updating series path from different OS paths
Closes #6953
2024-07-28 19:57:54 -04:00
jbstark 6dd85a5af9
New: 'Seasons Monitored Status' Custom Filter to replace 'Has Unmonitored Season'
Closes #6896
2024-07-28 19:57:22 -04:00
Weblate a80f5b794b Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-07-28 16:56:09 -07:00
Weblate 578f95546b Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: marudosurdo <marudosurdo@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ja/
Translation: Servarr/Sonarr
2024-07-24 21:34:30 -07:00
ManiMatter 9a613afa35
Treat forcedMetaDL from qBit as queued instead of downloading 2024-07-25 00:33:08 -04:00
Mark McDowall 5ad3d2efcc Fixed: Don't treat SubFrench as French audio language
Closes #6995
2024-07-24 21:32:18 -07:00
Bogdan 1ad722acda
Fixed: Improve performance in Select Series Modal 2024-07-25 00:32:09 -04:00
Bogdan bde5f68142 Refresh series with recently aired episodes with TBA titles
Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
2024-07-24 21:31:46 -07:00
Bogdan fbda2d54c7
New: Display original language on series details and search results page
Closes #6984
2024-07-25 00:31:29 -04:00
Bogdan 2a26c6722a
New: Ignore Litestream tables in Database 2024-07-25 00:30:56 -04:00
Bogdan b7dfb8999d Improve tooltip for Next Airing on series Overview 2024-07-24 21:30:27 -07:00
Bogdan 1662521d40 Fixed: Display tag list when sort by tags on series Posters 2024-07-24 21:30:27 -07:00
Weblate f8d75d174a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dream <seth.gecko.rr@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2024-07-24 21:30:00 -07:00
Bogdan 80ca1a6ac2
Fixed: Editing Quality Profiles 2024-07-18 08:10:43 -07:00
Weblate f59c0b16ca Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dream <seth.gecko.rr@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translation: Servarr/Sonarr
2024-07-16 21:42:50 -07:00
Mark McDowall 0e95ba2021 New: Allow major version updates to be installed 2024-07-16 21:39:49 -07:00
Mark McDowall c023fc7008 New: Show update settings on all platforms 2024-07-16 21:39:49 -07:00
Mark McDowall 19466aa290
Fixed: Assume category path from qBittorent starting with '//' is a Windows UNC path
Radarr/Radarr#10162
2024-07-17 00:39:40 -04:00
Mark McDowall 4b5ef4907b Set default value for CustomColonReplacementFormat if not provided 2024-07-16 21:38:26 -07:00
Stevie Robinson 7b8d606a1b
New: Wrap specifications in Custom Format and Auto Tagging modals 2024-07-17 00:38:15 -04:00
diamondpete 6a4824c029
Fixed: Remove apostrophe, backtick in contractions 2024-07-17 00:36:29 -04:00
Mark McDowall 1a1c8e6c08
New: Use natural sorting for lists of items in the UI
Closes #6955
2024-07-17 00:34:43 -04:00
Mark McDowall e35b39b4b1 New: Add option to show tags on series Poster and Overview
Closes #6946
2024-07-16 21:34:25 -07:00
Mark McDowall d3f14d5f5e Fixed: Parse Chinese anime formats with reverse title order 2024-07-16 21:34:11 -07:00
Mark McDowall 06936c4f22 Fixed: Parsing of Chinese anime with ordinal number in English title 2024-07-16 21:34:11 -07:00
Mark McDowall 0a28ff84e8 Fixed: Parsing of anime with 3 digit number in middle of title 2024-07-16 21:34:11 -07:00
Bogdan 703dee9383 New: Rating votes tooltip and series filter 2024-07-16 21:33:49 -07:00
Marc Carbonell dca5239420
Remove extraneous indentation in RemoveFileExtension 2024-07-17 00:33:34 -04:00
Mark McDowall 1aaa9a14bc Bump version to 4.0.8 2024-07-15 21:36:26 -07:00
Weblate c6c37a408a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dream <seth.gecko.rr@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translation: Servarr/Sonarr
2024-07-15 21:36:15 -07:00
Weblate ae4a97b4ae Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dream <seth.gecko.rr@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translation: Servarr/Sonarr
2024-07-15 12:07:12 -07:00
Mark McDowall 3afae968eb
Fixed: Import queue not processing after incomplete import 2024-07-15 12:03:53 -07:00
Mark McDowall c01abbf3b5 Add 'On Import Complete' for Discord notifications 2024-07-15 12:03:31 -07:00
Mark McDowall f5ccf98162 Rename 'On Upgrade' to 'On File Upgrade' 2024-07-15 12:03:31 -07:00
Mark McDowall 6afd3bd344 Bump version to 4.0.7 2024-07-14 16:44:07 -07:00
Weblate acaf5cd353 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: MattiaPell <mattiapellegrini16@gmail.com>
Co-authored-by: Rauniik <raunerjakub@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-07-14 16:43:56 -07:00
Sonarr e97e5bfe8f Automated API Docs update
ignore-downstream
2024-07-09 22:22:48 -07:00
martylukyy 678872b879
Fixed: Parsing of some Web releases 2024-07-10 01:19:07 -04:00
Mark McDowall 10e9735c1c
New: Update AutoTags on series update
Closes #6783
2024-07-10 01:02:23 -04:00
Mark McDowall 293a1bc618
New: Custom colon replacement option
Closes #6898
2024-07-10 01:02:04 -04:00
Bogdan 0c883f7886 Fixed: Removing pending release without blocklisting 2024-07-09 22:01:23 -07:00
Mark McDowall 46c7de379c New: Group updates for the same series for Kodi and Emby / Jellyfin 2024-07-09 22:00:57 -07:00
Mark McDowall a83b521766 New: 'On Import Complete' notification when all episodes in a release are imported
Closes #363
2024-07-09 22:00:57 -07:00
Bogdan 1d06e40acb New: Queued episode count for seasons in series details 2024-07-09 21:59:41 -07:00
Weblate bfcdc89f6a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Serhii Matrunchyk <serhii@digitalidea.studio>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/uk/
Translation: Servarr/Sonarr
2024-07-09 21:59:25 -07:00
Sonarr 67943edfbc Automated API Docs update
ignore-downstream
2024-07-05 16:35:21 -07:00
Mark McDowall 04f8595498 Custom Import List improvements
Fixed: Add placeholder title for Custom Import List title
New: Support 'title' property for Custom Import List
2024-07-05 16:35:08 -07:00
Bogdan 81ac73299a
Fixed: Bulk series deletion for unmonitored series
Closes #6933
2024-07-05 19:34:56 -04:00
Mark McDowall a779a5fad2 Fixed: Parsing of anime season releases with 3-digit number in title 2024-07-05 16:34:06 -07:00
Mark McDowall bfe6a740fa Fixed: Parsing of anime releases using standard numbering
Closes #6925
2024-07-05 16:34:06 -07:00
Mark McDowall c9ea40b874 New: Parse VFI as French
Closes #6927
2024-07-05 16:34:00 -07:00
Bogdan 4ee0ae1418 Fixed: History with unknown series 2024-07-05 16:33:50 -07:00
Bogdan ac1da45ecd
Fixed: Calculate Custom Formats after user specified options in Manual Import 2024-07-05 19:33:33 -04:00
Weblate 5c327d5be3 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: MattiaPell <mattiapellegrini16@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: quek76 <quek@libertysurf.fr>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-07-05 16:31:56 -07:00
Mark McDowall 55c1ce2e3d Bump version to 4.0.6 2024-06-30 15:42:47 -07:00
Weblate fd7f0ea973 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Kshitij Burman <kburman6@gmail.com>
Co-authored-by: MattiaPell <mattiapellegrini16@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: damienmillet <contact@damien-millet.dev>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2024-06-30 15:42:41 -07:00
Bogdan d5dff8e8d6
Fixed: Trimming disabled logs database
Closes #6918
2024-06-30 13:49:41 -04:00
Bogdan 8099ba10af
Fixed: Already imported downloads appearing in Queue briefly 2024-06-30 13:47:00 -04:00
Mark McDowall 143ccb1e2a Remove seriesTitle from EpisodeResource
Closes #6841
2024-06-28 06:22:10 -07:00
Mark McDowall 29480d9544 Fixed: Don't use cleaned up release title for release title 2024-06-28 06:22:04 -07:00
Mark McDowall 6de536a7ad Fixed: Limit Queue maximum page size to 200
Closes #6899
2024-06-26 09:45:43 -07:00
Mark McDowall bce848facf Fixed: Reprocessing items that were previously blocked during importing 2024-06-26 09:45:28 -07:00
Mark McDowall ea4fe392a0 New: Remove websites in parentheses before parsing 2024-06-25 15:52:24 -07:00
Mark McDowall 45fe585944 Fixed: Prevent errors parsing releases in unexpected formats 2024-06-25 15:52:24 -07:00
Mark McDowall a0d2933134
New: Ignore Deluge torrents without a title
Closes #6885
2024-06-25 18:52:12 -04:00
Mark McDowall 4c622fd412 New: Ability to select Plex Media Server from plex.tv
Closes #6887
2024-06-25 15:51:57 -07:00
Bogdan fb060730c7 Fixed: Exclude invalid releases from Newznab and Torznab parsers 2024-06-25 15:51:41 -07:00
Mark McDowall 6d5ff9c4d6
New: Improve UI status when downloads cannot be imported automatically
Closes #6873
2024-06-25 18:51:20 -04:00
Mark McDowall 63bed3e670 New: Parse anime seasons with trailing number in title
Closes #6883
2024-06-25 15:51:03 -07:00
Weblate e684c10432 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: MattiaPell <mattiapellegrini16@gmail.com>
Co-authored-by: Taylan Tatlı <taylantatli90@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2024-06-25 15:50:56 -07:00
Bogdan d2509798e9 New: Display stats for delete multiple series modal 2024-06-17 20:40:04 -07:00
Bogdan 6c39855ebe Fix UpdatePackageProviderFixture for v4
ignore-downstream
2024-06-17 20:39:33 -07:00
Bogdan a30e9da767 New: Ignore inaccessible folders when getting folders 2024-06-17 20:39:33 -07:00
Mark McDowall f8e81396d4 Fixed: Importing from IMDb list 2024-06-17 20:39:22 -07:00
Mark McDowall 7fccf590a8
Fixed: Adding series with unknown items in queue 2024-06-17 23:39:13 -04:00
Stephan Sundermann e1b937e8d5
New: Add TMDB ID support
Closes #6866
2024-06-17 23:38:41 -04:00
Bogdan c331c8bd11 Ignore `Grabbed` from API docs
Run application in docs.sh specific to platform
2024-06-10 20:30:26 -07:00
Mark McDowall 52b72925f9 Fixed: Improve error messaging if config file isn't formatted correctly
Closes #6860
2024-06-10 20:30:13 -07:00
Mark McDowall 378fedcd9d
Fixed: Skip invalid series paths during validation 2024-06-10 23:30:03 -04:00
Bogdan a90ab1a8fd Fixed: Ignore case when resolving indexer by name in release push 2024-06-10 20:29:46 -07:00
Bogdan 0edc5ba99a Fixed: Ignore case for name validation in providers 2024-06-10 20:29:46 -07:00
Bogdan ea54ade9bf New: Refresh cache for tracked queue on series add 2024-06-10 20:29:41 -07:00
Weblate e07eb05e8b Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: AlbertCoolGuy <Albert.rosenstand@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: xuzhihui <5894940@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-06-10 20:29:28 -07:00
Bogdan d9b771ab0b
Fixed: Error sending Manual Interaction Required when series is unknown 2024-05-31 20:11:31 -04:00
Mark McDowall 6b08e849b8 Search for raw and clean titles for Newznab/Torznab indexers that support raw title searching 2024-05-31 17:10:32 -07:00
Mark McDowall 9c1f48ebc9 Fixed: Include full series title in episode search 2024-05-31 17:10:32 -07:00
Mark McDowall fd3dd1ab7d New: Genres and Images for Webhooks and Notifiarr
Closes #6822
2024-05-31 17:10:13 -07:00
yammes08 11e5c5a11b
Fixed: SDR Files Being Parsed As HLG 2024-05-31 20:09:53 -04:00
Weblate 48f0291884 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ano10 <arnaudthommeray+github@ik.me>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: r0bertreh <Robert.reh@live.de>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translation: Servarr/Sonarr
2024-05-31 17:09:11 -07:00
Mark McDowall af0e55aef4 Bump version to 4.0.5 2024-05-29 16:23:16 -07:00
Weblate 39a439eb4c Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Bao Trinh <servarr@baodtrinh.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: mm519897405 <baiya@vip.qq.com>
Co-authored-by: thegamingcat13 <sandervanbeek2004@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-05-29 16:23:04 -07:00
Weblate 66940b283b Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: mm519897405 <baiya@vip.qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-05-24 06:21:13 -07:00
Mark McDowall 2a662afaef Fixed: Time for episodes airing today being blank 2024-05-24 06:19:38 -07:00
Weblate 62a9c2519b Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: mm519897405 <baiya@vip.qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-05-22 20:09:18 -07:00
Mark McDowall ca372bee25 Fixed: Queue and Calendar not loading 2024-05-22 20:07:31 -07:00
Sonarr 0904a0737e Automated API Docs update
ignore-downstream
2024-05-21 17:09:20 -07:00
Bogdan 70bc26dc19 Disable workflows on forks
ignore-downstream
2024-05-21 17:06:44 -07:00
Bogdan a2e0002a08 Replace multiple occurrences in branch env variable
ignore-downstream
2024-05-21 17:06:44 -07:00
Bogdan d7ceb11a64 Fixed: Trimming slashes from UrlBase when using environment variable 2024-05-21 17:06:44 -07:00
Bogdan cc5b5463f2 Ignore `Grabbed` with STJson 2024-05-21 17:06:36 -07:00
Bogdan 9b4ff657af Update the wanted section for missing and cutoff unmet 2024-05-21 17:06:36 -07:00
Bogdan aea50fa47e Bump Npgsql to 7.0.7
ignore-downstream
2024-05-21 17:06:28 -07:00
Mark McDowall 05edd44ed6 New: Include time for episode/season/series history 2024-05-21 17:06:18 -07:00
Bogdan 4440aa3cac New: Root folder exists validation for import lists 2024-05-21 17:06:09 -07:00
Bogdan 084fcc2295 Implement equality checks for providers 2024-05-21 17:05:48 -07:00
Weblate 536ff142c3 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Ransack6086 <servarr.jubilant150@slmail.me>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Yi Cao <caoyi06@qq.com>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: topnew <sznetim@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-05-21 17:05:34 -07:00
Mark McDowall 627b2a4289 New: Parse 480i Bluray/Remux as Bluray 480p
Closes #6801
2024-05-09 22:04:18 -07:00
Bogdan 9734c2d144 Fixed: Notifications with only On Rename enabled
ignore-downstream
2024-05-09 22:04:12 -07:00
Bogdan c7c1e3ac9e Refactor PasswordInput to use type password 2024-05-09 22:04:04 -07:00
Bogdan 429444d085 Fixed: Text color for inputs on login page 2024-05-09 22:03:56 -07:00
Mark McDowall 5cb649e9d8 Fixed: Attempt to parse and reject ambiguous dates
Closes #6799
2024-05-09 22:03:44 -07:00
Mark McDowall cac7d239ea Fixed: Parsing of partial season pack 2024-05-09 22:03:44 -07:00
Sonarr 3940059ea3 Automated API Docs update
ignore-downstream
2024-05-09 22:03:31 -07:00
Weblate 20d00fe88c Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Michael5564445 <michaelvelosk@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/uk/
Translation: Servarr/Sonarr
2024-05-09 22:03:24 -07:00
Mark McDowall b4d05214ae Fixed: Ignore invalid movie tags when writing XBMC metadata
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>
2024-05-08 18:45:19 -07:00
Mark McDowall cc0a284660 New: Add series tags to Webhook and Notifiarr events 2024-05-08 18:45:19 -07:00
Mark McDowall f50a263f4f New: Add Custom Format Score to file in Episode Details 2024-05-08 18:45:03 -07:00
Mark McDowall 29176c8367 New: Has Unmonitored Season filter for Series 2024-05-08 18:44:52 -07:00
Bogdan 1eddf3a152 Use number input for seed ratio 2024-05-08 18:44:36 -07:00
Bogdan 8360dd7a7b Fixed: Parsing long downloading/seeding values from Transmission 2024-05-08 18:44:27 -07:00
Bogdan 7e8d8500f2
Fixed: Next/previous/last air dates with Postgres DB
Closes #6790
2024-05-08 18:43:51 -07:00
Mark McDowall cae134ec7b New: Dark theme for login screen
Closes #6751
2024-05-08 18:42:54 -07:00
Stevie Robinson f81bb3ec19
New: Blocklist Custom Filters
Closes #6763
2024-05-08 18:42:41 -07:00
Bogdan 128309068d Fixed: Initialize databases after app folder migrations
Co-authored-by: Mark McDowall <mark@mcdowall.ca>
2024-05-08 18:42:15 -07:00
Mickaël Thomas 73a4bdea52
New: Support stoppedUP and stoppedDL states from qBittorrent 2024-05-08 18:41:59 -07:00
Bogdan 47ba002806
Fixed: Indexer flags for torrent release pushes 2024-05-04 18:56:52 -07:00
Mark McDowall ba88185dea New: Treat batch releases with total episode count as full season release
Closes #6757
2024-05-04 18:56:15 -07:00
Mark McDowall e24ce40eb8 Fixed: History with unknown episode
Closes #6782
2024-05-04 18:55:56 -07:00
Stevie Robinson 8be8c7f89c
Add missing translation key 2024-05-04 18:55:44 -07:00
Bogdan 7166a6c019 Parameter binding for API requests 2024-05-04 18:55:12 -07:00
Mark McDowall 3fbe436138 Forward X-Forwarded-Host header
Closes #6764
2024-05-04 18:54:55 -07:00
Jared 92eab4b2e2
New: Config file setting to disable log database
Closes #6743
2024-05-04 18:54:42 -07:00
Mika 23c741fd00
Add file-count for Transmission RPC 2024-05-04 18:53:47 -07:00
Weblate 8ddf46113b Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2024-05-04 18:53:15 -07:00
Bogdan c81ae65461 Fixed: Limit titles in task name to 10 series 2024-04-27 18:09:08 -07:00
Bogdan efb3fa93e4
Fixed: Retrying download for pushed releases
ignore-downstream
#6752
2024-04-27 21:08:40 -04:00
Stevie Robinson 04bd535cfc
New: Don't initially select 0 byte files in Interactive Import
Closes #6686
2024-04-27 21:07:41 -04:00
Bogdan 9738101042 Treat CorruptDatabaseException as a startup failure
ignore-downstream
2024-04-27 18:06:49 -07:00
Bogdan 1df7cdc65e New: Add KRaLiMaRKo and BluDragon to release group parsing exceptions
ignore-downstream
2024-04-27 18:06:38 -07:00
Jared d051dac12c
New: Optionally use Environment Variables for settings in config.xml
Closes #6744
2024-04-27 21:06:26 -04:00
Bogdan 5d01ecd30e Bump frontend dependencies
ignore-downstream
2024-04-27 18:05:16 -07:00
Mark McDowall 316b5cbf75
New: Validate that folders in paths don't start or end with a space
Closes #6709
2024-04-27 21:04:50 -04:00
Bogdan 2440672179 Bump SixLabors.ImageSharp to 3.1.4
ignore-downstream
2024-04-27 18:04:35 -07:00
Mark McDowall a97fbcc40a Fixed: Improve paths longer than 256 on Windows failing to hardlink 2024-04-27 18:04:26 -07:00
Christopher d738035fed
New: Remove qBitorrent torrents that reach inactive seeding time 2024-04-27 21:04:16 -04:00
Mark McDowall dc3e932102 macOS tests now run on arm64 2024-04-27 18:03:12 -07:00
Weblate aded9d95f7 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Ano10 <arnaudthommeray+github@ik.me>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Mailme Dashite <mailmedashite@protonmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: aghus <aghus.m@outlook.com>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: maodun96 <435795439@qq.com>
Co-authored-by: toeiazarothis <patrickdealmeida89000@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-04-27 18:03:03 -07:00
Mark McDowall b81c3ee4a8 Fix labeling config 2024-04-15 21:14:49 -07:00
Mark McDowall cf6748a80c Fix merge conflict labeling 2024-04-15 21:14:49 -07:00
Sonarr ef6cc7fa3a Automated API Docs update
ignore-downstream
2024-04-15 20:35:29 -07:00
Mark McDowall f9b013a8bf New: Parse releases with multiple Ukranian audio tracks
Closes #6714
2024-04-15 20:25:41 -07:00
Bogdan e966254462 Fixed: Re-testing edited providers will forcibly test them 2024-04-15 20:25:31 -07:00
Gauvino 016c4b353b
Add merge conflict labeler 2024-04-15 23:25:13 -04:00
Uruk d71c619f1a Update CI dependencies 2024-04-15 20:24:20 -07:00
Gauthier 6c232b062c
New: Multi Language selection per indexer
Closes #2854
2024-04-15 23:24:05 -04:00
Josh McKinney d6278fced4 Add dev container workspace
Allows the linting and style settings for the frontend to be applied even when you load the main repo as a workspace
2024-04-15 20:23:13 -07:00
Weblate 317ce39aa2 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Altair <villagermd@outlook.com>
Co-authored-by: Fonkio <maxime.fabre10@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Jacopo Luca Maria Latrofa <jacopo.latrofa@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2024-04-15 20:23:04 -07:00
Mark McDowall 941985f65b Bump version to 4.0.4 2024-04-13 10:05:01 -07:00
Mark McDowall 10daf97d81 Improve build step dependencies 2024-04-12 16:00:46 -07:00
Mark McDowall 6b08117d7d Improve release notes for main releases 2024-04-12 16:00:46 -07:00
Weblate 9afe1c4b3f Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: YSLG <1451164040@qq.com>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-04-12 16:00:37 -07:00
Mark McDowall 0fdbbd018c New: Parse absolute episode numbers within square brackets
Closes #6694
2024-04-12 16:00:16 -07:00
Sonarr 8a7b67c593 Automated API Docs update
ignore-downstream
2024-04-09 16:17:48 -07:00
Weblate 4b8afe3d33 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: myrad2267 <myrad2267@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-04-09 16:16:11 -07:00
Bogdan 476e7a7b94
Fixed: Changing Release Type in Manage Episodes
Closes #6706
2024-04-09 19:14:56 -04:00
Bogdan 1fcd2b492c Prevent multiple enumerations in Custom Formats token 2024-04-09 16:14:33 -07:00
Bogdan 1aef91041e New: Detect shfs mounts in disk space 2024-04-09 16:14:16 -07:00
Bogdan fc06e51352
Fixed: Renaming episodes for a series
Closes #6640
2024-04-09 19:13:59 -04:00
Mark McDowall f4c19a384b New: Auto tag series based on tags present/absent on series
Closes #6236
2024-04-09 16:13:30 -07:00
Josh McKinney 5061dc4b5e
Add DevContainer, VSCode config and extensions.json 2024-04-09 19:12:58 -04:00
Mark McDowall 37863a8deb
New: Option to prefix app name on Telegram notification titles 2024-04-09 19:12:20 -04:00
Mark McDowall 5c42935eb3 Fixed: Improve AniList testing with Media filters 2024-04-09 16:12:05 -07:00
Weblate dac69445e4 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Jason54 <jason54700.jg@gmail.com>
Co-authored-by: Michael5564445 <michaelvelosk@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/uk/
Translation: Servarr/Sonarr
2024-04-05 23:13:02 -07:00
Qstick aca10f6f4f Fixed: Skip move when source and destination are the same
ignore-downstream

Co-Authored-By: Colin Hebert <makkhdyn@gmail.com>
(cherry picked from commit 7a5ae56a96700f401726ac80b3031a25207d8f75)
2024-04-05 23:11:37 -07:00
Mark McDowall 74cdf01e49
New: Set 'Release Type' during Manual Import
Closes #6681
2024-04-06 02:11:17 -04:00
Mark McDowall a169ebff2a
Fixed: Sending ntfy.sh notifications with unicode characters
Closes #6679
2024-04-06 02:11:03 -04:00
fireph 7fc3bebc91
New: Footnote to indicate some renaming tokens support truncation 2024-04-06 02:10:42 -04:00
Till Krüss e672996dbb
Improve text for file deleted through UI/API 2024-04-06 02:09:55 -04:00
Stevie Robinson 238ba85f0a
New: Informational text on Custom Formats modal 2024-04-06 02:08:57 -04:00
Cuki 1562d3bae3
Fixed: Use widely supported display mode for PWA 2024-04-06 02:08:08 -04:00
Jendrik Weise 7776ec9955 Reimport files imported prematurely during script import 2024-04-05 23:07:38 -07:00
Jendrik Weise af5a681ab7 Fix ignoring title based on pre-rename episodefile 2024-04-05 23:07:38 -07:00
Jendrik Weise 0a7f3a12c2 Do not remove all extras when script importing 2024-04-05 23:07:38 -07:00
Jendrik Weise 2ef46e5b90 Fix incorrect subtitle copy regex 2024-04-05 23:07:38 -07:00
Mark McDowall 6003ca1696 Fixed: Deleted episodes not being unmonitored when series folder has been deleted
Closes #6678
2024-04-05 23:07:07 -07:00
Mark McDowall 0937ee6fef Fixed: Path parsing incorrectly treating series title as episode number 2024-04-05 23:06:56 -07:00
Mark McDowall 60ee7cc716
Fixed: Cleanse BHD RSS key in log files
Closes #6666
2024-04-06 02:06:35 -04:00
Mark McDowall 4e83820511 Bump version to 4.0.3 2024-03-31 21:52:19 -07:00
Sonarr 5a66b949cf Automated API Docs update
ignore-downstream
2024-03-31 21:43:33 -07:00
Weblate f010f56290 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: 王锋 <17611382361@163.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-03-31 21:43:09 -07:00
Louis R 060b789bc6
Fixed: Exceptions when checking for routable IPv4 addresses 2024-03-28 01:31:28 -04:00
Bogdan 7353fe479d
New: Allow HEAD requests to ping endpoint
Closes #6656
2024-03-28 01:30:45 -04:00
Alex Cortelyou 1ec1ce58e9
New: Add additional fields to Webhook Manual Interaction Required events 2024-03-28 01:30:21 -04:00
Stevie Robinson 35d0e6a6f8
Fixed: Handling torrents with relative path in rTorrent 2024-03-28 01:29:15 -04:00
Carlos Gustavo Sarmiento 588372fd95
Fixed: qBittorrent not correctly handling retention during testing 2024-03-28 01:28:41 -04:00
Bogdan 13c925b341 New: Advanced settings toggle in import list, notification and download client modals 2024-03-27 22:27:51 -07:00
iceypotato 1335efd487 New: My Anime List import list
Closes #5148
2024-03-27 22:27:34 -07:00
Mark McDowall d338425951 Fixed: Use custom formats from import during rename 2024-03-27 22:27:25 -07:00
Mark McDowall fc6494c569 Fixed: Task with removed series causing error 2024-03-27 22:27:14 -07:00
Weblate c403b2cdd5 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Altair <villagermd@outlook.com>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Stanislav <prekop3@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2024-03-27 22:27:07 -07:00
Weblate cf3d51bab2 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Casselluu <jack10193@163.com>
Co-authored-by: Gianmarco Novelli <rinogaetano94@live.it>
Co-authored-by: Jason54 <jason54700.jg@gmail.com>
Co-authored-by: MadaxDeLuXe <madaxdeluxe@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: infoaitek24 <info@aitekph.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: shimmyx <shimmygodx@gmail.com>
Co-authored-by: vfaergestad <vgf@hotmail.no>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-03-21 21:21:30 -07:00
Mark McDowall dec3fc6889
Fixed: Don't add series from import list with no matched TVDB ID 2024-03-22 00:21:04 -04:00
Mark McDowall 40bac23698 New: Support parsing season number from season folder when importing
Closes #903
2024-03-21 21:20:49 -07:00
Mark McDowall 88de927435 Fixed: Plex Watchlist import list 2024-03-21 21:20:27 -07:00
Mark McDowall 29204c93a3 New: Parsing multi-episode file with two and three digit episode numbers
Closes #6631
2024-03-21 21:20:13 -07:00
Mark McDowall c641733781 Fixed: Task progress messages in the UI
Closes #6632
2024-03-21 21:20:08 -07:00
Weblate 58de0310fd Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Gianmarco Novelli <rinogaetano94@live.it>
Co-authored-by: Jason54 <jason54700.jg@gmail.com>
Co-authored-by: MadaxDeLuXe <madaxdeluxe@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: infoaitek24 <info@aitekph.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: vfaergestad <vgf@hotmail.no>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nb_NO/
Translation: Servarr/Sonarr
2024-03-21 21:20:01 -07:00
Bogdan 172b1a82d1 Sort series by title in task name 2024-03-21 21:19:23 -07:00
Bogdan e14568adef Ensure not allowed cursor is shown for disabled select inputs 2024-03-21 21:19:23 -07:00
Weblate 381ce61aef Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dennis Langthjem <dennis@langthjem.dk>
Co-authored-by: DimitriDR <dimitridroeck@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Ihor Mudryi <mudryy33@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/uk/
Translation: Servarr/Sonarr
2024-03-13 21:49:22 -07:00
Mark McDowall 9f705e4161 Fixed: Release push with only Magnet URL
Closes #6622
2024-03-13 21:47:50 -07:00
Mark McDowall 063dba22a8 Fixed: Disabled select option still selectable 2024-03-13 21:47:33 -07:00
Mark McDowall 6d552f2a60 New: Show Series title and season number after task name when applicable
Closes #6601
2024-03-13 21:47:22 -07:00
Mark McDowall 4d4d63921b
Add notification for build success/failures 2024-03-14 00:47:01 -04:00
Alan Collins 6584d95331
New: Update Custom Format renaming token to allow excluding specific formats
Closes #6615
2024-03-14 00:46:33 -04:00
Bogdan 86034beccd Bump ImageSharp, Polly, DryIoc, STJson, WindowsServices 2024-03-13 21:44:23 -07:00
Mark McDowall 4aa56e3f91 Fixed: Parsing of some French and Spanish anime releases 2024-03-13 21:44:07 -07:00
Stevie Robinson 2ec071a5ec
Update release profile download client warning 2024-03-09 23:54:21 -05:00
Alan Collins d86aeb7472
New: Release Hash renaming token
Closes #6570
2024-03-09 23:54:06 -05:00
Alan Collins 48cb5d2271
New: 'Custom Format: Format Name' rename token 2024-03-09 23:53:02 -05:00
bakerboy448 a0329adeba
Improve single file detected as full season messaging 2024-03-09 23:51:29 -05:00
Bogdan 89bef4af99
New: Wider modal for Interactive Search and Manual Import 2024-03-09 23:50:45 -05:00
Mark McDowall a12cdb34bc Fixed: Error sending Manual Interaction Required notification 2024-03-07 18:11:36 -08:00
Bogdan 13e29bd257 Prevent NullRef in naming when truncating a null Release Group 2024-03-07 18:11:28 -08:00
Sonarr 61a7515041 Automated API Docs update
ignore-downstream
2024-03-07 17:34:04 -08:00
Weblate 2c25245860 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Jason54 <jason54700.jg@gmail.com>
Co-authored-by: Mark Martines <mark-martines@hotmail.com>
Co-authored-by: Maxence Winandy <maxence.winandy@gmail.com>
Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: linkin931 <931linkin@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-03-07 17:30:56 -08:00
Bogdan 18aadb544e
Fixed: Maintain release type for items in Manual Import 2024-03-07 20:30:20 -05:00
Helvio Pedreschi c7dd7abf89
Fixed: WebApp functionality on Apple devices 2024-03-07 20:29:50 -05:00
CheAle14 d0e9504af0 Fix import list exclusion props 2024-03-07 17:26:29 -08:00
Bogdan e81bb3b993 Persist page size for Import List Exclusions 2024-03-07 17:25:27 -08:00
Bogdan f211433b77 Remove debugger from metadata source and rearrange some imports 2024-03-07 17:25:19 -08:00
Bogdan 2068c5393e Fixed: URL Base setting for Kodi connections 2024-03-07 17:25:19 -08:00
Mark McDowall 0183812cc5 Fixed: Overly aggressive exception release group parsing
Closes #6591
2024-03-07 17:25:10 -08:00
Bogdan 7f09903a06 New: Episode Requested filter for Interactive Search 2024-03-02 21:26:23 -08:00
Mark McDowall fa4c11a943 New: Do not automatically unmonitor episodes renamed outside of Sonarr
Closes #6584
2024-03-02 21:23:27 -08:00
Sonarr 653963a247 Automated API Docs update
ignore-downstream
2024-03-02 21:22:27 -08:00
Mark McDowall 32c32e2f88 Fixed: Issue extracting subtitle information for unknown episodes 2024-03-02 21:22:15 -08:00
nopoz 07bd159436
New: Add download directory & move completed for Deluge
Closes #4575
2024-03-03 00:22:03 -05:00
Mark McDowall 20273b07ad Properly type validation errors/warnings 2024-03-02 21:21:24 -08:00
bakerboy448 e5f19f01fa
Update AddSeries Messaging and Logging 2024-03-03 00:21:16 -05:00
Louis R 13af6f5779
Fixed: Don't disable IPv6 in IPv6-only Environment
Closes #6545
2024-03-03 00:20:36 -05:00
Mark McDowall 71c2c0570b
Renamed SeasonPackSpecification to ReleaseTypeSpecification 2024-03-03 00:19:44 -05:00
Mark McDowall 64c6a8879b Queue Manual Import commands at high priority 2024-03-02 21:19:26 -08:00
Weblate 7f061a9583 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Nicolò Castagnola <nipica@outlook.it>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2024-03-02 21:19:17 -08:00
The Dark 4285691064
New: Import list exclusion pagination
Closes #6079
2024-03-03 00:19:02 -05:00
Sonarr de9899c60e Automated API Docs update
ignore-downstream
2024-03-01 17:33:41 -08:00
Weblate 6c8758c27a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translation: Servarr/Sonarr
2024-03-01 17:32:55 -08:00
Mark McDowall 086d3b5afa Increase migration timeout to 5 minutes 2024-03-01 17:26:26 -08:00
Mark McDowall f8a0751775 New: Release Type (Single/Multi episode and Season Pack) for Custom Formats
Closes #3562
2024-03-01 17:26:26 -08:00
Mark McDowall c99d81e79b New: Bypass archived history for failed downloads in SABnzbd 2024-03-01 17:26:10 -08:00
Mark McDowall 9fd193d2a8 New: URL Base setting for Media Server connections
Closes #4416
2024-03-01 17:24:52 -08:00
Bogdan 64f4365fe9 Update caniuse-lite 2024-03-01 17:24:41 -08:00
Bogdan 2773f77e1c New: Options button for Missing/Cutoff Unmet 2024-03-01 17:24:41 -08:00
Weblate 0a84b4a8e9 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-03-01 17:24:35 -08:00
Weblate 236d8e4c50 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-02-27 20:44:11 -08:00
Mark McDowall 16d3827dbd Fixed: Processing updated episodes in series after refresh
Closes #6560
2024-02-27 20:42:27 -08:00
Bogdan fa600e62e0
Fixed: Error when download client information is unavailable for Manual Interaction Required event
Closes #6558
(cherry picked from commit 173b1d6a4c0f2125c4413c0c09b269d87a1f1ee8)

Co-authored-by: Qstick <qstick@gmail.com>
2024-02-27 23:42:08 -05:00
Mark McDowall fb6fc568c5 Fixed: Don't store seasons from import list items in database
Closes #6555
2024-02-27 20:40:39 -08:00
Bogdan 1f97679868 Fixed: Selection of last added custom filter
Plus some translations and typos
2024-02-27 20:40:33 -08:00
Mark McDowall b34e0f8259
Fixed: Ignore language in split episode title 2024-02-27 00:33:07 -05:00
Mark McDowall 4c170d0452 New: Update anime episodes by season/episode number instead of absolute episode number
Closes #6547
2024-02-26 21:32:46 -08:00
Mark McDowall 6dc0a88004 New: Search for recently aired anime episodes with added absolute episode number
Closes #2044
2024-02-26 21:32:46 -08:00
Mark McDowall 33b44a8a53 New: Option to sync season monitoring state when importing from another Sonarr instance
Closes #6542
2024-02-26 21:32:39 -08:00
Mark McDowall cb72e752f9
Fixed: Parsing of subtitle languages separated by dash
Closes #6494
2024-02-27 00:32:31 -05:00
Weblate a11ee7bc11 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: EDUYO <eduardoestabiel@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Sadi A. Nogueira <contato@sadi.eti.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Xupix <colinaubert25@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-02-26 21:32:04 -08:00
Stevie Robinson 98d60e1a8e
Replace URLs in translations with tokens 2024-02-27 00:30:58 -05:00
Bruno Garcia 6377c688fc
Update Sentry SDK add features
Co-authored-by: Stefan Jandl <reg@bitfox.at>
2024-02-27 00:30:32 -05:00
Mark McDowall 7a37f130f9 Bump version to 4.0.2 2024-02-26 20:54:08 -08:00
Mark McDowall 724dd7e733 Clean branch name to remove slashes 2024-02-20 21:23:52 -08:00
Weblate e1be3b20e9 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: 闫锦彪 <yanjinbiaohere@163.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-02-20 20:20:43 -08:00
Sonarr 2f041f9ec1 Automated API Docs update
ignore-downstream
2024-02-20 20:20:28 -08:00
Mark McDowall f10ccf587d Don't fail fast for integration tests 2024-02-20 20:12:57 -08:00
Mark McDowall 0242b40eda Use GitHubActionsTestLogger for test reporting 2024-02-20 20:12:57 -08:00
Bogdan 7a768b5d0f
New: Indexer flags
Closes #2782
2024-02-20 23:12:45 -05:00
Mark McDowall a57254640f Upgrade actions/setup-dotnet to v4 2024-02-20 20:10:36 -08:00
Mark McDowall 1a6f45bafd Upgrade actions/checkout to v4 2024-02-20 20:10:36 -08:00
Mark McDowall c6071f6d81 Upgrade node to 20.11.1 2024-02-20 20:10:36 -08:00
Bogdan 2a47a237d4 Fix typo in log message matching by TVRage ID 2024-02-20 20:10:30 -08:00
Mark McDowall a7607ac7d6 Fixed: Only match via TV Rage ID if TheTVDB ID is not available
Closes #6517
2024-02-20 20:10:17 -08:00
Mark McDowall 43797b326d New: Parse releases with season and episode numbers separated by a period
Closes #6492
2024-02-20 20:10:09 -08:00
Mark McDowall 5c4f829993 Fixed: Multi-word genres in Auto Tags
Fixed #6488
2024-02-20 20:10:02 -08:00
Bogdan 8dd8c95f36 Fixed: Avoid upgrades for custom formats cut-off already met 2024-02-20 20:09:52 -08:00
Weblate 6f6036a199 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Chaoshuai Lü <lcs@meta.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: wgwqd <wgwqd@163.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-02-20 20:08:04 -08:00
Mark McDowall 625e500132 Use 'paths-ignore' instead of 'path' with only negative matches 2024-02-17 22:39:18 -08:00
Weblate 39575b1248 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: David13467 <davidnow00@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Hicabi Erdem <bilgi@hicabierdem.com>
Co-authored-by: Lucas <sixagag973@fkcod.com>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Steve Hansen <steve@hansenconsultancy.be>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: aghus <aghus.m@outlook.com>
Co-authored-by: bai0012 <baicongrui@gmail.com>
Co-authored-by: bogdan-rgb <b.hmelniczky@yandex.ru>
Co-authored-by: savin-msk <ns@a77.io>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-02-13 16:56:10 -08:00
abcasada f1d343218c Hints for week column and short dates in UI settings
(cherry picked from commit 4558f552820b52bb1f9cd97fdabe03654ce9924a)
2024-02-13 16:47:48 -08:00
Qstick b0829d5537 Fixed: Correctly persist calendar custom filter selection
ignore-downstream
2024-02-13 16:47:41 -08:00
Bogdan 965e7c22d9 Fixed: Reprocessing multi-language file in Manage Episodes 2024-02-13 16:47:31 -08:00
Bogdan 75535e61d9 Fixed: Reprocessing custom formats for file in Manual Import 2024-02-13 16:47:31 -08:00
Bogdan c0b17d9345 Show download client ID as hint in select options 2024-02-13 16:46:55 -08:00
Bogdan 84e657482d Improve messaging on indexer specified download client is not available 2024-02-13 16:46:55 -08:00
Bogdan ed27bcf213 Fixed: Refresh tags state to clear removed tags by housekeeping
(cherry picked from commit 2510f44c25bee6fede27d9fa2b9614176d12cb55)
2024-02-13 16:46:46 -08:00
Bogdan 9ee2fe6f5c Fix typo 2024-02-13 16:46:38 -08:00
Bogdan d5e19b8c3c Prevent useless builds 2024-02-13 16:46:38 -08:00
Sonarr 2957b40512 Automated API Docs update
ignore-downstream
2024-02-13 16:46:26 -08:00
Bogdan 9f46fc923d Fix typo for Downloaded Episodes Scan command name 2024-02-13 16:46:02 -08:00
Bogdan 7dc1e47504 Fix translation token for DL client directory help text 2024-02-13 16:46:02 -08:00
Bogdan d15c116f13 Fix translation keys for indexer validation 2024-02-13 16:46:02 -08:00
Bogdan dd704579df Improve add/loading error notices 2024-02-13 16:46:02 -08:00
Bogdan bd9d4b484c Update Custom Format Deletion confirmation message
Consistency with the rest of the Delete*MessageText
2024-02-13 16:46:02 -08:00
Qstick 913b845faa Fixed: Prevent anime search with ep/season if not supported 2024-02-09 21:30:08 -05:00
Stas Panasiuk 6e81517d51
New: Parsing titles with multiple translated titles 2024-02-06 23:03:36 -05:00
Mark McDowall 34e74eecd7
Fixed: Don't attempt to import from list with title only (#6477)
Closes #6474
2024-02-06 23:02:26 -05:00
Mark McDowall 895eccebc5
New: Parse and reject split episode releases and files 2024-02-06 23:02:03 -05:00
Mark McDowall f722d49b3a Fixed: Don't use sub folder to check for free disk space for update
Closes #6478
2024-02-06 20:01:30 -08:00
bakerboy448 cac97c057f
Improve Custom Format rejection messaging 2024-02-06 23:01:07 -05:00
jab416171 63e132d257 Wrapped fields on series details page in div
This allows you to triple click to select the path for instance, similar
to the details page in radarr.
2024-02-06 19:59:02 -08:00
Mark McDowall 6ab1d8e16b
New: Log database engine version on startup 2024-02-06 22:58:49 -05:00
Stevie Robinson 80630bf97f
Fixed: Wrapping of naming tokens with alternate separators 2024-02-06 22:58:09 -05:00
Bogdan 904285045b Fixed: Naming validation when using max token length 2024-02-06 19:57:44 -08:00
Stevie Robinson 1006ec6b52 really fix translation key 2024-02-06 19:57:33 -08:00
Mark McDowall 4cb1100704 Fixed: Remove old naming config from v3 API responses
Closes #6460
2024-02-06 19:57:25 -08:00
Mark McDowall 745b92daf4 Fixed: Redirecting after login
Closes #6454
2024-02-06 19:57:17 -08:00
Weblate 9eafdbd1af Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Ole Nørby <ole@olenoerby.dk>
Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: aghus <aghus.m@outlook.com>
Co-authored-by: gr0sz <joshuatg727@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-02-06 19:57:09 -08:00
Weblate 200396ef7a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-01-31 19:39:13 -08:00
Stevie Robinson c5a724f14e
New: Send 'On Manual Interaction Required' notifications in more cases
Closes #6448
2024-01-31 19:38:51 -08:00
Mark McDowall 42b11528b4 New: Improve multi-language negate Custom Format
Closes #6408
2024-01-31 19:37:44 -08:00
Alex Herbig e2210228b3
New: Add RZeroX to release group parsing exceptions 2024-01-31 19:36:39 -08:00
Bogdan ded7c3c6e2
Only bind shortcut for pending changes confirmation when it's shown 2024-01-31 19:36:21 -08:00
Stevie Robinson e1c6722aad
New: Ignore 'Other' subfolder when scanning disk
Closes #6437
2024-01-31 19:35:21 -08:00
Bogdan e17655c26a
Fixed: Notifications with only On Series Add enabled being labeled as disabled 2024-01-31 19:34:51 -08:00
Stevie Robinson e66c628241
Update some translation keys 2024-01-31 19:34:17 -08:00
Mark McDowall 8f0514a91d Fixed: Grouped calendar events not correctly showing as downloading
Closes #6441
2024-01-31 19:33:46 -08:00
bakerboy448 d7aea82e45 Improve Release Grabbing & Failure Logging 2024-01-31 19:33:38 -08:00
Mark McDowall 19db75b36b Add max token length (including ellipsis) for some tokens
New: Accept ':##' on renaming tokens to allow specifying a maximum length for series, episode titles and release group
Closes #6416
2024-01-31 19:33:21 -08:00
Weblate 11a18b534a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Crocmou <slaanesh8854@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Lars <lars.erik.heloe@gmail.com>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Stas Panasiuk <temnyip@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/uk/
Translation: Servarr/Sonarr
2024-01-31 19:33:13 -08:00
Sonarr 70807a9dcf Automated API Docs update
ignore-downstream
2024-01-26 22:09:26 -08:00
Weblate 350600607d Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Alexander <a.burdun@gmail.com>
Co-authored-by: Crocmou <slaanesh8854@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: diaverso <alexito_perez.95@hotmail.com>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: zichichi <sollami@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/uk/
Translation: Servarr/Sonarr
2024-01-26 22:09:16 -08:00
Mark McDowall e9f0c96249 Fixed: Specials not allowing multi-episode select in Manual Import
Closes #6429
2024-01-26 22:01:04 -08:00
ta264 d9acbf5682 Fixed: FolderWritable check for CIFS shares mounted in Unix
This reverts commit 8c892a732ed57af9bb1f39743e0c16361f41b50f.

(cherry picked from commit 96384521c59233dab5bd8289e7c84043f75b84a2)
2024-01-26 22:00:50 -08:00
Stevie Robinson 07cbd7c8d2
Fixed: Validating DownloadStation output path
Closes #6421
2024-01-27 00:59:43 -05:00
Mark McDowall 0ea189d03c Fixed: History retention for Newsbin 2024-01-26 21:56:13 -08:00
Bogdan 9e3f9f9618 Fixed: Testing for disabled Notifications 2024-01-26 21:56:05 -08:00
The Dark 68c326ae27
New: Import list clean library option
Closes #5201
2024-01-27 00:55:52 -05:00
Weblate 46367d2023 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Co-authored-by: wilfriedarma <wilfriedarma.collet@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-01-26 21:54:57 -08:00
Sonarr b64c52a846 Automated API Docs update
ignore-downstream
2024-01-22 20:59:24 -08:00
Mark McDowall 345854d0fe
New: Optionally remove from queue by changing category to 'Post-Import Category' when configured
Closes #6023
2024-01-22 23:56:35 -05:00
Bogdan 31baed4b2c Fixed: Sorting by name in Manage Indexer and Download Client modals 2024-01-22 20:56:01 -08:00
Bogdan 7d0d503a5e New: Display database migration version in Status 2024-01-22 20:55:53 -08:00
Stevie Robinson 9f50166fa6
Fixed: Regular Expression Custom Format translation 2024-01-22 23:55:33 -05:00
Bogdan 3c1ca6ea4e New: Expand seasons with all episodes having missing air dates 2024-01-22 20:54:35 -08:00
Mark McDowall 3cd4c67ba1 New: Add download client name to pending items waiting for a specific client
Closes #6274
2024-01-22 20:52:01 -08:00
Mark McDowall fc3a2e9ab2 New: Added some extra pixels to grouped calendar events
Closes #6395
2024-01-22 20:51:53 -08:00
Mark McDowall a71d40edba New: Add recycle bin path for deleted episodes to webhook/custom script
Closes #6114
2024-01-22 20:51:38 -08:00
Mark McDowall 9ba5850fca Fixed: Parsing Hungarian anime releases
Closes #6275
2024-01-22 20:51:27 -08:00
Mark McDowall 0d06418194 New: Add size to more history events
Closes #6234
2024-01-22 20:51:19 -08:00
Mark McDowall f95dd00b51 Fixed: Migrating subtitle files with unexpectedly large number at end
Closes #6409
2024-01-22 20:50:43 -08:00
Bogdan 271266b10a Fix possible NullRef in Email Encryption migration 2024-01-22 20:50:34 -08:00
Mark McDowall cab93249ec Fixed: Number only hashes getting substituted incorrectly 2024-01-20 16:44:12 -08:00
Mark McDowall 8921c5d7a0 Fixed: Subtitle title migration when original title is null 2024-01-20 16:43:53 -08:00
Weblate dbbf1a7f58 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Magyar <kochnorbert@icloud.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fordas <fordas15@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-01-20 16:43:40 -08:00
Jendrik Weise 69f99373e5
New: Parse subtitle titles
Closes #5955
2024-01-20 15:19:33 -08:00
Mark McDowall 7be5732a3a
New: Option to disable Email encryption
Closes #6380
2024-01-20 15:18:26 -08:00
Mark McDowall e66ba84fc0 New: Log warning if less than 1 GB free space during update
Closes #6385
2024-01-20 15:18:06 -08:00
Mark McDowall c0b30a5028 Fixed: Series poster view on mobile devices
Closes #6387
2024-01-20 15:17:55 -08:00
Bogdan 3cf4d2907e Transpile logical assignment operators with babel 2024-01-20 15:17:42 -08:00
Weblate ae96ebca57 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Bastián Quezada <baskezada@gmail.com>
Co-authored-by: Blair Noctis <fqmxz5hyfba7ft85@neon.casa>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: Deleted User <noreply+2593@weblate.org>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Julian Baquero <julian-baquero@upc.edu.co>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: MaddionMax <kovacs.tamas@ius.hu>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: brn <barantsenkul@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-01-20 15:17:33 -08:00
Mark McDowall d336aaf3f0 Fixed: Don't clone indexer API Key
Closes #6265
2024-01-19 21:30:34 -08:00
bakerboy448 ec40bc6eea
Improve Release Title Custom Format debugging
Towards #5598
2024-01-19 21:30:24 -08:00
Mark McDowall 75bb34afaa Bump version to 4.0.1 2024-01-19 19:26:38 -08:00
Stevie Robinson de1cc25c90 Translate backend: Autotagging + CF specs, Metadata + ImportLists
Signed-off-by: Stevie Robinson <stevie.robinson@gmail.com>
2024-01-18 21:47:03 -08:00
Mark McDowall 9884f6f282
Fixed: Icons on full color calendar events
Closes #6331
2024-01-19 00:43:51 -05:00
Qstick e792db4d33 New: Improve All Series call by using dictionary for stats iteration 2024-01-18 21:43:34 -08:00
Bogdan 2dbf5b5a71 Check Content-Type in FileList parser 2024-01-18 21:43:17 -08:00
Stevie Robinson c6bb6ad878 Round off the seeded ratio when checking for removal candidates
Signed-off-by: Stevie Robinson <stevie.robinson@gmail.com>
2024-01-18 21:43:07 -08:00
Bogdan bfd24da2d9
Fixed: Importing Plex RSS lists with invalid items (#6374) 2024-01-19 00:42:51 -05:00
Stevie Robinson 8dd3b45c90
New: Drop commands table content before postgres migration
Signed-off-by: Stevie Robinson <stevie.robinson@gmail.com>
2024-01-19 00:42:31 -05:00
Stevie Robinson 0b0f21d0ac Update install.sh to not prompt for package installation
Script will exit without input if a prereq package is missing
2024-01-18 21:41:38 -08:00
Sonarr 738f5c58ad Automated API Docs update
ignore-downstream
2024-01-18 21:41:30 -08:00
Weblate 9a7b5bf14e Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Blair Noctis <fqmxz5hyfba7ft85@neon.casa>
Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Petr Vojar <vojar.petr@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: crayon3shawn <crayon3shawn@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_TW/
Translation: Servarr/Sonarr
2024-01-18 21:41:14 -08:00
Mark McDowall e1260d504e Re-enable deploy 2024-01-15 21:55:35 -08:00
Sonarr 736651324f Automated API Docs update
ignore-downstream
2024-01-15 21:55:22 -08:00
Bogdan 489f03441b
Fixed: Filter history by multiple event types 2024-01-16 00:54:27 -05:00
Stevie Robinson e4b5d559df
Sort Custom Filters
Closes #6334
2024-01-16 00:53:21 -05:00
Stevie Robinson 07fbb0d1f4
Add missing translation keys from Indexer Settings
Signed-off-by: Stevie Robinson <stevie.robinson@gmail.com>
2024-01-16 00:52:55 -05:00
Stevie Robinson 666455f9b1
New: Add 'zhtw' and 'yue' language codes as Chinese language
Closes #6363
2024-01-16 00:52:40 -05:00
Bogdan 091449d9bf Throw download as failed for invalid magnet links 2024-01-15 21:51:17 -08:00
Qstick f87a66fcba Improved http timeout handling 2024-01-15 21:51:02 -08:00
Blair Noctis 1bba7e177b
Fixed: Improve help text for download client priority
Closes #6270
2024-01-16 00:50:25 -05:00
Rubicj 57445bbe57
New: Added column in Queue
Closes #6270
2024-01-16 00:28:28 -05:00
Qstick ec91142c85 Fixed: Only use frames for Primary video stream for analysis
(cherry picked from commit 581828b0dcfcd4aa1ae581b899f812071457c9ca)
2024-01-15 23:03:46 -06:00
Mark McDowall 0685896ed8 Fixed: Prevent selecting season or episode in Manual Import if series or episode is not selected
Closes #6354
2024-01-14 12:37:33 -08:00
Mark McDowall ee0048c768 Fixed: Reprocessing multi-language file in Manual Import 2024-01-14 12:37:33 -08:00
bakerboy448 16e5ffa467
Update logging to indicate a hardlink is being attempted 2024-01-14 15:16:53 -05:00
Mark McDowall 431c66c7c1 Update PR Template
[skip ci]
2024-01-14 12:12:30 -08:00
Mark McDowall 57bd6539c8
Update bug_report.yml
[skip ci]
2024-01-14 12:44:37 -05:00
Mark McDowall 637cb1711d
Update PR template
[skip ci]
2024-01-14 12:43:14 -05:00
Weblate 7e011df2b2 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Daniele Prevedello <dprevedello86@gmail.com>
Co-authored-by: DimitriDR <dimitridroeck@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Watashi <drazy24@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: hansaudun <hans@n5.no>
Co-authored-by: hcharbonnier <hugues.charbonnier@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-01-13 17:07:06 -08:00
Stevie Robinson 79907c881c Add: New icon for deleted episodes with status missing from disk
Signed-off-by: Stevie Robinson <stevie.robinson@gmail.com>
2024-01-13 16:35:13 -08:00
Mark McDowall db6a627983 Don't write global.json while updating API docs 2024-01-13 16:33:17 -08:00
Weblate d76a489be6 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Watashi <drazy24@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-01-13 16:33:01 -08:00
Mark McDowall fd17df0dd0 New: Optional directory setting for Aria2
Closes #6343
2024-01-13 16:32:09 -08:00
Mark McDowall 53cf530893 Fixed: Series posters flickering when width changes repeatedly
Closes #6311
2024-01-13 16:31:58 -08:00
Mark McDowall 91f33c670e Fix post-build test reporting and report summary 2024-01-13 11:32:01 -08:00
Mark McDowall d322619733 Temporarily disable deploy 2024-01-12 17:45:32 -08:00
Mark McDowall 1182798929 Actually run Windows integration tests 2024-01-12 17:45:32 -08:00
Mark McDowall ad0249c7db Use publish-unit-test-result-action for test result reporting 2024-01-12 17:45:32 -08:00
Mark McDowall 3259e6dc10 Download artifacts for Publish Test Results workflow 2024-01-12 17:45:32 -08:00
Mark McDowall 541d3307e1 Don't use TestCase for single test 2024-01-12 17:45:32 -08:00
Mark McDowall ad60352bae Ignore CA1825 2024-01-12 17:45:32 -08:00
Mark McDowall 02e051580c
Separate publishing of test results for PRs from forks 2024-01-12 11:56:45 -05:00
Bogdan b8964f8bba
Fixed: Improve torrent blocklist matching 2024-01-11 19:39:27 -05:00
Stevie Robinson 53f6f64448 Update bug_report.yml 2024-01-11 16:38:20 -08:00
Bogdan 9044ecc59b Fixed: Release source for release/push 2024-01-11 16:38:11 -08:00
Bogdan eff0408b0e Fixed: Persist release source for pending releases 2024-01-11 16:38:04 -08:00
ilike2burnthing fef525ddb8
Remove unsupported pagination for Nyaa 2024-01-11 19:37:31 -05:00
ilike2burnthing 3454f1c9ed
Remove dead Torznab presets 2024-01-11 19:37:18 -05:00
Andrejs Ķīlis 21666df8f1 Fixed: Latvian and Russian language parsing
Added proper support for Latvian with test cases I have encountered in the wild and fixed a case where Russian is not recognized (RU instead of RUS).
2024-01-11 16:36:55 -08:00
Bogdan fd58e9671c Remove unused LanguagesBelowCutoff 2024-01-11 16:36:27 -08:00
Bogdan 8971ac2e14
Fixed: Series end date is UTC 2024-01-11 19:36:18 -05:00
Stevie Robinson a99fc6fa66
Exit Debian Install Script when running from install dir 2024-01-11 19:33:37 -05:00
Stevie Robinson 587b600d6c
Fix Missing HelpText Translation Keys 2024-01-11 19:33:01 -05:00
Gabriel Patzleiner 06b86d4fad
New: Parse German Dual Language and Multi-language releases 2024-01-11 19:32:40 -05:00
Mark McDowall 6b92b556bb Build and publish using GitHub actions 2024-01-11 16:31:45 -08:00
Weblate a49cf72869 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: DimitriDR <dimitridroeck@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: bianying1 <luzhenn@gmail.com>
Co-authored-by: liangyi <994302767@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-01-11 16:31:25 -08:00
Weblate 070919a7e6 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dani Talens <databio@gmail.com>
Co-authored-by: DimitriDR <dimitridroeck@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: JJonttuu <oikeaihminen@protonmail.com>
Co-authored-by: Mario Rodriguez <mario2423@gmail.com>
Co-authored-by: Norbi <kovinor123@gmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: 饶志华 <879467666@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2024-01-05 18:06:05 -06:00
Stevie Robinson 8f7f23c938
Translate Notifications settings 2024-01-03 12:41:16 -08:00
Bogdan cd2ce34f10 New: Custom formats in episode history
Details part of actions in episode history
2024-01-03 12:39:40 -08:00
Mark McDowall d172f2e6d9 Remove version.sh 2024-01-03 12:39:02 -08:00
Mark McDowall 46517e4397 install.sh: Use /dev/tty for user input 2024-01-03 12:39:02 -08:00
Stevie Robinson b7ce5a8318 Bump packageVersions 2024-01-03 12:38:55 -08:00
Stevie Robinson 87d0a6bdf6 Bump MacOS Major Version 2024-01-03 12:38:55 -08:00
Bogdan b6ffe935e8
Fixed: Don't monitor last season if series is ended 2024-01-03 12:38:24 -08:00
Bogdan 0673374e97 New: Watch list sorting and rate limit for Trakt Import Lists 2024-01-03 12:37:20 -08:00
Weblate 84c95f5a9d Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Mario Rodriguez <mario2423@gmail.com>
Co-authored-by: Norbi <kovinor123@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2024-01-03 12:36:23 -08:00
Stevie Robinson 72401759b5
install.sh: Remove UTF8-BOM 2024-01-02 04:24:58 -05:00
Mark McDowall 4e19fec123 Fixed: Disable SSL on start if certificate path is not set 2023-12-31 15:53:52 -08:00
Weblate 5ce98fd83d Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: SunStorm <me@sunstorm.rocks>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: chiral-lab <jan.eltner@googlemail.com>
Co-authored-by: ube <ube@alienautopsy.net>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/sv/
Translation: Servarr/Sonarr
2023-12-30 17:20:32 -08:00
Bogdan bc20ef73bd New: Retry on failed downloads of torrent and nzb files 2023-12-30 16:07:18 -08:00
Bogdan 16d60a6586
Fixed: Show errors when adding Root Folder 2023-12-30 19:07:06 -05:00
Bogdan 0a5200766e Fixed: Ignore empty tags when adding items to Flood 2023-12-30 16:06:28 -08:00
Bogdan be937ec581 New: HDR metadata for Trakt connection 2023-12-30 16:06:17 -08:00
Bogdan 1f82b9fb78 New: Rate limiting for Trakt connection 2023-12-30 16:06:17 -08:00
Bogdan c8a1118679 Simplify mapping in Trakt connection 2023-12-30 16:06:17 -08:00
Stevie Robinson 91053ca51d
New: Add sorting to Manage Indexer and Download Client modals 2023-12-30 19:05:59 -05:00
Bogdan 4085771602
Fixed: Available fields for Discord Manual Interaction Required 2023-12-30 19:05:19 -05:00
Stevie Robinson efb000529b New: Show Proper or Repack tag in interactive search 2023-12-30 16:04:18 -08:00
Mark McDowall 4b22200708 New: Add qBittorrent option for Content Layout
Closes #6213
2023-12-30 16:04:09 -08:00
Stevie Robinson f9148c36db
Remove yes/no check from install.sh 2023-12-30 09:43:15 -08:00
Stevie Robinson 7a82e7b365
Add install.sh script and remove debian package 2023-12-29 18:13:05 -05:00
bakerboy448 65aeb19486
Improve Custom Format compare logging
Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
2023-12-28 15:35:04 -05:00
Weblate f9d9754220 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Aitzol Garmendia <aitzolgarmendia@gmail.com>
Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Koch Norbert <kochnorbert@icloud.com>
Co-authored-by: Nicola <nicola.neri@gmail.com>
Co-authored-by: Pietro Ribeiro <xxb1exuv6@mozmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: chrizl <chrizl@gmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Co-authored-by: slammingdeath <sebastianbrudny97@gmail.com>
Co-authored-by: ηg <jonas.konrath@icloud.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translation: Servarr/Sonarr
2023-12-28 12:34:30 -08:00
Bogdan e291834393 Fixed: Bump media info revision for DV HDR10Plus 2023-12-18 22:54:54 -08:00
Weblate 8ff6354d44 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Andrés Reyes Monge <armonge@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Menno Liefstingh <mennoliefstingh@gmail.com>
Co-authored-by: Michael Schönenberger <muchi94@gmail.com>
Co-authored-by: VisoTC <szlytlyt@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-12-18 22:54:40 -08:00
Mark McDowall 5a3bc49392 Fixed: Imported episodes updating on Calendar
Closes #6240
2023-12-14 17:27:53 -08:00
Bogdan 0cd5bb50bd
Fixed: Undefined statistics and season folder column width on series index 2023-12-14 20:25:36 -05:00
nuxen e4ec065386
New: Parse 'E.N.D' Release Group 2023-12-14 20:24:48 -05:00
Fossil e7224832cf
Updated NZB Finder categories and removed OZnzb 2023-12-14 20:24:17 -05:00
Agneev Mukherjee da9a60691f
Enable browser navigation buttons for PWA 2023-12-14 20:24:09 -05:00
Bogdan 848c03f16a
New: Support for DV HDR10Plus from media info
Co-authored-by: Chad A Simmons <chad.simmons@member.fsf.org>
2023-12-14 20:23:54 -05:00
Bogdan 96cb7c4d5f
Fixed: Handle query limit error and add rate limit for BroadcastheNet
Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2023-12-14 20:23:07 -05:00
Stevie Robinson aa9d25211f
Hide ratings on series page if non existent 2023-12-14 20:22:34 -05:00
Weblate c9a8d32042 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Appoxo <appoxo@appoxo.de>
Co-authored-by: Augusto Poletti <augustpolet@gmail.com>
Co-authored-by: Charlie <zola@zipmail.pw>
Co-authored-by: David Molero <contact@dolvem.com>
Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Dominika Matějková <dominika.matejkova@outlook.cz>
Co-authored-by: Hajiroxx <luypanda@163.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Jurriaan Den Toonder <jur.den.toonder@gmail.com>
Co-authored-by: Patatra <patrice.chevreau@gmail.com>
Co-authored-by: ROSERAT Ugo <roserat.ugo@gmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: SHUAI.W <x@ousui.org>
Co-authored-by: VisoTC <szlytlyt@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Zalhera <tobias.bechen@gmail.com>
Co-authored-by: liimee <git.taaa@fedora.email>
Co-authored-by: ndqnnwg <andydq@foxmail.com>
Co-authored-by: resi23 <x-resistant-x@gmx.de>
Co-authored-by: 米大饭 <1246333567@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/lv/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-12-14 17:22:15 -08:00
Qstick 97ee24507f Fixed: Correctly handle Migration when PG Host has ".db" 2023-12-11 16:43:03 -08:00
Bogdan 4bb9dc78a7 Add missing translation key MonitorNewItems 2023-12-11 16:42:48 -08:00
Bogdan 5e61b413b7 Fix filter type for series' network 2023-12-11 16:42:48 -08:00
Stevie Robinson c6ad2396bb
New: Remove Defunct Boxcar notifications 2023-11-25 15:23:00 -05:00
Stevie Robinson 75420d4a89
Fix missing translation key MonitorNone 2023-11-25 15:22:37 -05:00
Weblate 749d841d3a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2023-11-25 12:20:56 -08:00
Bogdan 4e048bf499 Wrap long lines in description lists 2023-11-19 21:32:06 -08:00
Mark McDowall 65cb1ccafd Fixed force saving provider triggering testing 2023-11-19 21:02:28 -08:00
Mark McDowall d211887050 New: Add more exception release groups
Closes #6146
2023-11-19 20:45:37 -08:00
Mark McDowall 804a5921b3 Fixed: Saving indexer, download client, etc settings 2023-11-19 14:47:30 -08:00
Bogdan 87ecbf39c1
Fixed: Autotagging Genres are case insensitive 2023-11-19 17:47:27 -05:00
Stevie Robinson 174deb2509
Fix missing translation renames 2023-11-19 14:54:18 -05:00
Stevie Robinson 7464c09a46
Update translation keys to be Sonarr specific 2023-11-19 14:34:32 -05:00
Sonarr 0bfa7aed83 Automated API Docs update
ignore-downstream
2023-11-19 11:29:11 -08:00
Weblate dd5a4ad0dc Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Андрей <andryfly7@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translation: Servarr/Sonarr
2023-11-19 11:28:59 -08:00
nexus671 4f57c088a1
Fixed: Plex RSS TMDb ID Lookup 2023-11-19 14:27:31 -05:00
Stevie Robinson 81f3c4bd55
Cleanup appName tokens 2023-11-19 13:56:28 -05:00
Bogdan 366d8a4e78 New: Confirmation before clearing blocklist 2023-11-19 10:55:28 -08:00
Mark McDowall b248163df5 New: Require password confirmation when setting or changing password 2023-11-19 10:54:20 -08:00
Mark McDowall d95660d3c7 Fixed: Disable SSL when migrating from v3
Closes #5979
2023-11-19 10:54:20 -08:00
Mark McDowall c922cc5dc6 Always validate Custom Script path 2023-11-19 10:54:05 -08:00
Stevie Robinson c3dcc542da
Fix translation tokens 2023-11-19 13:53:30 -05:00
Jendrik Weise b4ac495983
New: Custom import scripts can communicate information back 2023-11-19 13:52:37 -05:00
Mark McDowall 3541cd7ba8 Fixed: Blocklisting torrents from indexers that do not provide torrent hash
Closes #6108
2023-11-19 10:50:08 -08:00
Mark McDowall 5d86329c18 Last Season and Recent Episodes
New: Added option to only monitor recent episodes
Fixed: Last Season always monitors the whole season
Closes #6175
2023-11-19 10:49:53 -08:00
Qstick ade40b72bc New: Option to control whether new seasons get monitored automatically
(cherry picked from commit b95a84f6612333d96fcdca083f9c39d96956f3f4)
Closes #5083
2023-11-19 10:49:53 -08:00
Bogdan 5328fb4ab3
New: Additional options for HDBits 2023-11-17 10:25:38 -05:00
Weblate 6ddfd99619 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: kevin8717 <871728422@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-11-17 07:23:21 -08:00
Mark McDowall 812712e284 Rename 'ReturnUrl' to 'returnUrl' for forms auth redirection 2023-11-16 16:35:15 -08:00
Mark McDowall c028222617 New: Support import list lookup by TMDb ID 2023-11-16 16:35:15 -08:00
Mark McDowall 71fd09f162 Don't retest unchanged providers
New: Don't retest connections, indexers, download clients, etc if re-saved with the exact same settings
Closes #6169
2023-11-16 16:35:15 -08:00
bakerboy448 c7d12066bf
Fixed: Logging length of sample file
Closes #6180
2023-11-16 19:32:51 -05:00
Stevie Robinson b76bf37371
Fixed: Custom Format Deletion confirmation message
Closes #6172
2023-11-16 19:31:44 -05:00
Bogdan c3b4126d0c Fixed: Enforce validation warnings when testing providers 2023-11-16 16:30:43 -08:00
Stevie Robinson f205cfabab
Translate Indexers on the backend 2023-11-16 19:30:22 -05:00
Qstick e68b13940d Bump ffprobe to 5.1.4 2023-11-11 11:17:08 -06:00
Stevie Robinson 48b12f5b00
Translate Download Clients on the backend 2023-11-10 11:44:04 -05:00
Bogdan 3d05913534 Fixed: Record status for notifications on tests 2023-11-10 11:43:25 -05:00
Mark McDowall de23182d59 Don't store successful results for invalid providers 2023-11-09 17:08:34 -08:00
Mark McDowall 1e295d81f2 Fixed: Don't do title search when adding series from AniList import list
Closes #6140
2023-11-09 17:08:34 -08:00
Mark McDowall 0fe05fb3a9 Remove extraneous comments/code from migrations 2023-11-09 17:08:34 -08:00
Sonarr 24759b9060 Automated API Docs update
ignore-downstream
2023-11-09 19:52:43 -05:00
Weblate eec862d3ff Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Baptiste Mongin <baptiste.mongin@gmail.com>
Co-authored-by: Francisco Cachado <franciscomcachado@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Javier Parada <jparada@gmail.com>
Co-authored-by: Nesego <nesego@gmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: Ruben Lourenco <ruben.lourenco01@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: bowsefather <husseinali39@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translation: Servarr/Sonarr
2023-11-09 19:52:27 -05:00
Stevie Robinson 2e51b8792d
Fixed: Replacing 'appName' translation token 2023-11-09 19:00:54 -05:00
Bogdan 8c3a0ebaba Fixed: Showing already imported episodes as downloading in Series index 2023-11-09 18:59:29 -05:00
Xetera 10fbc4e25a
New: Parsing of Turkish release names 2023-11-09 18:58:38 -05:00
Collin Heist 6432f310e7
New: Add TvdbId to Webhook Episode payload 2023-11-09 18:57:20 -05:00
Bogdan e4b9086a7a
New: Sort root folders by path 2023-11-09 18:57:04 -05:00
Bogdan 0496e728dc New: Resolve download client by name using 'downloadClient' for pushed releases 2023-11-09 18:56:35 -05:00
Zach Nedwich 0a2090237a
Remove extraneous $1 from translation 2023-11-09 18:56:21 -05:00
Mark McDowall 165e3dbae8 New: Parsing for titles with multiple translated titles separated by '/'
Closes #6137
2023-10-29 16:27:30 -07:00
Mark McDowall d484553b31 New: Support SABnzb's new format for sorters
Closes #6125
2023-10-29 14:19:47 -07:00
Mark McDowall 44d8dbaac8 Fixed: Blocking unknown indexers from pushed releases
Closes #5900
2023-10-29 12:14:02 -07:00
Mark McDowall 58d841c463 Fixed: Searching for series with XEM and TVDB mapping overrides 2023-10-29 11:23:31 -07:00
Bogdan aa8659eecd
Fix full disk releases regex for DVDs at the end of the title 2023-10-29 12:44:42 -04:00
Stevie Robinson 6e2162ebf4
New: Relative path as default Sort order on Manual Import 2023-10-28 17:56:18 -04:00
Weblate fc0b42efd5 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: ID-86 <id86dev@gmail.com>
Co-authored-by: Jordy <prive@jordyhoebergen.nl>
Co-authored-by: LeDaFeEs <leonardo.fonseca85300@gmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: bai0012 <baicongrui@gmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-10-28 14:53:59 -07:00
Sonarr b0cf36a431 Automated API Docs update
ignore-downstream
2023-10-28 14:52:51 -07:00
Bogdan 192eb7b62a
New: Set busy timeout for SQLite 2023-10-28 17:52:30 -04:00
Bogdan ba447c93e3
Fixed: DVDRip/DVDRemux being treated as full disk releases
Closes #6134
2023-10-28 17:52:13 -04:00
Stevie Robinson a5506b09d2
New: Add [SEV] to release group exceptions
Closes #6118
2023-10-28 17:49:52 -04:00
Stevie Robinson cd1d8a3ff0 fix translation token 2023-10-28 14:49:21 -07:00
Bogdan 36ca24e55a Allow 0 as valid value in QualityProfileExistsValidator 2023-10-28 14:48:39 -07:00
Bogdan e53b7f8c94 New: Add Download Client validation for indexers 2023-10-28 14:48:39 -07:00
Bogdan 653aede0b7 Rename instances of Profile to QualityProfile 2023-10-28 14:48:39 -07:00
Bogdan b06d5fb07b Use the correct property for quality profile on overview 2023-10-28 14:48:26 -07:00
Bogdan f2cae4e2b2 Improve UI notice for delayed queue items 2023-10-28 14:47:50 -07:00
Bogdan dc099a77ca Set proper default props for Queue details and status 2023-10-28 14:47:50 -07:00
Bogdan a171132f98 Fix typo in visible for Queue size 2023-10-28 14:47:50 -07:00
Bogdan 43ed7730f0 Add default value for Queue count to avoid failed prop type 2023-10-28 14:47:50 -07:00
Bogdan 3a99c2781b Remove duplicated condition in history controller 2023-10-28 14:47:50 -07:00
Bogdan 910c403d84 Add translations to history and queue custom filters 2023-10-28 14:47:50 -07:00
Bogdan 6027041a4f Sort series by name in filter builder 2023-10-28 14:47:50 -07:00
Bogdan e9bb1d52a7 Sort Custom Formats by name 2023-10-28 14:46:00 -07:00
Bogdan b183743d9f
Fixed: Avoid import loop for already imported episodes part of season packs
Closes #6075
2023-10-28 17:45:47 -04:00
Stevie Robinson 59ea524e0c Use Diacritical.Net library for TitleFirstCharacter token 2023-10-28 14:45:10 -07:00
Stevie Robinson 99b34c2065
Fix Localization test after translation changes 2023-10-27 09:53:05 -04:00
Qstick 5d90d68bf7
Fix translation for Search for Missing option 2023-10-20 22:14:04 -05:00
Weblate b5e2b32915 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Daniel Suárez Bobes <danielsbobes@gmail.com>
Co-authored-by: DavidHenryThoreau <sorau@protonmail.com>
Co-authored-by: Dlgeri123 <bornemiszageri@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Ruben Lourenco <ruben.lourenco01@gmail.com>
Co-authored-by: Timo <Tclemens@live.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: bai0012 <baicongrui@gmail.com>
Co-authored-by: jianl <jianjianfengyun@126.com>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-10-20 19:29:48 -05:00
Daniel Martin Gonzalez a131c88d5f
New: Add Watched filter type to Trakt User Import List 2023-10-17 02:58:05 -04:00
Stevie Robinson 03f5174a4b
Fixed: Reduce font size for series title on series details
Closes #6087
2023-10-17 02:55:48 -04:00
Stevie Robinson 0219f84789
Fixed: Has Missing Season not applying false condition 2023-10-17 02:54:39 -04:00
Bogdan e8a47b4d0b
New: Support for IMDb ID in Plex Watchlist RSS
Closes #6105
2023-10-17 02:52:59 -04:00
Mark McDowall 2fe8f3084c New: History custom filters
Closes #2974
2023-10-16 23:52:04 -07:00
Mark McDowall e357d17b18 New: Queue custom filters 2023-10-16 23:52:04 -07:00
Mark McDowall fd789343b5 Cleanup Calendar custom filters 2023-10-16 23:52:04 -07:00
Mark McDowall 11f96c3104
Use named tokens for backend translations
Closes #6051
2023-10-17 02:51:00 -04:00
Bogdan 41ed300899
Fixed: Ignore case when cleansing announce URLs
Closes #6047
2023-10-17 02:50:23 -04:00
bakerboy448 7b31287fc4
Fixed: Re-run Removed Series health check after series is deleted 2023-10-17 02:50:08 -04:00
scampower3 ec8da1c7de
New: Add "enddate" tag to Kodi/Jellyfin series metadata 2023-10-17 02:49:22 -04:00
Mark McDowall 076aaba908 Fixed: End year displayed on series details
Closes #6067
2023-10-10 06:58:16 -07:00
Mark McDowall df2e867528 Fixed: Reject full DVD disk releases
Closes #5975
2023-10-10 06:58:16 -07:00
Stevie Robinson 81aaf00a4c
New: Add additional CleanTitle tokens and re-order options
Closes #6066
2023-10-10 09:58:03 -04:00
Bogdan 3ade52fc90
Fixed: Wanted Missing showing Unmonitored episodes
Closes #6084
2023-10-10 09:56:35 -04:00
Sonarr 5bceacb30e Automated API Docs update
ignore-downstream
2023-10-09 22:15:38 -07:00
Mark McDowall 95b389a948 Fix previous airing test 2023-10-09 22:13:00 -07:00
Mark McDowall 78b39bd2fe Log executing health check
Towards #6076
2023-10-09 21:00:05 -07:00
Mark McDowall 4b9baddccd Fixed: Only use monitored episodes for previous/next airing
Closes #6068
2023-10-09 20:41:46 -07:00
Mark McDowall 87e0a7983a New: Download client option for redownloading failed releases from Interactive Search
Closes #5580
2023-10-09 20:41:46 -07:00
Mark McDowall 113b0864b8 New: Sort episodes on series details page
Closes #  4558
2023-10-09 20:41:46 -07:00
Mark McDowall db15a03c1e New: Import List option to search for missing episodes
Close #5882
2023-10-09 20:41:45 -07:00
Bogdan 44eb729ccc Fixed: Avoid logging evaluations when not using any Remote Path Mappings 2023-10-09 20:40:33 -07:00
Bogdan 6de3e7c950 New: Auto tag based on series quality profile 2023-10-09 20:40:22 -07:00
Bogdan a26df9e9af Prevent NullRef for cases when media covers have nullable urls 2023-10-09 20:40:13 -07:00
Stevie Robinson 8c07f0d3d1
New: Additional tooltips for icon buttons 2023-10-09 23:40:00 -04:00
Stevie Robinson 732c2fe12f
Fixed: Parsing Spanish releases 2023-10-09 23:39:26 -04:00
Bogdan 4ffa1816bd Add status test all button for IndexerLongTermStatusCheck 2023-10-09 20:38:59 -07:00
Stevie Robinson b3c691859a
Fixed: Cleanup First Character in Title when using 'TitleFirstCharacter'
Closes #6055
2023-10-09 23:38:49 -04:00
Mark McDowall bfaa7291e1
Paging params in API docs
Closes #6003
2023-10-09 23:37:31 -04:00
Weblate 9f3915d4ad Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Dimitri <dimitridroeck@gmail.com>
Co-authored-by: Florian <sephrat.flo@gmail.com>
Co-authored-by: Garkus98 <ivan12061998@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: He Zhu <zhuhe202@qq.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: blankhang <blankhang@gmail.com>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-10-09 20:37:07 -07:00
Mark McDowall b4ef873cc3 Fixed: Treat season packs with volume as partial season packs 2023-09-30 11:59:18 -07:00
Stevie Robinson 33b87acabf Fixed: qBittorent history retention to allow at least 14 days seeding 2023-09-30 11:58:34 -07:00
Stevie Robinson e611e6c1ed Add Translated + Sponsor Badges to README.md 2023-09-30 11:58:27 -07:00
Weblate feee85957f Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
Co-authored-by: mr cmuc <github@nextcos.de>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translation: Servarr/Sonarr
2023-09-30 11:58:18 -07:00
Mark McDowall 35365665cf Fixed: Completed downloads in Qbit missing import path 2023-09-27 12:06:30 -07:00
bakerboy448 583eb52ddc
Fixed: Only apply remote path mappings for completed items in Qbit 2023-09-27 10:50:06 -04:00
Stevie Robinson d7ca3490a8 New: Year custom filter in Series Index 2023-09-27 07:48:29 -07:00
Stevie Robinson a3938d8e02
Fixed: SABnzbd history retention to allow at least 14 days
Closes #6044
2023-09-27 10:48:15 -04:00
Bogdan 3620ad2517 Fix typo for Romanian regex group
ignore-downstream
2023-09-27 07:47:38 -07:00
Bogdan a1ea7accb3 Avoid returning null in static resource mapper Task 2023-09-27 07:47:30 -07:00
Weblate 0544011177 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Daghriry <mdaghriri@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Jaspils <jasperkemper@gmail.com>
Co-authored-by: SKAL <sir_kalot@yahoo.it>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-09-27 07:47:19 -07:00
Bogdan c7824bb593
Fixed: Skip parsing releases without title
Closes #6030
2023-09-19 00:05:28 -04:00
Bogdan d8633b9688 Preserve the protocol for fanart images 2023-09-18 21:02:05 -07:00
Mark McDowall 07f816ffb1 Fixed: Pushed releases not being properly rejected 2023-09-18 20:59:06 -07:00
Weblate 11deefc51d Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translation: Servarr/Sonarr
2023-09-18 00:11:09 -07:00
Bogdan a2f16bddfd Preserve the protocol in Series Image 2023-09-18 00:09:25 -07:00
Qstick f2b0fc946e
Fixed: Show correct error on unauthorized caps call 2023-09-18 00:09:12 -07:00
Stevie Robinson 7f2cd8a0e9 Add health check for dl clients removing completed downloads + enable for sab and qbit 2023-09-18 00:08:24 -07:00
Mark McDowall 5eb420bbe1 New: Don't treat 400 responses from Notifiarr as errors
Closes #5953
2023-09-17 23:56:17 -07:00
Mark McDowall 32e1ae2f64 Fixed: Don't allow quality profile to be created without all qualities
Closes #6005
2023-09-17 23:45:31 -07:00
Mark McDowall 5ff254b646 Fixed: Skip free space check only applies during import
Closes #5951
2023-09-17 23:27:44 -07:00
Mark McDowall fa5bfc3742 New: Optional 'downloadClientId' for pushed releases
Closes #6024
2023-09-17 23:25:00 -07:00
Mark McDowall 9a1022386a Fixed: Don't try to create metadata images if source files doesn't exist
Closes #6015
2023-09-17 23:25:00 -07:00
Herve Lauwerier a4ba3ea244 Multiple Translations updated by Weblate
Translation: Servarr/Sonarr
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
(cherry picked from commit aa8339e6c09182b65ed6e0497eb0fcf9a5abbea9)
2023-09-17 20:07:01 -05:00
Havok Dan c034d50ff3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.0% (1471 of 1485 strings)

Translation: Servarr/Sonarr
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
(cherry picked from commit 3bf0f8ad5b1b05596f1b04f8963be2c5a9da9493)
2023-09-17 19:55:58 -05:00
Bogdan c1d9187bb6 Log exceptions for failed fetches in Custom and Sonarr import lists
Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2023-09-17 17:17:32 -07:00
Bogdan 82d586e701 Use await on reading the response content 2023-09-17 17:17:04 -07:00
Bogdan ad1f185330 Use async requests for media cover proxy 2023-09-17 17:12:58 -07:00
Qstick ddabe66262 Use variable for App name in translations 2023-09-17 17:12:29 -07:00
Bogdan 60f18249b0
Fixed: Ignore inaccessible mount points 2023-09-13 21:06:08 -04:00
Weblate 7593d4e370 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Akashi2020 <dieux02400@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: He Zhu <zhuhe202@qq.com>
Co-authored-by: Qstick <qstick@gmail.com>
Co-authored-by: Richard de Souza Leite <rs9010482@gmail.com>
Co-authored-by: Shiessis <shiessis@gmail.com>
Co-authored-by: Ulna <ulnasensei@proton.me>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: leotpp <yangdom_li@126.com>
Co-authored-by: volrod64 <sebsogamer@gmail.com>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-09-13 18:05:26 -07:00
Bogdan 026327e7a3 Add missing using directive in HealthCheckServiceFixture 2023-09-11 12:40:27 -07:00
Mark McDowall 0abb4ceb26 Fixed: More restrictive finale guessing 2023-09-10 15:25:15 -07:00
Mark McDowall bb7b2808e2 Mock debouncer for testing 2023-09-10 15:25:15 -07:00
Mark McDowall 2a241294b5 Fixed: Parsing of multiple languages from Newznab/Torznab indexer releases
Closes #6004
2023-09-10 15:25:15 -07:00
Denis Gheorghescu 5f09f2b25f
New: Pushcut notifications 2023-09-10 16:09:15 -04:00
Mark McDowall c0e54773e2 Fixed: Duplicate notifications for failed health checks
Closes #4462
2023-09-10 13:07:57 -07:00
Mark McDowall 809788eb2e Map Clearlogo images to cover type 2023-09-10 13:05:41 -07:00
Mark McDowall 40a71d65ec Sonarr not Radarr 2023-09-08 07:34:22 -07:00
Mark McDowall 76f5b26322 Fixed: Windows Installer hanging on removing previous service 2023-09-07 22:00:39 -07:00
Bogdan 060be6177a
Fixed: macOS version detection 2023-09-07 20:12:46 -04:00
Bogdan 1b3ff64cc5
Fixed: Calculating seed time for qBittorrent 2023-09-07 20:12:20 -04:00
Stevie Robinson 0128dca5ac Fix relative imports for Components and Utilities 2023-09-07 17:11:42 -07:00
Weblate a63e787220 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: DavidJares <david.jares@me.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Kevin Orel Edry <techg9@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: 宿命 <331874545@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-09-07 17:11:30 -07:00
Bogdan 447d8cfbb9 Migrate to merged proposals now included in babel/present-env
Bump core-js too.
2023-09-04 10:30:10 -07:00
Bogdan 828b8e0fe4 Bump dotnet to 6.0.21 2023-09-04 10:30:01 -07:00
Stevie Robinson c39902e58d
Fixed: TBA airing network label 2023-09-04 13:29:34 -04:00
Bogdan 229a4bba05
Use not allowed cursor for disabled select options 2023-09-04 13:29:03 -04:00
Stevie Robinson 3f0e8ce863
Translate Frontend Utilities 2023-09-04 13:28:46 -04:00
Mark McDowall faecdc855f New: Server pushable health checks
Closes #4116
2023-09-01 17:10:07 -07:00
Mark McDowall 276352dda4 Fixed indexer copy translation 2023-09-01 14:36:16 -07:00
Stevie Robinson e04f36186b translate frontend wanted 2023-09-01 14:36:15 -07:00
Weblate a0c2d420c7 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: He Zhu <zhuhe202@qq.com>
Co-authored-by: monopolo11 <bernardorn21@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-08-31 17:50:03 -07:00
Stevie Robinson d31fcbb2df
Translate Frontend Store 2023-08-31 20:49:38 -04:00
Bogdan 467ce70291
Fixed: Increase timeout when downloading updates 2023-08-31 20:49:24 -04:00
randomllama b76de3987b
New: Add Series Status to Kodi .nfo
Closes #5980
2023-08-31 20:48:56 -04:00
Bogdan 6394b3253a
Fixed: Showing Grab ID in history details modal 2023-08-31 20:48:23 -04:00
owine dbb07e2cf6 Add Database to Bug Report template 2023-08-31 17:47:47 -07:00
Stevie Robinson 4c72017412
Fixed: Fallback to English translations if invalid UI language in config 2023-08-31 20:47:38 -04:00
Stevie Robinson c123596c68
Translate frontend series pages 2023-08-31 20:47:17 -04:00
Bogdan 33c52a7037
Fixed: User check in Authentication Required modal 2023-08-29 16:13:50 -04:00
Mark McDowall 610cc91689 NzbDrone -> Sonarr 2023-08-28 21:51:55 -07:00
Mark McDowall 08939f2fb4 Fixed: Auto Tag required not showing in the UI correctly
Closes #5970
2023-08-28 21:51:55 -07:00
Weblate 7180a002cf Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Albert <zuozl1992@foxmail.com>
Co-authored-by: AlexR-sf <omg.portal.supp@gmail.com>
Co-authored-by: ChewyGlitter <lulu3dddsss@gmail.com>
Co-authored-by: DavidJares <david.jares@me.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: He Zhu <zhuhe202@qq.com>
Co-authored-by: Renan da Mota Ciciliato <renanciciliato@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: brokje1988 <brokje1988@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-08-28 21:51:28 -07:00
Bogdan 340740377e Improve messaging in Authentication Required modal
Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2023-08-28 19:29:07 -07:00
Bogdan 87b3a305e9
Fixed: 'includeSeasonImages' parameter to get single series from API
Closes #5971
2023-08-28 19:28:56 -07:00
Bogdan f521942301 Fix download tooltip in interactive search 2023-08-28 19:28:14 -07:00
Bogdan 2e9dbfd382 Return original token when missing from translation 2023-08-28 19:28:08 -07:00
Stevie Robinson ce4ac75941
Fix missing translations and correct some keys 2023-08-28 19:27:47 -07:00
Bogdan 36c7c79b9e Remove duplicate Language interface 2023-08-28 19:27:27 -07:00
Stevie Robinson 936ef9f461
Add info box under health messages
Closes #5958
2023-08-28 19:27:15 -07:00
Bogdan ec9b29e364
New: Add more information to Select Series Modal
Co-authored-by: Qstick <qstick@gmail.com>
2023-08-28 19:26:38 -07:00
Bogdan dc6204d377 Fix translations and default values in Interactive Search 2023-08-28 19:26:15 -07:00
Bogdan 5a7f42a63e Prevent health checks warnings for disabled notifications 2023-08-22 18:54:47 -07:00
Weblate 2a9883ade0 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: AlexR-sf <omg.portal.supp@gmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Renan da Mota Ciciliato <renanciciliato@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: deepserket <deepserket@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translation: Servarr/Sonarr
2023-08-22 18:54:33 -07:00
Qstick 7986488c6d
Fixed: Ignore case when comparing torrent infohash 2023-08-20 15:25:50 -05:00
Mark McDowall fc6ac3ddf1 Fixed: Allow Min/Max age to be the same for year auto tagging 2023-08-20 11:16:44 -07:00
Mark McDowall 7be22af865 New: Auto tag based on series status
Closes #5944
2023-08-20 11:16:44 -07:00
Weblate c0d53671da Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: David Molero <contact@dolvem.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: matt <diabolino7@pm.me>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2023-08-20 13:02:00 -05:00
Mark McDowall 5411863f6a Fixed: Unknown audio language appearing as 'root'
Closes #5602
2023-08-20 00:34:57 -07:00
Mark McDowall 8fbbe21d81 Fixed: Invalid audio language leading to UI error
Closes #5702
2023-08-20 00:34:57 -07:00
Mark McDowall 0274778679 Fixed: Don't reimport the same file from the same release unless grabbed again
Closes #5625
2023-08-20 00:34:57 -07:00
Stevie Robinson 866fbc7f09 Translate Frontend Organize + Rename modal
including changing SeasonNumber component to formatSeason function
2023-08-19 17:03:00 -07:00
Bogdan 0feee19146 New: Async HttpClient 2023-08-19 17:02:48 -07:00
Bogdan 78593f428a New: Use HTTP/2 in HttpClient 2023-08-19 17:02:48 -07:00
Stevie Robinson be24fab897 tweak customformats check logic 2023-08-19 13:53:19 -07:00
Stevie Robinson c14fd2b4a3 Translate Frontend Parse modal 2023-08-19 13:53:19 -07:00
Jendrik Weise 2166e4dce4 Prevent exception when renaming after script import 2023-08-19 13:50:33 -07:00
Sonarr 1273656c8e Automated API Docs update
ignore-downstream
2023-08-19 13:49:18 -07:00
Mark McDowall b271b3b694 Fix tests for ImportListSyncService 2023-08-19 10:52:39 -07:00
Mark McDowall 311cd66fcd New: Show midseason and other finales in episode list
Closes #5719
2023-08-19 01:36:37 -07:00
Sonarr aceaaa10e1 Automated API Docs update
ignore-downstream
2023-08-19 00:23:13 -07:00
Mark McDowall 7f5ddff568 Fixed: Allow decimals for Custom Format size
Closes #5809
2023-08-19 00:14:59 -07:00
Mark McDowall 566fae9d58 New: Success check mark on blue buttons is now white instead of green 2023-08-19 00:14:59 -07:00
Mark McDowall 7be4840f02 New: Less logging when no import lists are enabled
Closes #5927
2023-08-19 00:14:59 -07:00
Stevie Robinson d8f3d7d3ea
Add info box to Remote Path Mappings Settings 2023-08-19 01:33:57 -04:00
Stevie Robinson 1bcef1b4a5 Fix Typo in QualitySource Enum 2023-08-18 22:33:31 -07:00
Mark McDowall b20e247feb
New: Parse language tags from existing subtitles files
Closes #5890
2023-08-19 01:32:54 -04:00
Mark McDowall d05cb40088 Fixed: Ignore IOException deleting download folder after import
Closes #5937
2023-08-18 17:11:55 -07:00
Mark McDowall 8aa872edf4 New: Status message when downloading metadata in qBittorrent
Closes #5940
2023-08-18 17:11:55 -07:00
Stevie Robinson efca704388 Translate Frontend InteractiveSearch 2023-08-17 21:58:45 -07:00
Bogdan 78d4dee461
Replace docker detection for cgroup v2 2023-08-18 00:58:34 -04:00
Mark McDowall d493f8762f Fixed: Hidden files being ignored 2023-08-17 21:21:46 -07:00
Mark McDowall d5c6faaf45 Fixed: Files in releases that span multiple TVDB seasons not automatically imported
Closes #5920
2023-08-17 21:14:09 -07:00
Bogdan cb27b05a6c Fix health link and add translations for notifications status 2023-08-14 19:44:54 -05:00
Qstick c281a7818a Cleanup other provider status code 2023-08-13 23:36:03 -05:00
Qstick e354580172 New: Notifications (Connect) Status 2023-08-13 23:36:03 -05:00
Stevie Robinson 060b66aa39
Add translations to frontend/InteractiveImport 2023-08-13 19:28:16 -04:00
Bogdan 16d95ea6bf
New: Default name when adding providers 2023-08-13 19:27:59 -04:00
Xabis 465a584486
New: AniList Import List 2023-08-13 19:26:03 -04:00
Stevie Robinson efd19b6a6d
Translation fixes for delete confirmations 2023-08-13 17:05:17 -04:00
Stevie Robinson e777b70184
Translate Frontend Components, Episode and Helpers 2023-08-13 17:04:18 -04:00
Stevie Robinson 074aa6f445
Translate Updated and Connection Lost Modals in frontend 2023-08-13 17:03:52 -04:00
Bogdan cc538c4b2d
Show warning when using the docker update mechanism 2023-08-13 17:03:18 -04:00
Weblate 6a0dc72808 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: David Molero <contact@dolvem.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: matt <diabolino7@pm.me>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translation: Servarr/Sonarr
2023-08-13 13:40:09 -07:00
Qstick 3b3bb5971c Fixed: Tag details query broken for Postgres 2023-08-13 13:26:05 -05:00
Mark McDowall 2a7964bc16 New: Auto tag series based on Original Language
Closes #5908
2023-08-13 00:26:37 -07:00
Mark McDowall c1442535b0 New: Parse episode numbers followed by '.5' as specials
Closes #5893
2023-08-12 23:37:37 -07:00
Stevie Robinson 6245e8a552
Revert translations on defaultProps for QueueStatus.js 2023-08-12 20:17:50 -07:00
Stevie Robinson bf43453c04 Translate Calendar Frontend 2023-08-12 20:05:44 -07:00
Qstick b1d12b8ee9 Correctly close connections in UnavailablePendingReleases housekeeper
Regression from PG
2023-08-12 20:59:21 -05:00
Weblate c423d1e7f8 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Albert <zuozl1992@foxmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Ivan Mazzoli <dreadtank27@gmail.com>
Co-authored-by: Nir Israel Hen <nirisraelh@gmail.com>
Co-authored-by: PerOHaugstad <perohaugstad@gmail.com>
Co-authored-by: TrojanHorsePower <alaa_alahmad@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: byakurau <byakurau1@gmail.com>
Co-authored-by: jack-mil <mcrajajack@gmail.com>
Co-authored-by: matt <diabolino7@pm.me>
Co-authored-by: wilfriedarma <wilfriedarma.collet@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
(cherry picked from commit 1e7233ca8f0fd611b9ed1441b71072269b9d5aa9)
2023-08-12 13:29:28 -05:00
Mark McDowall 9c7fab69fd Fix LocalizationService tests 2023-08-12 00:41:27 -07:00
Sonarr 5cc720184b Automated API Docs update
ignore-downstream
2023-08-12 00:35:05 -07:00
Qstick c57ceac4de Added table identifier to OrderBy to avoid column ambiguity on joins
Co-Authored-By: Richard <1252123+kharenis@users.noreply.github.com>
2023-08-12 00:45:07 -05:00
Robin Dadswell a13011aa49 New: Postgres Database Support
Co-Authored-By: Qstick <376117+Qstick@users.noreply.github.com>
2023-08-12 00:45:07 -05:00
Qstick 69ddd99eb8 New: Improve performance when adding multiple series at once from lists or import 2023-08-11 23:23:26 -05:00
Qstick df6c89ea23 New: Improve performance of DeleteBadMediaCovers housekeeper 2023-08-11 23:23:26 -05:00
Bogdan d8f314ff0e
Add one minute back-off level for all providers 2023-08-12 00:19:27 -04:00
Stevie Robinson 901b6d2084 Fix RemoveHelpTextWarning > RemoveFromDownloadClientHelpTextWarning 2023-08-11 21:18:47 -07:00
Mark McDowall 1ae0dc81f7 New: Add additional logging when renaming extra files
Closes #5890
2023-08-09 17:42:09 -07:00
ttran913 6b533ef2f9
New: Season pack searching with 'Anime Standard Format Search' 2023-08-09 20:13:35 -04:00
Bogdan 77a4ba4925
Detect Docker when using control group v2 2023-08-09 19:48:52 -04:00
Bogdan 366b2b8b52
New: Show successful grabs in Interactive Search with green icon 2023-08-09 19:48:38 -04:00
Bogdan 51dc96cb6e
Specify in the logs what indexer is lacking capabilities 2023-08-09 19:48:06 -04:00
Stevie Robinson 322836e2b3 Translate Activity pages 2023-08-09 16:47:49 -07:00
Stevie Robinson 02b0710814 Translate frontend/AddSeries 2023-08-09 16:47:42 -07:00
Bogdan f6c05d4456 Fixed: Ensure failing providers are marked as failed when testing all 2023-08-09 16:47:29 -07:00
Mark McDowall 6103c023de Fixed: Allow Original Language in Custom Format
Closes #5897
2023-08-09 08:21:41 -07:00
Mark McDowall 5a7e34e291 Fixed: Don't block updates under docker unless configured in package_info 2023-08-08 17:35:13 -07:00
Mark McDowall 65323d5e87 Fixed: Allow Unknown Language in Custom Format
Closes #5886
2023-08-07 18:07:09 -07:00
Stevie Robinson 31fe942c96 Fix Anime Episode Format key 2023-08-06 10:20:58 -05:00
Qstick 03d361f553
Filter user issues from Sentry (#5859) 2023-08-05 13:35:50 -05:00
Stevie Robinson f2c31e92ce Add Translations to Settings Pages 2023-08-04 10:09:10 -07:00
Sonarr 8008610d47 Automated API Docs update
ignore-downstream
2023-08-03 22:26:47 -07:00
Weblate 27e968be20 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Magnus <magnus.fladvad@gmail.com>
Co-authored-by: Stjepan <stjepstjepanovic@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: stormaac <yxc.frank@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translation: Servarr/Sonarr
2023-08-03 22:25:10 -07:00
Mark McDowall e5aa858410 New: Ignore inaccessible files with getting files
Closes #5818
2023-08-03 22:20:25 -07:00
Mark McDowall 60714eb89a Fix agnostic path in test 2023-08-03 21:35:49 -07:00
Mark McDowall 63a911a9a5 Fix GetBestRootFolderPath tests 2023-08-03 20:12:33 -07:00
Mark McDowall 5f72178445 Fixed: UI loading when series or root folder path is for wrong OS 2023-08-03 17:55:55 -07:00
Mark McDowall d581de00c9 Fixed: Duplicate searches when Anime Standard Format Search enabled on indexer and series has multiple aliases 2023-08-03 17:55:55 -07:00
Bogdan 377fce6fe1
New: Health check for indexers with invalid download client 2023-08-03 20:38:53 -04:00
Bogdan 551ea18caf
Simplify column translations 2023-08-03 20:38:24 -04:00
Stevie Robinson 9188a9971b
Update API docs description 2023-08-03 20:38:06 -04:00
Bogdan 5e1b46d2aa Move RootFolderAppState to root AppState 2023-08-03 17:37:43 -07:00
Qstick 45a72c7918 Fixed: Error trying to notify user when process not UserInteractive 2023-08-03 17:37:34 -07:00
Mark McDowall b7a55daa61 Fixed: Parsing of anime season releases with year after season number 2023-08-03 16:36:07 -07:00
Bogdan ab821ccba8 Remove unused how to apply tags translation 2023-08-01 17:15:26 -07:00
Bogdan 7893fdde10 Improve messaging for Interactive Search 2023-08-01 17:15:26 -07:00
Bogdan e8855c312d Add label translations in columns 2023-08-01 17:15:26 -07:00
Bogdan 67dc898797
Fixed: Clear season search results when navigating to another page 2023-08-01 20:02:25 -04:00
Bogdan a5aab810d7 Convert Root Folders to Typescript 2023-08-01 17:01:14 -07:00
Bogdan 8bd91bd86b New: Add Monitored specification to Auto Tagging 2023-08-01 16:54:40 -07:00
Bogdan c69b5fc72a New: Add Year specification to Auto Tagging 2023-08-01 16:54:40 -07:00
Bogdan 97e96537f5 Fixed: Ensure validation for Auto Tagging specifications
Co-authored-by: Qstick <qstick@gmail.com>
2023-08-01 16:54:40 -07:00
Bogdan cd0ea4ce66 Add translations to Auto Tagging
(cherry picked from commit 17a6683dbb7eb914b4732fc310044ec9baa3f141)
2023-08-01 16:54:40 -07:00
Jessica Nguyen cac101bdee
Fixed: Importing additional Anime Types from Simkl
Co-authored-by: iceypotato <nickyjedi@gmail.com>
2023-08-01 19:53:39 -04:00
Weblate 9218962e3c Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Albert <zuozl1992@foxmail.com>
Co-authored-by: Fixer <ygj59783@zslsz.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: SHUAI.W <x@ousui.org>
Co-authored-by: Thirrian <matthiaslantermann@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: aguillement <adrien.guillement@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-07-30 13:49:38 -07:00
Bogdan a57b35a196 Convert store selectors to Typescript 2023-07-30 11:01:50 -07:00
Bogdan 94c6b0fde3
Fixed: Release note text 2023-07-30 14:01:35 -04:00
Michon van Dooren 8e925ac76d
Fixed: Include preferred size in quality definition reset 2023-07-30 12:45:50 -04:00
Sonarr 560779cc1e Automated API Docs update
ignore-downstream
2023-07-28 19:09:28 -07:00
Bogdan b407eba612
Fixed: Ensure failing indexers are marked as failed when testing all 2023-07-28 19:09:06 -07:00
Jendrik Weise ad0dc01cf7
New: Update matching series path in Jellyfin/Emby library
Closes #5826
2023-07-28 18:40:30 -07:00
Bogdan aee8579d18
New: More translations for columns 2023-07-28 18:39:06 -07:00
Bogdan cda9cf726a Fixed: Recalculate Custom Format Score in Manual Import 2023-07-28 18:38:15 -07:00
Bogdan 3937545e15 Rename formatPreferredWordScore to formatCustomFormatScore 2023-07-28 18:38:15 -07:00
Bogdan ae3dd5730e
Fixed: Check only enabled Jackett indexers for '/all' endpoint
Closes #5848
2023-07-28 18:37:21 -07:00
Stevie Robinson e1c5533efa
Extend InlineMarkdown to handle code blocks in backticks 2023-07-28 18:36:06 -07:00
Bogdan 38c717bcef
Dedupe releases based on indexer priority 2023-07-28 18:35:50 -07:00
Bogdan 3d6cf24d7c
Validation for Custom Format specifications
Co-authored-by: Qstick <qstick@gmail.com>
2023-07-28 18:35:27 -07:00
jack-mil 1a4403e0ab
New: Improved Discord add/delete notifications
Closes #5372
2023-07-26 13:38:56 -04:00
Sonarr 14bea16aef Automated API Docs update
ignore-downstream
2023-07-22 17:15:35 -07:00
Weblate 3bcf832676 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translation: Servarr/Sonarr
2023-07-22 17:15:25 -07:00
Bogdan d9786887f3 Add support for deprecated values in field select options 2023-07-22 17:14:28 -07:00
Stevie Robinson 3c17260c72
New: Update naming examples 2023-07-22 20:13:05 -04:00
Jessica Nguyen b779c92200
New: Simkl Anime List integration
Co-authored-by: iceypotato <nickyjedi@gmail.com>
Closes #5635
2023-07-22 20:11:22 -04:00
Bogdan 180153cd84
Fixed: Ensure Monitoring Options resets to No Change 2023-07-22 20:09:57 -04:00
Stevie Robinson 98cd933640
New: Add translation for IRC link 2023-07-22 20:08:11 -04:00
Bogdan 028152d732
New: Add hover background color to Series table 2023-07-22 20:07:20 -04:00
PearsonFlyer d7025a98de New: Ability to skip redownload when marking an item as failed from Activity Queue 2023-07-22 17:03:16 -07:00
Bogdan 38f263931f Cache busting for CSS files 2023-07-22 16:54:06 -07:00
Sonarr dee8820b1f Automated API Docs update
ignore-downstream
2023-07-19 18:35:32 -07:00
Weblate bb67c30dd5 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Deamon1333 <deamon133@gmail.com>
Co-authored-by: Godwhitelight <godwhitelight1@gmail.com>
Co-authored-by: Guy Porat <guyporatmail@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Leliene <lhena.gardien@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: liimee <git.taaa@fedora.email>
Co-authored-by: 君禹渊 <taoxu2870@outlook.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-07-19 18:35:06 -07:00
Bogdan 5f90fdd998
Add missing translations for Reset Quality Definitions modal 2023-07-19 21:22:31 -04:00
Stevie Robinson 93e8ff0ac7
Translate System pages 2023-07-19 21:19:43 -04:00
bakerboy448 360d989cb0
New: Log when testing for matching Remote Path Mapping 2023-07-19 21:11:05 -04:00
Mark McDowall 6d53d2a153 Fixed: Translations for columns 2023-07-19 17:52:33 -07:00
Bogdan 622f820da9 Run API docs workflow on changes to Sonarr.Http 2023-07-19 13:28:45 -07:00
Mark McDowall 73c5ec1da4 Fixed: Improve translation loading 2023-07-18 20:20:27 -07:00
Mark McDowall bb8fed94eb Fix chunk IDs and source map file names 2023-07-18 09:54:59 -07:00
Bogdan 87021fff43
Update translations for How To Apply Tags 2023-07-18 00:07:08 -04:00
Mark McDowall 3ba7e64cd0 Don't generate API docs for InitializeJson 2023-07-17 21:05:23 -07:00
jack-mil 972e140899
New: Show Custom Format score in Manual Import 2023-07-17 23:46:36 -04:00
Bogdan 5e19478266
Fixed: Error when selecting different Quality Profile 2023-07-17 23:45:46 -04:00
Bogdan 67234222e3 Fixed: Improve quality and episode info output in parse result 2023-07-17 20:43:52 -07:00
Bogdan bc374f07ce Use 2 spaces indentation for ts/tsx files 2023-07-17 20:43:52 -07:00
Mark McDowall f0cb5b81f1 UI loading improvements
Fixed: Caching for dynamically loaded JS files
Fixed: Incorrect caching of initialize.js
2023-07-17 20:37:31 -07:00
Mark McDowall f62bc59a73 Fixed: Translating column names 2023-07-15 21:12:59 -07:00
Stevie Robinson c206b92912
Translate sidebar strings 2023-07-15 17:37:31 -04:00
Mark McDowall 35e171f7b1 Fixed: Order of Discord grab notification fields 2023-07-15 14:34:43 -07:00
Sonarr 5b3b346b77 Automated API Docs update
ignore-downstream
2023-07-15 10:36:00 -07:00
Bogdan d6aee683dc
New: Show tooltips with Custom Formats in History and Queue 2023-07-15 10:29:47 -07:00
jack-mil eadd0c4e10
New: Optionally show Custom Format Score for episodes on Series Details 2023-07-15 10:28:38 -07:00
Mark McDowall ef6ff370ba Fixed: Translating static strings 2023-07-15 09:24:24 -07:00
Mark McDowall c1f8c7b17b Use named keys for apply tags help text 2023-07-15 09:16:19 -07:00
Mark McDowall dce6923b00 Fixed: Parsing of anime title that contains multiple 3-digit numbers
Closes #5801
2023-07-14 17:24:05 -07:00
Mark McDowall ad2721dc55 Fixed: Ensure translations are fetched before loading app 2023-07-14 17:24:05 -07:00
Bogdan 3aa3ac90ed Mark empty bulk endpoints as not implemented 2023-07-11 20:10:20 -07:00
Bogdan d1466ba589 Move ApplyTags to own file 2023-07-11 20:10:20 -07:00
Bogdan 0d3e9a2196 Prevent NullRef for empty ids in bulk endpoint 2023-07-11 20:10:20 -07:00
Bogdan 2693ada7de Add missing provider characteristics to bulk endpoint response 2023-07-11 20:10:20 -07:00
Bogdan e641c57ad9 New: Add translations for managing bulk indexers, lists and clients 2023-07-11 20:10:20 -07:00
Bogdan 45336389e6
Fixed: Handling of no results from BTN searches 2023-07-11 20:13:07 -04:00
Jendrik Weise e7bc145084
New: Option to disable images in Kodi Episode Metadata 2023-07-11 20:12:07 -04:00
Bogdan dc302bfaa8
Fixed: Clearing parse testing 2023-07-11 20:10:30 -04:00
Bogdan 9854884ed3
Fixed: Queue not loading when it contains unmapped releases 2023-07-11 12:45:54 -04:00
Mark McDowall c9e3890f73 Fixed: Remove 'Parse Testing' from sidebar 2023-07-11 07:51:03 -07:00
Weblate e87f853199 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Kevin Orel Edry <techg9@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Tacit <1750630216@qq.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_CN/
Translation: Servarr/Sonarr
2023-07-10 22:05:57 -07:00
bakerboy448 9713c36960
New: Clarify path used in Kodi update logging 2023-07-11 01:05:03 -04:00
bakerboy448 d2be869d9c
Import list logging improvements 2023-07-11 01:04:26 -04:00
Mark McDowall 12c3426c95 Fix circular dependency with ScriptImportDecider, TagService and DownloadClientFactory 2023-07-10 22:03:10 -07:00
Mark McDowall 85e2855981 New: Added UI for parsing release names
Closes #5263
2023-07-10 20:54:16 -07:00
Bogdan a77ef187af
Fixed: Anime standard format search on Nyaa 2023-07-10 23:52:27 -04:00
Qstick f6ae9fd6c5
New: Download Client Tags
Closes #402
2023-07-10 23:51:14 -04:00
jack-mil 3a9182b6a6
New: Add Custom Format fields to Discord On Grab notifications
Closes #5769
2023-07-10 23:50:46 -04:00
Jendrik Weise 3f0268b79f
New: Additional info passed in for Script Import and Custom Script 2023-07-10 23:49:49 -04:00
jack-mil a6f2db9139
New: Custom Format Score column in queue
Closes #5780
2023-07-10 23:49:00 -04:00
Qstick 96b7aa6585
Fix error in epic fail handler if console input redirected
Eliminates an unhandled InvalidOperationException and loop causing thousands of sentry errors
2023-07-04 12:58:25 -05:00
Qstick 5638f9c0a1 New: Speed up API add by reworking SeriesExistsValidator 2023-07-03 02:05:35 -05:00
Qstick 51d6fd32dc New: Speed up Series Add by reworking SeriesPathValidator 2023-07-03 02:05:35 -05:00
Weblate 4304d80491 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: BeardedWatermelon <periklis.karantonis@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/el/
Translation: Servarr/Sonarr
2023-07-02 22:38:32 -07:00
Qstick 551edb9e65 Fixed: Allow restore to process backups up to ~500MB 2023-07-02 22:35:24 -07:00
Qstick af8c67a24d Fixed: Correct typing for ImportListExclusions tvdbid column 2023-07-02 22:35:14 -07:00
Bogdan b6f3bcb309 Add ContentSummary to HDBits requests 2023-07-02 22:34:45 -07:00
Bogdan aa2b003167 Create overload for `ToJson()` with Formatting param 2023-07-02 22:34:45 -07:00
Mark McDowall 5c48049702 Fixed: Series added events being sent with series deleted title
Closes #5762
2023-06-27 12:31:24 -07:00
Bogdan dd096e0fda
Fixed: Invalid image URL if Series is missing background image 2023-06-26 18:23:18 -04:00
Weblate bb952e5ddf Multiple Translations updated by Weblate
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Jens <jensmahnke@me.com>
Co-authored-by: KHng0284 <giakhang021109@gmail.com>
Co-authored-by: MoowGlax <matthieu.derouet.pro@gmail.com>
Co-authored-by: Thijs Waalen <contact@thijswaalen.com>
Co-authored-by: Thodoris Kalatzis <teo.kal@hotmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: emacsdias <emacs.dias@gmail.com>
Co-authored-by: liimee <git.taaa@fedora.email>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: splifter <a.strahlke@gmail.com>
Co-authored-by: sutoramon <sutoramon@gmail.com>
Co-authored-by: ted09080037 <ted09080037@gmail.com>
Co-authored-by: Андрей <andryfly7@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/sonarr/zh_TW/
Translation: Servarr/Sonarr
2023-06-26 15:22:19 -07:00
Bogdan 6816767fad Allow array of string as value in EnhancedSelectInput 2023-06-26 15:18:15 -07:00
Bogdan ee843259bc
New: Improve empty list messaging 2023-06-26 18:18:03 -04:00
Sonarr 5184d995ca Automated API Docs update
ignore-downstream
2023-06-24 15:15:19 -05:00
Bogdan 377e5f7fc7
New: Search library by TheTVDB, TV Maze or IMDB IDs 2023-06-20 19:29:15 -07:00
Bogdan 0a05781aca Remove not implemented endpoints from API docs 2023-06-20 19:26:48 -07:00
Bogdan 82919a8ed1 Convert to 'using' declaration in Housekeeping Tasks 2023-06-20 19:26:21 -07:00
Bogdan 9af6d1b9d9 Close database connections in housekeeping tasks
Co-authored-by: ferencmarkizay <ferencmarkizay@gmail.com>
2023-06-20 19:26:21 -07:00
Bogdan b48fe6e633 Prevent NullRef when deleting missing backups
(cherry picked from commit 0ff0fe2e68f3abf7b8e4d6bf0c1e9dee4eb68227)
2023-06-20 19:24:19 -07:00
Bogdan e2f27e0c61
Fixed: Sorting queue by size 2023-06-20 19:16:54 -07:00
Mark McDowall 5601a94016 Add missing imports 2023-06-20 13:02:28 -07:00
Bogdan 1f785dd30d
Show loading errors as Alerts (#5736)
New: Improved page loading errors
2023-06-16 10:49:08 -07:00
Bogdan 059a156f4a Fixed: Treat redirects as errors in Sonarr Import List 2023-06-13 21:03:48 -07:00
Bogdan 19b8fbe13b Require ApiKey for all actions in SonarrImport 2023-06-13 21:03:48 -07:00
Bogdan 2603138975 Update translations 2023-06-13 21:01:32 -07:00
Hayden a6a61a016b
Fixed: Limit Discord embed title length to 256 characters
Co-authored-by: HeyBanditoz <7574664+HeyBanditoz@users.noreply.github.com>
2023-06-13 23:59:51 -04:00
Qstick 11bd764a75 Fixed: Correctly handle 302 and 303 redirects in HttpClient
(cherry picked from commit ed7c5a937f4b50fcdf819e8fe347c8c0bc6bd2e7)
2023-06-13 20:58:30 -07:00
Bogdan 0e07d54ee7 Add HelpTextWarning support in FieldDefinition 2023-06-13 20:55:20 -07:00
Bogdan 0b87280335 Check only clients not in failure status in DownloadClientSortingCheck 2023-06-13 20:54:05 -07:00
Bogdan e5ff4aafa3 Update cleansing rules for RSS TL feed and homedir for Mac 2023-06-13 20:53:20 -07:00
Stevie Robinson 9dc090e15e Update MoreInfo.js with new discord link 2023-06-13 20:52:11 -07:00
bakerboy448 8d8a16225f
Fixed: Handle checkingResumeData state form qBittorrent 2023-06-13 23:50:59 -04:00
Qstick 18716a0051
Update Remote Path Mapping delete modal title 2023-06-12 15:24:06 -04:00
Qstick a8d94773a1 Fixed: Filter series by Tvdb deleted status 2023-06-12 10:07:13 -04:00
Bogdan dd31c913d2 Use more specific styling for kinds in ProgressBar 2023-06-09 15:00:19 -07:00
Zak Saunders d44656bca1 New: Remove Rarbg Indexer due to site shutdown 2023-06-09 14:58:06 -07:00
bakerboy448 3b505d8734
New: Indexer Messaging and Error Improvements 2023-06-09 17:54:04 -04:00
Mark McDowall d606144e00 New: Use major version for installed version on Windows
Closes #5710
2023-06-01 17:46:03 -07:00
Sonarr 474f5f29ca Automated API Docs update
ignore-downstream
2023-05-28 11:46:29 -07:00
Qstick b050e1d2eb Faster tag view in UI for large libraries 2023-05-28 11:08:31 -07:00
Bogdan 48ee1158ad Fixed: Enforce validation warnings 2023-05-28 11:07:40 -07:00
Bogdan 7343616a47 Simplify ShouldHaveApiKey and HasErrors 2023-05-28 11:07:40 -07:00
Qstick efab1b0793 Cleanup react warnings from manage modals 2023-05-28 08:37:39 -05:00
Qstick 593652a84a Fix priority input for provider manage edit modal 2023-05-28 08:37:39 -05:00
Bogdan b06269544c Add minimum length as const in ApiKeyValidationCheck 2023-05-27 17:23:41 -07:00
Bogdan bb97fbc23f Add missing wiki fragments to health checks 2023-05-27 17:23:41 -07:00
Qstick 560a9b63ca New: Translations support for Health Checks
(cherry picked from commit bfc036178487fe0b692f306a53f2a334cdf7f9d5)
2023-05-27 17:23:41 -07:00
Bogdan a22f598b0c Minor improvements in health checks 2023-05-27 17:23:41 -07:00
Bogdan 86a7f7bd54 Deserialize asynchronously in LocalizationService 2023-05-27 17:23:41 -07:00
Bogdan f90bef6934 Fix showing sorting values, add tooltips and translations to SeriesIndexPoster 2023-05-27 16:56:19 -07:00
Bogdan 12374f7f00 Use 'var' instead of explicit type 2023-05-27 16:55:16 -07:00
Bogdan 281add47de Inline 'out' variable declarations 2023-05-27 16:55:16 -07:00
Bogdan 909f2ded6b Standardize variable declaration 2023-05-27 16:55:16 -07:00
Bogdan 6b1e4ef819
Enforce rule IDE0005 on build 2023-05-27 19:53:49 -04:00
Matthew Strapp 8e771f95ad
Fixed: Use relative paths instead of absolute paths for webmanifest 2023-05-27 19:34:48 -04:00
Qstick 73ccab53d5 New: Bulk Manage Import Lists, Indexers, Clients 2023-05-27 18:00:49 -05:00
Qstick 5fd543cf8c Ignore API doc commits downstream
ignore-downstream
2023-05-27 16:51:39 -05:00
bakerboy448 e9bbb0b9ba
Fixed: Webhook notification error messages 2023-05-26 19:45:53 -07:00
bakerboy448 b510201b43
Fixed: A really important spelling mistake 2023-05-26 19:44:32 -07:00
Mark McDowall e273f16c39 Fixed: Strip additional domains from release names 2023-05-26 19:36:50 -07:00
Mark McDowall 49fd9c4462 New: Filter SABnzbd queue by category 2023-05-26 17:14:02 -07:00
Mark McDowall 59f2e5b65d Fixed: Don't log handled exceptions in API
Closes #5690
2023-05-26 17:14:02 -07:00
Bogdan af55e322f1
Fixed: Sorting search releases by language 2023-05-26 16:19:42 -04:00
Sonarr 3ac5edeb09 Automated API Docs update 2023-05-25 10:34:05 -07:00
Mark McDowall f05405fe1c Fixed: Don't rollback file move if destination already exists
Towards #5610
2023-05-22 22:11:17 -07:00
JeWe37 9f1e215120
New: Option to Import via Script
Closes #791
2023-05-22 23:36:17 -04:00
Bogdan 365a6e77a6 Use project name as relative path in builds
(cherry picked from commit fb908e8e1969e633a50ca000c767a998427363b2)
2023-05-22 20:33:57 -07:00
Mark McDowall 349f7cf4c9 Rename Clearart to Clearlogo, use png for Clearlogo 2023-05-22 10:32:03 -07:00
Mark McDowall aecc8295c8 Fixed: Don't download unknown artwork 2023-05-22 09:00:36 -07:00
Stevie Robinson f2ddd4757c
Fixed: Parsing Vyndros as release group 2023-05-21 17:05:48 -04:00
Stevie Robinson bf90c3cbdd
New: refresh only selected or filtered series
Closes #5611
2023-05-21 17:05:30 -04:00
Bogdan a117001de6 New: Improve validation messages 2023-05-21 09:24:59 -07:00
Bogdan 6118afa339 Minor CS improvements in NzbDroneValidation 2023-05-21 09:24:59 -07:00
S0me6uy 59dd3b1127
New: Signal Notifications
Co-authored-by: Your Name <yohoho@testsmsd.com>
2023-05-21 12:22:00 -04:00
Bogdan de3bfb7c5a
Fix spelling "Use languages from Torznab/Newznab attributes if given" 2023-05-21 12:05:18 -04:00
Bogdan 90a9ecbaac Fix tests in IndexerServiceFixture 2023-05-21 09:03:51 -07:00
Bogdan d492f28645 Fix tests in TorrentDownloadStationFixture 2023-05-21 09:03:51 -07:00
Mark McDowall d743a8f7e9 Fixed tests in DownloadServiceFixture 2023-05-20 21:15:10 -07:00
Mark McDowall 3cd33d3f44 Fixed: Don't move seeding torrents in Synology Download Station
Closes #3997
2023-05-20 20:56:02 -07:00
Mark McDowall b38c1255dc Fixed: Don't retry grabbing the same release if download client is unavailable
Closes #3116
2023-05-20 20:51:24 -07:00
Mark McDowall f946d78153 Fixed: Exception when request to SABnzbd times out 2023-05-20 16:59:06 -07:00
Qstick 9c5a07f62a New: Use languages from Torznab/Newznab attributes if given
Closes #5654
2023-05-20 16:31:30 -07:00
Mark McDowall 7238100145 Add FindByName to IsoLanguage 2023-05-20 16:24:38 -07:00
Mark McDowall 4fe79e9a4e Fixed: Parsing of some additional Chinese anime releases
Closes #5667
2023-05-20 15:15:48 -07:00
Bogdan 2016f11b1c
New: Show current tags for Connections 2023-05-19 18:55:44 -04:00
Bogdan 9bdc618366 Fixed: Use indexer errors from response if Content-Type is XML before processing response 2023-05-18 17:32:24 -07:00
Sonarr 4fecd6ed89 Automated API Docs update 2023-05-18 16:43:35 -07:00
Qstick 94a8ef6304 New: Advanced settings toggle in indexer edit/add modal
(cherry picked from commit a570fd2a8f138fb89c5b0ae43ddb7919f6bf26e3)
2023-05-18 16:43:08 -07:00
Qstick de08d37267 New: Add path mapping for partial library updates in Plex Server Notifications
(cherry picked from commit 24206ad0a3095c4bf5c860af516d8543bd6525d6)
2023-05-18 16:41:06 -07:00
Bogdan ef0b91b45b Add `forceSave` to the OpenAPI docs 2023-05-18 16:37:34 -07:00
Bogdan b5050d02d6
Fixed: Log name of mount point failure 2023-05-17 20:12:06 -04:00
Bogdan 3ece1533d8 Fix checking for SameTorrent when the indexer is null 2023-05-17 17:00:27 -07:00
Bogdan f32a3cd41c Sort tags by label
(cherry picked from commit bb1ebda753157a96154095e0c1e32703f2a68d1a)

Co-authored-by: Mark McDowall <markus.mcd5@gmail.com>
2023-05-17 16:58:15 -07:00
Sonarr 14411f1f15 Automated API Docs update 2023-05-14 21:23:46 -07:00
Bogdan 3508cb63dc Update UI dependencies 2023-05-14 21:11:16 -07:00
Bogdan 3840e97da2 Update openapi.json with Github Actions 2023-05-14 21:09:03 -07:00
Bogdan 2fecd28001 Fix validation for boolean query parameters 2023-05-14 21:09:03 -07:00
Bogdan 5de7322d60 Add Pull Request Labeler 2023-05-14 10:06:48 -07:00
Bogdan 498722b240
Fixed: Prevent unknown settings implementation from failing to deserialize
(cherry picked from commit 0e2cc7851f556e928e52bb2886c7d60c13b0741e)

Log removal of invalid definitions as warnings

(cherry picked from commit 3d61719a2cc9c87ac3c92b5358bb5034aed4c2ff)
2023-05-14 10:01:55 -07:00
Qstick eacb619cfb
Fixed: Avoid error in CF calculation when release is unparsable 2023-05-13 15:40:27 -05:00
Mark McDowall 711331526b Add missing wiki hashes to health checks 2023-05-12 16:56:00 -07:00
Qstick ed22bb719d DownloadClientRootFolderCheck Improvements 2023-05-12 16:55:56 -07:00
Qstick 1f20bc63c6 RemotePathMappingCheck Improvements 2023-05-12 16:55:44 -07:00
Qstick 202449c40c Fixed: Provider health checks persist after add until next scheduled check 2023-05-12 16:55:35 -07:00
Mark McDowall 62b948b24c New: Calendar filtering by tags
Closes #5476
2023-05-11 22:36:26 -07:00
Mark McDowall 7c0d344437 New: Calendar month view will scroll to today on load and press
Closes #5574
2023-05-11 20:58:12 -07:00
Mark McDowall c7d39579b4 New: Log additional information when processing completed torrents from rTorrent
Closes #5638
2023-05-11 17:35:40 -07:00
Bogdan 3af7a6df7d Remove unused field userAgentBuilder in HttpClient 2023-05-10 21:10:36 -07:00
Bogdan 477bfb7835 Minor cleanup in RssImport 2023-05-10 21:10:09 -07:00
Bogdan c6b543e072 Remove unused imports 2023-05-10 21:08:13 -07:00
Bogdan f93a016be1 Remove empty constructors 2023-05-10 21:08:13 -07:00
Mark McDowall f63e060ac4 Use QualityProfile instead of any 2023-05-10 21:01:52 -07:00
Mark McDowall e882d0f385 Fixed CompletedDownloadService.Process tests 2023-05-09 13:11:12 -07:00
Mark McDowall 0e6f858e65 Fixed tests 2023-05-09 10:03:53 -07:00
Mark McDowall f56d504816 Fixed: Incorrect event types for interactive import required notifications 2023-05-09 08:09:27 -07:00
Stickie 5ec282750b New: Notifications when Manual Interaction is required for importing
Closes #5193
2023-05-08 16:35:03 -07:00
ta264 63654b99f2 Fixed: Don't buffer update package to memory when downloading 2023-05-08 16:35:03 -07:00
Bogdan 9325140b90
API key improvements
Fixed: Special characters in API key
New: Add heathcheck for API Key
2023-05-07 20:56:26 -07:00
Mark McDowall eaa4a358e8 Why rename many files when few file do trick 2023-05-07 20:25:55 -07:00
bakerboy448 e72431144b
New: Improved maintenance release wording 2023-05-07 18:58:56 -07:00
Mark McDowall 993c69530e GracePeriod not Graceperiod 2023-05-07 18:57:55 -07:00
The Dark 5fdc8514da
New: On Health Restored notification
Closes #4262
2023-05-07 18:57:14 -07:00
Bogdan fbf79c6639 Downgrade rimraf to v4 2023-05-07 18:50:11 -07:00
Bogdan 76f93c8415
Fixed: Ensure indexer errors are handled before processing response 2023-05-07 10:29:51 -07:00
Bogdan 8f482c534f
Fixed: custom script error when importing some downloads
Co-authored-by: Qstick <376117+Qstick@users.noreply.github.com>

Closes #5617
2023-05-07 10:23:47 -07:00
Benjamin Staneck 6a49f3989a Fix stylelint runs by pinning string-width to a non ESM-only version
Add `inset` to stylelintrc
2023-05-07 10:20:08 -07:00
Benjamin Staneck d79f42351f Remove unused babel plugins and fix build with profiling 2023-05-07 10:20:08 -07:00
Benjamin Staneck 4aba540b89 Update all relevant dev tool deps
Delete esformatter

Address lint failures

Delete unknown component property

remove deprecated stylelint rules

Address stylelint violation

Update rimraf
2023-05-07 10:20:08 -07:00
Benjamin Staneck 9ebd2f96ad Add VSCode extension recommendations
To make it easier for new contributors, suggest extensions for the tools we use
2023-05-07 10:20:08 -07:00
Benjamin Staneck e12c679cd8 Move vscode settings to the frontend folder
Since it applies to all of frontend, I think it makes more sense to have it here instead of src
2023-05-07 10:20:08 -07:00
Benjamin Staneck 0da89478cc Delete various old config files
Delete `jsconfig.json`

This file actually did nothing since we have a `tsconfig.json`. Behavior does not change since `checkJs` is `false` in both.

Delete `.jsbeautifyrc`

Was not used from what I could tell and we have a ESFormatter config file as well and that is basically the successor.

Delete `.csscomb.json`

Was not used from what I could tell, also the project seems dead, last publish 4 years ago. Also we have stylelint in place that covers CSS.
2023-05-07 10:20:08 -07:00
Bogdan a95317446c Log invalid config file exceptions
(cherry picked from commit e1d0e2c79975a10c12fc8551f5dcd4a79f1c94e7)
2023-05-07 10:18:00 -07:00
Qstick 3a6c078b30 Fixed: Catch InvalidDataException during initial config to prevent boot loop
(cherry picked from commit 9862584611f29ac3f16e0c6ef0afb183ff3f0588)
2023-05-07 10:18:00 -07:00
Mark McDowall 77efc4cc40
Fixed: Timeout when getting root folder details 2023-05-07 09:52:35 -07:00
Mark McDowall 453891e620 New: Only add version header for API requests
Closes #5601
2023-05-06 22:34:22 -07:00
Mark McDowall 95b52e630a Remove duplicated processing of unparsed paths 2023-05-06 21:53:01 -07:00
Bogdan 5bb03a9ddf
New: Add token authentication for ntfy.sh notifications
Co-authored-by: KucharczykL <lukas@kucharczyk.xyz>
2023-05-06 21:30:31 -07:00
Bogdan e3f71ca79c
New: Log content for invalid torrent files 2023-05-06 11:22:49 -07:00
Bogdan ca8b26138e Fix downloading releases without an indexer 2023-05-01 19:28:04 -05:00
Bogdan b0773ae7e3 Fix loading eslintrc 2023-04-29 21:12:20 -07:00
Bogdan a0b08f6c6f
Build download requests from indexer implementation 2023-04-30 00:09:11 -04:00
Benjamin Staneck 7aa8463438
Fixed some aria violations 2023-04-30 00:05:21 -04:00
Benjamin Staneck 5d873fafec
New: Updated button and calendar outline colors for dark theme 2023-04-29 23:58:01 -04:00
Qstick 7ce0d4a9db Fixed: Use augmented languages for queue items 2023-04-29 17:15:39 -05:00
Fabricio Silva 83cee4b00e
Fixed: Edit Quality Profile not opening
Closes #5588
2023-04-28 10:46:26 -04:00
Benjamin Staneck de4cfefde4
Update core-js and use defaults for browserlist 2023-04-27 22:37:38 -07:00
Benjamin Staneck bb77bb640c
Use minified jquery 2023-04-27 10:33:59 -04:00
Benjamin Staneck 8bcaa17e25
Update webpack and webpack-cli 2023-04-27 10:33:10 -04:00
Benjamin Staneck 0d48ebe8de
Remove unused gulpFile 2023-04-27 10:32:48 -04:00
Benjamin Staneck e34d250440
Fix typo in calendarBackgroundColor CSS variable 2023-04-27 10:32:31 -04:00
Lars 3141bf7f9d
Fixed: Subtitle tags from existing subtitle files being lost during rename
Closes #5577
2023-04-26 23:18:58 -04:00
Mark McDowall 8c50cd061e New: Report health error if Recycling Bin folder is not writable
Closes #4692
2023-04-24 21:58:51 -07:00
Gabriel Sjöberg 99c4f5b746
Use BuildInfo.AppName for RARBG appId instead of hardcoded value 2023-04-25 00:54:12 -04:00
Lars ff3327483a
New: Filter Sonarr synchronization based on Root Folders
Closes #4835
2023-04-25 00:44:20 -04:00
Mark McDowall 0bc16efe26 Don't clean slashes from folder names 2023-04-24 13:12:35 -07:00
Mark McDowall b3260ba866 New: Colon replacement naming option 2023-04-24 07:59:36 -07:00
Mark McDowall d3ad970ecc Use enum for MultiEpisodeStyle property 2023-04-24 07:59:35 -07:00
Bogdan ed7d99c160 New: Add Apprise notifications 2023-04-22 18:17:24 -07:00
Robin Dadswell 720fc2818f Frontend Placeholders from the Backend
(cherry picked from commit 69f5963f6f1e80e3f598bdb13792b7413fcc13b1)
2023-04-22 18:17:24 -07:00
Mark McDowall 94b5d23094 Fixed TruncatedEpisodeTitlesFixture tests 2023-04-22 18:16:15 -07:00
Mark McDowall cf48bf3041 Fixed: Ensure first history item when marked as failed is the selected item 2023-04-21 17:45:45 -07:00
Mark McDowall 6fe5573298 Fixed: Override modal not closed after grabbing 2023-04-21 17:45:45 -07:00
Mark McDowall 183b10f79a New: Change default Multi-Episode style to Prefixed Range
Closes #5572
2023-04-21 17:45:45 -07:00
Stevie Robinson bead56893f
Fixed: Border hover colors in dark theme 2023-04-21 20:28:07 -04:00
Mark McDowall 97cf3cee17 New: Don't prevent season searches for Newznab/Torznab if supported by the indexer
Closes #5562
2023-04-19 16:14:09 -07:00
Mark McDowall 764c084987 New: Don't try to analyze disk image files (iso, img, etc)
Closes #5567
2023-04-19 16:14:09 -07:00
Mark McDowall a989c84260 Fixed: Tag filtering on iCal feed 2023-04-19 16:14:09 -07:00
Stevie Robinson 7ed0407e77
Fixed: Spacing between manual download and override download buttons 2023-04-19 19:14:06 -04:00
Stevie Robinson 3e87870370
Fixed: Hover color on override download button 2023-04-19 13:35:45 -04:00
Bogdan b303e9c21a
New: Serve log files as UTF-8 2023-04-18 15:50:43 -04:00
Michael Peleshenko 2303bff205
Fixed: Return properly formatted episode file for deleted files Webhook 2023-04-16 17:48:59 -07:00
Qstick 5a04602672 Remove mono process detection 2023-04-16 19:21:13 -05:00
Bogdan 6f614b7d47
Rename to FolderChmodValidator to match class name 2023-04-15 12:21:17 -07:00
Stepan Goremykin 6413d212e5 Update signalr to 6.0.15 2023-04-14 16:48:47 -07:00
Stepan Goremykin 40e54685b9 Migrate to FluentValidation 9 2023-04-14 16:48:47 -07:00
Mark McDowall dec6e14036 New: On Add Series connection event
Closes #3637
2023-04-14 16:48:07 -07:00
Mark McDowall 619ac557f9 Fixed: Importing from Manage Episodes ignoring Analyse video files 2023-04-14 16:48:07 -07:00
Lars c8933d8124
New: Option to use Telegram topics for notifications
Closes #5486
2023-04-14 19:47:06 -04:00
Mark McDowall 47cf8e6430
New: Updated Rarbg request limits
Closes #5206
2023-04-13 22:54:37 -04:00
Bogdan ed3d880974
New: Add version and timestamp to backup archive 2023-04-13 22:53:32 -04:00
Qstick 39350ed0de New: Improve video stream formatting 2023-04-13 21:20:01 -05:00
Qstick b0834015e7 New: Improve primary video stream selection 2023-04-13 21:20:01 -05:00
Bakerboy448 128f62488d Fixed: DrunkenSlug Default URL 2023-04-13 18:48:41 -07:00
Mark McDowall 83a9d15ff8 New: More information on on why hardlinks should be used over copying
Closes #5542
2023-04-11 16:27:44 -07:00
Bogdan 2107635b7e
Fixed: Config file settings do not need to be case-sensitive 2023-04-11 14:52:25 -04:00
Mark McDowall 3b5e83670b Appease linter 2023-04-11 08:55:51 -07:00
Mark McDowall 513b746fc3 Fixed: Series selection unselecting on mobile browsers
Closes #5539
2023-04-10 22:54:05 -07:00
Mark McDowall 5ca868b4b2 New: Show error message for pending queue items without episodes
Closes #5541
2023-04-10 22:25:10 -07:00
Mark McDowall 48a82ad711 Fixed: Manual Import multiple episode selection
Closes #5543
2023-04-10 22:04:58 -07:00
Mark McDowall b2c43fb2a6 Typings cleanup and improvements 2023-04-10 21:38:50 -07:00
Bogdan 5326a102e2 Fixed: Ensure default config file on starting app
(cherry picked from commit e747af9f448368e2add0d2869a3749efa9e93ae0)
2023-04-10 21:37:59 -07:00
Qstick 69ed531850 Fixed: False Positives for RemotePath check with Deluge
(cherry picked from commit b888b044d61c3787ce658963c6e5c3ef6f3323a1)
2023-04-10 21:37:48 -07:00
ta264 66caec31c9 Fixed: False positive in remote path check with transmission
Correctly use the download directory when it's set

(cherry picked from commit e09ca145d125a12016a6bf41a4971148bd2de870)
2023-04-10 21:37:48 -07:00
ta264 8c68dfb8ce Fixed: Handle missing category when getting Qbittorrent download path
Fixes RADARR-7HC
Fixes RADARR-V49

(cherry picked from commit 6f97ca9a55471386454457ca52b93733e18e85e4)
(cherry picked from commit e7a8f6332c43f179d4c95b3a8a0253a235bb6eec)
2023-04-10 21:37:48 -07:00
ta264 68791ea98a Fixed: Use QBittorrent category savepath for healthcheck
(cherry picked from commit 4f281669fcd460efa4191590de31da12c7e4271d)
2023-04-10 21:37:48 -07:00
Mark McDowall 835910843b Fixed: Series index not loading 2023-04-04 12:17:39 -07:00
Mark McDowall 221bb10261 Fixed: Override and Grab release with unknown series
Closes #5533
2023-04-04 10:39:27 -07:00
Mark McDowall 3dce7e729c Fixed: Import mode for manually imported queue items 2023-04-04 10:30:56 -07:00
Mark McDowall b428bab5ee Fixed: Missing Macedonian and Slovenian languages 2023-04-04 10:29:08 -07:00
Mark McDowall 7fcb6b80b4 Fixed: Override and grab releases with Custom Formats 2023-04-04 10:28:35 -07:00
Mark McDowall ba3dfdc147 Fixed: Unable to check row in Manual Import if series is not set
Closes #5532
2023-04-04 04:42:08 -07:00
Mark McDowall 103ce3def4 New: Add result to commands to report commands that did not complete successfully
Closes #4759
2023-04-03 22:11:43 -07:00
Mark McDowall 07f0fbf9a5 Override release grab modal
New: Option to override release and grab
New: Option to select download client when multiple of the same type are configured

Closes #4526
Closes #4774
2023-04-03 20:14:44 -07:00
Mark McDowall defdc84b7e Convert Manual Import to Typescript 2023-04-03 20:14:44 -07:00
Mark McDowall 032d9a720c Extract useSelectState from SelectContext 2023-04-03 20:14:44 -07:00
Mark McDowall 2020e074db Language parsing improvements and more languages
Fixed: Parsing of multiple languages
New: Add Romanian, Latvian, Persian, Catalan, Croatian, Serbian, Bosnian, Estonian, Tamil, Indonesian, Macedonian, Slovenian languages
New: Handle some ISO 639-2/B language codes

Closes #5112
Closes #5440
Closes #5494
2023-04-03 20:00:52 -07:00
Mark McDowall f4130d96e5 New: Add release info to webhook/custom script import events
Closes #5503
2023-04-02 14:03:05 -07:00
Qstick f59276881a Convert Notifiarr Payload to JSON, Standardize with Webhook 2023-04-02 14:01:59 -07:00
Mark McDowall cc46ed56b4 Fixed: Number input changing while scrolling
Closes #5516
2023-04-01 22:08:02 -07:00
Stepan Goremykin 6ea3d8c127 Use MinBy and MaxBy instead of OrderBy + First 2023-04-01 17:37:11 -07:00
bpoxy 7fedfe7423
Fixed: Matching of custom formats during episode file import 2023-04-01 20:03:53 -04:00
Bakerboy448 a776b68574 Fixed: Parse 720p Remux as 720p BluRay
fix bad anime remux no source logic

Fixes #5517
2023-03-30 21:57:14 -07:00
Bakerboy448 9ae647d9d2 QualityParser - Simplify new expression (IDE0090) 2023-03-30 21:57:14 -07:00
Stepan Goremykin 2abbee1032
Update SixLabors.ImageSharp, MailKit, DryIoc libraries 2023-03-31 00:56:54 -04:00
Qstick 2c7eb05b52 Revert a few packages which result in build warnings and conflicts 2023-03-29 11:50:14 -05:00
Mark McDowall 42003ebd72 Reverted Microsoft package updates to 6.x
Closes #5511
2023-03-27 07:52:15 -07:00
Mark McDowall 6007e46746 Fixed: Removed hardcoded dot prefix from the transmission category in status
Closes #5510
2023-03-27 07:38:56 -07:00
Stevie Robinson 11905b99d3
New: Specials monitoring options 2023-03-26 23:40:11 -07:00
Mark McDowall 033936dce7 Fixed IsValidPath usages 2023-03-26 22:47:09 -07:00
Mark McDowall 13a0dfa4ae Fixed: Slow renaming and deleting episodes
Closes #5499
2023-03-26 22:39:18 -07:00
Mark McDowall 5ea1fb9424 New: Parsing of multi-episode files in brackets
Closes #5501
2023-03-26 22:39:18 -07:00
bakerboy448 0f6f681438
New: Various HealthCheck Improvements 2023-03-27 00:30:27 -04:00
Mark McDowall 0321368cc3 New: Improve path validation when handling paths from different OSes 2023-03-26 21:29:17 -07:00
Mark McDowall ed140dd396 Revert argument exception swallowing for Plex library update 2023-03-26 21:29:07 -07:00
Stepan Goremykin c35308b32b Update chrome driver and swagger 2023-03-26 21:26:42 -07:00
Stepan Goremykin e4dde10a3f Update Selenium.Support package 2023-03-26 21:26:42 -07:00
Stepan Goremykin 951a9ade00 Update FluentAssertions 2023-03-26 21:26:42 -07:00
Stepan Goremykin fd5d279a9e Update SharpZipLib 2023-03-26 21:26:42 -07:00
Stepan Goremykin 028c87d20c Update test packages in build props instead of csproj 2023-03-26 21:26:42 -07:00
Stepan Goremykin b303dc899a Update Newtonsoft.Json 2023-03-26 21:26:42 -07:00
Stepan Goremykin cf22208011 Update packages related to auto tests 2023-03-26 21:26:42 -07:00
Stepan Goremykin 3b6cadeb7e Update packages from microsoft 2023-03-26 21:26:42 -07:00
Mark McDowall 0a13a433a9 New: Parsing of more German WEBDL releases
Closes #5507
2023-03-26 21:19:22 -07:00
Mark McDowall ff2e8ffc37 Fixed: Permissions after installing on Windows and opening Firewall port
Closes #5509
2023-03-26 20:53:30 -07:00
Mark McDowall 34e928ebed Fixed: Agenda view on mobile 2023-03-26 20:45:20 -07:00
Stepan Goremykin 11d91faaad
Use Array.Empty and fix a few multiple enumerations 2023-03-26 23:40:51 -04:00
Mark McDowall c41aec5f77 Fixed: Pushed releases should be stored as pushed release 2023-03-22 17:25:00 -07:00
Mark McDowall b8dcd75cf5 Fixed: Refreshing Plex library on a different OS 2023-03-22 08:09:16 -07:00
Mark McDowall cef6d5a99a Fixed: Imports when custom format is a downgrade, but file is an upgrade 2023-03-22 08:06:59 -07:00
lodu 5d09b84b05
New: Add indexer option for Discord on grab notifications 2023-03-21 19:58:47 -04:00
Mark McDowall 3d24e412a6 Better quality revision logging 2023-03-17 07:46:25 -07:00
Mark McDowall ad79dd4df5 New: Better series type select input
Closes #4796
2023-03-16 22:03:31 -07:00
Mark McDowall 4ff4d32936 New: Improve accepted and rejected release logging
Closes #4965
Closes #4646
2023-03-16 20:58:01 -07:00
Mark McDowall 98308737cf New: Improved Plex library updating 2023-03-16 20:25:31 -07:00
Mark McDowall f59cc99733 Remove unused imports from SeriesIndexRow 2023-03-16 00:40:12 -07:00
Mark McDowall b16094a9e3 Fixed: Prevent loss of restrictions when attempting to edit multiple restrictions at once
Closes #4917
2023-03-16 00:36:32 -07:00
Mark McDowall bd228e88c3 New: Rescan series if destination file already exists during import
Closes #5401
2023-03-15 23:44:09 -07:00
Mark McDowall 978618f041 New: Don't import episodes that don't match grab history
Closes #5073
2023-03-15 23:26:07 -07:00
Zak Saunders 89e363fd14 New: Make Release Group Outline Not Show as Required 2023-03-15 22:28:53 -07:00
Mark McDowall 8d70def088 New: Include series year with custom scripts and webhooks
Closes #5439
2023-03-15 22:09:55 -07:00
Mark McDowall cb86f4fa50 New: Closing Move Series modal without selecting will cancel save
Closes #5448
2023-03-15 21:55:17 -07:00
Mark McDowall c80c1db947 New: Parse HBOMaxHD as WEBDL
Closes #5489
2023-03-15 21:01:37 -07:00
Mark McDowall cfcf1ad1ab Fixed: Page Plex Watchlist results
Closes #5118
2023-03-15 19:55:34 -07:00
Mark McDowall 17b9e4722a New: Parsing of poorly named absolute number-only files in batches
Closes #5488
2023-03-15 19:00:12 -07:00
Mark McDowall f22998aef3 Use episode runtime for size limits when available
Closes #3482
2023-03-15 19:00:08 -07:00
Qstick a42f97229a Convert method to static that doesn't use instance data 2023-03-15 19:24:48 -05:00
Qstick 412a36226f Add .globalconfig 2023-03-15 19:24:48 -05:00
Qstick e8b862a380 Remove Non-Failing Rules 2023-03-15 19:24:48 -05:00
Qstick 2b79fe833b Use Contains(char) instead of Contains(string) for performance 2023-03-15 19:24:48 -05:00
Qstick 4db10e6283 Prefer AsSpan to Substring to avoid unnecessary allocation 2023-03-15 19:24:48 -05:00
Qstick e8aff90582 Use span-based string.Concat to avoid unnecessary allocation
Calling Substring produces a copy of the extracted substring. By using AsSpan instead of Substring and calling the overload of string.Concat that accepts spans, you can eliminate the unnecessary string allocation.
2023-03-15 19:24:48 -05:00
Qstick af28bbad52 Use Environment.CurrentManagedThreadId for efficiency
System.Environment.CurrentManagedThreadId is a compact and efficient replacement of the Thread.CurrentThread.ManagedThreadId pattern.
2023-03-15 19:24:48 -05:00
Qstick f928ee7cad Use Environment.ProcessPath instead of GetCurrentProcess().MainModule.FileName
GetCurrentProcess().MainModule.FileName is expensive, Environment.ProcessPath added in net6
2023-03-15 19:24:48 -05:00
Qstick 7521579bca Use Apend(char) instead of Apend(string) for performance
When calling StringBuilder.Append with a unit length string, consider using a const char rather than a unit length const string to improve performance.
2023-03-15 19:24:48 -05:00
Qstick e805f61450 Use Length/Count property instead of Count() method to prevent enumerating 2023-03-15 19:24:48 -05:00
Qstick 4fe9daec03 Use Any() in place of Count() to prevent enumerating
This rule flags the Count and LongCount LINQ method calls used to check if the collection has at least one element. These method calls require enumerating the entire collection to compute the count. The same check is faster with the Any method as it avoids enumerating the collection.
2023-03-15 19:24:48 -05:00
Qstick 738dc2c98c Do not use Enumerable methods on indexable collections
This rule flags the Enumerable LINQ method calls on collections of types that have equivalent but more efficient properties to fetch the same data.
2023-03-15 19:24:48 -05:00
Qstick 0ed8ba828d Avoid unnecessary zero-length array allocations 2023-03-15 19:24:48 -05:00
Qstick b2c2c79a96 Don't compare strings to Empty using Equals
Comparing strings using the String.Length property or the String.IsNullOrEmpty method is faster than using Equals. This is because Equals executes significantly more MSIL instructions than either IsNullOrEmpty or the number of instructions executed to retrieve the Length property value and compare it to zero.
2023-03-15 19:24:48 -05:00
Qstick 08ee2f7e32 Remove unnecessary assignments to default type value
The .NET runtime initializes all fields of reference types to their default values before running the constructor. In most cases, explicitly initializing a field to its default value in a constructor is redundant, adding maintenance costs and potentially degrading performance
2023-03-15 19:24:48 -05:00
Qstick 42e45f93ac Use const where appropriate
The value of a const field is computed at compile time and stored in the metadata, which improves run-time performance when it is compared to a static readonly field.
2023-03-15 19:24:48 -05:00
Qstick b4d8f0c311 Enable all analyzers and enforce code style on build 2023-03-15 19:24:48 -05:00
Stevie Robinson 21045127cd
Fixed: Parsing of multi season packs with only space between the season numbers 2023-03-14 00:32:57 -07:00
Mark McDowall d496733b31 Fixed: Don't import Custom Format downgrades
Closes #5475
2023-03-14 00:22:37 -07:00
Mark McDowall b3d1e4f520 Fixed: Multiple Downloaded Episodes Scan commands should not run in parallel 2023-03-13 18:11:17 -07:00
Mark McDowall cd67671bc1 Fixed: Slow loading of files in Manage Episodes modal
Closes #5449
2023-03-13 00:30:28 -07:00
Mark McDowall 1f619e27f1 New: Season interactive search modal size
Closes #5483
2023-03-12 23:58:37 -07:00
Mark McDowall ac806a2933 New: Show downloading status for series progress bar
Closes #5474
2023-03-12 23:51:38 -07:00
Mark McDowall 6d88a98282 New: Plex Watchlist RSS support 2023-03-12 23:51:38 -07:00
Stevie Robinson 4f5a183152
Fixed: Color unaired items in agenda view
Closes #5477
2023-03-10 22:37:02 -08:00
cicomalieran 9800bd6b43
Fixed: Processing very long ETA from Transmission
Closes #5444
2023-03-07 16:46:48 -08:00
Mark McDowall aa938d911b Fixed: Misaligned table border
Closes #5456
2023-03-05 23:41:14 -08:00
Mark McDowall 622e36de96 Fixed: Some posters not showing for new series search results
Closes #5451
2023-03-05 23:41:13 -08:00
Sergey M 255f947860
Fixed: Mapping of parsed titles when one doesn't have an alias
Co-authored-by: Sergey M <msergein>
2023-03-05 17:30:56 -08:00
bakerboy448 92ecb30fab
Fixed: Regression in error message logging
Closes #5461
2023-03-01 18:19:16 -05:00
Qstick 6082253166 New: Additional custom filter predicates for strings 2023-02-23 22:46:15 -06:00
bakerboy448 e968919e63
Fixed: Improve some request failure messaging 2023-02-22 17:36:12 -08:00
Mark McDowall 6ec32eb45d Fixed lint error and background for poster select 2023-02-22 17:17:24 -08:00
Mark McDowall bd3816dac9 Handle null for parent name with clean path is empty 2023-02-20 17:20:07 -08:00
Mark McDowall 95a8f59a32 Fixed: Don't handle images in metadata folder as Roksbox images 2023-02-20 16:42:57 -08:00
Mark McDowall 890f107467 New: Support for .plexmatch series metadata files
Closes #4960
2023-02-20 15:08:26 -08:00
Mark McDowall 6740257135 New: Add Episode Guide option for Kodi MetadataFile
Closes #5415
2023-02-20 12:35:22 -08:00
Mark McDowall bbd9b1657d Fixed: Don't clean Kodi library if video is playing and Always Update is disabled
Closes #5387
2023-02-20 10:48:49 -08:00
Mark McDowall d923d3f106 Fixed: Series table not resizing properly when window size changed 2023-02-20 09:59:49 -08:00
Mark McDowall bf62d4f921 Fixed: Series select not working correctly after stopping/starting or changing sort order 2023-02-20 09:58:11 -08:00
Mark McDowall cf00fecbe4 Fixed: Don't grab propers/repacks when item in queue meets cutoff and propers/repacks are not downloaded automatically
Closes #1208
2023-02-19 00:32:58 -08:00
Qstick 5a22afc42b Fixed broken path tests 2023-02-18 15:37:35 -08:00
Mark McDowall 75378f7bde Fixed: USB drives mounted to folders are treated as different mounts
Closes #4147
2023-02-16 17:05:39 -08:00
Mark McDowall 37c355da51 Improved UI error messages (stack trace and version) 2023-02-16 16:45:09 -08:00
Mark McDowall 57a64b056a New: Increase clickable area of series select in poster/overview 2023-02-13 17:26:32 -08:00
Mark McDowall 279d3a89b6 Fixed loading series list and custom filters
Fixed: Loading series list
Fixed: Adding new custom filter

Closes #5430
2023-02-13 11:27:16 -08:00
tsubus 492c9e22ba Remove unused ReactDOM import
fixes error with mono: "error  'ReactDOM' is defined but never used  no-unused-vars"
2023-02-13 07:30:14 -08:00
Mark McDowall f7ce5c7b11 Fixed: File browser 2023-02-12 23:58:50 -08:00
Mark McDowall 997aabbc3c Improve CF calculation for files without scene name
Fixed: Use original filename instead of complete path when calculating CF for existing file without scene name
Closes #5365
2023-02-12 22:33:45 -08:00
Mark McDowall 2c65e4fa41 Fixed: Prevent getting disk space from returning no information when it partially fails
Closes #5247
2023-02-12 20:55:13 -08:00
Qstick 9c1fd7c73e Bump MonoTorrent to 2.0.7
Pulls in fix for parsing torrents when certain values are an empty string
2023-02-12 21:58:44 -06:00
Mark McDowall ce255b55e6 Add CSS typings 2023-02-12 19:16:07 -08:00
Mark McDowall 6fce6c2bbc Remove Season Pass 2023-02-12 19:16:07 -08:00
Mark McDowall 67232290e5 Remove Series Editor 2023-02-12 19:16:07 -08:00
Mark McDowall bdcfef80d6 New: Season Pass is now part of series list 2023-02-12 19:16:07 -08:00
Mark McDowall a18c377466 Switch to eslint for linting 2023-02-12 19:16:07 -08:00
Mark McDowall a731d24e23 New: Mass Editor is now part of series list 2023-02-12 19:16:07 -08:00
Mark McDowall 815a16d5cf Added series index selection 2023-02-12 19:16:07 -08:00
Mark McDowall 5aad84dba4 Fixed: Restoring scroll position when going back/forward to series list 2023-02-12 19:16:07 -08:00
Mark McDowall d022679b7d Refactor Series index to use react-window 2023-02-12 19:16:07 -08:00
Mark McDowall de56862bb9 Add Prettier to format TypeScript files 2023-02-12 19:16:07 -08:00
Mark McDowall 910511dba0 Add typescript 2023-02-12 19:16:07 -08:00
Mark McDowall 27cc551980 Updated API documents 2023-02-12 15:09:00 -08:00
Mark McDowall d2cd3f7716 Rename LocalizationLanguageResource to avoid collision with LanguageResource 2023-02-12 15:06:51 -08:00
bpoxy 5e761f766c
Fixed: Show calculated (rather than stored) custom format score on season and series history, to match episode history 2023-02-12 14:48:23 -08:00
bakerboy448 ddb25b1095
New: Use better page size for Newznab/Torznab (up to 100) when supported by the indexer
Closes #5373
2023-02-12 14:34:04 -08:00
Stevie Robinson c1e43e9389 Fixed: text color of complete seasons dark mode
the readability of complete seasons on season pass is not great. changed from light gray to dark gray
2023-02-12 14:32:17 -08:00
Mark McDowall 303fc5d786 New: Return static response to requests while app is starting
Closes #5402
2023-02-07 17:31:54 -08:00
Mark McDowall 81435dabc7 Fixed: Creating new Delay Profile
Closes #5419
2023-02-07 17:25:29 -08:00
Qstick a379d0c403 Fixed: Settings fail to save for some auth setups 2023-02-06 23:09:10 -06:00
Mark McDowall 72b307f4ad Fixed: Using absolute episode number in Standard Format for episode without while renaming 2023-02-06 16:55:04 -08:00
Mark McDowall 69f325b9dd SeriesFolderFormat needs to be OS Agnostic 2023-02-04 16:54:22 -08:00
Mark McDowall 81d2b18ce1 New: Use Series Folder Format to improve unmapped folders within root folders 2023-02-04 15:51:00 -08:00
Mark McDowall 119addd75f Fixed: Migrating case-sensitive Preferred Word REGEX to Custom Formats
Closes #5399
2023-02-04 00:32:48 -08:00
Xavier Xiong 0f111dd066
Fixed: Chinese Anime releases that include a season number 2023-02-04 00:10:13 -08:00
Stevie Robinson e29470d8cb
Fixed: Enable parsing of repacks with revision
Closes #5383
2023-02-04 00:08:35 -08:00
bakerboy448 83f6359063
New: Improve Manual Import logging when not parsing files 2023-02-04 00:06:59 -08:00
Mark McDowall ad42d4a14c Fixed: Ping endpoint no longer requires authentication
Closes #5396
2023-01-31 23:39:59 -08:00
Qstick faccfe17a2 Remove debug code in CleanupQualityProfileFormatItems 2023-01-22 13:47:13 -06:00
Qstick f05e109b50 Fixed: Avoid Sqlite Error when all profiles have lowest quality cutoff 2023-01-21 18:11:09 -06:00
Stevie Robinson 3973571411
New: Added new series title rename tokens without year
Closes #5369
2023-01-21 18:55:00 -05:00
bakerboy448 863d24996c
New: Improve messaging when imports are left in queue 2023-01-21 18:28:33 -05:00
Zak Saunders c897608bab Fixed: Calendar Grouped Series Title 2023-01-21 15:18:26 -08:00
PearsonFlyer 1b599c7e76 Fix notifiation in Ntfy on test from Radarr to Sonarr 2023-01-19 18:19:30 -06:00
Mark McDowall 0fbf61199f Fixed: Parsing of some files with series title aliases 2023-01-18 17:18:55 -08:00
Mark McDowall b848100693 Fixed: Images for some series not downloading
Closes #5376
2023-01-15 21:21:34 -08:00
Qstick c08b451564 Bump ImageSharp to 2.1.3 2023-01-15 14:27:08 -06:00
Mark McDowall 71bfa0ff02 Fix use of sizeOnDisk 2023-01-13 18:24:18 -08:00
Mark McDowall 6dcfc661a1 New: Show updated Custom Format Score in history 2023-01-13 17:41:43 -08:00
Mark McDowall 68d026479f New: Add custom format info to episode import notifications 2023-01-13 17:41:43 -08:00
Mark McDowall 899d6ddbab Fixed: Store Custom Format score during import
Closes #5291
2023-01-13 17:41:43 -08:00
Mark McDowall 4ed4ca4804
New: Add bypass if above Custom Format Score to Delay Profile
Closes #5043
2023-01-13 20:40:49 -05:00
Mark McDowall bc2942c28d New: Don't block imports when release was matched by ID if they were grabbed via interactive search
Closes #5043
2023-01-13 17:40:08 -08:00
Mark McDowall 599ad86657
New: Use file's format title for quality if parsed
Closes #3930
2023-01-13 20:39:29 -05:00
Mark McDowall 3f598ffa6f Fixed: UTC time sent to UI for already imported message
Closes #5366
2023-01-13 17:39:00 -08:00
Mark McDowall 67035b9266 Fixed: Monitoring episodes modal not closing after saving 2023-01-13 17:38:31 -08:00
Mark McDowall 2c5b9e9999 Fixed: Loading Sonarr on OAF browsers
Closes #5363
2023-01-11 17:09:25 -08:00
Mark McDowall 4b4301a076 Fixed: Quality Profiles resetting Custom Format scores during housekeeping
Closes #5359
2023-01-09 12:18:14 -08:00
Mark McDowall 2c004e1f96 Fixed: Unable to load UI if Quality Profiles contain removed Custom Format items 2023-01-09 08:58:25 -08:00
Mark McDowall ea612e8b78 Revert "Fixed: Unable to load UI if Quality Profiles contain removed Custom Format items"
This reverts commit facf775a43.
2023-01-09 08:57:45 -08:00
Xavier Xiong f742e1f174
Fixed: Chinese releases with season and absolute episode numbers 2023-01-09 01:57:21 -05:00
Mark McDowall facf775a43 Fixed: Unable to load UI if Quality Profiles contain removed Custom Format items
Closes #5323
2023-01-08 22:49:56 -08:00
Mark McDowall 4f61a4ab07 New: Fixed truncation on Firefox after renaming Custom Format specification
Closes #5357
2023-01-08 10:26:12 -08:00
Qstick 4a740acb80
New: Simkl List Support (#5313)
* New: Simkl List Support

* fixup! smarter sync

* fixup! comments

* fixup! comments
2023-01-07 12:58:10 -06:00
bakerboy448 e07936fb84
2023 readme fixes 2023-01-05 19:23:04 -05:00
Mark McDowall 1394122842 Fixed: Displaying audio and subtitle languages in UI 2023-01-04 21:24:26 -08:00
Mark McDowall 84e6649724 Cleanup old usages of languageCutoffNotMet 2023-01-04 21:24:26 -08:00
Mark McDowall fe5c52602a
Fixed: Custom Formats upgrading even when profile doesn't allow upgrades
Closes #5330
2023-01-04 16:41:12 -05:00
Stevie Robinson 3316665e93
Fixed: Kodi Metadata Subtitle Language 2023-01-04 16:39:34 -05:00
Mark McDowall 61fa1e5e3f New: Added health check warning if SABnzbd sorting is enabled
Closes #4985
2023-01-03 15:41:12 -08:00
Mark McDowall 48b4cc5f3f New: Improved messaging when qBittorrent fails due to host header rejection 2023-01-02 16:30:00 -08:00
Mark McDowall 396406b217 New: Description for indexer RSS setting 2023-01-01 09:10:00 -08:00
Mark McDowall 09eea0571f Fixed: Delete series
Closes #5333
2023-01-01 08:37:00 -08:00
Mark McDowall d8f6eaebdc New: Remember add import list exclusion when removing series
Closes #4984
2022-12-31 22:17:50 -08:00
Mark McDowall 2fc76a9ac5 New: Use XEM season number for some releases when mapping episodes
Closes #5195
2022-12-31 21:41:22 -08:00
Mark McDowall 6ec7c3f7a9 Fixed: Parsing of anime that uses standard numbering and includes episode number at end
Closes #5331
2022-12-30 14:59:12 -08:00
Mark McDowall 4baa2a07ba Fixed: End year for series not showing correctly in some cases 2022-12-30 13:21:49 -08:00
Mark McDowall 8fff59ff10 New: Show detailed queue status on Calendar and Series Details
Closes #3775
2022-12-29 23:57:20 -08:00
Zak Saunders ca61efa57f
Fixed: Progress bar text colour in Dark theme 2022-12-29 17:56:29 -08:00
Stevie Robinson 30cbaf06fa
Fix comment 2022-12-29 13:12:31 -05:00
Mark McDowall 738a7b38c9 New: Parsing of some Dutch/Flemish/Italian release titles
Closes #2762
2022-12-29 00:49:08 -08:00
Mark McDowall f504dfcbab New: Missing/Cutoff Unmet searches will search for episodes that haven't been searched recently first
Closes #3067
2022-12-27 23:27:31 -08:00
Mark McDowall 2491da0678 Fixed: Don't try to remove the same item from queue multiple times 2022-12-27 01:07:15 -08:00
Mark McDowall 1f8e1cf582 Fixed: Multiple pushed releases will be processed sequentially
Closes #2975
2022-12-25 23:20:43 -08:00
Mark McDowall 40ce54e165 Upgrade Newtonsoft.Json 2022-12-23 22:33:39 -08:00
Mark McDowall 32544318e1 Updated some JS dependencies 2022-12-23 22:03:17 -08:00
Mark McDowall e57e68c97a New: Option to include series image for Gotify notifications
Closes #4882
2022-12-22 23:47:05 -08:00
Mark McDowall ce0388ca99 Fixed: Only log /proc/mounts exception once per process
Closes #4929
2022-12-20 17:18:50 -08:00
Mark McDowall 17bfcdd325
New: Portuguese (Brazil) and Spanish (Latino) languages
Closes #5302
2022-12-20 20:17:47 -05:00
Qstick a26163b646 Cleanup Trakt implementation 2022-12-20 17:27:41 -06:00
Qstick 0fad20e327
Handle auth options correctly in Security Settings 2022-12-20 11:56:04 -06:00
Mark McDowall 9e694c7b06 New: Added option to filter series by complete missing season
Closes #5037
2022-12-19 22:51:06 -08:00
Qstick 62354dfac8 Fixed: Don't enforce minimum on single list fetch 2022-12-18 18:28:08 -06:00
Mark McDowall b15b6a0798 Improve handling of releases without video files
New: Show warning in queue if download contains executable or archive file and no video file was detected

Closes #5101
2022-12-18 09:58:03 -08:00
Mark McDowall 4ce4031dd8 New: Reduce size of Custom Formats in responses for most endpoints 2022-12-18 09:57:53 -08:00
Mark McDowall fc8e6d6f02 Fixed: Manual import when no reprocessing items after selecting series and season 2022-12-17 21:25:18 -08:00
Mark McDowall b8714d80a1 Fixed: Prevent unexpected data breaking Series Import 2022-12-17 21:25:18 -08:00
Colin Gagnaire fb76c237bf
New: Add support for native Freebox Download Client
Closes #5140
2022-12-16 18:37:21 -08:00
Mark McDowall 5ce8ea8985 New: Parse release group from VARYG releases with junk at the end
Closes #5308
2022-12-16 18:27:11 -08:00
Mark McDowall ad2557815e New: Allow season information tooltip to display above if unable to display below
Closes #5300
2022-12-14 18:14:06 -08:00
Mark McDowall ee1ee8f267 New: Rename Emby to Emby / Jellyfin
Closes #5301
2022-12-14 17:47:49 -08:00
Mark McDowall 6c53bf30d5 Fixed: Size on disk calculation including multi-episode files multiple times
Closes #5296
2022-12-14 17:45:43 -08:00
Mark McDowall f15f08e51a Revert "Fixed: Size on disk calculation including multi-episode files multiple times"
This reverts commit be98862ce0.
2022-12-14 08:01:56 -08:00
Mark McDowall be98862ce0 Fixed: Size on disk calculation including multi-episode files multiple times
Closes #5296
2022-12-14 00:24:02 -08:00
Mark McDowall 9a96dee49d New: Parsing of releases extra slash in Chinese anime titles
Closes #5299
2022-12-13 23:32:58 -08:00
Mark McDowall 789a8f5301 Fixed: Queue not showing items with conflicting titles 2022-12-12 22:44:08 -08:00
Mark McDowall 530829f8ed Don't copy/pasta kids 2022-12-11 19:42:44 -08:00
Mark McDowall 8bea8a10da Fixed: Skip anime version upgrade check if Proper/Repacks are not preferred
Closes #4468
2022-12-11 18:01:51 -08:00
Mark McDowall e42edf1d33 New: Add Thai Language
Closes #5170
2022-12-10 16:25:23 -08:00
Mark McDowall fea66cb7bc Fixed: Quality cutoff updating in UI when adding/removing qualities
Closes #5290
2022-12-10 16:04:06 -08:00
Mark McDowall 7f5abfd87d New: Parsing of Japanese variety shows
Closes #5279
2022-12-10 13:42:41 -08:00
Qstick 356771d139
New: Speed up mass deletes from Series Editor
* New: Speed up mass deletes from Series Editor

* fixup! Additional speed up using GetAllSeriesPaths vs GetAllSeries

* fixup! Tests
2022-12-10 14:19:10 -06:00
Mark McDowall d08f33ae21
New: Quality Preferred Setting
Co-authored-by: Qstick <qstick@gmail.com>
Closes #724
2022-12-10 09:59:54 -08:00
Mark McDowall b2b9172c92 Fixed: Custom formats with score of 0 showing 1
Closes #5288
2022-12-10 09:47:12 -08:00
Mark McDowall 60470b653a Fixed: History Since API endpoint 2022-12-10 01:11:20 -08:00
Mark McDowall d09e5d8eb4 Fixed: Trakt connection auth tokens not being refreshed
Closes #5285
2022-12-10 00:42:46 -08:00
Mark McDowall 041dc659fe Fixed: Custom formats with a total score of zero not showing in some places 2022-12-09 20:55:01 -08:00
Mark McDowall be02d0ebf7 Fixed: Series/season history loading
Closes #5286
2022-12-09 20:40:51 -08:00
Mark McDowall b3959e3162 Fixed broken pending release tests 2022-12-09 10:39:16 -08:00
Mark McDowall e50eb5188e Fixed: Unable to process downloads from client
Closes #5284
2022-12-09 09:19:11 -08:00
Stevie Robinson 05775a9bd0 Fix bug_report.yml description field
field was over 200 chars and apparantely not valid|!
2022-12-09 15:22:54 +01:00
Qstick 779f348f7b
Add deprecated sort values to validation
Fixed #5282
2022-12-09 07:47:33 -06:00
Gabriel Patzleiner b98881c576 Fixed: Absolute episodes followed by a year not getting parsed correctly 2022-12-08 22:37:32 -08:00
Mark McDowall da4f6b7df9 New: Show Custom Formats on Manual Import / Manage Episodes
Closes #5241
2022-12-08 20:00:02 -08:00
Mark McDowall 6216a71f8c
Fixed: Parsing of releases with episode titles that contain languages
Closes #861
2022-12-08 18:59:36 -08:00
Qstick 16e2d130e6 Simplify X-Forwarded-For handling
This happens in asp.net middleware now

Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-12-07 23:03:59 -06:00
Qstick fd98a179ab New: Improve IPAddress.IsLocal method
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-12-07 23:03:59 -06:00
Mark McDowall 87795708b5 New: Allow Season packs to be grabbed automatically if all episodes will have aired within 24 hours
Closes #5191
2022-12-07 20:26:49 -08:00
Mark McDowall 0450d0b2b6 Remove unused dependency in SeasonPackOnlySpecification 2022-12-07 20:26:49 -08:00
Qstick e19071da0e Fixed: Avoid path manipulation from receiving to sending for Kodi
Fixes #5260
2022-12-07 21:54:12 -06:00
Qstick c522cd120d
New: Rework List sync interval logic
* New: Rework List sync interval logic

Fixes #5011
2022-12-07 21:09:42 -06:00
Mark McDowall 7675b4bc3b Fixed: Queue failing to load if column was sorted by episode air date or title
#5257
2022-12-07 19:03:51 -08:00
Mark McDowall 1b90fbcf7d New: IPv6 support for connections/indexers/download clients
Closes #4149
2022-12-06 23:11:59 -08:00
Mark McDowall 6bdeafcf8c Fixed: Improve Bind Address validation and help text
Closes #622
2022-12-06 23:11:59 -08:00
Mark McDowall 9e6b32ca3e New: Parsing of 4K GM-TEAM releases 2022-12-06 23:10:25 -08:00
Zak Saunders 4ca5a213fa
New: Auto theme option to match OS theme
Co-authored-by: Qstick <qstick@gmail.com>
2022-12-06 02:22:52 -05:00
Mark McDowall c7d6c0f452 New: Show all options when authentication modal is open 2022-12-05 23:01:09 -08:00
Stevie Robinson 7f5769ab70
Git issue template update 2022-12-06 01:59:36 -05:00
Mark McDowall 335fc05dd1
New: Auto tagging of series
Closes #3870
2022-12-06 01:58:53 -05:00
penggongkui 8eb941d590
Fixed: Parsing of additional GM-Team formats 2022-12-05 10:54:42 -05:00
Mark McDowall e77be24c7b Fixed: Sending Webhook on upgrade if media info is unavailable
Closes #5272
2022-12-05 01:10:54 -08:00
Qstick b98ce7fb17 New: Store Task StartTime, Show Duration in UI
Closes #5266
2022-12-04 19:10:56 -08:00
Qstick 11e6e12676 Fixed: Error on EpisodeFile summary modal if CF is null
Fixes #5268
2022-12-04 15:24:22 -06:00
Qstick 78af4823cf Fixed: Imdb lists only return 1 result 2022-12-04 09:35:50 -06:00
Qstick 859e48ff5c Update API Docs 2022-12-03 23:32:54 -06:00
Qstick 7e48ea0231 Fixed: Correct Attribute compare for Id validation 2022-12-03 23:17:50 -06:00
Mark McDowall 8105da33d8 Fixed broken pending release tests 2022-12-03 17:28:11 -08:00
Mark McDowall df199ce0d8 Fix modal title for Manage Episodes in Season 2022-12-02 23:34:10 -08:00
Mark McDowall 154da57dc5 New: Add Custom Formats to episode details modal 2022-12-02 23:24:00 -08:00
Mark McDowall 998768bcf2 New: Filter by Custom Format Score in Interactive Search 2022-12-02 23:06:08 -08:00
Mark McDowall 0f2ceb85bd New: Parse GM-Team's file names that are different from their release names 2022-12-02 22:43:32 -08:00
Mark McDowall 31198c627f Fixed: Loading queue when there are pending items that were added before upgrading
Closes #5257
2022-12-02 22:42:57 -08:00
Mark McDowall 51b1ba13c1 Fixed: Grab/remove queue actions not showing spinner 2022-12-02 17:27:54 -08:00
Mark McDowall b76a7c2773 Fixed: Pending items in queue not showing Custom formats
Closes #5248
2022-12-02 17:27:12 -08:00
Qstick 3b10400948 New: FreeBSD Support
Co-authored-by: Mark McDowall <mark@mcdowall.ca>
2022-12-02 16:09:24 -08:00
Qstick aaaf18aec3
Fixed: Add back LanguageProfiles endpoints and deprecate
* Fixed: Add back LanguageProfiles endpoints and deprecate

* fixup! Fixed: Add back LanguageProfiles endpoints and deprecate
2022-11-30 19:46:27 -06:00
Qstick c9b483bdf7 Fixed: Use `develop` logo for Kodi notifications
Fixes #5256
2022-11-29 19:51:20 -06:00
Qstick 095dcac90b Make CF insensitive help text more obvious 2022-11-29 19:51:19 -06:00
Qstick becc567ff7 Fixed: Use route Id for PUT requests if not passed in body 2022-11-29 19:44:18 -06:00
Qstick 528feb14c9 Prevent NullRef on CustomFormat parse 2022-11-28 22:04:33 -06:00
Mark McDowall f2b2eb69a3 Fixed: Handle Flood reporting errors for completed and stopped downloads
Closes #5224
2022-11-28 19:04:29 -08:00
Qstick 4c7df31070 New: Add support for Simplepush notifications
Fixes #5108

Co-Authored-By: Timm Schäuble <Timm.Schaeuble@gmail.com>
2022-11-28 20:32:39 -06:00
Qstick 6d142f0b0a Clarify Custom Format regex help text 2022-11-28 18:23:33 -06:00
Qstick 89270ad7a1 Fixed: Original Language failures on Custom Format parsing
Fixes #5240
2022-11-28 18:23:33 -06:00
Mark McDowall 3fdc7c8346 Fix lint error 2022-11-27 18:27:04 -08:00
Mark McDowall 32ebb51634 Fixed some react warnings with ReleaseSceneIndicator 2022-11-27 15:44:24 -08:00
Qstick 651055820a Fixed: Logging for Cutoff and UpgradeAllowed Specs
Fixes #5242
2022-11-27 12:16:36 -06:00
Qstick 3a2a030432 Really fix Original Language in MapSeries
Fixes #5246
2022-11-27 12:14:28 -06:00
Stevie Robinson ca04c93666
Prevent false positives with HONE releases 2022-11-26 19:37:37 -08:00
Mark McDowall ed9a47449b Fixed broken tests after updating images 2022-11-26 19:36:49 -08:00
Mark McDowall 264286dcf1 Fixed: Queued downloads not showing on episodes properly 2022-11-26 19:36:49 -08:00
Bruno Garcia de3cb07c57
Sentry SDK v3.23.1
Co-authored-by: Bruno Garcia <bruno@Brunos-MacBook-Pro.local>
2022-11-26 14:06:08 -08:00
yammes08 cb00ce7c0b
New: Add HONE to list of release group exceptions
Closes #5243
2022-11-26 14:05:00 -08:00
Qstick f47abd0d99 Fix movie reference in PlexListRequestGenerator 2022-11-25 06:31:41 -06:00
Qstick 381834edce New: IMDb List Support 2022-11-25 06:31:41 -06:00
Qstick ea7af03d69
Fixed: Handle MapSeries when orig language is null 2022-11-24 14:33:12 -06:00
Mark McDowall 99e60196a4 Fixed: Parse year in title from square brackets 2022-11-24 10:12:12 -08:00
Mark McDowall 53a3fc31e2 Fixed: Saving Trakt Popular Import List without Genres 2022-11-24 08:14:23 -08:00
Qstick 08b677ca7d Enforce comment spacing with Stylecop 2022-11-21 16:58:07 -08:00
Qstick be0fa73129 New: Store and use original Series language 2022-11-21 16:58:07 -08:00
Mark McDowall 5400bce129 Publish ApplicationStartingEvent during startup 2022-11-20 19:09:35 -08:00
Qstick 237e7556c2 Bump Newtonsoft to 13.0.1 2022-11-19 17:17:56 -06:00
Qstick 173f456683 Remove Unity (No longer maintained) 2022-11-19 17:01:57 -06:00
Qstick 908d79f2f6 Revert FFMpegCore wrapper to 4.7 to avoid random failures 2022-11-19 16:41:32 -06:00
Mark McDowall c43d06628d Add missing eslint-plugin-react-hooks package 2022-11-18 22:47:27 -08:00
Mark McDowall c8dbbe431a Fixed broken NewznabRequestGenerator tests 2022-11-18 22:33:51 -08:00
Mark McDowall 80af164385 Added SECURITY.md
Closes #4787
2022-11-18 22:05:34 -08:00
Mark McDowall a1e6a2c530 Fix overzealous regex 2022-11-18 22:05:09 -08:00
Mark McDowall f9f08cfea2 New: Perform ID based searches for anime if the indexer supports ID searching
Closes #5090
2022-11-16 19:02:57 -08:00
Mark McDowall ba9651b241 Use string interpolation for Newznab request generation 2022-11-16 19:02:05 -08:00
Mark McDowall ae306274be New: Improve logging when processing files for import
Closes #5226
2022-11-13 18:36:17 -08:00
Mark McDowall 9bd783d49c Improve page scrollbar
New: Style scrollbar in Firefox
Fixed: Scrolling with click and drag

Closes #5189
2022-11-13 18:04:20 -08:00
Mark McDowall 1c6c9a7960 Replace react-custom-scrollbars 2022-11-13 17:54:35 -08:00
Mark McDowall 8c1fb31b5d Fixed: Searching for monitored episodes in series when all seasons are unmonitored 2022-11-12 11:58:57 -08:00
Mark McDowall b3fc905481 Fixed: Parsing of some Anime releases with number at the end of the title 2022-11-12 11:25:47 -08:00
Mark McDowall 381d642593 Added react-hooks lint rules 2022-11-12 11:25:47 -08:00
Mark McDowall b1962c7366 Pin yarn version with volta 2022-11-12 11:25:42 -08:00
Mark McDowall 0e31281828 Fixed: Testing SABnzbd when no categories are configured 2022-11-07 18:58:40 -08:00
Qstick 5e57ffbcf9 New: Base API info endpoint 2022-11-06 17:50:02 -06:00
Qstick 28df29ae8a
Fix FFProbe issues with x264/x265 files 2022-11-06 17:48:59 -06:00
jaja123456789 0844cfb635
Fixed: File Size in Custom Formats 2022-11-06 08:39:22 -08:00
bakerboy448 2fb5655789
New: Add Notifiarr connection 2022-11-06 08:23:51 -08:00
Devin Buhl e5d6e569cf
New: Send additional information with Webhook and Custom Scripts
Closes #5059
2022-11-06 08:21:28 -08:00
luz paz 209a250079 Fix various typos
Found via `codespell -q 3`
2022-11-06 08:19:07 -08:00
Qstick fe476a319e Fixed: Truncate custom format card tags 2022-11-04 11:27:39 -05:00
Qstick fbc258c092 Fixed: Tag details fails for release profiles with tags 2022-11-04 11:09:59 -05:00
Qstick 25eb0ba816 API Docs update 2022-11-04 10:45:47 -05:00
Qstick db77c90724 Bump FFProbe for DTS-ES fix 2022-11-04 10:42:51 -05:00
Mark McDowall 26eab7d821 Fixed: Re-downloading of series images
Closes #5209
2022-10-26 17:06:53 -07:00
Dtaggart 00d467314b
New: Add indexer name to the download report log 2022-10-17 10:19:26 -07:00
Chris d1f2a8a948
Fixed: Cleanse Discord Webhook URLs
Closes #5169
2022-10-16 07:42:33 -08:00
Zak Saunders 9e457c25c3
Fix light theme variable 2022-10-16 07:40:58 -08:00
Qstick 88e993001b fixup UpdateService tests 2022-10-15 20:46:10 -05:00
Qstick 47116ea663 New: Include MediaInfo / CF for Webhooks
Fixes #5166
2022-10-15 14:19:05 -05:00
Qstick 4fc043bb72 fix test for update client exe 2022-10-15 13:58:21 -05:00
Qstick a6ce1ee64c Fixed: Episode title not showing in Cutoff Unmet 2022-10-15 11:35:26 -05:00
Qstick a645681cc8 Clean dual target code 2022-10-15 10:54:38 -05:00
Qstick 2bf87691bc Fixed: Updater version number logging 2022-10-15 10:15:11 -05:00
Mark McDowall 9458f4c796 Fixed interface name after half baked rename 2022-10-03 18:44:07 -07:00
Bakerboy448 238885371b New: Include CustomFormats for CustomScript on Grab 2022-10-03 10:18:14 -07:00
Bakerboy448 77a7f3ef4f New: Include MediaInfo for CustomScripts OnDownload 2022-10-03 10:18:14 -07:00
bakerboy448 7cd38bba84
Fixed: Improve RarBG Error Handling 2022-10-03 10:17:24 -07:00
Stevie Robinson 743d28b93a
Fixed: updated rTorrent download client note 2022-10-03 10:16:46 -07:00
Ultimate 092186dab2
New: Custom import lists
Co-authored-by: TheUltimateCoder <no@e.mail>
2022-10-03 10:15:45 -07:00
Mark McDowall 2a7e2674b7 New: Parse more WEB release names 2022-09-25 21:01:56 -07:00
Mark McDowall 97ad6682f7 Re-order frontend build steps 2022-09-25 00:36:09 -07:00
Mark McDowall 3993ca9ebd New: Parse more BDRemux release names
Closes #5094
2022-09-25 00:26:36 -07:00
Mark McDowall e9123982f3 New: Parse anime version with a space before 'v'
Closes #5103
2022-09-25 00:17:30 -07:00
Mark McDowall 00dd721d9b New: Parsing of GM-Team releases
Closes #5080
2022-09-25 00:00:37 -07:00
Mark McDowall 6f5467e39e Fixed: Indexer tags
Closes #5150
2022-09-24 23:28:04 -07:00
Mark McDowall bd937b9dd3 Fixed: Fall back to sorting by release title if series is not matched
Closes #5151
2022-09-24 22:57:07 -07:00
Mark McDowall 80dd4ce3a1 Fixed Slovak language parsing test 2022-09-24 22:54:22 -07:00
Chromo-residuum-opec d2a23f7bcd
Update help text for rTorrent download client options 2022-09-22 09:51:16 -07:00
bakerboy448 04447d9d4d
Fixed: Repack Preference Ignored 2022-09-22 09:49:19 -07:00
Stevie Robinson c98fac65ed
New: Torrent Seed Ratio no longer advance settings 2022-09-22 09:48:29 -07:00
Stevie Robinson 96345c0a0b
Fixed: Remove non-functional filters for Trakt Lists
Co-authored-by: Qstick <qstick@gmail.com>
2022-09-22 09:48:03 -07:00
Gylesie 3477dfacd0
New: Add Slovak Language 2022-09-22 09:47:19 -07:00
Chris f6e6bc98f7
Added: Ntfy provider for notifications 2022-09-22 09:46:26 -07:00
Robert Dailey 51eeb4ee0f
Fixed: Better error messaging if you try to import an invalid Custom Format 2022-09-22 09:44:45 -07:00
Stevie Robinson e742eb49d7
Update blocklist help text 2022-09-22 09:42:36 -07:00
Qstick 29d8dc81ca Fixed: Avoid iso-mapping failure with Dutch/Flemish 2022-09-17 21:22:31 -05:00
Qstick 56bb87e55f Clean movie references 2022-09-17 21:20:58 -05:00
Mark McDowall 93bd8543b1 Fixed: Ping plex.tv to keep auth token active
Closes #5154
2022-09-17 17:43:33 -07:00
Mark McDowall 6eed7c8fed Handle redirects for 308 redirects 2022-09-17 17:43:33 -07:00
Mark McDowall 67cf95f6c2 Fixed: Settings page description for Metadata Source
Closes #5141
2022-09-17 17:43:33 -07:00
Mark McDowall 9c73786251 Fixed: Series list jump bar click issues 2022-09-17 17:43:33 -07:00
Mark McDowall b6417a6f43 Add Volta node config 2022-09-17 17:43:33 -07:00
Mark McDowall b5439a0661 Improve build pipeline 2022-09-17 17:43:33 -07:00
Qstick dc44cbcda6 Fixed: Language Augment from Folder and Filename 2022-09-06 19:33:29 -05:00
Qstick fa1e67a6c8 Fix Language Selection on Manual Import 2022-08-21 13:09:51 -05:00
Qstick 89ee7d4452 Fixed: Fix NullRef in Subtitle Service due to #4924 2022-08-20 17:59:41 -05:00
Qstick 86b895abe0 Fixed: CF Resolution Specification not matching correctly 2022-08-20 17:57:46 -05:00
Mark McDowall 75919cf779 Use correct Branch variable in builds 2022-08-20 15:54:58 -07:00
Mark McDowall 2967c58a4d Set execution bits when packaging builds 2022-08-20 10:29:56 -07:00
Albert Lee 19c9429c7e
Fixed: Nyaa episode title search 2022-08-18 23:26:09 -07:00
Mark McDowall 6660e0c3f3 New: Use absolute format if absolute episode number is not required and is missing
Closes #5124
2022-08-18 23:06:49 -07:00
Qstick 89b0b04e08 New: Custom Format Language Condition 2022-08-18 19:52:26 -05:00
Mark McDowall 52760e0908 Don't replace private values that haven't been set 2022-08-15 13:39:24 -07:00
Mark McDowall 549cdbe15a New: Add import date to upgraded episodes in CustomScript and Webhook connections
Closes #3615
2022-08-15 13:31:28 -07:00
Mark McDowall 4b5c8a815f Fixed: Grouped items on calendar ignoring series monitored state
Closes #5117
2022-08-15 13:13:57 -07:00
Mark McDowall 09404bacf3 Build Windows x86 installer 2022-08-12 11:58:04 -07:00
Mark McDowall ac8f6f339a Metadata attribution for TheTVDB 2022-08-12 00:14:25 -07:00
Mark McDowall 00ab449ebe Fixed: Search for newly added episodes if disk rescanning is disabled after refresh 2022-08-11 17:28:01 -07:00
Mark McDowall a3e2299011 Debian: Remove mediainfo and mono dependencies 2022-08-08 18:22:36 -07:00
Michael Casey 5938a95abb New: Add UI Localization Framework 2022-08-07 15:24:42 -07:00
Mark McDowall 1977f4aa3c Fixed: Don't process files that don't have a supported media file extension 2022-08-07 15:24:42 -07:00
Mark McDowall d0efdc6c62 Fixed: Warning for search all 2022-08-07 15:24:42 -07:00
Mark McDowall 1f14276770 Don't block task queue for queued update task when there are longer running tasks executing 2022-08-07 15:24:42 -07:00
Devin Buhl 762042ba97 New: Add application URL to host configuration settings 2022-08-07 15:24:42 -07:00
Qstick 18f77a967b New: API Docs 2022-08-07 15:24:41 -07:00
Mark McDowall 269e72a219 New: Migrate user passwords to Pbkdf2 2022-08-07 15:24:41 -07:00
Mark McDowall fe293ff4c3 Fixed Windows installer version 2022-08-07 15:24:41 -07:00
Mark McDowall 652027821d Fixed integration test's path to Sonarr executable 2022-08-07 15:24:41 -07:00
Mark McDowall 90d3dc2f98 FileNameBuilderFixture tests should run on Windows 2022-08-07 15:24:41 -07:00
Mark McDowall 35a5462c8f Build under TeamCity 2022-08-07 15:24:41 -07:00
Mark McDowall ebe9215057 Remove OMG indexer 2022-08-07 15:24:41 -07:00
Mark McDowall fbe412d847 Cleanup usages of isMono 2022-08-07 15:24:40 -07:00
Mark McDowall d3018fb501 New: Authentication is now required 2022-08-07 15:24:40 -07:00
Mark McDowall 570be88215 New: Don't return API Keys and Passwords via the API 2022-08-07 15:24:40 -07:00
Mark McDowall b154b00c61 New: Setting to disable authentication for local addresses 2022-08-07 15:24:40 -07:00
Mark McDowall 05ee4e6449 Sliding expiration for auth cookie and a little clean up 2022-08-07 15:24:40 -07:00
Qstick b04b4000b8 New: Custom Formats
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:24:40 -07:00
Qstick 909af6c874 New: Frontend Package and Lint Updates 2022-08-07 15:24:39 -07:00
Qstick 2291f3e00e New: Native Theme Engine
Co-Authored-By: Zak Saunders <thezak48@users.noreply.github.com>
2022-08-07 15:24:38 -07:00
Marty Zalega e1de523c89 Don't lowercase UrlBase in ConfigFileProvider
UrlBase should honour the case it is given.
2022-08-07 15:24:38 -07:00
Qstick fa0fc3158b New: MediaInfo -> FFProbe
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:24:38 -07:00
Qstick a4232549cb Fix Tray App and Windows Server Restart
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:24:38 -07:00
Qstick e65aebdcf8 New: Use native .NET6 socks proxy
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:24:37 -07:00
Qstick 4c0fe62dda Use modern HttpClient
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:24:37 -07:00
ta264 bff1fe7890 Update to nugets with osx-arm64 runtimes 2022-08-07 15:24:37 -07:00
Qstick 1169741c54 New: Use ASP.NET Core instead of Nancy
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:24:37 -07:00
Qstick b83bb2cade Fixed: Pending Releases Migration 2022-08-07 15:24:36 -07:00
Qstick f50b54b3f6 New: Use System.Text.Json for Nancy and SignalR
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:24:36 -07:00
Qstick 2e953a0eb1 Dapper and STJson
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:24:36 -07:00
Qstick 1c22a1ec0d StyleCop 2022-08-07 15:24:35 -07:00
Qstick 878d1561aa Build Sonarr on Net6
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:46 -07:00
Qstick f79ae77a3a New: Switch to ASPNetCore Kestrel and SignalR
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:43 -07:00
Qstick 4d007855bc Bump NLog to 4.7.14 2022-08-07 15:04:43 -07:00
Qstick fd5ac3c713 Upgrade FluentMigrator from 1.6.2 to v3
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:43 -07:00
Qstick e263331880 Fixed: Remove obsolete HttpProvider
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:43 -07:00
Qstick 78eb8b0e6d Fixed: Remove obsolete XBMC HTTP notification API
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:43 -07:00
Qstick 91c9250d9c Fixed: Remove obsolete Plex HomeTheater/Client notifcations
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:43 -07:00
Qstick d740e995a3 Cleanup OAuth Dep
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:42 -07:00
Qstick da5716cca2 Net standard XMLRPC
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:42 -07:00
Qstick 2200b02112 Convert Interop.NetFwTypeLib to AnyCPU
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-08-07 15:04:42 -07:00
Qstick f7c771f467 Use Sqlite from Servarr 2022-08-07 15:04:42 -07:00
Qstick 52d2a5010a Purge Logentries 2022-08-07 15:04:42 -07:00
Qstick b4ca4908fc Purge V2 API 2022-08-07 15:04:42 -07:00
Qstick fdecd1fea4 Switch Integration Tests to V3 API 2022-08-07 15:04:42 -07:00
Qstick b819246655 Revert "New: Updated MediaInfo to 21.09, Sqlite to 3.32.1.0 and added support for mac osx arm64 arch. Deprecated osx x86."
This reverts commit 201004113e.
2022-08-07 15:04:42 -07:00
bakerboy448 c7919f80de
Fixed: Improve WebDL and WebRip Parsing 2022-08-07 13:43:04 -07:00
David Newhall 1a1d427c42
Fixed: Logging when series folder is moved successfully 2022-08-07 12:03:27 -07:00
bakerboy448 9263fc1564
New: Improve messaging for rejected quality upgrades 2022-08-07 11:54:15 -07:00
Kevin Richter 8ab040f612
Fixed: Improve moving file to location where another one exists 2022-08-07 11:52:54 -07:00
Dominik Krivohlavek d6dff451e0
New: Preserve language tags when importing subtitle files
Closes #2570
Closes #3278
2022-08-07 11:47:14 -07:00
C.J. Manca ac7afc351c
New: Add maximum single episode age option (per indexer) 2022-08-07 11:43:18 -07:00
4450 changed files with 148166 additions and 92925 deletions

View File

@ -0,0 +1,13 @@
// This file is used to open the backend and frontend in the same workspace, which is necessary as
// the frontend has vscode settings that are distinct from the backend
{
"folders": [
{
"path": ".."
},
{
"path": "../frontend"
}
],
"settings": {}
}

View File

@ -0,0 +1,19 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/dotnet
{
"name": "Sonarr",
"image": "mcr.microsoft.com/devcontainers/dotnet:1-6.0",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"nodeGypDependencies": true,
"version": "16",
"nvmVersion": "latest"
}
},
"forwardPorts": [8989],
"customizations": {
"vscode": {
"extensions": ["esbenp.prettier-vscode"]
}
}
}

View File

@ -2,14 +2,274 @@
# editorconfig.org
root = true
[*.{cs}]
# NOTE: Requires **VS2019 16.3** or later
# Stylecop.ruleset
# Description: Rules for Sonarr
# Code files
[*.cs]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4
[*.{js,html,js,hbs,less,css}]
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
# Avoid "this." and "Me." if not necessary
dotnet_style_qualification_for_field = false:refactoring
dotnet_style_qualification_for_property = false:refactoring
dotnet_style_qualification_for_method = false:refactoring
dotnet_style_qualification_for_event = false:refactoring
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_event = false:suggestion
dotnet_naming_style.instance_field_style.capitalization = camel_case
dotnet_naming_style.instance_field_style.required_prefix = _
# Prefer "var" everywhere
csharp_style_var_for_built_in_types = true
csharp_style_var_when_type_is_apparent = true
csharp_style_var_elsewhere = true
# Prefer "out" variables to be declared inline
csharp_style_inlined_variable_declaration = true
# Using directive is unnecessary.
dotnet_diagnostic.IDE0005.severity = error
# Use var instead of explicit type
dotnet_diagnostic.IDE0007.severity = error
# Inline variable declaration
dotnet_diagnostic.IDE0018.severity = error
# Stylecop Rules
dotnet_diagnostic.SA0001.severity = none
dotnet_diagnostic.SA1025.severity = none
dotnet_diagnostic.SA1101.severity = none
dotnet_diagnostic.SA1116.severity = none
dotnet_diagnostic.SA1118.severity = none
dotnet_diagnostic.SA1122.severity = none
dotnet_diagnostic.SA1201.severity = suggestion
dotnet_diagnostic.SA1202.severity = suggestion
dotnet_diagnostic.SA1204.severity = suggestion
dotnet_diagnostic.SA1300.severity = none
dotnet_diagnostic.SA1303.severity = none
dotnet_diagnostic.SA1304.severity = none
dotnet_diagnostic.SA1306.severity = none
dotnet_diagnostic.SA1309.severity = none
dotnet_diagnostic.SA1310.severity = none
dotnet_diagnostic.SA1401.severity = none
dotnet_diagnostic.SA1402.severity = none
dotnet_diagnostic.SA1404.severity = suggestion
dotnet_diagnostic.SA1405.severity = suggestion
dotnet_diagnostic.SA1406.severity = suggestion
dotnet_diagnostic.SA1410.severity = suggestion
dotnet_diagnostic.SA1411.severity = suggestion
dotnet_diagnostic.SA1413.severity = none
dotnet_diagnostic.SA1512.severity = none
dotnet_diagnostic.SA1516.severity = none
dotnet_diagnostic.SA1600.severity = none
dotnet_diagnostic.SA1601.severity = none
dotnet_diagnostic.SA1602.severity = none
dotnet_diagnostic.SA1604.severity = none
dotnet_diagnostic.SA1605.severity = none
dotnet_diagnostic.SA1606.severity = none
dotnet_diagnostic.SA1607.severity = none
dotnet_diagnostic.SA1608.severity = none
dotnet_diagnostic.SA1610.severity = none
dotnet_diagnostic.SA1611.severity = none
dotnet_diagnostic.SA1612.severity = none
dotnet_diagnostic.SA1613.severity = none
dotnet_diagnostic.SA1614.severity = none
dotnet_diagnostic.SA1615.severity = none
dotnet_diagnostic.SA1616.severity = none
dotnet_diagnostic.SA1617.severity = none
dotnet_diagnostic.SA1618.severity = none
dotnet_diagnostic.SA1619.severity = none
dotnet_diagnostic.SA1620.severity = none
dotnet_diagnostic.SA1621.severity = none
dotnet_diagnostic.SA1622.severity = none
dotnet_diagnostic.SA1623.severity = none
dotnet_diagnostic.SA1624.severity = none
dotnet_diagnostic.SA1625.severity = none
dotnet_diagnostic.SA1626.severity = none
dotnet_diagnostic.SA1627.severity = none
dotnet_diagnostic.SA1629.severity = none
dotnet_diagnostic.SA1633.severity = none
dotnet_diagnostic.SA1634.severity = none
dotnet_diagnostic.SA1635.severity = none
dotnet_diagnostic.SA1636.severity = none
dotnet_diagnostic.SA1637.severity = none
dotnet_diagnostic.SA1638.severity = none
dotnet_diagnostic.SA1640.severity = none
dotnet_diagnostic.SA1641.severity = none
dotnet_diagnostic.SA1642.severity = none
dotnet_diagnostic.SA1643.severity = none
dotnet_diagnostic.SA1648.severity = none
dotnet_diagnostic.SA1649.severity = none
dotnet_diagnostic.SA1651.severity = none
dotnet_diagnostic.SX1309.severity = warning
# Microsoft Analyzers that fail and need to be sorted thru
dotnet_diagnostic.ASP0000.severity = suggestion
dotnet_diagnostic.CA1000.severity = suggestion
dotnet_diagnostic.CA1001.severity = suggestion
dotnet_diagnostic.CA1002.severity = suggestion
dotnet_diagnostic.CA1003.severity = suggestion
dotnet_diagnostic.CA1008.severity = suggestion
dotnet_diagnostic.CA1010.severity = suggestion
dotnet_diagnostic.CA1012.severity = suggestion
dotnet_diagnostic.CA1014.severity = suggestion
dotnet_diagnostic.CA1016.severity = suggestion
dotnet_diagnostic.CA1017.severity = suggestion
dotnet_diagnostic.CA1018.severity = suggestion
dotnet_diagnostic.CA1019.severity = suggestion
dotnet_diagnostic.CA1021.severity = suggestion
dotnet_diagnostic.CA1024.severity = suggestion
dotnet_diagnostic.CA1027.severity = suggestion
dotnet_diagnostic.CA1028.severity = suggestion
dotnet_diagnostic.CA1030.severity = suggestion
dotnet_diagnostic.CA1031.severity = suggestion
dotnet_diagnostic.CA1032.severity = suggestion
dotnet_diagnostic.CA1033.severity = suggestion
dotnet_diagnostic.CA1034.severity = suggestion
dotnet_diagnostic.CA1036.severity = suggestion
dotnet_diagnostic.CA1040.severity = suggestion
dotnet_diagnostic.CA1041.severity = suggestion
dotnet_diagnostic.CA1043.severity = suggestion
dotnet_diagnostic.CA1044.severity = suggestion
dotnet_diagnostic.CA1050.severity = suggestion
dotnet_diagnostic.CA1051.severity = suggestion
dotnet_diagnostic.CA1052.severity = suggestion
dotnet_diagnostic.CA1054.severity = suggestion
dotnet_diagnostic.CA1055.severity = suggestion
dotnet_diagnostic.CA1056.severity = suggestion
dotnet_diagnostic.CA1058.severity = suggestion
dotnet_diagnostic.CA1060.severity = suggestion
dotnet_diagnostic.CA1061.severity = suggestion
dotnet_diagnostic.CA1062.severity = suggestion
dotnet_diagnostic.CA1063.severity = suggestion
dotnet_diagnostic.CA1064.severity = suggestion
dotnet_diagnostic.CA1065.severity = suggestion
dotnet_diagnostic.CA1066.severity = suggestion
dotnet_diagnostic.CA1067.severity = suggestion
dotnet_diagnostic.CA1068.severity = suggestion
dotnet_diagnostic.CA1069.severity = suggestion
dotnet_diagnostic.CA1200.severity = suggestion
dotnet_diagnostic.CA1303.severity = suggestion
dotnet_diagnostic.CA1304.severity = suggestion
dotnet_diagnostic.CA1305.severity = suggestion
dotnet_diagnostic.CA1307.severity = suggestion
dotnet_diagnostic.CA1308.severity = suggestion
dotnet_diagnostic.CA1309.severity = suggestion
dotnet_diagnostic.CA1310.severity = suggestion
dotnet_diagnostic.CA1401.severity = suggestion
dotnet_diagnostic.CA1416.severity = suggestion
dotnet_diagnostic.CA1419.severity = suggestion
dotnet_diagnostic.CA1507.severity = suggestion
dotnet_diagnostic.CA1508.severity = suggestion
dotnet_diagnostic.CA1707.severity = suggestion
dotnet_diagnostic.CA1708.severity = suggestion
dotnet_diagnostic.CA1710.severity = suggestion
dotnet_diagnostic.CA1711.severity = suggestion
dotnet_diagnostic.CA1712.severity = suggestion
dotnet_diagnostic.CA1714.severity = suggestion
dotnet_diagnostic.CA1715.severity = suggestion
dotnet_diagnostic.CA1716.severity = suggestion
dotnet_diagnostic.CA1717.severity = suggestion
dotnet_diagnostic.CA1720.severity = suggestion
dotnet_diagnostic.CA1721.severity = suggestion
dotnet_diagnostic.CA1724.severity = suggestion
dotnet_diagnostic.CA1725.severity = suggestion
dotnet_diagnostic.CA1806.severity = suggestion
dotnet_diagnostic.CA1810.severity = suggestion
dotnet_diagnostic.CA1812.severity = suggestion
dotnet_diagnostic.CA1813.severity = suggestion
dotnet_diagnostic.CA1814.severity = suggestion
dotnet_diagnostic.CA1815.severity = suggestion
dotnet_diagnostic.CA1816.severity = suggestion
dotnet_diagnostic.CA1819.severity = suggestion
dotnet_diagnostic.CA1822.severity = suggestion
dotnet_diagnostic.CA1823.severity = suggestion
dotnet_diagnostic.CA1824.severity = suggestion
dotnet_diagnostic.CA1825.severity = suggestion
dotnet_diagnostic.CA2000.severity = suggestion
dotnet_diagnostic.CA2002.severity = suggestion
dotnet_diagnostic.CA2007.severity = suggestion
dotnet_diagnostic.CA2008.severity = suggestion
dotnet_diagnostic.CA2012.severity = suggestion
dotnet_diagnostic.CA2013.severity = suggestion
dotnet_diagnostic.CA2100.severity = suggestion
dotnet_diagnostic.CA2101.severity = suggestion
dotnet_diagnostic.CA2119.severity = suggestion
dotnet_diagnostic.CA2153.severity = suggestion
dotnet_diagnostic.CA2200.severity = suggestion
dotnet_diagnostic.CA2201.severity = suggestion
dotnet_diagnostic.CA2207.severity = suggestion
dotnet_diagnostic.CA2208.severity = suggestion
dotnet_diagnostic.CA2211.severity = suggestion
dotnet_diagnostic.CA2213.severity = suggestion
dotnet_diagnostic.CA2214.severity = suggestion
dotnet_diagnostic.CA2215.severity = suggestion
dotnet_diagnostic.CA2216.severity = suggestion
dotnet_diagnostic.CA2219.severity = suggestion
dotnet_diagnostic.CA2225.severity = suggestion
dotnet_diagnostic.CA2226.severity = suggestion
dotnet_diagnostic.CA2227.severity = suggestion
dotnet_diagnostic.CA2229.severity = suggestion
dotnet_diagnostic.CA2231.severity = suggestion
dotnet_diagnostic.CA2234.severity = suggestion
dotnet_diagnostic.CA2235.severity = suggestion
dotnet_diagnostic.CA2237.severity = suggestion
dotnet_diagnostic.CA2241.severity = suggestion
dotnet_diagnostic.CA2242.severity = suggestion
dotnet_diagnostic.CA2243.severity = suggestion
dotnet_diagnostic.CA2244.severity = suggestion
dotnet_diagnostic.CA2245.severity = suggestion
dotnet_diagnostic.CA2246.severity = suggestion
dotnet_diagnostic.CA2249.severity = suggestion
dotnet_diagnostic.CA2251.severity = suggestion
dotnet_diagnostic.CA3061.severity = suggestion
dotnet_diagnostic.CA3075.severity = suggestion
dotnet_diagnostic.CA3076.severity = suggestion
dotnet_diagnostic.CA3077.severity = suggestion
dotnet_diagnostic.CA3147.severity = suggestion
dotnet_diagnostic.CA5350.severity = suggestion
dotnet_diagnostic.CA5351.severity = suggestion
dotnet_diagnostic.CA5359.severity = suggestion
dotnet_diagnostic.CA5360.severity = suggestion
dotnet_diagnostic.CA5363.severity = suggestion
dotnet_diagnostic.CA5364.severity = suggestion
dotnet_diagnostic.CA5365.severity = suggestion
dotnet_diagnostic.CA5366.severity = suggestion
dotnet_diagnostic.CA5368.severity = suggestion
dotnet_diagnostic.CA5369.severity = suggestion
dotnet_diagnostic.CA5370.severity = suggestion
dotnet_diagnostic.CA5371.severity = suggestion
dotnet_diagnostic.CA5372.severity = suggestion
dotnet_diagnostic.CA5373.severity = suggestion
dotnet_diagnostic.CA5374.severity = suggestion
dotnet_diagnostic.CA5379.severity = suggestion
dotnet_diagnostic.CA5384.severity = suggestion
dotnet_diagnostic.CA5385.severity = suggestion
dotnet_diagnostic.CA5392.severity = suggestion
dotnet_diagnostic.CA5394.severity = suggestion
dotnet_diagnostic.CA5397.severity = suggestion
dotnet_diagnostic.SYSLIB0006.severity = none
[*.{js,html,hbs,less,css,ts,tsx}]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

View File

@ -1,9 +0,0 @@
{
"paths": [
"frontend/src/**/*.js"
],
"ignored": [
"**/node_modules/**/*"
],
"port": 5004
}

View File

@ -1,13 +1,13 @@
name: Bug Report
description: 'Support Requests will be closed immediately, if you are not 100% certain this is a bug please go to our Reddit, Discord, Forums, or IRC first. Exceptions do not mean you found a bug!'
description: 'Only bug reports for v4 will be accepted, older versions are no longer receiving bug fixes and support issues will be closed immediately.'
labels: ['needs-triage']
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an issue already exists for the bug you encountered.
description: Please search to see if an open or closed issue already exists for the bug you encountered. If a bug exists and it is closed as complete it may not yet be in a stable release.
options:
- label: I have searched the existing issues
- label: I have searched the existing open and closed issues
required: true
- type: textarea
attributes:
@ -37,17 +37,19 @@ body:
label: Environment
description: |
examples:
- **OS**: Ubuntu 20.04
- **Sonarr**: Sonarr 3.0.6.1265
- **OS**: Ubuntu 22.04
- **Sonarr**: Sonarr 4.0.0.766
- **Docker Install**: Yes
- **Using Reverse Proxy**: No
- **Browser**: Firefox 90 (If UI related)
- **Database**: Sqlite 3.41.2
value: |
- OS:
- Sonarr:
- Docker Install:
- Using Reverse Proxy:
- Browser:
- Database:
render: markdown
validations:
required: true
@ -74,9 +76,6 @@ body:
label: Anything else?
description: |
Links? Screenshots? References? Anything that will give us more context about the issue you are encountering!
***Generally speaking, all bug reports must have trace logs provided.***
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations:
required: true
required: true
required: false

View File

@ -5,9 +5,9 @@ body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an issue already exists for the feature you are requesting.
description: Please search to see if an open or closed issue already exists for the feature you are requesting. If a feature request exists and it is closed as complete it may not yet be in a stable release.
options:
- label: I have searched the existing issues
- label: I have searched the existing open and closed issues
required: true
- type: textarea
attributes:
@ -32,7 +32,6 @@ body:
label: Anything else?
description: |
Links? References? Mockups? Anything that will give us more context about the feature you are encountering!
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations:
required: true
required: false

View File

@ -1,14 +1,15 @@
#### Database Migration
YES | NO
#### Description
A few sentences describing the overall goals of the pull request's commits.
#### Todos
- [ ] Tests
- [ ] Wiki Updates
<!-- Remove any of the following sections if they are not used -->
#### Screenshots for UI Changes
#### Database Migration
YES - ###
#### Issues Fixed or Closed by this PR
* Closes #
*

7
.github/SUPPORT.md vendored
View File

@ -1,7 +0,0 @@
## Support
There are a number of frequently asked questions that have been answered in our [FAQ](https://wiki.servarr.com/sonarr/faq)
The [wiki](https://wiki.servarr.com/sonarr) contains other information and guides
Please use one of the support channels: [forums](https://forums.sonarr.tv/), [subreddit](https://www.reddit.com/r/sonarr/), [discord ](https://discord.gg/M6BvZn5), or [IRC](https://web.libera.chat/?channels=#sonarr)for support/questions.

29
.github/actions/archive/action.yml vendored Normal file
View File

@ -0,0 +1,29 @@
name: Archive
description: Archive binaries for deployment
inputs:
os:
description: 'OS that the packaging is running on'
required: true
artifact:
description: 'Binary artifact'
required: true
archive_type:
description: 'File type to use for the final package'
required: true
branch:
description: 'Git branch used for this build'
required: true
major_version:
description: 'Sonarr major version'
required: true
version:
description: 'Sonarr version'
required: true
runs:
using: 'composite'
steps:
- name: Archive Artifact
uses: thedoctor0/zip-release@0.7.5

78
.github/actions/package/action.yml vendored Normal file
View File

@ -0,0 +1,78 @@
name: Package
description: Packages binaries for deployment
inputs:
platform:
description: 'Binary platform'
required: true
framework:
description: '.net framework'
required: true
artifact:
description: 'Binary artifact'
required: true
branch:
description: 'Git branch used for this build'
required: true
major_version:
description: 'Sonarr major version'
required: true
version:
description: 'Sonarr version'
required: true
runs:
using: 'composite'
steps:
- name: Download Artifact
uses: actions/download-artifact@v4
with:
name: ${{ inputs.artifact }}
path: _output
- name: Download UI Artifact
uses: actions/download-artifact@v4
with:
name: build_ui
path: _output/UI
- name: Configure Environment Variables
shell: bash
run: |
echo "FRAMEWORK=${{ inputs.framework }}" >> "$GITHUB_ENV"
echo "BRANCH=${{ inputs.branch }}" >> "$GITHUB_ENV"
echo "SONARR_MAJOR_VERSION=${{ inputs.major_version }}" >> "$GITHUB_ENV"
echo "SONARR_VERSION=${{ inputs.version }}" >> "$GITHUB_ENV"
- name: Create Packages
shell: bash
run: $GITHUB_ACTION_PATH/package.sh
- name: Create Windows Installer (x64)
if: ${{ inputs.platform == 'windows' }}
working-directory: distribution/windows/setup
shell: cmd
run: |
SET RUNTIME=win-x64
build.bat
- name: Create Windows Installer (x86)
if: ${{ inputs.platform == 'windows' }}
working-directory: distribution/windows/setup
shell: cmd
run: |
SET RUNTIME=win-x86
build.bat
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: release_${{ inputs.platform }}
compression-level: 0
if-no-files-found: error
path: |
_artifacts/*.exe
_artifacts/*.tar.gz
_artifacts/*.zip

67
.github/actions/package/package.sh vendored Executable file
View File

@ -0,0 +1,67 @@
#!/bin/bash
outputFolder=_output
artifactsFolder=_artifacts
uiFolder="$outputFolder/UI"
framework="${FRAMEWORK:=net6.0}"
rm -rf $artifactsFolder
mkdir $artifactsFolder
for runtime in _output/*
do
name="${runtime##*/}"
folderName="$runtime/$framework"
sonarrFolder="$folderName/Sonarr"
archiveName="Sonarr.$BRANCH.$SONARR_VERSION.$name"
if [[ "$name" == 'UI' ]]; then
continue
fi
echo "Creating package for $name"
echo "Copying UI"
cp -r $uiFolder $sonarrFolder
echo "Setting permissions"
find $sonarrFolder -name "ffprobe" -exec chmod a+x {} \;
find $sonarrFolder -name "Sonarr" -exec chmod a+x {} \;
find $sonarrFolder -name "Sonarr.Update" -exec chmod a+x {} \;
if [[ "$name" == *"osx"* ]]; then
echo "Creating macOS package"
packageName="$name-app"
packageFolder="$outputFolder/$packageName"
rm -rf $packageFolder
mkdir $packageFolder
cp -r distribution/macOS/Sonarr.app $packageFolder
mkdir -p $packageFolder/Sonarr.app/Contents/MacOS
echo "Copying Binaries"
cp -r $sonarrFolder/* $packageFolder/Sonarr.app/Contents/MacOS
echo "Removing Update Folder"
rm -r $packageFolder/Sonarr.app/Contents/MacOS/Sonarr.Update
echo "Packaging macOS app Artifact"
(cd $packageFolder; zip -rq "../../$artifactsFolder/$archiveName-app.zip" ./Sonarr.app)
fi
echo "Packaging Artifact"
if [[ "$name" == *"linux"* ]] || [[ "$name" == *"osx"* ]] || [[ "$name" == *"freebsd"* ]]; then
tar -zcf "./$artifactsFolder/$archiveName.tar.gz" -C $folderName Sonarr
fi
if [[ "$name" == *"win"* ]]; then
if [ "$RUNNER_OS" = "Windows" ]
then
(cd $folderName; 7z a -tzip "../../../$artifactsFolder/$archiveName.zip" ./Sonarr)
else
(cd $folderName; zip -rq "../../../$artifactsFolder/$archiveName.zip" ./Sonarr)
fi
fi
done

View File

@ -0,0 +1,18 @@
name: Publish Test Artifact
description: Publishes a test artifact
inputs:
framework:
description: '.net framework'
required: true
runtime:
description: '.net runtime'
required: true
runs:
using: 'composite'
steps:
- uses: actions/upload-artifact@v4
with:
name: tests-${{ inputs.runtime }}
path: _tests/${{ inputs.framework }}/${{ inputs.runtime }}/publish/**/*

87
.github/actions/test/action.yml vendored Normal file
View File

@ -0,0 +1,87 @@
name: Test
description: Runs unit/integration tests
inputs:
use_postgres:
description: 'Whether postgres should be used for the database'
os:
description: 'OS that the tests are running on'
required: true
artifact:
description: 'Test binary artifact'
required: true
pattern:
description: 'Pattern for DLLs'
required: true
filter:
description: 'Filter for tests'
required: true
integration_tests:
description: 'True if running integration tests'
binary_artifact:
description: 'Binary artifact for integration tests'
binary_path:
description: 'Path witin binary artifact for integration tests'
runs:
using: 'composite'
steps:
- name: Setup .NET
uses: actions/setup-dotnet@v4
- name: Setup Postgres
if: ${{ inputs.use_postgres }}
uses: ikalnytskyi/action-setup-postgres@v4
- name: Setup Test Variables
shell: bash
run: |
echo "RESULTS_NAME=${{ inputs.integration_tests && 'integation-' || 'unit-' }}${{ inputs.artifact }}${{ inputs.use_postgres && '-postgres' }}" >> "$GITHUB_ENV"
- name: Setup Postgres Environment Variables
if: ${{ inputs.use_postgres }}
shell: bash
run: |
echo "Sonarr__Postgres__Host=localhost" >> "$GITHUB_ENV"
echo "Sonarr__Postgres__Port=5432" >> "$GITHUB_ENV"
echo "Sonarr__Postgres__User=postgres" >> "$GITHUB_ENV"
echo "Sonarr__Postgres__Password=postgres" >> "$GITHUB_ENV"
- name: Download Artifact
uses: actions/download-artifact@v4
with:
name: ${{ inputs.artifact }}
path: _tests
- name: Download Binary Artifact
if: ${{ inputs.integration_tests }}
uses: actions/download-artifact@v4
with:
name: ${{ inputs.binary_artifact }}
path: _output
- name: Set up binary artifact
if: ${{ inputs.binary_path != '' }}
shell: bash
run: mv ./_output/${{inputs.binary_path}} _tests/bin
- name: Make executable
if: startsWith(inputs.os, 'windows') != true
shell: bash
run: chmod +x ./_tests/Sonarr.Test.Dummy && chmod +x ./_tests/ffprobe
- name: Make Sonarr binary executable
if: ${{ inputs.integration_tests && !startsWith(inputs.os, 'windows') }}
shell: bash
run: chmod +x ./_tests/bin/Sonarr
- name: Run tests
shell: bash
run: dotnet test ./_tests/Sonarr.*.Test.dll --filter "${{ inputs.filter }}" --logger "trx;LogFileName=${{ env.RESULTS_NAME }}.trx" --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true"
- name: Upload Test Results
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v4
with:
name: results-${{ env.RESULTS_NAME }}
path: TestResults/*.trx

12
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,12 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for more information:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
# https://containers.dev/guide/dependabot
version: 2
updates:
- package-ecosystem: "devcontainers"
directory: "/"
schedule:
interval: weekly

23
.github/labeler.yml vendored Normal file
View File

@ -0,0 +1,23 @@
'connection':
- changed-files:
- any-glob-to-any-file: src/NzbDrone.Core/Notifications/**/*
'db-migration':
- changed-files:
- any-glob-to-any-file: src/NzbDrone.Core/Datastore/Migration/*
'download-client':
- changed-files:
- any-glob-to-any-file: src/NzbDrone.Core/Download/Clients/**/*
'indexer':
- changed-files:
- any-glob-to-any-file: src/NzbDrone.Core/Indexers/**/*
'parsing':
- changed-files:
- any-glob-to-any-file: src/NzbDrone.Core/Parser/**/*
'ui-only':
- changed-files:
- any-glob-to-all-files: frontend/**/*

9
.github/release.yml vendored Normal file
View File

@ -0,0 +1,9 @@
changelog:
exclude:
authors:
- Weblate
- SonarrBot
categories:
- title: Changes
labels:
- '*'

52
.github/workflows/api_docs.yml vendored Normal file
View File

@ -0,0 +1,52 @@
name: 'API Docs'
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * 1'
push:
branches:
- develop
paths:
- ".github/workflows/api_docs.yml"
- "docs.sh"
- "src/Sonarr.Api.*/**"
- "src/Sonarr.Http/**"
- "src/**/*.csproj"
- "src/*"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
api_docs:
runs-on: ubuntu-latest
if: github.repository == 'Sonarr/Sonarr'
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Setup dotnet
uses: actions/setup-dotnet@v4
id: setup-dotnet
- name: Create openapi.json
run: ./docs.sh Linux
- name: Commit API Docs Change
continue-on-error: true
run: |
git config --global user.email "development@sonarr.tv"
git config --global user.name "Sonarr"
git checkout -b api-docs
git add src
if git status | grep -q modified
then
git commit -am 'Automated API Docs update' -m "ignore-downstream"
git push -f --set-upstream origin api-docs
curl -X POST -H "Authorization: Bearer ${{ secrets.OPENAPI_PAT }}" -H "Accept: application/vnd.github+json" https://api.github.com/repos/sonarr/sonarr/pulls -d '{"head":"api-docs","base":"develop","title":"Update API docs"}'
else
echo "No changes since last run"
fi

257
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,257 @@
name: Build
on:
push:
branches:
- develop
- main
paths-ignore:
- "src/Sonarr.Api.*/openapi.json"
pull_request:
branches:
- develop
paths-ignore:
- "src/NzbDrone.Core/Localization/Core/**"
- "src/Sonarr.Api.*/openapi.json"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
FRAMEWORK: net6.0
RAW_BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
SONARR_MAJOR_VERSION: 4
VERSION: 4.0.8
jobs:
backend:
runs-on: windows-latest
outputs:
framework: ${{ steps.variables.outputs.framework }}
major_version: ${{ steps.variables.outputs.major_version }}
version: ${{ steps.variables.outputs.version }}
steps:
- name: Check out
uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
- name: Setup Environment Variables
id: variables
shell: bash
run: |
# Add 800 to the build number because GitHub won't let us pick an arbitrary starting point
SONARR_VERSION="${{ env.VERSION }}.$((${{ github.run_number }}+800))"
DOTNET_VERSION=$(jq -r '.sdk.version' global.json)
echo "SDK_PATH=${{ env.DOTNET_ROOT }}/sdk/${DOTNET_VERSION}" >> "$GITHUB_ENV"
echo "SONARR_VERSION=$SONARR_VERSION" >> "$GITHUB_ENV"
echo "BRANCH=${RAW_BRANCH_NAME//\//-}" >> "$GITHUB_ENV"
echo "framework=${{ env.FRAMEWORK }}" >> "$GITHUB_OUTPUT"
echo "major_version=${{ env.SONARR_MAJOR_VERSION }}" >> "$GITHUB_OUTPUT"
echo "version=$SONARR_VERSION" >> "$GITHUB_OUTPUT"
- name: Enable Extra Platforms In SDK
shell: bash
run: ./build.sh --enable-extra-platforms-in-sdk
- name: Build Backend
shell: bash
run: ./build.sh --backend --enable-extra-platforms --packages
# Test Artifacts
- name: Publish win-x64 Test Artifact
uses: ./.github/actions/publish-test-artifact
with:
framework: ${{ env.FRAMEWORK }}
runtime: win-x64
- name: Publish linux-x64 Test Artifact
uses: ./.github/actions/publish-test-artifact
with:
framework: ${{ env.FRAMEWORK }}
runtime: linux-x64
- name: Publish osx-arm64 Test Artifact
uses: ./.github/actions/publish-test-artifact
with:
framework: ${{ env.FRAMEWORK }}
runtime: osx-arm64
# Build Artifacts (grouped by OS)
- name: Publish FreeBSD Artifact
uses: actions/upload-artifact@v4
with:
name: build_freebsd
path: _artifacts/freebsd-*/**/*
- name: Publish Linux Artifact
uses: actions/upload-artifact@v4
with:
name: build_linux
path: _artifacts/linux-*/**/*
- name: Publish macOS Artifact
uses: actions/upload-artifact@v4
with:
name: build_macos
path: _artifacts/osx-*/**/*
- name: Publish Windows Artifact
uses: actions/upload-artifact@v4
with:
name: build_windows
path: _artifacts/win-*/**/*
frontend:
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v4
- name: Volta
uses: volta-cli/action@v4
- name: Yarn Install
run: yarn install
- name: Lint
run: yarn lint
- name: Stylelint
run: yarn stylelint -f github
- name: Build
run: yarn build --env production
- name: Publish UI Artifact
uses: actions/upload-artifact@v4
with:
name: build_ui
path: _output/UI/**/*
unit_test:
needs: backend
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
include:
- os: ubuntu-latest
artifact: tests-linux-x64
filter: TestCategory!=ManualTest&TestCategory!=WINDOWS&TestCategory!=IntegrationTest&TestCategory!=AutomationTest
- os: macos-latest
artifact: tests-osx-arm64
filter: TestCategory!=ManualTest&TestCategory!=WINDOWS&TestCategory!=IntegrationTest&TestCategory!=AutomationTest
- os: windows-latest
artifact: tests-win-x64
filter: TestCategory!=ManualTest&TestCategory!=LINUX&TestCategory!=IntegrationTest&TestCategory!=AutomationTest
runs-on: ${{ matrix.os }}
steps:
- name: Check out
uses: actions/checkout@v4
- name: Test
uses: ./.github/actions/test
with:
os: ${{ matrix.os }}
artifact: ${{ matrix.artifact }}
pattern: Sonarr.*.Test.dll
filter: ${{ matrix.filter }}
unit_test_postgres:
needs: backend
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v4
- name: Test
uses: ./.github/actions/test
with:
os: ubuntu-latest
artifact: tests-linux-x64
pattern: Sonarr.*.Test.dll
filter: TestCategory!=ManualTest&TestCategory!=WINDOWS&TestCategory!=IntegrationTest&TestCategory!=AutomationTest
use_postgres: true
integration_test:
needs: backend
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
include:
- os: ubuntu-latest
artifact: tests-linux-x64
filter: TestCategory!=ManualTest&TestCategory!=WINDOWS&TestCategory=IntegrationTest
binary_artifact: build_linux
binary_path: linux-x64/${{ needs.backend.outputs.framework }}/Sonarr
- os: macos-latest
artifact: tests-osx-arm64
filter: TestCategory!=ManualTest&TestCategory!=WINDOWS&TestCategory=IntegrationTest
binary_artifact: build_macos
binary_path: osx-arm64/${{ needs.backend.outputs.framework }}/Sonarr
- os: windows-latest
artifact: tests-win-x64
filter: TestCategory!=ManualTest&TestCategory!=LINUX&TestCategory=IntegrationTest
binary_artifact: build_windows
binary_path: win-x64/${{ needs.backend.outputs.framework }}/Sonarr
runs-on: ${{ matrix.os }}
steps:
- name: Check out
uses: actions/checkout@v4
- name: Test
uses: ./.github/actions/test
with:
os: ${{ matrix.os }}
artifact: ${{ matrix.artifact }}
pattern: Sonarr.*.Test.dll
filter: ${{ matrix.filter }}
integration_tests: true
binary_artifact: ${{ matrix.binary_artifact }}
binary_path: ${{ matrix.binary_path }}
deploy:
if: ${{ github.ref_name == 'develop' || github.ref_name == 'main' }}
needs: [backend, frontend, unit_test, unit_test_postgres, integration_test]
secrets: inherit
uses: ./.github/workflows/deploy.yml
with:
framework: ${{ needs.backend.outputs.framework }}
branch: ${{ github.ref_name }}
major_version: ${{ needs.backend.outputs.major_version }}
version: ${{ needs.backend.outputs.version }}
notify:
name: Discord Notification
needs:
[
backend,
frontend,
unit_test,
unit_test_postgres,
integration_test,
deploy,
]
if: ${{ !cancelled() && (github.ref_name == 'develop' || github.ref_name == 'main') }}
env:
STATUS: ${{ contains(needs.*.result, 'failure') && 'failure' || 'success' }}
runs-on: ubuntu-latest
steps:
- name: Notify
uses: tsickert/discord-webhook@v6.0.0
with:
webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }}
username: "GitHub Actions"
avatar-url: "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png"
embed-title: "${{ github.workflow }}: ${{ env.STATUS == 'success' && 'Success' || 'Failure' }}"
embed-url: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
embed-description: |
**Branch** ${{ github.ref }}
**Build** ${{ needs.backend.outputs.version }}
embed-color: ${{ env.STATUS == 'success' && '3066993' || '15158332' }}

26
.github/workflows/conflict_labeler.yml vendored Normal file
View File

@ -0,0 +1,26 @@
name: Merge Conflict Labeler
on:
push:
branches:
- develop
pull_request_target:
branches:
- develop
types: [synchronize]
jobs:
label:
name: Labeling
runs-on: ubuntu-latest
if: ${{ github.repository == 'Sonarr/Sonarr' }}
permissions:
contents: read
pull-requests: write
steps:
- name: Apply label
uses: eps1lon/actions-label-merge-conflict@v3
with:
dirtyLabel: 'merge-conflict'
repoToken: '${{ secrets.GITHUB_TOKEN }}'

160
.github/workflows/deploy.yml vendored Normal file
View File

@ -0,0 +1,160 @@
name: Deploy
on:
workflow_call:
inputs:
framework:
description: '.net framework'
type: string
required: true
branch:
description: 'Git branch used for this build'
type: string
required: true
major_version:
description: 'Sonarr major version'
type: string
required: true
version:
description: 'Sonarr version'
type: string
required: true
secrets:
SERVICES_API_KEY:
required: true
jobs:
package:
strategy:
matrix:
platform: [freebsd, linux, macos, windows]
include:
- platform: freebsd
os: ubuntu-latest
- platform: linux
os: ubuntu-latest
- platform: macos
os: ubuntu-latest
- platform: windows
os: windows-latest
runs-on: ${{ matrix.os }}
steps:
- name: Check out
uses: actions/checkout@v4
- name: Package
uses: ./.github/actions/package
with:
framework: ${{ inputs.framework }}
platform: ${{ matrix.platform }}
artifact: build_${{ matrix.platform }}
branch: ${{ inputs.branch }}
major_version: ${{ inputs.major_version }}
version: ${{ inputs.version }}
release:
needs: package
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Check out
uses: actions/checkout@v4
- name: Download release artifacts
uses: actions/download-artifact@v4
with:
path: _artifacts
pattern: release_*
merge-multiple: true
- name: Get Previous Release
id: previous-release
uses: cardinalby/git-get-release-action@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
latest: true
prerelease: ${{ inputs.branch != 'main' }}
- name: Generate Release Notes
id: generate-release-notes
uses: actions/github-script@v7
with:
github-token: ${{ github.token }}
result-encoding: string
script: |
const { data } = await github.rest.repos.generateReleaseNotes({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: 'v${{ inputs.version }}',
target_commitish: '${{ github.sha }}',
previous_tag_name: '${{ steps.previous-release.outputs.tag_name }}',
})
return data.body
- name: Create release
uses: ncipollo/release-action@v1
with:
artifacts: _artifacts/Sonarr.*
commit: ${{ github.sha }}
generateReleaseNotes: false
body: ${{ steps.generate-release-notes.outputs.result }}
name: ${{ inputs.version }}
prerelease: ${{ inputs.branch != 'main' }}
skipIfReleaseExists: true
tag: v${{ inputs.version }}
- name: Publish to Services
shell: bash
working-directory: _artifacts
run: |
branch=${{ inputs.branch }}
version=${{ inputs.version }}
lastCommit=${{ github.sha }}
hashes="["
addHash() {
path=$1
os=$2
arch=$3
type=$4
local hash=$(sha256sum *.$version.$path | awk '{ print $1; }')
echo "{ \""Os\"": \""$os\"", \""Arch\"": \""$arch\"", \""Type\"": \""$type\"", \""Hash\"": \""$hash\"" }"
}
hashes="$hashes $(addHash "linux-arm.tar.gz" "linux" "arm" "archive")"
hashes="$hashes, $(addHash "linux-arm64.tar.gz" "linux" "arm64" "archive")"
hashes="$hashes, $(addHash "linux-x64.tar.gz" "linux" "x64" "archive")"
# hashes="$hashes, $(addHash "linux-x86.tar.gz" "linux" "x86" "archive")"
# hashes="$hashes, $(addHash "linux-musl-arm.tar.gz" "linuxmusl" "arm" "archive")"
hashes="$hashes, $(addHash "linux-musl-arm64.tar.gz" "linuxmusl" "arm64" "archive")"
hashes="$hashes, $(addHash "linux-musl-x64.tar.gz" "linuxmusl" "x64" "archive")"
hashes="$hashes, $(addHash "osx-arm64.tar.gz" "osx" "arm64" "archive")"
hashes="$hashes, $(addHash "osx-x64.tar.gz" "osx" "x64" "archive")"
hashes="$hashes, $(addHash "osx-arm64-app.zip" "osx" "arm64" "installer")"
hashes="$hashes, $(addHash "osx-x64-app.zip" "osx" "x64" "installer")"
hashes="$hashes, $(addHash "win-x64.zip" "windows" "x64" "archive")"
hashes="$hashes, $(addHash "win-x86.zip" "windows" "x86" "archive")"
hashes="$hashes, $(addHash "win-x64-installer.exe" "windows" "x64" "installer")"
hashes="$hashes, $(addHash "win-x86-installer.exe" "windows" "x86" "installer")"
hashes="$hashes, $(addHash "freebsd-x64.tar.gz" "freebsd" "x64" "archive")"
hashes="$hashes ]"
json="{\""branch\"":\""$branch\"", \""version\"":\""$version\"", \""lastCommit\"":\""$lastCommit\"", \""hashes\"":$hashes, \""gitHubRelease\"":true}"
url="https://services.sonarr.tv/v1/update"
echo "Publishing update $version ($branch) to: $url"
echo "$json"
curl -H "Content-Type: application/json" -H "X-Api-Key: ${{ secrets.SERVICES_API_KEY }}" -X POST -d "$json" --fail-with-body $url

13
.github/workflows/labeler.yml vendored Normal file
View File

@ -0,0 +1,13 @@
name: "Pull Request Labeler"
on:
- pull_request_target
jobs:
triage:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
if: github.repository == 'Sonarr/Sonarr'
steps:
- uses: actions/labeler@v5

View File

@ -8,14 +8,15 @@ on:
jobs:
lock:
runs-on: ubuntu-latest
if: github.repository == 'Sonarr/Sonarr'
steps:
- uses: dessant/lock-threads@v2
- uses: dessant/lock-threads@v5
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '90'
issue-exclude-created-before: ''
issue-exclude-labels: 'one-day-maybe'
issue-lock-labels: ''
issue-lock-comment: ''
issue-inactive-days: '90'
exclude-issue-created-before: ''
exclude-any-issue-labels: 'one-day-maybe'
add-issue-labels: ''
issue-comment: ''
issue-lock-reason: 'resolved'
process-only: ''

26
.gitignore vendored
View File

@ -84,7 +84,6 @@ TestResults
[Tt]est[Rr]esult*
*.Cache
ClientBin
[Ss]tyle[Cc]op.*
~$*
*.dbmdl
Generated_Code #added for RIA/Silverlight projects
@ -117,28 +116,49 @@ src/UI/.idea/*
*log.txt
node_modules/
_output*
_artifacts
_rawPackage/
_dotTrace*
_tests*
_publish*
_temp*
*.Result.xml
coverage*.xml
coverage*.json
setup/Output/
*.~is
UI/
.mono
#VS outout folders
bin
obj
output/*
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
# Packages
Sonarr_*/
Sonarr_*.zip
Sonarr_*.gz
gecko.zip
geckodriver.exe
#OS X metadata files
._*
.DS_Store
_start
_temp_*/**/*
# Windows thumbnail cache files
Thumbs.db
src/.idea/
/distribution/windows/setup/output/*
# API doc generation
.config/

7
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"recommendations": [
"esbenp.prettier-vscode",
"ms-dotnettools.csdevkit",
"ms-vscode-remote.remote-containers"
]
}

26
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"version": "0.2.0",
"configurations": [
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md
"name": "Run Sonarr",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build dotnet",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/_output/net6.0/Sonarr",
"args": [],
"cwd": "${workspaceFolder}",
// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"typescript.tsdk": "node_modules\\typescript\\lib"
}

44
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,44 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build dotnet",
"command": "dotnet",
"type": "process",
"args": [
"msbuild",
"-restore",
"${workspaceFolder}/src/Sonarr.sln",
"-p:GenerateFullPaths=true",
"-p:Configuration=Debug",
"-p:Platform=Posix",
"-consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/src/Sonarr.sln",
"-property:GenerateFullPaths=true",
"-consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/src/Sonarr.sln"
],
"problemMatcher": "$msCompile"
}
]
}

View File

@ -1,5 +1,10 @@
# <img width="24px" src="./Logo/256.png" alt="Sonarr"></img> Sonarr
[![Translated](https://translate.servarr.com/widgets/servarr/-/sonarr/svg-badge.svg)](https://translate.servarr.com/engage/servarr/)
[![Backers on Open Collective](https://opencollective.com/Sonarr/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/Sonarr/sponsors/badge.svg)](#sponsors)
[![Mega Sponsors on Open Collective](https://opencollective.com/Sonarr/megasponsors/badge.svg)](#mega-sponsors)
Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.
## Getting Started
@ -7,10 +12,11 @@ Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS fee
- [Download/Installation](https://sonarr.tv/#downloads-v3)
- [FAQ](https://wiki.servarr.com/sonarr/faq)
- [Wiki](https://wiki.servarr.com/Sonarr)
- [(WIP) API Documentation](https://github.com/Sonarr/Sonarr/wiki/API)
- [v4 Beta API Documentation](https://sonarr.tv/docs/api)
- [Donate](https://sonarr.tv/donate)
## Support
Note: GitHub Issues are for Bugs and Feature Requests Only
- [Forums](https://forums.sonarr.tv/)
@ -20,8 +26,6 @@ Note: GitHub Issues are for Bugs and Feature Requests Only
- [Reddit](https://www.reddit.com/r/sonarr)
- [Wiki](https://wiki.servarr.com/sonarr)
## Features
### Current Features
@ -41,6 +45,7 @@ Note: GitHub Issues are for Bugs and Feature Requests Only
## Contributing
### Development
This project exists thanks to all the people who contribute. [Contribute](CONTRIBUTING.md).
<a href="https://github.com/Sonarr/Sonarr/graphs/contributors"><img src="https://opencollective.com/Sonarr/contributors.svg?width=890&button=false" /></a>
@ -73,4 +78,4 @@ Thank you to [<img src="/Logo/Jetbrains/jetbrains.svg" alt="JetBrains" width="32
### Licenses
- [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
- Copyright 2010-2021
- Copyright 2010-2023

9
SECURITY.md Normal file
View File

@ -0,0 +1,9 @@
# Security Policy
## Reporting a Vulnerability
Please report (suspected) security vulnerabilities on Discord (preferred) to
either markus101
#2148 or Taloth#7357 or via email: security@sonarr.tv. You will receive a response from
us within 72 hours. If the issue is confirmed, we will release a patch as soon
as possible depending on complexity/severity.

678
build.sh
View File

@ -1,125 +1,59 @@
#! /bin/bash
msBuildVersion='15.0'
outputFolder='./_output'
outputFolderWindows='./_output_windows'
outputFolderLinux='./_output_linux'
outputFolderMacOS='./_output_macos'
outputFolderMacOSApp='./_output_macos_app'
testPackageFolder='./_tests'
testPackageFolderWindows='./_tests_windows'
testPackageFolderLinux='./_tests_linux'
sourceFolder='./src'
slnFile=$sourceFolder/Sonarr.sln
updateSubFolder=Sonarr.Update
#! /usr/bin/env bash
set -e
sqlitePackageDir="$HOME/.nuget/packages/system.data.sqlite.core.servarr/1.0.115.5-18"
nuget='tools/nuget/nuget.exe';
vswhere='tools/vswhere/vswhere.exe';
macho='tools/macho/MachOConverter.exe';
. ./version.sh
CheckExitCode()
{
"$@"
local status=$?
if [ $status -ne 0 ]; then
echo "error with $1" >&2
exit 1
fi
return $status
}
outputFolder='_output'
testPackageFolder='_tests'
artifactsFolder="_artifacts";
framework="${FRAMEWORK:=net6.0}"
ProgressStart()
{
echo "##teamcity[blockOpened name='$1']"
echo "##teamcity[progressStart '$1']"
echo "::group::$1"
echo "Start '$1'"
}
ProgressEnd()
{
echo "##teamcity[progressFinish '$1']"
echo "##teamcity[blockClosed name='$1']"
echo "Finish '$1'"
echo "::endgroup::"
}
UpdateVersionNumber()
{
if [ "$BUILD_NUMBER" != "" ]; then
echo "Updating Version Info"
verMajorMinorRevision=`echo "$buildVersion" | cut -d. -f1,2,3`
verBuild=`echo "${BUILD_NUMBER}" | cut -d. -f4`
BUILD_NUMBER=$verMajorMinorRevision.$verBuild
echo "##teamcity[buildNumber '$BUILD_NUMBER']"
sed -i "s/<AssemblyVersion>[0-9.*]\+<\/AssemblyVersion>/<AssemblyVersion>$BUILD_NUMBER<\/AssemblyVersion>/g" ./src/Directory.Build.props
sed -i "s/<AssemblyConfiguration>[\$()A-Za-z-]\+<\/AssemblyConfiguration>/<AssemblyConfiguration>${BRANCH:-dev}<\/AssemblyConfiguration>/g" ./src/Directory.Build.props
if [ "$SONARR_VERSION" != "" ]; then
echo "Updating version info to: $SONARR_VERSION"
sed -i'' -e "s/<AssemblyVersion>[0-9.*]\+<\/AssemblyVersion>/<AssemblyVersion>$SONARR_VERSION<\/AssemblyVersion>/g" src/Directory.Build.props
sed -i'' -e "s/<AssemblyConfiguration>[\$()A-Za-z-]\+<\/AssemblyConfiguration>/<AssemblyConfiguration>${BRANCH}<\/AssemblyConfiguration>/g" src/Directory.Build.props
sed -i'' -e "s/<string>10.0.0.0<\/string>/<string>$SONARR_VERSION<\/string>/g" distribution/macOS/Sonarr.app/Contents/Info.plist
fi
}
CreateReleaseInfo()
EnableExtraPlatformsInSDK()
{
if [ "$BUILD_NUMBER" != "" ]; then
echo "Create Release Info"
echo -e "# Do Not Edit\nReleaseVersion=$BUILD_NUMBER\nBranch=${BRANCH:-dev}" > $outputFolder/release_info
BUNDLEDVERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
if grep -q freebsd-x64 "$BUNDLEDVERSIONS"; then
echo "Extra platforms already enabled"
else
echo "Enabling extra platform support"
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' "$BUNDLEDVERSIONS"
fi
}
CleanFolder()
EnableExtraPlatforms()
{
local path=$1
local keepConfigFiles=$2
find $path -name "*.transform" -exec rm "{}" \;
if [ $keepConfigFiles != true ] ; then
find $path -name "*.dll.config" -exec rm "{}" \;
if grep -qv freebsd-x64 src/Directory.Build.props; then
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64</RuntimeIdentifiers>^g" src/Directory.Build.props
fi
echo "Removing FluentValidation.Resources files"
find $path -name "FluentValidation.resources.dll" -exec rm "{}" \;
find $path -name "App.config" -exec rm "{}" \;
echo "Removing vshost files"
find $path -name "*.vshost.exe" -exec rm "{}" \;
echo "Removing dylib files"
find $path -name "*.dylib" -exec rm "{}" \;
echo "Removing Empty folders"
find $path -depth -empty -type d -exec rm -r "{}" \;
}
BuildWithMSBuild()
{
msBuildPath=`$vswhere -latest -products \* -requires Microsoft.Component.MSBuild -find MSBuild\\\\\*\*\\\\Bin\\\\MSBuild.exe`
msBuildPath=${msBuildPath/C:\\/\/c\/}
msBuildPath=${msBuildPath//\\/\/}
msBuildDir=$(dirname "$msBuildPath")
echo $msBuildDir
export PATH=$msBuildDir:$PATH
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Clean //m
$nuget restore $slnFile
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb
}
BuildWithXbuild()
{
export MONO_IOMAP=case
CheckExitCode msbuild /t:Clean $slnFile
mono $nuget restore $slnFile
CheckExitCode msbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
}
LintUI()
{
ProgressStart 'ESLint'
CheckExitCode yarn lint
yarn lint
ProgressEnd 'ESLint'
ProgressStart 'Stylelint'
CheckExitCode yarn stylelint
yarn stylelint
ProgressEnd 'Stylelint'
}
@ -130,348 +64,392 @@ Build()
rm -rf $outputFolder
rm -rf $testPackageFolder
if [ $runtime = "dotnet" ] ; then
BuildWithMSBuild
slnFile=src/Sonarr.sln
if [ $os = "windows" ]; then
platform=Windows
else
BuildWithXbuild
platform=Posix
fi
CleanFolder $outputFolder false
dotnet clean $slnFile -c Debug
dotnet clean $slnFile -c Release
echo "Removing Sonarr.Update/sqlite3.dll"
rm $outputFolder/Sonarr.Update/sqlite3.dll
echo "Removing Mono.Posix.dll"
rm $outputFolder/Mono.Posix.dll
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids
else
dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids
fi
ProgressEnd 'Build'
}
RunWebpack()
YarnInstall()
{
ProgressStart 'yarn install'
yarn install
yarn install --frozen-lockfile --network-timeout 120000
ProgressEnd 'yarn install'
}
LintUI
RunWebpack()
{
ProgressStart 'Running webpack'
CheckExitCode yarn run build --env production
yarn run build --env production
ProgressEnd 'Running webpack'
}
CreateMdbs()
PackageFiles()
{
local path=$1
if [ $runtime = "dotnet" ] ; then
local pdbFiles=( $(find $path -name "*.pdb") )
for filename in "${pdbFiles[@]}"
do
if [ -e ${filename%.pdb}.dll ] ; then
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.dll
fi
if [ -e ${filename%.pdb}.exe ] ; then
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.exe
fi
done
local folder="$1"
local framework="$2"
local runtime="$3"
rm -rf $folder
mkdir -p $folder
cp -r $outputFolder/$framework/$runtime/publish/* $folder
cp -r $outputFolder/Sonarr.Update/$framework/$runtime/publish $folder/Sonarr.Update
if [ "$FRONTEND" = "YES" ];
then
cp -r $outputFolder/UI $folder
fi
echo "Adding LICENSE"
cp LICENSE.md $folder
}
PatchMono()
PackageLinux()
{
local path=$1
local framework="$1"
local runtime="$2"
# Below we deal with some mono incompatibilities with windows-only dotnet core/standard libs
# See: https://github.com/mono/mono/blob/master/tools/nuget-hash-extractor/download.sh
# That list defines assemblies that are prohibited from being loaded from the appdir, instead loading from mono GAC.
ProgressStart "Creating $runtime Package for $framework"
# We have debian dependencies to get these installed or facades from mono 5.10+
for assembly in System.IO.Compression System.Runtime.InteropServices.RuntimeInformation System.Net.Http System.Globalization.Extensions System.Text.Encoding.CodePages System.Threading.Overlapped
do
if [ -e $path/$assembly.dll ]; then
if [ -e $sourceFolder/Libraries/Mono/$assembly.dll ]; then
echo "Copy Mono-specific facade $assembly.dll (uses win32 interop)"
cp $sourceFolder/Libraries/Mono/$assembly.dll $path/$assembly.dll
else
echo "Remove $assembly.dll (uses win32 interop)"
rm $path/$assembly.dll
fi
local folder=$artifactsFolder/$runtime/$framework/Sonarr
fi
done
# Copy more stable version of Vectors for mono <5.12
if [ -e $path/System.Numerics.Vectors.dll ]; then
packageDir="$HOME/.nuget/packages/system.numerics.vectors/4.5.0"
if [ ! -d "$HOME/.nuget/packages/system.numerics.vectors/4.5.0" ]; then
# May reside in the NuGetFallback folder, which is harder to find
# Download somewhere to get the real cache populated
if [ $runtime = "dotnet" ] ; then
$nuget install System.Numerics.Vectors -Version 4.5.0 -Output ./_temp/System.Numerics.Vectors
else
mono $nuget install System.Numerics.Vectors -Version 4.5.0 -Output ./_temp/System.Numerics.Vectors
fi
rm -rf ./_temp/System.Numerics.Vectors
fi
# Copy the netstandard2.0 version rather than net46
cp "$packageDir/lib/netstandard2.0/System.Numerics.Vectors.dll" $path/
fi
}
PackageMono()
{
ProgressStart 'Creating Mono Package'
rm -rf $outputFolderLinux
echo "Copying Binaries"
cp -r $outputFolder $outputFolderLinux
echo "Creating MDBs"
CreateMdbs $outputFolderLinux
echo "Removing PDBs"
find $outputFolderLinux -name "*.pdb" -exec rm "{}" \;
PackageFiles "$folder" "$framework" "$runtime"
echo "Removing Service helpers"
rm -f $outputFolderLinux/ServiceUninstall.*
rm -f $outputFolderLinux/ServiceInstall.*
echo "Removing native windows binaries Sqlite, MediaInfo"
rm -f $outputFolderLinux/sqlite3.*
rm -f $outputFolderLinux/Sonarr.Update/sqlite3.*
rm -f $outputFolderLinux/MediaInfo.*
PatchMono $outputFolderLinux
echo "Adding Sonarr.Core.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Core/Sonarr.Core.dll.config $outputFolderLinux
# Remove Http binding redirect by renaming it
# We don't need this anymore once our minimum mono version is 5.10
sed -i "s/System.Net.Http/System.Net.Http.Mono/g" $outputFolderLinux/Sonarr.Console.exe.config
echo "Renaming Sonarr.Console.exe to Sonarr.exe"
rm $outputFolderLinux/Sonarr.exe*
for file in $outputFolderLinux/Sonarr.Console.exe*; do
mv "$file" "${file//.Console/}"
done
rm -f $folder/ServiceUninstall.*
rm -f $folder/ServiceInstall.*
echo "Removing Sonarr.Windows"
rm $outputFolderLinux/Sonarr.Windows.*
rm $folder/Sonarr.Windows.*
echo "Adding Sonarr.Mono to UpdatePackage"
cp $outputFolderLinux/Sonarr.Mono.* $outputFolderLinux/$updateSubFolder/
cp $folder/Sonarr.Mono.* $folder/Sonarr.Update
if [ "$framework" = "$framework" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Sonarr.Update
cp $folder/libMonoPosixHelper.* $folder/Sonarr.Update
fi
ProgressEnd 'Creating Mono Package'
ProgressEnd "Creating $runtime Package for $framework"
}
PackageMacOS()
{
ProgressStart 'Creating MacOS Package'
local framework="$1"
local runtime="$2"
rm -rf $outputFolderMacOS
mkdir $outputFolderMacOS
ProgressStart "Creating $runtime Package for $framework"
echo "Copying Binaries"
cp -r $outputFolderLinux/* $outputFolderMacOS
local folder=$artifactsFolder/$runtime/$framework/Sonarr
echo "Adding Sonarr Launcher"
cp ./distribution/osx/Launcher/dist/Launcher $outputFolderMacOS/
mv $outputFolderMacOS/Sonarr.exe $outputFolderMacOS/Sonarr.exe.bak
mv $outputFolderMacOS/Launcher $outputFolderMacOS/Sonarr
mv $outputFolderMacOS/Sonarr.exe.bak $outputFolderMacOS/Sonarr.exe
chmod +x $outputFolderMacOS/Sonarr
PackageFiles "$folder" "$framework" "$runtime"
echo "Adding Sonarr.Update Launcher"
CheckExitCode cp ./distribution/osx/Launcher/dist/Launcher $outputFolderMacOS/Sonarr.Update/
CheckExitCode mv $outputFolderMacOS/Sonarr.Update/Sonarr.Update.exe $outputFolderMacOS/Sonarr.Update/Sonarr.Update.exe.bak
CheckExitCode mv $outputFolderMacOS/Sonarr.Update/Launcher $outputFolderMacOS/Sonarr.Update/Sonarr.Update
CheckExitCode mv $outputFolderMacOS/Sonarr.Update/Sonarr.Update.exe.bak $outputFolderMacOS/Sonarr.Update/Sonarr.Update.exe
chmod +x $outputFolderMacOS/Sonarr.Update/Sonarr.Update
echo "Removing Service helpers"
rm -f $folder/ServiceUninstall.*
rm -f $folder/ServiceInstall.*
echo "Adding sqlite dylib"
CheckExitCode cp "$sqlitePackageDir/runtimes/osx-x64/native/net46"/*.config $outputFolderMacOS/
if [ $runtime = "dotnet" ] ; then
CheckExitCode $macho merge $outputFolderMacOS "$sqlitePackageDir/runtimes/osx-x64/native/net46"/*.dylib "$sqlitePackageDir/runtimes/osx-arm64/native/net46"/*.dylib
else
CheckExitCode mono $macho merge $outputFolderMacOS "$sqlitePackageDir/runtimes/osx-x64/native/net46"/*.dylib "$sqlitePackageDir/runtimes/osx-arm64/native/net46"/*.dylib
echo "Removing Sonarr.Windows"
rm $folder/Sonarr.Windows.*
echo "Adding Sonarr.Mono to UpdatePackage"
cp $folder/Sonarr.Mono.* $folder/Sonarr.Update
if [ "$framework" = "$framework" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Sonarr.Update
cp $folder/libMonoPosixHelper.* $folder/Sonarr.Update
fi
echo "Adding MediaInfo dylib"
CheckExitCode cp $sourceFolder/Libraries/MediaInfo/x64/*.dylib $outputFolderMacOS/
ProgressEnd 'Creating MacOS Package'
ProgressEnd "Creating $runtime Package for $framework"
}
PackageMacOSApp()
{
ProgressStart 'Creating macOS App Package'
local framework="$1"
local runtime="$2"
outputFolderMacOSAppBase=$outputFolderMacOSApp/Sonarr.app/Contents/MacOS
outputFolderMacOSAppBin=$outputFolderMacOSAppBase/bin
ProgressStart "Creating $runtime App Package for $framework"
rm -rf $outputFolderMacOSApp
mkdir $outputFolderMacOSApp
cp -r ./distribution/osx/Sonarr.app $outputFolderMacOSApp
mkdir -p $outputFolderMacOSAppBase
local folder=$artifactsFolder/$runtime-app/$framework
echo "Adding Sonarr Launcher"
CheckExitCode cp ./distribution/osx/Launcher/dist/Launcher $outputFolderMacOSAppBase/
CheckExitCode mv $outputFolderMacOSAppBase/Launcher $outputFolderMacOSAppBase/Sonarr
chmod +x $outputFolderMacOSAppBase/Sonarr
rm -rf $folder
mkdir -p $folder
cp -r distribution/macOS/Sonarr.app $folder
mkdir -p $folder/Sonarr.app/Contents/MacOS
echo "Copying Binaries"
mkdir -p $outputFolderMacOSAppBin
CheckExitCode cp -r $outputFolderLinux/* $outputFolderMacOSAppBin
echo "Adding sqlite dylib"
if [ $runtime = "dotnet" ] ; then
CheckExitCode $macho merge $outputFolderMacOSAppBin "$sqlitePackageDir/runtimes/osx-x64/native/net46" "$sqlitePackageDir/runtimes/osx-arm64/native/net46"
else
CheckExitCode mono $macho merge $outputFolderMacOSAppBin "$sqlitePackageDir/runtimes/osx-x64/native/net46" "$sqlitePackageDir/runtimes/osx-arm64/native/net46"
fi
echo "Adding MediaInfo dylib"
CheckExitCode cp $sourceFolder/Libraries/MediaInfo/x64/*.dylib $outputFolderMacOSAppBin/
cp -r $artifactsFolder/$runtime/$framework/Sonarr/* $folder/Sonarr.app/Contents/MacOS
echo "Removing Update Folder"
rm -r $outputFolderMacOSAppBin/Sonarr.Update
echo "# Do Not Edit\nPackageVersion=${BUILD_NUMBER}\nPackageAuthor=[Team Sonarr](https://sonarr.tv)\nReleaseVersion=${BUILD_NUMBER}\nUpdateMethod=$PackageUpdater\nBranch=${Branch:-master}" > $outputFolderMacOSAppBase/package_info
rm -r $folder/Sonarr.app/Contents/MacOS/Sonarr.Update
ProgressEnd 'Creating macOS App Package'
}
PackageTestsMono()
{
ProgressStart 'Creating Mono Test Package'
rm -rf $testPackageFolderLinux
echo "Copying Binaries"
cp -r $testPackageFolder $testPackageFolderLinux
if [ $runtime = "dotnet" ] ; then
$nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderLinux
else
mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderLinux
fi
echo "Creating MDBs"
CreateMdbs $testPackageFolderLinux
echo "Removing PDBs"
find $testPackageFolderLinux -name "*.pdb" -exec rm "{}" \;
PatchMono $testPackageFolderLinux
echo "Adding Sonarr.Core.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Core/Sonarr.Core.dll.config $testPackageFolderLinux
# Remove Http binding redirect by renaming it
# We don't need this anymore once our minimum mono version is 5.10
sed -i "s/System.Net.Http/System.Net.Http.Mono/g" $testPackageFolderLinux/Sonarr.Common.Test.dll.config
cp ./test.sh $testPackageFolderLinux/
dos2unix $testPackageFolderLinux/test.sh
echo "Removing Sonarr.Windows"
rm $testPackageFolderLinux/Sonarr.Windows.*
rm -f $testPackageFolderLinux/*.log.config
CleanFolder $testPackageFolderLinux true
ProgressEnd 'Creating Linux Test Package'
}
PackageTestsWindows()
{
ProgressStart 'Creating Windows Test Package'
rm -rf $testPackageFolderWindows
echo "Copying Binaries"
cp -r $testPackageFolder $testPackageFolderWindows
if [ $runtime = "dotnet" ] ; then
$nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderWindows
else
mono $nuget install NUnit.ConsoleRunner -Version 3.10.0 -Output $testPackageFolderWindows
fi
cp ./test.sh $testPackageFolderWindows
echo "Removing Sonarr.Mono"
rm -f $testPackageFolderWindows/Sonarr.Mono.*
rm -f $testPackageFolderWindows/*.log.config
CleanFolder $testPackageFolderWindows true
ProgressEnd 'Creating Windows Test Package'
ProgressEnd "Creating $runtime App Package for $framework"
}
PackageWindows()
{
ProgressStart 'Creating Windows Package'
local framework="$1"
local runtime="$2"
rm -rf $outputFolderWindows
ProgressStart "Creating Windows Package for $framework"
echo "Copying Binaries"
cp -r $outputFolder $outputFolderWindows
local folder=$artifactsFolder/$runtime/$framework/Sonarr
PackageFiles "$folder" "$framework" "$runtime"
cp -r $outputFolder/$framework-windows/$runtime/publish/* $folder
echo "Removing Sonarr.Mono"
rm -f $outputFolderWindows/Sonarr.Mono.*
rm -f $folder/Sonarr.Mono.*
rm -f $folder/Mono.Posix.NETStandard.*
rm -f $folder/libMonoPosixHelper.*
echo "Adding Sonarr.Windows to UpdatePackage"
cp $outputFolderWindows/Sonarr.Windows.* $outputFolderWindows/$updateSubFolder/
cp $folder/Sonarr.Windows.* $folder/Sonarr.Update
ProgressEnd 'Creating Windows Package'
ProgressEnd "Creating Windows Package for $framework"
}
PublishArtifacts()
Package()
{
ProgressStart 'Publishing Artifacts'
local framework="$1"
local runtime="$2"
local SPLIT
IFS='-' read -ra SPLIT <<< "$runtime"
case "${SPLIT[0]}" in
linux|freebsd*)
PackageLinux "$framework" "$runtime"
;;
win)
PackageWindows "$framework" "$runtime"
;;
osx)
PackageMacOS "$framework" "$runtime"
;;
esac
}
PackageTests()
{
local framework="$1"
local runtime="$2"
ProgressStart "Creating $runtime Test Package for $framework"
cp test.sh "$testPackageFolder/$framework/$runtime/publish"
rm -f $testPackageFolder/$framework/$runtime/*.log.config
ProgressEnd "Creating $runtime Test Package for $framework"
}
UploadTestArtifacts()
{
local framework="$1"
ProgressStart 'Publishing Test Artifacts'
# Tests
echo "##teamcity[publishArtifacts '$testPackageFolderWindows/** => tests.windows.zip']"
echo "##teamcity[publishArtifacts '$testPackageFolderLinux/** => tests.linux.zip']"
for dir in $testPackageFolder/$framework/*
do
local runtime=$(basename "$dir")
echo "##teamcity[publishArtifacts '$testPackageFolder/$framework/$runtime/publish/** => tests.$runtime.zip']"
done
ProgressEnd 'Publishing Test Artifacts'
}
UploadArtifacts()
{
local framework="$1"
ProgressStart 'Publishing Artifacts'
# Releases
echo "##teamcity[publishArtifacts '$outputFolderWindows/** => Sonarr.$BRANCH.$BUILD_NUMBER.windows.zip!Sonarr']"
echo "##teamcity[publishArtifacts '$outputFolderLinux/** => Sonarr.$BRANCH.$BUILD_NUMBER.linux.tar.gz!Sonarr']"
echo "##teamcity[publishArtifacts '$outputFolderMacOS/** => Sonarr.$BRANCH.$BUILD_NUMBER.macos.tar.gz!Sonarr']"
echo "##teamcity[publishArtifacts '$outputFolderMacOSApp/** => Sonarr.$BRANCH.$BUILD_NUMBER.macos.zip']"
for dir in $artifactsFolder/*
do
local runtime=$(basename "$dir")
# Debian Package
echo "##teamcity[publishArtifacts '$artifactsFolder/$runtime/$framework/** => Sonarr.$BRANCH.$SONARR_VERSION.$runtime.zip']"
done
# Debian Package / Windows installer / macOS app
echo "##teamcity[publishArtifacts 'distribution/** => distribution.zip']"
ProgressEnd 'Publishing Artifacts'
}
UploadUIArtifacts()
{
local framework="$1"
ProgressStart 'Publishing UI Artifacts'
# UI folder
echo "##teamcity[publishArtifacts '$outputFolder/UI/** => UI.zip']"
ProgressEnd 'Publishing UI Artifacts'
}
# Use mono or .net depending on OS
case "$(uname -s)" in
CYGWIN*|MINGW32*|MINGW64*|MSYS*)
# on windows, use dotnet
runtime="dotnet"
os="windows"
;;
*)
# otherwise use mono
runtime="mono"
os="posix"
;;
esac
UpdateVersionNumber
Build
CreateReleaseInfo
RunWebpack
PackageMono
PackageMacOS
PackageMacOSApp
PackageTestsMono
PackageTestsWindows
PackageWindows
PublishArtifacts
POSITIONAL=()
if [ $# -eq 0 ]; then
echo "No arguments provided, building everything"
BACKEND=YES
FRONTEND=YES
PACKAGES=YES
LINT=YES
ENABLE_EXTRA_PLATFORMS=NO
ENABLE_EXTRA_PLATFORMS_IN_SDK=NO
fi
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--backend)
BACKEND=YES
shift # past argument
;;
--enable-bsd|--enable-extra-platforms)
ENABLE_EXTRA_PLATFORMS=YES
shift # past argument
;;
--enable-extra-platforms-in-sdk)
ENABLE_EXTRA_PLATFORMS_IN_SDK=YES
shift # past argument
;;
-r|--runtime)
RID="$2"
shift # past argument
shift # past value
;;
-f|--framework)
FRAMEWORK="$2"
shift # past argument
shift # past value
;;
--frontend)
FRONTEND=YES
shift # past argument
;;
--packages)
PACKAGES=YES
shift # past argument
;;
--lint)
LINT=YES
shift # past argument
;;
--all)
BACKEND=YES
FRONTEND=YES
PACKAGES=YES
LINT=YES
shift # past argument
;;
*) # unknown option
POSITIONAL+=("$1") # save it in an array for later
shift # past argument
;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters
if [ "$ENABLE_EXTRA_PLATFORMS_IN_SDK" = "YES" ];
then
EnableExtraPlatformsInSDK
fi
if [ "$BACKEND" = "YES" ];
then
UpdateVersionNumber
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then
EnableExtraPlatforms
fi
Build
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
PackageTests "$framework" "win-x64"
PackageTests "$framework" "win-x86"
PackageTests "$framework" "linux-x64"
PackageTests "$framework" "linux-musl-x64"
PackageTests "$framework" "osx-x64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then
PackageTests "$framework" "freebsd-x64"
fi
else
PackageTests "$FRAMEWORK" "$RID"
fi
UploadTestArtifacts "$framework"
fi
if [ "$FRONTEND" = "YES" ];
then
YarnInstall
if [ "$LINT" = "YES" ];
then
LintUI
fi
RunWebpack
UploadUIArtifacts
fi
if [ "$PACKAGES" = "YES" ];
then
UpdateVersionNumber
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
Package "$framework" "win-x64"
Package "$framework" "win-x86"
Package "$framework" "linux-x64"
Package "$framework" "linux-musl-x64"
Package "$framework" "linux-arm64"
Package "$framework" "linux-musl-arm64"
Package "$framework" "linux-arm"
Package "$framework" "osx-x64"
Package "$framework" "osx-arm64"
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
then
Package "$framework" "freebsd-x64"
fi
else
Package "$FRAMEWORK" "$RID"
fi
UploadArtifacts "$framework"
fi

View File

@ -1,64 +0,0 @@
fromdos ./debian/*
chmod ugo-x ./debian/*
cp -r ./debian ./debian_backup
BuildVersion=${dependent_build_number:-3.10.0.999}
BuildBranch=${dependent_build_branch:-master}
BootstrapVersion=`echo "$BuildVersion" | cut -d. -f1,2,3`
BootstrapUpdater="BuiltIn"
PackageUpdater="apt"
echo Version: "$BuildVersion" Branch: "$BuildBranch"
rm -r ./sonarr_bin/Sonarr.Update
chmod -R ugo-x,ugo+rwX,go-w ./sonarr_bin/*
echo Updating changelog for $BuildVersion
sed -i "s:{version}:$BuildVersion:g; s:{branch}:$BuildBranch:g;" debian/changelog
sed -i "s:{version}:$BuildVersion:g; s:{updater}:$PackageUpdater:g" debian/preinst debian/postinst debian/postrm
sed -i '/#BEGIN BUILTIN UPDATER/,/#END BUILTIN UPDATER/d' debian/preinst debian/postinst debian/postrm
echo "# Do Not Edit\nPackageVersion=$BuildVersion\nPackageAuthor=[Team Sonarr](https://sonarr.tv)\nReleaseVersion=$BuildVersion\nUpdateMethod=$PackageUpdater\nBranch=$BuildBranch" > package_info
echo Running debuild for $BuildVersion
if [ -z "${TEST_OUTPUT}" ]; then
debuild -b
else
debuild -us -uc -b
fi
# Restore debian directory to the original files
rm -rf ./debian
mv ./debian_backup ./debian
echo Updating changelog for $BootstrapVersion
sed -i "s:{version}:$BootstrapVersion:g; s:{branch}:$BuildBranch:g;" debian/changelog
sed -i "s:{version}:$BuildVersion:g; s:{updater}:$BootstrapUpdater:g" debian/preinst debian/postinst debian/postrm
sed -i '/#BEGIN BUILTIN UPDATER/d; /#END BUILTIN UPDATER/d' debian/preinst debian/postinst debian/postrm
echo "# Do Not Edit\nPackageVersion=$BootstrapVersion\nPackageAuthor=[Team Sonarr](https://sonarr.tv)\nReleaseVersion=$BuildVersion\nUpdateMethod=$BootstrapUpdater\nBranch=$BuildBranch" > package_info
echo Running debuild for $BootstrapVersion
if [ -z "${TEST_OUTPUT}" ]; then
debuild -b
else
debuild -us -uc -b
fi
echo Moving stuff around
mv ../sonarr_*.deb ./
mv ../sonarr_*.changes ./
rm ../sonarr_*.build
if [ -z "${TEST_OUTPUT}" ]; then
echo Signing Package
dpkg-sig -k 884589CE --sign builder "sonarr_${BuildVersion}_all.deb"
dpkg-sig -k 884589CE --sign builder "sonarr_${BootstrapVersion}_all.deb"
echo running alien
alien -r -v ./*.deb
else
echo "Exporting packages to ${TEST_OUTPUT}"
dpkg -e "sonarr_${BuildVersion}_all.deb" ${TEST_OUTPUT}/sonarr-build
dpkg -e "sonarr_${BootstrapVersion}_all.deb" ${TEST_OUTPUT}/sonarr-release
cp *.deb ${TEST_OUTPUT}/
fi

View File

@ -1,6 +0,0 @@
[*]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2

View File

@ -1,5 +0,0 @@
sonarr ({version}) {branch}; urgency=low
* Automatic Release.
-- Sonarr <hello@sonarr.tv> Sun, 28 Jan 2018 00:00:00 -0700

View File

@ -1 +0,0 @@
10

View File

@ -1,17 +0,0 @@
#!/bin/sh -e
. /usr/share/debconf/confmodule
db_beginblock
db_input high sonarr/owning_user || true
db_input high sonarr/owning_group || true
db_endblock
db_go
db_beginblock
db_input low sonarr/owning_umask || true
db_input low sonarr/config_directory || true
db_endblock
db_go
exit 0

View File

@ -1,22 +0,0 @@
Section: web
Priority: optional
Maintainer: Sonarr <hello@sonarr.tv>
Source: sonarr
Homepage: https://sonarr.tv
Vcs-Git: git@github.com:Sonarr/Sonarr.git
Vcs-Browser: https://github.com/Sonarr/Sonarr
Build-Depends: debhelper (>= 9),
dh-systemd (>= 1.5),
mono-devel (>= 5.18),
libmono-cil-dev (>= 5.18),
cli-common-dev (>= 0.9+xamarin5)
Package: sonarr
Architecture: all
Provides: nzbdrone
Conflicts: nzbdrone
Replaces: nzbdrone
Depends: adduser, libsqlite3-0 (>= 3.7), libmediainfo0v5 (>= 0.7.52) | libmediainfo0 (>= 0.7.52), mono-runtime (>= 5.18), ca-certificates-mono, libmono-system-net-http4.0-cil (>= 4.0.0~alpha1), ${cli:Depends}, ${misc:Depends}
Recommends: libmediainfo0v5 (>= 18.03) | libmediainfo0 (>= 18.03)
Suggests: sqlite3 (>= 3.7), mediainfo (>= 0.7.52)
Description: Internet PVR

View File

@ -1,24 +0,0 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: sonarr
Source: https://github.com/Sonarr/Sonarr
Files: *
Copyright: 2010-2016 Sonarr <hello@sonarr.tv>
License: GPL-3.0+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
.
On Debian systems, the complete text of the GNU General
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".

View File

@ -1 +0,0 @@
sonarr_3.0.0.0_all.deb web optional

View File

@ -1,2 +0,0 @@
sonarr_bin/* usr/lib/sonarr/bin
package_info usr/lib/sonarr

View File

@ -0,0 +1,182 @@
#!/bin/bash
### Description: Sonarr .NET Debian install
### Originally written for Radarr by: DoctorArr - doctorarr@the-rowlands.co.uk on 2021-10-01 v1.0
### Updates for servarr suite made by Bakerboy448, DoctorArr, brightghost, aeramor and VP-EN
### Version v1.0.0 2023-12-29 - StevieTV - adapted from servarr script for Sonarr installs
### Version V1.0.1 2024-01-02 - StevieTV - remove UTF8-BOM
### Version V1.0.2 2024-01-03 - markus101 - Get user input from /dev/tty
### Version V1.0.3 2024-01-06 - StevieTV - exit script when it is ran from install directory
### Boilerplate Warning
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
#WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
scriptversion="1.0.3"
scriptdate="2024-01-06"
set -euo pipefail
echo "Running Sonarr Install Script - Version [$scriptversion] as of [$scriptdate]"
# Am I root?, need root!
if [ "$EUID" -ne 0 ]; then
echo "Please run as root."
exit
fi
app="sonarr"
app_port="8989"
app_prereq="curl sqlite3 wget"
app_umask="0002"
branch="main"
# Constants
### Update these variables as required for your specific instance
installdir="/opt" # {Update me if needed} Install Location
bindir="${installdir}/${app^}" # Full Path to Install Location
datadir="/var/lib/$app/" # {Update me if needed} AppData directory to use
app_bin=${app^} # Binary Name of the app
# This script should not be ran from installdir, otherwise later in the script the extracted files will be removed before they can be moved to installdir.
if [ "$installdir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ] || [ "$bindir" == "$(dirname -- "$( readlink -f -- "$0"; )")" ]; then
echo "You should not run this script from the intended install directory. The script will exit. Please re-run it from another directory"
exit
fi
# Prompt User
read -r -p "What user should ${app^} run as? (Default: $app): " app_uid < /dev/tty
app_uid=$(echo "$app_uid" | tr -d ' ')
app_uid=${app_uid:-$app}
# Prompt Group
read -r -p "What group should ${app^} run as? (Default: media): " app_guid < /dev/tty
app_guid=$(echo "$app_guid" | tr -d ' ')
app_guid=${app_guid:-media}
echo "This will install [${app^}] to [$bindir] and use [$datadir] for the AppData Directory"
echo "${app^} will run as the user [$app_uid] and group [$app_guid]. By continuing, you've confirmed that the selected user and group will have READ and WRITE access to your Media Library and Download Client Completed Download directories"
read -n 1 -r -s -p $'Press enter to continue or ctrl+c to exit...\n' < /dev/tty
# Create User / Group as needed
if [ "$app_guid" != "$app_uid" ]; then
if ! getent group "$app_guid" >/dev/null; then
groupadd "$app_guid"
fi
fi
if ! getent passwd "$app_uid" >/dev/null; then
adduser --system --no-create-home --ingroup "$app_guid" "$app_uid"
echo "Created and added User [$app_uid] to Group [$app_guid]"
fi
if ! getent group "$app_guid" | grep -qw "$app_uid"; then
echo "User [$app_uid] did not exist in Group [$app_guid]"
usermod -a -G "$app_guid" "$app_uid"
echo "Added User [$app_uid] to Group [$app_guid]"
fi
# Stop the App if running
if service --status-all | grep -Fq "$app"; then
systemctl stop "$app"
systemctl disable "$app".service
echo "Stopped existing $app"
fi
# Create Appdata Directory
# AppData
mkdir -p "$datadir"
chown -R "$app_uid":"$app_guid" "$datadir"
chmod 775 "$datadir"
echo "Directories created"
# Download and install the App
# prerequisite packages
echo ""
echo "Installing pre-requisite Packages"
# shellcheck disable=SC2086
apt update && apt install -y $app_prereq
echo ""
ARCH=$(dpkg --print-architecture)
# get arch
dlbase="https://services.sonarr.tv/v1/download/$branch/latest?version=4&os=linux"
case "$ARCH" in
"amd64") DLURL="${dlbase}&arch=x64" ;;
"armhf") DLURL="${dlbase}&arch=arm" ;;
"arm64") DLURL="${dlbase}&arch=arm64" ;;
*)
echo "Arch not supported"
exit 1
;;
esac
echo ""
echo "Removing previous tarballs"
# -f to Force so we fail if it doesn't exist
rm -f "${app^}".*.tar.gz
echo ""
echo "Downloading..."
wget --content-disposition "$DLURL"
tar -xvzf "${app^}".*.tar.gz
echo ""
echo "Installation files downloaded and extracted"
# remove existing installs
echo "Removing existing installation"
rm -rf "$bindir"
echo "Installing..."
mv "${app^}" $installdir
chown "$app_uid":"$app_guid" -R "$bindir"
chmod 775 "$bindir"
rm -rf "${app^}.*.tar.gz"
# Ensure we check for an update in case user installs older version or different branch
touch "$datadir"/update_required
chown "$app_uid":"$app_guid" "$datadir"/update_required
echo "App Installed"
# Configure Autostart
# Remove any previous app .service
echo "Removing old service file"
rm -rf /etc/systemd/system/"$app".service
# Create app .service with correct user startup
echo "Creating service file"
cat <<EOF | tee /etc/systemd/system/"$app".service >/dev/null
[Unit]
Description=${app^} Daemon
After=syslog.target network.target
[Service]
User=$app_uid
Group=$app_guid
UMask=$app_umask
Type=simple
ExecStart=$bindir/$app_bin -nobrowser -data=$datadir
TimeoutStopSec=20
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# Start the App
echo "Service file created. Attempting to start the app"
systemctl -q daemon-reload
systemctl enable --now -q "$app"
# Finish Update/Installation
host=$(hostname -I)
ip_local=$(grep -oP '^\S*' <<<"$host")
echo ""
echo "Install complete"
sleep 10
STATUS="$(systemctl is-active "$app")"
if [ "${STATUS}" = "active" ]; then
echo "Browse to http://$ip_local:$app_port for the ${app^} GUI"
else
echo "${app^} failed to start"
fi
# Exit
exit 0

View File

@ -1,111 +0,0 @@
#!/bin/sh
set -e
BUILD_VERSION={version}
UPDATER={updater}
. /usr/share/debconf/confmodule
db_get sonarr/owning_user
USER="$RET"
db_get sonarr/owning_group
GROUP="$RET"
db_get sonarr/owning_umask
UMASK="$RET"
db_get sonarr/config_directory
CONFDIR="$RET"
# Add User and Group
if ! getent group "$GROUP" >/dev/null; then
groupadd "$GROUP"
fi
if ! getent passwd "$USER" >/dev/null; then
adduser --system --no-create-home --ingroup "$GROUP" "$USER"
fi
if [ $1 = "configure" ]; then
# Migrate old Sonarr v3 alpha data dir from /var/opt/sonarr or user home
if [ -d "/var/opt/sonarr" ] && [ "$CONFDIR" != "/var/opt/sonarr" ] && [ ! -d "$CONFDIR" ]; then
varoptRoot="/var/opt/sonarr"
varoptAppData="$varoptRoot/.config/Sonarr"
sonarrUserHome=`getent passwd $USER | cut -d ':' -f 6`
sonarrAppData="$sonarrUserHome/.config/Sonarr"
if [ -f "$varoptRoot/sonarr.db" ]; then
# Handle /var/opt/sonarr/sonarr.db
mv "$varoptRoot" "$CONFDIR"
elif [ -f "$varoptAppData/sonarr.db" ]; then
# Handle /var/opt/sonarr/.config/Sonarr/sonarr.db
mv "$varoptAppData" "$CONFDIR"
rm -rf "$varoptRoot"
elif [ -f "$sonarrAppData/sonarr.db" ]; then
# Handle ~/.config/Sonarr/sonarr.db
mv "$sonarrAppData" "$CONFDIR"
rm -rf "$sonarrAppData"
else
mv "$varoptRoot" "$CONFDIR"
fi
chown -R $USER:$GROUP "$CONFDIR"
chmod -R 775 "$CONFDIR"
fi
# Migrate old NzbDrone data dir
if [ -d "/usr/lib/sonarr/nzbdrone-appdata" ] && [ ! -d "$CONFDIR" ]; then
NZBDRONE_DATA=`readlink /usr/lib/sonarr/nzbdrone-appdata`
if [ -f "$NZBDRONE_DATA/config.xml" ] && [ -f "$NZBDRONE_DATA/nzbdrone.db" ]; then
echo "Found NzbDrone database in $NZBDRONE_DATA, copying to $CONFDIR."
mkdir -p "$CONFDIR"
cp $NZBDRONE_DATA/config.xml $NZBDRONE_DATA/nzbdrone.db* "$CONFDIR/"
chown -R $USER:$GROUP "$CONFDIR"
chmod -R 775 "$CONFDIR"
else
echo "Missing NzbDrone database in $NZBDRONE_DATA, skipping migration."
fi
rm /usr/lib/sonarr/nzbdrone-appdata
fi
fi
# Create data directory
if [ ! -d "$CONFDIR" ]; then
mkdir -p "$CONFDIR"
fi
# Set permissions on data directory (always do this instead only on creation in case user was changed via dpkg-reconfigure)
chown -R $USER:$GROUP "$CONFDIR"
#BEGIN BUILTIN UPDATER
# Apply patch if present
if [ "$UPDATER" = "BuiltIn" ] && [ -f /usr/lib/sonarr/bin_patch/release_info ]; then
# It shouldn't be possible to get a wrong bin_patch, but let's check anyway and throw it away if it's wrong
currentVersion=`cat /usr/lib/sonarr/bin_patch/release_info | grep 'ReleaseVersion=' | cut -d= -f 2`
currentRelease=`echo "$currentVersion" | cut -d. -f1,2,3`
currentBuild=`echo "$currentVersion" | cut -d. -f4`
targetVersion=$BUILD_VERSION
targetRelease=`echo "$targetVersion" | cut -d. -f1,2,3`
targetBuild=`echo "$targetVersion" | cut -d. -f4`
if [ "$currentRelease" = "$targetRelease" ] && [ "$currentBuild" -gt "$targetBuild" ]; then
echo "Applying $currentVersion from BuiltIn updater instead of downgrading to $targetVersion"
rm -rf /usr/lib/sonarr/bin
mv /usr/lib/sonarr/bin_patch /usr/lib/sonarr/bin
else
rm -rf /usr/lib/sonarr/bin_patch
fi
fi
#END BUILTIN UPDATER
# Set permissions on /usr/lib/sonarr
chown -R $USER:$GROUP /usr/lib/sonarr
# Update sonarr.service file
sed -i "s:User=\w*:User=$USER:g; s:Group=\w*:Group=$GROUP:g; s:UMask=[0-9]*:UMask=$UMASK:g; s:-data=.*$:-data=$CONFDIR:g" /lib/systemd/system/sonarr.service
#BEGIN BUILTIN UPDATER
if [ "$UPDATER" = "BuiltIn" ]; then
# If we upgraded, signal Sonarr to do an update check on startup instead of scheduled.
touch $CONFDIR/update_required
chown $USER:$GROUP $CONFDIR/update_required
fi
#END BUILTIN UPDATER
#DEBHELPER#
exit 0

View File

@ -1,36 +0,0 @@
#!/bin/sh
set -e
BUILD_VERSION={version}
UPDATER={updater}
if [ $1 = "abort-install" ]; then
# preinst was aborted, possibly due to NzbDrone still running.
# Nothing to do here
:
fi
# The bin directory is expected to be empty, unless the BuiltIn updater added files.
if [ $1 = "remove" ] && [ -d /usr/lib/sonarr/bin ]; then
rm -rf /usr/lib/sonarr/bin
fi
#BEGIN BUILTIN UPDATER
# Remove any existing patch if still present
if [ $1 = "remove" ] && [ -d /usr/lib/sonarr/bin_patch ]; then
rm -rf /usr/lib/sonarr/bin_patch
fi
#END BUILTIN UPDATER
# Purge the entire sonarr configuration directory.
# TODO: Maybe move a minimal backup to tmp?
if [ $1 = "purge" ] && [ -e /usr/share/debconf/confmodule ]; then
. /usr/share/debconf/confmodule
db_get sonarr/config_directory
CONFDIR="$RET"
if [ -d "$CONFDIR" ]; then
rm -rf "$CONFDIR"
fi
fi
#DEBHELPER#

View File

@ -1,91 +0,0 @@
#!/bin/sh
set -e
BUILD_VERSION={version}
UPDATER={updater}
# Deal with existing nzbdrone installs
#
# Existing nzbdrone packages do not have startup scripts and the process might still be running.
# If the user manually installed nzbdrone then the process might still be running too.
if [ $1 = "install" ]; then
psNzbDrone=`ps ax -o'user:20,pid,ppid,unit,args' | grep mono.*NzbDrone\\\\.exe || true`
if [ ! -z "$psNzbDrone" ]; then
# Get the user and optional systemd unit
psNzbDroneUser=`echo "$psNzbDrone" | tr -s ' ' | cut -d ' ' -f 1`
psNzbDroneUnit=`echo "$psNzbDrone" | tr -s ' ' | cut -d ' ' -f 4`
# Get the appdata from the cmdline or get it from the user dir
droneAppData=`echo "$psNzbDrone" | tr ' ' '\n' | grep -- "-data=" | cut -d= -f 2`
if [ "$droneAppData" = "" ]; then
droneUserHome=`getent passwd $psNzbDroneUser | cut -d ':' -f 6`
droneAppData="$droneUserHome/.config/NzbDrone"
fi
if [ "$psNzbDroneUnit" != "-" ] && [ -d /run/systemd/system ]; then
if [ "$psNzbDroneUnit" = "sonarr.service" ]; then
# Conflicts with our new sonarr.service so we have to remove it
echo "NzbDrone systemd startup detected at $psNzbDroneUnit, stopping and removing..."
deb-systemd-invoke stop $psNzbDroneUnit >/dev/null
if [ -f "/etc/systemd/system/$psNzbDroneUnit" ]; then
rm /etc/systemd/system/$psNzbDroneUnit
fi
if [ -f "/usr/lib/systemd/system/$psNzbDroneUnit" ]; then
rm /usr/lib/systemd/system/$psNzbDroneUnit
fi
deb-systemd-helper purge $psNzbDroneUnit >/dev/null
deb-systemd-helper unmask $psNzbDroneUnit >/dev/null
systemctl --system daemon-reload >/dev/null || true
else
# Just disable it, so the user can revisit the settings later
echo "NzbDrone systemd startup detected at $psNzbDroneUnit, stopping and disabling..."
deb-systemd-invoke stop $psNzbDroneUnit >/dev/null
deb-systemd-invoke mask $psNzbDroneUnit >/dev/null
fi
else
# We don't support auto migration for other startup methods, so bail.
# This leaves the sonarr package in an incomplete state.
echo "ps: $psNzbDrone"
echo "Error: An existing Sonarr v2 (NzbDrone) process is running. Remove the NzbDrone auto-startup prior to installing sonarr."
exit 1
fi
# We don't have the debconf configuration yet so we can't migrate the data.
# Instead we symlink so postinst knows where it's at.
if [ -f "/usr/lib/sonarr/nzbdrone-appdata" ]; then
rm "/usr/lib/sonarr/nzbdrone-appdata"
else
mkdir -p "/usr/lib/sonarr"
fi
ln -s $droneAppData /usr/lib/sonarr/nzbdrone-appdata
fi
fi
#BEGIN BUILTIN UPDATER
# Check for supported upgrade paths
if [ $1 = "upgrade" ] && [ "$UPDATER" = "BuiltIn" ] && [ -f /usr/lib/sonarr/bin/release_info ]; then
# If we allow the Built-In updater to upgrade from 3.0.1.123 to 3.0.2.500 and now apt is catching up to 3.0.2.425
# then we need to deal with that 500->425 'downgrade'.
# We do that by preserving the binaries and using those instead for postinst.
currentVersion=`cat /usr/lib/sonarr/bin/release_info | grep 'ReleaseVersion=' | cut -d= -f 2`
currentRelease=`echo "$currentVersion" | cut -d. -f1,2,3`
currentBuild=`echo "$currentVersion" | cut -d. -f4`
targetVersion=$BUILD_VERSION
targetRelease=`echo "$targetVersion" | cut -d. -f1,2,3`
targetBuild=`echo "$targetVersion" | cut -d. -f4`
if [ -d /usr/lib/sonarr/bin_patch ]; then
rm -rf /usr/lib/sonarr/bin_patch
fi
# Check if the existing version is already an upgrade for the included build
if [ "$currentRelease" = "$targetRelease" ] && [ "$currentBuild" -gt "$targetBuild" ]; then
echo "Preserving $currentVersion from BuiltIn updater instead of downgrading to $targetVersion"
cp -r /usr/lib/sonarr/bin /usr/lib/sonarr/bin_patch
fi
fi
#END BUILTIN UPDATER
#DEBHELPER#
exit 0

View File

@ -1,21 +0,0 @@
#!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
EXCLUDE_MODULEREFS = crypt32 httpapi __Internal ole32.dll libmonosgen-2.0
%:
dh $@ --with=systemd --with=cli
# No init script, only systemd
override_dh_installinit:
true
# Sonarr likes debug symbols for logging
override_dh_clistrip:
override_dh_makeclilibs:
override_dh_clideps:
dh_clideps -d -r $(patsubst %,--exclude-moduleref=%,$(EXCLUDE_MODULEREFS))

View File

@ -1,3 +0,0 @@
ignores msbuild
ignores libmediainfo0v5
ignores libc6

View File

@ -11,7 +11,7 @@ Group=sonarr
UMask=002
Type=simple
ExecStart=/usr/bin/mono --debug /usr/lib/sonarr/bin/Sonarr.exe -nobrowser -data=/var/lib/sonarr
ExecStart=/opt/Sonarr/Sonarr -nobrowser -data=/var/lib/sonarr
TimeoutStopSec=20
KillMode=process
Restart=on-failure

View File

@ -1,27 +0,0 @@
Template: sonarr/owning_user
Type: string
Default: sonarr
Description: Sonarr user:
Specify the user that is used to run Sonarr. The user will be created if it does not already exist.
The default 'sonarr' should work fine for most users. You can specify the user group next.
Template: sonarr/owning_group
Type: string
Default: sonarr
Description: Sonarr group:
Specify the group that is used to run Sonarr. The group will be created if it does not already exist.
If the user doesn't already exist then this group will be used as the user's primary group.
Any media files created by Sonarr will be writeable by this group.
It's advisable to keep the group the same between download client, Sonarr and media centers.
Template: sonarr/owning_umask
Type: string
Default: 0002
Description: Sonarr umask:
Specifies the umask of the files created by Sonarr. 0002 means the files will be created with 664 as permissions.
Template: sonarr/config_directory
Type: string
Default: /var/lib/sonarr
Description: Config directory:
Specify the directory where Sonarr stores the internal database and metadata. Media content will be stored elsewhere.

View File

@ -23,11 +23,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>3.0</string>
<string>4.0</string>
<key>CFBundleSignature</key>
<string>xmmd</string>
<key>CFBundleVersion</key>
<string>3.0</string>
<string>4.0</string>
<key>NSAppleScriptEnabled</key>
<string>YES</string>
</dict>

View File

@ -1,459 +0,0 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS

View File

@ -1,28 +0,0 @@
Code reused from duplicati, licensed under LGPL 2.1
Modified for Sonarr by Taloth Saldono
see here for the original source: https://github.com/duplicati/duplicati/tree/679981d29f8a6e445d3c1e6d41e72a673ffaa653/Installer/OSX
License
-------
Sonarr as a whole is licensed under GPL 3.0 as specified in the git repository root.
But to preserve the original intent of the duplicati project, the modified versions of the sources in this folder are dual licensed under LGPL 2.1 and GPL 3.0.
Note: This exception can be freely removed in any copy of Sonarr sources as per LGPL/GPL licensing terms.
A copy of the LGPL 2.1 license is included in the LICENSE.LGPL.md file.
Purpose
-------
The Launcher is a bootstrap/shim application that checks if the appropriate version of mono is installed and subsequently use it to execute Sonarr.
By using a separate application, instead of a shell script, this allows the user to assign certain operating system permissions to Sonarr specifically.
Compiling the Launcher
----------------------
You need an OSX installation with xcode
Then run compile.sh in a terminal
The generated dist/Launcher can be renamed to Sonarr and Sonarr.Update to serve as shims to run Sonarr.exe and Sonarr.Update.exe respectively.

Binary file not shown.

View File

@ -1,32 +0,0 @@
#import "run-with-mono.h"
#import "PFMoveApplication.h"
int const MONO_VERSION_MAJOR = 5;
int const MONO_VERSION_MINOR = 20;
int main() {
@autoreleasepool {
// Use our own executable name so the same compiled binary to be used for forks
NSString * const FileName = NSProcessInfo.processInfo.arguments[0].lastPathComponent;
// Sonarr.Update.exe
NSString * const ASSEMBLY = [NSString stringWithFormat:@"%@.exe", FileName];
// Sonarr Update
NSString * const APP_NAME = [FileName stringByReplacingOccurrencesOfString:@"." withString:@" "];
// -sonarrupdate
NSString * const PROCESS_NAME = [NSString stringWithFormat:@"-%@", [FileName stringByReplacingOccurrencesOfString:@"." withString:@""].lowercaseString];
@try
{
PFMoveToApplicationsFolderIfNecessary();
}
@catch (NSException * ex)
{
NSLog(@"Translocation/Quarantine check failed, starting normally. Reason: %@", ex.reason);
}
return [RunWithMono runAssemblyWithMono:APP_NAME procnamesuffix:PROCESS_NAME assembly:ASSEMBLY major:MONO_VERSION_MAJOR minor:MONO_VERSION_MINOR];
}
}

View File

@ -1,32 +0,0 @@
//
// PFMoveApplication.h, version 1.24
// LetsMove
//
// Created by Andy Kim at Potion Factory LLC on 9/17/09
//
// The contents of this file are dedicated to the public domain.
#ifdef __cplusplus
extern "C" {
#endif
#import <Foundation/Foundation.h>
/**
Moves the running application to ~/Applications or /Applications if the former does not exist.
After the move, it relaunches app from the new location.
DOES NOT work for sandboxed applications.
Call from \c NSApplication's delegate method \c -applicationWillFinishLaunching: method. */
void PFMoveToApplicationsFolderIfNecessary(void);
/**
Check whether an app move is currently in progress.
Returns YES if LetsMove is currently in-progress trying to move the app to the Applications folder, or NO otherwise.
This can be used to work around a crash with apps that terminate after last window is closed.
See https://github.com/potionfactory/LetsMove/issues/64 for details. */
BOOL PFMoveIsInProgress(void);
#ifdef __cplusplus
}
#endif

View File

@ -1,565 +0,0 @@
//
// PFMoveApplication.m, version 1.24
// LetsMove
//
// Created by Andy Kim at Potion Factory LLC on 9/17/09
//
// The contents of this file are dedicated to the public domain.
#import "PFMoveApplication.h"
#import <AppKit/AppKit.h>
#import <Security/Security.h>
#import <dlfcn.h>
#import <sys/mount.h>
@interface LetsMove : NSObject
@end
@implementation LetsMove
+ (NSBundle *)bundle {
return [NSBundle bundleForClass:self];
}
@end
// Strings
// These are macros to be able to use custom i18n tools
#define _I10NS(nsstr) NSLocalizedStringFromTableInBundle(nsstr, @"MoveApplication", [LetsMove bundle], nil)
#define kStrMoveApplicationCouldNotMove _I10NS(@"Could not move to Applications folder")
#define kStrMoveApplicationQuestionTitle _I10NS(@"Move to Applications folder?")
#define kStrMoveApplicationQuestionTitleHome _I10NS(@"Move to Applications folder in your Home folder?")
#define kStrMoveApplicationQuestionMessage _I10NS(@"I can move myself to the Applications folder if you'd like.")
#define kStrMoveApplicationButtonMove _I10NS(@"Move to Applications Folder")
#define kStrMoveApplicationButtonDoNotMove _I10NS(@"Do Not Move")
#define kStrMoveApplicationQuestionInfoWillRequirePasswd _I10NS(@"Note that this will require an administrator password.")
#define kStrMoveApplicationQuestionInfoInDownloadsFolder _I10NS(@"This will keep your Downloads folder uncluttered.")
// Needs to be defined for compiling under 10.5 SDK
#ifndef NSAppKitVersionNumber10_5
#define NSAppKitVersionNumber10_5 949
#endif
// By default, we use a small control/font for the suppression button.
// If you prefer to use the system default (to match your other alerts),
// set this to 0.
#define PFUseSmallAlertSuppressCheckbox 1
static NSString *AlertSuppressKey = @"moveToApplicationsFolderAlertSuppress";
static BOOL MoveInProgress = NO;
// Helper functions
static NSString *PreferredInstallLocation(BOOL *isUserDirectory);
static BOOL IsInApplicationsFolder(NSString *path);
static BOOL IsInDownloadsFolder(NSString *path);
static BOOL IsApplicationAtPathRunning(NSString *path);
static BOOL IsApplicationAtPathNested(NSString *path);
static NSString *ContainingDiskImageDevice(NSString *path);
static BOOL Trash(NSString *path);
static BOOL DeleteOrTrash(NSString *path);
static BOOL AuthorizedInstall(NSString *srcPath, NSString *dstPath, BOOL *canceled);
static BOOL CopyBundle(NSString *srcPath, NSString *dstPath);
static NSString *ShellQuotedString(NSString *string);
static void Relaunch(NSString *destinationPath);
// Main worker function
void PFMoveToApplicationsFolderIfNecessary(void) {
// Make sure to do our work on the main thread.
// Apparently Electron apps need this for things to work properly.
if (![NSThread isMainThread]) {
dispatch_async(dispatch_get_main_queue(), ^{
PFMoveToApplicationsFolderIfNecessary();
});
return;
}
// Skip if user suppressed the alert before
if ([[NSUserDefaults standardUserDefaults] boolForKey:AlertSuppressKey]) return;
// Path of the bundle
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
// Check if the bundle is embedded in another application
BOOL isNestedApplication = IsApplicationAtPathNested(bundlePath);
// Skip if the application is already in some Applications folder,
// unless it's inside another app's bundle.
if (IsInApplicationsFolder(bundlePath) && !isNestedApplication) return;
// OK, looks like we'll need to do a move - set the status variable appropriately
MoveInProgress = YES;
// File Manager
NSFileManager *fm = [NSFileManager defaultManager];
// Are we on a disk image?
NSString *diskImageDevice = ContainingDiskImageDevice(bundlePath);
// Since we are good to go, get the preferred installation directory.
BOOL installToUserApplications = NO;
NSString *applicationsDirectory = PreferredInstallLocation(&installToUserApplications);
NSString *bundleName = [bundlePath lastPathComponent];
NSString *destinationPath = [applicationsDirectory stringByAppendingPathComponent:bundleName];
// Check if we need admin password to write to the Applications directory
BOOL needAuthorization = ([fm isWritableFileAtPath:applicationsDirectory] == NO);
// Check if the destination bundle is already there but not writable
needAuthorization |= ([fm fileExistsAtPath:destinationPath] && ![fm isWritableFileAtPath:destinationPath]);
// Setup the alert
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
{
NSString *informativeText = nil;
[alert setMessageText:(installToUserApplications ? kStrMoveApplicationQuestionTitleHome : kStrMoveApplicationQuestionTitle)];
informativeText = kStrMoveApplicationQuestionMessage;
if (needAuthorization) {
informativeText = [informativeText stringByAppendingString:@" "];
informativeText = [informativeText stringByAppendingString:kStrMoveApplicationQuestionInfoWillRequirePasswd];
}
else if (IsInDownloadsFolder(bundlePath)) {
// Don't mention this stuff if we need authentication. The informative text is long enough as it is in that case.
informativeText = [informativeText stringByAppendingString:@" "];
informativeText = [informativeText stringByAppendingString:kStrMoveApplicationQuestionInfoInDownloadsFolder];
}
[alert setInformativeText:informativeText];
// Add accept button
[alert addButtonWithTitle:kStrMoveApplicationButtonMove];
// Add deny button
NSButton *cancelButton = [alert addButtonWithTitle:kStrMoveApplicationButtonDoNotMove];
[cancelButton setKeyEquivalent:[NSString stringWithFormat:@"%C", 0x1b]]; // Escape key
// Setup suppression button
[alert setShowsSuppressionButton:YES];
if (PFUseSmallAlertSuppressCheckbox) {
NSCell *cell = [[alert suppressionButton] cell];
[cell setControlSize:NSSmallControlSize];
[cell setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
}
}
// Activate app -- work-around for focus issues related to "scary file from internet" OS dialog.
if (![NSApp isActive]) {
[NSApp activateIgnoringOtherApps:YES];
}
if ([alert runModal] == NSAlertFirstButtonReturn) {
NSLog(@"INFO -- Moving myself to the Applications folder");
// Move
if (needAuthorization) {
BOOL authorizationCanceled;
if (!AuthorizedInstall(bundlePath, destinationPath, &authorizationCanceled)) {
if (authorizationCanceled) {
NSLog(@"INFO -- Not moving because user canceled authorization");
MoveInProgress = NO;
return;
}
else {
NSLog(@"ERROR -- Could not copy myself to /Applications with authorization");
goto fail;
}
}
}
else {
// If a copy already exists in the Applications folder, put it in the Trash
if ([fm fileExistsAtPath:destinationPath]) {
// But first, make sure that it's not running
if (IsApplicationAtPathRunning(destinationPath)) {
// Give the running app focus and terminate myself
NSLog(@"INFO -- Switching to an already running version");
[[NSTask launchedTaskWithLaunchPath:@"/usr/bin/open" arguments:[NSArray arrayWithObject:destinationPath]] waitUntilExit];
MoveInProgress = NO;
exit(0);
}
else {
if (!Trash([applicationsDirectory stringByAppendingPathComponent:bundleName]))
goto fail;
}
}
if (!CopyBundle(bundlePath, destinationPath)) {
NSLog(@"ERROR -- Could not copy myself to %@", destinationPath);
goto fail;
}
}
// Trash the original app. It's okay if this fails.
// NOTE: This final delete does not work if the source bundle is in a network mounted volume.
// Calling rm or file manager's delete method doesn't work either. It's unlikely to happen
// but it'd be great if someone could fix this.
if (!isNestedApplication && diskImageDevice == nil && !DeleteOrTrash(bundlePath)) {
NSLog(@"WARNING -- Could not delete application after moving it to Applications folder");
}
// Relaunch.
Relaunch(destinationPath);
// Launched from within a disk image? -- unmount (if no files are open after 5 seconds,
// otherwise leave it mounted).
if (diskImageDevice && !isNestedApplication) {
NSString *script = [NSString stringWithFormat:@"(/bin/sleep 5 && /usr/bin/hdiutil detach %@) &", ShellQuotedString(diskImageDevice)];
[NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", script, nil]];
}
MoveInProgress = NO;
exit(0);
}
// Save the alert suppress preference if checked
else if ([[alert suppressionButton] state] == NSOnState) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:AlertSuppressKey];
}
MoveInProgress = NO;
return;
fail:
{
// Show failure message
alert = [[[NSAlert alloc] init] autorelease];
[alert setMessageText:kStrMoveApplicationCouldNotMove];
[alert runModal];
MoveInProgress = NO;
}
}
BOOL PFMoveIsInProgress() {
return MoveInProgress;
}
#pragma mark -
#pragma mark Helper Functions
static NSString *PreferredInstallLocation(BOOL *isUserDirectory) {
// Return the preferred install location.
// Assume that if the user has a ~/Applications folder, they'd prefer their
// applications to go there.
NSFileManager *fm = [NSFileManager defaultManager];
/*
NSArray *userApplicationsDirs = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES);
if ([userApplicationsDirs count] > 0) {
NSString *userApplicationsDir = [userApplicationsDirs objectAtIndex:0];
BOOL isDirectory;
if ([fm fileExistsAtPath:userApplicationsDir isDirectory:&isDirectory] && isDirectory) {
// User Applications directory exists. Get the directory contents.
NSArray *contents = [fm contentsOfDirectoryAtPath:userApplicationsDir error:NULL];
// Check if there is at least one ".app" inside the directory.
for (NSString *contentsPath in contents) {
if ([[contentsPath pathExtension] isEqualToString:@"app"]) {
if (isUserDirectory) *isUserDirectory = YES;
return [userApplicationsDir stringByResolvingSymlinksInPath];
}
}
}
}
*/
// No user Applications directory in use. Return the machine local Applications directory
if (isUserDirectory) *isUserDirectory = NO;
return [[NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, YES) lastObject] stringByResolvingSymlinksInPath];
}
static BOOL IsInApplicationsFolder(NSString *path) {
// Check all the normal Application directories
NSArray *applicationDirs = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSAllDomainsMask, YES);
for (NSString *appDir in applicationDirs) {
if ([path hasPrefix:appDir]) return YES;
}
// Also, handle the case that the user has some other Application directory (perhaps on a separate data partition).
if ([[path pathComponents] containsObject:@"Applications"]) return YES;
return NO;
}
static BOOL IsInDownloadsFolder(NSString *path) {
NSArray *downloadDirs = NSSearchPathForDirectoriesInDomains(NSDownloadsDirectory, NSAllDomainsMask, YES);
for (NSString *downloadsDirPath in downloadDirs) {
if ([path hasPrefix:downloadsDirPath]) return YES;
}
return NO;
}
static BOOL IsApplicationAtPathRunning(NSString *bundlePath) {
bundlePath = [bundlePath stringByStandardizingPath];
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
// Use the new API on 10.6 or higher to determine if the app is already running
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) {
for (NSRunningApplication *runningApplication in [[NSWorkspace sharedWorkspace] runningApplications]) {
NSString *runningAppBundlePath = [[[runningApplication bundleURL] path] stringByStandardizingPath];
if ([runningAppBundlePath isEqualToString:bundlePath]) {
return YES;
}
}
return NO;
}
#endif
// Use the shell to determine if the app is already running on systems 10.5 or lower
NSString *script = [NSString stringWithFormat:@"/bin/ps ax -o comm | /usr/bin/grep %@/ | /usr/bin/grep -v grep >/dev/null", ShellQuotedString(bundlePath)];
NSTask *task = [NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", script, nil]];
[task waitUntilExit];
// If the task terminated with status 0, it means that the final grep produced 1 or more lines of output.
// Which means that the app is already running
return [task terminationStatus] == 0;
}
static BOOL IsApplicationAtPathNested(NSString *path) {
NSString *containingPath = [path stringByDeletingLastPathComponent];
NSArray *components = [containingPath pathComponents];
for (NSString *component in components) {
if ([[component pathExtension] isEqualToString:@"app"]) {
return YES;
}
}
return NO;
}
static NSString *ContainingDiskImageDevice(NSString *path) {
NSString *containingPath = [path stringByDeletingLastPathComponent];
struct statfs fs;
if (statfs([containingPath fileSystemRepresentation], &fs) || (fs.f_flags & MNT_ROOTFS))
return nil;
NSString *device = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:fs.f_mntfromname length:strlen(fs.f_mntfromname)];
NSTask *hdiutil = [[[NSTask alloc] init] autorelease];
[hdiutil setLaunchPath:@"/usr/bin/hdiutil"];
[hdiutil setArguments:[NSArray arrayWithObjects:@"info", @"-plist", nil]];
[hdiutil setStandardOutput:[NSPipe pipe]];
[hdiutil launch];
[hdiutil waitUntilExit];
NSData *data = [[[hdiutil standardOutput] fileHandleForReading] readDataToEndOfFile];
NSDictionary *info = nil;
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) {
info = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:NULL error:NULL];
}
else {
#endif
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10
info = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:NULL];
#endif
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
}
#endif
if (![info isKindOfClass:[NSDictionary class]]) return nil;
NSArray *images = (NSArray *)[info objectForKey:@"images"];
if (![images isKindOfClass:[NSArray class]]) return nil;
for (NSDictionary *image in images) {
if (![image isKindOfClass:[NSDictionary class]]) return nil;
id systemEntities = [image objectForKey:@"system-entities"];
if (![systemEntities isKindOfClass:[NSArray class]]) return nil;
for (NSDictionary *systemEntity in systemEntities) {
if (![systemEntity isKindOfClass:[NSDictionary class]]) return nil;
NSString *devEntry = [systemEntity objectForKey:@"dev-entry"];
if (![devEntry isKindOfClass:[NSString class]]) return nil;
if ([devEntry isEqualToString:device])
return device;
}
}
return nil;
}
static BOOL Trash(NSString *path) {
BOOL result = NO;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8
if (floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_8) {
result = [[NSFileManager defaultManager] trashItemAtURL:[NSURL fileURLWithPath:path] resultingItemURL:NULL error:NULL];
}
#endif
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11
if (!result) {
result = [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation
source:[path stringByDeletingLastPathComponent]
destination:@""
files:[NSArray arrayWithObject:[path lastPathComponent]]
tag:NULL];
}
#endif
// As a last resort try trashing with AppleScript.
// This allows us to trash the app in macOS Sierra even when the app is running inside
// an app translocation image.
if (!result) {
NSAppleScript *appleScript = [[[NSAppleScript alloc] initWithSource:
[NSString stringWithFormat:@"\
set theFile to POSIX file \"%@\" \n\
tell application \"Finder\" \n\
move theFile to trash \n\
end tell", path]] autorelease];
NSDictionary *errorDict = nil;
NSAppleEventDescriptor *scriptResult = [appleScript executeAndReturnError:&errorDict];
if (scriptResult == nil) {
NSLog(@"Trash AppleScript error: %@", errorDict);
}
result = (scriptResult != nil);
}
if (!result) {
NSLog(@"ERROR -- Could not trash '%@'", path);
}
return result;
}
static BOOL DeleteOrTrash(NSString *path) {
NSError *error;
if ([[NSFileManager defaultManager] removeItemAtPath:path error:&error]) {
return YES;
}
else {
// Don't log warning if on Sierra and running inside App Translocation path
if ([path rangeOfString:@"/AppTranslocation/"].location == NSNotFound)
NSLog(@"WARNING -- Could not delete '%@': %@", path, [error localizedDescription]);
return Trash(path);
}
}
static BOOL AuthorizedInstall(NSString *srcPath, NSString *dstPath, BOOL *canceled) {
if (canceled) *canceled = NO;
// Make sure that the destination path is an app bundle. We're essentially running 'sudo rm -rf'
// so we really don't want to fuck this up.
if (![[dstPath pathExtension] isEqualToString:@"app"]) return NO;
// Do some more checks
if ([[dstPath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) return NO;
if ([[srcPath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) return NO;
int pid, status;
AuthorizationRef myAuthorizationRef;
// Get the authorization
OSStatus err = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &myAuthorizationRef);
if (err != errAuthorizationSuccess) return NO;
AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0};
AuthorizationRights myRights = {1, &myItems};
AuthorizationFlags myFlags = (AuthorizationFlags)(kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights | kAuthorizationFlagPreAuthorize);
err = AuthorizationCopyRights(myAuthorizationRef, &myRights, NULL, myFlags, NULL);
if (err != errAuthorizationSuccess) {
if (err == errAuthorizationCanceled && canceled)
*canceled = YES;
goto fail;
}
static OSStatus (*security_AuthorizationExecuteWithPrivileges)(AuthorizationRef authorization, const char *pathToTool,
AuthorizationFlags options, char * const *arguments,
FILE **communicationsPipe) = NULL;
if (!security_AuthorizationExecuteWithPrivileges) {
// On 10.7, AuthorizationExecuteWithPrivileges is deprecated. We want to still use it since there's no
// good alternative (without requiring code signing). We'll look up the function through dyld and fail
// if it is no longer accessible. If Apple removes the function entirely this will fail gracefully. If
// they keep the function and throw some sort of exception, this won't fail gracefully, but that's a
// risk we'll have to take for now.
security_AuthorizationExecuteWithPrivileges = (OSStatus (*)(AuthorizationRef, const char*,
AuthorizationFlags, char* const*,
FILE **)) dlsym(RTLD_DEFAULT, "AuthorizationExecuteWithPrivileges");
}
if (!security_AuthorizationExecuteWithPrivileges) goto fail;
// Delete the destination
{
char *args[] = {"-rf", (char *)[dstPath fileSystemRepresentation], NULL};
err = security_AuthorizationExecuteWithPrivileges(myAuthorizationRef, "/bin/rm", kAuthorizationFlagDefaults, args, NULL);
if (err != errAuthorizationSuccess) goto fail;
// Wait until it's done
pid = wait(&status);
if (pid == -1 || !WIFEXITED(status)) goto fail; // We don't care about exit status as the destination most likely does not exist
}
// Copy
{
char *args[] = {"-pR", (char *)[srcPath fileSystemRepresentation], (char *)[dstPath fileSystemRepresentation], NULL};
err = security_AuthorizationExecuteWithPrivileges(myAuthorizationRef, "/bin/cp", kAuthorizationFlagDefaults, args, NULL);
if (err != errAuthorizationSuccess) goto fail;
// Wait until it's done
pid = wait(&status);
if (pid == -1 || !WIFEXITED(status) || WEXITSTATUS(status)) goto fail;
}
AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults);
return YES;
fail:
AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults);
return NO;
}
static BOOL CopyBundle(NSString *srcPath, NSString *dstPath) {
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
if ([fm copyItemAtPath:srcPath toPath:dstPath error:&error]) {
return YES;
}
else {
NSLog(@"ERROR -- Could not copy '%@' to '%@' (%@)", srcPath, dstPath, error);
return NO;
}
}
static NSString *ShellQuotedString(NSString *string) {
return [NSString stringWithFormat:@"'%@'", [string stringByReplacingOccurrencesOfString:@"'" withString:@"'\\''"]];
}
static void Relaunch(NSString *destinationPath) {
// The shell script waits until the original app process terminates.
// This is done so that the relaunched app opens as the front-most app.
int pid = [[NSProcessInfo processInfo] processIdentifier];
// Command run just before running open /final/path
NSString *preOpenCmd = @"";
NSString *quotedDestinationPath = ShellQuotedString(destinationPath);
// OS X >=10.5:
// Before we launch the new app, clear xattr:com.apple.quarantine to avoid
// duplicate "scary file from the internet" dialog.
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) {
// Add the -r flag on 10.6
preOpenCmd = [NSString stringWithFormat:@"/usr/bin/xattr -d -r com.apple.quarantine %@", quotedDestinationPath];
}
else {
preOpenCmd = [NSString stringWithFormat:@"/usr/bin/xattr -d com.apple.quarantine %@", quotedDestinationPath];
}
NSString *script = [NSString stringWithFormat:@"(while /bin/kill -0 %d >&/dev/null; do /bin/sleep 0.1; done; %@; /usr/bin/open %@) &", pid, preOpenCmd, quotedDestinationPath];
[NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", script, nil]];
}

View File

@ -1,16 +0,0 @@
#!/bin/bash
# -fobjc-arc: enables ARC
# -fmodules: enables modules so you can import with `@import AppKit;`
# -mmacosx-version-min=10.6: support older OS X versions, this might increase the binary size
if [ ! -d "../dist" ]; then mkdir ../dist; fi
clang PFMoveApplication.m -fno-objc-arc -fmodules -mmacosx-version-min=10.6 -c -o PFMoveApplication.o
clang run-with-mono.m Launcher.m PFMoveApplication.o -fobjc-arc -fmodules -mmacosx-version-min=10.6 -o ../dist/Launcher
rm PFMoveApplication.o
if [ "$1" == "install" ] && [ "$2" != "" ]; then
echo "Installing to $2"
cp ../dist/Launcher $2
chmod +x $2
fi

View File

@ -1,11 +0,0 @@
@import Foundation;
@import AppKit;
@interface RunWithMono : NSObject {
}
+ (void) openDownloadLink:(NSButton*)button;
+ (bool) showDownloadMonoDialog:(NSString *)appName major:(int)major minor:(int)minor;
+ (int) runAssemblyWithMono:(NSString *)appName procnamesuffix:(NSString *)procnamesuffix assembly:(NSString *)assembly major:(int) major minor:(int) minor;
@end

View File

@ -1,258 +0,0 @@
#import "run-with-mono.h"
@import Foundation;
@import AppKit;
NSString * const VERSION_TITLE = @"Cannot launch %@";
NSString * const VERSION_MSG = @"%@ requires the Mono Framework version %d.%d or later.";
NSString * const DOWNLOAD_URL = @"http://www.mono-project.com/download/stable/#download-mac";
// Helper method to see if the user has requested debug output
bool D() {
NSString* v = [[[NSProcessInfo processInfo]environment]objectForKey:@"DEBUG"];
if (v == nil || v.length == 0 || [v isEqual:@"0"] || [v isEqual:@"false"] || [v isEqual:@"f"])
return false;
return true;
}
// Wrapper method to invoke commandline operations and return the string output
NSString *runCommand(NSString *program, NSArray<NSString *> *arguments) {
NSPipe *pipe = [NSPipe pipe];
NSFileHandle *file = pipe.fileHandleForReading;
NSTask *task = [[NSTask alloc] init];
task.launchPath = program;
task.arguments = arguments;
task.standardOutput = pipe;
[task launch];
NSData *data = [file readDataToEndOfFile];
[file closeFile];
[task waitUntilExit];
NSString *cmdOutput = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
if (cmdOutput == nil || cmdOutput.length == 0)
return nil;
return [cmdOutput stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
// Checks if the Mono version is greater than or equal to the desired version
bool isValidMono(NSString *mono, int major, int minor) {
NSFileManager *fileManager = [NSFileManager defaultManager];
if (mono == nil)
return false;
if (![fileManager fileExistsAtPath:mono] || ![fileManager isExecutableFileAtPath:mono])
return false;
NSString *versionInfo = runCommand(mono, @[@"--version"]);
NSRange rg = [versionInfo rangeOfString:@"Mono JIT compiler version \\d+\\.\\d+" options:NSRegularExpressionSearch];
if (rg.location != NSNotFound) {
versionInfo = [versionInfo substringWithRange:rg];
if (D()) NSLog(@"Matched version: %@", versionInfo);
rg = [versionInfo rangeOfString:@"\\d+\\.\\d+" options:NSRegularExpressionSearch];
if (rg.location != NSNotFound) {
versionInfo = [versionInfo substringWithRange:rg];
if (D()) NSLog(@"Matched version: %@", versionInfo);
NSArray<NSString *> *versionComponents = [versionInfo componentsSeparatedByString:@"."];
if ([versionComponents[0] intValue] < major)
return false;
if ([versionComponents[0] intValue] == major && [versionComponents[1] intValue] < minor)
return false;
return true;
}
}
return false;
}
// Attempts to locate a mono with a valid version
NSString *findMono(int major, int minor) {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *currentMono = runCommand(@"/usr/bin/which", @[@"mono"]);
if (D()) NSLog(@"which mono: %@", currentMono);
if (isValidMono(currentMono, major, minor)) {
if (D()) NSLog(@"Found mono with: %@", currentMono);
return currentMono;
}
NSArray *probepaths = @[@"/usr/local/bin/mono", @"/Library/Frameworks/Mono.framework/Versions/Current/bin/mono", @"/opt/local/bin/mono"];
for(NSString* probepath in probepaths) {
if (D()) NSLog(@"Trying mono with: %@", probepath);
if (isValidMono(probepath, major, minor)) {
if (D()) NSLog(@"Found mono with: %@", probepath);
return probepath;
}
}
if (D()) NSLog(@"Failed to find Mono, returning: %@", nil);
return nil;
}
// Check Bundle for quarantine
void checkBundle() {
NSString * const bundlePath = [[NSBundle mainBundle] bundlePath];
NSString * const attributes = runCommand(@"/usr/bin/xattr", @[@"-l", bundlePath]);
if (D()) NSLog(@"Attributes: %@", attributes);
if ([attributes containsString:@"com.apple.quarantine:"]) {
runCommand(@"/usr/bin/xattr", @[@"-dr", @"com.apple.quarantine", bundlePath]);
NSLog(@"Removed quarantine attribute from bundle");
}
}
@implementation RunWithMono
+ (void) openDownloadLink:(NSButton*)button {
if (D()) NSLog(@"Clicked Download");
runCommand(@"/usr/bin/open", @[DOWNLOAD_URL]);
}
// Shows the download dialog, prompting to download Mono
+ (bool) showDownloadMonoDialog:(NSString *)appName major:(int)major minor:(int)minor {
NSAlert *alert = [[NSAlert alloc] init];
[alert setInformativeText:[NSString stringWithFormat:VERSION_MSG, appName, major, minor]];
[alert setMessageText:[NSString stringWithFormat:VERSION_TITLE, appName]];
[alert addButtonWithTitle:@"Cancel"];
[alert addButtonWithTitle:@"Retry"];
[alert addButtonWithTitle:@"Download"];
NSButton *downloadButton = [[alert buttons] objectAtIndex:2];
[downloadButton setTarget:self];
[downloadButton setAction:@selector(openDownloadLink:)];
NSModalResponse btn = [alert runModal];
if (btn == NSAlertFirstButtonReturn) {
if (D()) NSLog(@"Clicked Cancel");
return true;
}
else if (btn == NSAlertSecondButtonReturn) {
if (D()) NSLog(@"Clicked Retry");
return false;
}
return true;
}
// Top-level method, finds Mono with an appropriate version and launches the assembly
+ (int) runAssemblyWithMono: (NSString *)appName procnamesuffix:(NSString *)procnamesuffix assembly:(NSString *)assembly major:(int) major minor:(int) minor {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *assemblyPath;
bool found = false;
NSString *localPath = NSProcessInfo.processInfo.arguments[0].stringByDeletingLastPathComponent;
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSArray *paths = @[
localPath,
[NSString pathWithComponents:@[localPath, @"bin"]],
resourcePath,
[NSString pathWithComponents:@[resourcePath, @"bin"]]
];
for (NSString* entryFolder in paths) {
if (D()) NSLog(@"Checking folder: %@", entryFolder);
assemblyPath = [NSString pathWithComponents:@[entryFolder, assembly]];
if ([fileManager fileExistsAtPath:assemblyPath]) {
found = true;
break;
}
}
if (!found) {
NSLog(@"Assembly file not found");
return 1;
}
if (D()) NSLog(@"assemblyPath: %@", assemblyPath);
checkBundle();
NSString *currentMono = findMono(major, minor);
while (currentMono == nil) {
NSLog(@"No valid mono found!");
bool close = [self showDownloadMonoDialog:appName major:major minor:minor];
if (close)
return 1;
currentMono = findMono(major, minor);
}
// Setup dylib fallback loading
NSMutableArray * dylibPath = [NSMutableArray arrayWithObject:assemblyPath.stringByDeletingLastPathComponent];
// Update the PATH to use the specified mono version
if ([currentMono hasPrefix:@"/"])
{
NSString * curMonoBinDir = currentMono.stringByDeletingLastPathComponent;
NSString * curMonoDir = curMonoBinDir.stringByDeletingLastPathComponent;
NSString * curMonoLibDir = [NSString pathWithComponents:@[curMonoDir, @"lib"]];
NSString * curEnvPath = [NSString stringWithUTF8String:getenv("PATH")];
NSString * newEnvPath = [NSString stringWithFormat:@"%@:%@", curMonoBinDir, curEnvPath];
setenv("PATH", newEnvPath.UTF8String, 1);
[dylibPath addObject:curMonoLibDir];
NSLog(@"Added %@ to PATH", curMonoBinDir);
}
// Setup libsqlite?
/* if [[ -f '/opt/local/lib/libsqlite3.0.dylib' ]]; then
export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"
fi
*/
[dylibPath addObjectsFromArray:@[@"$HOME/lib", @"/usr/local/lib", @"/lib", @"/usr/lib"]];
setenv("DYLD_FALLBACK_LIBRARY_PATH", [dylibPath componentsJoinedByString:@":"].UTF8String, 1);
if (D()) NSLog(@"Running %@ --debug %@", currentMono, assemblyPath);
// Copy commandline arguments
NSMutableArray* arguments = [[NSMutableArray alloc] init];
// Disabled suffix for now coz it's confusing and not preserved on in-app restart
[arguments addObject:currentMono];
//[arguments addObject:[currentMono stringByAppendingString:procnamesuffix]];
[arguments addObject:@"--debug"];
[arguments addObjectsFromArray:[[NSProcessInfo processInfo] arguments]];
// replace the executable-path with the assembly path
[arguments replaceObjectAtIndex:2 withObject:assemblyPath];
// Try switch to mono using execv
char * cPath = strdup([currentMono UTF8String]);
char ** cArgs;
char ** pArgNext = cArgs = malloc(sizeof(*cArgs) * ([arguments count] + 1));
for (NSString *s in arguments) {
*pArgNext++ = strdup([s UTF8String]);
}
*pArgNext = NULL;
int ret = execv(cPath, cArgs);
if (ret != 0)
NSLog(@"Failed execv with errno @d", errno);
// execv failed, cleanup
pArgNext = cArgs;
for (NSString *s in arguments) {
free(*pArgNext++);
}
free(cArgs);
free(cPath);
return -1;
}
@end

View File

@ -1,62 +0,0 @@
#!/bin/sh
#get the bundle's MacOS directory full path
DIR=$(cd "$(dirname "$0")"; pwd)
#change these values to match your app
EXE_PATH="$DIR/Sonarr.exe"
APPNAME="Sonarr"
#set up environment
if [[ -x '/opt/local/bin/mono' ]]; then
# Macports and mono-supplied installer path
export PATH="/opt/local/bin:$PATH"
elif [[ -x '/usr/local/bin/mono' ]]; then
# Homebrew-supplied path to mono
export PATH="/usr/local/bin:$PATH"
fi
export DYLD_FALLBACK_LIBRARY_PATH="$DIR"
if [ -e /Library/Frameworks/Mono.framework ]; then
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$MONO_FRAMEWORK_PATH/lib"
fi
if [[ -f '/opt/local/lib/libsqlite3.0.dylib' ]]; then
export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"
fi
export DYLD_FALLBACK_LIBRARY_PATH="$DYLD_FALLBACK_LIBRARY_PATH:$HOME/lib:/usr/local/lib:/lib:/usr/lib"
#mono version check
REQUIRED_MAJOR=4
REQUIRED_MINOR=6
VERSION_TITLE="Cannot launch $APPNAME"
VERSION_MSG="$APPNAME requires Mono Runtime Environment(MRE) $REQUIRED_MAJOR.$REQUIRED_MINOR or later."
DOWNLOAD_URL="http://www.mono-project.com/download/#download-mac"
MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' | cut -f5 -d\ )"
# if [[ -o DEBUG ]]; then osascript -e "display dialog \"MONO_VERSION: $MONO_VERSION\""; fi
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
if [ -z "$MONO_VERSION" ] \
|| [ $MONO_VERSION_MAJOR -lt $REQUIRED_MAJOR ] \
|| [ $MONO_VERSION_MAJOR -eq $REQUIRED_MAJOR -a $MONO_VERSION_MINOR -lt $REQUIRED_MINOR ]
then
osascript \
-e "set question to display dialog \"$VERSION_MSG\" with title \"$VERSION_TITLE\" buttons {\"Cancel\", \"Download...\"} default button 2" \
-e "if button returned of question is equal to \"Download...\" then open location \"$DOWNLOAD_URL\""
echo "$VERSION_TITLE"
echo "$VERSION_MSG"
exit 1
fi
MONO_EXEC="exec mono --debug"
#run app using mono
$MONO_EXEC "$EXE_PATH"

View File

@ -1,7 +1,7 @@
REM SET BUILD_NUMBER=1
REM SET BRANCH=develop
echo ##teamcity[progressStart 'Building setup file']
inno\ISCC.exe sonarr.iss
echo ##teamcity[progressFinish 'Building setup file']
@REM SET SONARR_MAJOR_VERSION=4
@REM SET SONARR_VERSION=4.0.0.5
@REM SET BRANCH=develop
@REM SET FRAMEWORK=net6.0
@REM SET RUNTIME=win-x64
echo ##teamcity[publishArtifacts 'distribution\windows\setup\output\*.exe']
inno\ISCC.exe sonarr.iss

View File

@ -6,17 +6,20 @@
#define AppURL "https://sonarr.tv/"
#define ForumsURL "https://forums.sonarr.tv/"
#define AppExeName "Sonarr.exe"
#define BuildNumber "3.0"
#define BuildNumber GetEnv('BUILD_NUMBER')
#define BuildNumber "4.0"
#define BuildNumber GetEnv('SONARR_VERSION')
#define MajorVersion GetEnv('SONARR_MAJOR_VERSION')
#define BranchName GetEnv('BRANCH')
#define Framework GetEnv('FRAMEWORK')
#define Runtime GetEnv('RUNTIME')
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; NOTE: The value of AppId uniquely identifies this appl ication.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{56C1065D-3523-4025-B76D-6F73F67F7F71}
AppName={#AppName}
AppVersion=3.0
AppVersion={#MajorVersion}
AppPublisher={#AppPublisher}
AppPublisherURL={#AppURL}
AppSupportURL={#ForumsURL}
@ -26,7 +29,7 @@ DefaultDirName={commonappdata}\Sonarr\bin
DisableDirPage=yes
DefaultGroupName={#AppName}
DisableProgramGroupPage=yes
OutputBaseFilename=Sonarr.{#BranchName}.{#BuildNumber}.windows
OutputBaseFilename=Sonarr.{#BranchName}.{#BuildNumber}.{#Runtime}-installer
SolidCompression=yes
AppCopyright=Creative Commons 3.0 License
AllowUNCPath=False
@ -35,9 +38,10 @@ DisableReadyPage=True
CompressionThreads=2
Compression=lzma2/normal
AppContact={#ForumsURL}
VersionInfoVersion={#BuildNumber}
VersionInfoVersion={#MajorVersion}
SetupLogging=yes
OutputDir=output
OutputDir="..\..\..\_artifacts"
AppverName={#AppName}
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
@ -49,8 +53,8 @@ Name: "startupShortcut"; Description: "Create shortcut in Startup folder (Starts
Name: "none"; Description: "Do not start automatically"; GroupDescription: "Start automatically"; Flags: exclusive unchecked
[Files]
Source: "..\..\..\_output_windows\Sonarr.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\..\..\_output_windows\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "..\..\..\_output\{#Runtime}\{#Framework}\Sonarr\Sonarr.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\..\..\_output\{#Runtime}\{#Framework}\Sonarr\*"; Excludes: "Sonarr.Update"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
@ -80,26 +84,3 @@ begin
Exec('net', 'stop nzbdrone', '', 0, ewWaitUntilTerminated, ResultCode)
Exec('sc', 'delete nzbdrone', '', 0, ewWaitUntilTerminated, ResultCode)
end;
function Framework472IsNotInstalled(): Boolean;
var
bSuccess: Boolean;
regVersion: Cardinal;
begin
Result := True;
bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Release', regVersion);
if (True = bSuccess) and (regVersion >= 461808) then begin
Result := False;
end;
end;
function InitializeSetup(): Boolean;
begin
if Framework472IsNotInstalled() then begin
MsgBox('Sonarr requires Microsoft .NET Framework 4.7.2 or higher.'#13#13
'Please use Windows Update to install this version'#13
'or download it from https://dotnet.microsoft.com/download/dotnet-framework.', mbInformation, MB_OK);
result := false;
end else
result := true;
end;

48
docs.sh Executable file
View File

@ -0,0 +1,48 @@
#!/bin/bash
set -e
FRAMEWORK="net6.0"
PLATFORM=$1
if [ "$PLATFORM" = "Windows" ]; then
RUNTIME="win-x64"
elif [ "$PLATFORM" = "Linux" ]; then
RUNTIME="linux-x64"
elif [ "$PLATFORM" = "Mac" ]; then
RUNTIME="osx-x64"
else
echo "Platform must be provided as first argument: Windows, Linux or Mac"
exit 1
fi
outputFolder='_output'
testPackageFolder='_tests'
rm -rf $outputFolder
rm -rf $testPackageFolder
slnFile=src/Sonarr.sln
platform=Posix
if [ "$PLATFORM" = "Windows" ]; then
application=Sonarr.Console.dll
else
application=Sonarr.dll
fi
dotnet clean $slnFile -c Debug
dotnet clean $slnFile -c Release
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
dotnet new tool-manifest
dotnet tool install --version 6.6.2 Swashbuckle.AspNetCore.Cli
dotnet tool run swagger tofile --output ./src/Sonarr.Api.V3/openapi.json "$outputFolder/$FRAMEWORK/$RUNTIME/$application" v3 &
sleep 45
kill %1
exit 0

View File

@ -1,25 +0,0 @@
{
"remove-empty-rulesets": true,
"always-semicolon": true,
"color-case": "lower",
"block-indent": " ",
"color-shorthand": false,
"element-case": "lower",
"eof-newline": true,
"leading-zero": true,
"quotes": "double",
"sort-order-fallback": "abc",
"space-before-colon": "",
"space-after-colon": " ",
"space-before-combinator": " ",
"space-after-combinator": " ",
"space-between-declarations": "\n",
"space-before-opening-brace": " ",
"space-after-opening-brace": "\n",
"space-after-selector-delimiter": " ",
"space-before-selector-delimiter": "",
"space-before-closing-brace": "\n",
"strip-spaces": true,
"tab-size": true,
"unitless-zero": false
}

View File

@ -1,335 +0,0 @@
{
"indent": {
"value": " ",
"FunctionExpression": 1,
"ArrayExpression": 1,
"ObjectExpression": 1
},
"lineBreak": {
"value": "\n",
"before": {
"ArrayPatternClosing": 0,
"ArrayPatternComma": 0,
"ArrayPatternOpening": 0,
"ArrowFunctionExpressionArrow": 0,
"ArrowFunctionExpressionClosingBrace": ">=1",
"ArrowFunctionExpressionOpeningBrace": 0,
"AssignmentExpression": ">=1",
"AssignmentOperator": 0,
"BlockStatement": 0,
"BreakKeyword": ">=1",
"CallExpression": -1,
"CallExpressionClosingParentheses": -1,
"CallExpressionOpeningParentheses": 0,
"CatchClosingBrace": ">=1",
"CatchKeyword": 0,
"CatchOpeningBrace": 0,
"ClassDeclaration": ">=1",
"ClassDeclarationClosingBrace": ">=1",
"ClassDeclarationOpeningBrace": 0,
"ConditionalExpression": ">=1",
"DeleteOperator": ">=1",
"DoWhileStatement": ">=1",
"DoWhileStatementClosingBrace": ">=1",
"DoWhileStatementOpeningBrace": 0,
"ElseIfStatement": 0,
"ElseIfStatementClosingBrace": ">=1",
"ElseIfStatementOpeningBrace": 0,
"ElseStatement": 0,
"ElseStatementClosingBrace": ">=1",
"ElseStatementOpeningBrace": 0,
"EmptyStatement": -1,
"EndOfFile": -1,
"FinallyClosingBrace": ">=1",
"FinallyKeyword": -1,
"FinallyOpeningBrace": 0,
"ForInStatement": ">=1",
"ForInStatementClosingBrace": ">=1",
"ForInStatementExpressionClosing": 0,
"ForInStatementExpressionOpening": 0,
"ForInStatementOpeningBrace": 0,
"ForStatement": ">=1",
"ForStatementClosingBrace": ">=1",
"ForStatementExpressionClosing": "<2",
"ForStatementExpressionOpening": 0,
"ForStatementOpeningBrace": 0,
"FunctionDeclaration": ">=1",
"FunctionDeclarationClosingBrace": ">=1",
"FunctionDeclarationOpeningBrace": 0,
"FunctionExpression": 0,
"FunctionExpressionClosingBrace": 1,
"FunctionExpressionOpeningBrace":0,
"IIFEClosingParentheses": 0,
"IfStatement": ">=1",
"IfStatementClosingBrace": ">=1",
"IfStatementOpeningBrace": 0,
"LogicalExpression": -1,
"MemberExpressionClosing": 0,
"MemberExpressionOpening": 0,
"MemberExpressionPeriod": -1,
"MethodDefinition": ">=1",
"ObjectExpressionClosingBrace": "<=1",
"ObjectPatternClosingBrace": 0,
"ObjectPatternComma": 0,
"ObjectPatternOpeningBrace": 0,
"ParameterDefault": 0,
"Property": "<=2",
"PropertyValue": 0,
"ReturnStatement": -1,
"SwitchClosingBrace": ">=1",
"SwitchOpeningBrace": 0,
"ThisExpression": -1,
"ThrowStatement": ">=1",
"TryClosingBrace": ">=1",
"TryKeyword": -1,
"TryOpeningBrace": 0,
"VariableDeclaration": ">=1",
"VariableDeclarationSemiColon": 0,
"VariableDeclarationWithoutInit": ">=1",
"VariableName": ">=1",
"VariableValue": 0,
"WhileStatement": ">=1",
"WhileStatementClosingBrace": ">=1",
"WhileStatementOpeningBrace": 0
},
"after": {
"ArrayPatternClosing": 0,
"ArrayPatternComma": 0,
"ArrayPatternOpening": 0,
"ArrowFunctionExpressionArrow": 0,
"ArrowFunctionExpressionClosingBrace": -1,
"ArrowFunctionExpressionOpeningBrace": ">=1",
"AssignmentExpression": ">=1",
"AssignmentOperator": 0,
"BlockStatement": 0,
"BreakKeyword": -1,
"CallExpression": -1,
"CallExpressionClosingParentheses": -1,
"CallExpressionOpeningParentheses": -1,
"CatchClosingBrace": ">=0",
"CatchKeyword": 0,
"CatchOpeningBrace": ">=1",
"ClassDeclaration": ">=1",
"ClassDeclarationClosingBrace": ">=1",
"ClassDeclarationOpeningBrace": ">=1",
"ConditionalExpression": ">=1",
"DeleteOperator": ">=1",
"DoWhileStatement": ">=1",
"DoWhileStatementClosingBrace": 0,
"DoWhileStatementOpeningBrace": ">=1",
"ElseIfStatement": ">=1",
"ElseIfStatementClosingBrace": ">=1",
"ElseIfStatementOpeningBrace": ">=1",
"ElseStatement": ">=1",
"ElseStatementClosingBrace": ">=1",
"ElseStatementOpeningBrace": ">=1",
"EmptyStatement": -1,
"FinallyClosingBrace": ">=1",
"FinallyKeyword": -1,
"FinallyOpeningBrace": ">=1",
"ForInStatement": ">=1",
"ForInStatementClosingBrace": ">=1",
"ForInStatementExpressionClosing": -1,
"ForInStatementExpressionOpening": "<2",
"ForInStatementOpeningBrace": ">=1",
"ForStatement": ">=1",
"ForStatementClosingBrace": ">=1",
"ForStatementExpressionClosing": -1,
"ForStatementExpressionOpening": "<2",
"ForStatementOpeningBrace": ">=1",
"FunctionDeclaration": ">=1",
"FunctionDeclarationClosingBrace": ">=1",
"FunctionDeclarationOpeningBrace": ">=1",
"FunctionExpression": 0,
"FunctionExpressionClosingBrace": -1,
"FunctionExpressionOpeningBrace": 1,
"IIFEOpeningParentheses": 0,
"IfStatement": ">=1",
"IfStatementClosingBrace": ">=1",
"IfStatementOpeningBrace": ">=1",
"LogicalExpression": -1,
"MemberExpressionClosing": 0,
"MemberExpressionOpening": 0,
"MemberExpressionPeriod": 0,
"MethodDefinition": ">=1",
"ObjectExpressionOpeningBrace": "<=1",
"ObjectPatternClosingBrace": 0,
"ObjectPatternComma": 0,
"ObjectPatternOpeningBrace": 0,
"ParameterDefault": 0,
"Property": -1,
"PropertyName": 0,
"ReturnStatement": -1,
"SwitchCaseColon": ">=1",
"SwitchClosingBrace": ">=1",
"SwitchOpeningBrace": ">=1",
"ThisExpression": 0,
"ThrowStatement": ">=1",
"TryClosingBrace": 0,
"TryKeyword": -1,
"TryOpeningBrace": ">=1",
"VariableDeclaration": ">=1",
"VariableDeclarationSemiColon": ">=1",
"VariableValue": -1,
"WhileStatement": ">=1",
"WhileStatementClosingBrace": ">=1",
"WhileStatementOpeningBrace": ">=1"
}
},
"whiteSpace": {
"value": " ",
"removeTrailing": 1,
"before": {
"ArgumentComma": 0,
"ArgumentList": 0,
"ArgumentListArrayExpression": 0,
"ArgumentListFunctionExpression": 1,
"ArgumentListObjectExpression": 0,
"ArrayExpressionClosing": 0,
"ArrayExpressionComma": 0,
"ArrayExpressionOpening": 1,
"AssignmentOperator": 1,
"BinaryExpression": 0,
"BinaryExpressionOperator": 1,
"BlockComment": 1,
"CallExpression": 1,
"CatchClosingBrace": 1,
"CatchKeyword": 1,
"CatchOpeningBrace": 1,
"CatchParameterList": 0,
"CommaOperator": 0,
"ConditionalExpressionAlternate": 1,
"ConditionalExpressionConsequent": 1,
"DoWhileStatementClosingBrace": 1,
"DoWhileStatementConditional": 1,
"DoWhileStatementOpeningBrace": 1,
"ElseIfStatementClosingBrace": 1,
"ElseIfStatementOpeningBrace": 1,
"ElseStatementClosingBrace": 1,
"ElseStatementOpeningBrace": 1,
"EmptyStatement": 0,
"ExpressionClosingParentheses": 0,
"FinallyClosingBrace": 1,
"FinallyKeyword": -1,
"FinallyOpeningBrace": 1,
"ForInStatement": 1,
"ForInStatementClosingBrace": 1,
"ForInStatementExpressionClosing": 0,
"ForInStatementExpressionOpening": 1,
"ForInStatementOpeningBrace": 1,
"ForStatement": 1,
"ForStatementClosingBrace": 1,
"ForStatementExpressionClosing": 0,
"ForStatementExpressionOpening": 1,
"ForStatementOpeningBrace": 1,
"ForStatementSemicolon": 0,
"FunctionDeclarationClosingBrace": 1,
"FunctionDeclarationOpeningBrace": 1,
"FunctionExpressionClosingBrace": 1,
"FunctionExpressionOpeningBrace": 1,
"IfStatementClosingBrace": 1,
"IfStatementConditionalClosing": 0,
"IfStatementConditionalOpening": 1,
"IfStatementOpeningBrace": 1,
"LineComment": 1,
"LogicalExpressionOperator": 1,
"MemberExpressionClosing": 0,
"ObjectExpressionClosingBrace": 1,
"ParameterComma": 0,
"ParameterList": 0,
"Property": 1,
"PropertyName": 1,
"PropertyValue": 1,
"SwitchDiscriminantClosing": 0,
"SwitchDiscriminantOpening": 1,
"ThrowKeyword": 1,
"TryClosingBrace": 1,
"TryKeyword": -1,
"TryOpeningBrace": 1,
"UnaryExpressionOperator": 0,
"VariableName": 1,
"VariableValue": 1,
"WhileStatementClosingBrace": 1,
"WhileStatementConditionalClosing": 0,
"WhileStatementConditionalOpening": 1,
"WhileStatementOpeningBrace": 1
},
"after": {
"ArgumentComma": 1,
"ArgumentList": 0,
"ArgumentListArrayExpression": 1,
"ArgumentListFunctionExpression": 1,
"ArgumentListObjectExpression": 0,
"ArrayExpressionClosing": 0,
"ArrayExpressionComma": 1,
"ArrayExpressionOpening": 0,
"AssignmentOperator": 1,
"BinaryExpression": 0,
"BinaryExpressionOperator": 1,
"BlockComment": 1,
"CallExpression": 0,
"CatchClosingBrace": 1,
"CatchKeyword": 1,
"CatchOpeningBrace": 1,
"CatchParameterList": 0,
"CommaOperator": 1,
"ConditionalExpressionConsequent": 1,
"ConditionalExpressionTest": 1,
"DoWhileStatementBody": 1,
"DoWhileStatementClosingBrace": 1,
"DoWhileStatementOpeningBrace": 1,
"ElseIfStatementClosingBrace": 1,
"ElseIfStatementOpeningBrace": 1,
"ElseStatementClosingBrace": 1,
"ElseStatementOpeningBrace": 1,
"EmptyStatement": 0,
"ExpressionOpeningParentheses": 0,
"FinallyClosingBrace": 1,
"FinallyKeyword": -1,
"FinallyOpeningBrace": 1,
"ForInStatement": 1,
"ForInStatementClosingBrace": 1,
"ForInStatementExpressionClosing": 1,
"ForInStatementExpressionOpening": 0,
"ForInStatementOpeningBrace": 1,
"ForStatement": 1,
"ForStatementClosingBrace": 1,
"ForStatementExpressionClosing": 1,
"ForStatementExpressionOpening": 0,
"ForStatementOpeningBrace": 1,
"ForStatementSemicolon": 1,
"FunctionDeclarationClosingBrace": 0,
"FunctionDeclarationOpeningBrace": 0,
"FunctionExpressionClosingBrace": 0,
"FunctionExpressionOpeningBrace": 0,
"FunctionName": 0,
"FunctionReservedWord": 0,
"IfStatementClosingBrace": 1,
"IfStatementConditionalClosing": 0,
"IfStatementConditionalOpening": 0,
"IfStatementOpeningBrace": 1,
"LogicalExpressionOperator": 1,
"MemberExpressionOpening": 0,
"ObjectExpressionClosingBrace": 0,
"ObjectExpressionOpeningBrace": 1,
"ParameterComma": 1,
"ParameterList": 0,
"PropertyName": 0,
"PropertyValue": 0,
"SwitchDiscriminantClosing": 1,
"SwitchDiscriminantOpening": 0,
"ThrowKeyword": 1,
"TryClosingBrace": 1,
"TryKeyword": -1,
"TryOpeningBrace": 1,
"UnaryExpressionOperator": 0,
"VariableName": 1,
"WhileStatementClosingBrace": 1,
"WhileStatementConditionalClosing": 1,
"WhileStatementConditionalOpening": 0,
"WhileStatementOpeningBrace": 1
}
}
}

View File

@ -1 +1,2 @@
**/JsLibraries/**
**/*.css.d.ts

View File

@ -1,293 +0,0 @@
{
"parser": "babel-eslint",
"env": {
"browser": true,
"commonjs": true,
"node": true,
"es6": true
},
"globals": {
"expect": false,
"chai": false,
"sinon": false
},
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"modules": true,
"impliedStrict": true
}
},
"plugins": [
"filenames",
"react"
],
"settings": {
"react": {
"version": "detect"
}
},
"rules": {
"filenames/match-exported": ["error"],
# ECMAScript 6
"arrow-body-style": [0],
"arrow-parens": ["error", "always"],
"arrow-spacing": ["error", { "before": true, "after": true }],
"constructor-super": "error",
"generator-star-spacing": "off",
"no-class-assign": "error",
"no-confusing-arrow": "error",
"no-const-assign": "error",
"no-dupe-class-members": "error",
"no-duplicate-imports": "error",
"no-new-symbol": "error",
"no-this-before-super": "error",
"no-useless-escape": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "error",
"no-var": "warn",
"object-shorthand": ["error", "properties"],
"prefer-arrow-callback": "error",
"prefer-const": "warn",
"prefer-reflect": "off",
"prefer-rest-params": "off",
"prefer-spread": "warn",
"prefer-template": "error",
"require-yield": "off",
"template-curly-spacing": ["error", "never"],
"yield-star-spacing": "off",
# Possible Errors
"comma-dangle": "error",
"no-cond-assign": "error",
"no-console": "off",
"no-constant-condition": "warn",
"no-control-regex": "error",
"no-debugger": "off",
"no-dupe-args": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-empty": "warn",
"no-empty-character-class": "error",
"no-ex-assign": "error",
"no-extra-boolean-cast": "error",
"no-extra-parens": ["error", "functions"],
"no-extra-semi": "error",
"no-func-assign": "error",
"no-inner-declarations": "error",
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-negated-in-lhs": "error",
"no-obj-calls": "error",
"no-regex-spaces": "error",
"no-sparse-arrays": "error",
"no-unexpected-multiline": "error",
"no-unreachable": "warn",
"no-unsafe-finally": "error",
"use-isnan": "error",
"valid-jsdoc": "off",
"valid-typeof": "error",
# Best Practices
"accessor-pairs": "off",
"array-callback-return": "warn",
"block-scoped-var": "warn",
"consistent-return": "off",
"curly": "error",
"default-case": "error",
"dot-location": ["error", "property"],
"dot-notation": "error",
"eqeqeq": ["error", "smart"],
"guard-for-in": "error",
"no-alert": "warn",
"no-caller": "error",
"no-case-declarations": "error",
"no-div-regex": "error",
"no-else-return": "error",
"no-empty-function": ["error", {"allow": ["arrowFunctions"]}],
"no-empty-pattern": "error",
"no-eval": "error",
"no-extend-native": "error",
"no-extra-bind": "error",
"no-fallthrough": "error",
"no-floating-decimal": "error",
"no-implicit-coercion": ["error", {
"boolean": false,
"number": true,
"string": true,
"allow": [/* "!!", "~", "*", "+" */]
}],
"no-implicit-globals": "error",
"no-implied-eval": "error",
"no-invalid-this": "off",
"no-iterator": "error",
"no-labels": "error",
"no-lone-blocks": "error",
"no-loop-func": "error",
"no-magic-numbers": ["off", {"ignoreArrayIndexes": true, "ignore": [0, 1] }],
"no-multi-spaces": "error",
"no-multi-str": "error",
"no-native-reassign": ["error", {"exceptions": ["console"]}],
"no-new": "off",
"no-new-func": "error",
"no-new-wrappers": "error",
"no-octal": "error",
"no-octal-escape": "error",
"no-param-reassign": "off",
"no-process-env": "off",
"no-proto": "error",
"no-redeclare": "error",
"no-return-assign": "warn",
"no-script-url": "error",
"no-self-assign": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-throw-literal": "error",
"no-unmodified-loop-condition": "error",
"no-unused-expressions": "error",
"no-unused-labels": "error",
"no-useless-call": "error",
"no-useless-concat": "error",
"no-void": "error",
"no-warning-comments": "off",
"no-with": "error",
"radix": ["error", "as-needed"],
"vars-on-top": "off",
"wrap-iife": ["error", "inside"],
"yoda": "error",
# Strict Mode
"strict": ["error", "never"],
# Variables
"init-declarations": ["error", "always"],
"no-catch-shadow": "error",
"no-delete-var": "error",
"no-label-var": "error",
"no-restricted-globals": "off",
"no-shadow": "error",
"no-shadow-restricted-names": "error",
"no-undef": "error",
"no-undef-init": "off",
"no-undefined": "off",
"no-unused-vars": ["error", { "args": "none", "ignoreRestSiblings": true }],
"no-use-before-define": "error",
# Node.js and CommonJS
"callback-return": "warn",
"global-require": "error",
"handle-callback-err": "warn",
"no-mixed-requires": "error",
"no-new-require": "error",
"no-path-concat": "error",
"no-process-exit": "error",
# Stylistic Issues
"array-bracket-spacing": ["error", "never"],
"block-spacing": ["error", "always"],
"brace-style": ["error", "1tbs", { "allowSingleLine": false }],
"camelcase": "off",
"comma-spacing": ["error", {"before": false, "after": true}],
"comma-style": ["error", "last"],
"computed-property-spacing": ["error", "never"],
"consistent-this": ["error", "self"],
"eol-last": "error",
"func-names": "off",
"func-style": ["error", "declaration"],
"indent": ["error", 2, {"SwitchCase": 1}],
"key-spacing": ["error", {"beforeColon": false, "afterColon": true}],
"keyword-spacing": ["error", { "before": true, "after": true}],
"lines-around-comment": ["error", { "beforeBlockComment": true, "afterBlockComment": false }],
"max-depth": ["error", {"maximum": 5}],
"max-nested-callbacks": ["error", 4],
"max-statements": "off",
"max-statements-per-line": ["error", { "max": 1 }],
"new-cap": ["error", {"capIsNewExceptions": ["$.Deferred", "DragDropContext", "DragLayer", "DragSource", "DropTarget"]}],
"new-parens": "error",
"newline-after-var": "off",
"newline-before-return": "off",
"newline-per-chained-call": "off",
"no-array-constructor": "error",
"no-bitwise": "error",
"no-continue": "error",
"no-inline-comments": "off",
"no-lonely-if": "warn",
"no-mixed-spaces-and-tabs": "error",
"no-multiple-empty-lines": ["error", { "max": 1 }],
"no-negated-condition": "warn",
"no-nested-ternary": "error",
"no-new-object": "error",
"no-plusplus": "off",
"no-restricted-syntax": "off",
"no-spaced-func": "error",
"no-ternary": "off",
"no-trailing-spaces": "error",
"no-underscore-dangle": ["error", { "allowAfterThis": true }],
"no-unneeded-ternary": "error",
"no-whitespace-before-property": "error",
"object-curly-spacing": ["error", "always"],
"one-var": ["error", "never"],
"one-var-declaration-per-line": ["error", "always"],
"operator-assignment": ["off", "never"],
"operator-linebreak": ["error", "after"],
"quote-props": ["error", "as-needed"],
"quotes": ["error", "single"],
"require-jsdoc": "off",
"semi": "error",
"semi-spacing": ["error", { "before": false, "after": true }],
"sort-vars": "off",
"space-before-blocks": ["error", "always"],
"space-before-function-paren": ["error", "never"],
"space-in-parens": "off",
"space-infix-ops": "off",
"space-unary-ops": "off",
"spaced-comment": "error",
"wrap-regex": "error",
# React
"react/jsx-boolean-value": [2, "always"],
"react/jsx-uses-vars": 2,
"react/jsx-closing-bracket-location": 2,
"react/jsx-tag-spacing": ["error"],
"react/jsx-curly-spacing": [2, "never"],
"react/jsx-equals-spacing": [2, "never"],
"react/jsx-indent-props": [2, 2],
"react/jsx-indent": [2, 2],
"react/jsx-key": 2,
"react/jsx-no-bind": [2, { "allowArrowFunctions": true }],
"react/jsx-no-duplicate-props": [2, { "ignoreCase": true }],
"react/jsx-max-props-per-line": [2, { "maximum": 2 }],
"react/jsx-handler-names": [2, { "eventHandlerPrefix": "(on|dispatch)", "eventHandlerPropPrefix": "on" }],
"react/jsx-no-undef": 2,
"react/jsx-pascal-case": 2,
"react/jsx-uses-react": 2,
// Explicitly disabled in case we want to enable them again
"react/no-did-mount-set-state": 0,
"react/no-did-update-set-state": 0,
"react/no-direct-mutation-state": 2,
"react/no-multi-comp": [2, { "ignoreStateless": true }],
"react/no-unknown-property": 2,
"react/prefer-es6-class": 2,
"react/prop-types": 2,
"react/react-in-jsx-scope": 2,
"react/self-closing-comp": 2,
"react/sort-comp": 2,
"react/jsx-wrap-multilines": 2
}
}

432
frontend/.eslintrc.js Normal file
View File

@ -0,0 +1,432 @@
// eslint-disable-next-line @typescript-eslint/no-var-requires
const fs = require('fs');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const path = require('path');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const typescriptEslintRecommended = require('@typescript-eslint/eslint-plugin').configs.recommended;
const frontendFolder = __dirname;
const dirs = fs
.readdirSync(path.join(frontendFolder, 'src'), { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name)
.join('|');
module.exports = {
root: true,
parser: '@babel/eslint-parser',
env: {
browser: true,
commonjs: true,
node: true,
es6: true
},
globals: {
expect: false,
chai: false,
sinon: false,
JSX: true
},
parserOptions: {
ecmaVersion: 6,
sourceType: 'module',
babelOptions: {
configFile: `${frontendFolder}/babel.config.js`
},
ecmaFeatures: {
modules: true,
impliedStrict: true
}
},
plugins: [
'filenames',
'react',
'react-hooks',
'simple-import-sort',
'import',
'@typescript-eslint',
'prettier'
],
settings: {
react: {
version: 'detect'
}
},
rules: {
'filenames/match-exported': ['error'],
// ECMAScript 6
'arrow-body-style': [0],
'arrow-parens': ['error', 'always'],
'arrow-spacing': ['error', { before: true, after: true }],
'constructor-super': 'error',
'generator-star-spacing': 'off',
'no-class-assign': 'error',
'no-confusing-arrow': 'error',
'no-const-assign': 'error',
'no-dupe-class-members': 'error',
'no-duplicate-imports': 'error',
'no-new-symbol': 'error',
'no-this-before-super': 'error',
'no-useless-escape': 'error',
'no-useless-computed-key': 'error',
'no-useless-constructor': 'error',
'no-var': 'warn',
'object-shorthand': ['error', 'properties'],
'prefer-arrow-callback': 'error',
'prefer-const': 'warn',
'prefer-reflect': 'off',
'prefer-rest-params': 'off',
'prefer-spread': 'warn',
'prefer-template': 'error',
'require-yield': 'off',
'template-curly-spacing': ['error', 'never'],
'yield-star-spacing': 'off',
// Possible Errors
'comma-dangle': 'error',
'no-cond-assign': 'error',
'no-console': 'off',
'no-constant-condition': 'warn',
'no-control-regex': 'error',
'no-debugger': 'off',
'no-dupe-args': 'error',
'no-dupe-keys': 'error',
'no-duplicate-case': 'error',
'no-empty': 'warn',
'no-empty-character-class': 'error',
'no-ex-assign': 'error',
'no-extra-boolean-cast': 'error',
'no-extra-parens': ['error', 'functions'],
'no-extra-semi': 'error',
'no-func-assign': 'error',
'no-inner-declarations': 'error',
'no-invalid-regexp': 'error',
'no-irregular-whitespace': 'error',
'no-negated-in-lhs': 'error',
'no-obj-calls': 'error',
'no-regex-spaces': 'error',
'no-sparse-arrays': 'error',
'no-unexpected-multiline': 'error',
'no-unreachable': 'warn',
'no-unsafe-finally': 'error',
'use-isnan': 'error',
'valid-jsdoc': 'off',
'valid-typeof': 'error',
// Best Practices
'accessor-pairs': 'off',
'array-callback-return': 'warn',
'block-scoped-var': 'warn',
'consistent-return': 'off',
curly: 'error',
'default-case': 'error',
'dot-location': ['error', 'property'],
'dot-notation': 'error',
eqeqeq: ['error', 'smart'],
'guard-for-in': 'error',
'no-alert': 'warn',
'no-caller': 'error',
'no-case-declarations': 'error',
'no-div-regex': 'error',
'no-else-return': 'error',
'no-empty-function': ['error', { allow: ['arrowFunctions'] }],
'no-empty-pattern': 'error',
'no-eval': 'error',
'no-extend-native': 'error',
'no-extra-bind': 'error',
'no-fallthrough': 'error',
'no-floating-decimal': 'error',
'no-implicit-coercion': ['error', {
boolean: false,
number: true,
string: true,
allow: [/* "!!", "~", "*", "+" */]
}],
'no-implicit-globals': 'error',
'no-implied-eval': 'error',
'no-invalid-this': 'off',
'no-iterator': 'error',
'no-labels': 'error',
'no-lone-blocks': 'error',
'no-loop-func': 'error',
'no-magic-numbers': ['off', { ignoreArrayIndexes: true, ignore: [0, 1] }],
'no-multi-spaces': 'error',
'no-multi-str': 'error',
'no-native-reassign': ['error', { exceptions: ['console'] }],
'no-new': 'off',
'no-new-func': 'error',
'no-new-wrappers': 'error',
'no-octal': 'error',
'no-octal-escape': 'error',
'no-param-reassign': 'off',
'no-process-env': 'off',
'no-proto': 'error',
'no-redeclare': 'error',
'no-return-assign': 'warn',
'no-script-url': 'error',
'no-self-assign': 'error',
'no-self-compare': 'error',
'no-sequences': 'error',
'no-throw-literal': 'error',
'no-unmodified-loop-condition': 'error',
'no-unused-expressions': 'error',
'no-unused-labels': 'error',
'no-useless-call': 'error',
'no-useless-concat': 'error',
'no-void': 'error',
'no-warning-comments': 'off',
'no-with': 'error',
radix: ['error', 'as-needed'],
'vars-on-top': 'off',
'wrap-iife': ['error', 'inside'],
yoda: 'error',
// Strict Mode
strict: ['error', 'never'],
// Variables
'init-declarations': ['error', 'always'],
'no-catch-shadow': 'error',
'no-delete-var': 'error',
'no-label-var': 'error',
'no-restricted-globals': 'off',
'no-shadow': 'error',
'no-shadow-restricted-names': 'error',
'no-undef': 'error',
'no-undef-init': 'off',
'no-undefined': 'off',
'no-unused-vars': ['error', { args: 'none', ignoreRestSiblings: true }],
'no-use-before-define': 'error',
// Node.js and CommonJS
'callback-return': 'warn',
'global-require': 'error',
'handle-callback-err': 'warn',
'no-mixed-requires': 'error',
'no-new-require': 'error',
'no-path-concat': 'error',
'no-process-exit': 'error',
// Stylistic Issues
'array-bracket-spacing': ['error', 'never'],
'block-spacing': ['error', 'always'],
'brace-style': ['error', '1tbs', { allowSingleLine: false }],
camelcase: 'off',
'comma-spacing': ['error', { before: false, after: true }],
'comma-style': ['error', 'last'],
'computed-property-spacing': ['error', 'never'],
'consistent-this': ['error', 'self'],
'eol-last': 'error',
'func-names': 'off',
'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
indent: ['error', 2, { SwitchCase: 1 }],
'key-spacing': ['error', { beforeColon: false, afterColon: true }],
'keyword-spacing': ['error', { before: true, after: true }],
'lines-around-comment': ['error', { beforeBlockComment: true, afterBlockComment: false }],
'max-depth': ['error', { maximum: 5 }],
'max-nested-callbacks': ['error', 4],
'max-statements': 'off',
'max-statements-per-line': ['error', { max: 1 }],
'new-cap': ['error', { capIsNewExceptions: ['$.Deferred', 'DragDropContext', 'DragLayer', 'DragSource', 'DropTarget'] }],
'new-parens': 'error',
'newline-after-var': 'off',
'newline-before-return': 'off',
'newline-per-chained-call': 'off',
'no-array-constructor': 'error',
'no-bitwise': 'error',
'no-continue': 'error',
'no-inline-comments': 'off',
'no-lonely-if': 'warn',
'no-mixed-spaces-and-tabs': 'error',
'no-multiple-empty-lines': ['error', { max: 1 }],
'no-negated-condition': 'warn',
'no-nested-ternary': 'error',
'no-new-object': 'error',
'no-plusplus': 'off',
'no-restricted-syntax': 'off',
'no-spaced-func': 'error',
'no-ternary': 'off',
'no-trailing-spaces': 'error',
'no-underscore-dangle': ['error', { allowAfterThis: true }],
'no-unneeded-ternary': 'error',
'no-whitespace-before-property': 'error',
'object-curly-spacing': ['error', 'always'],
'one-var': ['error', 'never'],
'one-var-declaration-per-line': ['error', 'always'],
'operator-assignment': ['off', 'never'],
'operator-linebreak': ['error', 'after'],
'quote-props': ['error', 'as-needed'],
quotes: ['error', 'single'],
'require-jsdoc': 'off',
semi: 'error',
'semi-spacing': ['error', { before: false, after: true }],
'sort-vars': 'off',
'space-before-blocks': ['error', 'always'],
'space-before-function-paren': ['error', 'never'],
'space-in-parens': 'off',
'space-infix-ops': 'off',
'space-unary-ops': 'off',
'spaced-comment': 'error',
'wrap-regex': 'error',
// ImportSort
'simple-import-sort/imports': 'error',
'import/newline-after-import': 'error',
// React
'react/jsx-boolean-value': [2, 'always'],
'react/jsx-uses-vars': 2,
'react/jsx-closing-bracket-location': 2,
'react/jsx-tag-spacing': ['error'],
'react/jsx-curly-spacing': [2, 'never'],
'react/jsx-equals-spacing': [2, 'never'],
'react/jsx-indent-props': [2, 2],
'react/jsx-indent': [2, 2, { indentLogicalExpressions: true }],
'react/jsx-key': 2,
'react/jsx-no-bind': [2, { allowArrowFunctions: true }],
'react/jsx-no-duplicate-props': [2, { ignoreCase: true }],
'react/jsx-max-props-per-line': [2, { maximum: 2 }],
'react/jsx-handler-names': [2, { eventHandlerPrefix: '(on|dispatch)', eventHandlerPropPrefix: 'on' }],
'react/jsx-no-undef': 2,
'react/jsx-pascal-case': 2,
'react/jsx-uses-react': 2,
// Explicitly disabled in case we want to enable them again
'react/no-did-mount-set-state': 0,
'react/no-did-update-set-state': 0,
'react/no-direct-mutation-state': 2,
'react/no-multi-comp': [2, { ignoreStateless: true }],
'react/no-unknown-property': 2,
'react/prefer-es6-class': 2,
'react/prop-types': 2,
'react/react-in-jsx-scope': 2,
'react/self-closing-comp': 2,
'react/sort-comp': 2,
'react/jsx-wrap-multilines': 2,
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'error'
},
overrides: [
{
files: [
'*.js'
],
rules: {
'simple-import-sort/imports': [
'error',
{
groups: [
// Packages
// Absolute Paths
// Relative Paths
// Css
['^@?\\w', `^(${dirs})(/.*|$)`, '^\\.', '^\\..*css$']
]
}
]
}
},
{
files: [
'*.ts',
'*.tsx'
],
parser: '@typescript-eslint/parser',
parserOptions: {
project: './tsconfig.json'
},
extends: [
'prettier'
],
rules: Object.assign(typescriptEslintRecommended.rules, {
'@typescript-eslint/no-unused-vars': [
'error',
{
args: 'after-used',
argsIgnorePattern: '^_',
ignoreRestSiblings: true
}
],
'@typescript-eslint/explicit-function-return-type': 'off',
'no-shadow': 'off',
'prettier/prettier': 'error',
'simple-import-sort/imports': [
'error',
{
groups: [
// Packages
// Absolute Paths
// Relative Paths
// Css
['^@?\\w', `^(${dirs})(/.*|$)`, '^\\.', '^\\..*css$']
]
}
],
// React Hooks
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'error',
// React
'react/function-component-definition': 'error',
'react/hook-use-state': 'error',
'react/jsx-boolean-value': ['error', 'always'],
'react/jsx-curly-brace-presence': [
'error',
{ props: 'never', children: 'never' }
],
'react/jsx-fragments': 'error',
'react/jsx-handler-names': [
'error',
{
eventHandlerPrefix: 'on',
eventHandlerPropPrefix: 'on'
}
],
'react/jsx-no-bind': ['error', { ignoreRefs: true }],
'react/jsx-no-useless-fragment': ['error', { allowExpressions: true }],
'react/jsx-pascal-case': ['error', { allowAllCaps: true }],
'react/jsx-sort-props': [
'error',
{
callbacksLast: true,
noSortAlphabetically: true,
reservedFirst: true
}
],
'react/prop-types': 'off',
'react/self-closing-comp': 'error'
})
},
{
files: [
'*.css.d.ts'
],
rules: {
'filenames/match-exported': 'off',
'init-declarations': 'off',
'prettier/prettier': 'off'
}
}
]
};

View File

@ -1,12 +0,0 @@
{
"js": {
"indent_size": 2,
"indent_char": " ",
"indent_level": 2,
"indent_with_tabs": false,
"preserve_newlines": true,
"brace_style": "collapse",
"max_preserve_newlines": 2,
"jslint_happy": true
}
}

10
frontend/.prettierignore Normal file
View File

@ -0,0 +1,10 @@
# Ignore everything recursively
*
# But not the .ts files
!*.ts*
*css.d.ts
# Check subdirectories too
!*/

View File

@ -0,0 +1,6 @@
{
"arrowParens": "always",
"endOfLine": "auto",
"singleQuote": true,
"trailingComma": "es5"
}

View File

@ -1,12 +1,12 @@
{
"plugins": [
"plugins": [
"stylelint-order"
],
"ignoreFiles": [
],
"ignoreFiles": [
"frontend/src/Styles/scaffolding.css",
"**/*.js"
],
"rules": {
],
"rules": {
"at-rule-empty-line-before": [
"always",
{
@ -15,9 +15,6 @@
]
}
],
"at-rule-name-case": "lower",
"at-rule-name-newline-after": "always-multi-line",
"at-rule-name-space-after": "always",
"at-rule-no-unknown": [
true,
{
@ -28,25 +25,11 @@
}
],
"at-rule-no-vendor-prefix": true,
"at-rule-semicolon-newline-after": "always",
"at-rule-semicolon-space-before": "never",
"block-closing-brace-empty-line-before": "never",
"block-closing-brace-newline-after": "always",
"block-closing-brace-newline-before": "always",
"block-closing-brace-space-after": "always-single-line",
"block-closing-brace-space-before": "always-single-line",
"block-no-empty": true,
"block-opening-brace-newline-after": "always",
"block-opening-brace-newline-before": "never-single-line",
"block-opening-brace-space-after": "always-single-line",
"block-opening-brace-space-before": "always",
"color-hex-case": "lower",
"color-hex-length": "short",
"color-named": "never",
"color-no-invalid-hex": true,
"comment-whitespace-inside": "always",
"declaration-bang-space-after": "never",
"declaration-bang-space-before": "always",
"declaration-block-no-duplicate-properties": [
true,
{
@ -57,54 +40,21 @@
],
"declaration-block-no-redundant-longhand-properties": true,
"declaration-block-no-shorthand-property-overrides": true,
"declaration-block-semicolon-newline-after": "always",
"declaration-block-semicolon-newline-before": "never-multi-line",
"declaration-block-semicolon-space-before": "never",
"declaration-block-single-line-max-declarations": 1,
"declaration-block-trailing-semicolon": "always",
"declaration-colon-space-after": "always",
"declaration-colon-space-before": "never",
"font-family-name-quotes": "always-unless-keyword",
"function-calc-no-unspaced-operator": true,
"function-comma-newline-after": "never-multi-line",
"function-comma-newline-before": "never-multi-line",
"function-comma-space-after": "always",
"function-comma-space-before": "never",
"function-linear-gradient-no-nonstandard-direction": true,
"function-name-case": "lower",
"function-parentheses-newline-inside": "never-multi-line",
"function-parentheses-space-inside": "never",
"function-url-quotes": "always",
"function-url-scheme-disallowed-list": [
"data"
],
"function-whitespace-after": "always",
"indentation": 2,
"keyframe-declaration-no-important": true,
"length-zero-no-unit": true,
"max-empty-lines": 1,
"max-line-length": [
100,
{
"ignore": [
"non-comments"
]
}
],
"max-nesting-depth": 2,
"media-feature-colon-space-after": "always",
"media-feature-colon-space-before": "never",
"media-feature-name-case": "lower",
"media-feature-name-no-vendor-prefix": true,
"media-feature-range-operator-space-after": "always",
"media-feature-range-operator-space-before": "always",
"no-empty-source": true,
"no-eol-whitespace": true,
"no-extra-semicolons": true,
"no-invalid-double-slash-comments": true,
"no-missing-end-of-source-newline": true,
"number-leading-zero": "always",
"number-no-trailing-zeros": true,
"order/order": [
"custom-properties",
"dollar-variables",
@ -132,6 +82,7 @@
"right",
"bottom",
"left",
"inset",
"z-index",
"display",
"visibility",
@ -343,7 +294,6 @@
]
}
],
"property-case": "lower",
"property-no-vendor-prefix": true,
"rule-empty-line-before": [
"always",
@ -356,41 +306,21 @@
]
}
],
"selector-attribute-brackets-space-inside": "never",
"selector-attribute-operator-space-after": "never",
"selector-attribute-operator-space-before": "never",
"selector-attribute-quotes": "never",
"selector-class-pattern": "^[A-Za-z0-9]+$",
"selector-combinator-space-after": "always",
"selector-combinator-space-before": "always",
"selector-descendant-combinator-no-non-space": true,
"selector-list-comma-newline-after": "always",
"selector-list-comma-newline-before": "never-multi-line",
"selector-list-comma-space-before": "never",
"selector-max-attribute": 0,
"selector-max-class": 3,
"selector-max-compound-selectors": 3,
"selector-max-empty-lines": 0,
"selector-max-id": 0,
"selector-max-universal": 0,
"selector-pseudo-class-case": "lower",
"selector-pseudo-class-parentheses-space-inside": "never",
"selector-pseudo-element-case": "lower",
"selector-pseudo-element-colon-notation": "double",
"selector-pseudo-element-no-unknown": true,
"selector-type-case": "lower",
"selector-type-no-unknown": true,
"shorthand-property-no-redundant-values": true,
"string-no-newline": true,
"string-quotes": "single",
"time-min-milliseconds": 100,
"unit-case": "lower",
"unit-no-unknown": true,
"value-list-comma-newline-after": "never-multi-line",
"value-list-comma-newline-before": "never-multi-line",
"value-list-comma-space-after": "always",
"value-list-comma-space-before": "never",
"value-list-max-empty-lines": 0,
"value-no-vendor-prefix": true
}
}

7
frontend/.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"recommendations": [
"stylelint.vscode-stylelint",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"
]
}

23
frontend/.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,23 @@
// Place your settings in this file to overwrite default and user settings.
{
"files.insertFinalNewline": true,
"files.exclude": {
"**/node_modules": true,
"**/*.d.css": true
},
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll": true
},
"typescript.preferences.quoteStyle": "single",
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
],
}

View File

@ -2,22 +2,25 @@ const loose = true;
module.exports = {
plugins: [
'@babel/plugin-transform-logical-assignment-operators',
// Stage 1
'@babel/plugin-proposal-export-default-from',
['@babel/plugin-proposal-optional-chaining', { loose }],
['@babel/plugin-proposal-nullish-coalescing-operator', { loose }],
['@babel/plugin-transform-optional-chaining', { loose }],
['@babel/plugin-transform-nullish-coalescing-operator', { loose }],
// Stage 2
'@babel/plugin-proposal-export-namespace-from',
'@babel/plugin-transform-export-namespace-from',
// Stage 3
['@babel/plugin-proposal-class-properties', { loose }],
['@babel/plugin-transform-class-properties', { loose }],
'@babel/plugin-syntax-dynamic-import'
],
env: {
development: {
presets: [
['@babel/preset-react', { development: true }]
['@babel/preset-react', { development: true }],
'@babel/preset-typescript'
],
plugins: [
'babel-plugin-inline-classnames'
@ -25,7 +28,8 @@ module.exports = {
},
production: {
presets: [
'@babel/preset-react'
'@babel/preset-react',
'@babel/preset-typescript'
],
plugins: [
'babel-plugin-transform-react-remove-prop-types'

View File

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('path');
const webpack = require('webpack');
const FileManagerPlugin = require('filemanager-webpack-plugin');
@ -5,6 +6,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin');
const LiveReloadPlugin = require('webpack-livereload-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
module.exports = (env) => {
const uiFolder = 'UI';
@ -34,41 +36,54 @@ module.exports = (env) => {
},
entry: {
index: 'index.js'
index: 'index.ts'
},
resolve: {
extensions: [
'.ts',
'.tsx',
'.js'
],
modules: [
srcFolder,
path.join(srcFolder, 'Shims'),
'node_modules'
],
alias: {
jquery: 'jquery/src/jquery',
jquery: 'jquery/dist/jquery.min',
'react-middle-truncate': 'react-middle-truncate/lib/react-middle-truncate'
},
fallback: {
buffer: false,
http: false,
https: false,
url: false,
util: false,
net: false
}
},
output: {
path: distFolder,
publicPath: '/',
filename: '[name].js',
filename: isProduction ? '[name]-[contenthash].js' : '[name].js',
sourceMapFilename: '[file].map'
},
optimization: {
moduleIds: 'deterministic',
chunkIds: 'named',
splitChunks: {
chunks: 'initial',
name: 'vendors'
}
chunkIds: isProduction ? 'deterministic' : 'named'
},
performance: {
hints: false
},
experiments: {
topLevelAwait: true
},
plugins: [
new webpack.DefinePlugin({
__DEV__: !isProduction,
@ -76,13 +91,15 @@ module.exports = (env) => {
}),
new MiniCssExtractPlugin({
filename: 'Content/styles.css'
filename: 'Content/styles.css',
chunkFilename: isProduction ? 'Content/[id]-[chunkhash].css' : 'Content/[id].css'
}),
new HtmlWebpackPlugin({
template: 'frontend/src/index.ejs',
filename: 'index.html',
publicPath: '/'
publicPath: '/',
inject: false
}),
new FileManagerPlugin({
@ -123,6 +140,8 @@ module.exports = (env) => {
}
}),
new ForkTsCheckerWebpackPlugin(),
new LiveReloadPlugin()
],
@ -146,7 +165,7 @@ module.exports = (env) => {
}
},
{
test: /\.js?$/,
test: [/\.jsx?$/, /\.tsx?$/],
exclude: /(node_modules|JsLibraries)/,
use: [
{
@ -177,12 +196,13 @@ module.exports = (env) => {
exclude: /(node_modules|globals.css)/,
use: [
{ loader: MiniCssExtractPlugin.loader },
{ loader: 'css-modules-typescript-loader' },
{
loader: 'css-loader',
options: {
importLoaders: 1,
modules: {
localIdentName: '[name]/[local]/[hash:base64:5]'
localIdentName: isProduction ? '[name]/[local]/[hash:base64:5]' : '[name]/[local]'
}
}
},
@ -245,18 +265,19 @@ module.exports = (env) => {
config.resolve.alias['react-dom$'] = 'react-dom/profiling';
config.resolve.alias['scheduler/tracing'] = 'scheduler/tracing-profiling';
config.optimization.minimizer = [
config.optimization = {
minimize: true,
minimizer: [
new TerserPlugin({
cache: true,
parallel: true,
sourceMap: true, // Must be set to true if using source-maps in production
terserOptions: {
sourceMap: true, // Must be set to true if using source-maps in production
mangle: false,
keep_classnames: true,
keep_fnames: true
}
})
];
]
};
}
return config;

View File

@ -1,3 +1,4 @@
// eslint-disable-next-line filenames/match-exported
const loaderUtils = require('loader-utils');
module.exports = function cssVariablesLoader(source) {

View File

@ -1,20 +0,0 @@
{
"compilerOptions": {
"target": "es6",
"checkJs": false,
"baseUrl": "src",
"jsx": "react",
"module": "commonjs",
"moduleResolution": "node",
"paths": {
"*": [
"*"
]
}
},
"include": [
"./src/**/*"
],
"exclude": [
]
}

View File

@ -1,7 +1,6 @@
const reload = require('require-nocache')(module);
const cssVarsFiles = [
'./src/Styles/Variables/colors',
'./src/Styles/Variables/dimensions',
'./src/Styles/Variables/fonts',
'./src/Styles/Variables/animations',

View File

@ -1,4 +0,0 @@
// Place your settings in this file to overwrite default and user settings.
{
"files.insertFinalNewline": true
}

View File

@ -1,232 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import getRemovedItems from 'Utilities/Object/getRemovedItems';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import getSelectedIds from 'Utilities/Table/getSelectedIds';
import removeOldSelectedState from 'Utilities/Table/removeOldSelectedState';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
import { align, icons, kinds } from 'Helpers/Props';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import BlocklistRowConnector from './BlocklistRowConnector';
class Blocklist extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
allSelected: false,
allUnselected: false,
lastToggled: null,
selectedState: {},
isConfirmRemoveModalOpen: false,
items: props.items
};
}
componentDidUpdate(prevProps) {
const {
items
} = this.props;
if (hasDifferentItems(prevProps.items, items)) {
this.setState((state) => {
return {
...removeOldSelectedState(state, getRemovedItems(prevProps.items, items)),
items
};
});
return;
}
}
//
// Control
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState);
}
//
// Listeners
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
onRemoveSelectedPress = () => {
this.setState({ isConfirmRemoveModalOpen: true });
}
onRemoveSelectedConfirmed = () => {
this.props.onRemoveSelected(this.getSelectedIds());
this.setState({ isConfirmRemoveModalOpen: false });
}
onConfirmRemoveModalClose = () => {
this.setState({ isConfirmRemoveModalOpen: false });
}
//
// Render
render() {
const {
isFetching,
isPopulated,
error,
items,
columns,
totalRecords,
isRemoving,
isClearingBlocklistExecuting,
onClearBlocklistPress,
...otherProps
} = this.props;
const {
allSelected,
allUnselected,
selectedState,
isConfirmRemoveModalOpen
} = this.state;
const selectedIds = this.getSelectedIds();
return (
<PageContent title="Blocklist">
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label="Remove Selected"
iconName={icons.REMOVE}
isDisabled={!selectedIds.length}
isSpinning={isRemoving}
onPress={this.onRemoveSelectedPress}
/>
<PageToolbarButton
label="Clear"
iconName={icons.CLEAR}
isSpinning={isClearingBlocklistExecuting}
onPress={onClearBlocklistPress}
/>
</PageToolbarSection>
<PageToolbarSection alignContent={align.RIGHT}>
<TableOptionsModalWrapper
{...otherProps}
columns={columns}
>
<PageToolbarButton
label="Options"
iconName={icons.TABLE}
/>
</TableOptionsModalWrapper>
</PageToolbarSection>
</PageToolbar>
<PageContentBody>
{
isFetching && !isPopulated &&
<LoadingIndicator />
}
{
!isFetching && !!error &&
<div>Unable to load blocklist</div>
}
{
isPopulated && !error && !items.length &&
<div>
No history blocklist
</div>
}
{
isPopulated && !error && !!items.length &&
<div>
<Table
selectAll={true}
allSelected={allSelected}
allUnselected={allUnselected}
columns={columns}
{...otherProps}
onSelectAllChange={this.onSelectAllChange}
>
<TableBody>
{
items.map((item) => {
return (
<BlocklistRowConnector
key={item.id}
isSelected={selectedState[item.id] || false}
columns={columns}
{...item}
onSelectedChange={this.onSelectedChange}
/>
);
})
}
</TableBody>
</Table>
<TablePager
totalRecords={totalRecords}
isFetching={isFetching}
{...otherProps}
/>
</div>
}
</PageContentBody>
<ConfirmModal
isOpen={isConfirmRemoveModalOpen}
kind={kinds.DANGER}
title="Remove Selected"
message={'Are you sure you want to remove the selected items from the blocklist?'}
confirmLabel="Remove Selected"
onConfirm={this.onRemoveSelectedConfirmed}
onCancel={this.onConfirmRemoveModalClose}
/>
</PageContent>
);
}
}
Blocklist.propTypes = {
isFetching: PropTypes.bool.isRequired,
isPopulated: PropTypes.bool.isRequired,
error: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
totalRecords: PropTypes.number,
isRemoving: PropTypes.bool.isRequired,
isClearingBlocklistExecuting: PropTypes.bool.isRequired,
onRemoveSelected: PropTypes.func.isRequired,
onClearBlocklistPress: PropTypes.func.isRequired
};
export default Blocklist;

View File

@ -0,0 +1,329 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { SelectProvider } from 'App/SelectContext';
import AppState from 'App/State/AppState';
import * as commandNames from 'Commands/commandNames';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import FilterMenu from 'Components/Menu/FilterMenu';
import ConfirmModal from 'Components/Modal/ConfirmModal';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import usePaging from 'Components/Table/usePaging';
import useCurrentPage from 'Helpers/Hooks/useCurrentPage';
import usePrevious from 'Helpers/Hooks/usePrevious';
import useSelectState from 'Helpers/Hooks/useSelectState';
import { align, icons, kinds } from 'Helpers/Props';
import {
clearBlocklist,
fetchBlocklist,
gotoBlocklistPage,
removeBlocklistItems,
setBlocklistFilter,
setBlocklistSort,
setBlocklistTableOption,
} from 'Store/Actions/blocklistActions';
import { executeCommand } from 'Store/Actions/commandActions';
import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector';
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
import { CheckInputChanged } from 'typings/inputs';
import { SelectStateInputProps } from 'typings/props';
import { TableOptionsChangePayload } from 'typings/Table';
import {
registerPagePopulator,
unregisterPagePopulator,
} from 'Utilities/pagePopulator';
import translate from 'Utilities/String/translate';
import getSelectedIds from 'Utilities/Table/getSelectedIds';
import BlocklistFilterModal from './BlocklistFilterModal';
import BlocklistRow from './BlocklistRow';
function Blocklist() {
const requestCurrentPage = useCurrentPage();
const {
isFetching,
isPopulated,
error,
items,
columns,
selectedFilterKey,
filters,
sortKey,
sortDirection,
page,
pageSize,
totalPages,
totalRecords,
isRemoving,
} = useSelector((state: AppState) => state.blocklist);
const customFilters = useSelector(createCustomFiltersSelector('blocklist'));
const isClearingBlocklistExecuting = useSelector(
createCommandExecutingSelector(commandNames.CLEAR_BLOCKLIST)
);
const dispatch = useDispatch();
const [isConfirmRemoveModalOpen, setIsConfirmRemoveModalOpen] =
useState(false);
const [isConfirmClearModalOpen, setIsConfirmClearModalOpen] = useState(false);
const [selectState, setSelectState] = useSelectState();
const { allSelected, allUnselected, selectedState } = selectState;
const selectedIds = useMemo(() => {
return getSelectedIds(selectedState);
}, [selectedState]);
const wasClearingBlocklistExecuting = usePrevious(
isClearingBlocklistExecuting
);
const handleSelectAllChange = useCallback(
({ value }: CheckInputChanged) => {
setSelectState({ type: value ? 'selectAll' : 'unselectAll', items });
},
[items, setSelectState]
);
const handleSelectedChange = useCallback(
({ id, value, shiftKey = false }: SelectStateInputProps) => {
setSelectState({
type: 'toggleSelected',
items,
id,
isSelected: value,
shiftKey,
});
},
[items, setSelectState]
);
const handleRemoveSelectedPress = useCallback(() => {
setIsConfirmRemoveModalOpen(true);
}, [setIsConfirmRemoveModalOpen]);
const handleRemoveSelectedConfirmed = useCallback(() => {
dispatch(removeBlocklistItems({ ids: selectedIds }));
setIsConfirmRemoveModalOpen(false);
}, [selectedIds, setIsConfirmRemoveModalOpen, dispatch]);
const handleConfirmRemoveModalClose = useCallback(() => {
setIsConfirmRemoveModalOpen(false);
}, [setIsConfirmRemoveModalOpen]);
const handleClearBlocklistPress = useCallback(() => {
setIsConfirmClearModalOpen(true);
}, [setIsConfirmClearModalOpen]);
const handleClearBlocklistConfirmed = useCallback(() => {
dispatch(executeCommand({ name: commandNames.CLEAR_BLOCKLIST }));
setIsConfirmClearModalOpen(false);
}, [setIsConfirmClearModalOpen, dispatch]);
const handleConfirmClearModalClose = useCallback(() => {
setIsConfirmClearModalOpen(false);
}, [setIsConfirmClearModalOpen]);
const {
handleFirstPagePress,
handlePreviousPagePress,
handleNextPagePress,
handleLastPagePress,
handlePageSelect,
} = usePaging({
page,
totalPages,
gotoPage: gotoBlocklistPage,
});
const handleFilterSelect = useCallback(
(selectedFilterKey: string) => {
dispatch(setBlocklistFilter({ selectedFilterKey }));
},
[dispatch]
);
const handleSortPress = useCallback(
(sortKey: string) => {
dispatch(setBlocklistSort({ sortKey }));
},
[dispatch]
);
const handleTableOptionChange = useCallback(
(payload: TableOptionsChangePayload) => {
dispatch(setBlocklistTableOption(payload));
if (payload.pageSize) {
dispatch(gotoBlocklistPage({ page: 1 }));
}
},
[dispatch]
);
useEffect(() => {
if (requestCurrentPage) {
dispatch(fetchBlocklist());
} else {
dispatch(gotoBlocklistPage({ page: 1 }));
}
return () => {
dispatch(clearBlocklist());
};
}, [requestCurrentPage, dispatch]);
useEffect(() => {
const repopulate = () => {
dispatch(fetchBlocklist());
};
registerPagePopulator(repopulate);
return () => {
unregisterPagePopulator(repopulate);
};
}, [dispatch]);
useEffect(() => {
if (wasClearingBlocklistExecuting && !isClearingBlocklistExecuting) {
dispatch(gotoBlocklistPage({ page: 1 }));
}
}, [isClearingBlocklistExecuting, wasClearingBlocklistExecuting, dispatch]);
return (
<SelectProvider items={items}>
<PageContent title={translate('Blocklist')}>
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label={translate('RemoveSelected')}
iconName={icons.REMOVE}
isDisabled={!selectedIds.length}
isSpinning={isRemoving}
onPress={handleRemoveSelectedPress}
/>
<PageToolbarButton
label={translate('Clear')}
iconName={icons.CLEAR}
isDisabled={!items.length}
isSpinning={isClearingBlocklistExecuting}
onPress={handleClearBlocklistPress}
/>
</PageToolbarSection>
<PageToolbarSection alignContent={align.RIGHT}>
<TableOptionsModalWrapper
columns={columns}
pageSize={pageSize}
onTableOptionChange={handleTableOptionChange}
>
<PageToolbarButton
label={translate('Options')}
iconName={icons.TABLE}
/>
</TableOptionsModalWrapper>
<FilterMenu
alignMenu={align.RIGHT}
selectedFilterKey={selectedFilterKey}
filters={filters}
customFilters={customFilters}
filterModalConnectorComponent={BlocklistFilterModal}
onFilterSelect={handleFilterSelect}
/>
</PageToolbarSection>
</PageToolbar>
<PageContentBody>
{isFetching && !isPopulated ? <LoadingIndicator /> : null}
{!isFetching && !!error ? (
<Alert kind={kinds.DANGER}>{translate('BlocklistLoadError')}</Alert>
) : null}
{isPopulated && !error && !items.length ? (
<Alert kind={kinds.INFO}>
{selectedFilterKey === 'all'
? translate('NoBlocklistItems')
: translate('BlocklistFilterHasNoItems')}
</Alert>
) : null}
{isPopulated && !error && !!items.length ? (
<div>
<Table
selectAll={true}
allSelected={allSelected}
allUnselected={allUnselected}
columns={columns}
pageSize={pageSize}
sortKey={sortKey}
sortDirection={sortDirection}
onTableOptionChange={handleTableOptionChange}
onSelectAllChange={handleSelectAllChange}
onSortPress={handleSortPress}
>
<TableBody>
{items.map((item) => {
return (
<BlocklistRow
key={item.id}
isSelected={selectedState[item.id] || false}
columns={columns}
{...item}
onSelectedChange={handleSelectedChange}
/>
);
})}
</TableBody>
</Table>
<TablePager
page={page}
totalPages={totalPages}
totalRecords={totalRecords}
isFetching={isFetching}
onFirstPagePress={handleFirstPagePress}
onPreviousPagePress={handlePreviousPagePress}
onNextPagePress={handleNextPagePress}
onLastPagePress={handleLastPagePress}
onPageSelect={handlePageSelect}
/>
</div>
) : null}
</PageContentBody>
<ConfirmModal
isOpen={isConfirmRemoveModalOpen}
kind={kinds.DANGER}
title={translate('RemoveSelected')}
message={translate('RemoveSelectedBlocklistMessageText')}
confirmLabel={translate('RemoveSelected')}
onConfirm={handleRemoveSelectedConfirmed}
onCancel={handleConfirmRemoveModalClose}
/>
<ConfirmModal
isOpen={isConfirmClearModalOpen}
kind={kinds.DANGER}
title={translate('ClearBlocklist')}
message={translate('ClearBlocklistMessageText')}
confirmLabel={translate('Clear')}
onConfirm={handleClearBlocklistConfirmed}
onCancel={handleConfirmClearModalClose}
/>
</PageContent>
</SelectProvider>
);
}
export default Blocklist;

View File

@ -1,160 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
import withCurrentPage from 'Components/withCurrentPage';
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
import * as blocklistActions from 'Store/Actions/blocklistActions';
import { executeCommand } from 'Store/Actions/commandActions';
import * as commandNames from 'Commands/commandNames';
import Blocklist from './Blocklist';
function createMapStateToProps() {
return createSelector(
(state) => state.blocklist,
createCommandExecutingSelector(commandNames.CLEAR_BLOCKLIST),
(blocklist, isClearingBlocklistExecuting) => {
return {
isClearingBlocklistExecuting,
...blocklist
};
}
);
}
const mapDispatchToProps = {
...blocklistActions,
executeCommand
};
class BlocklistConnector extends Component {
//
// Lifecycle
componentDidMount() {
const {
useCurrentPage,
fetchBlocklist,
gotoBlocklistFirstPage
} = this.props;
registerPagePopulator(this.repopulate);
if (useCurrentPage) {
fetchBlocklist();
} else {
gotoBlocklistFirstPage();
}
}
componentDidUpdate(prevProps) {
if (prevProps.isClearingBlocklistExecuting && !this.props.isClearingBlocklistExecuting) {
this.props.gotoBlocklistFirstPage();
}
}
componentWillUnmount() {
this.props.clearBlocklist();
unregisterPagePopulator(this.repopulate);
}
//
// Control
repopulate = () => {
this.props.fetchBlocklist();
}
//
// Listeners
onFirstPagePress = () => {
this.props.gotoBlocklistFirstPage();
}
onPreviousPagePress = () => {
this.props.gotoBlocklistPreviousPage();
}
onNextPagePress = () => {
this.props.gotoBlocklistNextPage();
}
onLastPagePress = () => {
this.props.gotoBlocklistLastPage();
}
onPageSelect = (page) => {
this.props.gotoBlocklistPage({ page });
}
onRemoveSelected = (ids) => {
this.props.removeBlocklistItems({ ids });
}
onSortPress = (sortKey) => {
this.props.setBlocklistSort({ sortKey });
}
onTableOptionChange = (payload) => {
this.props.setBlocklistTableOption(payload);
if (payload.pageSize) {
this.props.gotoBlocklistFirstPage();
}
}
onClearBlocklistPress = () => {
this.props.executeCommand({ name: commandNames.CLEAR_BLOCKLIST });
}
onTableOptionChange = (payload) => {
this.props.setBlocklistTableOption(payload);
if (payload.pageSize) {
this.props.gotoBlocklistFirstPage();
}
}
//
// Render
render() {
return (
<Blocklist
onFirstPagePress={this.onFirstPagePress}
onPreviousPagePress={this.onPreviousPagePress}
onNextPagePress={this.onNextPagePress}
onLastPagePress={this.onLastPagePress}
onPageSelect={this.onPageSelect}
onRemoveSelected={this.onRemoveSelected}
onSortPress={this.onSortPress}
onTableOptionChange={this.onTableOptionChange}
onClearBlocklistPress={this.onClearBlocklistPress}
{...this.props}
/>
);
}
}
BlocklistConnector.propTypes = {
useCurrentPage: PropTypes.bool.isRequired,
isClearingBlocklistExecuting: PropTypes.bool.isRequired,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
fetchBlocklist: PropTypes.func.isRequired,
gotoBlocklistFirstPage: PropTypes.func.isRequired,
gotoBlocklistPreviousPage: PropTypes.func.isRequired,
gotoBlocklistNextPage: PropTypes.func.isRequired,
gotoBlocklistLastPage: PropTypes.func.isRequired,
gotoBlocklistPage: PropTypes.func.isRequired,
removeBlocklistItems: PropTypes.func.isRequired,
setBlocklistSort: PropTypes.func.isRequired,
setBlocklistTableOption: PropTypes.func.isRequired,
clearBlocklist: PropTypes.func.isRequired,
executeCommand: PropTypes.func.isRequired
};
export default withCurrentPage(
connect(createMapStateToProps, mapDispatchToProps)(BlocklistConnector)
);

View File

@ -1,89 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import Button from 'Components/Link/Button';
import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import Modal from 'Components/Modal/Modal';
import ModalContent from 'Components/Modal/ModalContent';
import ModalHeader from 'Components/Modal/ModalHeader';
import ModalBody from 'Components/Modal/ModalBody';
import ModalFooter from 'Components/Modal/ModalFooter';
class BlocklistDetailsModal extends Component {
//
// Render
render() {
const {
isOpen,
sourceTitle,
protocol,
indexer,
message,
onModalClose
} = this.props;
return (
<Modal
isOpen={isOpen}
onModalClose={onModalClose}
>
<ModalContent
onModalClose={onModalClose}
>
<ModalHeader>
Details
</ModalHeader>
<ModalBody>
<DescriptionList>
<DescriptionListItem
title="Name"
data={sourceTitle}
/>
<DescriptionListItem
title="Protocol"
data={protocol}
/>
{
!!message &&
<DescriptionListItem
title="Indexer"
data={indexer}
/>
}
{
!!message &&
<DescriptionListItem
title="Message"
data={message}
/>
}
</DescriptionList>
</ModalBody>
<ModalFooter>
<Button onPress={onModalClose}>
Close
</Button>
</ModalFooter>
</ModalContent>
</Modal>
);
}
}
BlocklistDetailsModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
sourceTitle: PropTypes.string.isRequired,
protocol: PropTypes.string.isRequired,
indexer: PropTypes.string,
message: PropTypes.string,
onModalClose: PropTypes.func.isRequired
};
export default BlocklistDetailsModal;

View File

@ -0,0 +1,64 @@
import React from 'react';
import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import Button from 'Components/Link/Button';
import Modal from 'Components/Modal/Modal';
import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import DownloadProtocol from 'DownloadClient/DownloadProtocol';
import translate from 'Utilities/String/translate';
interface BlocklistDetailsModalProps {
isOpen: boolean;
sourceTitle: string;
protocol: DownloadProtocol;
indexer?: string;
message?: string;
onModalClose: () => void;
}
function BlocklistDetailsModal(props: BlocklistDetailsModalProps) {
const { isOpen, sourceTitle, protocol, indexer, message, onModalClose } =
props;
return (
<Modal isOpen={isOpen} onModalClose={onModalClose}>
<ModalContent onModalClose={onModalClose}>
<ModalHeader>Details</ModalHeader>
<ModalBody>
<DescriptionList>
<DescriptionListItem title={translate('Name')} data={sourceTitle} />
<DescriptionListItem
title={translate('Protocol')}
data={protocol}
/>
{message ? (
<DescriptionListItem
title={translate('Indexer')}
data={indexer}
/>
) : null}
{message ? (
<DescriptionListItem
title={translate('Message')}
data={message}
/>
) : null}
</DescriptionList>
</ModalBody>
<ModalFooter>
<Button onPress={onModalClose}>{translate('Close')}</Button>
</ModalFooter>
</ModalContent>
</Modal>
);
}
export default BlocklistDetailsModal;

View File

@ -0,0 +1,54 @@
import React, { useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { createSelector } from 'reselect';
import AppState from 'App/State/AppState';
import FilterModal from 'Components/Filter/FilterModal';
import { setBlocklistFilter } from 'Store/Actions/blocklistActions';
function createBlocklistSelector() {
return createSelector(
(state: AppState) => state.blocklist.items,
(blocklistItems) => {
return blocklistItems;
}
);
}
function createFilterBuilderPropsSelector() {
return createSelector(
(state: AppState) => state.blocklist.filterBuilderProps,
(filterBuilderProps) => {
return filterBuilderProps;
}
);
}
interface BlocklistFilterModalProps {
isOpen: boolean;
}
export default function BlocklistFilterModal(props: BlocklistFilterModalProps) {
const sectionItems = useSelector(createBlocklistSelector());
const filterBuilderProps = useSelector(createFilterBuilderPropsSelector());
const customFilterType = 'blocklist';
const dispatch = useDispatch();
const dispatchSetFilter = useCallback(
(payload: unknown) => {
dispatch(setBlocklistFilter(payload));
},
[dispatch]
);
return (
<FilterModal
// TODO: Don't spread all the props
{...props}
sectionItems={sectionItems}
filterBuilderProps={filterBuilderProps}
customFilterType={customFilterType}
dispatchSetFilter={dispatchSetFilter}
/>
);
}

View File

@ -1,4 +1,4 @@
.language,
.languages,
.quality {
composes: cell from '~Components/Table/Cells/TableRowCell.css';

View File

@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'actions': string;
'indexer': string;
'languages': string;
'quality': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@ -1,198 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { icons, kinds } from 'Helpers/Props';
import IconButton from 'Components/Link/IconButton';
import TableSelectCell from 'Components/Table/Cells/TableSelectCell';
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
import TableRow from 'Components/Table/TableRow';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import EpisodeLanguage from 'Episode/EpisodeLanguage';
import EpisodeQuality from 'Episode/EpisodeQuality';
import SeriesTitleLink from 'Series/SeriesTitleLink';
import BlocklistDetailsModal from './BlocklistDetailsModal';
import styles from './BlocklistRow.css';
class BlocklistRow extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isDetailsModalOpen: false
};
}
//
// Listeners
onDetailsPress = () => {
this.setState({ isDetailsModalOpen: true });
}
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
//
// Render
render() {
const {
id,
series,
sourceTitle,
language,
quality,
date,
protocol,
indexer,
message,
isSelected,
columns,
onSelectedChange,
onRemovePress
} = this.props;
return (
<TableRow>
<TableSelectCell
id={id}
isSelected={isSelected}
onSelectedChange={onSelectedChange}
/>
{
columns.map((column) => {
const {
name,
isVisible
} = column;
if (!isVisible) {
return null;
}
if (name === 'series.sortTitle') {
return (
<TableRowCell key={name}>
<SeriesTitleLink
titleSlug={series.titleSlug}
title={series.title}
/>
</TableRowCell>
);
}
if (name === 'sourceTitle') {
return (
<TableRowCell key={name}>
{sourceTitle}
</TableRowCell>
);
}
if (name === 'language') {
return (
<TableRowCell
key={name}
className={styles.language}
>
<EpisodeLanguage
language={language}
/>
</TableRowCell>
);
}
if (name === 'quality') {
return (
<TableRowCell
key={name}
className={styles.quality}
>
<EpisodeQuality
quality={quality}
/>
</TableRowCell>
);
}
if (name === 'date') {
return (
<RelativeDateCellConnector
key={name}
date={date}
/>
);
}
if (name === 'indexer') {
return (
<TableRowCell
key={name}
className={styles.indexer}
>
{indexer}
</TableRowCell>
);
}
if (name === 'actions') {
return (
<TableRowCell
key={name}
className={styles.actions}
>
<IconButton
name={icons.INFO}
onPress={this.onDetailsPress}
/>
<IconButton
title="Remove from blocklist"
name={icons.REMOVE}
kind={kinds.DANGER}
onPress={onRemovePress}
/>
</TableRowCell>
);
}
return null;
})
}
<BlocklistDetailsModal
isOpen={this.state.isDetailsModalOpen}
sourceTitle={sourceTitle}
protocol={protocol}
indexer={indexer}
message={message}
onModalClose={this.onDetailsModalClose}
/>
</TableRow>
);
}
}
BlocklistRow.propTypes = {
id: PropTypes.number.isRequired,
series: PropTypes.object.isRequired,
sourceTitle: PropTypes.string.isRequired,
language: PropTypes.object.isRequired,
quality: PropTypes.object.isRequired,
date: PropTypes.string.isRequired,
protocol: PropTypes.string.isRequired,
indexer: PropTypes.string,
message: PropTypes.string,
isSelected: PropTypes.bool.isRequired,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
onSelectedChange: PropTypes.func.isRequired,
onRemovePress: PropTypes.func.isRequired
};
export default BlocklistRow;

View File

@ -0,0 +1,163 @@
import React, { useCallback, useState } from 'react';
import { useDispatch } from 'react-redux';
import IconButton from 'Components/Link/IconButton';
import RelativeDateCell from 'Components/Table/Cells/RelativeDateCell';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableSelectCell from 'Components/Table/Cells/TableSelectCell';
import Column from 'Components/Table/Column';
import TableRow from 'Components/Table/TableRow';
import EpisodeFormats from 'Episode/EpisodeFormats';
import EpisodeLanguages from 'Episode/EpisodeLanguages';
import EpisodeQuality from 'Episode/EpisodeQuality';
import { icons, kinds } from 'Helpers/Props';
import SeriesTitleLink from 'Series/SeriesTitleLink';
import useSeries from 'Series/useSeries';
import { removeBlocklistItem } from 'Store/Actions/blocklistActions';
import Blocklist from 'typings/Blocklist';
import { SelectStateInputProps } from 'typings/props';
import translate from 'Utilities/String/translate';
import BlocklistDetailsModal from './BlocklistDetailsModal';
import styles from './BlocklistRow.css';
interface BlocklistRowProps extends Blocklist {
isSelected: boolean;
columns: Column[];
onSelectedChange: (options: SelectStateInputProps) => void;
}
function BlocklistRow(props: BlocklistRowProps) {
const {
id,
seriesId,
sourceTitle,
languages,
quality,
customFormats,
date,
protocol,
indexer,
message,
isSelected,
columns,
onSelectedChange,
} = props;
const series = useSeries(seriesId);
const dispatch = useDispatch();
const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false);
const handleDetailsPress = useCallback(() => {
setIsDetailsModalOpen(true);
}, [setIsDetailsModalOpen]);
const handleDetailsModalClose = useCallback(() => {
setIsDetailsModalOpen(false);
}, [setIsDetailsModalOpen]);
const handleRemovePress = useCallback(() => {
dispatch(removeBlocklistItem({ id }));
}, [id, dispatch]);
if (!series) {
return null;
}
return (
<TableRow>
<TableSelectCell
id={id}
isSelected={isSelected}
onSelectedChange={onSelectedChange}
/>
{columns.map((column) => {
const { name, isVisible } = column;
if (!isVisible) {
return null;
}
if (name === 'series.sortTitle') {
return (
<TableRowCell key={name}>
<SeriesTitleLink
titleSlug={series.titleSlug}
title={series.title}
/>
</TableRowCell>
);
}
if (name === 'sourceTitle') {
return <TableRowCell key={name}>{sourceTitle}</TableRowCell>;
}
if (name === 'languages') {
return (
<TableRowCell key={name} className={styles.languages}>
<EpisodeLanguages languages={languages} />
</TableRowCell>
);
}
if (name === 'quality') {
return (
<TableRowCell key={name} className={styles.quality}>
<EpisodeQuality quality={quality} />
</TableRowCell>
);
}
if (name === 'customFormats') {
return (
<TableRowCell key={name}>
<EpisodeFormats formats={customFormats} />
</TableRowCell>
);
}
if (name === 'date') {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore ts(2739)
return <RelativeDateCell key={name} date={date} />;
}
if (name === 'indexer') {
return (
<TableRowCell key={name} className={styles.indexer}>
{indexer}
</TableRowCell>
);
}
if (name === 'actions') {
return (
<TableRowCell key={name} className={styles.actions}>
<IconButton name={icons.INFO} onPress={handleDetailsPress} />
<IconButton
title={translate('RemoveFromBlocklist')}
name={icons.REMOVE}
kind={kinds.DANGER}
onPress={handleRemovePress}
/>
</TableRowCell>
);
}
return null;
})}
<BlocklistDetailsModal
isOpen={isDetailsModalOpen}
sourceTitle={sourceTitle}
protocol={protocol}
indexer={indexer}
message={message}
onModalClose={handleDetailsModalClose}
/>
</TableRow>
);
}
export default BlocklistRow;

View File

@ -1,26 +0,0 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { removeBlocklistItem } from 'Store/Actions/blocklistActions';
import createSeriesSelector from 'Store/Selectors/createSeriesSelector';
import BlocklistRow from './BlocklistRow';
function createMapStateToProps() {
return createSelector(
createSeriesSelector(),
(series) => {
return {
series
};
}
);
}
function createMapDispatchToProps(dispatch, props) {
return {
onRemovePress() {
dispatch(removeBlocklistItem({ id: props.id }));
}
};
}
export default connect(createMapStateToProps, createMapDispatchToProps)(BlocklistRow);

View File

@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'description': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@ -1,334 +0,0 @@
import PropTypes from 'prop-types';
import React from 'react';
import formatAge from 'Utilities/Number/formatAge';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatPreferredWordScore from 'Utilities/Number/formatPreferredWordScore';
import Link from 'Components/Link/Link';
import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionListItemTitle';
import DescriptionListItemDescription from 'Components/DescriptionList/DescriptionListItemDescription';
import styles from './HistoryDetails.css';
function HistoryDetails(props) {
const {
eventType,
sourceTitle,
data,
shortDateFormat,
timeFormat
} = props;
if (eventType === 'grabbed') {
const {
indexer,
releaseGroup,
preferredWordScore,
seriesMatchType,
nzbInfoUrl,
downloadClient,
downloadClientName,
downloadId,
age,
ageHours,
ageMinutes,
publishedDate
} = data;
const downloadClientNameInfo = downloadClientName ?? downloadClient;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
{
indexer ?
<DescriptionListItem
title="Indexer"
data={indexer}
/> :
null
}
{
releaseGroup ?
<DescriptionListItem
descriptionClassName={styles.description}
title="Release Group"
data={releaseGroup}
/> :
null
}
{
preferredWordScore && preferredWordScore !== '0' ?
<DescriptionListItem
title="Preferred Word Score"
data={formatPreferredWordScore(preferredWordScore)}
/> :
null
}
{
seriesMatchType ?
<DescriptionListItem
descriptionClassName={styles.description}
title="Series Match Type"
data={seriesMatchType}
/> :
null
}
{
nzbInfoUrl ?
<span>
<DescriptionListItemTitle>
Info URL
</DescriptionListItemTitle>
<DescriptionListItemDescription>
<Link to={nzbInfoUrl}>{nzbInfoUrl}</Link>
</DescriptionListItemDescription>
</span> :
null
}
{
downloadClientNameInfo ?
<DescriptionListItem
title="Download Client"
data={downloadClientNameInfo}
/> :
null
}
{
downloadId ?
<DescriptionListItem
title="Grab ID"
data={downloadId}
/> :
null
}
{
age || ageHours || ageMinutes ?
<DescriptionListItem
title="Age (when grabbed)"
data={formatAge(age, ageHours, ageMinutes)}
/> :
null
}
{
publishedDate ?
<DescriptionListItem
title="Published Date"
data={formatDateTime(publishedDate, shortDateFormat, timeFormat, { includeSeconds: true })}
/> :
null
}
</DescriptionList>
);
}
if (eventType === 'downloadFailed') {
const {
message
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
{
message ?
<DescriptionListItem
title="Message"
data={message}
/> :
null
}
</DescriptionList>
);
}
if (eventType === 'downloadFolderImported') {
const {
preferredWordScore,
droppedPath,
importedPath
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
{
droppedPath ?
<DescriptionListItem
descriptionClassName={styles.description}
title="Source"
data={droppedPath}
/> :
null
}
{
importedPath ?
<DescriptionListItem
descriptionClassName={styles.description}
title="Imported To"
data={importedPath}
/> :
null
}
{
preferredWordScore && preferredWordScore !== '0' ?
<DescriptionListItem
title="Preferred Word Score"
data={formatPreferredWordScore(preferredWordScore)}
/> :
null
}
</DescriptionList>
);
}
if (eventType === 'episodeFileDeleted') {
const {
reason,
preferredWordScore
} = data;
let reasonMessage = '';
switch (reason) {
case 'Manual':
reasonMessage = 'File was deleted by via UI';
break;
case 'MissingFromDisk':
reasonMessage = 'Sonarr was unable to find the file on disk so the file was unlinked from the episode in the database';
break;
case 'Upgrade':
reasonMessage = 'File was deleted to import an upgrade';
break;
default:
reasonMessage = '';
}
return (
<DescriptionList>
<DescriptionListItem
title="Name"
data={sourceTitle}
/>
<DescriptionListItem
title="Reason"
data={reasonMessage}
/>
{
preferredWordScore && preferredWordScore !== '0' ?
<DescriptionListItem
title="Preferred Word Score"
data={formatPreferredWordScore(preferredWordScore)}
/> :
null
}
</DescriptionList>
);
}
if (eventType === 'episodeFileRenamed') {
const {
sourcePath,
sourceRelativePath,
path,
relativePath
} = data;
return (
<DescriptionList>
<DescriptionListItem
title="Source Path"
data={sourcePath}
/>
<DescriptionListItem
title="Source Relative Path"
data={sourceRelativePath}
/>
<DescriptionListItem
title="Destination Path"
data={path}
/>
<DescriptionListItem
title="Destination Relative Path"
data={relativePath}
/>
</DescriptionList>
);
}
if (eventType === 'downloadIgnored') {
const {
message
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
{
message ?
<DescriptionListItem
title="Message"
data={message}
/> :
null
}
</DescriptionList>
);
}
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
</DescriptionList>
);
}
HistoryDetails.propTypes = {
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
shortDateFormat: PropTypes.string.isRequired,
timeFormat: PropTypes.string.isRequired
};
export default HistoryDetails;

View File

@ -0,0 +1,289 @@
import React from 'react';
import { useSelector } from 'react-redux';
import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import DescriptionListItemDescription from 'Components/DescriptionList/DescriptionListItemDescription';
import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionListItemTitle';
import Link from 'Components/Link/Link';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
import {
DownloadFailedHistory,
DownloadFolderImportedHistory,
DownloadIgnoredHistory,
EpisodeFileDeletedHistory,
EpisodeFileRenamedHistory,
GrabbedHistoryData,
HistoryData,
HistoryEventType,
} from 'typings/History';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge';
import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore';
import translate from 'Utilities/String/translate';
import styles from './HistoryDetails.css';
interface HistoryDetailsProps {
eventType: HistoryEventType;
sourceTitle: string;
data: HistoryData;
downloadId?: string;
shortDateFormat: string;
timeFormat: string;
}
function HistoryDetails(props: HistoryDetailsProps) {
const { eventType, sourceTitle, data, downloadId } = props;
const { shortDateFormat, timeFormat } = useSelector(
createUISettingsSelector()
);
if (eventType === 'grabbed') {
const {
indexer,
releaseGroup,
seriesMatchType,
customFormatScore,
nzbInfoUrl,
downloadClient,
downloadClientName,
age,
ageHours,
ageMinutes,
publishedDate,
} = data as GrabbedHistoryData;
const downloadClientNameInfo = downloadClientName ?? downloadClient;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
/>
{indexer ? (
<DescriptionListItem title={translate('Indexer')} data={indexer} />
) : null}
{releaseGroup ? (
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('ReleaseGroup')}
data={releaseGroup}
/>
) : null}
{customFormatScore && customFormatScore !== '0' ? (
<DescriptionListItem
title={translate('CustomFormatScore')}
data={formatCustomFormatScore(parseInt(customFormatScore))}
/>
) : null}
{seriesMatchType ? (
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('SeriesMatchType')}
data={seriesMatchType}
/>
) : null}
{nzbInfoUrl ? (
<span>
<DescriptionListItemTitle>
{translate('InfoUrl')}
</DescriptionListItemTitle>
<DescriptionListItemDescription>
<Link to={nzbInfoUrl}>{nzbInfoUrl}</Link>
</DescriptionListItemDescription>
</span>
) : null}
{downloadClientNameInfo ? (
<DescriptionListItem
title={translate('DownloadClient')}
data={downloadClientNameInfo}
/>
) : null}
{downloadId ? (
<DescriptionListItem title={translate('GrabId')} data={downloadId} />
) : null}
{age || ageHours || ageMinutes ? (
<DescriptionListItem
title={translate('AgeWhenGrabbed')}
data={formatAge(age, ageHours, ageMinutes)}
/>
) : null}
{publishedDate ? (
<DescriptionListItem
title={translate('PublishedDate')}
data={formatDateTime(publishedDate, shortDateFormat, timeFormat, {
includeSeconds: true,
})}
/>
) : null}
</DescriptionList>
);
}
if (eventType === 'downloadFailed') {
const { message } = data as DownloadFailedHistory;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
/>
{downloadId ? (
<DescriptionListItem title={translate('GrabId')} data={downloadId} />
) : null}
{message ? (
<DescriptionListItem title={translate('Message')} data={message} />
) : null}
</DescriptionList>
);
}
if (eventType === 'downloadFolderImported') {
const { customFormatScore, droppedPath, importedPath } =
data as DownloadFolderImportedHistory;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
/>
{droppedPath ? (
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Source')}
data={droppedPath}
/>
) : null}
{importedPath ? (
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('ImportedTo')}
data={importedPath}
/>
) : null}
{customFormatScore && customFormatScore !== '0' ? (
<DescriptionListItem
title={translate('CustomFormatScore')}
data={formatCustomFormatScore(parseInt(customFormatScore))}
/>
) : null}
</DescriptionList>
);
}
if (eventType === 'episodeFileDeleted') {
const { reason, customFormatScore } = data as EpisodeFileDeletedHistory;
let reasonMessage = '';
switch (reason) {
case 'Manual':
reasonMessage = translate('DeletedReasonManual');
break;
case 'MissingFromDisk':
reasonMessage = translate('DeletedReasonEpisodeMissingFromDisk');
break;
case 'Upgrade':
reasonMessage = translate('DeletedReasonUpgrade');
break;
default:
reasonMessage = '';
}
return (
<DescriptionList>
<DescriptionListItem title={translate('Name')} data={sourceTitle} />
<DescriptionListItem title={translate('Reason')} data={reasonMessage} />
{customFormatScore && customFormatScore !== '0' ? (
<DescriptionListItem
title={translate('CustomFormatScore')}
data={formatCustomFormatScore(parseInt(customFormatScore))}
/>
) : null}
</DescriptionList>
);
}
if (eventType === 'episodeFileRenamed') {
const { sourcePath, sourceRelativePath, path, relativePath } =
data as EpisodeFileRenamedHistory;
return (
<DescriptionList>
<DescriptionListItem
title={translate('SourcePath')}
data={sourcePath}
/>
<DescriptionListItem
title={translate('SourceRelativePath')}
data={sourceRelativePath}
/>
<DescriptionListItem title={translate('DestinationPath')} data={path} />
<DescriptionListItem
title={translate('DestinationRelativePath')}
data={relativePath}
/>
</DescriptionList>
);
}
if (eventType === 'downloadIgnored') {
const { message } = data as DownloadIgnoredHistory;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
/>
{downloadId ? (
<DescriptionListItem title={translate('GrabId')} data={downloadId} />
) : null}
{message ? (
<DescriptionListItem title={translate('Message')} data={message} />
) : null}
</DescriptionList>
);
}
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('Name')}
data={sourceTitle}
/>
</DescriptionList>
);
}
export default HistoryDetails;

View File

@ -1,19 +0,0 @@
import _ from 'lodash';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
import HistoryDetails from './HistoryDetails';
function createMapStateToProps() {
return createSelector(
createUISettingsSelector(),
(uiSettings) => {
return _.pick(uiSettings, [
'shortDateFormat',
'timeFormat'
]);
}
);
}
export default connect(createMapStateToProps)(HistoryDetails);

View File

@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'markAsFailedButton': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@ -1,106 +0,0 @@
import PropTypes from 'prop-types';
import React from 'react';
import { kinds } from 'Helpers/Props';
import Button from 'Components/Link/Button';
import SpinnerButton from 'Components/Link/SpinnerButton';
import Modal from 'Components/Modal/Modal';
import ModalContent from 'Components/Modal/ModalContent';
import ModalHeader from 'Components/Modal/ModalHeader';
import ModalBody from 'Components/Modal/ModalBody';
import ModalFooter from 'Components/Modal/ModalFooter';
import HistoryDetails from './HistoryDetails';
import styles from './HistoryDetailsModal.css';
function getHeaderTitle(eventType) {
switch (eventType) {
case 'grabbed':
return 'Grabbed';
case 'downloadFailed':
return 'Download Failed';
case 'downloadFolderImported':
return 'Episode Imported';
case 'episodeFileDeleted':
return 'Episode File Deleted';
case 'episodeFileRenamed':
return 'Episode File Renamed';
case 'downloadIgnored':
return 'Download Ignored';
default:
return 'Unknown';
}
}
function HistoryDetailsModal(props) {
const {
isOpen,
eventType,
sourceTitle,
data,
isMarkingAsFailed,
shortDateFormat,
timeFormat,
onMarkAsFailedPress,
onModalClose
} = props;
return (
<Modal
isOpen={isOpen}
onModalClose={onModalClose}
>
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
{getHeaderTitle(eventType)}
</ModalHeader>
<ModalBody>
<HistoryDetails
eventType={eventType}
sourceTitle={sourceTitle}
data={data}
shortDateFormat={shortDateFormat}
timeFormat={timeFormat}
/>
</ModalBody>
<ModalFooter>
{
eventType === 'grabbed' &&
<SpinnerButton
className={styles.markAsFailedButton}
kind={kinds.DANGER}
isSpinning={isMarkingAsFailed}
onPress={onMarkAsFailedPress}
>
Mark as Failed
</SpinnerButton>
}
<Button
onPress={onModalClose}
>
Close
</Button>
</ModalFooter>
</ModalContent>
</Modal>
);
}
HistoryDetailsModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
isMarkingAsFailed: PropTypes.bool.isRequired,
shortDateFormat: PropTypes.string.isRequired,
timeFormat: PropTypes.string.isRequired,
onMarkAsFailedPress: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};
HistoryDetailsModal.defaultProps = {
isMarkingAsFailed: false
};
export default HistoryDetailsModal;

View File

@ -0,0 +1,100 @@
import React from 'react';
import Button from 'Components/Link/Button';
import SpinnerButton from 'Components/Link/SpinnerButton';
import Modal from 'Components/Modal/Modal';
import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds } from 'Helpers/Props';
import { HistoryData, HistoryEventType } from 'typings/History';
import translate from 'Utilities/String/translate';
import HistoryDetails from './HistoryDetails';
import styles from './HistoryDetailsModal.css';
function getHeaderTitle(eventType: HistoryEventType) {
switch (eventType) {
case 'grabbed':
return translate('Grabbed');
case 'downloadFailed':
return translate('DownloadFailed');
case 'downloadFolderImported':
return translate('EpisodeImported');
case 'episodeFileDeleted':
return translate('EpisodeFileDeleted');
case 'episodeFileRenamed':
return translate('EpisodeFileRenamed');
case 'downloadIgnored':
return translate('DownloadIgnored');
default:
return translate('Unknown');
}
}
interface HistoryDetailsModalProps {
isOpen: boolean;
eventType: HistoryEventType;
sourceTitle: string;
data: HistoryData;
downloadId?: string;
isMarkingAsFailed: boolean;
shortDateFormat: string;
timeFormat: string;
onMarkAsFailedPress: () => void;
onModalClose: () => void;
}
function HistoryDetailsModal(props: HistoryDetailsModalProps) {
const {
isOpen,
eventType,
sourceTitle,
data,
downloadId,
isMarkingAsFailed,
shortDateFormat,
timeFormat,
onMarkAsFailedPress,
onModalClose,
} = props;
return (
<Modal isOpen={isOpen} onModalClose={onModalClose}>
<ModalContent onModalClose={onModalClose}>
<ModalHeader>{getHeaderTitle(eventType)}</ModalHeader>
<ModalBody>
<HistoryDetails
eventType={eventType}
sourceTitle={sourceTitle}
data={data}
downloadId={downloadId}
shortDateFormat={shortDateFormat}
timeFormat={timeFormat}
/>
</ModalBody>
<ModalFooter>
{eventType === 'grabbed' && (
<SpinnerButton
className={styles.markAsFailedButton}
kind={kinds.DANGER}
isSpinning={isMarkingAsFailed}
onPress={onMarkAsFailedPress}
>
{translate('MarkAsFailed')}
</SpinnerButton>
)}
<Button onPress={onModalClose}>{translate('Close')}</Button>
</ModalFooter>
</ModalContent>
</Modal>
);
}
HistoryDetailsModal.defaultProps = {
isMarkingAsFailed: false,
};
export default HistoryDetailsModal;

View File

@ -1,172 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { align, icons } from 'Helpers/Props';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import FilterMenu from 'Components/Menu/FilterMenu';
import HistoryRowConnector from './HistoryRowConnector';
class History extends Component {
//
// Lifecycle
shouldComponentUpdate(nextProps) {
// Don't update when fetching has completed if items have changed,
// before episodes start fetching or when episodes start fetching.
if (
(
this.props.isFetching &&
nextProps.isPopulated &&
hasDifferentItems(this.props.items, nextProps.items)
) ||
(!this.props.isEpisodesFetching && nextProps.isEpisodesFetching)
) {
return false;
}
return true;
}
//
// Render
render() {
const {
isFetching,
isPopulated,
error,
items,
columns,
selectedFilterKey,
filters,
totalRecords,
isEpisodesFetching,
isEpisodesPopulated,
episodesError,
onFilterSelect,
onFirstPagePress,
...otherProps
} = this.props;
const isFetchingAny = isFetching || isEpisodesFetching;
const isAllPopulated = isPopulated && (isEpisodesPopulated || !items.length);
const hasError = error || episodesError;
return (
<PageContent title="History">
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label="Refresh"
iconName={icons.REFRESH}
isSpinning={isFetching}
onPress={onFirstPagePress}
/>
</PageToolbarSection>
<PageToolbarSection alignContent={align.RIGHT}>
<TableOptionsModalWrapper
{...otherProps}
columns={columns}
>
<PageToolbarButton
label="Options"
iconName={icons.TABLE}
/>
</TableOptionsModalWrapper>
<FilterMenu
alignMenu={align.RIGHT}
selectedFilterKey={selectedFilterKey}
filters={filters}
customFilters={[]}
onFilterSelect={onFilterSelect}
/>
</PageToolbarSection>
</PageToolbar>
<PageContentBody>
{
isFetchingAny && !isAllPopulated &&
<LoadingIndicator />
}
{
!isFetchingAny && hasError &&
<div>Unable to load history</div>
}
{
// If history isPopulated and it's empty show no history found and don't
// wait for the episodes to populate because they are never coming.
isPopulated && !hasError && !items.length &&
<div>
No history found
</div>
}
{
isAllPopulated && !hasError && !!items.length &&
<div>
<Table
columns={columns}
{...otherProps}
>
<TableBody>
{
items.map((item) => {
return (
<HistoryRowConnector
key={item.id}
columns={columns}
{...item}
/>
);
})
}
</TableBody>
</Table>
<TablePager
totalRecords={totalRecords}
isFetching={isFetchingAny}
onFirstPagePress={onFirstPagePress}
{...otherProps}
/>
</div>
}
</PageContentBody>
</PageContent>
);
}
}
History.propTypes = {
isFetching: PropTypes.bool.isRequired,
isPopulated: PropTypes.bool.isRequired,
error: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
selectedFilterKey: PropTypes.string.isRequired,
filters: PropTypes.arrayOf(PropTypes.object).isRequired,
totalRecords: PropTypes.number,
isEpisodesFetching: PropTypes.bool.isRequired,
isEpisodesPopulated: PropTypes.bool.isRequired,
episodesError: PropTypes.object,
onFilterSelect: PropTypes.func.isRequired,
onFirstPagePress: PropTypes.func.isRequired
};
export default History;

View File

@ -0,0 +1,231 @@
import React, { useCallback, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import AppState from 'App/State/AppState';
import Alert from 'Components/Alert';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import FilterMenu from 'Components/Menu/FilterMenu';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import usePaging from 'Components/Table/usePaging';
import createEpisodesFetchingSelector from 'Episode/createEpisodesFetchingSelector';
import useCurrentPage from 'Helpers/Hooks/useCurrentPage';
import { align, icons, kinds } from 'Helpers/Props';
import { clearEpisodes, fetchEpisodes } from 'Store/Actions/episodeActions';
import { clearEpisodeFiles } from 'Store/Actions/episodeFileActions';
import {
clearHistory,
fetchHistory,
gotoHistoryPage,
setHistoryFilter,
setHistorySort,
setHistoryTableOption,
} from 'Store/Actions/historyActions';
import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector';
import HistoryItem from 'typings/History';
import { TableOptionsChangePayload } from 'typings/Table';
import selectUniqueIds from 'Utilities/Object/selectUniqueIds';
import {
registerPagePopulator,
unregisterPagePopulator,
} from 'Utilities/pagePopulator';
import translate from 'Utilities/String/translate';
import HistoryFilterModal from './HistoryFilterModal';
import HistoryRow from './HistoryRow';
function History() {
const requestCurrentPage = useCurrentPage();
const {
isFetching,
isPopulated,
error,
items,
columns,
selectedFilterKey,
filters,
sortKey,
sortDirection,
page,
pageSize,
totalPages,
totalRecords,
} = useSelector((state: AppState) => state.history);
const { isEpisodesFetching, isEpisodesPopulated, episodesError } =
useSelector(createEpisodesFetchingSelector());
const customFilters = useSelector(createCustomFiltersSelector('history'));
const dispatch = useDispatch();
const isFetchingAny = isFetching || isEpisodesFetching;
const isAllPopulated = isPopulated && (isEpisodesPopulated || !items.length);
const hasError = error || episodesError;
const {
handleFirstPagePress,
handlePreviousPagePress,
handleNextPagePress,
handleLastPagePress,
handlePageSelect,
} = usePaging({
page,
totalPages,
gotoPage: gotoHistoryPage,
});
const handleFilterSelect = useCallback(
(selectedFilterKey: string) => {
dispatch(setHistoryFilter({ selectedFilterKey }));
},
[dispatch]
);
const handleSortPress = useCallback(
(sortKey: string) => {
dispatch(setHistorySort({ sortKey }));
},
[dispatch]
);
const handleTableOptionChange = useCallback(
(payload: TableOptionsChangePayload) => {
dispatch(setHistoryTableOption(payload));
if (payload.pageSize) {
dispatch(gotoHistoryPage({ page: 1 }));
}
},
[dispatch]
);
useEffect(() => {
if (requestCurrentPage) {
dispatch(fetchHistory());
} else {
dispatch(gotoHistoryPage({ page: 1 }));
}
return () => {
dispatch(clearHistory());
dispatch(clearEpisodes());
dispatch(clearEpisodeFiles());
};
}, [requestCurrentPage, dispatch]);
useEffect(() => {
const episodeIds = selectUniqueIds<HistoryItem, number>(items, 'episodeId');
if (episodeIds.length) {
dispatch(fetchEpisodes({ episodeIds }));
} else {
dispatch(clearEpisodes());
}
}, [items, dispatch]);
useEffect(() => {
const repopulate = () => {
dispatch(fetchHistory());
};
registerPagePopulator(repopulate);
return () => {
unregisterPagePopulator(repopulate);
};
}, [dispatch]);
return (
<PageContent title={translate('History')}>
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label={translate('Refresh')}
iconName={icons.REFRESH}
isSpinning={isFetching}
onPress={handleFirstPagePress}
/>
</PageToolbarSection>
<PageToolbarSection alignContent={align.RIGHT}>
<TableOptionsModalWrapper
columns={columns}
pageSize={pageSize}
onTableOptionChange={handleTableOptionChange}
>
<PageToolbarButton
label={translate('Options')}
iconName={icons.TABLE}
/>
</TableOptionsModalWrapper>
<FilterMenu
alignMenu={align.RIGHT}
selectedFilterKey={selectedFilterKey}
filters={filters}
customFilters={customFilters}
filterModalConnectorComponent={HistoryFilterModal}
onFilterSelect={handleFilterSelect}
/>
</PageToolbarSection>
</PageToolbar>
<PageContentBody>
{isFetchingAny && !isAllPopulated ? <LoadingIndicator /> : null}
{!isFetchingAny && hasError ? (
<Alert kind={kinds.DANGER}>{translate('HistoryLoadError')}</Alert>
) : null}
{
// If history isPopulated and it's empty show no history found and don't
// wait for the episodes to populate because they are never coming.
isPopulated && !hasError && !items.length ? (
<Alert kind={kinds.INFO}>{translate('NoHistoryFound')}</Alert>
) : null
}
{isAllPopulated && !hasError && items.length ? (
<div>
<Table
columns={columns}
pageSize={pageSize}
sortKey={sortKey}
sortDirection={sortDirection}
onTableOptionChange={handleTableOptionChange}
onSortPress={handleSortPress}
>
<TableBody>
{items.map((item) => {
return (
<HistoryRow key={item.id} columns={columns} {...item} />
);
})}
</TableBody>
</Table>
<TablePager
page={page}
totalPages={totalPages}
totalRecords={totalRecords}
isFetching={isFetching}
onFirstPagePress={handleFirstPagePress}
onPreviousPagePress={handlePreviousPagePress}
onNextPagePress={handleNextPagePress}
onLastPagePress={handleLastPagePress}
onPageSelect={handlePageSelect}
/>
</div>
) : null}
</PageContentBody>
</PageContent>
);
}
export default History;

View File

@ -1,162 +0,0 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import selectUniqueIds from 'Utilities/Object/selectUniqueIds';
import withCurrentPage from 'Components/withCurrentPage';
import * as historyActions from 'Store/Actions/historyActions';
import { fetchEpisodes, clearEpisodes } from 'Store/Actions/episodeActions';
import { clearEpisodeFiles } from 'Store/Actions/episodeFileActions';
import History from './History';
function createMapStateToProps() {
return createSelector(
(state) => state.history,
(state) => state.episodes,
(history, episodes) => {
return {
isEpisodesFetching: episodes.isFetching,
isEpisodesPopulated: episodes.isPopulated,
episodesError: episodes.error,
...history
};
}
);
}
const mapDispatchToProps = {
...historyActions,
fetchEpisodes,
clearEpisodes,
clearEpisodeFiles
};
class HistoryConnector extends Component {
//
// Lifecycle
componentDidMount() {
const {
useCurrentPage,
fetchHistory,
gotoHistoryFirstPage
} = this.props;
registerPagePopulator(this.repopulate);
if (useCurrentPage) {
fetchHistory();
} else {
gotoHistoryFirstPage();
}
}
componentDidUpdate(prevProps) {
if (hasDifferentItems(prevProps.items, this.props.items)) {
const episodeIds = selectUniqueIds(this.props.items, 'episodeId');
if (episodeIds.length) {
this.props.fetchEpisodes({ episodeIds });
} else {
this.props.clearEpisodes();
}
}
}
componentWillUnmount() {
unregisterPagePopulator(this.repopulate);
this.props.clearHistory();
this.props.clearEpisodes();
this.props.clearEpisodeFiles();
}
//
// Control
repopulate = () => {
this.props.fetchHistory();
}
//
// Listeners
onFirstPagePress = () => {
this.props.gotoHistoryFirstPage();
}
onPreviousPagePress = () => {
this.props.gotoHistoryPreviousPage();
}
onNextPagePress = () => {
this.props.gotoHistoryNextPage();
}
onLastPagePress = () => {
this.props.gotoHistoryLastPage();
}
onPageSelect = (page) => {
this.props.gotoHistoryPage({ page });
}
onSortPress = (sortKey) => {
this.props.setHistorySort({ sortKey });
}
onFilterSelect = (selectedFilterKey) => {
this.props.setHistoryFilter({ selectedFilterKey });
}
onTableOptionChange = (payload) => {
this.props.setHistoryTableOption(payload);
if (payload.pageSize) {
this.props.gotoHistoryFirstPage();
}
}
//
// Render
render() {
return (
<History
onFirstPagePress={this.onFirstPagePress}
onPreviousPagePress={this.onPreviousPagePress}
onNextPagePress={this.onNextPagePress}
onLastPagePress={this.onLastPagePress}
onPageSelect={this.onPageSelect}
onSortPress={this.onSortPress}
onFilterSelect={this.onFilterSelect}
onTableOptionChange={this.onTableOptionChange}
{...this.props}
/>
);
}
}
HistoryConnector.propTypes = {
useCurrentPage: PropTypes.bool.isRequired,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
fetchHistory: PropTypes.func.isRequired,
gotoHistoryFirstPage: PropTypes.func.isRequired,
gotoHistoryPreviousPage: PropTypes.func.isRequired,
gotoHistoryNextPage: PropTypes.func.isRequired,
gotoHistoryLastPage: PropTypes.func.isRequired,
gotoHistoryPage: PropTypes.func.isRequired,
setHistorySort: PropTypes.func.isRequired,
setHistoryFilter: PropTypes.func.isRequired,
setHistoryTableOption: PropTypes.func.isRequired,
clearHistory: PropTypes.func.isRequired,
fetchEpisodes: PropTypes.func.isRequired,
clearEpisodes: PropTypes.func.isRequired,
clearEpisodeFiles: PropTypes.func.isRequired
};
export default withCurrentPage(
connect(createMapStateToProps, mapDispatchToProps)(HistoryConnector)
);

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