Compare commits

..

144 Commits

Author SHA1 Message Date
Qstick
edc522e412 Remove Non-Failing Rules
(cherry picked from commit e8b862a38059da4fcb5ab1ab51cf838fe5424f47)
2023-03-16 00:33:19 +00:00
santschi
d77aa82961 Fix: Stop ImageUrl from being overwritten 2023-03-12 16:45:44 -05:00
cicomalieran
c7a4060c4c Fixed: Processing very long ETA from Transmission
(cherry picked from commit 9800bd6b439257e73e3545e125cd03900a3036bb)
2023-03-12 16:13:18 -05:00
Qstick
64e6f98683 Bump version to 0.1.5 2023-02-25 20:58:09 -06:00
Qstick
dcc2a14c60 Only send monitored edition in webhook payload. 2023-02-25 13:08:13 -06:00
Qstick
22781b62e6 New: Add Editions to Webhook Payloads 2023-02-25 12:51:23 -06:00
Qstick
d93329a3fd Fixed: Installer hangs during service removal
Fixes #2223
2023-02-25 10:30:22 -06:00
Qstick
ef20abba7a New: Additional custom filter predicates for strings
(cherry picked from commit 6082253166b67d59d7907d83c362116d47bcdaeb)
2023-02-25 10:15:54 -06:00
Qstick
d647b47e88 New: Add GoodreadsId to book object in webhook events 2023-02-22 22:19:36 -06:00
Qstick
e22f284a14 New: Differentiate webhook delete event types 2023-02-22 22:19:16 -06:00
Qstick
7ac8b5600e Bump version to 0.1.4 2023-02-12 21:28:25 -06:00
Qstick
5039ba823c Make migration 027 Postgres friendly 2023-02-11 14:39:59 -06:00
Weblate
427176d7d2 Translated using Weblate (Greek) [skip ci]
Currently translated at 100.0% (901 of 901 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 100.0% (901 of 901 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 75.4% (680 of 901 strings)

Co-authored-by: KevoM <lilmarsu@gmail.com>
Co-authored-by: Qstick <qstick@gmail.com>
Co-authored-by: Vasilis Ieropoulos <kirav96@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translation: Servarr/Readarr
2023-02-11 11:35:54 -06:00
Mark McDowall
6a2fd3a4e6 Fixed: Creating new Delay Profile
(cherry picked from commit 81435dabc7a46e82c34101b4a8fe9120c875d913)
2023-02-11 11:31:18 -06:00
Qstick
e03390c8d4 Delete azuresync.yml 2023-02-11 10:37:00 -06:00
Qstick
4081f3efc2 Fixed: Settings fail to save for some auth setups
(cherry picked from commit a379d0c403449b2623f84aa6851c850971528ff8)
2023-02-07 20:28:34 -06:00
Qstick
9cec9ac428 Fixed: Remove old OMG implementation and Rarbg
Fixes #1809
Fixes #1102
Closes #2169
2023-02-05 11:05:05 -06:00
Weblate
8bd7194121 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 100.0% (901 of 901 strings)

Translated using Weblate (Ukrainian) [skip ci]

Currently translated at 66.2% (590 of 890 strings)

Translated using Weblate (Slovak) [skip ci]

Currently translated at 14.8% (132 of 890 strings)

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

Currently translated at 15.0% (134 of 890 strings)

Translated using Weblate (Catalan) [skip ci]

Currently translated at 67.0% (597 of 890 strings)

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

Currently translated at 99.8% (889 of 890 strings)

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

Currently translated at 100.0% (890 of 890 strings)

Translated using Weblate (Portuguese) [skip ci]

Currently translated at 76.8% (684 of 890 strings)

Translated using Weblate (Vietnamese) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Turkish) [skip ci]

Currently translated at 62.0% (552 of 890 strings)

Translated using Weblate (Thai) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Swedish) [skip ci]

Currently translated at 88.9% (792 of 890 strings)

Translated using Weblate (Russian) [skip ci]

Currently translated at 67.4% (600 of 890 strings)

Translated using Weblate (Romanian) [skip ci]

Currently translated at 60.3% (537 of 890 strings)

Translated using Weblate (Polish) [skip ci]

Currently translated at 65.7% (585 of 890 strings)

Translated using Weblate (Korean) [skip ci]

Currently translated at 62.1% (553 of 890 strings)

Translated using Weblate (Japanese) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 73.3% (653 of 890 strings)

Translated using Weblate (Icelandic) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Hungarian) [skip ci]

Currently translated at 99.8% (889 of 890 strings)

Translated using Weblate (Hindi) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Hebrew) [skip ci]

