1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-18 16:24:34 -04:00

Compare commits

...

170 Commits

Author SHA1 Message Date
Qstick
976712d6d7 Add back min availability to bulk movie edit 2023-05-14 07:50:55 -05:00
Lars Erik Helø
b32d168742 Clean up variable name case 2023-05-13 12:40:07 -05:00
Lars Erik Helø
20301bdb78 Fix Radarr import syncing not matching any root folders.
Old logic would look for a rootFolderPath in the API response from the source instance and try to match it to the selected root folders in list settings. Thiis property is returned by Sonarr, but Radarr only returns a full Path.
2023-05-13 12:40:07 -05:00
Bogdan
64e524633c Fix MovieFileLanguageConnector to use MovieLanguage 2023-05-13 20:29:05 +03:00
Bogdan
d8b724346c Update UI dependencies 2023-05-13 20:29:05 +03:00
Benjamin Staneck
de010ce536 Add inset to stylelintrc
(cherry picked from commit 6a49f3989a17898c957df8777f0cbb19af647804)
2023-05-13 20:29:05 +03:00
Benjamin Staneck
c9b09faae9 Remove unused babel plugins and fix build with profiling
(cherry picked from commit d79f42351fd3d61d180a224d4b8fb51184eb347e)
2023-05-13 20:29:05 +03:00
Benjamin Staneck
8a49463053 Update all relevant dev tool deps
Delete esformatter

Address lint failures

Delete unknown component property

remove deprecated stylelint rules

Address stylelint violation

Update rimraf

(cherry picked from commit 4aba540b894729c730640f03b2f96c451af2dba0)
2023-05-13 20:29:05 +03:00
Benjamin Staneck
0a89c4d110 Delete various old config files
Delete `jsconfig.json`

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

Delete `.jsbeautifyrc`

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

Delete `.csscomb.json`

Was not used from what I could tell, also the project seems dead, last publish 4 years ago. Also we have stylelint in place that covers CSS.

(cherry picked from commit 0da89478cc7a5eec7a35bff47e34b824487661a1)
2023-05-13 20:29:05 +03:00
Bogdan
401edeabba Use await using in LocalizationService 2023-05-13 20:09:34 +03:00
Qstick
abddce1cfa Fixed: Provider health checks persist after add until next scheduled check
(cherry picked from commit 202449c40c82c6dfd2d15844c578436bbe3c8872)

