1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-18 21:35:51 -04:00

Compare commits

..

418 Commits

Author SHA1 Message Date
Qstick 982e3c14d3 Fix Tests from Site Image Changes 2021-02-02 22:36:32 -05:00
Qstick 8dafa29f8c Bump Radarr Version 3.0.2 2021-01-08 21:42:24 -05:00
Qstick 6b3bdb4f88 Bump Sentry 2.1.8 / SentryJS 5.29.2 2021-01-08 21:41:44 -05:00
Mark McDowall 56bb319934 Use createHandleActions for adding/removing commands so itemMap is synced properly
(cherry picked from commit 99be6a7e4065b77c910df6444a468fedc23e90cc)
2021-01-08 20:58:53 -05:00
Qstick 6de847a361 Fixed: Don't try to clean Update Folder if it doesn't exist
(cherry picked from commit 24f96fa2a4c1fd92f6433ec94edf6e55b7c83d89)
2021-01-08 20:56:16 -05:00
Mark McDowall 94591dea93 New: Removing update folder from temp folder during housekeeping
(cherry picked from commit c1d060ff58fc466f4a2cc232bff07294cf224a9a)
2021-01-08 20:55:16 -05:00
bakerboy448 5cb20b0dac Fixed: Parsing of 4Kto1080p as 1080p
(cherry picked from commit 056a699daf2ed0b8314f0b4d6bdec20cd24818c3)
2021-01-08 20:09:41 -05:00
bakerboy448 69954c50cb it's 2021 now [skip ci] 2021-01-08 17:32:11 -05:00
Anonymous e5d72bb995 Translated using Weblate (Korean) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ko/
2021-01-07 21:15:57 +00:00
Anonymous ae7c78ba48 Translated using Weblate (Hebrew) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/he/
2021-01-07 21:14:42 +00:00
Anonymous 84498d9e92 Translated using Weblate (Danish) [skip ci]
Currently translated at 99.6% (1057 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/da/
2021-01-07 21:13:33 +00:00
Anonymous d12b75e223 Translated using Weblate (Russian) [skip ci]
Currently translated at 99.7% (1058 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2021-01-07 21:12:34 +00:00
Anonymous b27367088e Translated using Weblate (Polish) [skip ci]
Currently translated at 99.9% (1060 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pl/
2021-01-07 21:12:32 +00:00
Anonymous 570bc87ab7 Translated using Weblate (Greek) [skip ci]
Currently translated at 99.5% (1056 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/el/
2021-01-07 21:11:25 +00:00
pannbiff 1ae4c53e27 Translated using Weblate (Swedish) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2021-01-07 21:10:19 +00:00
Anonymous cd84045161 Translated using Weblate (Vietnamese) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/vi/
2021-01-07 21:10:17 +00:00
Anonymous 667fdc64e3 Translated using Weblate (Spanish) [skip ci]
Currently translated at 97.9% (1039 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2021-01-07 21:09:02 +00:00
Anonymous e424264504 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 97.7% (1037 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2021-01-07 21:08:44 +00:00
ta264 7716c31ebd Translated using Weblate (Bulgarian) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/bg/
2021-01-07 21:08:29 +00:00
Anonymous 6d729416d9 Translated using Weblate (Italian) [skip ci]
Currently translated at 97.8% (1038 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2021-01-07 21:07:20 +00:00
Anonymous 1668978fc6 Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
Currently translated at 99.9% (1060 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2021-01-07 21:07:07 +00:00
Anonymous 874840c921 Translated using Weblate (Finnish) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fi/
2021-01-07 21:07:05 +00:00
Anonymous defd08addf Translated using Weblate (Icelandic) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/is/
2021-01-07 21:05:48 +00:00
Anonymous c072e0a2ca Translated using Weblate (Turkish) [skip ci]
Currently translated at 99.6% (1057 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/tr/
2021-01-07 21:04:34 +00:00
Anonymous d9ce781dfa Translated using Weblate (Dutch) [skip ci]
Currently translated at 99.9% (1060 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2021-01-07 21:03:30 +00:00
Anonymous a438d43c57 Translated using Weblate (French) [skip ci]
Currently translated at 97.1% (1031 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2021-01-07 21:03:27 +00:00
ta264 81f0fd38ac Translated using Weblate (French) [skip ci]
Currently translated at 97.1% (1031 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2021-01-07 21:03:17 +00:00
Anonymous bbc9de464c Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 98.7% (1048 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2021-01-07 21:03:15 +00:00
ta264 0738e35583 Translated using Weblate (Hindi) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hi/
2021-01-07 21:03:14 +00:00
Anonymous 6e2f13f76b Translated using Weblate (Romanian) [skip ci]
Currently translated at 99.5% (1056 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ro/
2021-01-07 21:02:05 +00:00
Anonymous 2fb36f7c6c Translated using Weblate (Japanese) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ja/
2021-01-07 21:01:12 +00:00
Anonymous 5ead82903c Translated using Weblate (Czech) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/cs/
2021-01-07 20:59:51 +00:00
Anonymous b4c03aae6d Translated using Weblate (Thai) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/th/
2021-01-07 20:58:38 +00:00
pannbiff 2a8a2ce3b0 Translated using Weblate (Swedish) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2021-01-07 20:05:55 +00:00
Anonymous c75a9dfe34 Translated using Weblate (Swedish) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2021-01-07 20:05:55 +00:00
Qstick 7410a2db5d Remove validation test for From Addresses 2021-01-06 23:50:34 -05:00
Qstick 74c89e1d44 Enforce Selection of Credit Type on Person Lists
Fixes: #5684
2021-01-06 23:19:31 -05:00
Qstick f120b84c43 Fixed: Allow "Pretty" From Address for Email
Fixes #5497
2021-01-06 23:11:15 -05:00
Qstick 88ec106ec6 Better validation for Imdb Ids from lists
Fixes #5674
2021-01-06 23:06:07 -05:00
wangerry 99b75a3089 Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 98.6% (1047 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2021-01-06 11:43:28 +00:00
Forsefrits 50592d5bb6 Translated using Weblate (Dutch) [skip ci]
Currently translated at 96.6% (1025 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2021-01-06 11:43:28 +00:00
Qstick 9fce6b1026 Really ignore ResizeObserver loop errors
(cherry picked from commit 99a7540fe4dc5160f6487cfe810e99166ee4582e)
2021-01-05 22:54:25 -05:00
Csaba 5f32627bfb Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2021-01-04 20:43:22 +00:00
Mark McDowall 56b658cc96 Fixed: Restored robots.txt
(cherry picked from commit 37501094d7256e4dbe13de33b392933f6d475553)
2020-12-31 16:39:23 -05:00
nitsua c22ae12c1f Move the Movie column next to the Folder colum for easier matching (#5078)
Fixes: #5075
2020-12-30 23:30:55 -05:00
tenshiak 4bac44e893 New: Better Polish language Release Parsing (#5592)
* Parse Polish language

* Tests for parsing Polish language
2020-12-30 22:50:45 -05:00
jasimancas 1c58e26183 - Change <writer> to <credits> 2020-12-30 22:30:46 -05:00
jasimancas 4d965955d1 - Add rating 2020-12-30 22:30:46 -05:00
jasimancas 23b9d657ce no message 2020-12-30 22:30:46 -05:00
jasimancas c046c3c229 - Added new ratings scheme
- Added the fields userrating, top250, outline, tagline, playcount, lastplayed, country empty for use in Kodi (need this field in database)
- Added Director and Writer
- Added overview to set (empty, need this field in database)
- Change ID to TMDB (previously IMDB)
- Set True TMDB UniqueID instead of IMDB
- Modified thumb's sentence
- Remove <tmdbid>
- Reordered XML to match Kodi schema (https://kodi.wiki/view/NFO_files/Movies)
2020-12-30 22:30:46 -05:00
jasimancas f734ba2323 Schematize NFO in XBMC with Kodi format: https://kodi.wiki/view/NFO_files/Movies 2020-12-30 22:30:46 -05:00
bakerboy448 44fa36373c reword library import do not use for downloads text 2020-12-30 22:12:27 -05:00
bakerboy448 e6afcb68f3 update mac icon 2020-12-29 21:15:05 -05:00
Qstick c8c900251a Update PushoverSettings.cs
Fixes #5635
2020-12-29 14:35:22 -05:00
pannbiff 915e7ce589 Translated using Weblate (Swedish) [skip ci]
Currently translated at 60.5% (642 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-12-29 08:43:20 +00:00
Qstick 5bab42b712 Fix LocalizationServiceFixture Test 2020-12-27 21:56:25 -05:00
Qstick f499e846d9 Fixed: Grab correct translation on case sensitive file systems 2020-12-27 21:07:20 -05:00
Qstick 80a744eff5 Fixed: 'iso-8859-2' is not a supported encoding name 2020-12-26 10:58:38 -05:00
Lizandra Candido da Silva 82dfaf0ea5 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 98.7% (1048 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-26 09:43:18 +00:00
Qstick 8f78953191 Change Skip Refresh Log to Debug 2020-12-25 00:23:09 -05:00
Havok Dan 9261efa843 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 98.7% (1048 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-24 21:43:18 +00:00
Qstick b9a8166f9f Rename recentfeed.json to RecentFeed.json 2020-12-24 13:16:32 -05:00
Taloth Saldono 8cccde48c1 Fixed test file casing
(cherry picked from commit a7ca139e13375e73074508d74b9590f5446d3b09)
2020-12-24 13:16:32 -05:00
ta264 96384521c5 Fixed: FolderWritable check for CIFS shares mounted in Unix
This reverts commit 8c892a732e.
2020-12-24 17:29:38 +00:00
ta264 f90211b0d3 Fixed: UI hanging after scrolling movie list too fast
[common]
2020-12-24 12:21:17 -05:00
Qstick d1bebd3e5b Fix RemotePathMappingCheckFixture 2020-12-24 02:43:29 -05:00
Qstick a32bc21907 Fix Wiki Links for Hardcoded Fragments 2020-12-24 02:37:08 -05:00
Qstick 4f7dc94b94 Fix BasicRepository Tests when not on UTC
[common]
2020-12-24 01:02:24 -05:00
bakerboy448 5ca1a1d086 fix contributing port [skip ci] 2020-12-23 12:21:59 -05:00
angelsky11 7d763b8ba0 Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 98.6% (1047 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-23 08:43:20 +00:00
reloxx 23c197bd3b Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-12-23 08:43:19 +00:00
ta264 8c892a732e Revert "Fixed: FolderWritable check for CIFS shares mounted in Unix"
This reverts commit a71874db8d.
2020-12-23 08:28:19 +00:00
bakerboy448 140547e42a Fixed: '/movie' URL Base breaking UI navigation 2020-12-22 14:59:34 -05:00
Qstick 3ab9af0663 New: Portuguese (Brazil) Language Support 2020-12-22 13:41:18 -05:00
ta264 a71874db8d Fixed: FolderWritable check for CIFS shares mounted in Unix
See https://github.com/dotnet/runtime/issues/42790

Implemented workaround in https://github.com/dotnet/runtime/issues/42790#issuecomment-700362617

[common]
2020-12-22 15:58:20 +00:00
angelsky11 226ee34fec Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 97.7% (1037 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-22 15:17:20 +00:00
angelsky11 eb5add1198 Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 82.8% (879 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-22 07:43:18 +00:00
bakerboy448 3759625386 New: Improved Discover recommendations
New: Movies existing in Library no longer show as a Discover Recommendations
2020-12-21 22:50:30 -05:00
angelsky11 b85f3f0e35 Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 81.3% (863 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-21 18:25:55 +00:00
ta264 286b083da4 Fixed: Restoring large database backups
Remove Kestrel's default 28.6MB upload limit

[common]
2020-12-21 17:39:16 +00:00
angelsky11 912273b5dd Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 80.5% (855 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-21 17:38:33 +00:00
angelsky11 73d1486392 Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 70.4% (748 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-21 02:43:23 +00:00
angelsky11 063c6fb85c Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 55.7% (592 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-20 07:43:29 +00:00
bakerboy448 c95573a7da fix readme wiki badge [skip ci]
also re order
2020-12-19 18:10:25 -05:00
Qstick a6cf524fe7 Remove “Preview” from tab description text 2020-12-19 14:49:29 -05:00
reloxx bb264e9a8a Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-12-18 20:43:15 +00:00
wangerry ca0cabe985 Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 11.8% (126 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-18 02:43:18 +00:00
Lizandra Candido da Silva 48c3aea9bb Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 98.3% (1044 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-17 07:43:17 +00:00
kingii98 4122b82601 Translated using Weblate (Russian) [skip ci]
Currently translated at 99.5% (1056 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2020-12-17 07:43:17 +00:00
Csaba 3abf67aaf0 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-12-17 07:43:16 +00:00
pannbiff 2b860aab36 Translated using Weblate (Swedish) [skip ci]
Currently translated at 60.4% (641 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-12-16 01:01:24 +00:00
bakerboy448 85bfcd72ff Fix: Bad Translate when removing Activity from queue
(also sort)
2020-12-15 20:01:18 -05:00
faxity df15c636a4 Translated using Weblate (Dutch) [skip ci]
Currently translated at 88.0% (934 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-12-15 05:34:23 +00:00
Forsefrits 1136de29e5 Translated using Weblate (Dutch) [skip ci]
Currently translated at 78.9% (838 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-12-14 10:34:21 +00:00
Qstick ffcb34f9f0 Ignore ResizeObserver loop limit errors
[common]
2020-12-12 14:04:16 -05:00
Qstick 877b6c0fcf Change to once a day for locking [skip ci] 2020-12-10 10:09:03 -05:00
reloxx 854c1a6866 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-12-10 11:34:17 +00:00
hotio cd8ed08376 Translated using Weblate (Dutch) [skip ci]
Currently translated at 77.1% (819 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-12-09 22:34:19 +00:00
Csaba b64c938188 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-12-09 22:34:18 +00:00
reloxx bd930f3b8d Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1061 of 1061 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-12-09 22:34:17 +00:00
Qstick 0880cd6ffc Allow manually run lock [skip ci] 2020-12-08 23:47:46 -05:00
Qstick c2a96ff485 Run Lock every 10 minutes for test [skip ci] 2020-12-08 23:31:03 -05:00
Qstick 21e92e7fcf Update lock.yml 2020-12-08 23:15:46 -05:00
Qstick 96f0bb2f90 Lock Issues Workflow [skip ci] 2020-12-08 23:01:29 -05:00
Qstick c0e1b97f29 Bump Version to 3.0.1 2020-12-08 22:01:53 -05:00
Qstick fd4fb88ce1 New: Add Validations for Recycle Bin Folder
[common]
2020-12-08 21:53:42 -05:00
bakerboy448 003686d68f Fixed: Clarify Language around Importing a Library
New: Library Import renamed from (sidebar) Import to Library Import
2020-12-07 22:48:34 -05:00
wangerry 3e0e4ba1fd Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 11.3% (120 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-07 21:49:30 +00:00
Pavel 45ecfb05f4 Translated using Weblate (Russian) [skip ci]
Currently translated at 100.0% (1058 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2020-12-07 21:49:27 +00:00
wangerry ab620d373c Translated using Weblate (Chinese (Simplified)) [skip ci]
Currently translated at 0.1% (1 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/zh_CN/
2020-12-06 12:48:37 +00:00
Pavel 9b3faefc8e Translated using Weblate (Russian) [skip ci]
Currently translated at 68.7% (727 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2020-12-06 12:48:37 +00:00
Qstick dd577f9db0 Added translation using Weblate (Chinese (Simplified)) [skip ci] 2020-12-05 14:35:07 +00:00
Qstick 5c0939d9df Deleted translation using Weblate (Chinese (Simplified)) [skip ci] 2020-12-05 14:33:44 +00:00
Qstick bdb818b1b6 Added translation using Weblate (Chinese (Simplified)) [skip ci] 2020-12-05 14:26:06 +00:00
Qstick 4550ef13a4 Don't call AllMovies twice for each AddMovie validation 2020-12-04 23:23:20 -05:00
Lizandra Candido da Silva 98f0769c5d Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 98.3% (1041 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-05 00:21:18 +00:00
jpalenz77 6f854ddd56 Translated using Weblate (Spanish) [skip ci]
Currently translated at 78.3% (829 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-12-05 00:21:18 +00:00
pannbiff 98ae094733 Translated using Weblate (Swedish) [skip ci]
Currently translated at 60.3% (638 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-12-05 00:21:18 +00:00
Pavel 15e4dc18b9 Translated using Weblate (Russian) [skip ci]
Currently translated at 36.2% (383 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2020-12-05 00:21:18 +00:00
Qstick d5a7479b2e Fix typo in DeleteMovieFolder label [skip ci] 2020-12-04 19:21:00 -05:00
Na0mir e1bff99a93 Translated using Weblate (French) [skip ci]
Currently translated at 84.0% (889 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-12-04 20:50:04 +00:00
Julien Orain 9d31aed9da fix feature requests link 2020-12-04 15:06:33 +00:00
Qstick 9fbc1df74c Fixed: Persist SearchOnAdd setting value in local cache 2020-12-03 22:34:42 -05:00
Qstick 2d9c77ec5e Fixed: If v0.2 DB Exists back it up during update 2020-12-03 21:12:31 -05:00
Havok Dan ede7d37cae Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 96.2% (1018 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-03 12:52:57 +00:00
Lizandra Candido da Silva b580b4f829 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 96.2% (1018 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-03 12:52:56 +00:00
ta264 4f281669fc Fixed: Use QBittorrent category savepath for healthcheck
[common]
2020-12-02 22:25:35 -05:00
Lizandra Candido da Silva 9fbedc32ed Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 88.7% (939 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 23:35:15 +00:00
Havok Dan 745007209e Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 88.7% (939 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 23:35:11 +00:00
ta264 3e1cfe0033 Don't nag linux x86 users to switch to net core 2020-12-02 19:09:02 +00:00
Lizandra Candido da Silva 94b94041a8 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 55.8% (591 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 18:56:07 +00:00
Havok Dan 791a32b939 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 55.8% (591 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 18:56:07 +00:00
Lizandra Candido da Silva af395f554e Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 54.2% (574 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 18:49:07 +00:00
Lizandra Candido da Silva 39640a710f Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 53.5% (567 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 18:47:21 +00:00
Havok Dan 6557f72600 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 53.5% (567 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 18:47:20 +00:00
Lizandra Candido da Silva 14b127e60d Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 47.3% (501 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 18:20:18 +00:00
Havok Dan e6e6205799 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 47.3% (501 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt_BR/
2020-12-02 18:20:18 +00:00
Qstick 083c4750fb Fixed: Leading zeros on MI Info
Fixes #5433
2020-12-01 23:15:41 -05:00
Qstick 099d0b6e67 More API Docs [skip ci] 2020-12-01 22:31:33 -05:00
pannbiff 17615e9ace Translated using Weblate (Swedish) [skip ci]
Currently translated at 60.2% (637 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-12-01 10:49:13 +00:00
Csaba 9179b9e0eb Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (1058 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-12-01 10:49:11 +00:00
reloxx 3389cc0cf8 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1058 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-12-01 10:49:10 +00:00
userdocs 21c297024f Update swagger.json (#5439) [skip ci]
Fix: /API Key/apikey generation when using the https://radarr.video/docs/api/ and setting an api key.

It currently generates this output which will not work with Radarr v3

```
curl -X GET "http://localhost:7878/api/v3/system/status?API%20Key=awawfaw" -H "accept: application/json"
```
2020-11-30 23:17:47 -05:00
Qstick c4324c8e47 Fixed: Migrate fails for Sonarr contaminated DBs 2020-11-30 23:17:11 -05:00
nitsua ac8fa1ee93 Adjust CSS so titles are wrap instead of truncate
Fixes #5350
2020-11-29 23:04:03 -05:00
memnos 93cff9c6ef Translated using Weblate (Italian) [skip ci]
Currently translated at 80.8% (855 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-11-30 03:50:33 +00:00
reloxx 3d0e993a53 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1058 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-11-30 03:50:33 +00:00
bakerboy448 87330c8ab9 Fixed: Incorrect reference to preferred words in proper setting helptext (#5430) 2020-11-29 22:50:28 -05:00
Qstick 785ad5d62e Fixed: Sample generation failing for {Movie OriginalTitle}
Fixes #5426
2020-11-29 22:32:49 -05:00
bakerboy448 0ddf19d384 add API Doc Link to ReadMe [skip ci] 2020-11-29 16:45:41 -05:00
Qstick 30c9446165 Fixed: SQL Error on DownloadHistory Insert 2020-11-28 22:30:00 -05:00
Qstick e104a9e261 Fixed: TypeError on Keyup in Firefox for MovieIndex and Details 2020-11-28 21:55:19 -05:00
Qstick 4c19fa0d05 Fixed: Schedule task should reflect Backup Interval change 2020-11-28 16:57:50 -05:00
Qstick 7cd29c48bb Fixed: Importlist sync setting and validator 2020-11-28 16:34:07 -05:00
pannbiff 1aa117331f Translated using Weblate (Swedish) [skip ci]
Currently translated at 53.8% (570 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-11-28 18:22:03 +00:00
pannbiff 89baa3ff6d Translated using Weblate (Swedish) [skip ci]
Currently translated at 53.5% (567 of 1058 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-11-28 17:25:39 +00:00
Qstick c4b729697d Fix Translation Error in Interactive Import Error Message [skip ci] 2020-11-28 12:25:33 -05:00
pannbiff 9052ef11a4 Translated using Weblate (Swedish) [skip ci]
Currently translated at 49.7% (527 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-11-28 16:05:53 +00:00
Qstick 3d5d884505 Default Branch to Master 2020-11-28 11:05:41 -05:00
Qstick 23a8b68869 Add refresh all to migration 177 for v0.2 migrations 2020-11-28 11:05:41 -05:00
Csaba 46ff3b7538 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (1059 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-27 20:49:09 +00:00
reloxx 444b8e3436 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1059 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-11-27 20:49:08 +00:00
ta264 413669dbaa Add SortKey validation
[common]
2020-11-27 11:08:03 -05:00
Qstick 564a7554fc Fixed: Don't workaround DTS if audioChannels invalid 2020-11-27 01:10:09 -05:00
Qstick c16ca46f11 Fixed: Tags View in UI Slow due to All() Movie Call 2020-11-27 00:38:47 -05:00
Qstick a960716cec Fixed: Set CutoffUnmet correctly on MovieEditor response 2020-11-27 00:38:47 -05:00
Qstick f55e44c591 Fixed: Incorrect translation key on MoveMovieModal 2020-11-27 00:38:47 -05:00
Qstick 17f8eb3aae Make list options advanced settings, Set min list sync 2020-11-27 00:38:47 -05:00
Qstick 082a0679d2 Fixed: Bad Translation on Restrictions Modal 2020-11-27 00:38:47 -05:00
Qstick 5182ac2a13 Fixed: Migrate Mediainfo properties that changed names 2020-11-27 00:37:53 -05:00
Gergo Schwahofer 0e1cb335a9 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (1059 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-27 02:49:10 +00:00
reloxx 078cdc0cb0 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1059 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-11-27 02:49:09 +00:00
bakerboy448 0366029269 Fixed: Legend and Colors on calendar
Fixed: Streamline Legend in Index and Calendar
Fixed: Broken Translations
2020-11-26 08:16:44 -05:00
Qstick 6d011cdc48 Fixed: Availability shows incorrect for movies (doesn't consider delay setting) 2020-11-26 03:06:16 -05:00
Gergo Schwahofer 9f1833dd9e Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (1059 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-26 00:49:18 +00:00
Csaba 882b1d6427 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (1059 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-26 00:49:17 +00:00
reloxx d73f1fe954 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1059 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-11-26 00:49:17 +00:00
Csaba b707dcc20f Translated using Weblate (Hungarian) [skip ci]
Currently translated at 99.9% (1058 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:54:24 +00:00
Csaba c1e1df3c22 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 99.8% (1057 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:54:00 +00:00
Csaba 2297b9cc14 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 99.7% (1056 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:53:48 +00:00
Csaba 9225e04f80 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 99.3% (1052 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:52:24 +00:00
Gergo Schwahofer 7496ae0b69 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 99.2% (1051 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:52:02 +00:00
Csaba 3443738e21 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 99.2% (1051 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:52:02 +00:00
Gergo Schwahofer f632386b5c Translated using Weblate (Hungarian) [skip ci]
Currently translated at 98.9% (1048 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:51:20 +00:00
Gergo Schwahofer 4f26081f9d Translated using Weblate (Hungarian) [skip ci]
Currently translated at 89.0% (943 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:02:52 +00:00
Csaba 8c5709aec8 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 89.0% (943 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:02:51 +00:00
Gergo Schwahofer 6f046293b8 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 88.8% (941 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:02:21 +00:00
Csaba c9519dc4b6 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 88.8% (941 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 10:02:20 +00:00
Gergo Schwahofer 1c1b8902c2 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 88.2% (935 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 09:59:38 +00:00
Csaba 053bce7a0f Translated using Weblate (Hungarian) [skip ci]
Currently translated at 87.0% (922 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 09:54:48 +00:00
Csaba b3476c4b28 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 86.6% (918 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 09:54:09 +00:00
Csaba 1b372c41ca Translated using Weblate (Hungarian) [skip ci]
Currently translated at 86.2% (913 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 09:52:40 +00:00
Csaba 624a7ad00a Translated using Weblate (Hungarian) [skip ci]
Currently translated at 85.6% (907 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 09:50:32 +00:00
Gergo Schwahofer 5079db5dd8 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 85.6% (907 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-25 09:50:31 +00:00
Qstick a8f517b64f Update README.md 2020-11-25 00:45:26 -05:00
pannbiff 2ca31afa8a Translated using Weblate (Swedish) [skip ci]
Currently translated at 44.1% (468 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-11-25 04:49:13 +00:00
jpalenz77 5eb5e5d5ab Translated using Weblate (Spanish) [skip ci]
Currently translated at 78.2% (829 of 1059 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-11-25 04:49:12 +00:00
Qstick a152ab2b56 Fixed: Log only for quality mismatch between release and file 2020-11-24 23:10:02 -05:00
Qstick 6bfd9f0e18 [API Docs] Fix minor issues with tags and types [skip ci] 2020-11-24 22:43:49 -05:00
Qstick bb418f7191 Fix bug template 'about' length [skip ci] 2020-11-24 22:19:08 -05:00
bakerboy448 e88b4b10e9 update readme [skip ci] 2020-11-24 22:13:09 -05:00
bakerboy448 f72a56f88a use lidarr's contributing as a new template for radarr [skip ci]
-needs review
2020-11-24 21:05:58 -05:00
bakerboy448 c55a832934 update GH Issue Templates [skip ci] 2020-11-24 20:56:31 -05:00
reloxx ff62ac22e8 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (859 of 859 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-11-24 16:22:41 +00:00
bakerboy448 699d2be938 New: Add Missing Translations 2020-11-24 11:22:35 -05:00
Qstick 86118b4537 More API docs [skip ci] 2020-11-23 22:09:36 -05:00
kingii98 1a7ead0e51 Translated using Weblate (Russian) [skip ci]
Currently translated at 8.8% (76 of 859 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2020-11-24 00:49:14 +00:00
Csaba dbd241bbc5 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (859 of 859 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-24 00:49:13 +00:00
memnos 1ee270114b Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (859 of 859 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-11-24 00:49:08 +00:00
ta264 f90133d588 Fixed: Set correct permissions on Radarr.Update before starting 2020-11-23 19:41:25 +00:00
bakerboy448 bb721272ca New: All Wiki links now use the consolidated Servarr wiki 2020-11-22 23:14:00 -05:00
Qstick e3ac7d6fc5 Fixed binary execute permissions for osx and Radarr
Fixes #5388

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-11-22 11:25:40 -05:00
Qstick 28e2834c5d V3 API Docs Updates [skip ci] 2020-11-22 02:50:38 -05:00
Qstick 9c77399379 New: Dynamic Select and UMask Fields
Fixes #5380
Fixes #5348
Fixes #5167
Fixes #5166

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-11-22 01:01:50 -05:00
Qstick 73ce77f1ca Branch to nightly so tests pass 2020-11-21 23:53:48 -05:00
Qstick 984d0101bf Basic json linting for translations (structure, dupekeys, etc) 2020-11-21 23:13:39 -05:00
Qstick f9242af246 Use Arch and Runtime when getting list of update changes 2020-11-21 23:12:38 -05:00
reloxx 0b5a40a2b7 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (853 of 853 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-11-18 20:49:05 +00:00
Qstick 0221df15e2 Added translation using Weblate (Portuguese (Brazil)) [skip ci] 2020-11-18 17:35:29 +00:00
Daniel Martin Gonzalez c6294b71ae New: Add Spain to list of Certifications 2020-11-18 11:47:58 -05:00
Will Segatto 2fbd829b93 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (853 of 853 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-11-18 05:49:06 +00:00
Csaba 5ed4a386dd Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (853 of 853 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-18 05:49:05 +00:00
Qstick f9733eea7a Fixed: Use audioChannels_Original if it exists in MI 2020-11-17 23:46:57 -05:00
Qstick 59f9ff7a22 Fixed: Tweak Edition Regex to prevent 'Special' false positives
Fixes #4932
2020-11-17 23:45:42 -05:00
Qstick 460c86911c Fixed: Scene Name not being stored properly during import if not linked to a download client item and filename is obfuscated
Fixes #5370
Fixes $5358
Fixes #5361
2020-11-17 22:22:31 -05:00
Qstick a04f375eb1 Fixed: Files table not showing correct quality meets cutoff post edit
Fixes #4668
2020-11-17 22:04:56 -05:00
Qstick 7792c159b4 Movie Windows/Posix Disk Tests to correct fixtures
Fixes: #4678
2020-11-17 21:52:22 -05:00
Qstick 6beb8c8b05 New: Add Australia to list of Certifications
Fixes #5351
2020-11-17 21:19:04 -05:00
Qstick 6d0019ad00 New: Look for and use {tmdb} tag in folder name on import
Fixes #5213
2020-11-17 15:55:55 -05:00
Qstick ef8ba37d0e Lock bot config [skip ci] 2020-11-17 13:57:55 -05:00
Taloth Saldono 5e1b197702 Give systemd a bit more time to restart sonarr after update
(cherry picked from commit 5fced70948c1e8d3d5e3c4747516507f87506697)
2020-11-16 17:36:14 -05:00
ta264 4d43c3eb2b Fixed: Import single file torrents with a folder from QBittorrent 2020-11-16 17:34:31 -05:00
memnos 4c1de51b52 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (851 of 851 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-11-16 16:32:29 +00:00
bakerboy448 bdb61e263e Fix: Update monitor options to be displayed in a more user friendly way 2020-11-16 11:32:24 -05:00
pannbiff 616ae471d1 Translated using Weblate (Swedish) [skip ci]
Currently translated at 54.8% (467 of 851 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-11-16 09:49:05 +00:00
Qstick ce11d4c7bf Bump Mediainfo to 20.09 for Mac 2020-11-15 01:05:41 -05:00
Qstick a7ba19ddd8 Build Win x86 zip and installer 2020-11-15 01:05:41 -05:00
Qstick 784913a85b Fixed: Prevent null when no candidate in ParsingService 2020-11-15 00:12:53 -05:00
Qstick 67ebf49b21 Revert "New: Change Add Movie Monitor Selection from Dropdown to Checkbox (#5319)"
This reverts commit 897bfa04a6.
2020-11-14 23:11:37 -05:00
Qstick 0e5f43e139 Fixed: Same movie different year gets imported incorrectly 2020-11-14 23:11:33 -05:00
Qstick d5addfa12f Fixed: Disabled List items show up in Discovery
Fixes #5328
2020-11-14 22:34:05 -05:00
Taloth Saldono 96852c9f96 Protect against Qbittorrent edgecase if users add torrents manually with Keep top-level folder disabled
(cherry picked from commit 05820ac272ee976fcc0a7b17f3e9cc987cb0d230)
2020-11-14 18:35:02 -05:00
Qstick 7311a1e837 fixup! Fix Unit Tests 2020-11-14 01:52:28 -05:00
Qstick a591227052 Fixed: Nested Folder in MovieFolder Naming not created automatically 2020-11-14 01:52:28 -05:00
bakerboy448 897bfa04a6 New: Change Add Movie Monitor Selection from Dropdown to Checkbox (#5319)
* New: Change Add Movie Monitor Selection from Dropdown to Checkbox

* Fix Monitored Value not storing (bool changes)

* address discord comments
2020-11-14 01:18:41 -05:00
ta264 3e795d290b Fixed: Get actual file names from QBittorrent API (#5226)
* Fixed: Get actual file names from QBittorrent API

Previously we were assuming that the output filename was the category
output dir + the torrent name.  This isn't true if the torrent has
been renamed or sanitized.
2020-11-14 00:27:07 -05:00
Mark McDowall b7719662a7 Return max tooltip width
(cherry picked from commit fe0d8bb7da27e0f34b5db166ee54033f292b1006)
2020-11-13 21:12:49 -05:00
Taloth Saldono f1b7f5b355 Bumped Sabnzbd default history request size from 30 to 60
(cherry picked from commit 8b2550cef0381a07c466044063c9d8c2be4d89c3)
2020-11-13 21:10:27 -05:00
Csaba 164a7f0f8c Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (851 of 851 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-13 22:49:04 +00:00
reloxx cfa0e9aa19 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (851 of 851 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-11-13 22:49:04 +00:00
geogolem d9ff8e0d4a Fixed: Clarify Status Filter, Add ConsideredAvailable, MinAvailability Filters (#4924) 2020-11-12 23:13:39 -05:00
Qstick b888b044d6 Fixed: False Positives for RemotePath check with Deluge 2020-11-12 22:29:11 -05:00
Qstick 9be8d438e7 Tweak recommended wording [skip ci] 2020-11-12 21:47:04 -05:00
Qstick 642783d3de Add "Screenshot if UI change" to PR template [skip ci] 2020-11-12 21:31:38 -05:00
Edward Scroop cf08f483b2 Update README.md (#5307) [skip ci]
As development of features for Radarr v2 has stopped, ensure that new contributors can begin developing Radarr v3 by changing reference to NZbdrone.
2020-11-12 21:28:54 -05:00
bakerboy448 f6c630ee9e Add Discover Recommended tooltip (#5318) 2020-11-12 21:22:38 -05:00
geogolem f5a46b14ac Add NeutralLanguage to Radarr.csproj to appease VS 16.8 2020-11-12 21:18:10 -05:00
Qstick 3a8ca21a17 Add NeutralLanguage to NzbDrone.Common to appease VS 16.8 2020-11-12 20:50:52 -05:00
Qstick 70a9a68ed3 Bump to dotnet core 3.1.10 2020-11-11 23:26:07 -05:00
Qstick dc96857e66 Fixed: Console App Icon 2020-11-11 22:13:54 -05:00
Qstick bb5f5eeee6 Fixed: Correctly storing v0 version during import, allowing them to be upgraded to v1 later
Fixes #5305

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-11-11 21:37:45 -05:00
memnos d7938b6282 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (848 of 848 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-11-12 01:49:04 +00:00
Qstick c21e733d57 Fixed: Clarify List Clean options, Add warning on removeAndDelete selection 2020-11-10 23:35:20 -05:00
pannbiff 75866b135c Translated using Weblate (Swedish) [skip ci]
Currently translated at 52.3% (443 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-11-09 03:49:03 +00:00
kingii98 5aaf8dcf0e Translated using Weblate (Russian) [skip ci]
Currently translated at 8.3% (71 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2020-11-09 03:49:02 +00:00
Csaba 1dcff1b742 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (847 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-11-06 23:49:01 +00:00
Qstick adedbc1bed Rename DiscordNotifier for less user confusion 2020-11-05 22:01:40 -05:00
Qstick 4fa1955008 Fixed: Handle Null in Discord Notification if no images 2020-11-05 22:01:40 -05:00
Mark McDowall bab9b2c040 Fixed: Show TLS errors in UI when testing download clients 2020-11-05 22:01:40 -05:00
Qstick 216f9b37b2 Remove ParsingLibrary 2020-11-05 22:01:40 -05:00
Qstick 025f064ecf Fixed: RawHD quality detection
Fixes #5267
Fixes #5207
2020-11-05 22:01:40 -05:00
Qstick b8df38e929 Change 'Ignore Deleted Movies' to 'Unmonitor Deleted Movies' for consistency 2020-11-05 22:01:40 -05:00
Qstick 72f0dadbea New: Show .net version in UI 2020-11-05 22:01:40 -05:00
Robin Dadswell 3e22658e27 New: Discord notification upgrade colour
(cherry picked from commit cfdaddd81ae66412766ff19805c78e8503205bbe)
2020-11-05 21:44:50 -05:00
Taloth Saldono d00f3abbf0 Fixed: Dataloss when moving series folder to root folder with only different casing
Fixes #5190
Fixes #5184
2020-11-03 22:07:11 -05:00
Mark McDowall c270a53eab Fixed: Telegram silent notifications
(cherry picked from commit 0b7aa19ac06600936f6c4cb18ea3474e8a96f1e2)
2020-11-03 21:44:24 -05:00
Robin Dadswell b474961b65 updated OnDownload to use 'Success' Colour 2020-10-31 11:09:20 -04:00
Qstick cfb44c7db7 Fixed: 576p Detection in MediaInfoAugment 2020-10-29 21:13:20 -04:00
Qstick 45011198e2 Improved Trakt list validation
Fixes #5262

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-29 20:50:35 -04:00
Qstick a03d136aa4 Fixed: Cleanse account and passwd from Download Station URLs
Fixes #5266

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-29 20:45:09 -04:00
pannbiff e2a45caada Translated using Weblate (Swedish) [skip ci]
Currently translated at 49.3% (418 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-10-27 07:48:58 +00:00
Mark McDowall e3db49896b Fixed: Show feed URL if incorrect mime type is found
(cherry picked from commit fa2e70d571cc7658611a0c51b8603247a22e6a2e)
2020-10-25 15:40:29 -04:00
Will Segatto 920b7d8e29 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (847 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-10-22 02:48:56 +00:00
memnos 0df442caf2 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (847 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-10-22 02:48:55 +00:00
Qstick d835358f75 Fixed: Clean DB dupes and add unique constrain 2020-10-20 09:07:54 -04:00
pannbiff 45d329423c Translated using Weblate (Swedish) [skip ci]
Currently translated at 46.1% (391 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-10-20 04:49:01 +00:00
Csaba f177ebfb4a Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (847 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-20 04:48:59 +00:00
Qstick 6e135b1e36 Cleanup old changlog files, we use azure now 2020-10-18 22:16:06 -04:00
Qstick 31ca413fc7 Fixed: Language sort on Interactive Search page 2020-10-18 22:11:19 -04:00
Qstick 959d63b4eb Fixed: Filter by Peers in Interactive Search 2020-10-18 21:34:27 -04:00
foXaCe 09ed2ab889 Translated using Weblate (French) [skip ci]
Currently translated at 99.8% (846 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-18 03:48:54 +00:00
reloxx 1374a12d4c Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (847 of 847 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-10-18 03:48:53 +00:00
Qstick 76cabb4927 Use new multi-select component for indexer languages 2020-10-17 01:38:41 -04:00
nitsua 5b83d09d5e Remove some instances of moment that are not needed on the index to reduce the load 2020-10-17 01:04:50 -04:00
Daniel Martin Gonzalez 82eadcffaa New: Add Option to localize metadata written in .nfo if available (#5060)
* Add Option to localize metadata written in .nfo if available

* Fix Pull Request comments
2020-10-17 01:03:46 -04:00
Qstick 1ebb71db59 Fixed: Import Extra files from Subfolders
Fixes: #4646
2020-10-17 00:17:38 -04:00
Qstick 662b3894c2 Fixed: Make Notification trigger texts consistent
Fixes #5012
2020-10-17 00:06:23 -04:00
Qstick a1c21af9b5 Fixed: (Windows) clean up extraneous files in build folder during installation
Fixes #5200
Fixes #5203

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-16 23:33:03 -04:00
Qstick 67fca87c44 Added PrivacyLevel option to FieldDefinition for later usage
Fixes #5107

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-10-16 23:27:01 -04:00
Qstick 6ee2780370 Fixed some mediainfo subtitle codes
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-16 23:06:17 -04:00
Qstick 0086e2699e Protect against undefined SizeOnDisk
Fixes #5205

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-16 22:59:21 -04:00
Qstick 37c9701237 Fixed: Rerender Overviews on Overview option changes
Fixes #5150

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-16 22:55:28 -04:00
Qstick 6d452d8479 New: Bulk remove from Blacklist
Fixes #5194

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-16 22:45:23 -04:00
Qstick e82f0c01d8 Re-saving edited providers will forcibly save them
Fixes #5192

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-16 22:28:19 -04:00
Qstick ee456c3291 Fixed: MapCoversToLocal for tmdbid queries to all movies endpoint 2020-10-16 22:19:17 -04:00
kingii98 9986f0119b Translated using Weblate (Russian) [skip ci]
Currently translated at 6.7% (57 of 844 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2020-10-16 21:48:58 +00:00
Csaba 5d4da26195 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (844 of 844 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-16 21:48:58 +00:00
memnos 5ed448c930 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (844 of 844 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-10-16 21:48:58 +00:00
jpalenz77 9263e31b7b Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (844 of 844 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-10-16 21:48:57 +00:00
angrycuban13 516122c6f3 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (843 of 843 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-10-16 03:00:36 +00:00
foXaCe 256a50abab Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (843 of 843 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-16 03:00:36 +00:00
EnorMOZ 315929bc5e Update "TagsHelpText" with similar language as sonarr (#5218)
* Update "TagsHelpText" with similar language as sonarr

* Use new translation key
2020-10-15 23:00:31 -04:00
Qstick 4a681601b2 Skip Screenshot on 2nd build attempt 2020-10-15 21:14:27 -04:00
Csaba ab3b5bdf8b Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (842 of 842 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-15 14:38:36 +00:00
Qstick e52288bd67 New: Edit RlsGroup, Flags, and Edition for Movie Files (#5183)
* New: Edit RlsGroup and Edition for Movie Files

* fixup! remove console log

* fixup! translation
2020-10-15 10:38:30 -04:00
servarr[bot] f2f26d88b9 New: Differentiate between short term and long term (more than 6 hours) indexer failures (#5202)
* New: Differentiate between short term and long term (more than 6 hours) indexer failures

(cherry picked from commit 2adedb97da5ad31b65f0dc2eec5c263efe95731f)

* fixup! Mock Localization

Co-authored-by: Mark McDowall <mark@mcdowall.ca>
Co-authored-by: Qstick <qstick@gmail.com>
2020-10-15 07:20:02 -04:00
nitsua 27354507cb Fix issue with IMDb lists (some not all) not parsing properly causing an issue when trying to add them 2020-10-14 15:08:08 -04:00
Qstick b7aa1df219 Fix Automation/cleanup build yml (#5211)
* Cleanup build yml

* fixup! bump chrome driver
2020-10-13 21:53:17 -04:00
ta264 2d7942d69c Fixed: Speed up RSS sync 2020-10-13 20:54:33 -04:00
ta264 0a8dd85856 Fixed: Speed up initial movie load when opening the UI 2020-10-13 20:54:33 -04:00
ta264 f917d0e9bc Add FileInfo utility functions to DiskProvider 2020-10-13 20:54:33 -04:00
kingii98 024e4df99c Translated using Weblate (Russian) [skip ci]
Currently translated at 6.1% (52 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ru/
2020-10-13 16:48:58 +00:00
Csaba 49fa402c55 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-13 16:48:57 +00:00
Qstick 02c95658c4 Windows installer improvements
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-11 22:43:08 -04:00
Mark McDowall 3bc4231640 New: Health events for Webhooks
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-11 22:40:18 -04:00
Mark McDowall a9a0d47f9f Fixed: Copying passwords
(cherry picked from commit c871b3f9487b9bfeb3726d763a632a772b420a0a)
2020-10-11 20:36:46 -04:00
Florian 0dd05b2dac Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-11 21:48:51 +00:00
Qstick 3986433884 Fixed: Default a Movie object with Empty Ratings 2020-10-11 01:26:53 -04:00
Mark McDowall f637976530 Fixed: Parsing of URLs with double slashes in the path
(cherry picked from commit 0c7743e786749b333333d282412ff76fc10aba65)
2020-10-10 17:16:21 -04:00
Qstick 603d26bb5f Take Screenshot on Automation tests for build status notifications 2020-10-09 21:51:59 -04:00
Will Segatto 6b41ad7442 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-10-10 00:49:05 +00:00
hotio 4c049ac3d9 Translated using Weblate (Dutch) [skip ci]
Currently translated at 97.9% (823 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-10-10 00:49:04 +00:00
Csaba 84df3e8b5b Translated using Weblate (Hungarian) [skip ci]
Currently translated at 91.4% (768 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-10 00:49:03 +00:00
jpalenz77 0ff76e14bb Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-10-10 00:48:55 +00:00
Florian 5433c6364c Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-10 00:48:50 +00:00
geogolem 038e3d5c44 update trayIcon with new Radarr Icon 2020-10-08 14:27:07 -04:00
Qstick 71b126024b Remove unused mac startup script 2020-10-07 23:07:47 -04:00
Qstick 76565d4ab5 Fixed: Old Icon being used on Console App 2020-10-07 23:06:43 -04:00
ta264 28c15bc425 Log out SQL trace on error
Fixes #4910

Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2020-10-07 22:55:54 -04:00
Qstick aeda4cba32 Fixed: Render CustomFormats under profile option for Large Screens 2020-10-07 22:01:58 -04:00
Qstick a826c1dc25 New: MultiSelect input control for provider settings
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-10-07 21:27:17 -04:00
Csaba 00022fd206 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 32.3% (272 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-08 00:48:53 +00:00
Will Segatto 0647663f46 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-10-07 05:48:57 +00:00
Csaba b83bfb045b Translated using Weblate (Hungarian) [skip ci]
Currently translated at 25.1% (211 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-07 05:48:57 +00:00
memnos cfbac482e5 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-10-07 05:48:53 +00:00
foXaCe b43b35a295 Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-07 05:48:50 +00:00
reloxx e75d52de0e Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-10-07 05:48:49 +00:00
nitsua f850e75d4e Fix issue with push missing the URL base 2020-10-06 11:05:43 -04:00
nitsua 6c9e4994d8 Fix broken translations on index 2020-10-06 09:35:08 -04:00
Qstick 708a2e31d5 Improve load speeds by being more efficient with config language 2020-10-06 07:48:58 -04:00
Qstick 37c1b5b28c New: Add Bulgarian Language
Fixes #4111
2020-10-06 00:33:33 -04:00
Qstick e28bea14b3 New: Add Thai Language 2020-10-06 00:33:33 -04:00
Qstick 2823099237 New: Add Hindi and Romanian Languages
Fixes #3597
2020-10-06 00:33:33 -04:00
Qstick 53eeee8b91 New: Allow Selection Original Movie Languge in Profile 2020-10-06 00:33:33 -04:00
nitsua e880eb0e00 More translations 2020-10-06 00:29:45 -04:00
Qstick 561f84adff Added translation using Weblate (Thai) [skip ci] 2020-10-06 04:09:34 +00:00
Qstick 4fc6a14d1b Added translation using Weblate (Bulgarian) [skip ci] 2020-10-06 04:09:24 +00:00
foXaCe b8d5a0b6a2 Translated using Weblate (French) [skip ci]
Currently translated at 99.5% (822 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-05 08:48:49 +00:00
Mark McDowall 73b0a461d3 Fix tooltip max width on larger screens
(cherry picked from commit f4f2a6f5fc14244f9acf8186cbacda7f9c1e0481)
2020-10-05 00:14:28 -04:00
Qstick d86402efb1 Fixed: formatTimeSpan shows incorrect when over 1 month 2020-10-04 23:38:10 -04:00
Qstick 1c892d7357 Fixed: Sorting of Queue time left 2020-10-04 23:37:39 -04:00
Qstick f7e21ec2a4 Fixed: Tooltip jumping around
Fixes: #5136
Fixes: #4966
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 23:34:27 -04:00
Qstick 1d0771c9a4 New: Add size to movie files in Webhook payload
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 22:31:49 -04:00
Qstick cc384d9297 Remove unused popper 2 package 2020-10-04 22:29:21 -04:00
Qstick 7898100d95 Revert "Pull Sonarr commit 'Import lists in settings overview' (#5138)"
This reverts commit 4b279e87cf.
2020-10-04 22:28:46 -04:00
servarr[bot] 4b279e87cf Pull Sonarr commit 'Import lists in settings overview' (#5138)
* Import lists in settings overview

(cherry picked from commit f45b27f507953724e9469ce16c4e555985312150)

* fixup! Sonarr wording

Co-authored-by: Mark McDowall <mark@mcdowall.ca>
Co-authored-by: Qstick <qstick@gmail.com>
2020-10-04 22:26:14 -04:00
Qstick 3d5570dfd9 Update frontend packages
Fixes: #5115
Fixes: #5116
Fixes: #5117
Fixes: #5118
Fixes: #5119
Fixes: #5120
Fixes: #5121
Fixes: #5122
Fixes: #5123
Fixes: #5124
Fixes: #5125
Fixes: #5126
Fixes: #5127
Fixes: #5128
Fixes: #5129
Fixes: #5130
Fixes: #5131
Fixes: #5132
Fixes: #5133
Fixes: #5134
Fixes: #5139
Fixes: #5140
2020-10-04 21:49:16 -04:00
Qstick 269462e0a2 Update stalebot exempt labels [skip ci] 2020-10-04 02:45:56 -04:00
bakerboy448 5799b3dc47 Fixed: Parser Detecting DTS-Audio formats and Blu-Ray as groups (#5090)
* Fix DTS-XXX Audio & Blu-ray false Group Positives

* Add test cases

* fixup! spaces

Co-authored-by: Qstick <qstick@gmail.com>
2020-10-04 01:59:31 -04:00
Qstick dfbbb7d9bd Fixup Filelist test to use new url 2020-10-04 01:57:37 -04:00
Qstick 6faa484d4e Change Discord invite to point to Welcome page 2020-10-04 01:20:18 -04:00
Qstick 86363d5bf1 Fixed: Change Filelist default URL 2020-10-04 01:20:18 -04:00
Qstick 30c51ec4f3 Fixed: Handle obfuscated files using abc.xyz pattern
Fixes #5105

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 01:20:17 -04:00
Qstick a66b2cf416 New: Add more information to Webhook payload
Fixes #5104

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 01:20:17 -04:00
Qstick 37197150be Some cleanup of things marked for removal in v3
Fixes #5102

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 01:20:17 -04:00
Qstick c8bbd21615 Cleanup TaskManager.cs 2020-10-04 01:20:17 -04:00
Florian fdf2d1c9b3 Translated using Weblate (French) [skip ci]
Currently translated at 99.5% (822 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-04 04:48:54 +00:00
foXaCe eb4cd9633a Translated using Weblate (French) [skip ci]
Currently translated at 99.5% (822 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-04 04:48:54 +00:00
reloxx 3fa17bf7f6 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-10-04 04:48:48 +00:00
Qstick 22e9dff76b Don't check for updates every 30 minutes on nightly 2020-10-03 23:49:06 -04:00
Qstick 7d31eb1f55 Fixed: Test for empty strings using isNullOrEmpty 2020-10-03 21:58:31 -04:00
Qstick 4ec71538b9 Fixed: Avoid zero-length array memory allocations 2020-10-03 21:58:31 -04:00
Qstick 295b975046 Fixed: Do not use Count/LongCount when Any can be used 2020-10-03 21:58:31 -04:00
Qstick 0198c7a3b1 Fixed: Use Length/Count property instead of Enumerable.Count method 2020-10-03 21:58:31 -04:00
Qstick 088ffc34df Fixed: Use Append(Char) for single character Stringbuilder additions 2020-10-03 21:58:31 -04:00
bakerboy448 1740ad337c Clarify Branches/ Release Channels [skip ci] (#5100) 2020-10-03 09:26:37 -04:00
nitsua a6758e4bf4 Ongoing updates to api docs (#5082) [skip ci] 2020-10-03 09:25:35 -04:00
memnos 2161f08140 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-10-03 06:48:53 +00:00
foXaCe 1a92372506 Translated using Weblate (French) [skip ci]
Currently translated at 70.8% (585 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-03 06:48:52 +00:00
bakerboy448 5bd23be133 Update v3 binaries links [skip ci] (#5099)
* Update README.md

* Update Nightly Binary Links

* Fix table formatting
2020-10-01 23:39:15 -04:00
nitsua eca816db86 Fix movie title stretching the add window
Fixes: #5096
2020-10-01 18:12:19 -04:00
bakerboy448 c4f19a813d Minor Branch Updates/Clarifcation [Skip Ci] 2020-10-01 11:20:13 -04:00
bakerboy448 24cee7e4fe Correct Contributing (don't have forums or IRC) [skip ci] 2020-10-01 11:15:11 -04:00
Qstick 22531294be Remove duplicate translation key 2020-09-30 21:44:08 -04:00
Qstick 464d92bb70 Calendar status fixes
Fixes #4747

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-30 21:43:52 -04:00
Qstick 8ee16b81ec Fixed: Indexer being disabled due to download client rejecting it
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-30 21:25:12 -04:00
Qstick a7a1d48e0d Fixed: Log path when import fails for movie import
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-30 21:24:18 -04:00
Qstick a070279993 New: Allow naming with original Movie title (in original language) 2020-09-30 16:10:56 -04:00
Qstick 95918c4053 Fixed: Speed up Unmapped Folder fetch for large number of root folders 2020-09-30 07:41:56 -04:00
Will Segatto 646b86f8c9 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-29 05:59:11 +00:00
jpalenz77 28835a1857 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-29 05:59:10 +00:00
nitsua 6b22481a00 Fix the sorting on the agenda to respect using all dates instead of only cinema date to sort 2020-09-28 23:55:50 -04:00
Qstick aef8a8fd04 Fixed: Fetch blacklist by Movie instead of all
Fixes #5066
2020-09-28 23:39:15 -04:00
Qstick a1e69c3c2b Lodash replacements: take 2 2020-09-28 22:02:02 -04:00
hotio 995d257d3d Fix docker tag (#5081) [skip ci] 2020-09-28 21:51:26 -04:00
nitsua cf804f7dac Fix issue with arrow keys switching movie when using them inside a textbox (or any element really) 2020-09-28 17:28:09 +01:00
ta264 081fe64bff Revert "Convert some instances (filter, find, pick) to native from lodash"
This reverts commit d8a0aac9c3.
2020-09-28 06:26:23 +01:00
ta264 9075fdc1c1 Revert "Fix find error on movie details"
This reverts commit 6bdd24e62d.
2020-09-28 06:26:13 +01:00
foXaCe 5db1faad0b Translated using Weblate (French) [skip ci]
Currently translated at 62.5% (517 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-28 06:00:42 +00:00
reloxx 57f3805763 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-28 06:00:38 +00:00
nitsua 6bdd24e62d Fix find error on movie details 2020-09-28 06:51:03 +01:00
Qstick d5ec2914e2 New: Support existing 'keyart' in Kodi Metadata
Fixes #5059
2020-09-27 22:44:12 -04:00
Qstick d8a0aac9c3 Convert some instances (filter, find, pick) to native from lodash 2020-09-27 22:33:21 -04:00
nitsua 987ed357d5 Add a link to the github issue if it is added to the change notes 2020-09-27 22:14:08 -04:00
Qstick 9044976393 Update StaleBot config exempt labels [skip ci] 2020-09-27 09:30:48 -04:00
nitsua b53def3da5 Fixed: Issue with arrow navigation from details working outside of the details page (#5071) 2020-09-26 23:36:36 -04:00
Qstick 2ecb988c6a Remove aphrodite links from Readme [skip ci] 2020-09-26 22:19:17 -04:00
Qstick 41cf722ab5 Change over aphrodite references 2020-09-26 22:03:14 -04:00
640 changed files with 33951 additions and 6144 deletions
-8
View File
@@ -185,17 +185,9 @@ dotnet_diagnostic.CA1814.severity = suggestion
dotnet_diagnostic.CA1815.severity = suggestion
dotnet_diagnostic.CA1816.severity = suggestion
dotnet_diagnostic.CA1819.severity = suggestion
dotnet_diagnostic.CA1820.severity = suggestion
dotnet_diagnostic.CA1821.severity = suggestion
dotnet_diagnostic.CA1822.severity = suggestion
dotnet_diagnostic.CA1823.severity = suggestion
dotnet_diagnostic.CA1824.severity = suggestion
dotnet_diagnostic.CA1825.severity = suggestion
dotnet_diagnostic.CA1826.severity = suggestion
dotnet_diagnostic.CA1827.severity = suggestion
dotnet_diagnostic.CA1828.severity = suggestion
dotnet_diagnostic.CA1829.severity = suggestion
dotnet_diagnostic.CA1834.severity = suggestion
dotnet_diagnostic.CA2000.severity = suggestion
dotnet_diagnostic.CA2002.severity = suggestion
dotnet_diagnostic.CA2007.severity = suggestion
+2 -1
View File
@@ -1,6 +1,7 @@
{
"paths": [
"frontend/src/**/*.js"
"frontend/src/**/*.js",
"src/NzbDrone.Core/Localization/Core/*.json"
],
"ignored": [
"**/node_modules/**/*"
-305
View File
@@ -1,305 +0,0 @@
# -*- coding: utf-8; mode: python -*-
##
## Format
##
## ACTION: [AUDIENCE:] COMMIT_MSG [!TAG ...]
##
## Description
##
## ACTION is one of 'chg', 'fix', 'new'
##
## Is WHAT the change is about.
##
## 'chg' is for refactor, small improvement, cosmetic changes...
## 'fix' is for bug fixes
## 'new' is for new features, big improvement
##
## AUDIENCE is optional and one of 'dev', 'usr', 'pkg', 'test', 'doc'
##
## Is WHO is concerned by the change.
##
## 'dev' is for developpers (API changes, refactors...)
## 'usr' is for final users (UI changes)
## 'pkg' is for packagers (packaging changes)
## 'test' is for testers (test only related changes)
## 'doc' is for doc guys (doc only changes)
##
## COMMIT_MSG is ... well ... the commit message itself.
##
## TAGs are additionnal adjective as 'refactor' 'minor' 'cosmetic'
##
## They are preceded with a '!' or a '@' (prefer the former, as the
## latter is wrongly interpreted in github.) Commonly used tags are:
##
## 'refactor' is obviously for refactoring code only
## 'minor' is for a very meaningless change (a typo, adding a comment)
## 'cosmetic' is for cosmetic driven change (re-indentation, 80-col...)
## 'wip' is for partial functionality but complete subfunctionality.
##
## Example:
##
## new: usr: support of bazaar implemented
## chg: re-indentend some lines !cosmetic
## new: dev: updated code to be compatible with last version of killer lib.
## fix: pkg: updated year of licence coverage.
## new: test: added a bunch of test around user usability of feature X.
## fix: typo in spelling my name in comment. !minor
##
## Please note that multi-line commit message are supported, and only the
## first line will be considered as the "summary" of the commit message. So
## tags, and other rules only applies to the summary. The body of the commit
## message will be displayed in the changelog without reformatting.
##
## ``ignore_regexps`` is a line of regexps
##
## Any commit having its full commit message matching any regexp listed here
## will be ignored and won't be reported in the changelog.
##
ignore_regexps = [
r'@minor', r'!minor',
r'@cosmetic', r'!cosmetic',
r'@refactor', r'!refactor',
r'@wip', r'!wip',
r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[p|P]kg:',
r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[d|D]ev:',
r'^(.{3,3}\s*:)?\s*[fF]irst commit.?\s*$',
r'^$', ## ignore commits with empty messages
]
## ``section_regexps`` is a list of 2-tuples associating a string label and a
## list of regexp
##
## Commit messages will be classified in sections thanks to this. Section
## titles are the label, and a commit is classified under this section if any
## of the regexps associated is matching.
##
## Please note that ``section_regexps`` will only classify commits and won't
## make any changes to the contents. So you'll probably want to go check
## ``subject_process`` (or ``body_process``) to do some changes to the subject,
## whenever you are tweaking this variable.
##
section_regexps = [
('**New features**', [
r'^[aA]dded?\s*:?\s*((dev|use?r|pkg|test|doc)\s*:\s*)?(.*)$',
r'^[uU]pdated?\s*:?\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
r'^[cC]hanged?\s*:?\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
r'^[nN]ew?\s*:?\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('**Fixes**', [
r'^(?![mM]erge\s*)'
]
),
]
## ``body_process`` is a callable
##
## This callable will be given the original body and result will
## be used in the changelog.
##
## Available constructs are:
##
## - any python callable that take one txt argument and return txt argument.
##
## - ReSub(pattern, replacement): will apply regexp substitution.
##
## - Indent(chars=" "): will indent the text with the prefix
## Please remember that template engines gets also to modify the text and
## will usually indent themselves the text if needed.
##
## - Wrap(regexp=r"\n\n"): re-wrap text in separate paragraph to fill 80-Columns
##
## - noop: do nothing
##
## - ucfirst: ensure the first letter is uppercase.
## (usually used in the ``subject_process`` pipeline)
##
## - final_dot: ensure text finishes with a dot
## (usually used in the ``subject_process`` pipeline)
##
## - strip: remove any spaces before or after the content of the string
##
## - SetIfEmpty(msg="No commit message."): will set the text to
## whatever given ``msg`` if the current text is empty.
##
## Additionally, you can `pipe` the provided filters, for instance:
#body_process = Wrap(regexp=r'\n(?=\w+\s*:)') | Indent(chars=" ")
#body_process = Wrap(regexp=r'\n(?=\w+\s*:)')
#body_process = noop
body_process = ReSub(r'((^|\n)[A-Z]\w+(-\w+)*: .*(\n\s+.*)*)+$', r'') | strip
## ``subject_process`` is a callable
##
## This callable will be given the original subject and result will
## be used in the changelog.
## subject_process = (strip |
## ReSub(r'^([aA]dd(ed?)?|[nN]ew)(\s?:?\s)(.*)$', r'![New](https://img.shields.io/badge/-- -New-brightgreen.svg?style=flat-square) \4') |
## ReSub(r'^([cC]hang(ed?)?)(\s?:?\s)(.*)$', r'![Changed](https://img.shields.io/badge/-- -Changed-orange.svg?style=flat-square) \4') |
## ReSub(r'^([fF]ix(ed?)?)(\s?:?\s)(.*)$', r'![Fixed](https://img.shields.io/badge/-- -Fixed-red.svg?style=flat-square) \4') |
## ReSub(r'^([uU]pdat(ed?)?)(\s?:?\s)(.*)$', r'![Updated](https://img.shields.io/badge/-- -Updated-blue.svg?style=flat-square) \4') |
## ReSub(r'#(\d{3,4})', r'[#\1](https://github.com/Radarr/Radarr/issues/\1)') |
## SetIfEmpty("No commit message.") | ucfirst | final_dot)
## Available constructs are those listed in ``body_process`` doc.
subject_process = (strip |
ReSub(r'^([aA]dd(ed?)?|[nN]ew)(\s?:?\s)(.*)$', r'![New](https://img.shields.io/badge/--%20-New-brightgreen.svg?style=flat-square) \4') |
ReSub(r'^([cC]hang(ed?)?)(\s?:?\s)(.*)$', r'![Changed](https://img.shields.io/badge/--%20-Changed-orange.svg?style=flat-square) \4') |
ReSub(r'^([fF]ix(ed?)?)(\s?:?\s)(.*)$', r'![Fixed](https://img.shields.io/badge/--%20-Fixed-red.svg?style=flat-square) \4') |
ReSub(r'^([uU]pdat(ed?)?)(\s?:?\s)(.*)$', r'![Updated](https://img.shields.io/badge/--%20-Updated-blue.svg?style=flat-square) \4') |
ReSub(r'#(\d{3,4})', r'[#\1](https://github.com/Radarr/Radarr/issues/\1)') |
SetIfEmpty("No commit message.") | ucfirst | final_dot)
## ``tag_filter_regexp`` is a regexp
##
## Tags that will be used for the changelog must match this regexp.
##
tag_filter_regexp = r'^v[0]+\.[2-9]+\.[0-9]+\.[0-9]{3,4}$'
## ``unreleased_version_label`` is a string or a callable that outputs a string
##
## This label will be used as the changelog Title of the last set of changes
## between last valid tag and HEAD if any.
unreleased_version_label = "(unreleased)"
## ``output_engine`` is a callable
##
## This will change the output format of the generated changelog file
##
## Available choices are:
##
## - rest_py
##
## Legacy pure python engine, outputs ReSTructured text.
## This is the default.
##
## - mustache(<template_name>)
##
## Template name could be any of the available templates in
## ``templates/mustache/*.tpl``.
## Requires python package ``pystache``.
## Examples:
## - mustache("markdown")
## - mustache("restructuredtext")
##
## - makotemplate(<template_name>)
##
## Template name could be any of the available templates in
## ``templates/mako/*.tpl``.
## Requires python package ``mako``.
## Examples:
## - makotemplate("restructuredtext")
##
#output_engine = rest_py
#output_engine = mustache("restructuredtext")
output_engine = mustache("changelog.tpl")
#output_engine = makotemplate("restructuredtext")
## ``include_merge`` is a boolean
##
## This option tells git-log whether to include merge commits in the log.
## The default is to include them.
include_merge = False
## ``log_encoding`` is a string identifier
##
## This option tells gitchangelog what encoding is outputed by ``git log``.
## The default is to be clever about it: it checks ``git config`` for
## ``i18n.logOutputEncoding``, and if not found will default to git's own
## default: ``utf-8``.
#log_encoding = 'utf-8'
## ``publish`` is a callable
##
## Sets what ``gitchangelog`` should do with the output generated by
## the output engine. ``publish`` is a callable taking one argument
## that is an interator on lines from the output engine.
##
## Some helper callable are provided:
##
## Available choices are:
##
## - stdout
##
## Outputs directly to standard output
## (This is the default)
##
## - FileInsertAtFirstRegexMatch(file, pattern, idx=lamda m: m.start())
##
## Creates a callable that will parse given file for the given
## regex pattern and will insert the output in the file.
## ``idx`` is a callable that receive the matching object and
## must return a integer index point where to insert the
## the output in the file. Default is to return the position of
## the start of the matched string.
##
## - FileRegexSubst(file, pattern, replace, flags)
##
## Apply a replace inplace in the given file. Your regex pattern must
## take care of everything and might be more complex. Check the README
## for a complete copy-pastable example.
##
# publish = FileInsertIntoFirstRegexMatch(
# "CHANGELOG.rst",
# r'/(?P<rev>[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n/',
# idx=lambda m: m.start(1)
# )
#publish = stdout
def write_to_file(content):
with open("CHANGELOG.md", "w+") as f:
for chunk in content:
f.write(chunk)
publish = write_to_file
## ``revs`` is a list of callable or a list of string
##
## callable will be called to resolve as strings and allow dynamical
## computation of these. The result will be used as revisions for
## gitchangelog (as if directly stated on the command line). This allows
## to filter exaclty which commits will be read by gitchangelog.
##
## To get a full documentation on the format of these strings, please
## refer to the ``git rev-list`` arguments. There are many examples.
##
## Using callables is especially useful, for instance, if you
## are using gitchangelog to generate incrementally your changelog.
##
## Some helpers are provided, you can use them::
##
## - FileFirstRegexMatch(file, pattern): will return a callable that will
## return the first string match for the given pattern in the given file.
## If you use named sub-patterns in your regex pattern, it'll output only
## the string matching the regex pattern named "rev".
##
## - Caret(rev): will return the rev prefixed by a "^", which is a
## way to remove the given revision and all its ancestor.
##
## Please note that if you provide a rev-list on the command line, it'll
## replace this value (which will then be ignored).
##
## If empty, then ``gitchangelog`` will act as it had to generate a full
## changelog.
##
## The default is to use all commits to make the changelog.
#revs = ["^1.0.3", ]
#revs = [
# Caret(
# FileFirstRegexMatch(
# "CHANGELOG.rst",
# r"(?P<rev>[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n")),
# "HEAD"
#]
revs = ["v0.2.0.134..."]
-311
View File
@@ -1,311 +0,0 @@
# -*- coding: utf-8; mode: python -*-
##
## Format
##
## ACTION: [AUDIENCE:] COMMIT_MSG [!TAG ...]
##
## Description
##
## ACTION is one of 'chg', 'fix', 'new'
##
## Is WHAT the change is about.
##
## 'chg' is for refactor, small improvement, cosmetic changes...
## 'fix' is for bug fixes
## 'new' is for new features, big improvement
##
## AUDIENCE is optional and one of 'dev', 'usr', 'pkg', 'test', 'doc'
##
## Is WHO is concerned by the change.
##
## 'dev' is for developpers (API changes, refactors...)
## 'usr' is for final users (UI changes)
## 'pkg' is for packagers (packaging changes)
## 'test' is for testers (test only related changes)
## 'doc' is for doc guys (doc only changes)
##
## COMMIT_MSG is ... well ... the commit message itself.
##
## TAGs are additionnal adjective as 'refactor' 'minor' 'cosmetic'
##
## They are preceded with a '!' or a '@' (prefer the former, as the
## latter is wrongly interpreted in github.) Commonly used tags are:
##
## 'refactor' is obviously for refactoring code only
## 'minor' is for a very meaningless change (a typo, adding a comment)
## 'cosmetic' is for cosmetic driven change (re-indentation, 80-col...)
## 'wip' is for partial functionality but complete subfunctionality.
##
## Example:
##
## new: usr: support of bazaar implemented
## chg: re-indentend some lines !cosmetic
## new: dev: updated code to be compatible with last version of killer lib.
## fix: pkg: updated year of licence coverage.
## new: test: added a bunch of test around user usability of feature X.
## fix: typo in spelling my name in comment. !minor
##
## Please note that multi-line commit message are supported, and only the
## first line will be considered as the "summary" of the commit message. So
## tags, and other rules only applies to the summary. The body of the commit
## message will be displayed in the changelog without reformatting.
##
## ``ignore_regexps`` is a line of regexps
##
## Any commit having its full commit message matching any regexp listed here
## will be ignored and won't be reported in the changelog.
##
ignore_regexps = [
r'@minor', r'!minor',
r'@cosmetic', r'!cosmetic',
r'@refactor', r'!refactor',
r'@wip', r'!wip',
r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[p|P]kg:',
r'^([cC]hg|[fF]ix|[nN]ew)\s*:\s*[d|D]ev:',
r'^(.{3,3}\s*:)?\s*[fF]irst commit.?\s*$',
r'^$', ## ignore commits with empty messages
]
## ``section_regexps`` is a list of 2-tuples associating a string label and a
## list of regexp
##
## Commit messages will be classified in sections thanks to this. Section
## titles are the label, and a commit is classified under this section if any
## of the regexps associated is matching.
##
## Please note that ``section_regexps`` will only classify commits and won't
## make any changes to the contents. So you'll probably want to go check
## ``subject_process`` (or ``body_process``) to do some changes to the subject,
## whenever you are tweaking this variable.
##
section_regexps = [
('**New features:**', [
r'^[aA]dded?\s*:?\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
r'^[uU]pdated?\s*:?\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
r'^[cC]hanged?\s*:?\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
r'^[nN]ew?\s*:?\s*((dev|use?r|pkg|test|doc)\s*:\s*)?([^\n]*)$',
]),
('**Fixes:**', [
r'^(?![mM]erge\s*)'
]
),
]
## ``body_process`` is a callable
##
## This callable will be given the original body and result will
## be used in the changelog.
##
## Available constructs are:
##
## - any python callable that take one txt argument and return txt argument.
##
## - ReSub(pattern, replacement): will apply regexp substitution.
##
## - Indent(chars=" "): will indent the text with the prefix
## Please remember that template engines gets also to modify the text and
## will usually indent themselves the text if needed.
##
## - Wrap(regexp=r"\n\n"): re-wrap text in separate paragraph to fill 80-Columns
##
## - noop: do nothing
##
## - ucfirst: ensure the first letter is uppercase.
## (usually used in the ``subject_process`` pipeline)
##
## - final_dot: ensure text finishes with a dot
## (usually used in the ``subject_process`` pipeline)
##
## - strip: remove any spaces before or after the content of the string
##
## - SetIfEmpty(msg="No commit message."): will set the text to
## whatever given ``msg`` if the current text is empty.
##
## Additionally, you can `pipe` the provided filters, for instance:
#body_process = Wrap(regexp=r'\n(?=\w+\s*:)') | Indent(chars=" ")
#body_process = Wrap(regexp=r'\n(?=\w+\s*:)')
#body_process = noop
body_process = ReSub(r'((^|\n)[A-Z]\w+(-\w+)*: .*(\n\s+.*)*)+$', r'') | strip
## ``subject_process`` is a callable
##
## This callable will be given the original subject and result will
## be used in the changelog.
## subject_process = (strip |
## ReSub(r'^([aA]dd(ed?)?|[nN]ew)(\s?:?\s)(.*)$', r'![New](https://img.shields.io/badge/-- -New-brightgreen.svg?style=flat-square) \4') |
## ReSub(r'^([cC]hang(ed?)?)(\s?:?\s)(.*)$', r'![Changed](https://img.shields.io/badge/-- -Changed-orange.svg?style=flat-square) \4') |
## ReSub(r'^([fF]ix(ed?)?)(\s?:?\s)(.*)$', r'![Fixed](https://img.shields.io/badge/-- -Fixed-red.svg?style=flat-square) \4') |
## ReSub(r'^([uU]pdat(ed?)?)(\s?:?\s)(.*)$', r'![Updated](https://img.shields.io/badge/-- -Updated-blue.svg?style=flat-square) \4') |
## ReSub(r'#(\d{3,4})', r'[#\1](https://github.com/Radarr/Radarr/issues/\1)') |
## SetIfEmpty("No commit message.") | ucfirst | final_dot)
## Available constructs are those listed in ``body_process`` doc.
subject_process = (strip |
ReSub(r'^([aA]dd(ed?)?|[nN]ew)(\s?:?\s)(.*)$', r'\4') |
ReSub(r'^([cC]hang(ed?)?)(\s?:?\s)(.*)$', r'\4') |
ReSub(r'^([fF]ix(ed?)?)(\s?:?\s)(.*)$', r'\4') |
ReSub(r'^([uU]pdat(ed?)?)(\s?:?\s)(.*)$', r'\4') |
ReSub(r'#(\d{3,4})', r'Issue #\1') |
SetIfEmpty("No commit message.") | ucfirst | final_dot)
## ``tag_filter_regexp`` is a regexp
##
## Tags that will be used for the changelog must match this regexp.
##
tag_filter_regexp = r'^v[0]+\.[2-9]+\.[0-9]+\.[0-9]+$'
## ``unreleased_version_label`` is a string or a callable that outputs a string
##
## This label will be used as the changelog Title of the last set of changes
## between last valid tag and HEAD if any.
unreleased_version_label = "(unreleased)"
## ``output_engine`` is a callable
##
## This will change the output format of the generated changelog file
##
## Available choices are:
##
## - rest_py
##
## Legacy pure python engine, outputs ReSTructured text.
## This is the default.
##
## - mustache(<template_name>)
##
## Template name could be any of the available templates in
## ``templates/mustache/*.tpl``.
## Requires python package ``pystache``.
## Examples:
## - mustache("markdown")
## - mustache("restructuredtext")
##
## - makotemplate(<template_name>)
##
## Template name could be any of the available templates in
## ``templates/mako/*.tpl``.
## Requires python package ``mako``.
## Examples:
## - makotemplate("restructuredtext")
##
#output_engine = rest_py
#output_engine = mustache("restructuredtext")
output_engine = mustache("changelog_release.tpl")
#output_engine = makotemplate("restructuredtext")
## ``include_merge`` is a boolean
##
## This option tells git-log whether to include merge commits in the log.
## The default is to include them.
include_merge = False
## ``log_encoding`` is a string identifier
##
## This option tells gitchangelog what encoding is outputed by ``git log``.
## The default is to be clever about it: it checks ``git config`` for
## ``i18n.logOutputEncoding``, and if not found will default to git's own
## default: ``utf-8``.
#log_encoding = 'utf-8'
## ``publish`` is a callable
##
## Sets what ``gitchangelog`` should do with the output generated by
## the output engine. ``publish`` is a callable taking one argument
## that is an interator on lines from the output engine.
##
## Some helper callable are provided:
##
## Available choices are:
##
## - stdout
##
## Outputs directly to standard output
## (This is the default)
##
## - FileInsertAtFirstRegexMatch(file, pattern, idx=lamda m: m.start())
##
## Creates a callable that will parse given file for the given
## regex pattern and will insert the output in the file.
## ``idx`` is a callable that receive the matching object and
## must return a integer index point where to insert the
## the output in the file. Default is to return the position of
## the start of the matched string.
##
## - FileRegexSubst(file, pattern, replace, flags)
##
## Apply a replace inplace in the given file. Your regex pattern must
## take care of everything and might be more complex. Check the README
## for a complete copy-pastable example.
##
# publish = FileInsertIntoFirstRegexMatch(
# "CHANGELOG.rst",
# r'/(?P<rev>[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n/',
# idx=lambda m: m.start(1)
# )
publish = stdout
#def write_to_file(content):
# with open("CHANGELOG.md", "w+") as f:
# for chunk in content:
# f.write(chunk)
#publish = write_to_file
## ``revs`` is a list of callable or a list of string
##
## callable will be called to resolve as strings and allow dynamical
## computation of these. The result will be used as revisions for
## gitchangelog (as if directly stated on the command line). This allows
## to filter exaclty which commits will be read by gitchangelog.
##
## To get a full documentation on the format of these strings, please
## refer to the ``git rev-list`` arguments. There are many examples.
##
## Using callables is especially useful, for instance, if you
## are using gitchangelog to generate incrementally your changelog.
##
## Some helpers are provided, you can use them::
##
## - FileFirstRegexMatch(file, pattern): will return a callable that will
## return the first string match for the given pattern in the given file.
## If you use named sub-patterns in your regex pattern, it'll output only
## the string matching the regex pattern named "rev".
##
## - Caret(rev): will return the rev prefixed by a "^", which is a
## way to remove the given revision and all its ancestor.
##
## Please note that if you provide a rev-list on the command line, it'll
## replace this value (which will then be ignored).
##
## If empty, then ``gitchangelog`` will act as it had to generate a full
## changelog.
##
## The default is to use all commits to make the changelog.
#revs = ["^1.0.3", ]
#revs = [
# Caret(
# FileFirstRegexMatch(
# "CHANGELOG.rst",
# r"(?P<rev>[0-9]+\.[0-9]+(\.[0-9]+)?)\s+\([0-9]+-[0-9]{2}-[0-9]{2}\)\n--+\n")),
# "HEAD"
#]
# Gets the latest annoted tag and uses that as a base for new changes.
import subprocess
proc = subprocess.Popen(["git", "describe", "--abbrev=0", "--tags"], stdout=subprocess.PIPE)
out = str(proc.communicate()[0].strip(), "utf-8")
revs = [out+"..."]
-22
View File
@@ -1,22 +0,0 @@
**Description:**
<!-- Check first that your problem is not listed in our wiki section:
* https://github.com/Radarr/Radarr/wiki/Common-Problems
* https://github.com/Radarr/Radarr/wiki/FAQ
**Just because you receive an exception in your logs, doesn't mean it's a bug and should be reported here. Often it's something else, such as a permission error. If you are unsure ask on the Discord or Subreddit first.**
Visit our [Discord server](https://discord.gg/NWYch8M) or [Subreddit](https://reddit.com/r/radarr) for support or longer discussions. Support questions posed on here will be closed immediately.
Provide a description of the feature request or bug here, the more details the better.
Please also include the following if you are reporting a bug. If you do not include it, the issue will probably be closed as we cannot help you. -->
**Radarr Version:**
**Mono Version:**
**Debug Logs:**
# Do not remove anything from your logs and post the full logs! If not everything fits in here use a service like https://pastebin.com to upload them.
<!-- Please use the search bar (make sure to include closed issues as well) and make sure you are not submitting an already submitted issue. -->
+9 -8
View File
@@ -1,7 +1,6 @@
---
name: Bug report
about: Support requests will be closed immediately, if you are unsure go to our Discord
or Subreddit first. Exceptions do not mean you found a bug!
name: Bug Report
about: Support Requests will be closed immediately, if you are unsure go to our Reddit or Discord first. Exceptions do not mean you found a bug!
title: ''
labels: bug
assignees: ''
@@ -25,10 +24,12 @@ A clear and concise description of what you expected to happen.
If applicable, add screenshots to help explain your problem.
**Platform Information (please complete the following information):**
- OS: [e.g. Windows]
- Mono Version: [e.g. Mono 5.8] (Only needed under Linux and Mac, found under System -> Status)
- Browser and Version [e.g. chrome, safari] (Only needed for UI issues)
- OS: [e.g. Windows 10 2004 / Ubuntu 20.10]
- Docker: [Yes/No]
- Mono or.NET Core Version: [e.g. Mono 5.8 or .Net Core 3.1.10] (found under System -> Status)
- Browser and Version [e.g. chrome 86.0.4240.198] (Only needed for UI issues)
- Radarr Version [e.g. 3.0.0.2956]
- Radarr Branch [e.g. master]
**Debug Logs**
Turn on debug logs under Settings -> General and wait for the bug to occur again. **Upload the full log file here (or another site and link it). Issues will be closed, if they do not include this!**
**Trace Logs**
Turn on Trace logs under Settings -> General and wait for the bug to occur again. **Upload the full log file here (or another site (e.g. pastebin) and link it). Issues will be closed, if they do not include this!**
+1 -1
View File
@@ -1,7 +1,7 @@
blank_issues_enabled: false
contact_links:
- name: Support via Discord
url: https://discord.gg/AD3UP37
url: https://discord.gg/r5wJPt9
about: Chat with users and devs on support and setup related topics.
- name: Support via Reddit
url: https://reddit.com/r/radarr
+3 -1
View File
@@ -3,11 +3,13 @@ YES | NO
#### Description
#### Screenshot (if UI related)
#### Todos
- [ ] Tests
- [ ] Translation Keys
- [ ] Wiki Updates
#### Issues Fixed or Closed by this PR
* #
* Fixes #XXXX
+4 -1
View File
@@ -7,7 +7,10 @@ exemptLabels:
- feature request
- parser
- confirmed
- aphrodite
- sonarr-pull
- lidarr-pull
- readarr-pull
- v3
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
+1 -1
View File
@@ -6,7 +6,7 @@ supportLabel: support
# to a support page, or set to `false` to disable
supportComment: >
We use the issue tracker exclusively for bug reports and feature requests.
However, this issue appears to be a support request. Please hop over onto our [Discord](https://discord.gg/ZDmT7qb) or [Subreddit](https://reddit.com/r/radarr)
However, this issue appears to be a support request. Please hop over onto our [Discord](https://discord.gg/r5wJPt9) or [Subreddit](https://reddit.com/r/radarr)
# Whether to close issues marked as support requests
close: true
# Whether to lock issues marked as support requests
+21
View File
@@ -0,0 +1,21 @@
name: 'Lock threads'
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '90'
issue-exclude-created-before: ''
issue-exclude-labels: ''
issue-lock-labels: ''
issue-lock-comment: ''
issue-lock-reason: 'resolved'
process-only: ''
-1096
View File
File diff suppressed because it is too large Load Diff
+20 -4
View File
@@ -3,22 +3,38 @@
We're always looking for people to help make Radarr even better, there are a number of ways to contribute.
## Documentation ##
Setup guides, FAQ, the more information we have on the wiki the better.
Setup guides, FAQ, the more information we have on the [wiki](https://wiki.servarr.com/Radarr) the better.
## Development ##
See the readme for information on setting up your development environment.
### Tools required ###
- Visual Studio 2019 or higher (https://www.visualstudio.com/vs/). The community version is free and works (https://www.visualstudio.com/downloads/).
- HTML/Javascript editor of choice (VS Code/Sublime Text/Webstorm/Atom/etc)
- [Git](https://git-scm.com/downloads)
- [NodeJS](https://nodejs.org/en/download/) (Node 10.X.X or higher)
- [Yarn](https://yarnpkg.com/)
- .NET Core 3.1.
### Getting started ###
1. Fork Radarr
2. Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories)
3. Install the required Node Packages `yarn install`
4. Start gulp to monitor your dev environment for any changes that need post processing using `yarn start` command.
5. Build the project in Visual Studio, Setting startup project to `Radarr.Console` and framework to `netcoreapp31`
6. Debug the project in Visual Studio
7. Open http://localhost:7878
### Contributing Code ###
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Radarr/Radarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first)
- Rebase from Radarr's develop branch, don't merge
- Make meaningful commits, or squash them
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
- Reach out to us on the forums or on IRC if you have any questions
- Reach out to us on the discord if you have any questions
- Add tests (unit/integration)
- Commit with *nix line endings for consistency (We checkout Windows and commit *nix)
- One feature/bug fix per pull request to keep things clean and easy to understand
- Use 4 spaces instead of tabs, this is the default for VS 2012 and WebStorm (to my knowledge)
- Use 4 spaces instead of tabs, this is the default for VS 2019 and WebStorm (to my knowledge)
### Pull Requesting ###
- Only make pull requests to develop, never master, if you make a PR to master we'll comment on it and close it
+31 -100
View File
@@ -2,62 +2,14 @@
[![Build Status](https://dev.azure.com/Radarr/Radarr/_apis/build/status/Radarr.Radarr?branchName=develop)](https://dev.azure.com/Radarr/Radarr/_build/latest?definitionId=1&branchName=develop)
[![Translated](https://translate.servarr.com/widgets/radarr/-/radarr/svg-badge.svg)](https://translate.servarr.com/engage/radarr/?utm_source=widget)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/radarr.svg)](https://github.com/Radarr/Radarr/wiki/Docker)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/radarr.svg)](https://wiki.servarr.com/Radarr_Installation#Docker)
![Github Downloads](https://img.shields.io/github/downloads/Radarr/Radarr/total.svg)
[![Backers on Open Collective](https://opencollective.com/Radarr/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/Radarr/sponsors/badge.svg)](#sponsors)
[![Backers on Open Collective](https://opencollective.com/Radarr/backers/badge.svg)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/Radarr/sponsors/badge.svg)](#sponsors)
Radarr is an __independent__ fork of [Sonarr](https://github.com/Sonarr/Sonarr) reworked for automatically downloading movies via Usenet and BitTorrent.
Radarr is a movie collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new movies and will interface with clients and indexers to grab, sort, and rename them. It can also be configured to automatically upgrade the quality of existing files in the library when a better quality format becomes available.
The project was inspired by other Usenet/BitTorrent movie downloaders such as CouchPotato.
## Getting Started
[![Installation](https://img.shields.io/badge/wiki-installation-brightgreen.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/Installation)
[![Docker](https://img.shields.io/badge/wiki-docker-1488C6.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/Docker)
[![Setup Guide](https://img.shields.io/badge/wiki-setup_guide-orange.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/Setup-Guide)
[![FAQ](https://img.shields.io/badge/wiki-FAQ-BF55EC.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/FAQ)
If you are using Docker please ensure your Docker paths are setup correctly using [this guide to facilitate](https://old.reddit.com/r/usenet/wiki/docker) hardlinks and minimize permissions issues.
* [Install Radarr for your desired OS](https://github.com/Radarr/Radarr/wiki/Installation) *or* use [Docker](https://github.com/Radarr/Radarr/wiki/Docker)
* *For Linux users*, run `radarr` and *optionally* have [Radarr start automatically](https://github.com/Radarr/Radarr/wiki/Autostart-on-Linux)
* Connect to the UI through <http://localhost:7878> or <http://your-ip:7878> in your web browser
* See the [Setup Guide](https://github.com/Radarr/Radarr/wiki/Setup-Guide) for further configuration
## Downloads
Please note that v0.2 will only have critical bugs resolved as of August 2020. Any additional development or features will be soley in V3.
| Release Type | Branch: develop (stable) | Branch: nightly (semi-unstable) | Branch: aphrodite (very-unstable) |
|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Binary Releases | [![GitHub Releases](https://img.shields.io/badge/downloads-releases-brightgreen.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/releases) | [![AppVeyor Builds](https://img.shields.io/badge/downloads-nightly-green.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/radarr-usby1/branch/develop/artifacts) | |
| Docker - lsio | [![Docker release](https://img.shields.io/badge/linuxserver-radarr:latest-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr) | [![Docker nightly](https://img.shields.io/badge/linuxserver-radarr:nightly-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr) | [![Docker aphrodite](https://img.shields.io/badge/linuxserver-radarr:preview-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr) |
| Docker - hotio | [![Docker release](https://img.shields.io/badge/hotio-radarr:latest-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/hotio/radarr) | [![Docker nightly](https://img.shields.io/badge/hotio-radarr:unstable-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/hotio/radarr) | [![Docker aphrodite](https://img.shields.io/badge/hotio-radarr:aphrodite-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/hotio/radarr) |
## Support
[![Discord](https://img.shields.io/badge/discord-chat-7289DA.svg?maxAge=60&style=flat-square)](https://discord.gg/AD3UP37)
[![Reddit](https://img.shields.io/badge/reddit-discussion-FF4500.svg?maxAge=60&style=flat-square)](https://www.reddit.com/r/radarr)
[![GitHub](https://img.shields.io/badge/github-issues-red.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/issues)
[![GitHub Wiki](https://img.shields.io/badge/github-wiki-181717.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki)
## Status
[![GitHub issues](https://img.shields.io/github/issues/radarr/radarr.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/issues)
[![GitHub pull requests](https://img.shields.io/github/issues-pr/radarr/radarr.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/pulls)
[![GNU GPL v3](https://img.shields.io/badge/license-GNU%20GPL%20v3-blue.svg?maxAge=60&style=flat-square)](http://www.gnu.org/licenses/gpl.html)
[![Copyright 2010-2020](https://img.shields.io/badge/copyright-2020-blue.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr)
[![Github Releases](https://img.shields.io/github/downloads/Radarr/Radarr/total.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/releases/)
[![Docker Pulls](https://img.shields.io/docker/pulls/linuxserver/radarr.svg?maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr/)
[![Changelog](https://img.shields.io/github/commit-activity/w/radarr/radarr.svg?style=flat-square)](/CHANGELOG.md#unreleased)
### [Site and API Status](https://status.radarr.video)
Radarr is currently undergoing rapid development and pull requests are actively added into the repository.
## Features
### Current Features
## Major Features Include:
* Adding new movies with lots of information, such as trailers, ratings, etc.
* Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc.
@@ -69,78 +21,57 @@ Radarr is currently undergoing rapid development and pull requests are actively
* Automatically importing downloaded movies
* Recognizing Special Editions, Director's Cut, etc.
* Identifying releases with hardcoded subs
* All indexers supported by Sonarr also supported
* New PassThePopcorn Indexer
* QBittorrent, Deluge, rTorrent, Transmission and uTorrent download client (Other clients are coming)
* New TorrentPotato Indexer
* Torznab Indexer now supports Movies (Works well with [Jackett](https://github.com/Jackett/Jackett))
* Scanning PreDB to know when a new release is available
* Importing movies from various online sources, such as IMDb Watchlists or Trakt (v3) (A complete list can be found [here](https://github.com/Radarr/Radarr/issues/114))
* QBittorrent, Deluge, rTorrent, Transmission, uTorrent, and other download clients are supported
* Full integration with Kodi, Plex (notification, library update)
* And a new beautiful UI (v3)
* A beautiful UI
* Importing Metadata such as trailers or subtitles
* Adding metadata such as posters and information for Kodi and others to use
* Advanced customization for profiles, such that Radarr will always download the copy you want
#### [Feature Requests](https://github.com/Radarr/Radarr/issues/new?assignees=&labels=feature+request&template=feature_request.md&title=)
## Support
Note: GitHub Issues are for Bugs and Feature Requests Only
## Configuring the Development Environment
[![Discord](https://img.shields.io/badge/discord-chat-7289DA.svg?maxAge=60)](https://discord.gg/r5wJPt9)
[![Reddit](https://img.shields.io/badge/reddit-discussion-FF4500.svg?maxAge=60)](https://www.reddit.com/r/Radarr)
[![GitHub - Bugs and Feature Requests Only](https://img.shields.io/badge/github-issues-red.svg?maxAge=60)](https://github.com/Radarr/Radarr/issues)
[![Wiki](https://img.shields.io/badge/servarr-wiki-181717.svg?maxAge=60)](https://wiki.servarr.com/Radarr)
### Requirements
## Feature Requests
* [Visual Studio Community 2019](https://www.visualstudio.com/vs/community/) or [Rider](http://www.jetbrains.com/rider/)
* [Git](https://git-scm.com/downloads)
* [Node.js](https://nodejs.org/en/download/)
* [Yarn](https://yarnpkg.com/)
[Feature Requests](https://github.com/Radarr/Radarr/issues/new?assignees=&labels=Type%3A+Enhancement&template=feature_request.md&title=)
### Setup
## Contributors & Developers
[API Documentation](https://radarr.video/docs/api/)
* Make sure all the required software mentioned above are installed
* Clone the repository into your development machine ([*info*](https://help.github.com/desktop/guides/contributing/working-with-your-remote-repository-on-github-or-github-enterprise))
* Install the required Node Packages `yarn install`
* Start gulp to monitor your dev environment for any changes that need post processing using `yarn start` command.
This project exists thanks to all the people who contribute. [Contribute](CONTRIBUTING.md).
<a href="https://github.com/Radarr/Radarr/graphs/contributors"><img src="https://opencollective.com/Radarr/contributors.svg?width=890&button=false" /></a>
> **Notice**
> Gulp must be running at all times while you are working with Radarr client source files.
### Build
## Backers
* To build run `sh build.sh`
Thank you to all our backers! 🙏 [Become a backer](https://opencollective.com/Radarr#backer)
**Note:** Windows users must have bash available to do this. If you installed git, you should have a git bash utility that works.
<img src="https://opencollective.com/Radarr/backers.svg?width=890"></a>
### Development
## Sponsors
* Open `Radarr.sln` in Visual Studio 2019 or run the build.sh script, if Mono is installed. Alternatively you can use Jetbrains Rider, since it works on all Platforms.
* Make sure `NzbDrone.Console` is set as the startup project
* Run `build.sh` before running, or build in VS
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor](https://opencollective.com/Radarr#sponsor)
## Supporters
<img src="https://opencollective.com/Radarr/sponsors.svg?width=890"></a>
This project would not be possible without the support by these amazing folks. [**Become a sponsor or backer**](https://opencollective.com/radarr) to help us out!
## Mega Sponsors
### Sponsors
<img src="https://opencollective.com/Radarr/tiers/mega-sponsor.svg?width=890"></a>
[![Sponsors](https://opencollective.com/radarr/tiers/sponsor.svg)](https://opencollective.com/radarr/order/3851)
### Flexible Sponsors
[![Flexible Sponsors](https://opencollective.com/radarr/tiers/flexible-sponsor.svg?avatarHeight=54)](https://opencollective.com/radarr/order/3856)
### Backers
[![Backers](https://opencollective.com/radarr/tiers/backer.svg?avatarHeight=48)](https://opencollective.com/radarr/order/3850)
### JetBrains
Thank you to [<img src="/Logo/jetbrains.svg" alt="JetBrains" width="32"> JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools
## JetBrains
Thank you to [<img src="/Logo/jetbrains.svg" alt="JetBrains" width="32"> JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools.
* [<img src="/Logo/resharper.svg" alt="ReSharper" width="32"> ReSharper](http://www.jetbrains.com/resharper/)
* [<img src="/Logo/webstorm.svg" alt="WebStorm" width="32"> WebStorm](http://www.jetbrains.com/webstorm/)
* [<img src="/Logo/rider.svg" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/)
* [<img src="/Logo/dottrace.svg" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/)
## License
### License
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
* Copyright 2010-2020
* Copyright 2010-2021
+47 -30
View File
@@ -7,24 +7,23 @@ variables:
outputFolder: './_output'
artifactsFolder: './_artifacts'
testsFolder: './_tests'
majorVersion: '3.0.0'
majorVersion: '3.0.2'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '3.1.401'
dotnetVersion: '3.1.404'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
trigger:
branches:
include:
- develop
- aphrodite
- master
pr:
- develop
- aphrodite
stages:
- stage: Setup
@@ -40,7 +39,7 @@ stages:
displayName: Set Build Name
- bash: |
if [[ $BUILD_REASON == "PullRequest" ]]; then
git diff origin/aphrodite...HEAD --name-only | grep -E "^(src/|azure-pipelines.yml)"
git diff origin/develop...HEAD --name-only | grep -E "^(src/|azure-pipelines.yml)"
echo $? > not_backend_update
else
echo 0 > not_backend_update
@@ -185,7 +184,11 @@ stages:
- bash: ./build.sh --packages
displayName: Create Packages
- bash: |
setup/inno/ISCC.exe setup/radarr.iss //DFramework=netcoreapp3.1
setup/inno/ISCC.exe setup/radarr.iss //DFramework=netcoreapp3.1 //DRuntime=win-x86
cp setup/output/Radarr.*windows.netcoreapp3.1.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x86-installer.exe
displayName: Create .NET Core Windows installer
- bash: |
setup/inno/ISCC.exe setup/radarr.iss //DFramework=netcoreapp3.1 //DRuntime=win-x64
cp setup/output/Radarr.*windows.netcoreapp3.1.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Radarr.${BUILDNAME}.windows-core-x64-installer.exe
displayName: Create .NET Core Windows installer
- publish: $(Build.ArtifactStagingDirectory)
@@ -228,7 +231,14 @@ stages:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/windows/netcoreapp3.1
rootFolderOrFile: $(artifactsFolder)/win-x64/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create Windows x86 Core zip
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Radarr.$(buildName).windows-core-x86.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x86/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create MacOS Core app
inputs:
@@ -302,14 +312,22 @@ stages:
sentry-cli releases new --finalize -p radarr -p radarr-ui -p radarr-update "${RELEASENAME}"
sentry-cli releases -p radarr-ui files "${RELEASENAME}" upload-sourcemaps _output/UI/ --rewrite
sentry-cli releases set-commits --auto "${RELEASENAME}"
sentry-cli releases deploys "${RELEASENAME}" new -e aphrodite
if [[ ${BUILD_SOURCEBRANCH} == "refs/heads/develop" ]]; then
sentry-cli releases deploys "${RELEASENAME}" new -e nightly
else
sentry-cli releases deploys "${RELEASENAME}" new -e production
fi
if [ $? -gt 0 ]; then
echo "##vso[task.logissue type=warning]Error uploading source maps."
fi
exit 0
displayName: Publish Sentry Source Maps
continueOnError: true
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/aphrodite'))
condition: |
or
(
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop')),
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
)
env:
SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr)
SENTRY_ORG: $(sentryOrg)
@@ -379,11 +397,6 @@ stages:
- powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- bash: |
wget https://github.com/acoustid/chromaprint/releases/download/v1.4.3/chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz
sudo tar xf chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz --strip-components=1 --directory /usr/bin
displayName: Install fpcalc
condition: and(succeeded(), eq(variables['osName'], 'Linux'))
- bash: |
SYMLINK=6_6_0
MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK
@@ -686,24 +699,21 @@ stages:
mkdir -p ./bin/
cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Radarr/. ./bin/
displayName: Move Package Contents
- bash: |
if [[ $OSNAME == "Mac" ]]; then
url=https://github.com/mozilla/geckodriver/releases/download/v0.27.0/geckodriver-v0.27.0-macos.tar.gz
elif [[ $OSNAME == "Linux" ]]; then
url=https://github.com/mozilla/geckodriver/releases/download/v0.27.0/geckodriver-v0.27.0-linux64.tar.gz
else
echo "Unhandled OS"
exit 1
fi
curl -s -L "$url" | tar -xz
chmod +x geckodriver
mv geckodriver _tests
displayName: Install Gecko Driver
condition: and(succeeded(), ne(variables['osName'], 'Windows'))
- bash: |
chmod a+x ${TESTSFOLDER}/test.sh
${TESTSFOLDER}/test.sh ${OSNAME} Automation Test
displayName: Run Automation Tests
- task: CopyFiles@2
displayName: 'Copy Screenshot to: $(Build.ArtifactStagingDirectory)'
inputs:
SourceFolder: '$(Build.SourcesDirectory)'
Contents: |
**/*_test_screenshot.png
TargetFolder: '$(Build.ArtifactStagingDirectory)/screenshots'
- publish: $(Build.ArtifactStagingDirectory)/screenshots
artifact: '$(osName)AutomationScreenshots'
displayName: Publish Screenshot Bundle
condition: and(succeeded(), eq(variables['System.JobAttempt'], '1'))
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
@@ -852,8 +862,15 @@ stages:
- job:
displayName: Discord Notification
pool:
vmImage: 'ubuntu-18.04'
vmImage: 'windows-2019'
steps:
- task: DownloadPipelineArtifact@2
continueOnError: true
displayName: Download Screenshot Artifact
inputs:
buildType: 'current'
artifactName: 'WindowsAutomationScreenshots'
targetPath: $(Build.SourcesDirectory)
- checkout: none
- powershell: |
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/Servarr/AzureDiscordNotify/master/DiscordNotify.ps1'))
+6 -11
View File
@@ -183,12 +183,13 @@ PackageMacOSApp()
PackageWindows()
{
local framework="$1"
local runtime="$2"
ProgressStart "Creating Windows Package for $framework"
local folder=$artifactsFolder/windows/$framework/Radarr
local folder=$artifactsFolder/$runtime/$framework/Radarr
PackageFiles "$folder" "$framework" "win-x64"
PackageFiles "$folder" "$framework" "$runtime"
echo "Removing Radarr.Mono"
rm -f $folder/Radarr.Mono.*
@@ -214,7 +215,7 @@ Package()
PackageLinux "$framework" "$runtime"
;;
win)
PackageWindows "$framework"
PackageWindows "$framework" "$runtime"
;;
osx)
PackageMacOS "$framework"
@@ -232,14 +233,6 @@ PackageTests()
rm -f $testPackageFolder/$framework/$runtime/*.log.config
# geckodriver.exe isn't copied by dotnet publish
if [ "$runtime" = "win-x64" ];
then
curl -Lso gecko.zip "https://github.com/mozilla/geckodriver/releases/download/v0.27.0/geckodriver-v0.27.0-win64.zip"
unzip -o gecko.zip
cp geckodriver.exe "$testPackageFolder/$framework/win-x64/publish"
fi
ProgressEnd 'Creating Test Package'
}
@@ -318,6 +311,7 @@ then
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
PackageTests "netcoreapp3.1" "win-x64"
PackageTests "netcoreapp3.1" "win-x86"
PackageTests "netcoreapp3.1" "linux-x64"
PackageTests "netcoreapp3.1" "linux-musl-x64"
PackageTests "netcoreapp3.1" "osx-x64"
@@ -350,6 +344,7 @@ then
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
Package "netcoreapp3.1" "win-x64"
Package "netcoreapp3.1" "win-x86"
Package "netcoreapp3.1" "linux-x64"
Package "netcoreapp3.1" "linux-musl-x64"
Package "netcoreapp3.1" "linux-arm64"
-14
View File
@@ -1,14 +0,0 @@
# Changelog
{{#versions}}
## {{{label}}}
{{#sections}}
### {{{label}}}
{{#commits}}
- {{{subject}}} [<a href="https://github.com/{{{author}}}">{{{author}}}</a>]
{{/commits}}
{{/sections}}
{{/versions}}
-15
View File
@@ -1,15 +0,0 @@
**To receive further Pre-Release updates, please change the branch to develop. (Settings -> General (Show Advanced Settings) -> Updates -> Branch)**
{{#versions}}
{{#sections}}
{{{label}}}
{{#commits}}
- {{{subject}}} [{{{author}}}]
{{/commits}}
{{/sections}}
{{/versions}}
**Note**: The OSX version does not automatically launch the browser. You have to go to http://localhost:7878 by yourself in a browser of your choice.
+1 -1
View File
@@ -75,7 +75,7 @@
"function-parentheses-newline-inside": "never-multi-line",
"function-parentheses-space-inside": "never",
"function-url-quotes": "always",
"function-url-scheme-blacklist": [
"function-url-scheme-disallowed-list": [
"data"
],
"function-whitespace-after": "always",
+2 -1
View File
@@ -10,7 +10,8 @@ gulp.task('build',
'webpack',
'copyHtml',
'copyFonts',
'copyImages'
'copyImages',
'copyRobots'
)
)
);
+8
View File
@@ -32,3 +32,11 @@ gulp.task('copyImages', () => {
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload());
});
gulp.task('copyRobots', () => {
return gulp.src(paths.src.robots, { base: paths.src.root })
.pipe(cache('copyRobots'))
.pipe(print())
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload());
});
+1
View File
@@ -8,6 +8,7 @@ const paths = {
content: `${root}/Content/`,
fonts: `${root}/Content/Fonts/`,
images: `${root}/Content/Images/`,
robots: `${root}/Content/robots.txt`,
exclude: {
libs: `!${root}/JsLibraries/**`
}
+1
View File
@@ -13,6 +13,7 @@ function watch() {
gulpWatch(paths.src.html, gulp.series('copyHtml'));
gulpWatch(`${paths.src.fonts}**/*.*`, gulp.series('copyFonts'));
gulpWatch(`${paths.src.images}**/*.*`, gulp.series('copyImages'));
gulpWatch(paths.src.robots, gulp.series('copyRobots'));
}
gulp.task('watch', gulp.series('build', watch));
+14 -9
View File
@@ -7,6 +7,7 @@ const errorHandler = require('./helpers/errorHandler');
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const HtmlWebpackPluginHtmlTags = require('html-webpack-plugin/lib/html-tags');
const TerserPlugin = require('terser-webpack-plugin');
const uiFolder = 'UI';
@@ -14,7 +15,7 @@ const frontendFolder = path.join(__dirname, '..');
const srcFolder = path.join(frontendFolder, 'src');
const isProduction = process.argv.indexOf('--production') > -1;
const isProfiling = isProduction && process.argv.indexOf('--profile') > -1;
const inlineWebWorkers = true;
const inlineWebWorkers = 'no-fallback';
const distFolder = path.resolve(frontendFolder, '..', '_output', uiFolder);
@@ -32,14 +33,19 @@ const cssVarsFiles = [
].map(require.resolve);
// Override the way HtmlWebpackPlugin injects the scripts
// TODO: Find a better way to get these paths without
HtmlWebpackPlugin.prototype.injectAssetsIntoHtml = function(html, assets, assetTags) {
const head = assetTags.head.map((v) => {
v.attributes = { rel: 'stylesheet', type: 'text/css', href: `/${v.attributes.href.replace('\\', '/')}` };
return this.createHtmlTag(v);
const head = assetTags.headTags.map((v) => {
const href = v.attributes.href
.replace('\\', '/')
.replace('%5C', '/');
v.attributes = { rel: 'stylesheet', type: 'text/css', href: `/${href}` };
return HtmlWebpackPluginHtmlTags.htmlTagObjectToString(v, this.options.xhtml);
});
const body = assetTags.body.map((v) => {
const body = assetTags.bodyTags.map((v) => {
v.attributes = { src: `/${v.attributes.src}` };
return this.createHtmlTag(v);
return HtmlWebpackPluginHtmlTags.htmlTagObjectToString(v, this.options.xhtml);
});
return html
@@ -125,9 +131,8 @@ const config = {
use: {
loader: 'worker-loader',
options: {
name: '[name].js',
inline: inlineWebWorkers,
fallback: !inlineWebWorkers
filename: '[name].js',
inline: inlineWebWorkers
}
}
},
+110 -1
View File
@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
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';
@@ -10,12 +11,84 @@ 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 { align, icons } from 'Helpers/Props';
import { align, icons, kinds } from 'Helpers/Props';
import getRemovedItems from 'Utilities/Object/getRemovedItems';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import translate from 'Utilities/String/translate';
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 BlacklistRowConnector from './BlacklistRowConnector';
class Blacklist 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
@@ -27,15 +100,33 @@ class Blacklist extends Component {
items,
columns,
totalRecords,
isRemoving,
isClearingBlacklistExecuting,
onClearBlacklistPress,
...otherProps
} = this.props;
const {
allSelected,
allUnselected,
selectedState,
isConfirmRemoveModalOpen
} = this.state;
const selectedIds = this.getSelectedIds();
return (
<PageContent title={translate('Blacklist')}>
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label="Remove Selected"
iconName={icons.REMOVE}
isDisabled={!selectedIds.length}
isSpinning={isRemoving}
onPress={this.onRemoveSelectedPress}
/>
<PageToolbarButton
label={translate('Clear')}
iconName={icons.CLEAR}
@@ -81,8 +172,12 @@ class Blacklist extends Component {
isPopulated && !error && !!items.length &&
<div>
<Table
selectAll={true}
allSelected={allSelected}
allUnselected={allUnselected}
columns={columns}
{...otherProps}
onSelectAllChange={this.onSelectAllChange}
>
<TableBody>
{
@@ -90,8 +185,10 @@ class Blacklist extends Component {
return (
<BlacklistRowConnector
key={item.id}
isSelected={selectedState[item.id] || false}
columns={columns}
{...item}
onSelectedChange={this.onSelectedChange}
/>
);
})
@@ -107,6 +204,16 @@ class Blacklist extends Component {
</div>
}
</PageContentBody>
<ConfirmModal
isOpen={isConfirmRemoveModalOpen}
kind={kinds.DANGER}
title={translate('RemoveSelected')}
message={translate('AreYouSureYouWantToRemoveTheSelectedItemsFromBlacklist')}
confirmLabel={translate('RemoveSelected')}
onConfirm={this.onRemoveSelectedConfirmed}
onCancel={this.onConfirmRemoveModalClose}
/>
</PageContent>
);
}
@@ -119,7 +226,9 @@ Blacklist.propTypes = {
items: PropTypes.arrayOf(PropTypes.object).isRequired,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
totalRecords: PropTypes.number,
isRemoving: PropTypes.bool.isRequired,
isClearingBlacklistExecuting: PropTypes.bool.isRequired,
onRemoveSelected: PropTypes.func.isRequired,
onClearBlacklistPress: PropTypes.func.isRequired
};
@@ -89,6 +89,10 @@ class BlacklistConnector extends Component {
this.props.gotoBlacklistPage({ page });
}
onRemoveSelected = (ids) => {
this.props.removeBlacklistItems({ ids });
}
onSortPress = (sortKey) => {
this.props.setBlacklistSort({ sortKey });
}
@@ -124,6 +128,7 @@ class BlacklistConnector extends Component {
onNextPagePress={this.onNextPagePress}
onLastPagePress={this.onLastPagePress}
onPageSelect={this.onPageSelect}
onRemoveSelected={this.onRemoveSelected}
onSortPress={this.onSortPress}
onTableOptionChange={this.onTableOptionChange}
onClearBlacklistPress={this.onClearBlacklistPress}
@@ -143,6 +148,7 @@ BlacklistConnector.propTypes = {
gotoBlacklistNextPage: PropTypes.func.isRequired,
gotoBlacklistLastPage: PropTypes.func.isRequired,
gotoBlacklistPage: PropTypes.func.isRequired,
removeBlacklistItems: PropTypes.func.isRequired,
setBlacklistSort: PropTypes.func.isRequired,
setBlacklistTableOption: PropTypes.func.isRequired,
clearBlacklist: PropTypes.func.isRequired,
@@ -3,6 +3,7 @@ import React, { Component } from 'react';
import IconButton from 'Components/Link/IconButton';
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableSelectCell from 'Components/Table/Cells/TableSelectCell';
import TableRow from 'Components/Table/TableRow';
import { icons, kinds } from 'Helpers/Props';
import MovieFormats from 'Movie/MovieFormats';
@@ -42,6 +43,7 @@ class BlacklistRow extends Component {
render() {
const {
id,
movie,
sourceTitle,
quality,
@@ -51,7 +53,9 @@ class BlacklistRow extends Component {
protocol,
indexer,
message,
isSelected,
columns,
onSelectedChange,
onRemovePress
} = this.props;
@@ -61,6 +65,12 @@ class BlacklistRow extends Component {
return (
<TableRow>
<TableSelectCell
id={id}
isSelected={isSelected}
onSelectedChange={onSelectedChange}
/>
{
columns.map((column) => {
const {
@@ -194,7 +204,9 @@ BlacklistRow.propTypes = {
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
};
@@ -1,6 +1,6 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { removeFromBlacklist } from 'Store/Actions/blacklistActions';
import { removeBlacklistItem } from 'Store/Actions/blacklistActions';
import createMovieSelector from 'Store/Selectors/createMovieSelector';
import BlacklistRow from './BlacklistRow';
@@ -18,7 +18,7 @@ function createMapStateToProps() {
function createMapDispatchToProps(dispatch, props) {
return {
onRemovePress() {
dispatch(removeFromBlacklist({ id: props.id }));
dispatch(removeBlacklistItem({ id: props.id }));
}
};
}
@@ -173,13 +173,13 @@ function HistoryDetails(props) {
switch (reason) {
case 'Manual':
reasonMessage = 'File was deleted by via UI';
reasonMessage = translate('FileWasDeletedByViaUI');
break;
case 'MissingFromDisk':
reasonMessage = 'Radarr was unable to find the file on disk so it was removed';
reasonMessage = translate('MissingFromDisk');
break;
case 'Upgrade':
reasonMessage = 'File was deleted to import an upgrade';
reasonMessage = translate('FileWasDeletedByUpgrade');
break;
default:
reasonMessage = '';
@@ -1,4 +1,3 @@
import _ from 'lodash';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
@@ -8,10 +7,10 @@ function createMapStateToProps() {
return createSelector(
createUISettingsSelector(),
(uiSettings) => {
return _.pick(uiSettings, [
'shortDateFormat',
'timeFormat'
]);
return {
shortDateFormat: uiSettings.shortDateFormat,
timeFormat: uiSettings.timeFormat
};
}
);
}
+1 -1
View File
@@ -94,7 +94,7 @@ class History extends Component {
isPopulated && !hasError && !items.length &&
<div>
No history found
{translate('NoHistory')}
</div>
}
+2 -2
View File
@@ -203,14 +203,14 @@ class Queue extends Component {
{
!isRefreshing && hasError &&
<div>
Failed to load Queue
{translate('FailedToLoadQueue')}
</div>
}
{
isPopulated && !hasError && !items.length &&
<div>
Queue is empty
{translate('QueueIsEmpty')}
</div>
}
+35 -5
View File
@@ -11,14 +11,14 @@ function QueueDetails(props) {
size,
sizeleft,
estimatedCompletionTime,
status: queueStatus,
status,
trackedDownloadState,
trackedDownloadStatus,
errorMessage,
progressBar
} = props;
const status = queueStatus.toLowerCase();
const progress = (100 - sizeleft / size * 100);
const progress = size ? (100 - sizeleft / size * 100) : 0;
if (status === 'pending') {
return (
@@ -40,7 +40,35 @@ function QueueDetails(props) {
);
}
// TODO: show an icon when download is complete, but not imported yet?
if (trackedDownloadStatus === 'warning') {
return (
<Icon
name={icons.DOWNLOAD}
kind={kinds.WARNING}
title={translate('UnableToImportCheckLogs')}
/>
);
}
if (trackedDownloadState === 'importPending') {
return (
<Icon
name={icons.DOWNLOAD}
kind={kinds.PURPLE}
title={`${translate('Downloaded')} - ${translate('WaitingToImport')}`}
/>
);
}
if (trackedDownloadState === 'importing') {
return (
<Icon
name={icons.DOWNLOAD}
kind={kinds.PURPLE}
title={`${translate('Downloaded')} - ${translate('Importing')}`}
/>
);
}
}
if (errorMessage) {
@@ -91,6 +119,8 @@ QueueDetails.propTypes = {
sizeleft: PropTypes.number.isRequired,
estimatedCompletionTime: PropTypes.string,
status: PropTypes.string.isRequired,
trackedDownloadState: PropTypes.string.isRequired,
trackedDownloadStatus: PropTypes.string.isRequired,
errorMessage: PropTypes.string,
progressBar: PropTypes.node.isRequired
};
@@ -81,12 +81,12 @@ class RemoveQueueItemModal extends Component {
onModalClose={this.onModalClose}
>
<ModalHeader>
Remove - {sourceTitle}
{translate('Remove')} - {sourceTitle}
</ModalHeader>
<ModalBody>
<div>
Are you sure you want to remove '{sourceTitle}' from the queue?
{translate('RemoveFromQueueText', [sourceTitle])}
</div>
<FormGroup>
@@ -87,7 +87,7 @@ class RemoveQueueItemsModal extends Component {
<ModalBody>
<div className={styles.message}>
Are you sure you want to remove {selectedCount} item{selectedCount > 1 ? 's' : ''} from the queue?
{translate('AreYouSureYouWantToRemoveSelectedItemsFromQueue', [selectedCount, selectedCount > 1 ? 's' : ''])}
</div>
<FormGroup>
@@ -159,7 +159,7 @@ class AddNewMovie extends Component {
{translate('YouCanAlsoSearch')}
</div>
<div>
<Link to="https://github.com/Radarr/Radarr/wiki/FAQ#why-cant-i-add-a-new-movie-when-i-know-the-tmdb-id">
<Link to="https://wiki.servarr.com/Radarr_FAQ#Why_cant_I_add_a_new_movie_to_Radarr">
{translate('CantFindMovie')}
</Link>
</div>
@@ -17,30 +17,15 @@ import styles from './AddNewMovieModalContent.css';
class AddNewMovieModalContent extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
searchForMovie: false
};
}
//
// Listeners
onSearchForMissingMovieChange = ({ value }) => {
this.setState({ searchForMovie: value });
}
onQualityProfileIdChange = ({ value }) => {
this.props.onInputChange({ name: 'qualityProfileId', value: parseInt(value) });
}
onAddMoviePress = () => {
this.props.onAddMoviePress(this.state.searchForMovie);
this.props.onAddMoviePress();
}
//
@@ -57,6 +42,7 @@ class AddNewMovieModalContent extends Component {
monitor,
qualityProfileId,
minimumAvailability,
searchForMovie,
folder,
tags,
isSmallScreen,
@@ -117,7 +103,7 @@ class AddNewMovieModalContent extends Component {
<FormGroup>
<FormLabel>
Monitor
{translate('Monitor')}
</FormLabel>
<FormInputGroup
@@ -168,15 +154,15 @@ class AddNewMovieModalContent extends Component {
<ModalFooter className={styles.modalFooter}>
<label className={styles.searchForMissingMovieLabelContainer}>
<span className={styles.searchForMissingMovieLabel}>
Start search for missing movie
{translate('StartSearchForMissingMovie')}
</span>
<CheckInput
containerClassName={styles.searchForMissingMovieContainer}
className={styles.searchForMissingMovieInput}
name="searchForMovie"
value={this.state.searchForMovie}
onChange={this.onSearchForMissingMovieChange}
onChange={onInputChange}
{...searchForMovie}
/>
</label>
@@ -186,7 +172,7 @@ class AddNewMovieModalContent extends Component {
isSpinning={isAdding}
onPress={this.onAddMoviePress}
>
Add {title}
{translate('AddMovie')}
</SpinnerButton>
</ModalFooter>
</ModalContent>
@@ -205,6 +191,7 @@ AddNewMovieModalContent.propTypes = {
monitor: PropTypes.object.isRequired,
qualityProfileId: PropTypes.object,
minimumAvailability: PropTypes.object.isRequired,
searchForMovie: PropTypes.object.isRequired,
folder: PropTypes.string.isRequired,
tags: PropTypes.object.isRequired,
isSmallScreen: PropTypes.bool.isRequired,
@@ -53,13 +53,14 @@ class AddNewMovieModalContentConnector extends Component {
this.props.setAddMovieDefault({ [name]: value });
}
onAddMoviePress = (searchForMovie) => {
onAddMoviePress = () => {
const {
tmdbId,
rootFolderPath,
monitor,
qualityProfileId,
minimumAvailability,
searchForMovie,
tags
} = this.props;
@@ -69,8 +70,8 @@ class AddNewMovieModalContentConnector extends Component {
monitor: monitor.value,
qualityProfileId: qualityProfileId.value,
minimumAvailability: minimumAvailability.value,
tags: tags.value,
searchForMovie
searchForMovie: searchForMovie.value,
tags: tags.value
});
}
@@ -94,6 +95,7 @@ AddNewMovieModalContentConnector.propTypes = {
monitor: PropTypes.object.isRequired,
qualityProfileId: PropTypes.object,
minimumAvailability: PropTypes.object.isRequired,
searchForMovie: PropTypes.object.isRequired,
tags: PropTypes.object.isRequired,
onModalClose: PropTypes.func.isRequired,
setAddMovieDefault: PropTypes.func.isRequired,
@@ -170,6 +170,7 @@ class AddNewMovieSearchResult extends Component {
imdbId={imdbId}
/>
}
canFlip={true}
kind={kinds.INVERSE}
position={tooltipPositions.BOTTOM}
/>
@@ -116,7 +116,7 @@ class ImportMovie extends Component {
rootFoldersPopulated &&
!unmappedFolders.length ?
<div>
All movies in {path} have been imported
{translate('AllMoviesInPathHaveBeenImported', [path])}
</div> :
null
}
@@ -10,6 +10,7 @@ import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContentFooter from 'Components/Page/PageContentFooter';
import Popover from 'Components/Tooltip/Popover';
import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './ImportMovieFooter.css';
const MIXED = 'mixed';
@@ -112,7 +113,7 @@ class ImportMovieFooter extends Component {
<PageContentFooter>
<div className={styles.inputContainer}>
<div className={styles.label}>
Monitor
{translate('Monitor')}
</div>
<FormInputGroup
@@ -127,7 +128,7 @@ class ImportMovieFooter extends Component {
<div className={styles.inputContainer}>
<div className={styles.label}>
Minimum Availability
{translate('MinimumAvailability')}
</div>
<FormInputGroup
@@ -142,7 +143,7 @@ class ImportMovieFooter extends Component {
<div className={styles.inputContainer}>
<div className={styles.label}>
Quality Profile
{translate('QualityProfile')}
</div>
<FormInputGroup
@@ -168,7 +169,7 @@ class ImportMovieFooter extends Component {
isDisabled={!selectedCount || isLookingUpMovie}
onPress={onImportPress}
>
Import {selectedCount} {selectedCount > 1 ? 'Movies' : 'Movie'}
{translate('Import')} {selectedCount} {selectedCount > 1 ? translate('Movies') : translate('Movie')}
</SpinnerButton>
{
@@ -178,7 +179,7 @@ class ImportMovieFooter extends Component {
kind={kinds.WARNING}
onPress={onCancelLookupPress}
>
Cancel Processing
{translate('CancelProcessing')}
</Button> :
null
}
@@ -190,7 +191,7 @@ class ImportMovieFooter extends Component {
kind={kinds.SUCCESS}
onPress={onLookupPress}
>
Start Processing
{translate('StartProcessing')}
</Button> :
null
}
@@ -206,7 +207,7 @@ class ImportMovieFooter extends Component {
{
isLookingUpMovie ?
'Processing Folders' :
translate('ProcessingFolders') :
null
}
@@ -220,7 +221,7 @@ class ImportMovieFooter extends Component {
kind={kinds.WARNING}
/>
}
title="Import Errors"
title={translate('ImportErrors')}
body={
<ul>
{
@@ -3,6 +3,7 @@ import React from 'react';
import VirtualTableHeader from 'Components/Table/VirtualTableHeader';
import VirtualTableHeaderCell from 'Components/Table/VirtualTableHeaderCell';
import VirtualTableSelectAllHeaderCell from 'Components/Table/VirtualTableSelectAllHeaderCell';
import translate from 'Utilities/String/translate';
import styles from './ImportMovieHeader.css';
function ImportMovieHeader(props) {
@@ -24,35 +25,35 @@ function ImportMovieHeader(props) {
className={styles.folder}
name="folder"
>
Folder
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.monitor}
name="monitor"
>
Monitor
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.minimumAvailability}
name="minimumAvailability"
>
Min Availability
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.qualityProfile}
name="qualityProfileId"
>
Quality Profile
{translate('Folder')}
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.movie}
name="movie"
>
Movie
{translate('Movie')}
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.monitor}
name="monitor"
>
{translate('Monitor')}
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.minimumAvailability}
name="minimumAvailability"
>
{translate('MinAvailability')}
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.qualityProfile}
name="qualityProfileId"
>
{translate('QualityProfile')}
</VirtualTableHeaderCell>
</VirtualTableHeader>
);
@@ -34,6 +34,13 @@ function ImportMovieRow(props) {
{id}
</VirtualTableRowCell>
<VirtualTableRowCell className={styles.movie}>
<ImportMovieSelectMovieConnector
id={id}
isExistingMovie={isExistingMovie}
/>
</VirtualTableRowCell>
<VirtualTableRowCell className={styles.monitor}>
<FormInputGroup
type={inputTypes.MOVIE_MONITORED_SELECT}
@@ -60,13 +67,6 @@ function ImportMovieRow(props) {
onChange={onInputChange}
/>
</VirtualTableRowCell>
<VirtualTableRowCell className={styles.movie}>
<ImportMovieSelectMovieConnector
id={id}
isExistingMovie={isExistingMovie}
/>
</VirtualTableRowCell>
</>
);
}
@@ -9,6 +9,7 @@ import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import Portal from 'Components/Portal';
import { icons, kinds } from 'Helpers/Props';
import getUniqueElememtId from 'Utilities/getUniqueElementId';
import translate from 'Utilities/String/translate';
import ImportMovieSearchResultConnector from './ImportMovieSearchResultConnector';
import ImportMovieTitle from './ImportMovieTitle';
import styles from './ImportMovieSelectMovie.css';
@@ -174,7 +175,7 @@ class ImportMovieSelectMovie extends Component {
kind={kinds.WARNING}
/>
No match found!
{translate('NoMatchFound')}
</div> :
null
}
@@ -189,7 +190,7 @@ class ImportMovieSelectMovie extends Component {
kind={kinds.WARNING}
/>
Search failed, please try again later.
{translate('SearchFailedPleaseTryAgainLater')}
</div> :
null
}
@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
import React from 'react';
import Label from 'Components/Label';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './ImportMovieTitle.css';
function ImportMovieTitle(props) {
@@ -33,7 +34,7 @@ function ImportMovieTitle(props) {
<Label
kind={kinds.WARNING}
>
Existing
{translate('Existing')}
</Label>
}
</div>
@@ -101,12 +101,9 @@ class ImportMovieSelectFolder extends Component {
<div className={styles.tips}>
{translate('ImportTipsMessage')}
<ul>
<li className={styles.tip}>
Make sure that your files include the quality in their filenames. eg. <span className={styles.code}>movie.2008.bluray.mkv</span>
</li>
<li className={styles.tip}>
Point Radarr to the folder containing all of your movies, not a specific one. eg. <span className={styles.code}>"{isWindows ? 'C:\\movies' : '/movies'}"</span> and not <span className={styles.code}>"{isWindows ? 'C:\\movies\\the matrix' : '/movies/the matrix'}"</span>
</li>
<li className={styles.tip} dangerouslySetInnerHTML={{ __html: translate('ImportIncludeQuality', ['<code>movie.2008.bluray.mkv</code>']) }} />
<li className={styles.tip} dangerouslySetInnerHTML={{ __html: translate('ImportRootPath', [`<code>${isWindows ? 'C:\\movies' : '/movies'}</code>`, `<code>${isWindows ? 'C:\\movies\\the matrix' : '/movies/the matrix'}</code>`]) }} />
<li className={styles.tip}>{translate('ImportNotForDownloads')}</li>
</ul>
</div>
@@ -158,7 +155,7 @@ class ImportMovieSelectFolder extends Component {
className={styles.importButtonIcon}
name={icons.DRIVE}
/>
Start Import
{translate('StartImport')}
</Button>
</div>
}
+8 -8
View File
@@ -26,27 +26,27 @@ function AppUpdatedModalContent(props) {
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
Radarr Updated
{translate('RadarrUpdated')}
</ModalHeader>
<ModalBody>
<div>
Version <span className={styles.version}>{version}</span> of Radarr has been installed, in order to get the latest changes you'll need to reload Radarr.
</div>
<div dangerouslySetInnerHTML={{ __html: translate('VersionUpdateText', [`<span className=${styles.version}>${version}</span>`]) }} />
{
isPopulated && !error && !!update &&
<div>
{
!update.changes &&
<div className={styles.maintenance}>Maintenance release</div>
<div className={styles.maintenance}>
{translate('MaintenanceRelease')}
</div>
}
{
!!update.changes &&
<div>
<div className={styles.changes}>
What's new?
{translate('WhatsNew')}
</div>
<UpdateChanges
@@ -73,14 +73,14 @@ function AppUpdatedModalContent(props) {
<Button
onPress={onSeeChangesPress}
>
Recent Changes
{translate('RecentChanges')}
</Button>
<Button
kind={kinds.PRIMARY}
onPress={onModalClose}
>
Reload
{translate('Reload')}
</Button>
</ModalFooter>
</ModalContent>
+33 -2
View File
@@ -6,9 +6,38 @@ import styles from './Agenda.css';
function Agenda(props) {
const {
items
items,
start,
end
} = props;
const startDateParsed = Date.parse(start);
const endDateParsed = Date.parse(end);
items.forEach((item) => {
const cinemaDateParsed = Date.parse(item.inCinemas);
const digitalDateParsed = Date.parse(item.digitalRelease);
const physicalDateParsed = Date.parse(item.physicalRelease);
const dates = [];
if (cinemaDateParsed > 0 && cinemaDateParsed >= startDateParsed && cinemaDateParsed <= endDateParsed) {
dates.push(cinemaDateParsed);
}
if (digitalDateParsed > 0 && digitalDateParsed >= startDateParsed && digitalDateParsed <= endDateParsed) {
dates.push(digitalDateParsed);
}
if (physicalDateParsed > 0 && physicalDateParsed >= startDateParsed && physicalDateParsed <= endDateParsed) {
dates.push(physicalDateParsed);
}
item.sortDate = Math.min(...dates);
item.cinemaDateParsed = cinemaDateParsed;
item.digitalDateParsed = digitalDateParsed;
item.physicalDateParsed = physicalDateParsed;
});
items.sort((a, b) => ((a.sortDate > b.sortDate) ? 1 : -1));
return (
<div className={styles.agenda}>
{
@@ -32,7 +61,9 @@ function Agenda(props) {
}
Agenda.propTypes = {
items: PropTypes.arrayOf(PropTypes.object).isRequired
items: PropTypes.arrayOf(PropTypes.object).isRequired,
start: PropTypes.string.isRequired,
end: PropTypes.string.isRequired
};
export default Agenda;
+1 -2
View File
@@ -92,6 +92,5 @@
}
.dateIcon {
display: inline;
margin-right: 10px;
width: 25px;
}
+24 -18
View File
@@ -55,23 +55,26 @@ class AgendaEvent extends Component {
showCutoffUnmetIcon,
longDateFormat,
colorImpairedMode,
startDate,
endDate
cinemaDateParsed,
digitalDateParsed,
physicalDateParsed,
sortDate
} = this.props;
const agendaStart = Date.parse(startDate);
const agendaEnd = Date.parse(endDate);
const cinemaDate = Date.parse(inCinemas);
const digitalDate = Date.parse(digitalRelease);
let startTime = physicalRelease;
let releaseIcon = icons.DISC;
let startTime = null;
let releaseIcon = null;
if (digitalDate >= agendaStart && digitalDate <= agendaEnd) {
if (physicalDateParsed === sortDate) {
startTime = physicalRelease;
releaseIcon = icons.DISC;
}
if (digitalDateParsed === sortDate) {
startTime = digitalRelease;
releaseIcon = icons.MOVIE_FILE;
}
if (cinemaDate >= agendaStart && cinemaDate <= agendaEnd) {
if (cinemaDateParsed === sortDate) {
startTime = inCinemas;
releaseIcon = icons.IN_CINEMAS;
}
@@ -92,13 +95,14 @@ class AgendaEvent extends Component {
)}
to={link}
>
<div className={styles.dateIcon}>
<Icon
name={releaseIcon}
kind={kinds.DEFAULT}
/>
</div>
<div className={styles.date}>
<div className={styles.dateIcon}>
<Icon
name={releaseIcon}
kind={kinds.DEFAULT}
/>
</div>
{(showDate) ? startTime.format(longDateFormat) : null}
</div>
@@ -176,8 +180,10 @@ AgendaEvent.propTypes = {
timeFormat: PropTypes.string.isRequired,
longDateFormat: PropTypes.string.isRequired,
colorImpairedMode: PropTypes.bool.isRequired,
startDate: PropTypes.date,
endDate: PropTypes.date
cinemaDateParsed: PropTypes.number,
digitalDateParsed: PropTypes.number,
physicalDateParsed: PropTypes.number,
sortDate: PropTypes.number
};
AgendaEvent.defaultProps = {
@@ -13,9 +13,7 @@ function createMapStateToProps() {
createMovieFileSelector(),
createQueueItemSelector(),
createUISettingsSelector(),
(state) => state.calendar.start,
(state) => state.calendar.end,
(calendarOptions, movie, movieFile, queueItem, uiSettings, startDate, endDate) => {
(calendarOptions, movie, movieFile, queueItem, uiSettings) => {
return {
movie,
movieFile,
@@ -23,9 +21,7 @@ function createMapStateToProps() {
...calendarOptions,
timeFormat: uiSettings.timeFormat,
longDateFormat: uiSettings.longDateFormat,
colorImpairedMode: uiSettings.enableColorImpairedMode,
startDate,
endDate
colorImpairedMode: uiSettings.enableColorImpairedMode
};
}
);
@@ -12,10 +12,12 @@ function CalendarEventQueueDetails(props) {
sizeleft,
estimatedCompletionTime,
status,
trackedDownloadState,
trackedDownloadStatus,
errorMessage
} = props;
const progress = (100 - sizeleft / size * 100);
const progress = size ? (100 - sizeleft / size * 100) : 0;
return (
<QueueDetails
@@ -24,6 +26,8 @@ function CalendarEventQueueDetails(props) {
sizeleft={sizeleft}
estimatedCompletionTime={estimatedCompletionTime}
status={status}
trackedDownloadState={trackedDownloadState}
trackedDownloadStatus={trackedDownloadStatus}
errorMessage={errorMessage}
progressBar={
<div title={translate('MovieIsDownloadingInterp', [progress.toFixed(1), title])}>
@@ -45,6 +49,8 @@ CalendarEventQueueDetails.propTypes = {
sizeleft: PropTypes.number.isRequired,
estimatedCompletionTime: PropTypes.string,
status: PropTypes.string.isRequired,
trackedDownloadState: PropTypes.string.isRequired,
trackedDownloadStatus: PropTypes.string.isRequired,
errorMessage: PropTypes.string
};
@@ -24,7 +24,7 @@ function getTitle(time, start, end, view, longDateFormat) {
} else if (view === 'month') {
return timeMoment.format('MMMM YYYY');
} else if (view === 'agenda') {
return 'Agenda';
return `Agenda: ${startMoment.format('MMM D')} - ${endMoment.format('MMM D')}`;
}
let startFormat = 'MMM D YYYY';
@@ -168,7 +168,7 @@ class CalendarHeader extends Component {
selectedView={view}
onPress={this.onViewChange}
>
Month
{translate('Month')}
</ViewMenuItem>
}
@@ -177,7 +177,7 @@ class CalendarHeader extends Component {
selectedView={view}
onPress={this.onViewChange}
>
Week
{translate('Week')}
</ViewMenuItem>
<ViewMenuItem
@@ -185,7 +185,7 @@ class CalendarHeader extends Component {
selectedView={view}
onPress={this.onViewChange}
>
Forecast
{translate('Forecast')}
</ViewMenuItem>
<ViewMenuItem
@@ -1,4 +1,3 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
@@ -14,19 +13,16 @@ function createMapStateToProps() {
createDimensionsSelector(),
createUISettingsSelector(),
(calendar, dimensions, uiSettings) => {
const result = _.pick(calendar, [
'isFetching',
'view',
'time',
'start',
'end'
]);
result.isSmallScreen = dimensions.isSmallScreen;
result.collapseViewButtons = dimensions.isLargeScreen;
result.longDateFormat = uiSettings.longDateFormat;
return result;
return {
isFetching: calendar.isFetching,
view: calendar.view,
time: calendar.time,
start: calendar.start,
end: calendar.end,
isSmallScreen: dimensions.isSmallScreen,
collapseViewButtons: dimensions.isLargeScreen,
longDateFormat: uiSettings.longDateFormat
};
}
);
}
+24 -10
View File
@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React from 'react';
import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import LegendIconItem from './LegendIconItem';
import LegendItem from './LegendItem';
import styles from './Legend.css';
@@ -16,10 +17,10 @@ function Legend(props) {
if (showCutoffUnmetIcon) {
iconsToShow.push(
<LegendIconItem
name="Cutoff Not Met"
name={translate('CutoffUnmet')}
icon={icons.MOVIE_FILE}
kind={kinds.WARNING}
tooltip="Quality or language cutoff has not been met"
tooltip={translate('QualityOrLangCutoffHasNotBeenMet')}
/>
);
}
@@ -28,32 +29,45 @@ function Legend(props) {
<div className={styles.legend}>
<div>
<LegendItem
status="unreleased"
tooltip="Movie hasn't released yet"
style='ended'
name={translate('DownloadedAndMonitored')}
colorImpairedMode={colorImpairedMode}
/>
<LegendItem
status="unmonitored"
tooltip="Movie is unmonitored"
style='availNotMonitored'
name={translate('DownloadedButNotMonitored')}
colorImpairedMode={colorImpairedMode}
/>
</div>
<div>
<LegendItem
status="downloading"
tooltip="Movie is currently downloading"
style='missingMonitored'
name={translate('MissingMonitoredAndConsideredAvailable')}
colorImpairedMode={colorImpairedMode}
/>
<LegendItem
status="downloaded"
tooltip="Movie was downloaded and sorted"
style='missingUnmonitored'
name={translate('MissingNotMonitored')}
colorImpairedMode={colorImpairedMode}
/>
</div>
<div>
<LegendItem
style='queue'
name={translate('Queued')}
colorImpairedMode={colorImpairedMode}
/>
<LegendItem
style='continuing'
name={translate('Unreleased')}
colorImpairedMode={colorImpairedMode}
/>
</div>
{
iconsToShow.length > 0 &&
<div>
@@ -1,8 +1,5 @@
.legendIconItem {
margin: 3px 0;
margin-right: 6px;
width: 150px;
cursor: default;
margin-left: 6px;
}
.icon {
+62 -21
View File
@@ -1,33 +1,74 @@
.legendItemContainer {
margin-right: 5px;
width: 220px;
}
.legendItem {
margin: 3px 0;
margin-right: 6px;
padding-left: 5px;
width: 150px;
border-left-width: 4px;
border-left-style: solid;
cursor: default;
display: inline-flex;
margin-top: -1px;
vertical-align: middle;
line-height: 16px;
}
/*
* Status
*/
.downloaded {
composes: downloaded from '~Calendar/Events/CalendarEvent.css';
.legendItemColor {
margin-right: 8px;
width: 30px;
height: 16px;
border-radius: 4px;
}
.downloading {
composes: downloading from '~Calendar/Events/CalendarEvent.css';
.queue {
composes: legendItemColor;
background-color: $queueColor;
}
.unmonitored {
composes: unmonitored from '~Calendar/Events/CalendarEvent.css';
.continuing {
composes: legendItemColor;
background-color: $primaryColor;
}
.missing {
composes: missing from '~Calendar/Events/CalendarEvent.css';
.availNotMonitored {
composes: legendItemColor;
background-color: $darkGray;
}
.unreleased {
composes: unreleased from '~Calendar/Events/CalendarEvent.css';
.ended {
composes: legendItemColor;
background-color: $successColor;
}
.missingMonitored {
composes: legendItemColor;
background-color: $dangerColor;
&:global(.colorImpaired) {
background: repeating-linear-gradient(90deg, color($dangerColor shade(5%)), color($dangerColor shade(5%)) 5px, color($dangerColor shade(15%)) 5px, color($dangerColor shade(15%)) 10px);
}
}
.missingUnmonitored {
composes: legendItemColor;
background-color: $warningColor;
&:global(.colorImpaired) {
background: repeating-linear-gradient(45deg, $warningColor, $warningColor 5px, color($warningColor tint(15%)) 5px, color($warningColor tint(15%)) 10px);
}
}
.missingMonitoredColorImpaired {
background: repeating-linear-gradient(90deg, $colorImpairedGradientDark, $colorImpairedGradientDark 5px, $colorImpairedGradient 5px, $colorImpairedGradient 10px);
}
.missingUnmonitoredColorImpaired {
background: repeating-linear-gradient(45deg, $colorImpairedGradientDark, $colorImpairedGradientDark 5px, $colorImpairedGradient 5px, $colorImpairedGradient 10px);
}
.legendItemText {
display: inline-block;
}
+14 -15
View File
@@ -1,35 +1,34 @@
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import titleCase from 'Utilities/String/titleCase';
import styles from './LegendItem.css';
function LegendItem(props) {
const {
name,
status,
tooltip,
style,
colorImpairedMode
} = props;
return (
<div
className={classNames(
styles.legendItem,
styles[status],
colorImpairedMode && 'colorImpaired'
)}
title={tooltip}
>
{name ? name : titleCase(status)}
<div className={styles.legendItemContainer}>
<div
className={classNames(
styles.legendItem,
styles[style],
colorImpairedMode && 'colorImpaired'
)}
/>
<div className={classNames(styles.legendItemText, colorImpairedMode && styles[`${style}ColorImpaired`])}>
{name}
</div>
</div>
);
}
LegendItem.propTypes = {
name: PropTypes.string,
status: PropTypes.string.isRequired,
tooltip: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
style: PropTypes.string.isRequired,
colorImpairedMode: PropTypes.bool.isRequired
};
@@ -107,7 +107,7 @@ class CalendarOptionsModalContent extends Component {
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
Calendar Options
{translate('CalendarOptions')}
</ModalHeader>
<ModalBody>
@@ -109,7 +109,7 @@ class CalendarLinkModalContent extends Component {
return (
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
Radarr Calendar Feed
{translate('RadarrCalendarFeed')}
</ModalHeader>
<ModalBody>
@@ -129,7 +129,9 @@ class FileBrowserModalContent extends Component {
className={styles.mappedDrivesWarning}
kind={kinds.WARNING}
>
Mapped network drives are not available when running as a Windows Service, see the <Link className={styles.faqLink} to="https://github.com/Radarr/Radarr/wiki/FAQ">FAQ</Link> for more information.
<Link to="https://wiki.servarr.com/Radarr_FAQ#Why_cant_Radarr_see_my_files_on_a_remote_server">
{translate('MappedDrivesRunningAsService')}
</Link> .
</Alert>
}
@@ -5,16 +5,17 @@ import SelectInput from 'Components/Form/SelectInput';
import TextInput from 'Components/Form/TextInput';
import { IN_LAST, IN_NEXT, NOT_IN_LAST, NOT_IN_NEXT } from 'Helpers/Props/filterTypes';
import isString from 'Utilities/String/isString';
import translate from 'Utilities/String/translate';
import { NAME } from './FilterBuilderRowValue';
import styles from './DateFilterBuilderRowValue.css';
const timeOptions = [
{ key: 'seconds', value: 'seconds' },
{ key: 'minutes', value: 'minutes' },
{ key: 'hours', value: 'hours' },
{ key: 'days', value: 'days' },
{ key: 'weeks', value: 'weeks' },
{ key: 'months', value: 'months' }
{ key: 'seconds', value: translate('Seconds') },
{ key: 'minutes', value: translate('Minutes') },
{ key: 'hours', value: translate('Hours') },
{ key: 'days', value: translate('Days') },
{ key: 'weeks', value: translate('Weeks') },
{ key: 'months', value: translate('Months') }
];
function isInFilter(filterType) {
@@ -8,10 +8,11 @@ import DateFilterBuilderRowValue from './DateFilterBuilderRowValue';
import FilterBuilderRowValueConnector from './FilterBuilderRowValueConnector';
import ImportListFilterBuilderRowValueConnector from './ImportListFilterBuilderRowValueConnector';
import IndexerFilterBuilderRowValueConnector from './IndexerFilterBuilderRowValueConnector';
import MovieStatusFilterBuilderRowValue from './MovieStatusFilterBuilderRowValue';
import MinimumAvailabilityFilterBuilderRowValue from './MinimumAvailabilityFilterBuilderRowValue';
import ProtocolFilterBuilderRowValue from './ProtocolFilterBuilderRowValue';
import QualityFilterBuilderRowValueConnector from './QualityFilterBuilderRowValueConnector';
import QualityProfileFilterBuilderRowValueConnector from './QualityProfileFilterBuilderRowValueConnector';
import ReleaseStatusFilterBuilderRowValue from './ReleaseStatusFilterBuilderRowValue';
import TagFilterBuilderRowValueConnector from './TagFilterBuilderRowValueConnector';
import styles from './FilterBuilderRow.css';
@@ -69,8 +70,11 @@ function getRowValueConnector(selectedFilterBuilderProp) {
case filterBuilderValueTypes.QUALITY_PROFILE:
return QualityProfileFilterBuilderRowValueConnector;
case filterBuilderValueTypes.MOVIE_STATUS:
return MovieStatusFilterBuilderRowValue;
case filterBuilderValueTypes.RELEASE_STATUS:
return ReleaseStatusFilterBuilderRowValue;
case filterBuilderValueTypes.MINIMUM_AVAILABILITY:
return MinimumAvailabilityFilterBuilderRowValue;
case filterBuilderValueTypes.TAG:
return TagFilterBuilderRowValueConnector;
@@ -0,0 +1,20 @@
import React from 'react';
import translate from 'Utilities/String/translate';
import FilterBuilderRowValue from './FilterBuilderRowValue';
const protocols = [
{ id: 'announced', name: translate('Announced') },
{ id: 'inCinemas', name: translate('InCinemas') },
{ id: 'released', name: translate('Released') }
];
function MinimumAvailabilityFilterBuilderRowValue(props) {
return (
<FilterBuilderRowValue
tagList={protocols}
{...props}
/>
);
}
export default MinimumAvailabilityFilterBuilderRowValue;
@@ -1,21 +0,0 @@
import React from 'react';
import FilterBuilderRowValue from './FilterBuilderRowValue';
const protocols = [
{ id: 'tba', name: 'TBA' },
{ id: 'announced', name: 'Announced' },
{ id: 'inCinemas', name: 'In Cinemas' },
{ id: 'released', name: 'Released' },
{ id: 'deleted', name: 'Deleted' }
];
function MovieStatusFilterBuilderRowValue(props) {
return (
<FilterBuilderRowValue
tagList={protocols}
{...props}
/>
);
}
export default MovieStatusFilterBuilderRowValue;
@@ -0,0 +1,22 @@
import React from 'react';
import translate from 'Utilities/String/translate';
import FilterBuilderRowValue from './FilterBuilderRowValue';
const protocols = [
{ id: 'tba', name: 'TBA' },
{ id: 'announced', name: translate('Announced') },
{ id: 'inCinemas', name: translate('InCinemas') },
{ id: 'released', name: translate('Released') },
{ id: 'deleted', name: translate('Deleted') }
];
function ReleaseStatusFilterBuilderRowValue(props) {
return (
<FilterBuilderRowValue
tagList={protocols}
{...props}
/>
);
}
export default ReleaseStatusFilterBuilderRowValue;
@@ -1,12 +1,13 @@
import PropTypes from 'prop-types';
import React from 'react';
import translate from 'Utilities/String/translate';
import SelectInput from './SelectInput';
const availabilityOptions = [
{ key: 'announced', value: 'Announced' },
{ key: 'inCinemas', value: 'In Cinemas' },
{ key: 'released', value: 'Released' },
{ key: 'preDB', value: 'PreDB' }
{ key: 'announced', value: translate('Announced') },
{ key: 'inCinemas', value: translate('InCinemas') },
{ key: 'released', value: translate('Released') },
{ key: 'preDB', value: translate('PreDB') }
];
function AvailabilitySelectInput(props) {
@@ -2,34 +2,22 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { clearOptions, fetchOptions } from 'Store/Actions/providerOptionActions';
import { clearOptions, defaultState, fetchOptions } from 'Store/Actions/providerOptionActions';
import DeviceInput from './DeviceInput';
function createMapStateToProps() {
return createSelector(
(state, { value }) => value,
(state, { name }) => name,
(state) => state.providerOptions,
(value, name, devices) => {
const {
isFetching,
isPopulated,
error,
items
} = devices;
(state) => state.providerOptions.devices || defaultState,
(value, devices) => {
return {
isFetching,
isPopulated,
error,
items: items[name] || [],
...devices,
selectedDevices: value.map((valueDevice) => {
const sectionItems = items[name] || [];
// Disable equality ESLint rule so we don't need to worry about
// a type mismatch between the value items and the device ID.
// eslint-disable-next-line eqeqeq
const device = sectionItems.find((d) => d.id == valueDevice);
const device = devices.items.find((d) => d.id == valueDevice);
if (device) {
return {
@@ -63,7 +51,7 @@ class DeviceInputConnector extends Component {
}
componentWillUnmount = () => {
this.props.dispatchClearOptions();
this.props.dispatchClearOptions({ section: 'devices' });
}
//
@@ -73,14 +61,12 @@ class DeviceInputConnector extends Component {
const {
provider,
providerData,
dispatchFetchOptions,
requestAction,
name
dispatchFetchOptions
} = this.props;
dispatchFetchOptions({
action: requestAction,
itemSection: name,
section: 'devices',
action: 'getDevices',
provider,
providerData
});
@@ -109,7 +95,6 @@ class DeviceInputConnector extends Component {
DeviceInputConnector.propTypes = {
provider: PropTypes.string.isRequired,
providerData: PropTypes.object.isRequired,
requestAction: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired,
dispatchFetchOptions: PropTypes.func.isRequired,
@@ -5,6 +5,10 @@
align-items: center;
}
.editableContainer {
width: 100%;
}
.hasError {
composes: hasError from '~Components/Form/Input.css';
}
@@ -22,6 +26,16 @@
margin-left: 12px;
}
.dropdownArrowContainerEditable {
position: absolute;
top: 0;
right: 0;
padding-right: 17px;
width: 30%;
height: 35px;
text-align: right;
}
.dropdownArrowContainerDisabled {
composes: dropdownArrowContainer;
@@ -66,3 +80,8 @@
border-radius: 4px;
background-color: $white;
}
.loading {
display: inline-block;
margin: 5px -5px 5px 0;
}
@@ -5,6 +5,7 @@ import React, { Component } from 'react';
import { Manager, Popper, Reference } from 'react-popper';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import Measure from 'Components/Measure';
import Modal from 'Components/Modal/Modal';
import ModalBody from 'Components/Modal/ModalBody';
@@ -16,6 +17,7 @@ import getUniqueElememtId from 'Utilities/getUniqueElementId';
import { isMobile as isMobileUtil } from 'Utilities/mobile';
import HintedSelectInputOption from './HintedSelectInputOption';
import HintedSelectInputSelectedValue from './HintedSelectInputSelectedValue';
import TextInput from './TextInput';
import styles from './EnhancedSelectInput.css';
function isArrowKey(keyCode) {
@@ -58,11 +60,30 @@ function getSelectedIndex(props) {
values
} = props;
if (Array.isArray(value)) {
return values.findIndex((v) => {
return value.size && v.key === value[0];
});
}
return values.findIndex((v) => {
return v.key === value;
});
}
function isSelectedItem(index, props) {
const {
value,
values
} = props;
if (Array.isArray(value)) {
return value.includes(values[index].key);
}
return values[index].key === value;
}
function getKey(selectedIndex, values) {
return values[selectedIndex].key;
}
@@ -92,7 +113,7 @@ class EnhancedSelectInput extends Component {
this._scheduleUpdate();
}
if (prevProps.value !== this.props.value) {
if (!Array.isArray(this.props.value) && prevProps.value !== this.props.value) {
this.setState({
selectedIndex: getSelectedIndex(this.props)
});
@@ -134,7 +155,7 @@ class EnhancedSelectInput extends Component {
const button = document.getElementById(this._buttonId);
const options = document.getElementById(this._optionsId);
if (!button || this.state.isMobile) {
if (!button || !event.target.isConnected || this.state.isMobile) {
return;
}
@@ -149,11 +170,21 @@ class EnhancedSelectInput extends Component {
}
}
onFocus = () => {
if (this.state.isOpen) {
this._removeListener();
this.setState({ isOpen: false });
}
}
onBlur = () => {
// Calling setState without this check prevents the click event from being properly handled on Chrome (it is on firefox)
const origIndex = getSelectedIndex(this.props);
if (origIndex !== this.state.selectedIndex) {
this.setState({ selectedIndex: origIndex });
if (!this.props.isEditable) {
// Calling setState without this check prevents the click event from being properly handled on Chrome (it is on firefox)
const origIndex = getSelectedIndex(this.props);
if (origIndex !== this.state.selectedIndex) {
this.setState({ selectedIndex: origIndex });
}
}
}
@@ -177,7 +208,7 @@ class EnhancedSelectInput extends Component {
}
if (
selectedIndex == null ||
selectedIndex == null || selectedIndex === -1 ||
getSelectedOption(selectedIndex, values).isDisabled
) {
if (keyCode === keyCodes.UP_ARROW) {
@@ -231,16 +262,35 @@ class EnhancedSelectInput extends Component {
this._addListener();
}
if (!this.state.isOpen && this.props.onOpen) {
this.props.onOpen();
}
this.setState({ isOpen: !this.state.isOpen });
}
onSelect = (value) => {
this.setState({ isOpen: false });
if (Array.isArray(this.props.value)) {
let newValue = null;
const index = this.props.value.indexOf(value);
if (index === -1) {
newValue = this.props.values.map((v) => v.key).filter((v) => (v === value) || this.props.value.includes(v));
} else {
newValue = [...this.props.value];
newValue.splice(index, 1);
}
this.props.onChange({
name: this.props.name,
value: newValue
});
} else {
this.setState({ isOpen: false });
this.props.onChange({
name: this.props.name,
value
});
this.props.onChange({
name: this.props.name,
value
});
}
}
onMeasure = ({ width }) => {
@@ -258,14 +308,19 @@ class EnhancedSelectInput extends Component {
const {
className,
disabledClassName,
name,
value,
values,
isDisabled,
isEditable,
isFetching,
hasError,
hasWarning,
valueOptions,
selectedValueOptions,
selectedValueComponent: SelectedValueComponent,
optionComponent: OptionComponent
optionComponent: OptionComponent,
onChange
} = this.props;
const {
@@ -275,6 +330,7 @@ class EnhancedSelectInput extends Component {
isMobile
} = this.state;
const isMultiSelect = Array.isArray(value);
const selectedOption = getSelectedOption(selectedIndex, values);
return (
@@ -290,37 +346,94 @@ class EnhancedSelectInput extends Component {
whitelist={['width']}
onMeasure={this.onMeasure}
>
<Link
className={classNames(
className,
hasError && styles.hasError,
hasWarning && styles.hasWarning,
isDisabled && disabledClassName
)}
isDisabled={isDisabled}
onBlur={this.onBlur}
onKeyDown={this.onKeyDown}
onPress={this.onPress}
>
<SelectedValueComponent
{...selectedValueOptions}
{...selectedOption}
isDisabled={isDisabled}
>
{selectedOption ? selectedOption.value : null}
</SelectedValueComponent>
{
isEditable ?
<div
className={styles.editableContainer}
>
<TextInput
className={className}
name={name}
value={value}
readOnly={isDisabled}
hasError={hasError}
hasWarning={hasWarning}
onFocus={this.onFocus}
onBlur={this.onBlur}
onChange={onChange}
/>
<Link
className={classNames(
styles.dropdownArrowContainerEditable,
isDisabled ?
styles.dropdownArrowContainerDisabled :
styles.dropdownArrowContainer)
}
onPress={this.onPress}
>
{
isFetching &&
<LoadingIndicator
className={styles.loading}
size={20}
/>
}
<div
className={isDisabled ?
styles.dropdownArrowContainerDisabled :
styles.dropdownArrowContainer
}
>
<Icon
name={icons.CARET_DOWN}
/>
</div>
</Link>
{
!isFetching &&
<Icon
name={icons.CARET_DOWN}
/>
}
</Link>
</div> :
<Link
className={classNames(
className,
hasError && styles.hasError,
hasWarning && styles.hasWarning,
isDisabled && disabledClassName
)}
isDisabled={isDisabled}
onBlur={this.onBlur}
onKeyDown={this.onKeyDown}
onPress={this.onPress}
>
<SelectedValueComponent
value={value}
values={values}
{...selectedValueOptions}
{...selectedOption}
isDisabled={isDisabled}
isMultiSelect={isMultiSelect}
>
{selectedOption ? selectedOption.value : null}
</SelectedValueComponent>
<div
className={isDisabled ?
styles.dropdownArrowContainerDisabled :
styles.dropdownArrowContainer
}
>
{
isFetching &&
<LoadingIndicator
className={styles.loading}
size={20}
/>
}
{
!isFetching &&
<Icon
name={icons.CARET_DOWN}
/>
}
</div>
</Link>
}
</Measure>
</div>
)}
@@ -359,11 +472,17 @@ class EnhancedSelectInput extends Component {
>
{
values.map((v, index) => {
const hasParent = v.parentKey !== undefined;
const depth = hasParent ? 1 : 0;
const parentSelected = hasParent && value.includes(v.parentKey);
return (
<OptionComponent
key={v.key}
id={v.key}
isSelected={index === selectedIndex}
depth={depth}
isSelected={isSelectedItem(index, this.props)}
isDisabled={parentSelected}
isMultiSelect={isMultiSelect}
{...valueOptions}
{...v}
isMobile={false}
@@ -401,11 +520,17 @@ class EnhancedSelectInput extends Component {
<Scroller className={styles.optionsModalScroller}>
{
values.map((v, index) => {
const hasParent = v.parentKey !== undefined;
const depth = hasParent ? 1 : 0;
const parentSelected = hasParent && value.includes(v.parentKey);
return (
<OptionComponent
key={v.key}
id={v.key}
isSelected={index === selectedIndex}
depth={depth}
isSelected={isSelectedItem(index, this.props)}
isMultiSelect={isMultiSelect}
isDisabled={parentSelected}
{...valueOptions}
{...v}
isMobile={true}
@@ -429,15 +554,18 @@ EnhancedSelectInput.propTypes = {
className: PropTypes.string,
disabledClassName: PropTypes.string,
name: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.arrayOf(PropTypes.number)]).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired,
isDisabled: PropTypes.bool,
isDisabled: PropTypes.bool.isRequired,
isFetching: PropTypes.bool.isRequired,
isEditable: PropTypes.bool.isRequired,
hasError: PropTypes.bool,
hasWarning: PropTypes.bool,
valueOptions: PropTypes.object.isRequired,
selectedValueOptions: PropTypes.object.isRequired,
selectedValueComponent: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
optionComponent: PropTypes.elementType,
onOpen: PropTypes.func,
onChange: PropTypes.func.isRequired
};
@@ -445,6 +573,8 @@ EnhancedSelectInput.defaultProps = {
className: styles.enhancedSelect,
disabledClassName: styles.isDisabled,
isDisabled: false,
isFetching: false,
isEditable: false,
valueOptions: {},
selectedValueOptions: {},
selectedValueComponent: HintedSelectInputSelectedValue,
@@ -0,0 +1,159 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { clearOptions, defaultState, fetchOptions } from 'Store/Actions/providerOptionActions';
import EnhancedSelectInput from './EnhancedSelectInput';
const importantFieldNames = [
'baseUrl',
'apiPath',
'apiKey'
];
function getProviderDataKey(providerData) {
if (!providerData || !providerData.fields) {
return null;
}
const fields = providerData.fields
.filter((f) => importantFieldNames.includes(f.name))
.map((f) => f.value);
return fields;
}
function getSelectOptions(items) {
if (!items) {
return [];
}
return items.map((option) => {
return {
key: option.value,
value: option.name,
hint: option.hint,
parentKey: option.parentValue
};
});
}
function createMapStateToProps() {
return createSelector(
(state, { selectOptionsProviderAction }) => state.providerOptions[selectOptionsProviderAction] || defaultState,
(options) => {
if (options) {
return {
isFetching: options.isFetching,
values: getSelectOptions(options.items)
};
}
}
);
}
const mapDispatchToProps = {
dispatchFetchOptions: fetchOptions,
dispatchClearOptions: clearOptions
};
class EnhancedSelectInputConnector extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
refetchRequired: false
};
}
componentDidMount = () => {
this._populate();
}
componentDidUpdate = (prevProps) => {
const prevKey = getProviderDataKey(prevProps.providerData);
const nextKey = getProviderDataKey(this.props.providerData);
if (!_.isEqual(prevKey, nextKey)) {
this.setState({ refetchRequired: true });
}
}
componentWillUnmount = () => {
this._cleanup();
}
//
// Listeners
onOpen = () => {
if (this.state.refetchRequired) {
this._populate();
}
}
//
// Control
_populate() {
const {
provider,
providerData,
selectOptionsProviderAction,
dispatchFetchOptions
} = this.props;
if (selectOptionsProviderAction) {
this.setState({ refetchRequired: false });
dispatchFetchOptions({
section: selectOptionsProviderAction,
action: selectOptionsProviderAction,
provider,
providerData
});
}
}
_cleanup() {
const {
selectOptionsProviderAction,
dispatchClearOptions
} = this.props;
if (selectOptionsProviderAction) {
dispatchClearOptions({ section: selectOptionsProviderAction });
}
}
//
// Render
render() {
return (
<EnhancedSelectInput
{...this.props}
onOpen={this.onOpen}
/>
);
}
}
EnhancedSelectInputConnector.propTypes = {
provider: PropTypes.string.isRequired,
providerData: PropTypes.object.isRequired,
name: PropTypes.string.isRequired,
value: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.number, PropTypes.string])).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired,
selectOptionsProviderAction: PropTypes.string,
onChange: PropTypes.func.isRequired,
isFetching: PropTypes.bool.isRequired,
dispatchFetchOptions: PropTypes.func.isRequired,
dispatchClearOptions: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(EnhancedSelectInputConnector);
@@ -11,6 +11,18 @@
}
}
.optionCheck {
composes: container from '~./CheckInput.css';
flex: 0 0 0;
}
.optionCheckInput {
composes: input from '~./CheckInput.css';
margin-top: 0;
}
.isSelected {
background-color: #e2e2e2;
@@ -4,6 +4,7 @@ import React, { Component } from 'react';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import { icons } from 'Helpers/Props';
import CheckInput from './CheckInput';
import styles from './EnhancedSelectInputOption.css';
class EnhancedSelectInputOption extends Component {
@@ -20,15 +21,22 @@ class EnhancedSelectInputOption extends Component {
onSelect(id);
}
onCheckPress = () => {
// CheckInput requires a handler. Swallow the change event because onPress will already handle it via event propagation.
}
//
// Render
render() {
const {
className,
id,
depth,
isSelected,
isDisabled,
isHidden,
isMultiSelect,
isMobile,
children
} = this.props;
@@ -37,8 +45,8 @@ class EnhancedSelectInputOption extends Component {
<Link
className={classNames(
className,
isSelected && styles.isSelected,
isDisabled && styles.isDisabled,
isSelected && !isMultiSelect && styles.isSelected,
isDisabled && !isMultiSelect && styles.isDisabled,
isHidden && styles.isHidden,
isMobile && styles.isMobile
)}
@@ -46,6 +54,24 @@ class EnhancedSelectInputOption extends Component {
isDisabled={isDisabled}
onPress={this.onPress}
>
{
depth !== 0 &&
<div style={{ width: `${depth * 20}px` }} />
}
{
isMultiSelect &&
<CheckInput
className={styles.optionCheckInput}
containerClassName={styles.optionCheck}
name={`select-${id}`}
value={isSelected}
isDisabled={isDisabled}
onChange={this.onCheckPress}
/>
}
{children}
{
@@ -64,9 +90,11 @@ class EnhancedSelectInputOption extends Component {
EnhancedSelectInputOption.propTypes = {
className: PropTypes.string.isRequired,
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
depth: PropTypes.number.isRequired,
isSelected: PropTypes.bool.isRequired,
isDisabled: PropTypes.bool.isRequired,
isHidden: PropTypes.bool.isRequired,
isMultiSelect: PropTypes.bool.isRequired,
isMobile: PropTypes.bool.isRequired,
children: PropTypes.node.isRequired,
onSelect: PropTypes.func.isRequired
@@ -74,8 +102,10 @@ EnhancedSelectInputOption.propTypes = {
EnhancedSelectInputOption.defaultProps = {
className: styles.option,
depth: 0,
isDisabled: false,
isHidden: false
isHidden: false,
isMultiSelect: false
};
export default EnhancedSelectInputOption;
+12 -1
View File
@@ -9,7 +9,9 @@ import CaptchaInputConnector from './CaptchaInputConnector';
import CheckInput from './CheckInput';
import DeviceInputConnector from './DeviceInputConnector';
import EnhancedSelectInput from './EnhancedSelectInput';
import EnhancedSelectInputConnector from './EnhancedSelectInputConnector';
import FormInputHelpText from './FormInputHelpText';
import IndexerFlagsSelectInputConnector from './IndexerFlagsSelectInputConnector';
import KeyValueListInput from './KeyValueListInput';
import MovieMonitoredSelectInput from './MovieMonitoredSelectInput';
import NumberInput from './NumberInput';
@@ -23,6 +25,7 @@ import TagSelectInputConnector from './TagSelectInputConnector';
import TextArea from './TextArea';
import TextInput from './TextInput';
import TextTagInputConnector from './TextTagInputConnector';
import UMaskInput from './UMaskInput';
import styles from './FormInputGroup.css';
function getComponent(type) {
@@ -66,9 +69,14 @@ function getComponent(type) {
case inputTypes.ROOT_FOLDER_SELECT:
return RootFolderSelectInputConnector;
case inputTypes.INDEXER_FLAGS_SELECT:
return IndexerFlagsSelectInputConnector;
case inputTypes.SELECT:
return EnhancedSelectInput;
case inputTypes.DYNAMIC_SELECT:
return EnhancedSelectInputConnector;
case inputTypes.TAG:
return TagInputConnector;
@@ -81,6 +89,9 @@ function getComponent(type) {
case inputTypes.TAG_SELECT:
return TagSelectInputConnector;
case inputTypes.UMASK:
return UMaskInput;
default:
return TextInput;
}
@@ -188,7 +199,7 @@ function FormInputGroup(props) {
}
{
!checkInput && helpTextWarning &&
(!checkInput || helpText) && helpTextWarning &&
<FormInputHelpText
text={helpTextWarning}
isWarning={true}
@@ -6,14 +6,25 @@ import styles from './HintedSelectInputOption.css';
function HintedSelectInputOption(props) {
const {
id,
value,
hint,
depth,
isSelected,
isDisabled,
isMultiSelect,
isMobile,
...otherProps
} = props;
return (
<EnhancedSelectInputOption
id={id}
depth={depth}
isSelected={isSelected}
isDisabled={isDisabled}
isHidden={isDisabled}
isMultiSelect={isMultiSelect}
isMobile={isMobile}
{...otherProps}
>
@@ -36,9 +47,20 @@ function HintedSelectInputOption(props) {
}
HintedSelectInputOption.propTypes = {
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
value: PropTypes.string.isRequired,
hint: PropTypes.node,
depth: PropTypes.number,
isSelected: PropTypes.bool.isRequired,
isDisabled: PropTypes.bool.isRequired,
isMultiSelect: PropTypes.bool.isRequired,
isMobile: PropTypes.bool.isRequired
};
HintedSelectInputOption.defaultProps = {
isDisabled: false,
isHidden: false,
isMultiSelect: false
};
export default HintedSelectInputOption;
@@ -1,23 +1,43 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React from 'react';
import Label from 'Components/Label';
import EnhancedSelectInputSelectedValue from './EnhancedSelectInputSelectedValue';
import styles from './HintedSelectInputSelectedValue.css';
function HintedSelectInputSelectedValue(props) {
const {
value,
values,
hint,
isMultiSelect,
includeHint,
...otherProps
} = props;
const valuesMap = isMultiSelect && _.keyBy(values, 'key');
return (
<EnhancedSelectInputSelectedValue
className={styles.selectedValue}
{...otherProps}
>
<div className={styles.valueText}>
{value}
{
isMultiSelect &&
value.map((key, index) => {
const v = valuesMap[key];
return (
<Label key={key}>
{v ? v.value : key}
</Label>
);
})
}
{
!isMultiSelect && value
}
</div>
{
@@ -31,12 +51,15 @@ function HintedSelectInputSelectedValue(props) {
}
HintedSelectInputSelectedValue.propTypes = {
value: PropTypes.string,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number]))]).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired,
hint: PropTypes.string,
isMultiSelect: PropTypes.bool.isRequired,
includeHint: PropTypes.bool.isRequired
};
HintedSelectInputSelectedValue.defaultProps = {
isMultiSelect: false,
includeHint: true
};
@@ -0,0 +1,70 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import EnhancedSelectInput from './EnhancedSelectInput';
function createMapStateToProps() {
return createSelector(
(state, { indexerFlags }) => indexerFlags,
(state) => state.settings.indexerFlags,
(selectedFlags, indexerFlags) => {
const value = [];
indexerFlags.items.forEach((item) => {
// eslint-disable-next-line no-bitwise
if ((selectedFlags & item.id) === item.id) {
value.push(item.id);
}
});
const values = indexerFlags.items.map(({ id, name }) => {
return {
key: id,
value: name
};
});
return {
value,
values
};
}
);
}
class IndexerFlagsSelectInputConnector extends Component {
onChange = ({ name, value }) => {
let indexerFlags = 0;
value.forEach((flagId) => {
indexerFlags += flagId;
});
this.props.onChange({ name, value: indexerFlags });
}
//
// Render
render() {
return (
<EnhancedSelectInput
{...this.props}
onChange={this.onChange}
/>
);
}
}
IndexerFlagsSelectInputConnector.propTypes = {
name: PropTypes.string.isRequired,
indexerFlags: PropTypes.number.isRequired,
value: PropTypes.arrayOf(PropTypes.number).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired,
onChange: PropTypes.func.isRequired
};
export default connect(createMapStateToProps)(IndexerFlagsSelectInputConnector);
@@ -98,7 +98,9 @@ class KeyValueListInput extends Component {
className,
value,
keyPlaceholder,
valuePlaceholder
valuePlaceholder,
hasError,
hasWarning
} = this.props;
const { isFocused } = this.state;
@@ -106,7 +108,9 @@ class KeyValueListInput extends Component {
return (
<div className={classNames(
className,
isFocused && styles.isFocused
isFocused && styles.isFocused,
hasError && styles.hasError,
hasWarning && styles.hasWarning
)}
>
{
@@ -1,10 +1,11 @@
import PropTypes from 'prop-types';
import React from 'react';
import translate from 'Utilities/String/translate';
import SelectInput from './SelectInput';
const monitorTypesOptions = [
{ key: 'true', value: 'True' },
{ key: 'false', value: 'False' }
{ key: 'true', value: translate('Yes') },
{ key: 'false', value: translate('No') }
];
function MovieMonitoredSelectInput(props) {
@@ -3,10 +3,17 @@ import React from 'react';
import TextInput from './TextInput';
import styles from './PasswordInput.css';
// Prevent a user from copying (or cutting) the password from the input
function onCopy(e) {
e.preventDefault();
e.nativeEvent.stopImmediatePropagation();
}
function PasswordInput(props) {
return (
<TextInput
{...props}
onCopy={onCopy}
/>
);
}
@@ -6,7 +6,7 @@ import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props';
function getType(type) {
function getType({ type, selectOptionsProviderAction }) {
switch (type) {
case 'captcha':
return inputTypes.CAPTCHA;
@@ -23,6 +23,9 @@ function getType(type) {
case 'filePath':
return inputTypes.PATH;
case 'select':
if (selectOptionsProviderAction) {
return inputTypes.DYNAMIC_SELECT;
}
return inputTypes.SELECT;
case 'tag':
return inputTypes.TEXT_TAG;
@@ -45,7 +48,8 @@ function getSelectValues(selectOptions) {
return _.reduce(selectOptions, (result, option) => {
result.push({
key: option.value,
value: option.name
value: option.name,
hint: option.hint
});
return result;
@@ -62,7 +66,6 @@ function ProviderFieldFormGroup(props) {
value,
type,
advanced,
requestAction,
hidden,
pending,
errors,
@@ -87,7 +90,7 @@ function ProviderFieldFormGroup(props) {
<FormLabel>{label}</FormLabel>
<FormInputGroup
type={getType(type)}
type={getType(props)}
name={name}
label={label}
helpText={helpText}
@@ -99,7 +102,6 @@ function ProviderFieldFormGroup(props) {
pending={pending}
includeFiles={type === 'filePath' ? true : undefined}
onChange={onChange}
requestAction={requestAction}
{...otherProps}
/>
</FormGroup>
@@ -108,7 +110,8 @@ function ProviderFieldFormGroup(props) {
const selectOptionsShape = {
name: PropTypes.string.isRequired,
value: PropTypes.number.isRequired
value: PropTypes.number.isRequired,
hint: PropTypes.string
};
ProviderFieldFormGroup.propTypes = {
@@ -120,12 +123,12 @@ ProviderFieldFormGroup.propTypes = {
value: PropTypes.any,
type: PropTypes.string.isRequired,
advanced: PropTypes.bool.isRequired,
requestAction: PropTypes.string,
hidden: PropTypes.string,
pending: PropTypes.bool.isRequired,
errors: PropTypes.arrayOf(PropTypes.object).isRequired,
warnings: PropTypes.arrayOf(PropTypes.object).isRequired,
selectOptions: PropTypes.arrayOf(PropTypes.shape(selectOptionsShape)),
selectOptionsProviderAction: PropTypes.string,
onChange: PropTypes.func.isRequired
};
@@ -15,10 +15,12 @@
.value {
display: flex;
max-width: 500px;
}
.movieFolder {
flex: 0 0 auto;
@add-mixin truncate;
color: $disabledColor;
}
+5 -1
View File
@@ -130,7 +130,8 @@ class TextInput extends Component {
step,
min,
max,
onBlur
onBlur,
onCopy
} = this.props;
return (
@@ -155,6 +156,8 @@ class TextInput extends Component {
onChange={this.onChange}
onFocus={this.onFocus}
onBlur={onBlur}
onCopy={onCopy}
onCut={onCopy}
onKeyUp={this.onKeyUp}
onMouseDown={this.onMouseDown}
onMouseUp={this.onMouseUp}
@@ -180,6 +183,7 @@ TextInput.propTypes = {
onChange: PropTypes.func.isRequired,
onFocus: PropTypes.func,
onBlur: PropTypes.func,
onCopy: PropTypes.func,
onSelectionChange: PropTypes.func
};
@@ -0,0 +1,53 @@
.inputWrapper {
display: flex;
}
.inputFolder {
composes: input from '~Components/Form/Input.css';
max-width: 100px;
}
.inputUnitWrapper {
position: relative;
width: 100%;
}
.inputUnit {
composes: inputUnit from '~Components/Form/FormInputGroup.css';
right: 40px;
font-family: $monoSpaceFontFamily;
}
.unit {
font-family: $monoSpaceFontFamily;
}
.details {
margin-top: 5px;
margin-left: 17px;
line-height: 20px;
> div {
display: flex;
label {
flex: 0 0 50px;
}
.value {
width: 50px;
text-align: right;
}
.unit {
width: 90px;
text-align: right;
}
}
}
.readOnly {
background-color: #eee;
}
+133
View File
@@ -0,0 +1,133 @@
/* eslint-disable no-bitwise */
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import EnhancedSelectInput from './EnhancedSelectInput';
import styles from './UMaskInput.css';
const umaskOptions = [
{
key: '755',
value: '755 - Owner write, Everyone else read',
hint: 'drwxr-xr-x'
},
{
key: '775',
value: '775 - Owner & Group write, Other read',
hint: 'drwxrwxr-x'
},
{
key: '770',
value: '770 - Owner & Group write',
hint: 'drwxrwx---'
},
{
key: '750',
value: '750 - Owner write, Group read',
hint: 'drwxr-x---'
},
{
key: '777',
value: '777 - Everyone write',
hint: 'drwxrwxrwx'
}
];
function formatPermissions(permissions) {
const hasSticky = permissions & 0o1000;
const hasSetGID = permissions & 0o2000;
const hasSetUID = permissions & 0o4000;
let result = '';
for (let i = 0; i < 9; i++) {
const bit = (permissions & (1 << i)) !== 0;
let digit = bit ? 'xwr'[i % 3] : '-';
if (i === 6 && hasSetUID) {
digit = bit ? 's' : 'S';
} else if (i === 3 && hasSetGID) {
digit = bit ? 's' : 'S';
} else if (i === 0 && hasSticky) {
digit = bit ? 't' : 'T';
}
result = digit + result;
}
return result;
}
class UMaskInput extends Component {
//
// Render
render() {
const {
name,
value,
onChange
} = this.props;
const valueNum = parseInt(value, 8);
const umaskNum = 0o777 & ~valueNum;
const umask = umaskNum.toString(8).padStart(4, '0');
const folderNum = 0o777 & ~umaskNum;
const folder = folderNum.toString(8).padStart(3, '0');
const fileNum = 0o666 & ~umaskNum;
const file = fileNum.toString(8).padStart(3, '0');
const unit = formatPermissions(folderNum);
const values = umaskOptions.map((v) => {
return { ...v, hint: <span className={styles.unit}>{v.hint}</span> };
});
return (
<div>
<div className={styles.inputWrapper}>
<div className={styles.inputUnitWrapper}>
<EnhancedSelectInput
name={name}
value={value}
values={values}
isEditable={true}
onChange={onChange}
/>
<div className={styles.inputUnit}>
d{unit}
</div>
</div>
</div>
<div className={styles.details}>
<div>
<label>UMask</label>
<div className={styles.value}>{umask}</div>
</div>
<div>
<label>Folder</label>
<div className={styles.value}>{folder}</div>
<div className={styles.unit}>d{formatPermissions(folderNum)}</div>
</div>
<div>
<label>File</label>
<div className={styles.value}>{file}</div>
<div className={styles.unit}>{formatPermissions(fileNum)}</div>
</div>
</div>
</div>
);
}
}
UMaskInput.propTypes = {
name: PropTypes.string.isRequired,
value: PropTypes.string.isRequired,
hasError: PropTypes.bool,
hasWarning: PropTypes.bool,
onChange: PropTypes.func.isRequired,
onFocus: PropTypes.func,
onBlur: PropTypes.func
};
export default UMaskInput;
-4
View File
@@ -47,10 +47,6 @@ class Link extends Component {
el = 'a';
linkProps.href = to;
linkProps.target = target || '_self';
} else if (to.startsWith(`${window.Radarr.urlBase}/`)) {
el = RouterLink;
linkProps.to = to;
linkProps.target = target;
} else {
el = RouterLink;
linkProps.to = `${window.Radarr.urlBase}/${to.replace(/^\//, '')}`;
@@ -2,8 +2,24 @@ import React from 'react';
import styles from './LoadingMessage.css';
const messages = [
'Welcome to Radarr Aphrodite Preview. Enjoy'
// TODO Add some messages here
'Downloading more RAM',
'Now in Technicolor',
'Previously on Radarr...',
'Bleep Bloop.',
'Locating the required gigapixels to render...',
'Spinning up the hamster wheel...',
'At least you\'re not on hold',
'Hum something loud while others stare',
'Loading humorous message... Please Wait',
'I could\'ve been faster in Python',
'Don\'t forget to rewind your tracks',
'Congratulations! you are the 1000th visitor.',
'HELP! I\'m being held hostage and forced to write these stupid lines!',
'RE-calibrating the internet...',
'I\'ll be here all week',
'Don\'t forget to tip your waitress',
'Apply directly to the forehead',
'Loading Battlestation'
];
let message = null;
@@ -53,7 +53,7 @@ class PageHeader extends Component {
return (
<div className={styles.header}>
<div className={styles.logoContainer}>
<Link to={`${window.Radarr.urlBase}/`}>
<Link to={'/'}>
<img
className={isSmallScreen ? styles.logo : styles.logoFull}
src={isSmallScreen ? `${window.Radarr.urlBase}/Content/Images/logo.png` : `${window.Radarr.urlBase}/Content/Images/logo-full.png`}
+14 -1
View File
@@ -6,7 +6,7 @@ import { createSelector } from 'reselect';
import { saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions';
import { fetchCustomFilters } from 'Store/Actions/customFilterActions';
import { fetchMovies } from 'Store/Actions/movieActions';
import { fetchImportLists, fetchLanguages, fetchQualityProfiles, fetchUISettings } from 'Store/Actions/settingsActions';
import { fetchImportLists, fetchIndexerFlags, fetchLanguages, fetchQualityProfiles, fetchUISettings } from 'Store/Actions/settingsActions';
import { fetchStatus } from 'Store/Actions/systemActions';
import { fetchTags } from 'Store/Actions/tagActions';
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
@@ -48,6 +48,7 @@ const selectIsPopulated = createSelector(
(state) => state.settings.ui.isPopulated,
(state) => state.settings.qualityProfiles.isPopulated,
(state) => state.settings.languages.isPopulated,
(state) => state.settings.indexerFlags.isPopulated,
(state) => state.settings.importLists.isPopulated,
(state) => state.system.status.isPopulated,
(
@@ -56,6 +57,7 @@ const selectIsPopulated = createSelector(
uiSettingsIsPopulated,
qualityProfilesIsPopulated,
languagesIsPopulated,
indexerFlagsIsPopulated,
importListsIsPopulated,
systemStatusIsPopulated
) => {
@@ -65,6 +67,7 @@ const selectIsPopulated = createSelector(
uiSettingsIsPopulated &&
qualityProfilesIsPopulated &&
languagesIsPopulated &&
indexerFlagsIsPopulated &&
importListsIsPopulated &&
systemStatusIsPopulated
);
@@ -77,6 +80,7 @@ const selectErrors = createSelector(
(state) => state.settings.ui.error,
(state) => state.settings.qualityProfiles.error,
(state) => state.settings.languages.error,
(state) => state.settings.indexerFlags.error,
(state) => state.settings.importLists.error,
(state) => state.system.status.error,
(
@@ -85,6 +89,7 @@ const selectErrors = createSelector(
uiSettingsError,
qualityProfilesError,
languagesError,
indexerFlagsError,
importListsError,
systemStatusError
) => {
@@ -94,6 +99,7 @@ const selectErrors = createSelector(
uiSettingsError ||
qualityProfilesError ||
languagesError ||
indexerFlagsError ||
importListsError ||
systemStatusError
);
@@ -105,6 +111,7 @@ const selectErrors = createSelector(
uiSettingsError,
qualityProfilesError,
languagesError,
indexerFlagsError,
importListsError,
systemStatusError
};
@@ -153,6 +160,9 @@ function createMapDispatchToProps(dispatch, props) {
dispatchFetchLanguages() {
dispatch(fetchLanguages());
},
dispatchFetchIndexerFlags() {
dispatch(fetchIndexerFlags());
},
dispatchFetchImportLists() {
dispatch(fetchImportLists());
},
@@ -191,6 +201,7 @@ class PageConnector extends Component {
this.props.dispatchFetchTags();
this.props.dispatchFetchQualityProfiles();
this.props.dispatchFetchLanguages();
this.props.dispatchFetchIndexerFlags();
this.props.dispatchFetchImportLists();
this.props.dispatchFetchUISettings();
this.props.dispatchFetchStatus();
@@ -215,6 +226,7 @@ class PageConnector extends Component {
dispatchFetchTags,
dispatchFetchQualityProfiles,
dispatchFetchLanguages,
dispatchFetchIndexerFlags,
dispatchFetchImportLists,
dispatchFetchUISettings,
dispatchFetchStatus,
@@ -254,6 +266,7 @@ PageConnector.propTypes = {
dispatchFetchTags: PropTypes.func.isRequired,
dispatchFetchQualityProfiles: PropTypes.func.isRequired,
dispatchFetchLanguages: PropTypes.func.isRequired,
dispatchFetchIndexerFlags: PropTypes.func.isRequired,
dispatchFetchImportLists: PropTypes.func.isRequired,
dispatchFetchUISettings: PropTypes.func.isRequired,
dispatchFetchStatus: PropTypes.func.isRequired,
@@ -30,7 +30,7 @@ const links = [
to: '/add/new'
},
{
title: translate('Import'),
title: translate('ImportLibrary'),
to: '/add/import'
},
{
@@ -1,4 +1,3 @@
import _ from 'lodash';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
@@ -8,12 +7,12 @@ function createMapStateToProps() {
return createSelector(
createUISettingsSelector(),
(uiSettings) => {
return _.pick(uiSettings, [
'showRelativeDates',
'shortDateFormat',
'longDateFormat',
'timeFormat'
]);
return {
showRelativeDates: uiSettings.showRelativeDates,
shortDateFormat: uiSettings.shortDateFormat,
longDateFormat: uiSettings.longDateFormat,
timeFormat: uiSettings.timeFormat
};
}
);
}
@@ -2,7 +2,7 @@ import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { DndProvider } from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';
import { HTML5Backend } from 'react-dnd-html5-backend';
import Form from 'Components/Form/Form';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
@@ -156,3 +156,35 @@
.body {
padding: 5px;
}
.verticalContainer {
max-height: 300px;
}
.horizontalContainer {
max-width: calc($breakpointExtraSmall - 20px);
}
@media only screen and (min-width: $breakpointExtraSmall) {
.horizontalContainer {
max-width: calc($breakpointSmall * 0.8);
}
}
@media only screen and (min-width: $breakpointSmall) {
.horizontalContainer {
max-width: calc($breakpointMedium * 0.8);
}
}
@media only screen and (min-width: $breakpointMedium) {
.horizontalContainer {
max-width: calc($breakpointLarge * 0.8);
}
}
/* @media only screen and (max-width: $breakpointLarge) {
.horizontalContainer {
max-width: calc($breakpointLarge * 0.8);
}
} */
+33 -5
View File
@@ -4,9 +4,28 @@ import React, { Component } from 'react';
import { Manager, Popper, Reference } from 'react-popper';
import Portal from 'Components/Portal';
import { kinds, tooltipPositions } from 'Helpers/Props';
import dimensions from 'Styles/Variables/dimensions';
import { isMobile as isMobileUtil } from 'Utilities/mobile';
import styles from './Tooltip.css';
let maxWidth = null;
function getMaxWidth() {
const windowWidth = window.innerWidth;
if (windowWidth >= parseInt(dimensions.breakpointLarge)) {
maxWidth = 800;
} else if (windowWidth >= parseInt(dimensions.breakpointMedium)) {
maxWidth = 650;
} else if (windowWidth >= parseInt(dimensions.breakpointSmall)) {
maxWidth = 500;
} else {
maxWidth = 450;
}
return maxWidth;
}
class Tooltip extends Component {
//
@@ -17,6 +36,7 @@ class Tooltip extends Component {
this._scheduleUpdate = null;
this._closeTimeout = null;
this._maxWidth = maxWidth || getMaxWidth();
this.state = {
isOpen: false
@@ -54,9 +74,11 @@ class Tooltip extends Component {
} else if ((/^bottom/).test(data.placement)) {
data.styles.maxHeight = windowHeight - bottom - 20;
} else if ((/^right/).test(data.placement)) {
data.styles.maxWidth = windowWidth - right - 50;
data.styles.maxWidth = Math.min(this._maxWidth, windowWidth - right - 20);
data.styles.maxHeight = top - 20;
} else {
data.styles.maxWidth = left - 35;
data.styles.maxWidth = Math.min(this._maxWidth, left - 20);
data.styles.maxHeight = top - 20;
}
return data;
@@ -144,10 +166,16 @@ class Tooltip extends Component {
{({ ref, style, placement, arrowProps, scheduleUpdate }) => {
this._scheduleUpdate = scheduleUpdate;
const popperPlacement = placement ? placement.split('-')[0] : position;
const vertical = popperPlacement === 'top' || popperPlacement === 'bottom';
return (
<div
ref={ref}
className={styles.tooltipContainer}
className={classNames(
styles.tooltipContainer,
vertical ? styles.verticalContainer : styles.horizontalContainer
)}
style={style}
onMouseEnter={this.onMouseEnter}
onMouseLeave={this.onMouseLeave}
@@ -156,7 +184,7 @@ class Tooltip extends Component {
className={this.state.isOpen ? classNames(
styles.arrow,
styles[kind],
styles[placement.split('-')[0]]
styles[popperPlacement]
) : styles.arrowDisabled}
ref={arrowProps.ref}
style={arrowProps.style}
@@ -201,7 +229,7 @@ Tooltip.defaultProps = {
bodyClassName: styles.body,
kind: kinds.DEFAULT,
position: tooltipPositions.TOP,
canFlip: true
canFlip: false
};
export default Tooltip;
+2
View File
@@ -0,0 +1,2 @@
User-agent: *
Disallow: /
@@ -53,13 +53,14 @@ class AddNewDiscoverMovieModalContentConnector extends Component {
this.props.setAddMovieDefault({ [name]: value });
}
onAddMoviePress = (searchForMovie) => {
onAddMoviePress = () => {
const {
tmdbId,
rootFolderPath,
monitor,
qualityProfileId,
minimumAvailability,
searchForMovie,
tags
} = this.props;
@@ -69,8 +70,8 @@ class AddNewDiscoverMovieModalContentConnector extends Component {
monitor: monitor.value,
qualityProfileId: qualityProfileId.value,
minimumAvailability: minimumAvailability.value,
tags: tags.value,
searchForMovie
searchForMovie: searchForMovie.value,
tags: tags.value
});
this.props.onModalClose(true);
@@ -96,6 +97,7 @@ AddNewDiscoverMovieModalContentConnector.propTypes = {
monitor: PropTypes.object.isRequired,
qualityProfileId: PropTypes.object,
minimumAvailability: PropTypes.object.isRequired,
searchForMovie: PropTypes.object.isRequired,
tags: PropTypes.object.isRequired,
onModalClose: PropTypes.func.isRequired,
setAddMovieDefault: PropTypes.func.isRequired,
+1 -1
View File
@@ -279,7 +279,7 @@ class DiscoverMovie extends Component {
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label='Refresh Lists'
label={translate('RefreshLists')}
iconName={icons.REFRESH}
isSpinning={isSyncingLists}
isDisabled={hasNoMovie}
@@ -138,8 +138,8 @@ class DiscoverMovieFooter extends Component {
} = this.state;
const monitoredOptions = [
{ key: true, value: 'Monitored' },
{ key: false, value: 'Unmonitored' }
{ key: true, value: translate('Monitored') },
{ key: false, value: translate('Unmonitored') }
];
return (
@@ -38,7 +38,7 @@ class ExcludeMovieModalContent extends Component {
<ModalBody>
<div className={styles.pathContainer}>
Exclude {title}? This will prevent Radarr from adding automatically via list sync.
{translate('ExcludeTitle', [title])}
</div>
</ModalBody>
@@ -4,6 +4,7 @@ import MenuContent from 'Components/Menu/MenuContent';
import SortMenu from 'Components/Menu/SortMenu';
import SortMenuItem from 'Components/Menu/SortMenuItem';
import { align, sortDirections } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function DiscoverMovieSortMenu(props) {
const {
@@ -25,7 +26,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
Status
{translate('Status')}
</SortMenuItem>
<SortMenuItem
@@ -34,7 +35,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
Title
{translate('Title')}
</SortMenuItem>
<SortMenuItem
@@ -43,7 +44,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
Studio
{translate('Studio')}
</SortMenuItem>
<SortMenuItem
@@ -52,7 +53,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
In Cinemas
{translate('InCinemas')}
</SortMenuItem>
<SortMenuItem
@@ -61,7 +62,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
Physical Release
{translate('PhysicalRelease')}
</SortMenuItem>
<SortMenuItem
@@ -70,7 +71,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
Digital Release
{translate('DigitalRelease')}
</SortMenuItem>
<SortMenuItem
@@ -79,7 +80,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
Runtime
{translate('Runtime')}
</SortMenuItem>
<SortMenuItem
@@ -88,7 +89,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
Rating
{translate('Rating')}
</SortMenuItem>
<SortMenuItem
@@ -97,7 +98,7 @@ function DiscoverMovieSortMenu(props) {
sortDirection={sortDirection}
onPress={onSortSelect}
>
Certification
{translate('Certification')}
</SortMenuItem>
</MenuContent>
</SortMenu>

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