Currently translated at 63.7% (567 of 890 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 75.9% (676 of 890 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 89.3% (795 of 890 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 99.8% (889 of 890 strings)

Translated using Weblate (Danish) [skip ci]

Currently translated at 62.3% (555 of 890 strings)

Translated using Weblate (Czech) [skip ci]

Currently translated at 62.0% (552 of 890 strings)

Translated using Weblate (Bulgarian) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Arabic) [skip ci]

Currently translated at 62.0% (552 of 890 strings)

Translated using Weblate (Spanish) [skip ci]

Currently translated at 67.1% (598 of 890 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 67.4% (600 of 890 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 100.0% (890 of 890 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 100.0% (890 of 890 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 66.0% (588 of 890 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 66.0% (588 of 890 strings)

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

Currently translated at 100.0% (884 of 884 strings)

Translated using Weblate (Danish) [skip ci]

Currently translated at 62.2% (550 of 884 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 64.0% (564 of 881 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 89.2% (786 of 881 strings)

Translated using Weblate (Ukrainian) [skip ci]

Currently translated at 65.9% (581 of 881 strings)

Translated using Weblate (Slovak) [skip ci]

Currently translated at 14.7% (130 of 881 strings)

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

Currently translated at 15.0% (133 of 881 strings)

Translated using Weblate (Catalan) [skip ci]

Currently translated at 67.0% (591 of 881 strings)

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

Currently translated at 100.0% (881 of 881 strings)

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

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Portuguese) [skip ci]

Currently translated at 76.9% (678 of 881 strings)

Translated using Weblate (Vietnamese) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Turkish) [skip ci]

Currently translated at 62.4% (550 of 881 strings)

Translated using Weblate (Thai) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Swedish) [skip ci]

Currently translated at 89.6% (790 of 881 strings)

Translated using Weblate (Russian) [skip ci]

Currently translated at 67.1% (592 of 881 strings)

Translated using Weblate (Romanian) [skip ci]

Currently translated at 60.7% (535 of 881 strings)

Translated using Weblate (Polish) [skip ci]

Currently translated at 65.8% (580 of 881 strings)

Translated using Weblate (Korean) [skip ci]

Currently translated at 62.5% (551 of 881 strings)

Translated using Weblate (Japanese) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 73.4% (647 of 881 strings)

Translated using Weblate (Icelandic) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Hindi) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Hebrew) [skip ci]

Currently translated at 63.7% (562 of 881 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 76.1% (671 of 881 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 88.6% (781 of 881 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 63.1% (556 of 881 strings)

Translated using Weblate (Danish) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Czech) [skip ci]

Currently translated at 62.4% (550 of 881 strings)

Translated using Weblate (Bulgarian) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Arabic) [skip ci]

Currently translated at 62.4% (550 of 881 strings)

Translated using Weblate (Spanish) [skip ci]

Currently translated at 67.1% (592 of 881 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 67.5% (595 of 881 strings)

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

Currently translated at 99.8% (880 of 881 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Vasilis Ieropoulos <kirav96@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: hhjuhl <hans@kopula.dk>
Co-authored-by: zhuzhe1983 <zhuzhe1983@gmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/is/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/th/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2023-02-05 10:52:58 -06:00
Qstick
8c97df1be6 Fixed: Book status always green on Book Index page 2023-02-04 23:23:24 -06:00
Qstick
d556b77f9d Fixed: Readarr to Readarr import list adds random results 2023-02-04 22:25:44 -06:00
Mark McDowall
8b9cada59e Don't return early after re-running checks after startup grace period
Closes #1600

(cherry picked from commit 06464d720c0d31c22865629062d6da0911d2a01f)
2023-02-04 21:28:45 -06:00
Mark McDowall
a18bbeee5a Fixed: Delay health check notifications on startup
Closes #1598

(cherry picked from commit 07f0db477a91b39c1f4b884775c08a55ada487cf)
2023-02-04 21:28:45 -06:00
Qstick
6f17057f31 Fixed: Queue conflicts with the same download in multiple clients
Closes #1220
2023-02-04 21:28:45 -06:00
Qstick
4d3e83ec15 Fixed: Download client name in history details
Closes #1413
2023-02-04 21:28:45 -06:00
Zack Eckersley Pallett
4034250a33 New: Add backup size information
Closes #1533
2023-02-04 21:28:45 -06:00
Qstick
d83c02fe9f New: Notifiarr and Webhook Updates 2023-02-04 19:30:54 -06:00
Qstick
b4112dc4bb Fixed: Correctly handle Content-Encoding headers 2023-02-04 19:30:54 -06:00
Mark McDowall
a463166bb6 Fixed: Clearing logs not updating UI once complete
Closes #1566

(cherry picked from commit 56b3acddc9f50f59c78c03ca072fe802752b88a7)
2023-02-04 19:30:54 -06:00
Qstick
d7d57f0162 Updated some JS dependencies
Closes #2083
2023-02-04 19:30:54 -06:00
Qstick
8258323307 Add Volta node config
Closes #1848
Closes #1849
Closes #1935
2023-02-04 19:30:54 -06:00
Qstick
d15c42957a New: Add import date to upgrads in CustomScript and Webhook connections
Closes #1827
2023-02-04 19:30:54 -06:00
Qstick
df0a5f004d Fixed: Improve moving file to location where another one exists
Closes #1762
2023-02-04 19:30:54 -06:00
Qstick
d8f11bc3cb Replace unicode brackets 2023-02-04 19:30:54 -06:00
Qstick
71c2b1aeec Fixed: Migrating case-sensitive Preferred Word REGEX to Custom Formats
Closes #2162
2023-02-04 19:30:54 -06:00
Mark McDowall
6f7c6721db Fixed: Ping endpoint no longer requires authentication
(cherry picked from commit ad42d4a14c814d5911dafb5e78e97ec09b4b13a5)
2023-02-04 18:15:15 -06:00
Mark McDowall
388fb52644 Fixed cutoff unmet integration tests
Closes #1692

(cherry picked from commit c1e5b7f642d03414f7c5587d4db377ef979f2067)
2023-02-03 21:11:54 -06:00
Qstick
de46816cdb Fixed: Cutoff Unmet showing items above lowest accepted quality when upgrades are disabled
Closes #1688
2023-02-03 21:11:54 -06:00
Qstick
dbb6ef7664 New: Custom Formats
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2023-02-03 21:11:54 -06:00
Qstick
4a3062deae Bump version to 0.1.3 2023-02-03 20:50:27 -06:00
Qstick
bc7bf6b269 Fixed: Ignore deleted books won't save
Fixes #1505
2023-02-02 22:11:58 -06:00
Qstick
01b4ee1a02 Fixed: Search selected searches all
Fixes #2155
2023-02-02 21:35:01 -06:00
Qstick
3825ecd393 Fixed: Manual Import Reprocessing 2023-01-24 11:51:34 -06:00
Qstick
bc63587428 New: Add support for Simplepush notifications
Closes #1989
Closes #1990

Co-Authored-By: Timm Schäuble <Timm.Schaeuble@gmail.com>
(cherry picked from commit 4c7df31070fbd370b26dbcc07131f21eb88d35fc)
2023-01-24 11:51:34 -06:00
Qstick
1caa49c895 Update UI Packages
Align with Lidarr
2023-01-24 11:51:34 -06:00
Qstick
fbdc9f3a13 New: OnApplicationUpdate Notifications
Fixes #1422

(cherry picked from commit 9e175e28efcfc6ac3e414649b955a10fb0e951e7)
2023-01-24 11:51:34 -06:00
Qstick
f5847e9e5b New: Show previously installed version in Updates UI
Closes #308
Closes #309
Closes #313
Closes #319
Closes #460
Closes #608

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2023-01-24 11:51:34 -06:00
Qstick
874b4fc401 New: Ignore #recycle folders (Synology Recycle bin folder)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-01-24 11:51:34 -06:00
Qstick
ec75aa6378 Bump Npgsql to 6.0.8 2023-01-23 21:37:27 -06:00
Qstick
31aaec4b10 Don't block task queue for queued update task when long running tasks queued
Fixes #1818

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-01-23 21:28:05 -06:00
Qstick
6199cb2999 Fixed: Schedule refresh and process monitored download tasks at high priority
Fixes #1542
Fixes #1553
Fixes #1537
2023-01-23 21:27:36 -06:00
Qstick
adb22868b6 New: Description for indexer RSS setting
Fixes #2098
2023-01-23 21:21:22 -06:00
Qstick
20cf7c1ffc Fix RootFolder logs in DiskScanService 2023-01-23 21:17:35 -06:00
Mark McDowall
13fd31b67d New: Improved messaging when qBittorrent fails due to host header rejection
Closes #2099
Closes #2100

(cherry picked from commit 48b4cc5f3ffa0cb8eea6748db9091267216cef4f)
2023-01-23 21:14:35 -06:00
Zak Saunders
95dbfb6e4a Fixed: Progress bar text colour in Dark theme
Closes #2091

(cherry picked from commit ca61efa57fc04a7f6753aedb4b8044d17e345429)
2023-01-23 21:13:18 -06:00
Qstick
31c8092960 New: Author name first character renaming token
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-01-23 21:11:04 -06:00
Qstick
06fbd5f93d New: Reset Quality Definitions to default
Closes #1719

(cherry picked from commit d5fff15f32fdb49768dcadd94c760678e650c884)
2023-01-23 21:04:51 -06:00
Qstick
44c37b3f47 Update DeploymentInfoProvider.cs 2023-01-23 21:02:07 -06:00
Qstick
5726df841c Fixed: Logging when series folder is moved successfully
Closes #1764

Co-Authored-By: David Newhall <2402929+davidnewhall@users.noreply.github.com>
2023-01-23 20:42:11 -06:00
Alan Collins
590b203bb6 Adjusted the Windows LongPath support check for valid segment lengths
Closes #1512

(cherry picked from commit 52c6bc5549ab998ccc018d138c55f8f924eed6d3)
2023-01-23 20:40:03 -06:00
Qstick
9982df9d2b Bump Sentry to 3.25.0
Closes #1978
2023-01-23 20:37:47 -06:00
Qstick
d1741c8b75 API Updates
Fixes #2011
Fixes #1376
Fixes #1379

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-01-23 20:33:02 -06:00
Mark McDowall
20a477f95d Fixed: Only log /proc/mounts exception once per process
Closes #2080

(cherry picked from commit ce0388ca99b7f89bd9e8971777a7995c4361d268)
2023-01-23 20:28:27 -06:00
Qstick
e346eb6c64 Update coverlet.runsettings 2023-01-23 20:27:01 -06:00
Lewis England
49710b8863 fix: add end date to calendar events 2023-01-23 20:24:56 -06:00
Qstick
2699f7c0d7 Fixed: Use route Id for PUT requests if not passed in body
Closes #1994
2023-01-23 20:16:38 -06:00
Zak Saunders
ed1b29f8e4 New: Auto theme option to match OS theme
Closes #2022

Co-authored-by: Qstick <qstick@gmail.com>
(cherry picked from commit 4ca5a213fa0fc29ed93e7e31b080728d6fa7f1f3)
2023-01-23 20:15:38 -06:00
Mark McDowall
8a4d309d57 New: IPv6 support for connections/indexers/download clients
Closes #2026

(cherry picked from commit 1b90fbcf7df2c1086da4791c6491771924b1b7aa)
2023-01-23 20:12:49 -06:00
Mark McDowall
7dc061cc8a Fixed: Improve Bind Address validation and help text
Closes #2025

(cherry picked from commit 6bdeafcf8c78e145595f52e885356be1210abe91)
2023-01-23 20:12:49 -06:00
Qstick
cef06d11a5 Bump Newtonsoft to 13.0.2 2023-01-23 20:12:49 -06:00
bakerboy448
9235ae85bc Fixed: Improve RarBG Error Handling
Closes #1883
Closes #1884

(cherry picked from commit 7cd38bba841659a595fe4a0e14c478fc4e4047b1)
2023-01-23 20:12:33 -06:00
Mark McDowall
b123952010 Fixed: Grab/remove queue actions not showing spinner
Closes #2002

(cherry picked from commit 51b1ba13c1b9dc9e26469c728e3871d4b7da0788)
2023-01-23 20:11:29 -06:00
Qstick
e62d00103d Simplify X-Forwarded-For handling
This happens in asp.net middleware now

Closes #2033
Closes #2034

(cherry picked from commit 16e2d130e6a2e7239bcfe92187a7f990f93eff00)
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2023-01-23 20:11:29 -06:00
Qstick
13dad33e31 New: Improve IPAddress.IsLocal method
Closes #2032

(cherry picked from commit fd98a179ab6fed8037c99344b34593aac24a0ac0)
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2023-01-23 20:11:12 -06:00
Qstick
be8e50a41f Fixed: Avoid Sqlite Error when all profiles have lowest quality cutoff
Closes #2147
Fixes #1911

(cherry picked from commit f05e109b50cca496e7b42e2833eff161a43e12f4)
2023-01-22 23:14:27 -06:00
Zak Saunders
6e38df366f New: Darkmode
* New: Native Theme Engine

Co-Authored-By: Zak Saunders <thezak48@users.noreply.github.com>
(cherry picked from commit 2291f3e00eb2ff9268a0b2f49da8dde82ee13c04)

* Update CSS for themes

* Fixup CSS values

* Fixup remove duped Color-Impaired setting

* Fixup Link Colors

Co-Authored-By: Qstick <qstick@gmail.com>
2023-01-21 18:18:48 -06:00
PearsonFlyer
91b8565629 Fix notifiation in Ntfy on test from Radarr to Readarr (#2141) 2023-01-21 17:35:49 -06:00
Qstick
7d02c00ca8 Bump version to 0.1.2 2023-01-21 13:45:45 -06:00
Qstick
b83ccc19b0 Bump MonoTorrent to 2.0.7 2023-01-21 13:41:04 -06:00
Mark McDowall
93086abf58 Fixed: Multiple pushed releases will be processed sequentially
(cherry picked from commit 1f8e1cf582f59fe1e8dcc0fad15afeed6d9cd9d1)
2023-01-21 13:39:06 -06:00
Qstick
f68dc04273 Fixed: RemotePathMappingCheck Improvements 2023-01-21 13:25:12 -06:00
Qstick
5664054f95 Fixed: DownloadClientRootFolderCheck Improvements 2023-01-21 13:25:11 -06:00
Qstick
f16bd435db Fixed: Catch InvalidDataException during initial config to prevent boot loop
[Common]
2023-01-21 13:25:11 -06:00
Qstick
2bde9d13dd Fixed: Restore old Sqlite version compatibility 2023-01-16 19:46:15 -06:00
ta264
f448481460 New: Respect 429 Retry-After responses from BookInfo 2023-01-13 13:07:21 +00:00
ta264
70856c217c Fixed: Adding book by edition id 2023-01-13 13:07:21 +00:00
Weblate
4db158e0c9 Translated using Weblate (Swedish) [skip ci]
Currently translated at 89.5% (789 of 881 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 66.9% (590 of 881 strings)

Translated using Weblate (Ukrainian) [skip ci]

Currently translated at 53.0% (467 of 881 strings)

Translated using Weblate (Russian) [skip ci]

Currently translated at 66.8% (589 of 881 strings)

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

Currently translated at 100.0% (881 of 881 strings)

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

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 72.4% (638 of 881 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 62.6% (552 of 881 strings)

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

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Ukrainian) [skip ci]

Currently translated at 50.3% (444 of 881 strings)

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

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Bengali) [skip ci]

Currently translated at 0.2% (2 of 881 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 85.9% (757 of 881 strings)

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

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 72.4% (638 of 881 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 80.0% (705 of 881 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 99.7% (879 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 70.8% (624 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 70.0% (617 of 881 strings)

Translated using Weblate (Russian) [skip ci]

Currently translated at 66.6% (587 of 881 strings)

Translated using Weblate (Hungarian) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 66.0% (582 of 881 strings)

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

Currently translated at 100.0% (881 of 881 strings)

Co-authored-by: AlexR-sf <omg.portal.supp@gmail.com>
Co-authored-by: Anthony Veaudry <anthonyveaudry@gmail.com>
Co-authored-by: Casselluu <jack10193@163.com>
Co-authored-by: Csaba <csab0825@gmail.com>
Co-authored-by: Davide Palma <github@davidepalma.it>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Iagocds <cdsiago@gmail.com>
Co-authored-by: Luc Timmerman <timmerman.luc1999@gmail.com>
Co-authored-by: Mipiaceanutella <remix-polity-0l@icloud.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Robin Flikkema <robin@robinflikkema.nl>
Co-authored-by: Tanreon <tanreon@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: andrey4korop <andrey999@i.ua>
Co-authored-by: benniblot <ben2004engler@gmail.com>
Co-authored-by: deepserket <deepserket@gmail.com>
Co-authored-by: hidaba <nag@hidaba.com>
Co-authored-by: lhquark <lhquark@gmail.com>
Co-authored-by: oskhel <oskar.hellgren@gmail.com>
Co-authored-by: qing zhang <fzeehom@126.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: saambd <me@salimrahman.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/bn/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2023-01-10 22:22:38 -06:00
Qstick
55ab909fde Cleanup translate.js 2022-12-17 12:50:14 -06:00
Qstick
61c9779022 Fixed: Correct Attribute compare for Id validation
(cherry picked from commit 7e48ea0231272ae56c30f5f43339f0dca7a27fb3)
2022-12-17 12:13:56 -06:00
Qstick
8299c8e13e Update README for DigitalOcean attribution
(cherry picked from commit d3517532a4e28eb716bd949dc7fdbd85da316a0e)
2022-12-17 11:33:34 -06:00
Qstick
da5e35fc25 Unbork UI Build 2022-11-28 22:11:13 -06:00
Mark McDowall
a6a2219bc4 Fixed: Handle Flood reporting errors for completed and stopped downloads
(cherry picked from commit f2b2eb69a3e8b271535bd92dc2f5cbfd45664daf)
2022-11-28 21:25:03 -06:00
Qstick
aa2855a62b Re-saving edited providers will forcibly save them
Fixes #533

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2022-11-27 19:32:14 -06:00
Qstick
599f52e72f Fixed: Validation when testing indexers, import lists, connections and download clients
Fixes #1612

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2022-11-27 19:10:12 -06:00
Qstick
c5c2b94b9a Fixup Repack Tests 2022-11-25 22:16:34 -06:00
Qstick
b016b36435 Fixed: Validate if equals or child for startup folder
Fixes #1712
Close #1713

(cherry picked from commit 0991cfe27efd6ddb533227b25754661e18d7e9ad)
2022-11-25 22:07:42 -06:00
Qstick
d93a0c27e9 Sentry logging exceptions
Fixes #855

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2022-11-25 21:58:58 -06:00
Qstick
eecf08e063 Updated NLog Version
Co-Authored-By: Robin Dadswell <19610103+RobinDadswell@users.noreply.github.com>
2022-11-25 21:52:52 -06:00
Qstick
fb1643f630 Lint Fixes 2022-11-25 21:39:44 -06:00
bakerboy448
a061179f6b Fixed: Repack Preference Ignored
Fixes #1867

(cherry picked from commit 04447d9d4db8cc3d54baf0a721f4430cf77908c4)
2022-11-25 21:39:44 -06:00
Stevie Robinson
b441f6c05b Fixed: updated rTorrent download client note
Fixes #1882

(cherry picked from commit 743d28b93a55553ee25381570d0daa04ed2117af)
2022-11-25 21:33:35 -06:00
Chromo-residuum-opec
0904eac300 Update help text for rTorrent download client options
Fixes #1868

(cherry picked from commit d2a23f7bcdf71800f019644d7b6b5d712e311d7f)
2022-11-25 21:31:57 -06:00
Qstick
29e3d8f477 Fixed: Fall back to sorting by release title if artist is not matched
Fixes #1870
2022-11-25 21:29:38 -06:00
Qstick
71bd88e531 New: Add Release group to history for all events
Fixes #1499

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2022-11-25 21:28:05 -06:00
Stevie Robinson
0689bec779 New: Add optional Source Title column to history
(cherry picked from commit 581fb2cb3d47d62fe16b840081647056ec77043d)
2022-11-25 21:16:37 -06:00
Devin Buhl
117a5c8010 New: Add application URL to host configuration settings
Fixes #1816
Closes #1817

(cherry picked from commit 762042ba97c2ae689cee32d8e66a458f6d7a8adc)
2022-11-25 21:16:37 -06:00
Qstick
d10d91439f New: Add indexer name to the download report log
Fixes #1904
2022-11-25 21:16:37 -06:00
Mark McDowall
ed0722bae4 New: Validate that naming formats don't contain illegal characters
Fixes #620

(cherry picked from commit 145c644c9d8f1636027da8a782a7e74f3182c678)
2022-11-25 21:16:37 -06:00
psylenced
e69371deca Fix: Trace logging postgres cleanse for large json files.
(cherry picked from commit 2ce9d099e1001eb4fccd61edcb0597782da872d4)
2022-11-25 20:30:54 -06:00
Chris
5ae8deb9d6 Fixed: Postgres secret regex now less greedy
[common]

(cherry picked from commit 812e5ac5a3d76b69c172c5611b315ea809ab4b48)
2022-11-25 20:30:54 -06:00
Chris
291674fc18 Fixed: Regex in log cleanser taking 10+ minutes on messages longer than 100k.
(cherry picked from commit d01bae92bfd68b04c54ab19bafe8af16c68ce711)
2022-11-25 20:30:54 -06:00
Qstick
774cd04d32 Fixed SeedConfigProvider cache refresh after indexer settings change
Fixes #1036

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2022-11-25 20:24:00 -06:00
Qstick
3eb0533b17 New: Disable autocomplete of port number
Fixes #1249

Co-Authored-By: Stevie Robinson <stevie.robinson@gmail.com>
2022-11-25 20:21:10 -06:00
Qstick
2fe11ca1a9 Rename NzbSearchService to ReleaseSearchService
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2022-11-25 20:18:28 -06:00
Qstick
c8ae6b0299 Fixed: Custom Script Health Issue Level
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2022-11-25 20:14:47 -06:00
Qstick
2086ae1e2c Ensure .Mono and .Windows projects have all dependencies in build output
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2022-11-25 20:10:23 -06:00
Chris
2aeec97d5e Added: Ntfy provider for notifications
(cherry picked from commit f6e6bc98f7846328d158ab2f804ca65b49632912)
2022-11-25 20:02:23 -06:00
Qstick
45e9d14916 New: Base API info endpoint
(cherry picked from commit 5e57ffbcf9ac3a346d4bf2b692248393215bad89)
2022-11-25 20:01:21 -06:00
Qstick
ded45a53f3 Improve page scrollbar
Fixed: Scrolling in Firefox in small window (requires refresh)
New: Style scrollbar in Firefox
Fixed: Scrolling with click and drag
Fixes #3088
Fixes #2706
2022-11-25 20:00:56 -06:00
Mark McDowall
d5cbb8f84f Replace react-custom-scrollbars
(cherry picked from commit 1c6c9a7960865d4bf8f58d5d04bef1aa1409594a)
2022-11-25 20:00:56 -06:00
Mark McDowall
cac0fca0d2 Added react-hooks lint rules
(cherry picked from commit 381d64259396582de8d63ada99333e42cf5e3189)
2022-11-25 19:55:55 -06:00
Mark McDowall
9b5a050c40 Publish ApplicationStartingEvent during startup
(cherry picked from commit 5400bce1295bdc4198d2cfe0b9258bbb7ccf0852)
2022-11-25 19:54:05 -06:00
Weblate
9fa67dbe5f Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (879 of 879 strings)

Translated using Weblate (Czech) [skip ci]

Currently translated at 62.4% (549 of 879 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 79.8% (702 of 879 strings)

Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Zalhera <tobias.bechen@gmail.com>
Co-authored-by: marapavelka <mara.pavelka@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translation: Servarr/Readarr
2022-11-25 19:25:06 -06:00
Mark McDowall
505ef5ee63 Fixed: Testing SABnzbd when no categories are configured
(cherry picked from commit 0e31281828c737e3f6eecbb870960194888a970a)
2022-11-25 19:24:38 -06:00
Mark McDowall
87a2d7382e Added SECURITY.md
(cherry picked from commit 80af164385d9087a627142ca2281ae74ac0572af)

(cherry picked from commit aa8e886dab3ffedc835900db39787d47dc12465c)
2022-11-21 19:25:11 -06:00
Qstick
7c74a8df01 Fixed: UI Errors in Add Book page
Fixes #1906
2022-11-03 16:30:54 -05:00
Qstick
f8324b3c92 Create CODE_OF_CONDUCT.md 2022-11-03 15:58:16 -05:00
Weblate
cb03f3bf6b Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
Currently translated at 100.0% (879 of 879 strings)

Update translation files [skip ci]

Updated by "Remove blank strings" hook in Weblate.

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

Currently translated at 69.0% (607 of 879 strings)

Translated using Weblate (Portuguese) [skip ci]

Currently translated at 76.7% (675 of 879 strings)

Co-authored-by: Sincejunly <qq943384135@gmail.com>
Co-authored-by: Tiago Ribeiro <tiago.err@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: libsu <libsu@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2022-11-03 10:42:08 -05:00
ta264
d6f85ec4f9 Use wildcard for FreeBSD itemPattern 2022-11-02 21:22:34 +00:00
Qstick
dd0dd921b0 Ignore brotli test on osx
(cherry picked from commit 2afe6af5a6dac26fe9d2c20e806a93b621e18bbf)
2022-10-30 19:03:10 -05:00
Mark McDowall
1f02423148 Fixed: Series list jump bar click issues
(cherry picked from commit 9c7378625112088d022239fdbdb90c0dc941d61d)
2022-10-20 20:42:53 -05:00
Qstick
7a4fba851f fixup! 2022-10-20 20:39:36 -05:00
Qstick
2d5efc268f New: Retry Postgres connection 3 times (with 5 second sleep) on Startup
(cherry picked from commit 3e700b63c26b247fcac83428ba79e53c88f797ff)

(cherry picked from commit dbca393772d7f558b45a780a6767187bf5900a23)
2022-10-20 20:39:36 -05:00
Mark McDowall
cad5762f31 Sliding expiration for auth cookie and a little clean up
Fixes #1802

(cherry picked from commit 05ee4e644907b7f1e84589465ac9ab1848f5a766)
2022-10-20 20:23:15 -05:00
Qstick
bcc8370d05 Cleanup dual target and mono code
Fixes #1893
Fixes #1808
2022-10-20 20:19:52 -05:00
Qstick
3481168df5 Fixed: qBittorrent Updates
Fixes #1658
Fixes #1536
2022-10-20 20:03:55 -05:00
Qstick
337a30ac0f Add thread to discord notifications 2022-10-19 22:00:13 -05:00
Weblate
eaad4de4dc Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]
Currently translated at 69.0% (607 of 879 strings)

Translated using Weblate (Polish) [skip ci]

Currently translated at 65.4% (575 of 879 strings)

Translated using Weblate (Slovak) [skip ci]

Currently translated at 7.3% (65 of 879 strings)

Translated using Weblate (Portuguese) [skip ci]

Currently translated at 76.3% (671 of 879 strings)

Translated using Weblate (Portuguese) [skip ci]

Currently translated at 76.3% (671 of 879 strings)

Translated using Weblate (Chinese (Traditional) (zh_TW)) [skip ci]

Currently translated at 0.6% (6 of 879 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 79.8% (702 of 879 strings)

Translated using Weblate (Japanese) [skip ci]

Currently translated at 62.3% (548 of 879 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 69.8% (614 of 879 strings)

Translated using Weblate (Icelandic) [skip ci]

Currently translated at 62.3% (548 of 879 strings)

Translated using Weblate (Hindi) [skip ci]

Currently translated at 62.3% (548 of 879 strings)

Translated using Weblate (Hebrew) [skip ci]

Currently translated at 63.8% (561 of 879 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 75.9% (668 of 879 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 79.8% (702 of 879 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 62.3% (548 of 879 strings)

Translated using Weblate (Danish) [skip ci]

Currently translated at 62.3% (548 of 879 strings)

Translated using Weblate (Czech) [skip ci]

Currently translated at 62.3% (548 of 879 strings)

Translated using Weblate (Bulgarian) [skip ci]

Currently translated at 62.3% (548 of 879 strings)

Translated using Weblate (Arabic) [skip ci]

Currently translated at 62.4% (549 of 879 strings)

Translated using Weblate (Spanish) [skip ci]

Currently translated at 67.2% (591 of 879 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 65.8% (579 of 879 strings)

Added translation using Weblate (Latvian) [skip ci]

Translated using Weblate (German) [skip ci]

Currently translated at 92.0% (809 of 879 strings)

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

Currently translated at 100.0% (879 of 879 strings)

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

Currently translated at 100.0% (879 of 879 strings)

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

Currently translated at 67.9% (597 of 879 strings)

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

Currently translated at 99.5% (875 of 879 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 75.0% (660 of 879 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 92.0% (809 of 879 strings)

Translated using Weblate (Spanish) [skip ci]

Currently translated at 67.1% (590 of 879 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Dainel Amendoeira <daniel@amendoeira.eu>
Co-authored-by: Gian Klug <gian.klug@ict-scouts.ch>
Co-authored-by: Gylesie <github-anon.dasheens@aleeas.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: HiNesslio <chi.lio@shms-mail.ch>
Co-authored-by: Marcin <ml.cichy@gmail.com>
Co-authored-by: Mijail Todorovich <mijailtodorovich+git@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Thomas Schwery <thomas@schwery.me>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: cikyw <cikyw@vomoto.com>
Co-authored-by: fyu0h <biiigback@gmail.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: 麋鹿先生 <y.qiuyu@outlook.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/is/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_TW/
Translation: Servarr/Readarr
2022-10-16 10:06:07 -05:00
Mark McDowall
b98ae37abf Handle redirects for 308 redirects
(cherry picked from commit 6eed7c8fed096fa1762448bc57876440f542be98)
2022-10-16 10:03:35 -05:00
Stevie Robinson
5dac84f9d8 New: Torrent Seed Ratio no longer advance settings
(cherry picked from commit c98fac65ed8e669c5e97ed3255c424b61fe0e8b3)
2022-10-16 10:03:06 -05:00
bakerboy448
ef21c73619 update feature request template
[skip ci]

(cherry picked from commit 362e664ce6d301e8283d489b3e0d945db46d22d3)
2022-10-16 10:02:34 -05:00
Joe Milazzo
14d74f2eca New: Kavita Connection (#1880)
* Added ability for Readarr to inform Kavita when a change occurs for rescan.

* Use the existing API with a POST rather than a new API.

* Updated some wording

* Fixed PR comments
2022-10-02 18:41:38 -05:00
servarr[bot]
c3cbbb7627 Update Bug Report Template [skip ci] (#1842)
(cherry picked from commit 99e0d42b717b279be0f9005039025cd730f90f6c)

Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
2022-09-26 21:05:36 -05:00
servarr[bot]
ad3a58c422 New: Parse version with a space before 'v''
* New: Parse anime version with a space before 'v'

(cherry picked from commit e9123982f33ab35ca022f91f345da05fef23d6dc)

* Delete AnimeVersionFixture.cs

Co-authored-by: Mark McDowall <mark@mcdowall.ca>
Co-authored-by: Qstick <qstick@gmail.com>
2022-09-26 16:55:34 -05:00
Robin Dadswell
347b154882 Update Bug Report Template
[skip ci]

(cherry picked from commit b9185574f3761e125151907e3d31511689a4513e)
2022-09-26 16:42:52 -05:00
963 changed files with 17959 additions and 7607 deletions

View File

@@ -204,9 +204,6 @@ dotnet_diagnostic.CA2000.severity = suggestion
dotnet_diagnostic.CA2002.severity = suggestion
dotnet_diagnostic.CA2007.severity = suggestion
dotnet_diagnostic.CA2008.severity = suggestion
dotnet_diagnostic.CA2009.severity = suggestion
dotnet_diagnostic.CA2010.severity = suggestion
dotnet_diagnostic.CA2011.severity = suggestion
dotnet_diagnostic.CA2012.severity = suggestion
dotnet_diagnostic.CA2013.severity = suggestion
dotnet_diagnostic.CA2100.severity = suggestion

View File

@@ -5,9 +5,9 @@ body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an issue already exists for the bug you encountered.
description: Please search to see if an open or closed issue already exists for the bug you encountered. If a bug exists and is closed note that it may only be fixed in an unstable branch.
options:
- label: I have searched the existing issues
- label: I have searched the existing open and closed issues
required: true
- type: textarea
attributes:
@@ -42,12 +42,14 @@ body:
- **Docker Install**: Yes
- **Using Reverse Proxy**: No
- **Browser**: Firefox 90 (If UI related)
- **Database**: Sqlite 3.36.0
value: |
- OS:
- Readarr:
- Docker Install:
- Using Reverse Proxy:
- Browser:
- Database:
render: markdown
validations:
required: true

View File

@@ -5,9 +5,9 @@ body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: Please search to see if an issue already exists for the feature you are requesting.
description: Please search to see if an open or closed issue already exists for the feature you are requesting. If a request exists and is closed note that it may only be fixed in an unstable branch.
options:
- label: I have searched the existing issues
- label: I have searched the existing open and closed issues
required: true
- type: textarea
attributes:

View File

@@ -1,41 +0,0 @@
name: Sync issue to Azure DevOps work item
on:
issues:
types:
[opened, edited, deleted, closed, reopened, labeled, unlabeled, assigned]
concurrency: azuresync-${{ github.event.issue.number }}
jobs:
alert:
runs-on: ubuntu-latest
steps:
- uses: danhellem/github-actions-issue-to-work-item@master
if: "${{ contains(github.event.issue.labels.*.name, 'Type: Bug') == true }}"
env:
ado_token: "${{ secrets.ADO_PERSONAL_ACCESS_TOKEN }}"
github_token: "${{ github.token }}"
ado_organization: "Servarr"
ado_project: "Servarr"
ado_area_path: "Servarr\\Readarr"
ado_wit: "Bug"
ado_new_state: "New"
ado_active_state: "Active"
ado_close_state: "Closed"
ado_bypassrules: true
log_level: 100
- uses: danhellem/github-actions-issue-to-work-item@master
if: "${{ contains(github.event.issue.labels.*.name, 'Type: Bug') == false }}"
env:
ado_token: "${{ secrets.ADO_PERSONAL_ACCESS_TOKEN }}"
github_token: "${{ github.token }}"
ado_organization: "Servarr"
ado_project: "Servarr"
ado_area_path: "Servarr\\Readarr"
ado_wit: "User Story"
ado_new_state: "New"
ado_active_state: "Active"
ado_close_state: "Closed"
ado_bypassrules: true
log_level: 100

132
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,132 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
<development@readarr.com>.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@@ -62,6 +62,15 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
[![Mega Sponsors List](https://opencollective.com/Readarr/tiers/mega-sponsor.svg?width=890)](https://opencollective.com/readarr#mega-sponsor)
## DigitalOcean
This project is also supported by DigitalOcean
<p>
<a href="https://www.digitalocean.com/">
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg" width="201px">
</a>
</p>
### License
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)

8
SECURITY.md Normal file
View File

@@ -0,0 +1,8 @@
# Security Policy
## Reporting a Vulnerability
Please report (suspected) security vulnerabilities on Discord (preferred) to
any of the Servarr Dev role holders (red names) or via email: development@servarr.com. You will receive a response from
us within 72 hours. If the issue is confirmed, we will release a patch as soon
as possible depending on complexity/severity.

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '0.1.1'
majorVersion: '0.1.5'
minorVersion: $[counter('minorVersion', 1)]
readarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
@@ -730,7 +730,7 @@ stages:
inputs:
buildType: 'current'
artifactName: Packages
itemPattern: '/$(pattern)'
itemPattern: '**/$(pattern)'
targetPath: $(Build.ArtifactStagingDirectory)
- bash: |
mkdir -p ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin
@@ -1050,3 +1050,4 @@ stages:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
DISCORDCHANNELID: $(discordChannelId)
DISCORDWEBHOOKKEY: $(discordWebhookKey)
DISCORDTHREADID: $(discordThreadId)

View File

@@ -39,6 +39,7 @@ module.exports = {
plugins: [
'filenames',
'react',
'react-hooks',
'simple-import-sort',
'import'
],
@@ -308,7 +309,9 @@ module.exports = {
'react/react-in-jsx-scope': 2,
'react/self-closing-comp': 2,
'react/sort-comp': 2,
'react/jsx-wrap-multilines': 2
'react/jsx-wrap-multilines': 2,
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'error'
},
overrides: [
{

View File

@@ -44,7 +44,8 @@ module.exports = (env) => {
'node_modules'
],
alias: {
jquery: 'jquery/src/jquery'
jquery: 'jquery/src/jquery',
'react-middle-truncate': 'react-middle-truncate/lib/react-middle-truncate'
},
fallback: {
buffer: false,

View File

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

View File

@@ -61,33 +61,33 @@ class Blocklist extends Component {
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState);
}
};
//
// Listeners
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
};
onRemoveSelectedPress = () => {
this.setState({ isConfirmRemoveModalOpen: true });
}
};
onRemoveSelectedConfirmed = () => {
this.props.onRemoveSelected(this.getSelectedIds());
this.setState({ isConfirmRemoveModalOpen: false });
}
};
onConfirmRemoveModalClose = () => {
this.setState({ isConfirmRemoveModalOpen: false });
}
};
//
// Render

View File

@@ -68,37 +68,37 @@ class BlocklistConnector extends Component {
repopulate = () => {
this.props.fetchBlocklist();
}
};
//
// Listeners
onFirstPagePress = () => {
this.props.gotoBlocklistFirstPage();
}
};
onPreviousPagePress = () => {
this.props.gotoBlocklistPreviousPage();
}
};
onNextPagePress = () => {
this.props.gotoBlocklistNextPage();
}
};
onLastPagePress = () => {
this.props.gotoBlocklistLastPage();
}
};
onPageSelect = (page) => {
this.props.gotoBlocklistPage({ page });
}
};
onRemoveSelected = (ids) => {
this.props.removeBlocklistItems({ ids });
}
};
onSortPress = (sortKey) => {
this.props.setBlocklistSort({ sortKey });
}
};
onTableOptionChange = (payload) => {
this.props.setBlocklistTableOption(payload);
@@ -106,11 +106,11 @@ class BlocklistConnector extends Component {
if (payload.pageSize) {
this.props.gotoBlocklistFirstPage();
}
}
};
onClearBlocklistPress = () => {
this.props.executeCommand({ name: commandNames.CLEAR_BLOCKLIST });
}
};
//
// Render

View File

@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import AuthorNameLink from 'Author/AuthorNameLink';
import BookFormats from 'Book/BookFormats';
import BookQuality from 'Book/BookQuality';
import IconButton from 'Components/Link/IconButton';
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
@@ -30,11 +31,11 @@ class BlocklistRow extends Component {
onDetailsPress = () => {
this.setState({ isDetailsModalOpen: true });
}
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
};
//
// Render
@@ -45,6 +46,7 @@ class BlocklistRow extends Component {
author,
sourceTitle,
quality,
customFormats,
date,
protocol,
indexer,
@@ -110,6 +112,16 @@ class BlocklistRow extends Component {
);
}
if (name === 'customFormats') {
return (
<TableRowCell key={name}>
<BookFormats
formats={customFormats}
/>
</TableRowCell>
);
}
if (name === 'date') {
return (
<RelativeDateCellConnector
@@ -174,6 +186,7 @@ BlocklistRow.propTypes = {
author: PropTypes.object.isRequired,
sourceTitle: PropTypes.string.isRequired,
quality: PropTypes.object.isRequired,
customFormats: PropTypes.arrayOf(PropTypes.object).isRequired,
date: PropTypes.string.isRequired,
protocol: PropTypes.string.isRequired,
indexer: PropTypes.string,

View File

@@ -9,6 +9,7 @@ import Link from 'Components/Link/Link';
import { icons } from 'Helpers/Props';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge';
import formatPreferredWordScore from 'Utilities/Number/formatPreferredWordScore';
import translate from 'Utilities/String/translate';
import styles from './HistoryDetails.css';
@@ -65,8 +66,10 @@ function HistoryDetails(props) {
const {
indexer,
releaseGroup,
customFormatScore,
nzbInfoUrl,
downloadClient,
downloadClientName,
downloadId,
age,
ageHours,
@@ -74,6 +77,8 @@ function HistoryDetails(props) {
publishedDate
} = data;
const downloadClientNameInfo = downloadClientName ?? downloadClient;
return (
<DescriptionList>
<DescriptionListItem
@@ -100,7 +105,16 @@ function HistoryDetails(props) {
}
{
!!nzbInfoUrl &&
customFormatScore && customFormatScore !== '0' ?
<DescriptionListItem
title="Custom Format Score"
data={formatPreferredWordScore(customFormatScore)}
/> :
null
}
{
nzbInfoUrl ?
<span>
<DescriptionListItemTitle>
Info URL
@@ -109,15 +123,17 @@ function HistoryDetails(props) {
<DescriptionListItemDescription>
<Link to={nzbInfoUrl}>{nzbInfoUrl}</Link>
</DescriptionListItemDescription>
</span>
</span> :
null
}
{
!!downloadClient &&
downloadClientNameInfo ?
<DescriptionListItem
title={translate('DownloadClient')}
data={downloadClient}
/>
data={downloadClientNameInfo}
/> :
null
}
{
@@ -173,6 +189,7 @@ function HistoryDetails(props) {
if (eventType === 'bookFileImported') {
const {
customFormatScore,
droppedPath,
importedPath
} = data;
@@ -195,12 +212,22 @@ function HistoryDetails(props) {
}
{
!!importedPath &&
importedPath ?
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('ImportedTo')}
data={importedPath}
/>
/> :
null
}
{
customFormatScore && customFormatScore !== '0' ?
<DescriptionListItem
title="Custom Format Score"
data={formatPreferredWordScore(customFormatScore)}
/> :
null
}
</DescriptionList>
);
@@ -208,7 +235,8 @@ function HistoryDetails(props) {
if (eventType === 'bookFileDeleted') {
const {
reason
reason,
customFormatScore
} = data;
let reasonMessage = '';
@@ -238,6 +266,15 @@ function HistoryDetails(props) {
title={translate('Reason')}
data={reasonMessage}
/>
{
customFormatScore && customFormatScore !== '0' ?
<DescriptionListItem
title="Custom Format Score"
data={formatPreferredWordScore(customFormatScore)}
/> :
null
}
</DescriptionList>
);
}

View File

@@ -60,38 +60,38 @@ class HistoryConnector extends Component {
repopulate = () => {
this.props.fetchHistory();
}
};
//
// Listeners
onFirstPagePress = () => {
this.props.gotoHistoryFirstPage();
}
};
onPreviousPagePress = () => {
this.props.gotoHistoryPreviousPage();
}
};
onNextPagePress = () => {
this.props.gotoHistoryNextPage();
}
};
onLastPagePress = () => {
this.props.gotoHistoryLastPage();
}
};
onPageSelect = (page) => {
this.props.gotoHistoryPage({ page });
}
};
onSortPress = (sortKey) => {
this.props.setHistorySort({ sortKey });
}
};
onFilterSelect = (selectedFilterKey) => {
this.props.setHistoryFilter({ selectedFilterKey });
}
};
onTableOptionChange = (payload) => {
this.props.setHistoryTableOption(payload);
@@ -99,7 +99,7 @@ class HistoryConnector extends Component {
if (payload.pageSize) {
this.props.gotoHistoryFirstPage();
}
}
};
//
// Render

View File

@@ -10,6 +10,12 @@
width: 80px;
}
.customFormatScore {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 55px;
}
.releaseGroup {
composes: cell from '~Components/Table/Cells/TableRowCell.css';

View File

@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import AuthorNameLink from 'Author/AuthorNameLink';
import BookFormats from 'Book/BookFormats';
import BookQuality from 'Book/BookQuality';
import BookTitleLink from 'Book/BookTitleLink';
import IconButton from 'Components/Link/IconButton';
@@ -8,6 +9,7 @@ import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellCo
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import { icons } from 'Helpers/Props';
import formatPreferredWordScore from 'Utilities/Number/formatPreferredWordScore';
import HistoryDetailsModal from './Details/HistoryDetailsModal';
import HistoryEventTypeCell from './HistoryEventTypeCell';
import styles from './HistoryRow.css';
@@ -40,11 +42,11 @@ class HistoryRow extends Component {
onDetailsPress = () => {
this.setState({ isDetailsModalOpen: true });
}
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
};
//
// Render
@@ -54,6 +56,7 @@ class HistoryRow extends Component {
author,
book,
quality,
customFormats,
qualityCutoffNotMet,
eventType,
sourceTitle,
@@ -127,6 +130,16 @@ class HistoryRow extends Component {
);
}
if (name === 'customFormats') {
return (
<TableRowCell key={name}>
<BookFormats
formats={customFormats}
/>
</TableRowCell>
);
}
if (name === 'date') {
return (
<RelativeDateCellConnector
@@ -158,6 +171,17 @@ class HistoryRow extends Component {
);
}
if (name === 'customFormatScore') {
return (
<TableRowCell
key={name}
className={styles.customFormatScore}
>
{formatPreferredWordScore(data.customFormatScore)}
</TableRowCell>
);
}
if (name === 'releaseGroup') {
return (
<TableRowCell
@@ -169,6 +193,16 @@ class HistoryRow extends Component {
);
}
if (name === 'sourceTitle') {
return (
<TableRowCell
key={name}
>
{sourceTitle}
</TableRowCell>
);
}
if (name === 'details') {
return (
<TableRowCell
@@ -209,6 +243,7 @@ HistoryRow.propTypes = {
author: PropTypes.object.isRequired,
book: PropTypes.object,
quality: PropTypes.object.isRequired,
customFormats: PropTypes.arrayOf(PropTypes.object),
qualityCutoffNotMet: PropTypes.bool.isRequired,
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,

View File

@@ -49,7 +49,7 @@ class HistoryRowConnector extends Component {
onMarkAsFailedPress = () => {
this.props.markAsFailed({ id: this.props.id });
}
};
//
// Render

View File

@@ -1,13 +1,13 @@
.torrent {
composes: label from '~Components/Label.css';
border-color: $torrentColor;
background-color: $torrentColor;
border-color: var(--torrentColor);
background-color: var(--torrentColor);
}
.usenet {
composes: label from '~Components/Label.css';
border-color: $usenetColor;
background-color: $usenetColor;
border-color: var(--usenetColor);
background-color: var(--usenetColor);
}

View File

@@ -75,13 +75,23 @@ class Queue extends Component {
return;
}
const nextState = {};
if (prevProps.items !== items) {
nextState.items = items;
}
const selectedIds = this.getSelectedIds();
const isPendingSelected = _.some(this.props.items, (item) => {
return selectedIds.indexOf(item.id) > -1 && item.status === 'delay';
});
if (isPendingSelected !== this.state.isPendingSelected) {
this.setState({ isPendingSelected });
nextState.isPendingSelected = isPendingSelected;
}
if (!_.isEmpty(nextState)) {
this.setState(nextState);
}
}
@@ -90,45 +100,45 @@ class Queue extends Component {
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState);
}
};
//
// Listeners
onQueueRowModalOpenOrClose = (isOpen) => {
this._shouldBlockRefresh = isOpen;
}
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
};
onGrabSelectedPress = () => {
this.props.onGrabSelectedPress(this.getSelectedIds());
}
};
onRemoveSelectedPress = () => {
this.setState({ isConfirmRemoveModalOpen: true }, () => {
this._shouldBlockRefresh = true;
});
}
};
onRemoveSelectedConfirmed = (payload) => {
this._shouldBlockRefresh = false;
this.props.onRemoveSelectedPress({ ids: this.getSelectedIds(), ...payload });
this.setState({ isConfirmRemoveModalOpen: false });
}
};
onConfirmRemoveModalClose = () => {
this._shouldBlockRefresh = false;
this.setState({ isConfirmRemoveModalOpen: false });
}
};
//
// Render
@@ -216,26 +226,29 @@ class Queue extends Component {
<PageContentBody>
{
isRefreshing && !isAllPopulated &&
<LoadingIndicator />
isRefreshing && !isAllPopulated ?
<LoadingIndicator /> :
null
}
{
!isRefreshing && hasError &&
!isRefreshing && hasError ?
<div>
{translate('FailedToLoadQueue')}
</div>
</div> :
null
}
{
isAllPopulated && !hasError && !items.length &&
isAllPopulated && !hasError && !items.length ?
<div>
{translate('QueueIsEmpty')}
</div>
</div> :
null
}
{
isAllPopulated && !hasError && !!items.length &&
isAllPopulated && !hasError && !!items.length ?
<div>
<Table
columns={columns}
@@ -270,7 +283,8 @@ class Queue extends Component {
isFetching={isRefreshing}
{...otherProps}
/>
</div>
</div> :
null
}
</PageContentBody>

View File

@@ -79,34 +79,34 @@ class QueueConnector extends Component {
repopulate = () => {
this.props.fetchQueue();
}
};
//
// Listeners
onFirstPagePress = () => {
this.props.gotoQueueFirstPage();
}
};
onPreviousPagePress = () => {
this.props.gotoQueuePreviousPage();
}
};
onNextPagePress = () => {
this.props.gotoQueueNextPage();
}
};
onLastPagePress = () => {
this.props.gotoQueueLastPage();
}
};
onPageSelect = (page) => {
this.props.gotoQueuePage({ page });
}
};
onSortPress = (sortKey) => {
this.props.setQueueSort({ sortKey });
}
};
onTableOptionChange = (payload) => {
this.props.setQueueTableOption(payload);
@@ -114,21 +114,21 @@ class QueueConnector extends Component {
if (payload.pageSize) {
this.props.gotoQueueFirstPage();
}
}
};
onRefreshPress = () => {
this.props.executeCommand({
name: commandNames.REFRESH_MONITORED_DOWNLOADS
});
}
};
onGrabSelectedPress = (ids) => {
this.props.grabQueueItems({ ids });
}
};
onRemoveSelectedPress = (payload) => {
this.props.removeQueueItems(payload);
}
};
//
// Render

View File

@@ -42,7 +42,7 @@ class QueueOptions extends Component {
[name]: value
});
});
}
};
//
// Render

View File

@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
import ProtocolLabel from 'Activity/Queue/ProtocolLabel';
import AuthorNameLink from 'Author/AuthorNameLink';
import BookFormats from 'Book/BookFormats';
import BookQuality from 'Book/BookQuality';
import BookTitleLink from 'Book/BookTitleLink';
import Icon from 'Components/Icon';
@@ -41,7 +42,7 @@ class QueueRow extends Component {
onRemoveQueueItemPress = () => {
this.setState({ isRemoveQueueItemModalOpen: true });
}
};
onRemoveQueueItemModalConfirmed = (blocklist, skipredownload) => {
const {
@@ -53,25 +54,25 @@ class QueueRow extends Component {
onRemoveQueueItemPress(blocklist, skipredownload);
this.setState({ isRemoveQueueItemModalOpen: false });
}
};
onRemoveQueueItemModalClose = () => {
this.props.onQueueRowModalOpenOrClose(false);
this.setState({ isRemoveQueueItemModalOpen: false });
}
};
onInteractiveImportPress = () => {
this.props.onQueueRowModalOpenOrClose(true);
this.setState({ isInteractiveImportModalOpen: true });
}
};
onInteractiveImportModalClose = () => {
this.props.onQueueRowModalOpenOrClose(false);
this.setState({ isInteractiveImportModalOpen: false });
}
};
//
// Render
@@ -89,6 +90,7 @@ class QueueRow extends Component {
author,
book,
quality,
customFormats,
protocol,
indexer,
outputPath,
@@ -210,6 +212,16 @@ class QueueRow extends Component {
);
}
if (name === 'customFormats') {
return (
<TableRowCell key={name}>
<BookFormats
formats={customFormats}
/>
</TableRowCell>
);
}
if (name === 'protocol') {
return (
<TableRowCell key={name}>
@@ -379,6 +391,7 @@ QueueRow.propTypes = {
author: PropTypes.object,
book: PropTypes.object,
quality: PropTypes.object.isRequired,
customFormats: PropTypes.arrayOf(PropTypes.object),
protocol: PropTypes.string.isRequired,
indexer: PropTypes.string,
outputPath: PropTypes.string,

View File

@@ -41,11 +41,11 @@ class QueueRowConnector extends Component {
onGrabPress = () => {
this.props.grabQueueItem({ id: this.props.id });
}
};
onRemoveQueueItemPress = (payload) => {
this.props.removeQueueItem({ id: this.props.id, ...payload });
}
};
//
// Render

View File

@@ -36,34 +36,34 @@ class RemoveQueueItemModal extends Component {
blocklist: false,
skipredownload: false
});
}
};
//
// Listeners
onRemoveChange = ({ value }) => {
this.setState({ remove: value });
}
};
onBlocklistChange = ({ value }) => {
this.setState({ blocklist: value });
}
};
onSkipReDownloadChange = ({ value }) => {
this.setState({ skipredownload: value });
}
};
onRemoveConfirmed = () => {
const state = this.state;
this.resetState();
this.props.onRemovePress(state);
}
};
onModalClose = () => {
this.resetState();
this.props.onModalClose();
}
};
//
// Render