Close #8505
2023-05-13 16:24:51 +03:00
Weblate
3350071a83 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 100.0% (1173 of 1173 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 99.8% (1171 of 1173 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1172 of 1172 strings)

Co-authored-by: Antoine <coderademii@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translation: Servarr/Radarr
2023-05-13 05:39:59 +03:00
Mark McDowall
223eddeb0b New: Log additional information when processing completed torrents from rTorrent
(cherry picked from commit c7d39579b45adbe1b9da3baff587b2d7b7c9724b)
2023-05-13 05:39:19 +03:00
Mark McDowall
a953d1a6c5 Fix function name and use out var for try get in DownloadClientProvider 2023-05-13 04:50:37 +03:00
Bogdan
38d946ed79 Add Pull Request Labeler 2023-05-12 21:48:15 +03:00
Bogdan
e0389ca08c API key improvements
Fixed: Special characters in API key
New: Add heathcheck for API Key

(cherry picked from commit 9325140b90f8ac625ae5b26075748c22f6f06158)
2023-05-10 14:55:57 +03:00
Weblate
d021517f4b Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
Currently translated at 99.8% (1166 of 1168 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1168 of 1168 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1168 of 1168 strings)

Update translation files  [skip ci]

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 100.0% (1168 of 1168 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Lithaway <478279934@qq.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: aenron <1414004038@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2023-05-10 12:00:43 +01:00
Servarr
7bbf7d2461 Automated API Docs update 2023-05-10 02:48:44 +03:00
Stickie
a1e622a363 New: Notifications when Manual Interaction is required for importing
(cherry picked from commit 5ec282750bdea16f770282b80fdaec56a65749e2)
2023-05-10 00:18:15 +03:00
The Dark
8563ed0a20 New: On Health Restored notification
(cherry picked from commit 5fdc8514da7c7ad98192f2ecb2415b3a7b5d0d05)
2023-05-10 00:18:15 +03:00
Mark McDowall
164f9ca868 Why rename many files when few file do trick
(cherry picked from commit eaa4a358e8eb93e15203001d16e868e22aded5c3)
2023-05-08 15:43:44 +03:00
Mark McDowall
782a257779 GracePeriod not Graceperiod
(cherry picked from commit 993c69530ed34460800f40ecf8a0b7bc9a2f7d48)
2023-05-08 15:43:44 +03:00
Bogdan
b7419c31df Sort translations alphabetically 2023-05-08 11:50:41 +03:00
Benjamin Staneck
8b958708da Move vscode settings to the frontend folder
Since it applies to all of frontend, I think it makes more sense to have it here instead of src

(cherry picked from commit e12c679cd8961ec9d2ef744761303831b81e64fb)
2023-05-07 18:52:45 -05:00
Mark McDowall
07f0e89f11 Fixed IsValidPath usages
(cherry picked from commit 033936dce7e13c8ab2e38407782dc9cdd949460e)
2023-05-08 02:02:22 +03:00
Mark McDowall
ae63b85753 New: Improve path validation when handling paths from different OSes
(cherry picked from commit 0321368cc392d7a0a488409bf6bd586ba45497af)
(cherry picked from commit 033936dce7e13c8ab2e38407782dc9cdd949460e)
2023-05-08 02:02:22 +03:00
Bogdan
a38b28f4df Log invalid config file exceptions
(cherry picked from commit a95317446c452926819ad24f892a00770b1b23fc)
2023-05-07 21:45:17 +03:00
Benjamin Staneck
b0cd7ae356 Add VSCode extension recommendations
To make it easier for new contributors, suggest extensions for the tools we use

(cherry picked from commit 9ebd2f96adb19db7c7357336a37f7b989d21797d)
2023-05-07 13:39:02 -05:00
Bogdan
fe164c1def Fixed: Ensure indexer errors are handled before processing response
(cherry picked from commit 76f93c8415419f0c3dab90582d47a1c9a653263c)
2023-05-07 21:33:44 +03:00
Bogdan
06a214e901 Align environment variable setting in ProcessProvider with upstream
Co-authored-by: Qstick <376117+Qstick@users.noreply.github.com>

Closes #5617

(cherry picked from commit 8f482c534f15c14a9b3097313a4f5e9273549d88)
2023-05-07 21:32:32 +03:00
Mark McDowall
51901dbb37 New: Only add version header for API requests
(cherry picked from commit 453891e620459ff38f7bc43b207004b240fc5fb8)
2023-05-07 21:21:06 +03:00
Qstick
850fef5c43 Fixed: RootFolderPath not set for Movies from API 2023-05-07 11:55:33 -05:00
Qstick
ff1449c01e Fixed: Index UI crash for movies without files 2023-05-07 00:50:09 -05:00
Bogdan
51a583b59b New: Add token authentication for ntfy.sh notifications
Closes #8451

Co-authored-by: KucharczykL <lukas@kucharczyk.xyz>
(cherry picked from commit 5bb03a9ddf4d2d33976dfdc39fc70bcf56bf1b49)
2023-05-06 23:39:24 -05:00
Qstick
2a72a32d28 Fixed: Matching of custom formats during movie file import
Closes #8287
2023-05-06 23:33:03 -05:00
Qstick
836017c01b Revert argument exception swallowing for Plex library update
Closes #8264
2023-05-06 23:25:56 -05:00
Mark McDowall
85aac789f4 New: Improved Plex library updating
Closes #8235
Closes #8244

(cherry picked from commit 98308737cfa78a41ec22a2b23a80bf316bd779ea)
2023-05-06 23:20:32 -05:00
Mark McDowall
9ec1235b62 New: Add release info to webhook/custom script import events
Closes #8293
2023-05-06 22:59:52 -05:00
Mark McDowall
b5bf5eae26 New: Don't import movies that don't match grab history
Closes #8228

(cherry picked from commit 978618f041c478121f8e014910ad092f8e648596)
2023-05-06 22:59:41 -05:00
Qstick
e7ff79f48d Use string interpolation for Newznab request generation
Closes #7755
2023-05-06 22:10:21 -05:00
Qstick
41fb0eb7c6 Virtualize movie select for manual import with react-window 2023-05-06 21:33:19 -05:00
Qstick
eeb997430c Convert Manual Import to Typescript 2023-05-06 21:33:19 -05:00
Bogdan
d2112f2bdc New: Log content for invalid torrent files
(cherry picked from commit e3f71ca79c3c92015e6c3fc292ae3124dab63410)
2023-05-06 14:37:33 -05:00
Weblate
d5e61c3450 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 100.0% (1168 of 1168 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 100.0% (1168 of 1168 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: RudyBzh <rudybzh@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translation: Servarr/Radarr
2023-05-05 19:48:28 +03:00
Bogdan
b3037248a2 Add tmdbid to capabilities check in Newznab/Torznab 2023-05-05 15:13:10 +03:00
W Scott Johnson
39271eb33c Remove requirement for imdbtitle and imdbyear in Newznab and Torznab 2023-05-05 15:13:10 +03:00
Bogdan
cc28519d6d Remove duplicate check in RemotePathMappingCheck 2023-05-05 02:35:13 +03:00
Bakerboy448
7b8c21fc76 Fixed: Movie Status in Table View
Fixes #8442
2023-05-04 17:35:23 -05:00
Servarr
f68fd9c2d9 Automated API Docs update 2023-05-04 09:48:51 +01:00
Mark McDowall
116db9701b New: Add result to commands to report commands that did not complete successfully
(cherry picked from commit 103ce3def4636ef891e72bd687ef8f46b5125233)
2023-05-04 11:40:01 +03:00
Weblate
6ec12d71dc Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (1168 of 1168 strings)

Co-authored-by: Remy <remy@mrbk.fr>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translation: Servarr/Radarr
2023-05-03 19:56:42 +03:00
bakerboy448
6dc558cbf6 add trace log checkbox to bug report [common] 2023-05-03 10:17:59 +03:00
Stepan Goremykin
d2787d8181 Migrate to FluentValidation 9
(cherry picked from commit 40e54685b9e83ed24a3979bfe965c453339ad02e)
2023-05-03 09:12:07 +03:00
Bogdan
89fd3e4671 Fix downloading releases without an indexer
(cherry picked from commit ca8b26138e3ebd793cc1a5fd51522ce3eda8a2e1)
2023-05-03 05:47:43 +03:00
Bogdan
1807ccfc48 Build download requests from indexer implementation
(cherry picked from commit a0b08f6c6f106d92cdb12fbb959dd2605c22fe6a)
2023-05-03 05:47:43 +03:00
Bogdan
7c67382f6f bump lock threads github action to latest [skip ci]
Fix for nodejs 12 deprecation
2023-05-03 05:46:17 +03:00
Benjamin Staneck
3738750fa1 Fixed some aria violations
(cherry picked from commit 7aa846343815105e3576e6aa20eac64fcb0edf8d)
2023-05-03 05:45:43 +03:00
Bakerboy448
6086b0d4e4 Fixed: Search Button Display on Movie Index 2023-05-02 19:04:28 -05:00
Bakerboy448
66b7b3b7d6 Fixed: Unable to search individual movies from Movie Index
Fixed: Refresh on movie list refreshing all movies

Fixes #8434
2023-05-02 19:04:28 -05:00
Bakerboy448
5e338c93a3 Fixed: Upgrades blocked: UpgradeSpecification error
Fixes #8431

- Remove erroneous Year and Imdbid from ParseCustomFormat, not needed
2023-05-02 18:37:50 -05:00
Qstick
554ab21d38 Fixed: Cannot Toggle Show Search on Movie Index
Fixes #8436
2023-05-02 18:14:33 -05:00
Lars
0858f6732a New: Filter Sonarr synchronization based on Root Folders
(cherry picked from commit ff3327483a233ebe54d8f178c355abaeb6f9d11e)
2023-05-02 23:47:24 +03:00
Qstick
4c2bf285fc New: Add Original Language as Filter Option in Discover View
Closes #7807
2023-05-01 23:26:23 -05:00
Qstick
cba4850769 New: Handle multi title release names split by slash
Closes #7917

Co-Authored-By: andrey4korop <24610708+andrey4korop@users.noreply.github.com>
2023-05-01 22:59:08 -05:00
Weblate
f1fcab75f5 Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
Currently translated at 99.9% (1167 of 1168 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1168 of 1168 strings)

Translated using Weblate (Spanish) [skip ci]

Currently translated at 99.2% (1159 of 1168 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 100.0% (1168 of 1168 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 99.8% (1163 of 1165 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1164 of 1164 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 94.9% (1105 of 1164 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: R00T99 <ddaa5e30-3d20-41f9-8ed8-bba67e8acf80@anonaddy.me>
Co-authored-by: TOMAS PLATERO VAZQUEZ <killo3967@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: foXaCe <foxace66@gmail.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2023-05-01 22:31:38 -05:00
Qstick
44bec71752 Fixed: Don't import Custom Format downgrades
Closes #8197
Closes #8243

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-05-01 21:31:10 -05:00
Qstick
b44f050246 Fixed: Enable parsing of repacks with revision
Closes #8060

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-05-01 19:48:24 -05:00
Qstick
a0068a3ed9 Fixed: Don't clean Kodi library if video is playing and Always Update is disabled
Closes #8139

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-05-01 19:40:38 -05:00
Qstick
8e1bf785c3 Revert "Build download requests from indexer implementation"
This reverts commit 84e0f5bfcf.
2023-04-30 22:50:56 -05:00
Qstick
cc63c3f3cd Fixed: Movie count incorrect in Movie Editor
Fixes #8423
2023-04-30 22:41:46 -05:00
Bakerboy448
d3e6d7cd05 Fixed: Missing Translates 2023-04-30 21:32:31 -05:00
Qstick
066d9dd1d4 Simplify DatabaseType logic
(cherry picked from commit c5baded3d63a9e77e180023559758108c1ced782)
2023-04-30 21:31:59 -05:00
Bogdan
dc2759ddcb Fixed: (Database) Improve Version detection
(cherry picked from commit 788fa6d96a45ebec684672f0811d8ee284c2f0c8)
2023-04-30 21:31:59 -05:00
Qstick
cc4a80947f Fixed: Importing from Manual Import ignoring Analyze video files
Closes #8340
2023-04-30 20:52:33 -05:00
Qstick
3e643644cd Extract useSelectState from SelectContext
Closes #8295
2023-04-30 20:37:45 -05:00
Qstick
1336743aca Avoid queue failures due to unknown release language processing 2023-04-30 19:34:32 -05:00
Qstick
bf3e23cc3b Fix default value variable name for ImportListExclusion 2023-04-30 19:25:45 -05:00
Qstick
a41999f9c2 New: Closing Move Movie modal without selecting will cancel save
Closes #8225

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-04-30 19:13:36 -05:00
Qstick
80d7bdb834 Use augmented languages for queue items 2023-04-30 13:39:31 -05:00
Qstick
efd4abfa3e New: Use languages from Torznab/Newznab attributes if given 2023-04-30 13:39:31 -05:00
Qstick
9bef430635 New: Use TmdbId from parsing for mapping 2023-04-30 13:39:31 -05:00
Qstick
a03323703a Cleanup ParsingService 2023-04-30 13:39:31 -05:00
Qstick
c3f30fb237 Fixed: Pushed releases should be stored as pushed release
Closes #8246

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-04-30 13:39:31 -05:00
Qstick
91f1fd9dd0 New: Don't block imports when release was matched by ID if they were grabbed via interactive search
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-04-30 13:39:31 -05:00
Qstick
ba7551ec65 Fixed: Queue not showing items with conflicting titles 2023-04-30 13:39:31 -05:00
Qstick
5d061a8729 New: Include Movie Match Type in grab event details 2023-04-30 13:39:31 -05:00
Qstick
875bf0c59e Fixed: Automatic import of releases when file is not matched to movie 2023-04-30 13:39:31 -05:00
Qstick
7527eff268 Fixed: Don't automatically import if release title doesn't match movie title
Closes #7081
2023-04-30 13:39:31 -05:00
Qstick
e32383e763 Fixed: Throw to manual import if multiple movies found during title mapping 2023-04-30 13:39:31 -05:00
Bogdan
84e0f5bfcf Build download requests from indexer implementation
(cherry picked from commit a0b08f6c6f106d92cdb12fbb959dd2605c22fe6a)
2023-04-30 17:19:46 +03:00
Benjamin Staneck
138b1e1c9d New: Updated button and calendar outline colors for dark theme
(cherry picked from commit 5d873fafec07c9d67ad8d2c16eecea195a78eecf)
2023-04-30 00:26:52 -05:00
Bogdan
adee52d8c2 Fix loading eslintrc
(cherry picked from commit b0773ae7e3f860ff381d8d98d23d612609048e38)
2023-04-30 00:26:31 -05:00
Qstick
c61735cde2 New: Remember add import list exclusion when removing movie
Closes #7949
Closes #7950
2023-04-29 22:47:02 -05:00
Qstick
7f71caaf7f Fixed: Movies table not resizing properly when window size changed 2023-04-29 22:47:02 -05:00
Qstick
e139e7330e Fixed: Movie select not working correctly after stopping/starting or changing sort order 2023-04-29 22:47:02 -05:00
Qstick
e88c44915f Improved UI error messages (stack trace and version) 2023-04-29 22:47:02 -05:00
Qstick
7501fe095e New: Increase clickable area of movie select in poster/overview 2023-04-29 22:47:02 -05:00
tsubus
1bc299fd35 Remove unused ReactDOM import
fixes error with mono: "error  'ReactDOM' is defined but never used  no-unused-vars"

(cherry picked from commit 492c9e22bac3c667bc487f2d0ceb18a18fa00655)
2023-04-29 22:47:02 -05:00
Mark McDowall
c2736bbe27 Fixed: File browser
(cherry picked from commit f7ce5c7b115ea0d12ab63f19960c473e09e30f3d)
2023-04-29 22:47:02 -05:00
Qstick
2d96c308f0 Remove movie editor code 2023-04-29 22:47:02 -05:00
Qstick
e85c010bf2 New: Mass Editor is now part of movie list
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-04-29 22:47:02 -05:00
Robin Dadswell
ee5fed8522 Added movie index selection
Author: Mark McDowall <mark@mcdowall.ca>
2023-04-29 22:47:02 -05:00
Mark McDowall
df26229e4d Fixed: Restoring scroll position when going back/forward to series list
(cherry picked from commit 5aad84dba453c42b4b5a9eac43deecf91a98f4f6)
2023-04-29 22:47:02 -05:00
Robin Dadswell
e0b91c6406 Refactor Movie index to use react-window 2023-04-29 22:47:02 -05:00
Robin Dadswell
68832a136e Add CSS Typings
Automatic by typescript-plugin-css-modules on yarn start
2023-04-29 22:47:02 -05:00
Mark McDowall
b18cd2f33a Add Prettier to format TypeScript files
(cherry picked from commit de56862bb97b092c5fc44359caf3b2abdbcfdf96)
2023-04-29 22:47:02 -05:00
Mark McDowall
36b055d372 Add typescript
(cherry picked from commit 910511dba03196f14bb238c8e15f060c12183c08)
2023-04-29 22:47:02 -05:00
Qstick
3a8f1f5e58 New: Parsing of more German WEBDL releases
Closes #8255

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-04-29 16:51:24 -05:00
Qstick
55770d3f17 Fixed: Parse 720p Remux as 720p BluRay
Closes #8284

Co-Authored-By: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2023-04-29 16:51:24 -05:00
Qstick
ff185c6111 QualityParser - Simplify new expression (IDE0090)
Closes #8283
2023-04-29 16:51:24 -05:00
Bakerboy448
e2445a61b6 Misc HealthCheck Cleanup and Sonarr Alignment 2023-04-29 16:29:15 -05:00
Bogdan
ac8085fb59 Bump Swashbuckle to 6.5.0 2023-04-29 22:36:52 +03:00
Mark McDowall
c6bb5024bc Fixed: Ensure first history item when marked as failed is the selected item
(cherry picked from commit cf48bf304122bacc597de1d4d4429065d2358fa8)

Fixes #8086
Closes #8369
2023-04-29 12:53:09 -05:00
Fabricio Silva
d32582fa7c Fixed: Edit Quality Profile not opening
(cherry picked from commit 83cee4b00e8c64d749d2ff1d8575d31570beecba)
2023-04-29 10:59:01 -05:00
Lars Erik Helø
223f04ef46 Refactor LanguageParser.ParseLanguageTags() to return List<> instead of IEnumerable. Clean up calls to ParseLanguageTags(). 2023-04-29 10:33:24 -05:00
LarsHelo
85112e7fbd Include extra tags from existing subtitles when renaming. 2023-04-29 10:33:24 -05:00
Weblate
014079cf37 Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Co-authored-by: Figurant16 <stsamy2006@gmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: VisoTC <szlytlyt@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2023-04-29 10:32:08 -05:00
Gabriel Sjöberg
d4a347b2ba Use BuildInfo.AppName for RARBG appId instead of hardcoded value
(cherry picked from commit 99c4f5b746bff6809c988f8b816e5135f5959ed7)

Closes #8387
2023-04-29 10:12:22 -05:00
Mark McDowall
2ac72d1588 New: Updated Rarbg request limits
(cherry picked from commit 47cf8e6430b7f7704ce2f1524fa9e3c8e6f9b47a)

Closes #8337
Fixes #7700
2023-04-29 10:12:22 -05:00
Mark McDowall
a77cb25513 New: Report health error if Recycling Bin folder is not writable
(cherry picked from commit 8c50cd061e691914d9fcce119b9f838f1276950c)

Fixes #8388
Closes #8389
2023-04-29 10:12:22 -05:00
Qstick
fddea0543c Update core-js and use defaults for browserlist
Fixes #8400

Co-Authored-By: Benjamin Staneck <staneck@gmail.com>
2023-04-28 22:55:35 -05:00
Qstick
fffa373384 Update webpack and webpack-cli
Fixes #8397

Co-Authored-By: Benjamin Staneck <staneck@gmail.com>
2023-04-28 22:51:50 -05:00
Qstick
91ff76c0c8 Use minified jquery
Fixes #8398

Co-Authored-By: Benjamin Staneck <staneck@gmail.com>
2023-04-28 22:50:12 -05:00
Qstick
6f5bac7eed Remove unused gulpFile
Fixes #8396

Co-Authored-By: Benjamin Staneck <staneck@gmail.com>
2023-04-28 22:47:45 -05:00
Benjamin Staneck
b34a7c6e2e Fix typo in calendarBackgroundColor CSS variable
(cherry picked from commit e34d2504400faaa12c7fc8572264477ccd58619d)
2023-04-28 22:18:40 -05:00
Qstick
a6ce314db5 Fix QualityParser Tests 2023-04-23 13:40:52 -05:00
Qstick
b8ce140abc Fixed: Parse DVD with 576p Resolution as DVD
Fixes #7297
Closes #8381
2023-04-23 13:09:16 -05:00
Qstick
d851ecdf2f Auto-reply for Log Label [common] 2023-04-23 11:58:28 -05:00
Qstick
7e37615ec1 Bump version to 4.5.1 2023-04-23 11:49:36 -05:00
Bogdan
204a8bab79 Fixed: (Notifications) Consistency in notification titles 2023-04-23 07:36:08 -07:00
Bogdan
0158c84a98 Fixed: (FileList) Use labels for category options 2023-04-22 22:12:02 -07:00
Bogdan
ac51a943fb New: (Notifications) Add Apprise 2023-04-22 21:23:13 -07:00
Servarr
78edc9aa43 Automated API Docs update 2023-04-22 18:48:01 -07:00
Qstick
f2bf494cef New: Rescan movie if destination file already exists during import
Closes #8230

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-04-22 20:27:26 -05:00
Qstick
5727e7c43b New: Improve accepted and rejected release logging
Closes #8236

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-04-22 20:23:55 -05:00
Qstick
a7ba1a6454 Update SixLabors.ImageSharp, MailKit, DryIoc libraries
Closes #8282

Co-Authored-By: Stepan Goremykin <25577658+goremykin@users.noreply.github.com>
2023-04-22 20:18:22 -05:00
Qstick
cc285fab45 Use MinBy and MaxBy instead of OrderBy + First
Co-Authored-By: Stepan Goremykin <25577658+goremykin@users.noreply.github.com>
2023-04-22 20:10:04 -05:00
Bogdan
e0ad573e7f New: Add version and timestamp to backup archive
(cherry picked from commit ed3d880974ae6a1430866eebaf72533f35258f6f)
2023-04-22 20:00:45 -05:00
Qstick
9a23b7f0fc New: Improve video stream formatting
(cherry picked from commit 39350ed0de4aca769ef7661f1dce08f9f462e7c3)
2023-04-22 19:59:11 -05:00
Qstick
85aecbe67e New: Improve primary video stream selection
(cherry picked from commit b0834015e7b4bcc37a72cd7d6d47879a6ef2a494)
2023-04-22 19:59:11 -05:00
Qstick
bbb20e95af Fixed: DrunkenSlug Default URL
Fixes #8333

Co-Authored-By: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2023-04-22 19:59:11 -05:00
Qstick
3fb337e20b Fixed: Tag filtering on iCal feed
Fixes #8359
2023-04-22 19:59:11 -05:00
Weblate
5e63da418e Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 99.9% (1158 of 1159 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Co-authored-by: Deflector8249 <lh2jwko5@gomail.me>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: SHUAI.W <x@ousui.org>
Co-authored-by: Sascha Brockel <gsydaydreamer@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2023-04-22 17:39:35 -07:00
Qstick
890f9d6fe4 Fixed: Prevent error on manual import processing with multi languages
Closes #7713
2023-04-22 19:36:04 -05:00
Mark McDowall
8a496cbdae New: Don't try to analyze disk image files (iso, img, etc)
(cherry picked from commit 764c08498783865834e607bd41feaaedf69a254a)
2023-04-22 16:41:57 -07:00
Stevie Robinson
f54a5388a0 Fixed: Border hover colors in dark theme
(cherry picked from commit bead56893f080a1ac1df230908314f3ba8e0c6ce)
2023-04-22 10:18:21 -07:00
Bogdan
6961633cc9 Serve plain text files (eg. logs) as UTF-8 2023-04-22 10:03:17 -07:00
Qstick
1be450a9d0 Remove mono process detection
(cherry picked from commit 5a046026725084bc880a7b63d7105dcf4d882128)
2023-04-16 19:51:07 -05:00
Bogdan
2b4d6464e2 Rename CC to Cc 2023-04-16 19:50:55 -05:00
Lars
ee4c34bd6c New: Option to use Telegram topics for notifications
(cherry picked from commit c8933d812490ba375c6f7e07cd4355921dc513ac)
2023-04-16 17:46:45 -05:00
Qstick
07d41f7902 Bump version to 4.5.0 2023-04-15 10:29:39 -05:00
Qstick
bb573594d9 Fix Blocklist Tests 2023-04-13 22:35:22 -05:00
Qstick
12e360ab4f Fixed: Some posters not showing for new movies search results
Fixes #8175

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-04-13 22:09:55 -05:00
Qstick
bae555f63e Fixed: Custom Format calculation error on Blocklist by Movie
Fixes #8136
2023-04-13 21:55:01 -05:00
Qstick
31abb93d8c Bump dotnet to 6.0.16 2023-04-13 19:15:09 -05:00
LarsHelo
75035035e1 Fixed: Remote path mapping UI being partially hidden on smaller screens 2023-04-13 19:08:19 -05:00
bakerboy448
c1e5990a58 Update library clean helptext 2023-04-13 19:07:39 -05:00
Weblate
4a42ebe44c Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Czech) [skip ci]

Currently translated at 90.7% (1052 of 1159 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Portuguese) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Hebrew) [skip ci]

Currently translated at 92.9% (1077 of 1159 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 95.4% (1106 of 1159 strings)

Translated using Weblate (Arabic) [skip ci]

Currently translated at 90.4% (1048 of 1159 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 94.6% (1097 of 1159 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Norwegian Bokmål) [skip ci]

Currently translated at 22.5% (261 of 1159 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 94.3% (1094 of 1159 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 99.5% (1154 of 1159 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (1159 of 1159 strings)

Translated using Weblate (Croatian) [skip ci]

Currently translated at 21.4% (249 of 1159 strings)

Co-authored-by: Bendik Remoy <Bendikremoy@hotmail.com>
Co-authored-by: Cassio Rizzi <clrizzi@gmail.com>
Co-authored-by: Deflector8249 <lh2jwko5@gomail.me>
Co-authored-by: Elias Benbourenane <eliasbenbourenane@gmail.com>
Co-authored-by: Florian <sephrat.flo@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Ivan Mazzoli <dreadtank27@gmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Michele Caputo <michele@caputoweb.xyz>
Co-authored-by: Nir Israel Hen <nirisraelh@gmail.com>
Co-authored-by: Remy <remy@mrbk.fr>
Co-authored-by: TheHrle <Hpranjkovic@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: federicofortini <federico.fortini@yahoo.it>
Co-authored-by: libsu <libsu@qq.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: tomas15420 <tomas15420@gmail.com>
Co-authored-by: zobe123 <manuel.zobl@gmx.at>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/hr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translation: Servarr/Radarr
2023-04-13 19:06:57 -05:00
Qstick
c82aa5c2c7 Fixed: Validation for CleanOriginalTitle
Fixes #8331
Closes #8332

Co-Authored-By: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2023-04-13 19:03:13 -05:00
Qstick
d1bae32e1c Fixed: Correct TitleThe naming token parsing 2023-04-13 18:59:15 -05:00
Qstick
c514c7cac0 Fixed: Default value in new Delay Profile 2023-04-13 18:52:13 -05:00
Qstick
3d244057b5 Fixed: Don't grab propers/repacks when item in queue meets cutoff and propers/repacks are not downloaded automatically
Fixes #8134
2023-04-13 18:47:21 -05:00
Bakerboy448
323510300c Fixed: Cleanup erroneous QBittorrent Seeding calls 2023-04-13 18:14:36 -05:00
Bakerboy448
669d87b7ef Fixed: Include Digital Only Releases for Recent Movie determination
Use most recent of physical or digital release date
2023-04-13 18:14:08 -05:00
Bakerboy448
ec7f7b085a New: More information on on why hardlinks should be used over copying
Closes #8327

(cherry picked from commit 83a9d15ff8721c8effdc2c8055e37bfb757022d4)
2023-04-13 18:13:43 -05:00
Bogdan
ecc906a754 Fixed: Config file settings do not need to be case-sensitive
(cherry picked from commit 2107635b7e7e5392624f2957af7d7b88ba6be283)
2023-04-11 20:00:35 -05:00
Bogdan
d0fcac389c Fixed: Ensure default config file on starting app
(cherry picked from commit 5326a102e23eacfc1132eb544a92af737a531df5)
2023-04-11 20:00:35 -05:00
Qstick
621acbef9a Bump version to 4.4.4 2023-04-09 12:23:51 -05:00
Mark McDowall
7fb1163b23 Fixed: Number input changing while scrolling
(cherry picked from commit cc46ed56b4b70fe1f1443c0a927383f19c989c47)
2023-04-09 12:12:29 -05:00
Sergey M
b48eda95dd Fixed: Mapping by MovieTitles collection instead of PrimaryMovieTitle (#8157)
Co-authored-by: Sergey M <msergein>
2023-04-02 16:53:24 -05:00
929 changed files with 18596 additions and 14022 deletions

View File

@@ -73,3 +73,10 @@ body:
Additionally, any additional info? Screenshots? References? Anything that will give us more context about the issue you are encountering!
validations:
required: true
- type: checkboxes
attributes:
label: Trace Logs have been provided as applicable. Reports may be closed if the required logs are not provided.
description: Trace logs are generally required for all bug reports
options:
- label: I have followed the steps in the wiki link above and provided the required trace logs that are relevant and show this issue.
required: true

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

@@ -0,0 +1,28 @@
'Area: API':
- src/Radarr.Api.V3/**/*
'Area: Db-migration':
- src/NzbDrone.Core/Datastore/Migration/*
'Area: Download Clients':
- src/NzbDrone.Core/Download/Clients/**/*
'Area: Import Lists':
- src/NzbDrone.Core/ImportLists/**/*
'Area: Indexer':
- src/NzbDrone.Core/Indexers/**/*
'Area: Notifications':
- src/NzbDrone.Core/Notifications/**/*
'Area: Organizer':
- src/NzbDrone.Core/Organizer/**/*
'Area: Parser':
- src/NzbDrone.Core/Parser/**/*
'Area: UI':
- frontend/**/*
- package.json
- yarn.lock

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

@@ -0,0 +1,12 @@
name: "Pull Request Labeler"
on:
- pull_request_target
jobs:
triage:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v4

View File

@@ -14,13 +14,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v2
- uses: dessant/lock-threads@v4
with:
github-token: ${{ github.token }}
issue-lock-inactive-days: '90'
issue-exclude-created-before: ''
issue-exclude-labels: ''
issue-lock-labels: ''
issue-lock-comment: ''
issue-inactive-days: '90'
exclude-issue-created-before: ''
exclude-any-issue-labels: ''
add-issue-labels: ''
issue-comment: ''
issue-lock-reason: 'resolved'
process-only: ''

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: dessant/support-requests@v2
- uses: dessant/support-requests@v3
with:
github-token: ${{ github.token }}
support-label: 'Type: Support'
@@ -22,4 +22,15 @@ jobs:
to be a support request. Please hop over onto our [Discord](https://radarr.video/discord)
or [Subreddit](https://reddit.com/r/radarr)
close-issue: true
lock-issue: false
lock-issue: false
- uses: dessant/support-requests@v3
with:
github-token: ${{ github.token }}
support-label: 'Status: Logs Needed'
issue-comment: >
:wave: @{issue-author}, In order to help you further we'll need to see logs.
You'll need to enable trace logging and replicate the problem that you encountered.
Guidance on how to enable trace logging can be found in
our [troubleshooting guide](https://wiki.servarr.com/radarr/troubleshooting#logging-and-log-files).
close-issue: false
lock-issue: false

View File

@@ -9,13 +9,13 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '4.4.3'
majorVersion: '4.5.1'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '6.0.400'
dotnetVersion: '6.0.408'
nodeVersion: '16.X'
innoVersion: '6.2.0'
windowsImage: 'windows-2022'

View File

@@ -3,9 +3,9 @@ PLATFORM=$1
if [ "$PLATFORM" = "Windows" ]; then
RUNTIME="win-x64"
elif [ "$PLATFORM" = "Linux" ]; then
WHERE="linux-x64"
RUNTIME="linux-x64"
elif [ "$PLATFORM" = "Mac" ]; then
WHERE="osx-x64"
RUNTIME="osx-x64"
else
echo "Platform must be provided as first arguement: Windows, Linux or Mac"
exit 1
@@ -27,7 +27,7 @@ dotnet clean $slnFile -c Release
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
dotnet new tool-manifest
dotnet tool install --version 6.3.0 Swashbuckle.AspNetCore.Cli
dotnet tool install --version 6.5.0 Swashbuckle.AspNetCore.Cli
dotnet tool run swagger tofile --output ./src/Radarr.Api.V3/openapi.json "$outputFolder/net6.0/$RUNTIME/radarr.console.dll" v3 &
@@ -35,4 +35,4 @@ sleep 45
kill %1
exit 0
exit 0

View File

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

View File

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

View File

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

View File

@@ -1,14 +1,21 @@
// eslint-disable-next-line @typescript-eslint/no-var-requires
const fs = require('fs');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const path = require('path');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const typescriptEslintRecommended = require('@typescript-eslint/eslint-plugin').configs.recommended;
const frontendFolder = __dirname;
const dirs = fs
.readdirSync('frontend/src', { withFileTypes: true })
.readdirSync(path.join(frontendFolder, 'src'), { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name)
.join('|');
const frontendFolder = __dirname;
module.exports = {
root: true,
parser: '@babel/eslint-parser',
env: {
@@ -21,7 +28,8 @@ module.exports = {
globals: {
expect: false,
chai: false,
sinon: false
sinon: false,
JSX: true
},
parserOptions: {
@@ -41,7 +49,9 @@ module.exports = {
'react',
'react-hooks',
'simple-import-sort',
'import'
'import',
'@typescript-eslint',
'prettier'
],
settings: {
@@ -224,7 +234,7 @@ module.exports = {
'consistent-this': ['error', 'self'],
'eol-last': 'error',
'func-names': 'off',
'func-style': ['error', 'declaration'],
'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
indent: ['error', 2, { SwitchCase: 1 }],
'key-spacing': ['error', { beforeColon: false, afterColon: true }],
'keyword-spacing': ['error', { before: true, after: true }],
@@ -315,7 +325,9 @@ module.exports = {
},
overrides: [
{
files: ['*.js'],
files: [
'*.js'
],
rules: {
'simple-import-sort/imports': [
'error',
@@ -330,6 +342,52 @@ module.exports = {
}
]
}
},
{
files: [
'*.ts',
'*.tsx'
],
parser: '@typescript-eslint/parser',
parserOptions: {
project: './tsconfig.json'
},
extends: [
'prettier'
],
rules: Object.assign(typescriptEslintRecommended.rules, {
'no-shadow': 'off',
// These should be enabled after cleaning things up
'@typescript-eslint/no-unused-vars': 'warn',
'@typescript-eslint/explicit-function-return-type': 'off',
'react/prop-types': 'off',
'prettier/prettier': 'error',
'simple-import-sort/imports': [
'error',
{
groups: [
// Packages
// Absolute Paths
// Relative Paths
// Css
['^@?\\w', `^(${dirs})(/.*|$)`, '^\\.', '^\\..*css$']
]
}
]
})
},
{
files: [
'*.css.d.ts'
],
rules: {
'filenames/match-exported': 'off',
'init-declarations': 'off',
'prettier/prettier': 'off'
}
}
]
};

View File

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

10
frontend/.prettierignore Normal file
View File

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

View File

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

View File

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

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

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

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

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

View File

@@ -17,7 +17,8 @@ module.exports = {
env: {
development: {
presets: [
['@babel/preset-react', { development: true }]
['@babel/preset-react', { development: true }],
'@babel/preset-typescript'
],
plugins: [
'babel-plugin-inline-classnames'
@@ -25,7 +26,8 @@ module.exports = {
},
production: {
presets: [
'@babel/preset-react'
'@babel/preset-react',
'@babel/preset-typescript'
],
plugins: [
'babel-plugin-transform-react-remove-prop-types'

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('path');
const webpack = require('webpack');
const FileManagerPlugin = require('filemanager-webpack-plugin');
@@ -5,6 +6,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin');
const LiveReloadPlugin = require('webpack-livereload-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
module.exports = (env) => {
const uiFolder = 'UI';
@@ -38,13 +40,18 @@ module.exports = (env) => {
},
resolve: {
extensions: [
'.ts',
'.tsx',
'.js'
],
modules: [
srcFolder,
path.join(srcFolder, 'Shims'),
'node_modules'
],
alias: {
jquery: 'jquery/src/jquery'
jquery: 'jquery/dist/jquery.min'
},
fallback: {
buffer: false,
@@ -130,6 +137,8 @@ module.exports = (env) => {
}
}),
new ForkTsCheckerWebpackPlugin(),
new LiveReloadPlugin()
],
@@ -153,7 +162,7 @@ module.exports = (env) => {
}
},
{
test: /\.js?$/,
test: [/\.jsx?$/, /\.tsx?$/],
exclude: /(node_modules|JsLibraries)/,
use: [
{
@@ -184,6 +193,7 @@ module.exports = (env) => {
exclude: /(node_modules|globals.css)/,
use: [
{ loader: MiniCssExtractPlugin.loader },
{ loader: 'css-modules-typescript-loader' },
{
loader: 'css-loader',
options: {
@@ -251,18 +261,19 @@ module.exports = (env) => {
config.resolve.alias['react-dom$'] = 'react-dom/profiling';
config.resolve.alias['scheduler/tracing'] = 'scheduler/tracing-profiling';
config.optimization.minimizer = [
new TerserPlugin({
cache: true,
parallel: true,
sourceMap: true, // Must be set to true if using source-maps in production
terserOptions: {
mangle: false,
keep_classnames: true,
keep_fnames: true
}
})
];
config.optimization = {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
sourceMap: true, // Must be set to true if using source-maps in production
mangle: false,
keep_classnames: true,
keep_fnames: true
}
})
]
};
}
return config;

View File

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

View File

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

View File

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

View File

@@ -27,6 +27,7 @@ function HistoryDetails(props) {
downloadClient,
downloadClientName,
downloadId,
movieMatchType,
age,
ageHours,
ageMinutes,
@@ -73,6 +74,16 @@ function HistoryDetails(props) {
</span>
}
{
movieMatchType ?
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('MovieMatchType')}
data={movieMatchType}
/> :
null
}
{
downloadClientNameInfo ?
<DescriptionListItem

View File

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

View File

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

View File

@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'customFormatScore': string;
'details': string;
'downloadClient': string;
'indexer': string;
'releaseGroup': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,15 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'clearLookupButton': string;
'helpText': string;
'message': string;
'noMoviesText': string;
'noResults': string;
'searchContainer': string;
'searchIconContainer': string;
'searchInput': string;
'searchResults': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,18 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'addButton': string;
'container': string;
'info': string;
'labelIcon': string;
'modalFooter': string;
'overview': string;
'poster': string;
'searchForMissingMovieContainer': string;
'searchForMissingMovieInput': string;
'searchForMissingMovieLabel': string;
'searchForMissingMovieLabelContainer': string;
'year': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,24 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'alreadyExistsIcon': string;
'certification': string;
'content': string;
'exclusionIcon': string;
'icons': string;
'links': string;
'overlay': string;
'overview': string;
'poster': string;
'posterContainer': string;
'runtime': string;
'searchResult': string;
'statusContainer': string;
'title': string;
'titleContainer': string;
'titleRow': string;
'underlay': string;
'year': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -113,6 +113,7 @@ class AddNewMovieSearchResult extends Component {
images={images}
size={250}
overflow={true}
lazy={false}
/>
</div>
@@ -122,7 +123,7 @@ class AddNewMovieSearchResult extends Component {
monitored={monitored}
hasFile={hasFile}
status={status}
posterWidth={posterWidth}
width={posterWidth}
detailedProgressBar={true}
queueStatus={queueStatus}
queueState={queueState}

View File

@@ -1,10 +1,10 @@
import { reduce } from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import translate from 'Utilities/String/translate';
import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
import ImportMovieFooterConnector from './ImportMovieFooterConnector';
@@ -18,6 +18,8 @@ class ImportMovie extends Component {
constructor(props, context) {
super(props, context);
this.scrollerRef = React.createRef();
this.state = {
allSelected: false,
allUnselected: false,
@@ -27,18 +29,21 @@ class ImportMovie extends Component {
};
}
//
// Control
setScrollerRef = (ref) => {
this.setState({ scroller: ref });
};
//
// Listeners
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState, { parseIds: false });
return reduce(
this.state.selectedState,
(result, value, id) => {
if (value) {
result.push(id);
}
return result;
},
[]
);
};
onSelectAllChange = ({ value }) => {
@@ -88,16 +93,12 @@ class ImportMovie extends Component {
const {
allSelected,
allUnselected,
selectedState,
scroller
selectedState
} = this.state;
return (
<PageContent title={translate('ImportMovies')}>
<PageContentBody
registerScroller={this.setScrollerRef}
onScroll={this.onScroll}
>
<PageContentBody ref={this.scrollerRef} >
{
rootFoldersFetching ? <LoadingIndicator /> : null
}
@@ -126,14 +127,14 @@ class ImportMovie extends Component {
!rootFoldersFetching &&
rootFoldersPopulated &&
!!unmappedFolders.length &&
scroller ?
this.scrollerRef.current ?
<ImportMovieTableConnector
rootFolderId={rootFolderId}
unmappedFolders={unmappedFolders}
allSelected={allSelected}
allUnselected={allUnselected}
selectedState={selectedState}
scroller={scroller}
scroller={this.scrollerRef.current}
onSelectAllChange={this.onSelectAllChange}
onSelectedChange={this.onSelectedChange}
onRemoveSelectedStateItem={this.onRemoveSelectedStateItem}

View File

@@ -1,6 +1,14 @@
.inputContainer {
margin-right: 20px;
min-width: 150px;
div {
margin-top: 10px;
&:first-child {
margin-top: 0;
}
}
}
.label {
@@ -35,3 +43,17 @@
.importError {
margin-left: 10px;
}
@media only screen and (max-width: $breakpointSmall) {
.inputContainer {
margin-top: 10px;
&:first-child {
margin-top: 0;
}
}
.importButtonContainer {
margin-top: 10px;
}
}

View File

@@ -0,0 +1,13 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'importButton': string;
'importButtonContainer': string;
'importError': string;
'inputContainer': string;
'label': string;
'loading': string;
'loadingButton': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,12 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'detailsIcon': string;
'folder': string;
'minimumAvailability': string;
'monitor': string;
'movie': string;
'qualityProfile': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,12 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'folder': string;
'minimumAvailability': string;
'monitor': string;
'movie': string;
'qualityProfile': string;
'selectInput': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

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

View File

@@ -0,0 +1,16 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'button': string;
'content': string;
'contentContainer': string;
'dropdownArrowContainer': string;
'existing': string;
'loading': string;
'searchContainer': string;
'searchIconContainer': string;
'searchInput': string;
'warningIcon': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

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

View File

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

View File

@@ -0,0 +1,14 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'addErrorAlert': string;
'code': string;
'header': string;
'importButtonIcon': string;
'recentFolders': string;
'startImport': string;
'tip': string;
'tips': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -12,7 +12,7 @@ import NotFound from 'Components/NotFound';
import Switch from 'Components/Router/Switch';
import DiscoverMovieConnector from 'DiscoverMovie/DiscoverMovieConnector';
import MovieDetailsPageConnector from 'Movie/Details/MovieDetailsPageConnector';
import MovieIndexConnector from 'Movie/Index/MovieIndexConnector';
import MovieIndex from 'Movie/Index/MovieIndex';
import CustomFormatSettingsConnector from 'Settings/CustomFormats/CustomFormatSettingsConnector';
import DownloadClientSettingsConnector from 'Settings/DownloadClients/DownloadClientSettingsConnector';
import GeneralSettingsConnector from 'Settings/General/GeneralSettingsConnector';
@@ -48,7 +48,7 @@ function AppRoutes(props) {
<Route
exact={true}
path="/"
component={MovieIndexConnector}
component={MovieIndex}
/>
{

View File

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

View File

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

View File

@@ -0,0 +1,5 @@
interface ModelBase {
id: number;
}
export default ModelBase;

View File

@@ -0,0 +1,83 @@
import { cloneDeep } from 'lodash';
import React, { useCallback, useEffect } from 'react';
import useSelectState, { SelectState } from 'Helpers/Hooks/useSelectState';
import ModelBase from './ModelBase';
export type SelectContextAction =
| { type: 'reset' }
| { type: 'selectAll' }
| { type: 'unselectAll' }
| {
type: 'toggleSelected';
id: number;
isSelected: boolean;
shiftKey: boolean;
}
| {
type: 'removeItem';
id: number;
}
| {
type: 'updateItems';
items: ModelBase[];
};
export type SelectDispatch = (action: SelectContextAction) => void;
interface SelectProviderOptions<T extends ModelBase> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
children: any;
items: Array<T>;
}
const SelectContext = React.createContext<
[SelectState, SelectDispatch] | undefined
>(cloneDeep(undefined));
export function SelectProvider<T extends ModelBase>(
props: SelectProviderOptions<T>
) {
const { items } = props;
const [state, dispatch] = useSelectState();
const dispatchWrapper = useCallback(
(action: SelectContextAction) => {
switch (action.type) {
case 'reset':
case 'removeItem':
dispatch(action);
break;
default:
dispatch({
...action,
items,
});
break;
}
},
[items, dispatch]
);
const value: [SelectState, SelectDispatch] = [state, dispatchWrapper];
useEffect(() => {
dispatch({ type: 'updateItems', items });
}, [items, dispatch]);
return (
<SelectContext.Provider value={value}>
{props.children}
</SelectContext.Provider>
);
}
export function useSelect() {
const context = React.useContext(SelectContext);
if (context === undefined) {
throw new Error('useSelect must be used within a SelectProvider');
}
return context;
}

View File

@@ -0,0 +1,48 @@
import SortDirection from 'Helpers/Props/SortDirection';
export interface Error {
responseJSON: {
message: string;
};
}
export interface AppSectionDeleteState {
isDeleting: boolean;
deleteError: Error;
}
export interface AppSectionSaveState {
isSaving: boolean;
saveError: Error;
}
export interface PagedAppSectionState {
pageSize: number;
}
export interface AppSectionSchemaState<T> {
isSchemaFetching: boolean;
isSchemaPopulated: boolean;
schemaError: Error;
schema: {
items: T[];
};
}
export interface AppSectionItemState<T> {
isFetching: boolean;
isPopulated: boolean;
error: Error;
item: T;
}
interface AppSectionState<T> {
isFetching: boolean;
isPopulated: boolean;
error: Error;
items: T[];
sortKey: string;
sortDirection: SortDirection;
}
export default AppSectionState;

View File

@@ -0,0 +1,50 @@
import InteractiveImportAppState from 'App/State/InteractiveImportAppState';
import MovieFilesAppState from './MovieFilesAppState';
import MoviesAppState, { MovieIndexAppState } from './MoviesAppState';
import QueueAppState from './QueueAppState';
import SettingsAppState from './SettingsAppState';
import TagsAppState from './TagsAppState';
interface FilterBuilderPropOption {
id: string;
name: string;
}
export interface FilterBuilderProp<T> {
name: string;
label: string;
type: string;
valueType?: string;
optionsSelector?: (items: T[]) => FilterBuilderPropOption[];
}
export interface PropertyFilter {
key: string;
value: boolean | string | number | string[] | number[];
type: string;
}
export interface Filter {
key: string;
label: string;
filers: PropertyFilter[];
}
export interface CustomFilter {
id: number;
type: string;
label: string;
filers: PropertyFilter[];
}
interface AppState {
movieFiles: MovieFilesAppState;
interactiveImport: InteractiveImportAppState;
movieIndex: MovieIndexAppState;
settings: SettingsAppState;
movies: MoviesAppState;
tags: TagsAppState;
queue: QueueAppState;
}
export default AppState;

View File

@@ -0,0 +1,8 @@
import { CustomFilter } from './AppState';
interface ClientSideCollectionAppState {
totalItems: number;
customFilters: CustomFilter[];
}
export default ClientSideCollectionAppState;

View File

@@ -0,0 +1,10 @@
import AppSectionState, {
AppSectionDeleteState,
} from 'App/State/AppSectionState';
import { CustomFilter } from './AppState';
interface CustomFiltersAppState
extends AppSectionState<CustomFilter>,
AppSectionDeleteState {}
export default CustomFiltersAppState;

View File

@@ -0,0 +1,12 @@
import AppSectionState from 'App/State/AppSectionState';
import RecentFolder from 'InteractiveImport/Folder/RecentFolder';
import ImportMode from '../../InteractiveImport/ImportMode';
import InteractiveImport from '../../InteractiveImport/InteractiveImport';
interface InteractiveImportAppState extends AppSectionState<InteractiveImport> {
originalItems: InteractiveImport[];
importMode: ImportMode;
recentFolders: RecentFolder[];
}
export default InteractiveImportAppState;

View File

@@ -0,0 +1,10 @@
import AppSectionState, {
AppSectionDeleteState,
} from 'App/State/AppSectionState';
import { MovieFile } from 'MovieFile/MovieFile';
interface MovieFilesAppState
extends AppSectionState<MovieFile>,
AppSectionDeleteState {}
export default MovieFilesAppState;

View File

@@ -0,0 +1,61 @@
import AppSectionState, {
AppSectionDeleteState,
AppSectionSaveState,
} from 'App/State/AppSectionState';
import Column from 'Components/Table/Column';
import SortDirection from 'Helpers/Props/SortDirection';
import Movie from 'Movie/Movie';
import { Filter, FilterBuilderProp } from './AppState';
export interface MovieIndexAppState {
sortKey: string;
sortDirection: SortDirection;
secondarySortKey: string;
secondarySortDirection: SortDirection;
view: string;
posterOptions: {
detailedProgressBar: boolean;
size: string;
showTitle: boolean;
showMonitored: boolean;
showQualityProfile: boolean;
showReleaseDate: boolean;
showCinemaRelease: boolean;
showSearchAction: boolean;
};
overviewOptions: {
detailedProgressBar: boolean;
size: string;
showMonitored: boolean;
showStudio: boolean;
showQualityProfile: boolean;
showAdded: boolean;
showPath: boolean;
showSizeOnDisk: boolean;
showSearchAction: boolean;
};
tableOptions: {
showSearchAction: boolean;
};
selectedFilterKey: string;
filterBuilderProps: FilterBuilderProp<Movie>[];
filters: Filter[];
columns: Column[];
}
interface MoviesAppState
extends AppSectionState<Movie>,
AppSectionDeleteState,
AppSectionSaveState {
itemMap: Record<number, number>;
deleteOptions: {
addImportExclusion: boolean;
};
}
export default MoviesAppState;

View File

@@ -0,0 +1,51 @@
import ModelBase from 'App/ModelBase';
import Language from 'Language/Language';
import { QualityModel } from 'Quality/Quality';
import CustomFormat from 'typings/CustomFormat';
import AppSectionState, { AppSectionItemState, Error } from './AppSectionState';
export interface StatusMessage {
title: string;
messages: string[];
}
export interface Queue extends ModelBase {
languages: Language[];
quality: QualityModel;
customFormats: CustomFormat[];
size: number;
title: string;
sizeleft: number;
timeleft: string;
estimatedCompletionTime: string;
status: string;
trackedDownloadStatus: string;
trackedDownloadState: string;
statusMessages: StatusMessage[];
errorMessage: string;
downloadId: string;
protocol: string;
downloadClient: string;
outputPath: string;
movieHasFile: boolean;
movieId?: number;
}
export interface QueueDetailsAppState extends AppSectionState<Queue> {
params: unknown;
}
export interface QueuePagedAppState extends AppSectionState<Queue> {
isGrabbing: boolean;
grabError: Error;
isRemoving: boolean;
removeError: Error;
}
interface QueueAppState {
status: AppSectionItemState<Queue>;
details: QueueDetailsAppState;
paged: QueuePagedAppState;
}
export default QueueAppState;

View File

@@ -0,0 +1,28 @@
import AppSectionState, {
AppSectionDeleteState,
AppSectionSchemaState,
} from 'App/State/AppSectionState';
import Language from 'Language/Language';
import DownloadClient from 'typings/DownloadClient';
import QualityProfile from 'typings/QualityProfile';
import { UiSettings } from 'typings/UiSettings';
export interface DownloadClientAppState
extends AppSectionState<DownloadClient>,
AppSectionDeleteState {}
export interface QualityProfilesAppState
extends AppSectionState<QualityProfile>,
AppSectionSchemaState<QualityProfile> {}
export type LanguageSettingsAppState = AppSectionState<Language>;
export type UiSettingsAppState = AppSectionState<UiSettings>;
interface SettingsAppState {
downloadClients: DownloadClientAppState;
language: LanguageSettingsAppState;
uiSettings: UiSettingsAppState;
qualityProfiles: QualityProfilesAppState;
}
export default SettingsAppState;

View File

@@ -0,0 +1,12 @@
import ModelBase from 'App/ModelBase';
import AppSectionState, {
AppSectionDeleteState,
} from 'App/State/AppSectionState';
export interface Tag extends ModelBase {
label: string;
}
interface TagsAppState extends AppSectionState<Tag>, AppSectionDeleteState {}
export default TagsAppState;

View File

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

View File

@@ -0,0 +1,21 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'continuing': string;
'date': string;
'dateIcon': string;
'downloaded': string;
'event': string;
'eventWrapper': string;
'genres': string;
'link': string;
'missingMonitored': string;
'missingUnmonitored': string;
'movieTitle': string;
'queue': string;
'statusIcon': string;
'time': string;
'unmonitored': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

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

View File

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

View File

@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'day': string;
'dayOfMonth': string;
'isDifferentMonth': string;
'isSingleDay': string;
'isToday': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'day': string;
'days': string;
'forecast': string;
'month': string;
'week': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -1,6 +1,6 @@
.dayOfWeek {
flex: 1 0 14.28%;
background-color: var(--calendarBackgroudColor);
background-color: var(--calendarBackgroundColor);
text-align: center;
}

View File

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

View File

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

View File

@@ -0,0 +1,19 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'continuing': string;
'downloaded': string;
'event': string;
'genres': string;
'info': string;
'link': string;
'missingMonitored': string;
'missingUnmonitored': string;
'movieInfo': string;
'movieTitle': string;
'queue': string;
'statusIcon': string;
'unmonitored': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,14 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'header': string;
'loading': string;
'navigationButtons': string;
'titleDesktop': string;
'titleMobile': string;
'todayButton': string;
'viewButtonsContainer': string;
'viewMenu': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

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

View File

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

View File

@@ -0,0 +1,18 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'availNotMonitored': string;
'continuing': string;
'ended': string;
'legendItem': string;
'legendItemColor': string;
'legendItemContainer': string;
'legendItemText': string;
'missingMonitored': string;
'missingMonitoredColorImpaired': string;
'missingUnmonitored': string;
'missingUnmonitoredColorImpaired': string;
'queue': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -36,7 +36,7 @@ function getUrls(state) {
icalUrl += `tags=${tags.toString()}&`;
}
icalUrl += `apikey=${window.Radarr.apiKey}`;
icalUrl += `apikey=${encodeURIComponent(window.Radarr.apiKey)}`;
const iCalHttpUrl = `${window.location.protocol}//${icalUrl}`;
const iCalWebCalUrl = `webcal://${icalUrl}`;

View File

@@ -0,0 +1,18 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'addButton': string;
'container': string;
'info': string;
'labelIcon': string;
'modalFooter': string;
'overview': string;
'poster': string;
'searchForMissingMovieContainer': string;
'searchForMissingMovieInput': string;
'searchForMissingMovieLabel': string;
'searchForMissingMovieLabelContainer': string;
'year': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -35,8 +35,9 @@ class Collection extends Component {
constructor(props, context) {
super(props, context);
this.scrollerRef = React.createRef();
this.state = {
scroller: null,
jumpBarItems: { order: [] },
jumpToCharacter: null,
isPosterOptionsModalOpen: false,
@@ -78,10 +79,6 @@ class Collection extends Component {
//
// Control
setScrollerRef = (ref) => {
this.setState({ scroller: ref });
};
getSelectedIds = () => {
if (this.state.allUnselected) {
return [];
@@ -234,7 +231,6 @@ class Collection extends Component {
} = this.props;
const {
scroller,
jumpBarItems,
jumpToCharacter,
isOverviewOptionsModalOpen,
@@ -246,7 +242,7 @@ class Collection extends Component {
const selectedMovieIds = this.getSelectedIds();
const ViewComponent = getViewComponent(view);
const isLoaded = !!(!error && isPopulated && items.length && scroller);
const isLoaded = !!(!error && isPopulated && items.length && this.scrollerRef.current);
const hasNoCollection = !totalItems;
return (
@@ -306,10 +302,9 @@ class Collection extends Component {
<div className={styles.pageContentBodyWrapper}>
<PageContentBody
registerScroller={this.setScrollerRef}
ref={this.scrollerRef}
className={styles.contentBody}
innerClassName={styles[`${view}InnerContentBody`]}
onScroll={onScroll}
>
{
isFetching && !isPopulated &&
@@ -327,7 +322,7 @@ class Collection extends Component {
isLoaded &&
<div className={styles.contentBodyContainer}>
<ViewComponent
scroller={scroller}
scroller={this.scrollerRef.current}
items={items}
filters={filters}
sortKey={sortKey}

View File

@@ -0,0 +1,13 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'addSelectedButton': string;
'buttonContainer': string;
'buttonContainerContent': string;
'buttons': string;
'excludeSelectedButton': string;
'inputContainer': string;
'selectedMovieLabel': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,19 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'action': string;
'container': string;
'content': string;
'controls': string;
'editorSelect': string;
'externalLinks': string;
'link': string;
'monitorToggleButton': string;
'overlay': string;
'overlayTitle': string;
'poster': string;
'posterContainer': string;
'title': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -134,7 +134,7 @@ class CollectionMovie extends Component {
hasFile={hasFile}
status={status}
bottomRadius={true}
posterWidth={posterWidth}
width={posterWidth}
detailedProgressBar={detailedProgressBar}
isAvailable={isAvailable}
/>

View File

@@ -0,0 +1,16 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'danger': string;
'info': string;
'movie': string;
'movieStatus': string;
'movieTitle': string;
'primary': string;
'purple': string;
'queue': string;
'success': string;
'warning': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -0,0 +1,28 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'actions': string;
'content': string;
'defaults': string;
'details': string;
'detailsLabel': string;
'editorSelect': string;
'genres': string;
'info': string;
'labelsContainer': string;
'monitorToggleButton': string;
'movie': string;
'moviesContainer': string;
'navigationButtons': string;
'overview': string;
'path': string;
'qualityProfileName': string;
'sliderContainer': string;
'status': string;
'title': string;
'titleContainer': string;
'titleRow': string;
'toggleMonitoredContainer': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

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

View File

@@ -0,0 +1,37 @@
import ModelBase from 'App/ModelBase';
export interface CommandBody {
sendUpdatesToClient: boolean;
updateScheduledTask: boolean;
completionMessage: string;
requiresDiskAccess: boolean;
isExclusive: boolean;
isLongRunning: boolean;
name: string;
lastExecutionTime: string;
lastStartTime: string;
trigger: string;
suppressMessages: boolean;
movieId?: number;
}
interface Command extends ModelBase {
name: string;
commandName: string;
message: string;
body: CommandBody;
priority: string;
status: string;
result: string;
queued: string;
started: string;
ended: string;
duration: string;
trigger: string;
stateChangeTime: string;
sendUpdatesToClient: boolean;
updateScheduledTask: boolean;
lastExecutionTime: string;
}
export default Command;

11
frontend/src/Components/Alert.css.d.ts vendored Normal file
View File

@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'alert': string;
'danger': string;
'info': string;
'success': string;
'warning': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -4,7 +4,9 @@ import React from 'react';
import { kinds } from 'Helpers/Props';
import styles from './Alert.css';
function Alert({ className, kind, children, ...otherProps }) {
function Alert(props) {
const { className, kind, children, ...otherProps } = props;
return (
<div
className={classNames(
@@ -19,8 +21,8 @@ function Alert({ className, kind, children, ...otherProps }) {
}
Alert.propTypes = {
className: PropTypes.string.isRequired,
kind: PropTypes.oneOf(kinds.all).isRequired,
className: PropTypes.string,
kind: PropTypes.oneOf(kinds.all),
children: PropTypes.node.isRequired
};

9
frontend/src/Components/Card.css.d.ts vendored Normal file
View File

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

View File

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

View File

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

View File

@@ -17,7 +17,7 @@ class DescriptionListItem extends Component {
} = this.props;
return (
<span>
<div>
<DescriptionListItemTitle
className={titleClassName}
>
@@ -29,7 +29,7 @@ class DescriptionListItem extends Component {
>
{data}
</DescriptionListItemDescription>
</span>
</div>
);
}
}

View File

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

View File

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

View File

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

View File

@@ -25,6 +25,10 @@
white-space: pre-wrap;
}
.version {
margin-top: 20px;
}
@media only screen and (max-width: $breakpointMedium) {
.image {
height: 250px;

View File

@@ -0,0 +1,12 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'container': string;
'details': string;
'image': string;
'imageContainer': string;
'message': string;
'version': string;
}
export const cssExports: CssExports;
export default cssExports;

View File

@@ -1,60 +0,0 @@
import PropTypes from 'prop-types';
import React from 'react';
import styles from './ErrorBoundaryError.css';
function ErrorBoundaryError(props) {
const {
className,
messageClassName,
detailsClassName,
message,
error,
info
} = props;
return (
<div className={className}>
<div className={messageClassName}>
{message}
</div>
<div className={styles.imageContainer}>
<img
className={styles.image}
src={`${window.Radarr.urlBase}/Content/Images/error.png`}
/>
</div>
<details className={detailsClassName}>
{
error &&
<div>
{error.toString()}
</div>
}
<div className={styles.info}>
{info.componentStack}
</div>
</details>
</div>
);
}
ErrorBoundaryError.propTypes = {
className: PropTypes.string.isRequired,
messageClassName: PropTypes.string.isRequired,
detailsClassName: PropTypes.string.isRequired,
message: PropTypes.string.isRequired,
error: PropTypes.object.isRequired,
info: PropTypes.object.isRequired
};
ErrorBoundaryError.defaultProps = {
className: styles.container,
messageClassName: styles.message,
detailsClassName: styles.details,
message: 'There was an error loading this content'
};
export default ErrorBoundaryError;

View File

@@ -0,0 +1,72 @@
import React, { useEffect, useState } from 'react';
import StackTrace from 'stacktrace-js';
import styles from './ErrorBoundaryError.css';
interface ErrorBoundaryErrorProps {
className: string;
messageClassName: string;
detailsClassName: string;
message: string;
error: Error;
info: {
componentStack: string;
};
}
function ErrorBoundaryError(props: ErrorBoundaryErrorProps) {
const {
className = styles.container,
messageClassName = styles.message,
detailsClassName = styles.details,
message = 'There was an error loading this content',
error,
info,
} = props;
const [detailedError, setDetailedError] = useState<
StackTrace.StackFrame[] | null
>(null);
useEffect(() => {
if (error) {
StackTrace.fromError(error).then((de) => {
setDetailedError(de);
});
} else {
setDetailedError(null);
}
}, [error, setDetailedError]);
return (
<div className={className}>
<div className={messageClassName}>{message}</div>
<div className={styles.imageContainer}>
<img
className={styles.image}
src={`${window.Radarr.urlBase}/Content/Images/error.png`}
/>
</div>
<details className={detailsClassName}>
{error ? <div>{error.message}</div> : null}
{detailedError ? (
detailedError.map((d, index) => {
return (
<div key={index}>
{` at ${d.functionName} (${d.fileName}:${d.lineNumber}:${d.columnNumber})`}
</div>
);
})
) : (
<div>{info.componentStack}</div>
)}
{<div className={styles.version}>Version: {window.Radarr.version}</div>}
</details>
</div>
);
}
export default ErrorBoundaryError;

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