View File

@@ -31,40 +31,40 @@ class RemoveQueueItemsModal extends Component {
//
// Control
resetState = function() {
this.setState({
remove: true,
blocklist: false,
skipredownload: false
});
}
resetState = function() {
this.setState({
remove: true,
blocklist: false,
skipredownload: false
});
};
//
// Listeners
//
// Listeners
onRemoveChange = ({ value }) => {
this.setState({ remove: value });
}
onRemoveChange = ({ value }) => {
this.setState({ remove: value });
};
onBlocklistChange = ({ value }) => {
this.setState({ blocklist: value });
}
};
onSkipReDownloadChange = ({ value }) => {
this.setState({ skipredownload: value });
}
};
onRemoveConfirmed = () => {
const state = this.state;
this.resetState();
this.props.onRemovePress(state);
}
};
onModalClose = () => {
this.resetState();
this.props.onModalClose();
}
};
//
// Render

View File

@@ -4,6 +4,7 @@ import React from 'react';
import DocumentTitle from 'react-document-title';
import { Provider } from 'react-redux';
import PageConnector from 'Components/Page/PageConnector';
import ApplyTheme from './ApplyTheme';
import AppRoutes from './AppRoutes';
function App({ store, history }) {
@@ -11,9 +12,11 @@ function App({ store, history }) {
<DocumentTitle title={window.Readarr.instanceName}>
<Provider store={store}>
<ConnectedRouter history={history}>
<PageConnector>
<AppRoutes app={App} />
</PageConnector>
<ApplyTheme>
<PageConnector>
<AppRoutes app={App} />
</PageConnector>
</ApplyTheme>
</ConnectedRouter>
</Provider>
</DocumentTitle>

View File

@@ -13,6 +13,7 @@ import CalendarPageConnector from 'Calendar/CalendarPageConnector';
import NotFound from 'Components/NotFound';
import Switch from 'Components/Router/Switch';
import AddNewItemConnector from 'Search/AddNewItemConnector';
import CustomFormatSettingsConnector from 'Settings/CustomFormats/CustomFormatSettingsConnector';
import DevelopmentSettingsConnector from 'Settings/Development/DevelopmentSettingsConnector';
import DownloadClientSettingsConnector from 'Settings/DownloadClients/DownloadClientSettingsConnector';
import GeneralSettingsConnector from 'Settings/General/GeneralSettingsConnector';
@@ -22,7 +23,7 @@ import MediaManagementConnector from 'Settings/MediaManagement/MediaManagementCo
import MetadataSettings from 'Settings/Metadata/MetadataSettings';
import NotificationSettings from 'Settings/Notifications/NotificationSettings';
import Profiles from 'Settings/Profiles/Profiles';
import Quality from 'Settings/Quality/Quality';
import QualityConnector from 'Settings/Quality/QualityConnector';
import Settings from 'Settings/Settings';
import TagSettings from 'Settings/Tags/TagSettings';
import UISettingsConnector from 'Settings/UI/UISettingsConnector';
@@ -172,7 +173,12 @@ function AppRoutes(props) {
<Route
path="/settings/quality"
component={Quality}
component={QualityConnector}
/>
<Route
path="/settings/customformats"
component={CustomFormatSettingsConnector}
/>
<Route

View File

@@ -11,9 +11,47 @@ import UpdateChanges from 'System/Updates/UpdateChanges';
import translate from 'Utilities/String/translate';
import styles from './AppUpdatedModalContent.css';
function mergeUpdates(items, version, prevVersion) {
let installedIndex = items.findIndex((u) => u.version === version);
let installedPreviouslyIndex = items.findIndex((u) => u.version === prevVersion);
if (installedIndex === -1) {
installedIndex = 0;
}
if (installedPreviouslyIndex === -1) {
installedPreviouslyIndex = items.length;
} else if (installedPreviouslyIndex === installedIndex && items.length) {
installedPreviouslyIndex += 1;
}
const appliedUpdates = items.slice(installedIndex, installedPreviouslyIndex);
if (!appliedUpdates.length) {
return null;
}
const appliedChanges = { new: [], fixed: [] };
appliedUpdates.forEach((u) => {
if (u.changes) {
appliedChanges.new.push(... u.changes.new);
appliedChanges.fixed.push(... u.changes.fixed);
}
});
const mergedUpdate = Object.assign({}, appliedUpdates[0], { changes: appliedChanges });
if (!appliedChanges.new.length && !appliedChanges.fixed.length) {
mergedUpdate.changes = null;
}
return mergedUpdate;
}
function AppUpdatedModalContent(props) {
const {
version,
prevVersion,
isPopulated,
error,
items,
@@ -21,7 +59,7 @@ function AppUpdatedModalContent(props) {
onModalClose
} = props;
const update = items[0];
const update = mergeUpdates(items, version, prevVersion);
return (
<ModalContent onModalClose={onModalClose}>
@@ -91,6 +129,7 @@ function AppUpdatedModalContent(props) {
AppUpdatedModalContent.propTypes = {
version: PropTypes.string.isRequired,
prevVersion: PropTypes.string,
isPopulated: PropTypes.bool.isRequired,
error: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,

View File

@@ -8,8 +8,9 @@ import AppUpdatedModalContent from './AppUpdatedModalContent';
function createMapStateToProps() {
return createSelector(
(state) => state.app.version,
(state) => state.app.prevVersion,
(state) => state.system.updates,
(version, updates) => {
(version, prevVersion, updates) => {
const {
isPopulated,
error,
@@ -18,6 +19,7 @@ function createMapStateToProps() {
return {
version,
prevVersion,
isPopulated,
error,
items

View File

@@ -0,0 +1,49 @@
import PropTypes from 'prop-types';
import React, { Fragment, useCallback, useEffect } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import themes from 'Styles/Themes';
function createMapStateToProps() {
return createSelector(
(state) => state.settings.ui.item.theme || window.Readarr.theme,
(
theme
) => {
return {
theme
};
}
);
}
function ApplyTheme({ theme, children }) {
// Update the CSS Variables
const updateCSSVariables = useCallback(() => {
const arrayOfVariableKeys = Object.keys(themes[theme]);
const arrayOfVariableValues = Object.values(themes[theme]);
// Loop through each array key and set the CSS Variables
arrayOfVariableKeys.forEach((cssVariableKey, index) => {
// Based on our snippet from MDN
document.documentElement.style.setProperty(
`--${cssVariableKey}`,
arrayOfVariableValues[index]
);
});
}, [theme]);
// On Component Mount and Component Update
useEffect(() => {
updateCSSVariables(theme);
}, [updateCSSVariables, theme]);
return <Fragment>{children}</Fragment>;
}
ApplyTheme.propTypes = {
theme: PropTypes.string.isRequired,
children: PropTypes.object.isRequired
};
export default connect(createMapStateToProps)(ApplyTheme);

View File

@@ -99,7 +99,7 @@ class AuthorImage extends Component {
if (this.props.onError) {
this.props.onError();
}
}
};
onLoad = () => {
this.setState({
@@ -110,7 +110,7 @@ class AuthorImage extends Component {
if (this.props.onLoad) {
this.props.onLoad();
}
}
};
//
// Render

View File

@@ -8,5 +8,5 @@
.deleteFilesMessage {
margin-top: 20px;
color: $dangerColor;
color: var(--dangerColor);
}

View File

@@ -33,11 +33,11 @@ class DeleteAuthorModalContent extends Component {
onDeleteFilesChange = ({ value }) => {
this.setState({ deleteFiles: value });
}
};
onAddImportListExclusionChange = ({ value }) => {
this.setState({ addImportListExclusion: value });
}
};
onDeleteAuthorConfirmed = () => {
const deleteFiles = this.state.deleteFiles;
@@ -46,7 +46,7 @@ class DeleteAuthorModalContent extends Component {
this.setState({ deleteFiles: false });
this.setState({ addImportListExclusion: false });
this.props.onDeletePress(deleteFiles, addImportListExclusion);
}
};
//
// Render

View File

@@ -32,7 +32,7 @@ class DeleteAuthorModalContentConnector extends Component {
});
this.props.onModalClose(true);
}
};
//
// Render

View File

@@ -9,7 +9,7 @@
}
.metadataMessage {
color: $helpTextColor;
color: var(--helpTextColor);
text-align: center;
font-weight: 300;
font-size: 20px;
@@ -22,7 +22,7 @@
.tabList {
margin: 0;
padding: 0;
border-bottom: 1px solid $lightGray;
border-bottom: 1px solid var(--lightGray);
}
.tab {
@@ -37,7 +37,7 @@
}
.selectedTab {
border-bottom: 4px solid $linkColor;
border-bottom: 4px solid var(--linkColor);
}
.tabContent {
@@ -63,7 +63,7 @@
white-space: nowrap;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}

View File

@@ -99,69 +99,69 @@ class AuthorDetails extends Component {
}
this.setState({ selectedState: newSelectedState, allSelected: isAllSelected, allUnselected: isAllUnselected });
}
};
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState);
}
};
//
// Listeners
onOrganizePress = () => {
this.setState({ isOrganizeModalOpen: true });
}
};
onOrganizeModalClose = () => {
this.setState({ isOrganizeModalOpen: false });
}
};
onRetagPress = () => {
this.setState({ isRetagModalOpen: true });
}
};
onRetagModalClose = () => {
this.setState({ isRetagModalOpen: false });
}
};
onInteractiveImportPress = () => {
this.setState({ isInteractiveImportModalOpen: true });
}
};
onInteractiveImportModalClose = () => {
this.setState({ isInteractiveImportModalOpen: false });
}
};
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onMonitorOptionsPress = () => {
this.setState({ isMonitorOptionsModalOpen: true });
}
};
onMonitorOptionsClose = () => {
this.setState({ isMonitorOptionsModalOpen: false });
}
};
onBookEditorTogglePress = () => {
this.setState({ isEditorActive: !this.state.isEditorActive });
}
};
onExpandAllPress = () => {
const {
@@ -170,7 +170,7 @@ class AuthorDetails extends Component {
} = this.state;
this.setState(getExpandedState(selectAll(expandedState, !allExpanded)));
}
};
onExpandPress = (bookId, isExpanded) => {
this.setState((state) => {
@@ -184,32 +184,32 @@ class AuthorDetails extends Component {
return getExpandedState(newState);
});
}
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectAllPress = () => {
this.onSelectAllChange({ value: !this.state.allSelected });
}
};
onSelectedChange = (items, id, value, shiftKey = false) => {
this.setState((state) => {
return toggleSelected(state, items, id, value, shiftKey);
});
}
};
onSaveSelected = (changes) => {
this.props.onSaveSelected({
bookIds: this.getSelectedIds(),
...changes
});
}
};
onTabSelect = (index, lastIndex) => {
this.setState({ selectedTabIndex: index });
}
};
//
// Render

View File

@@ -270,7 +270,7 @@ class AuthorDetailsConnector extends Component {
this.props.fetchSeries({ authorId });
this.props.fetchBookFiles({ authorId });
this.props.fetchQueueDetails({ authorId });
}
};
unpopulate = () => {
this.props.cancelFetchReleases();
@@ -278,7 +278,7 @@ class AuthorDetailsConnector extends Component {
this.props.clearBookFiles();
this.props.clearQueueDetails();
this.props.clearReleases();
}
};
//
// Listeners
@@ -288,25 +288,25 @@ class AuthorDetailsConnector extends Component {
authorId: this.props.id,
monitored
});
}
};
onRefreshPress = () => {
this.props.executeCommand({
name: commandNames.REFRESH_AUTHOR,
authorId: this.props.id
});
}
};
onSearchPress = () => {
this.props.executeCommand({
name: commandNames.AUTHOR_SEARCH,
authorId: this.props.id
});
}
};
onSaveSelected = (payload) => {
this.props.saveBookEditor(payload);
}
};
//
// Render

View File

@@ -16,7 +16,7 @@
position: absolute;
width: 100%;
height: 100%;
background: $black;
background: var(--black);
opacity: 0.7;
}
@@ -25,7 +25,7 @@
padding: 30px;
width: 100%;
height: 100%;
color: $white;
color: var(--white);
}
.poster {
@@ -69,7 +69,7 @@
width: 40px;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}
@@ -97,7 +97,7 @@
white-space: nowrap;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}

View File

@@ -52,11 +52,11 @@ class AuthorDetailsHeader extends Component {
onOverviewMeasure = ({ height }) => {
this.setState({ overviewHeight: height });
}
};
onTitleMeasure = ({ width }) => {
this.setState({ titleWidth: width });
}
};
//
// Render

View File

@@ -48,7 +48,7 @@ class AuthorDetailsHeaderConnector extends Component {
authorId: this.props.authorId,
monitored
});
}
};
//
// Render

View File

@@ -1,8 +1,8 @@
.bookType {
margin-bottom: 20px;
border: 1px solid $borderColor;
border: 1px solid var(--borderColor);
border-radius: 4px;
background-color: $white;
background-color: var(--cardBackgroundColor);
&:last-of-type {
margin-bottom: 0;
@@ -77,7 +77,7 @@
.books {
padding-top: 15px;
border-top: 1px solid $borderColor;
border-top: 1px solid var(--borderColor);
}
.collapseButtonContainer {
@@ -86,10 +86,10 @@
justify-content: center;
padding: 10px 15px;
width: 100%;
border-top: 1px solid $borderColor;
border-top: 1px solid var(--borderColor);
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
background-color: #fafafa;
background-color: var(--collapseButtonBackgroundColor);
}
.collapseButtonIcon {

View File

@@ -61,7 +61,7 @@ class AuthorDetailsSeason extends Component {
this.setState({ lastToggledBook: bookId });
this.props.onMonitorBookPress(_.uniq(bookIds), monitored);
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
const {
@@ -70,7 +70,7 @@ class AuthorDetailsSeason extends Component {
} = this.props;
return onSelectedChange(items, id, value, shiftKey);
}
};
//
// Render

View File

@@ -66,18 +66,18 @@ class AuthorDetailsSeasonConnector extends Component {
onTableOptionChange = (payload) => {
this.props.setBooksTableOption(payload);
}
};
onSortPress = (sortKey) => {
this.props.setAuthorDetailsSort({ sortKey });
}
};
onMonitorBookPress = (bookIds, monitored) => {
this.props.toggleBooksMonitored({
bookIds,
monitored
});
}
};
//
// Render

View File

@@ -1,8 +1,8 @@
.bookType {
margin-bottom: 20px;
border: 1px solid $borderColor;
border: 1px solid var(--borderColor);
border-radius: 4px;
background-color: $white;
background-color: var(--cardBackgroundColor);
&:last-of-type {
margin-bottom: 0;
@@ -77,7 +77,7 @@
.books {
padding-top: 15px;
border-top: 1px solid $borderColor;
border-top: 1px solid var(--borderColor);
}
.collapseButtonContainer {
@@ -86,10 +86,10 @@
justify-content: center;
padding: 10px 15px;
width: 100%;
border-top: 1px solid $borderColor;
border-top: 1px solid var(--borderColor);
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
background-color: #fafafa;
background-color: var(--cardBackgroundColor);
}
.collapseButtonIcon {

View File

@@ -73,7 +73,7 @@ class AuthorDetailsSeries extends Component {
} = this.props;
this.props.onExpandPress(id, !isExpanded);
}
};
onMonitorBookPress = (bookId, monitored, { shiftKey }) => {
const lastToggled = this.state.lastToggledBook;
@@ -91,13 +91,13 @@ class AuthorDetailsSeries extends Component {
this.setState({ lastToggledBook: bookId });
this.props.onMonitorBookPress(_.uniq(bookIds), monitored);
}
};
onMonitorSeriesPress = (monitored, { shiftKey }) => {
const bookIds = this.props.items.map((book) => book.id);
this.props.onMonitorBookPress(_.uniq(bookIds), monitored);
}
};
//
// Render

View File

@@ -81,18 +81,18 @@ class AuthorDetailsSeasonConnector extends Component {
onTableOptionChange = (payload) => {
this.props.setSeriesTableOption(payload);
}
};
onSortPress = (sortKey) => {
this.props.dispatchSetSeriesSort({ sortKey });
}
};
onMonitorBookPress = (bookIds, monitored) => {
this.props.toggleBooksMonitored({
bookIds,
monitored
});
}
};
//
// Render

View File

@@ -30,23 +30,23 @@ class BookRow extends Component {
onManualSearchPress = () => {
this.setState({ isDetailsModalOpen: true });
}
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
};
onEditBookPress = () => {
this.setState({ isEditBookModalOpen: true });
}
};
onEditBookModalClose = () => {
this.setState({ isEditBookModalOpen: false });
}
};
onMonitorBookPress = (monitored, options) => {
this.props.onMonitorBookPress(this.props.id, monitored, options);
}
};
//
// Render

View File

@@ -16,7 +16,7 @@ class EditAuthorModalConnector extends Component {
onModalClose = () => {
this.props.clearPendingChanges({ section: 'author' });
this.props.onModalClose();
}
};
//
// Render

View File

@@ -48,13 +48,13 @@ class EditAuthorModalContent extends Component {
onSavePress(false);
}
}
};
onMoveAuthorPress = () => {
this.setState({ isConfirmMoveModalOpen: false });
this.props.onSavePress(true);
}
};
//
// Render

View File

@@ -83,14 +83,14 @@ class EditAuthorModalContentConnector extends Component {
onInputChange = ({ name, value }) => {
this.props.dispatchSetAuthorValue({ name, value });
}
};
onSavePress = (moveFiles) => {
this.props.dispatchSaveAuthor({
id: this.props.authorId,
moveFiles
});
}
};
//
// Render

View File

@@ -30,11 +30,11 @@ class RetagAuthorModalContent extends Component {
onCheckInputChange = ({ name, value }) => {
this.setState({ [name]: value });
}
};
onRetagAuthorPress = () => {
this.props.onRetagAuthorPress(this.state.updateCovers, this.state.embedMetadata);
}
};
//
// Render

View File

@@ -45,7 +45,7 @@ class RetagAuthorModalContentConnector extends Component {
});
this.props.onModalClose(true);
}
};
//
// Render

View File

@@ -80,7 +80,7 @@ class AuthorEditorFooter extends Component {
default:
this.props.onSaveSelected({ [name]: value });
}
}
};
onApplyTagsPress = (tags, applyTags) => {
this.setState({
@@ -92,23 +92,23 @@ class AuthorEditorFooter extends Component {
tags,
applyTags
});
}
};
onDeleteSelectedPress = () => {
this.setState({ isDeleteAuthorModalOpen: true });
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onTagsPress = () => {
this.setState({ isTagsModalOpen: true });
}
};
onTagsModalClose = () => {
this.setState({ isTagsModalOpen: false });
}
};
onSaveRootFolderPress = () => {
this.setState({
@@ -117,7 +117,7 @@ class AuthorEditorFooter extends Component {
});
this.props.onSaveSelected({ rootFolderPath: this.state.destinationRootFolder });
}
};
onMoveAuthorPress = () => {
this.setState({
@@ -129,7 +129,7 @@ class AuthorEditorFooter extends Component {
rootFolderPath: this.state.destinationRootFolder,
moveFiles: true
});
}
};
//
// Render

View File

@@ -16,7 +16,7 @@ class AuthorEditorRow extends Component {
onBookFolderChange = () => {
// Mock handler to satisfy `onChange` being required for `CheckInput`.
//
}
};
//
// Render

View File

@@ -9,5 +9,5 @@
.path {
margin-left: 5px;
color: $dangerColor;
color: var(--dangerColor);
}

View File

@@ -29,14 +29,14 @@ class DeleteAuthorModalContent extends Component {
onDeleteFilesChange = ({ value }) => {
this.setState({ deleteFiles: value });
}
};
onDeleteAuthorConfirmed = () => {
const deleteFiles = this.state.deleteFiles;
this.setState({ deleteFiles: false });
this.props.onDeleteSelectedPress(deleteFiles);
}
};
//
// Render

View File

@@ -43,7 +43,7 @@ class OrganizeAuthorModalContentConnector extends Component {
});
this.props.onModalClose(true);
}
};
//
// Render

View File

@@ -34,7 +34,7 @@ class TagsModalContent extends Component {
onInputChange = ({ name, value }) => {
this.setState({ [name]: value });
}
};
onApplyTagsPress = () => {
const {
@@ -43,7 +43,7 @@ class TagsModalContent extends Component {
} = this.state;
this.props.onApplyTagsPress(tags, applyTags);
}
};
//
// Render

View File

@@ -54,7 +54,7 @@ class AuthorHistoryContentConnector extends Component {
authorId,
bookId
});
}
};
//
// Render

View File

@@ -55,16 +55,16 @@ class AuthorHistoryRow extends Component {
onMarkAsFailedPress = () => {
this.setState({ isMarkAsFailedModalOpen: true });
}
};
onConfirmMarkAsFailed = () => {
this.props.onMarkAsFailedPress(this.props.id);
this.setState({ isMarkAsFailedModalOpen: false });
}
};
onMarkAsFailedModalClose = () => {
this.setState({ isMarkAsFailedModalOpen: false });
}
};
//
// Render

View File

@@ -99,14 +99,14 @@ class AuthorIndex extends Component {
setScrollerRef = (ref) => {
this.setState({ scroller: ref });
}
};
getSelectedIds = () => {
if (this.state.allUnselected) {
return [];
}
return getSelectedIds(this.state.selectedState);
}
};
setSelectedState() {
const {
@@ -192,19 +192,19 @@ class AuthorIndex extends Component {
onPosterOptionsPress = () => {
this.setState({ isPosterOptionsModalOpen: true });
}
};
onPosterOptionsModalClose = () => {
this.setState({ isPosterOptionsModalOpen: false });
}
};
onOverviewOptionsPress = () => {
this.setState({ isOverviewOptionsModalOpen: true });
}
};
onOverviewOptionsModalClose = () => {
this.setState({ isOverviewOptionsModalOpen: false });
}
};
onEditorTogglePress = () => {
if (this.state.isEditorActive) {
@@ -214,36 +214,36 @@ class AuthorIndex extends Component {
newState.isEditorActive = true;
this.setState(newState);
}
}
};
onJumpBarItemPress = (jumpToCharacter) => {
this.setState({ jumpToCharacter });
}
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectAllPress = () => {
this.onSelectAllChange({ value: !this.state.allSelected });
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
};
onSaveSelected = (changes) => {
this.props.onSaveSelected({
authorIds: this.getSelectedIds(),
...changes
});
}
};
onOrganizeAuthorPress = () => {
this.setState({ isOrganizingAuthorModalOpen: true });
}
};
onOrganizeAuthorModalClose = (organized) => {
this.setState({ isOrganizingAuthorModalOpen: false });
@@ -251,11 +251,11 @@ class AuthorIndex extends Component {
if (organized === true) {
this.onSelectAllChange({ value: false });
}
}
};
onRetagAuthorPress = () => {
this.setState({ isRetaggingAuthorModalOpen: true });
}
};
onRetagAuthorModalClose = (organized) => {
this.setState({ isRetaggingAuthorModalOpen: false });
@@ -263,14 +263,14 @@ class AuthorIndex extends Component {
if (organized === true) {
this.onSelectAllChange({ value: false });
}
}
};
onRefreshAuthorPress = () => {
const selectedIds = this.getSelectedIds();
const refreshIds = this.state.isEditorActive && selectedIds.length > 0 ? selectedIds : [];
this.props.onRefreshAuthorPress(refreshIds);
}
};
//
// Render

View File

@@ -85,15 +85,15 @@ class AuthorIndexConnector extends Component {
onViewSelect = (view) => {
this.props.dispatchSetAuthorView(view);
}
};
onSaveSelected = (payload) => {
this.props.dispatchSaveAuthorEditor(payload);
}
};
onScroll = ({ scrollTop }) => {
scrollPositions.authorIndex = scrollTop;
}
};
//
// Render

View File

@@ -21,32 +21,32 @@
.continuing {
composes: legendItemColor;
background-color: $primaryColor;
background-color: var(--primaryColor);
}
.ended {
composes: legendItemColor;
background-color: $successColor;
background-color: var(--successColor);
}
.missingMonitored {
composes: legendItemColor;
background-color: $dangerColor;
background-color: var(--dangerColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(90deg, color($dangerColor shade(5%)), color($dangerColor shade(5%)) 5px, color($dangerColor shade(15%)) 5px, color($dangerColor shade(15%)) 10px);
background: repeating-linear-gradient(90deg, color(#f05050 shade(5%)), color(#f05050 shade(5%)) 5px, color(#f05050 shade(15%)) 5px, color(#f05050 shade(15%)) 10px);
}
}
.missingUnmonitored {
composes: legendItemColor;
background-color: $warningColor;
background-color: var(--warningColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(45deg, $warningColor, $warningColor 5px, color($warningColor tint(15%)) 5px, color($warningColor tint(15%)) 10px);
background: repeating-linear-gradient(45deg, #ffa500, #ffa500 5px, color(#ffa500 tint(15%)) 5px, color(#ffa500 tint(15%)) 10px);
}
}

View File

@@ -98,14 +98,14 @@ class AuthorIndexItemConnector extends Component {
name: commandNames.REFRESH_AUTHOR,
authorId: this.props.id
});
}
};
onSearchPress = () => {
this.props.dispatchExecuteCommand({
name: commandNames.AUTHOR_SEARCH,
authorId: this.props.id
});
}
};
//
// Render

View File

@@ -3,7 +3,7 @@ $hoverScale: 1.05;
.container {
&:hover {
.content {
background-color: $tableRowHoverBackgroundColor;
background-color: var(--tableRowHoverBackgroundColor);
}
}
}
@@ -35,10 +35,10 @@ $hoverScale: 1.05;
composes: link from '~Components/Link/Link.css';
display: block;
color: $defaultColor;
color: var(--defaultColor);
&:hover {
color: $defaultColor;
color: var(--defaultColor);
text-decoration: none;
}
}
@@ -52,8 +52,8 @@ $hoverScale: 1.05;
height: 0;
border-width: 0 25px 25px 0;
border-style: solid;
border-color: transparent $dangerColor transparent transparent;
color: $white;
border-color: transparent var(--dangerColor) transparent transparent;
color: var(--white);
}
.info {

View File

@@ -51,22 +51,22 @@ class AuthorIndexOverview extends Component {
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onChange = ({ value, shiftKey }) => {
const {
@@ -75,7 +75,7 @@ class AuthorIndexOverview extends Component {
} = this.props;
onSelectedChange({ id, value, shiftKey });
}
};
//
// Render

View File

@@ -123,7 +123,7 @@ class AuthorIndexOverviews extends Component {
setGridRef = (ref) => {
this._grid = ref;
}
};
calculateGrid = (width = this.state.width, isSmallScreen) => {
const {
@@ -141,7 +141,7 @@ class AuthorIndexOverviews extends Component {
posterHeight,
rowHeight
});
}
};
cellRenderer = ({ key, rowIndex, style }) => {
const {
@@ -197,14 +197,14 @@ class AuthorIndexOverviews extends Component {
/>
</div>
);
}
};
//
// Listeners
onMeasure = ({ width }) => {
this.calculateGrid(width, this.props.isSmallScreen);
}
};
//
// Render

View File

@@ -122,7 +122,7 @@ class AuthorIndexOverviewOptionsModalContent extends Component {
}, () => {
this.props.onChangeOverviewOption({ [name]: value });
});
}
};
//
// Render

View File

@@ -5,7 +5,7 @@ $hoverScale: 1.05;
&:hover {
z-index: 2;
box-shadow: 0 0 12px $black;
box-shadow: 0 0 12px var(--black);
transition: all 200ms ease-in;
.controls {
@@ -32,7 +32,7 @@ $hoverScale: 1.05;
position: relative;
display: block;
height: 70px;
background-color: $defaultColor;
background-color: var(--defaultColor);
}
.overlayTitle {
@@ -45,13 +45,13 @@ $hoverScale: 1.05;
padding: 5px;
width: 100%;
height: 100%;
color: $offWhite;
color: var(--offWhite);
text-align: center;
font-size: 20px;
}
.nextAiring {
background-color: #fafbfc;
background-color: var(--seriesBackgroundColor);
text-align: center;
font-size: $smallFontSize;
}
@@ -59,8 +59,7 @@ $hoverScale: 1.05;
.title {
@add-mixin truncate;
background-color: $defaultColor;
color: $white;
background-color: var(--seriesBackgroundColor);
text-align: center;
font-size: $smallFontSize;
}
@@ -74,8 +73,8 @@ $hoverScale: 1.05;
height: 0;
border-width: 0 25px 25px 0;
border-style: solid;
border-color: transparent $dangerColor transparent transparent;
color: $white;
border-color: transparent var(--dangerColor) transparent transparent;
color: var(--white);
}
.editorSelect {
@@ -91,8 +90,8 @@ $hoverScale: 1.05;
left: 10px;
z-index: 3;
border-radius: 4px;
background-color: $themeLightColor;
color: $white;
background-color: var(--readarrRed);
color: var(--white);
font-size: $smallFontSize;
opacity: 0;
transition: opacity 0;

View File

@@ -35,34 +35,34 @@ class AuthorIndexPoster extends Component {
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onPosterLoad = () => {
if (this.state.hasPosterError) {
this.setState({ hasPosterError: false });
}
}
};
onPosterLoadError = () => {
if (!this.state.hasPosterError) {
this.setState({ hasPosterError: true });
}
}
};
onChange = ({ value, shiftKey }) => {
const {
@@ -71,7 +71,7 @@ class AuthorIndexPoster extends Component {
} = this.props;
onSelectedChange({ id, value, shiftKey });
}
};
//
// Render

View File

@@ -1,5 +1,5 @@
.info {
background-color: #fafbfc;
background-color: var(--seriesBackgroundColor);
text-align: center;
font-size: $smallFontSize;
}

View File

@@ -171,7 +171,7 @@ class AuthorIndexPosters extends Component {
setGridRef = (ref) => {
this._grid = ref;
}
};
calculateGrid = (width = this.state.width, isSmallScreen) => {
const {
@@ -193,7 +193,7 @@ class AuthorIndexPosters extends Component {
posterHeight,
rowHeight
});
}
};
cellRenderer = ({ key, rowIndex, columnIndex, style }) => {
const {
@@ -259,14 +259,14 @@ class AuthorIndexPosters extends Component {
/>
</div>
);
}
};
//
// Listeners
onMeasure = ({ width }) => {
this.calculateGrid(width, this.props.isSmallScreen);
}
};
//
// Render

View File

@@ -93,7 +93,7 @@ class AuthorIndexPosterOptionsModalContent extends Component {
}, () => {
this.props.onChangePosterOption({ [name]: value });
});
}
};
//
// Render

View File

@@ -3,7 +3,7 @@
border-radius: 0;
background-color: #5b5b5b;
color: $white;
color: var(--white);
transition: width 200ms ease;
}

View File

@@ -27,22 +27,22 @@ class AuthorIndexActionsCell extends Component {
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
//
// Render

View File

@@ -31,7 +31,7 @@
position: relative;
display: block;
height: 70px;
background-color: $defaultColor;
background-color: var(--defaultColor);
}
.bannerImage {
@@ -49,7 +49,7 @@
padding: 5px;
width: 100%;
height: 100%;
color: $offWhite;
color: var(--offWhite);
text-align: center;
font-size: 20px;
}
@@ -92,7 +92,7 @@
}
.ratings {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
flex: 0 0 80px;
}

View File

@@ -40,39 +40,39 @@ class AuthorIndexRow extends Component {
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onUseSceneNumberingChange = () => {
// Mock handler to satisfy `onChange` being required for `CheckInput`.
//
}
};
onBannerLoad = () => {
if (this.state.hasBannerError) {
this.setState({ hasBannerError: false });
}
}
};
onBannerLoadError = () => {
if (!this.state.hasBannerError) {
this.setState({ hasBannerError: true });
}
}
};
//
// Render

View File

@@ -78,7 +78,7 @@ class AuthorIndexTable extends Component {
/>
</VirtualTableRow>
);
}
};
//
// Render

View File

@@ -60,7 +60,7 @@ class AuthorIndexTableOptions extends Component {
}
});
});
}
};
//
// Render

View File

@@ -16,7 +16,7 @@ class MonitoringOptionsModalConnector extends Component {
onModalClose = () => {
this.props.clearPendingChanges({ section: 'authors' });
this.props.onModalClose();
}
};
//
// Render

View File

@@ -44,7 +44,7 @@ class MonitoringOptionsModalContent extends Component {
onInputChange = ({ name, value }) => {
this.setState({ [name]: value });
}
};
//
// Listeners
@@ -65,11 +65,11 @@ class MonitoringOptionsModalContent extends Component {
if (!isSaving) {
this.onModalClose();
}
}
};
onModalClose = () => {
this.props.onModalClose();
}
};
//
// Render

View File

@@ -42,14 +42,14 @@ class MonitoringOptionsModalContentConnector extends Component {
onInputChange = ({ name, value }) => {
this.setState({ name, value });
}
};
onSavePress = ({ monitor }) => {
this.props.dispatchUpdateMonitoringOptions({
id: this.props.authorId,
monitor
});
}
};
//
// Render

View File

@@ -0,0 +1,33 @@
import PropTypes from 'prop-types';
import React from 'react';
import Label from 'Components/Label';
import { kinds } from 'Helpers/Props';
function BookFormats({ formats }) {
return (
<div>
{
formats.map((format) => {
return (
<Label
key={format.id}
kind={kinds.INFO}
>
{format.name}
</Label>
);
})
}
</div>
);
}
BookFormats.propTypes = {
formats: PropTypes.arrayOf(PropTypes.object).isRequired
};
BookFormats.defaultProps = {
formats: []
};
export default BookFormats;

View File

@@ -25,11 +25,11 @@ class BookSearchCell extends Component {
onManualSearchPress = () => {
this.setState({ isDetailsModalOpen: true });
}
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
};
//
// Render

View File

@@ -2,7 +2,7 @@
composes: link from '~Components/Link/Link.css';
&:hover {
color: $linkHoverColor;
color: var(--linkHoverColor);
text-decoration: underline;
}
}

View File

@@ -8,5 +8,5 @@
.deleteFilesMessage {
margin-top: 20px;
color: $dangerColor;
color: var(--dangerColor);
}

View File

@@ -32,11 +32,11 @@ class DeleteBookModalContent extends Component {
onDeleteFilesChange = ({ value }) => {
this.setState({ deleteFiles: value });
}
};
onAddImportListExclusionChange = ({ value }) => {
this.setState({ addImportListExclusion: value });
}
};
onDeleteBookConfirmed = () => {
const deleteFiles = this.state.deleteFiles;
@@ -45,7 +45,7 @@ class DeleteBookModalContent extends Component {
this.setState({ deleteFiles: false });
this.setState({ addImportListExclusion: false });
this.props.onDeletePress(deleteFiles, addImportListExclusion);
}
};
//
// Render

View File

@@ -36,7 +36,7 @@ class DeleteBookModalContentConnector extends Component {
this.props.onModalClose(true);
this.props.push(`${window.Readarr.urlBase}/author/${this.props.authorSlug}`);
}
};
//
// Render

View File

@@ -9,7 +9,7 @@
.tabList {
margin: 0;
padding: 0;
border-bottom: 1px solid $lightGray;
border-bottom: 1px solid var(--lightGray);
}
.tab {
@@ -24,7 +24,7 @@
}
.selectedTab {
border-bottom: 4px solid $linkColor;
border-bottom: 4px solid var(--linkColor);
}
.tabContent {
@@ -54,7 +54,7 @@
white-space: nowrap;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}

View File

@@ -45,42 +45,42 @@ class BookDetails extends Component {
onOrganizePress = () => {
this.setState({ isOrganizeModalOpen: true });
}
};
onOrganizeModalClose = () => {
this.setState({ isOrganizeModalOpen: false });
}
};
onRetagPress = () => {
this.setState({ isRetagModalOpen: true });
}
};
onRetagModalClose = () => {
this.setState({ isRetagModalOpen: false });
}
};
onEditBookPress = () => {
this.setState({ isEditBookModalOpen: true });
}
};
onEditBookModalClose = () => {
this.setState({ isEditBookModalOpen: false });
}
};
onDeleteBookPress = () => {
this.setState({
isEditBookModalOpen: false,
isDeleteBookModalOpen: true
});
}
};
onDeleteBookModalClose = () => {
this.setState({ isDeleteBookModalOpen: false });
}
};
onTabSelect = (index, lastIndex) => {
this.setState({ selectedTabIndex: index });
}
};
//
// Render

View File

@@ -146,14 +146,14 @@ class BookDetailsConnector extends Component {
this.props.fetchBookFiles({ bookId });
this.props.fetchEditions({ bookId });
}
};
unpopulate = () => {
this.props.cancelFetchReleases();
this.props.clearReleases();
this.props.clearBookFiles();
this.props.clearEditions();
}
};
//
// Listeners
@@ -163,21 +163,21 @@ class BookDetailsConnector extends Component {
bookIds: [this.props.id],
monitored
});
}
};
onRefreshPress = () => {
this.props.executeCommand({
name: commandNames.REFRESH_BOOK,
bookId: this.props.id
});
}
};
onSearchPress = () => {
this.props.executeCommand({
name: commandNames.BOOK_SEARCH,
bookIds: [this.props.id]
});
}
};
//
// Render

View File

@@ -16,7 +16,7 @@
position: absolute;
width: 100%;
height: 100%;
background: $black;
background: var(--black);
opacity: 0.7;
}
@@ -25,7 +25,7 @@
padding: 30px;
width: 100%;
height: 100%;
color: $white;
color: var(--white);
}
.cover {
@@ -69,7 +69,7 @@
width: 40px;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}

View File

@@ -48,11 +48,11 @@ class BookDetailsHeader extends Component {
onOverviewMeasure = ({ height }) => {
this.setState({ overviewHeight: height });
}
};
onTitleMeasure = ({ width }) => {
this.setState({ titleWidth: width });
}
};
//
// Render

View File

@@ -48,7 +48,7 @@ class BookDetailsHeaderConnector extends Component {
bookIds: [this.props.bookId],
monitored
});
}
};
//
// Render

View File

@@ -64,7 +64,7 @@ class BookDetailsPageConnector extends Component {
populate = () => {
this.setState({ hasMounted: true });
}
};
//
// Render

View File

@@ -16,7 +16,7 @@ class EditBookModalConnector extends Component {
onModalClose = () => {
this.props.clearPendingChanges({ section: 'books' });
this.props.onModalClose();
}
};
//
// Render

View File

@@ -27,7 +27,7 @@ class EditBookModalContent extends Component {
onSavePress(false);
}
};
//
// Render

View File

@@ -76,7 +76,7 @@ class EditBookModalContentConnector extends Component {
onInputChange = ({ name, value }) => {
this.props.dispatchSetBookValue({ name, value });
}
};
onSavePress = () => {
this.props.dispatchSaveBook({
@@ -85,7 +85,7 @@ class EditBookModalContentConnector extends Component {
this.props.dispatchSaveEditions({
id: this.props.bookId
});
}
};
//
// Render

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