Compare commits

...

158 Commits

Author SHA1 Message Date
Qstick c83c818380 Fixed: (Flaresolverr) Ignore http errors on initial request when using FS 2021-12-01 21:50:28 -06:00
Qstick a2df38b1ca Fixed: Windows installer and adding/removing services
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2021-12-01 21:46:33 -06:00
Qstick 89510c4a65 Fixed: Workaround net6 object serialization issues
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2021-12-01 20:39:26 -06:00
Qstick b5a2f68bde Fixed: (Newznab) Parse Imdb, Tmdb, RageId, Tvdbid from indexer
Fixes #656
2021-11-30 21:47:44 -06:00
Qstick 1ffab661da Don't fallback to different OS Yarn cache 2021-11-30 11:20:15 -06:00
Qstick bf0a627a4e New: (Indexer) PornoLab 2021-11-30 07:56:47 -06:00
Qstick df764ce8b4 New: Postgres Support 2021-11-29 23:14:48 -06:00
Qstick a61d4ab88c New: Stats filters 2021-11-29 23:14:48 -06:00
Qstick 01e7e924c4 Fixed: (Flaresolverr) Proxy Test
Fixes #651
2021-11-29 21:00:38 -06:00
Qstick 5f5df99dab Improved logging on bad date parse 2021-11-29 21:00:11 -06:00
bakerboy448 77e40e8e53 Fixed: (TorrentSyndikat) Download URL missing API 2021-11-29 19:36:47 -06:00
Qstick d3853c1a54 Bump version to 0.1.6 2021-11-28 22:15:09 -06:00
ta264 02ecc04526 Fixed: Restarting windows service from UI 2021-11-28 16:51:42 -06:00
Qstick 2e103d6dba ParseUtil Cleanup 2021-11-28 16:47:16 -06:00
Qstick 9b9d2f2798 Fixed: Tray app restart
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2021-11-28 16:46:15 -06:00
Qstick b80bfaeff0 Bump System.Data.SQLite.Core.Servar 2021-11-28 15:03:23 -06:00
bakerboy448 80b6821e46 Fixed: (Xthor) Details Linking to API and not the site
Fixes #577
2021-11-28 14:33:46 -06:00
bakerboy448 dbf81a7c9e Fixed: Outdated Definition Healthcheck not using Definition Name 2021-11-28 11:12:08 -06:00
Qstick cb2e5953d5 Bump version to 0.1.5 2021-11-28 01:57:32 -06:00
bakerboy448 f5d6fa9138 Fixed: (Cardigann) Blocklist depreciated definitions
reverts 1abd14ee86
adds additional v3 definitions
2021-11-27 23:34:29 -06:00
Qstick 7ce5df63d4 Fixed: (Cardigann) Number normalize to ignore non-digits 2021-11-27 22:38:52 -06:00
Qstick 10aa3e43a2 Fixed: (Cardigann) Use correct encoding for Auth and Download calls 2021-11-27 21:46:55 -06:00
Qstick 387f8df0ff Rework some Cardigann exception handling 2021-11-27 21:07:42 -06:00
Qstick d61ce3f27c Fixed: (Cardigann) Fails when Int variables used in requests 2021-11-27 20:50:58 -06:00
bakerboy448 eff8fdebf5 cleanse postgres username/pass creds
Fixes #632
2021-11-26 18:31:57 -06:00
bakerboy448 01fe990417 Update Github Templates [skip ci]
(cherry picked from commit beb22844c960db8e0f42a32809ad74cffce06e09)
2021-11-26 12:15:01 -06:00
bakerboy448 60f37de6af Fixed: (Orpheus) Try to actually use the token 2021-11-25 16:51:17 -06:00
Weblate cda373f195 Translated using Weblate (Finnish)
Currently translated at 99.5% (445 of 447 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (447 of 447 strings)

Translated using Weblate (Finnish)

Currently translated at 99.5% (445 of 447 strings)

Translated using Weblate (German)

Currently translated at 95.3% (426 of 447 strings)

Co-authored-by: Csaba <csab0825@gmail.com>
Co-authored-by: Don-Chris <Chr_Sch@t-online.de>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translation: Servarr/Prowlarr
2021-11-25 10:29:24 -06:00
Qstick 510ccf4bce New: Set GUID in IndexerBase if Indexer doesn't set it explicitly 2021-11-25 09:10:16 -06:00
Qstick 0fd411a37f Fixed: Default Cardigann to DownloadUrl GUID 2021-11-25 09:08:51 -06:00
Qstick cd7c73bad3 Fixed: Indexer not removed in UI when deleted
Indexer doesn't get removed because createAjaxReqest expects JSON type return, however after net6 provider delete event returns text/html type.
2021-11-23 18:18:00 -06:00
bakerboy448 44f12d9569 Fixed: (RarBG) Do not cleanse get_token 2021-11-23 14:57:03 -06:00
Qstick 51f8b1b5c4 Fixed: (Nebulance) Handle null poster 2021-11-23 10:17:23 -06:00
bakerboy448 8bce43ac29 Fixed: (Cardigann) Poster & tmbid are Optional by default
missed jackett commit f5802306fa1fe4edb4c7f997100a6caebe71e989
Fixes #629
2021-11-23 10:11:38 -06:00
Qstick 884aecf846 New: Store call URL in History, Link in UI 2021-11-22 17:14:52 -06:00
Qstick 1183a0386d New: Grab Title column option in History
Fixes #628
2021-11-22 16:40:06 -06:00
Qstick 5979c5f8fe Cleanup Config Options
Fixes #610
2021-11-22 16:40:05 -06:00
Qstick 25bb5b6427 Bump React-dnd to 14.0.4 2021-11-22 16:40:05 -06:00
Qstick 4d021fe8dc Fixed: Default search type should be 'search' 2021-11-22 08:09:32 -06:00
Qstick 520d82ed20 lint fixup 2021-11-21 18:58:02 -06:00
Weblate f19a81990b Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (447 of 447 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (447 of 447 strings)

Translated using Weblate (Finnish)

Currently translated at 100.0% (441 of 441 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2021-11-21 18:48:46 -06:00
Qstick 03cde56333 New: Additional logging for requests when query/grab limit are set 2021-11-21 18:46:12 -06:00
Qstick 19862cda6c Bump Webpack plugins and loaders 2021-11-21 18:32:39 -06:00
Qstick 230a0e5aa0 Bump Sentry to 6.15.0 2021-11-21 18:03:07 -06:00
Qstick 4273f2d6f3 Bump Webpack to 5.64.2 2021-11-21 18:00:02 -06:00
Qstick a4c92fc629 Update lint packages 2021-11-21 17:57:24 -06:00
Qstick ce901ae8a3 Update translate.js to use createAjaxRequest 2021-11-21 17:46:24 -06:00
Qstick 5d32bcf8b9 New: Bulk Grab Releases and Parameter Search 2021-11-20 18:00:55 -06:00
Chris Sandvik f69f96695b New: Add a filter bar to the "Add Indexers" modal (#607)
* Add a filter bar to the "Add Indexers" modal

* Fix stylelint errors

* Hide AddIndexerModal alert on small screens
2021-11-20 11:31:45 -06:00
Qstick 77fa113d77 Bump version to 0.1.4 2021-11-20 03:27:00 -06:00
bakerboy448 b8a42a7998 Fixed: (FlareSolverr) Detection of Cloudflare 2021-11-19 17:15:19 -06:00
Qstick a3fd37b27e Fixed: (Avistaz) Handle cases when Avistaz returns strings for ids
Fixes #556
2021-11-18 23:17:22 -06:00
Qstick 29dcbadfca Fixed: (DanishBytes) Set GUID for search results
Fixes #597
2021-11-18 22:44:53 -06:00
Qstick d8c9225d09 Fixed: (Cardigann) Use correct encoding for search requests
Fixes #496
2021-11-18 22:23:54 -06:00
Qstick 17008ace5c Fixed: (FlareSolverr) Don't attempt solve if CF not detected.
Fixes #478
2021-11-18 21:46:42 -06:00
Qstick 470b751f44 Fixed: (Cardigann) Don't try re-auth if can't html parse json 2021-11-18 20:14:41 -06:00
bakerboy448 a31971472d Fixed: Cleanse APIKey from Signalr logging
(cherry picked from (Readarr PR) commit 571b4647702737858d890ec2d18b73703b4b5a88)
2021-11-18 18:42:50 -06:00
ta264 4c4614cfab Fixed: Actually use freeleech tokens for Orpheus when enabled 2021-11-17 21:45:11 +00:00
Qstick f5cb81951a New: Use native .NET socks proxy 2021-11-18 00:11:37 -05:00
Qstick c35e257a82 New: Add osx-arm64 and linux-musl-arm builds 2021-11-18 00:11:37 -05:00
Qstick cb7cbb74e0 New: Build on Net6 2021-11-18 00:11:37 -05:00
Servarr c263c6f365 Translations from Weblate 2021-11-17 21:36:45 -06:00
Qstick 701c7d349a New: (Cardigann) XML Parser Suppport 2021-11-17 22:32:25 -05:00
bakerboy448 4a8131e00f Fixed: Cleanse APIKey from Newznab Response 2021-11-17 22:25:31 -05:00
bakerboy448 39fd9bea89 Fixed: (Cardigann) add headers from search block for all downloads
based on jackett https://github.com/Jackett/Jackett/commit/c567f47ad100dac8d67fdbee0fcc3ff8ff29aa39
2021-11-17 09:54:30 -05:00
bakerboy448 89a1b0f534 Fixed: (Cardigann) Do not log config RSSKey or APIKey
Fixed: (Cardigann) (v3) Pass APIKey as headers
2021-11-17 09:54:30 -05:00
bakerboy448 1aa9149866 Fixed: Orpheus failing to grab if token is not used
Closes #592
2021-11-14 00:35:29 -06:00
Qstick eccd72304c Fixed: (NorBits) Set final login as POST prior to adding parameters
Fixes #600
2021-11-14 00:32:19 -06:00
Qstick 0fb19160f4 Bump version to 0.1.3 2021-11-14 00:28:19 -06:00
Qstick 3e4ac89a4c Fixed: (DanishBytes) Nullable error on TV Search
Fixes #597
2021-11-14 00:26:37 -06:00
Qstick 9331d8e013 Fixed: Parsing of 8 digit IMDb Ids 2021-11-14 00:20:28 -06:00
Qstick e94c8839f6 Fixed: (Cardigann) Raw search parameter failed to deserialize 2021-11-14 00:20:28 -06:00
Qstick 1abd14ee86 Allow Obsolete of C# Indexer Implementations 2021-11-14 00:20:28 -06:00
Qstick 6200c9e496 New: (Cardigann) ImdbId and Description are optional 2021-11-14 00:20:28 -06:00
Qstick 2c0c6aa158 New: Support JSON parsing in Cardigann
Co-Authored-By: mikeoscar2006 <89641725+mikeoscar2006@users.noreply.github.com>
2021-11-14 00:20:28 -06:00
bakerboy448 93deb56e8e Fixed: Cleanse RSSKey and PassKey from Indexer Response 2021-11-14 00:16:35 -06:00
bakerboy448 971c755738 Fixed: (RarBG) Remove Book Category & Support
based on Jackett f018470d6951a496b3d274fdda825c26ae8f6425
2021-11-14 00:15:58 -06:00
bakerboy448 51df1be144 Fixed: Remove Defunct Usenet Indexer NZBXS
closes #594
2021-11-10 17:27:48 -06:00
Qstick 11fad915d5 Drop prefix from issue templates 2021-11-09 22:35:45 -06:00
Qstick 49793a3af0 Rename NzbSearchService to ReleaseSearchService 2021-11-09 22:27:53 -06:00
Qstick 87d6cbd813 Clarified Aria2 RPC Path field
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2021-11-09 22:26:30 -06:00
Qstick 5ca8148d3b Bump macOS build agent to 10.15 2021-11-09 22:14:31 -06:00
Qstick 8ebec7c7e1 Fixed: (Applications) Test fails when selecting sub-categories only for sync
Fixes #588
2021-11-09 22:12:56 -06:00
Robin Dadswell 61cff12206 Fixed: Time column is first column on events page
(cherry picked from commit c14ef7bee7477ad5d29498f1cba94267eb11daf0)
2021-11-09 18:55:05 -06:00
Qstick 22412981bb Fixed: (SpeedCD) Incorrect Http Login Method
Fixes #582
2021-11-08 23:29:31 -06:00
Qstick 8e43ea4bbc New: (Indexer) Norbits 2021-11-08 23:17:01 -06:00
bakerboy448 f38d6c5b42 Fixed: (Avistaz) Cleanse PID & Hash from response
Fixes #557
2021-11-08 20:27:32 -06:00
bakerboy448 2054dcc127 Fixed: (TorrentLeech) Drop support for IMDb ID TV Searches
Fixed: (TorrentLeech) Returning unrelated results for Season/Episode Searches

Fixes #474
2021-11-08 20:26:57 -06:00
Robin Dadswell 8d856b2edb New: Added UDP syslog support 2021-11-08 20:25:28 -06:00
Weblate e07ad14e83 Translated using Weblate (Swedish)
Currently translated at 100.0% (441 of 441 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (441 of 441 strings)

Translated using Weblate (Swedish)

Currently translated at 100.0% (441 of 441 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: LukkiHyde <lucas.bergstrom90@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translation: Servarr/Prowlarr
2021-11-08 20:24:51 -06:00
bakerboy448 d585ab5677 Fixed: (RuTracker.Org) Fails to add
Closes #560
2021-11-08 20:24:37 -06:00
zpengcom 6a6697c2c2 Translated using Weblate (Chinese (Simplified) (zh_CN))
Currently translated at 100.0% (441 of 441 strings)

Translation: Servarr/Prowlarr
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
2021-11-05 19:32:30 -05:00
Stéphane Dupont e859bedef1 Translated using Weblate (French)
Currently translated at 100.0% (441 of 441 strings)

Translation: Servarr/Prowlarr
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
2021-11-05 19:32:30 -05:00
dobbleg1000 e688dac040 Fixed: (Bakabt) Typo in Search link 2021-11-03 19:15:39 -05:00
Qstick b309582d91 Fixed: (DanishBytes) Double slash in search urls 2021-10-30 12:01:14 -05:00
bakerboy448 998e214171 New: (DesiTorrents) Add Alt URL .rocks
Closes #562
2021-10-30 11:48:54 -05:00
Qstick 8b0760296a Fixed: Set ContentType for Flaresolverr requests to ensure proper content encoding 2021-10-30 11:40:02 -05:00
Robin Dadswell 44aad1b943 Fixed: Prowl notification priority 2021-10-28 12:48:04 +01:00
Qstick 9ec8990a21 Bump to 0.1.2 2021-10-26 18:05:33 -04:00
Weblate 8ac721a30b Translated using Weblate (Chinese (Simplified) (zh_CN))
Currently translated at 96.8% (427 of 441 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN))

Currently translated at 96.3% (425 of 441 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN))

Currently translated at 96.3% (425 of 441 strings)

Translated using Weblate (French)

Currently translated at 100.0% (441 of 441 strings)

Co-authored-by: Nackophilz <clement.wigy@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: muihiuwev <muihiuwev@outlook.com>
Co-authored-by: yulelong <yulelong@foxmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2021-10-23 10:31:57 -05:00
bakerboy448 3bbadb516d New: (DesiTorrents) Convert from Gazelle to UNIT3D
Fixes #532
2021-10-17 14:00:57 -05:00
Qstick f5f0dd6fae New: Support server notifications 2021-10-17 13:10:06 -05:00
Qstick 0cfb7da411 New: (Indexer) BitHDTV 2021-10-17 12:27:23 -05:00
Qstick b65f4205fc Fixed: Don't delete down indexers if they still exist in DB
Fixes #494
2021-10-17 11:58:48 -05:00
Qstick 3e243eafdd Bump FluentMigrator to 3.3.1 2021-10-16 12:49:55 -05:00
Qstick 327fd08059 New: (RuTracker) Search by Categories 2021-10-15 20:04:59 -05:00
Qstick 827741db17 Fixed: (TVVault) add delay between requests and fix search & download 2021-10-15 20:01:39 -05:00
bakerboy448 c21e323992 New: Improved Logging of Search for ID based searches 2021-10-11 11:00:40 -05:00
Shane M e49d03ab7b Fixed: (RevolutionTT) Remove [REQ] prefix from torrent title (#545)
[REQ] is an automatically generated prefix added to fulfilled requests, and very often breaks parsing for title matching

Co-authored-by: Shane Moore <vales@users.noreply.github.com>
2021-10-10 19:14:03 -05:00
Nyuels 4347e1cf7a New: (Internet Archive) Add Torrent File Only option. (#459) 2021-10-10 17:21:39 -05:00
Qstick d7e1043b79 Fixed: (Cardigann) Info field text pulling from DB instead of definition 2021-10-10 17:12:46 -05:00
Weblate d4bdb73b7c Translated using Weblate (French)
Currently translated at 100.0% (441 of 441 strings)

Co-authored-by: Nackophilz <clement.wigy@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translation: Servarr/Prowlarr
2021-10-10 17:00:36 -05:00
Dmitry Chepurovskiy eeebf3ecf0 Fixed: (Anilibria) Fix download torrent link (#529) 2021-10-10 16:58:59 -05:00
Qstick 76d73aa6a9 New: (Indexer) SpeedCD 2021-10-10 14:23:42 -05:00
Qstick 5dfe530cf3 Fixed: (BB) Detect when re-auth needed 2021-10-10 14:06:30 -05:00
Qstick 8b8b5ba1c8 Cleanup cardigann logging 2021-10-10 13:04:12 -05:00
bakerboy448 c5caf22375 New: Support for Prowlarr Definitions v2
New: Support for Updated yml Definitions
Fixes: #298
2021-10-10 13:04:12 -05:00
Qstick 293b32ea0e New: Improve size and number parsing 2021-10-10 13:04:12 -05:00
Qstick 25bb10d62b New: (Cardigann) AllowRawSearch Property 2021-10-10 13:04:12 -05:00
bakerboy448 9eba50d9db New: Log which DB is being migrated
(cherry picked from Sonarr commit 07c95f06d3b9b32aaeb923d4c678f10a2bf1141a)
2021-10-09 09:42:19 -05:00
Qstick 234995cbaf Rename indexer proxied HTTP methods for clarification 2021-10-06 19:33:47 -05:00
Qstick 918071903b New: Raw search engine support in caps 2021-10-06 19:32:22 -05:00
bakerboy448 dcfa3ad48e Update contributing [skip ci] (#528)
* update contributing [skip ci]

sonarr pulls / *arr pulls

* nuke contributing => wiki [skip ci]

* fix wiki link [skip ci]

* fixup! fix wiki link [skip ci] (lint)
2021-10-06 19:08:14 -05:00
dobbleg1000 5dd6cde61a Fixed: (Indexer) Changed BakaBT to default to SFW content
Update Bakabt for Adult Content Bool and change link
2021-10-06 19:07:48 -05:00
Weblate d18ddcaa50 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/
Translation: Servarr/Prowlarr
2021-10-06 17:58:02 -05:00
bakerboy448 0cca9525a1 Fixed: (Indexers) Download requests not using the configured proxy
Fixes #520
2021-10-06 17:30:37 -05:00
Servarr 3455f3c92a Translations from Weblate
Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Arabic)

Currently translated at 81.6% (360 of 441 strings)

Translated using Weblate (Russian)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Icelandic)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Danish)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Slovak)

Currently translated at 10.6% (47 of 441 strings)

Translated using Weblate (German)

Currently translated at 95.4% (421 of 441 strings)

Translated using Weblate (Korean)

Currently translated at 60.3% (266 of 441 strings)

Translated using Weblate (Japanese)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Catalan)

Currently translated at 2.4% (11 of 441 strings)

Translated using Weblate (Bulgarian)

Currently translated at 75.7% (334 of 441 strings)

Translated using Weblate (Thai)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Romanian)

Currently translated at 81.8% (361 of 441 strings)

Translated using Weblate (Italian)

Currently translated at 85.7% (378 of 441 strings)

Translated using Weblate (Hindi)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Spanish)

Currently translated at 83.2% (367 of 441 strings)

Translated using Weblate (Hebrew)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Portuguese)

Currently translated at 84.1% (371 of 441 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 1.1% (5 of 441 strings)

Translated using Weblate (Swedish)

Currently translated at 81.8% (361 of 441 strings)

Translated using Weblate (Czech)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Greek)

Currently translated at 81.1% (358 of 441 strings)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 12.4% (55 of 441 strings)

Translated using Weblate (Turkish)

Currently translated at 81.6% (360 of 441 strings)

Translated using Weblate (Vietnamese)

Currently translated at 81.4% (359 of 441 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN))

Currently translated at 90.9% (401 of 441 strings)

Translated using Weblate (Polish)

Currently translated at 81.4% (359 of 441 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/is/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/th/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_Hans/
Translation: Servarr/Prowlarr

Co-authored-by: Weblate <noreply@weblate.org>
2021-10-05 08:34:23 -05:00
Weblate af03c17892 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/
Translation: Servarr/Prowlarr
2021-10-02 11:18:49 -04:00
Weblate 6b39fa5ce6 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/
Translation: Servarr/Prowlarr
2021-10-02 10:36:09 -04:00
Servarr 1ee79f16fc Translated using Weblate (Turkish) (#516)
Currently translated at 16.5% (73 of 441 strings)

Translated using Weblate (French)

Currently translated at 99.7% (440 of 441 strings)

Co-authored-by: Francis Peixoto <peixoto.francis@gmail.com>
Co-authored-by: Micky <ad312@pm.me>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/tr/
Translation: Servarr/Prowlarr

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Francis Peixoto <peixoto.francis@gmail.com>
Co-authored-by: Micky <ad312@pm.me>
2021-10-01 15:17:59 -05:00
bakerboy448 e73f2466cc Fixed (Headphones): Add missing description 2021-10-01 15:17:35 -05:00
Weblate 2e56b7681e Translated using Weblate (Dutch)
Currently translated at 100.0% (441 of 441 strings)

Translated using Weblate (Bulgarian)

Currently translated at 10.2% (45 of 441 strings)

Translated using Weblate (Korean)

Currently translated at 17.9% (79 of 441 strings)

Translated using Weblate (Spanish)

Currently translated at 76.1% (336 of 441 strings)

Co-authored-by: COTMO <moermantom1@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: eslifos <eaaf_01@hotmail.com>
Co-authored-by: keysuck <joshkkim@gmail.com>
Co-authored-by: siankatabg <siankata91@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translation: Servarr/Prowlarr
2021-09-25 22:08:27 -05:00
Jayson Reis 87650c83c6 New: (Indexer) lat-team.com (#505)
* New: (Indexer) Torrent lat-team.com

* Add lat-team to ignore definitions list

* Fix lat-team name
2021-09-25 22:03:42 -05:00
Qstick 34a09af01e New: Advanced settings for Application category control 2021-09-25 09:46:31 -04:00
Qstick 5a3d429d52 Remove unused MovieMonitor input 2021-09-25 09:46:31 -04:00
Qstick 40c49bce9b Fixed: Spinning of Test All Indexer icon
#507
2021-09-23 20:42:17 -05:00
Qstick 063083a1f1 Fixed: Search from header on Search Page
Fixes #511
2021-09-23 20:28:22 -05:00
bakerboy448 dbbc913809 New: (InternetArchive) Add Support for TV Categories
ref API docs `movies: any item where the main media content is video files, like mpeg, mov, avi, etc`
2021-09-19 08:47:59 -05:00
Qstick f0f2c88c4a Fixed: (qBittorrent) Don't fail if remove torrents is enabled
We don't care about this in Prowlarr

Fixes #499
2021-09-15 22:04:09 -05:00
Weblate 1bfcb99f31 Translated using Weblate (Slovak)
Currently translated at 7.4% (33 of 441 strings)

Added translation using Weblate (Slovak)

Translated using Weblate (Norwegian Bokmål)

Currently translated at 9.2% (41 of 441 strings)

Added translation using Weblate (Norwegian Bokmål)

Translated using Weblate (Portuguese)

Currently translated at 83.6% (369 of 441 strings)

Translated using Weblate (Dutch)

Currently translated at 78.9% (348 of 441 strings)

Co-authored-by: 7even <henning@wikene.no>
Co-authored-by: Samuel Bartík <github.fundal@aleeas.com>
Co-authored-by: Stevie Robinson <stevie.robinson@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: sergioquiterio <serquiterio@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/sk/
Translation: Servarr/Prowlarr
2021-09-15 21:57:50 -05:00
bakerboy448 4ea0e6c016 add various missing descriptions 2021-09-15 21:57:26 -05:00
bakerboy448 1de845c8f5 (indexers) various - standardized language format with {ISO 639-1}-{ISO 3166-1 alpha-2} 2021-09-15 21:57:26 -05:00
bakerboy448 f3a33cf817 Fixed: Missing Proxy Validation Translations 2021-09-15 21:43:51 -05:00
bakerboy448 593a0e9658 Fixed: (MAM) Don't Parse HTTP Error Responses 2021-09-07 16:03:34 -05:00
Servarr a854ce6f4e Translated using Weblate (Portuguese (Brazil)) (#484)
Currently translated at 100.0% (441 of 441 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN))

Currently translated at 62.5% (276 of 441 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (441 of 441 strings)

Co-authored-by: Csaba <csab0825@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: angelsky11 <angelsky11@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Csaba <csab0825@gmail.com>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: angelsky11 <angelsky11@gmail.com>
2021-09-03 14:33:08 -05:00
bakerboy448 043b1a0e46 Fixed: Better Log Cleansing
Ref #280 YGG Comment
2021-08-31 19:51:37 -04:00
bakerboy448 4c7c7e8a62 Fixed: (BTN) Daily Episode Searches failing
Fixes #480
2021-08-31 19:50:46 -04:00
Qstick 89a4c03dd2 Fixed: Translations for Tags setting page
Fixes #471
2021-08-30 22:48:24 -04:00
Qstick baed2960b6 Fixed: (TorrentSeeds) new Login
Fixes #460
2021-08-30 22:39:05 -04:00
Qstick e4ef1c3af0 Fixed: Convert DesiTorrents to Gazelle
Fixes #220
2021-08-30 22:20:40 -04:00
bakerboy448 b4f8fb733f Fixed: Indexer Display Issue on Search Page
Fixes #177
2021-08-30 20:47:46 -04:00
bakerboy448 1a6ea21b9f Fixed: Increased Xthor Rate Limit Time
Fixes Logs of #472

> 2021-08-28 05:59:47.8|Error|Xthor|An error occurred while processing indexer feed. https://api.xthor.tk?passkey=(removed)&category=12%2B125%2B104%2B13%2B15%2B14%2B98%2B17%2B16%2B101%2B32%2B110%2B123%2B109%2B34%2B30&accent=1

[v0.1.1.875] System.Exception: Triggered AntiSpam Protection, please delay your requests!
   at NzbDrone.Core.Indexers.Definitions.Xthor.XthorParser.CheckApiState(XthorError state) in D:\a\1\s\src\NzbDrone.Core\Indexers\Definitions\Xthor\XthorParser.cs:line 112
   at NzbDrone.Core.Indexers.Definitions.Xthor.XthorParser.ParseResponse(IndexerResponse indexerResponse) in D:\a\1\s\src\NzbDrone.Core\Indexers\Definitions\Xthor\XthorParser.cs:line 32
   at NzbDrone.Core.Indexers.HttpIndexerBase`1.FetchPage(IndexerRequest request, IParseIndexerResponse parser) in D:\a\1\s\src\NzbDrone.Core\Indexers\HttpIndexerBase.cs:line 321
   at NzbDrone.Core.Indexers.HttpIndexerBase`1.FetchReleases(Func`2 pageableRequestChainSelector, Boolean isRecent) in D:\a\1\s\src\NzbDrone.Core\Indexers\HttpIndexerBase.cs:line 174
RequestUri: https://api.xthor.tk?passkey=(removed)&category=12%2B125%2B104%2B13%2B15%2B14%2B98%2B17%2B16%2B101%2B32%2B110%2B123%2B109%2B34%2B30&accent=1;StatusCode: OK;ContentType: application/json;ContentLength: 133;ContentSample: {
    "error": {
        "code": 8,
        "descr": "Protection Anti-Spam: A.P.I limitee a 1 requete toutes les 2 secondes."
    }
};FeedUrl: https://api.xthor.tk?passkey=(removed)&category=12%2B125%2B104%2B13%2B15%2B14%2B98%2B17%2B16%2B101%2B32%2B110%2B123%2B109%2B34%2B30&accent=1
2021-08-30 19:58:48 -04:00
bakerboy448 16834e0f24 Fixed: (TPB) No Results returned for Torznab searches
Fixed: (TPB) Missing Magnet Download Link
2021-08-30 19:43:20 -04:00
Qstick 658724b315 OpenAPI auto generation test 2021-08-29 23:12:59 -04:00
bakerboy448 a2c8cec27e bug template fix [skip ci] [common] 2021-08-27 20:46:58 -05:00
Nyuels 3c9fbeabaa Fixed: Use Gazelle freelech tokens. (#465) 2021-08-27 18:21:56 -04:00
Weblate 04e84f3a90 Translated using Weblate (Hungarian)
Currently translated at 100.0% (438 of 438 strings)

Translated using Weblate (French)

Currently translated at 97.7% (428 of 438 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (438 of 438 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Csaba <csab0825@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hu/
Translation: Servarr/Prowlarr
2021-08-25 23:23:36 -04:00
Steve Adams 77a76fe5a1 New: HDBits to parse IMDB using parser utils (#454) 2021-08-25 23:22:04 -04:00
458 changed files with 26140 additions and 10924 deletions
+1 -1
View File
@@ -260,7 +260,7 @@ dotnet_diagnostic.CA5392.severity = suggestion
dotnet_diagnostic.CA5394.severity = suggestion dotnet_diagnostic.CA5394.severity = suggestion
dotnet_diagnostic.CA5397.severity = suggestion dotnet_diagnostic.CA5397.severity = suggestion
dotnet_diagnostic.SYSLIB0014.severity = none
[*.{js,html,js,hbs,less,css}] [*.{js,html,js,hbs,less,css}]
charset = utf-8 charset = utf-8
+3 -4
View File
@@ -1,5 +1,4 @@
name: Bug Report name: Bug Report
title: "[BUG]: "
description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Reddit or Discord first' description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Reddit or Discord first'
labels: ['Type: Bug', 'Status: Needs Triage'] labels: ['Type: Bug', 'Status: Needs Triage']
body: body:
@@ -64,11 +63,11 @@ body:
required: true required: true
- type: textarea - type: textarea
attributes: attributes:
label: Anything else? label: Trace Logs?
description: | description: |
Trace Logs (https://wiki.servarr.com/prowlarr/troubleshooting#logging-and-log-files) Trace Logs (https://wiki.servarr.com/prowlarr/troubleshooting#logging-and-log-files)
Links? References? Anything that will give us more context about the issue you are encountering! ***Generally speaking, all bug reports must have trace logs provided.***
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
Additionally, any additional info? Screenshots? References? Anything that will give us more context about the issue you are encountering!
validations: validations:
required: true required: true
@@ -1,5 +1,4 @@
name: Feature Request name: Feature Request
title: "[FEAT]: "
description: 'Suggest an idea for Prowlarr' description: 'Suggest an idea for Prowlarr'
labels: ['Type: Feature Request', 'Status: Needs Triage'] labels: ['Type: Feature Request', 'Status: Needs Triage']
body: body:
+6 -48
View File
@@ -1,55 +1,13 @@
# How to Contribute # # How to Contribute
We're always looking for people to help make Prowlarr even better, there are a number of ways to contribute. We're always looking for people to help make Prowlarr even better, there are a number of ways to contribute.
This file is updated on an ad-hoc basis, for the latest details please see the [contributing wiki page](https://wiki.servarr.com/prowlarr/contributing). This file has been moved to the wiki for the latest details please see the [contributing wiki page](https://wiki.servarr.com/prowlarr/contributing).
## Documentation ## ## Documentation
Setup guides, FAQ, the more information we have on the [wiki](https://wiki.servarr.com/prowlarr) the better.
## Development ## Setup guides, [FAQ](https://wiki.servarr.com/prowlarr/faq), the more information we have on the [wiki](https://wiki.servarr.com/prowlarr) the better.
### Tools required ### ## Development
- Visual Studio 2019 or higher (https://www.visualstudio.com/vs/). The community version is free and works (https://www.visualstudio.com/downloads/).
- HTML/Javascript editor of choice (VS Code/Sublime Text/Webstorm/Atom/etc)
- [Git](https://git-scm.com/downloads)
- [NodeJS](https://nodejs.org/en/download/) (Node 12.X.X or higher)
- [Yarn](https://yarnpkg.com/)
- .NET Core 5.0.
### Getting started ### See the [Wiki Page](https://wiki.servarr.com/prowlarr/contributing)
1. Fork Prowlarr
2. Clone the repository into your development machine. [*info*](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository-from-github)
3. Install the required Node Packages `yarn install`
4. Start gulp to monitor your dev environment for any changes that need post processing using `yarn start` command.
5. Build the project in Visual Studio, Setting startup project to `Prowlarr.Console` and framework to `net5.0`
6. Debug the project in Visual Studio
7. Open http://localhost:9696
### Contributing Code ###
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Prowlarr/Prowlarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first)
- Rebase from Prowlarr's develop branch, don't merge
- Make meaningful commits, or squash them
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
- Reach out to us on the discord if you have any questions
- Add tests (unit/integration)
- Commit with *nix line endings for consistency (We checkout Windows and commit *nix)
- One feature/bug fix per pull request to keep things clean and easy to understand
- Use 4 spaces instead of tabs, this is the default for VS 2019 and WebStorm (to my knowledge)
### Contributing Indexers ###
- If you're contributing an indexer please phrase your commit as something like: `New: (Indexer) {Indexer Name}`, `New: (Indexer) {Usenet|Torrent} {Indexer Name}`, `New: (Indexer) {Torznab|Newznab} {Indexer Name}`
- If you're updating an indexer please phrase your commit as something like: `Fixed: (Indexer) {Indexer Name} {changes}` e.g. `Fixed: (Indexer) Changed BHD to use API`
### Pull Requesting ###
- Only make pull requests to develop, never master, if you make a PR to master we'll comment on it and close it
- You're probably going to get some comments or questions from us, they will be to ensure consistency and maintainability
- We'll try to respond to pull requests as soon as possible, if its been a day or two, please reach out to us, we may have missed it
- Each PR should come from its own [feature branch](http://martinfowler.com/bliki/FeatureBranch.html) not develop in your fork, it should have a meaningful branch name (what is being added/fixed)
- new-feature (Good)
- fix-bug (Good)
- patch (Bad)
- develop (Bad)
If you have any questions about any of this, please let us know.
+53 -32
View File
@@ -7,13 +7,13 @@ variables:
outputFolder: './_output' outputFolder: './_output'
artifactsFolder: './_artifacts' artifactsFolder: './_artifacts'
testsFolder: './_tests' testsFolder: './_tests'
majorVersion: '0.1.1' majorVersion: '0.1.6'
minorVersion: $[counter('minorVersion', 1)] minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)' prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
sentryOrg: 'servarr' sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com' sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '5.0.400' dotnetVersion: '6.0.100'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn yarnCacheFolder: $(Pipeline.Workspace)/.yarn
trigger: trigger:
@@ -67,7 +67,7 @@ stages:
enableAnalysis: 'true' enableAnalysis: 'true'
Mac: Mac:
osName: 'Mac' osName: 'Mac'
imageName: 'macos-10.14' imageName: 'macos-10.15'
enableAnalysis: 'false' enableAnalysis: 'false'
Windows: Windows:
osName: 'Windows' osName: 'Windows'
@@ -111,23 +111,23 @@ stages:
artifact: '$(osName)Backend' artifact: '$(osName)Backend'
displayName: Publish Backend displayName: Publish Backend
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net5.0/win-x64/publish' - publish: '$(testsFolder)/net6.0/win-x64/publish'
artifact: WindowsCoreTests artifact: WindowsCoreTests
displayName: Publish Windows Test Package displayName: Publish Windows Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net5.0/linux-x64/publish' - publish: '$(testsFolder)/net6.0/linux-x64/publish'
artifact: LinuxCoreTests artifact: LinuxCoreTests
displayName: Publish Linux Test Package displayName: Publish Linux Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net5.0/linux-musl-x64/publish' - publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
artifact: LinuxMuslCoreTests artifact: LinuxMuslCoreTests
displayName: Publish Linux Musl Test Package displayName: Publish Linux Musl Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net5.0/freebsd-x64/publish' - publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
artifact: FreebsdCoreTests artifact: FreebsdCoreTests
displayName: Publish FreeBSD Test Package displayName: Publish FreeBSD Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net5.0/osx-x64/publish' - publish: '$(testsFolder)/net6.0/osx-x64/publish'
artifact: MacCoreTests artifact: MacCoreTests
displayName: Publish MacOS Test Package displayName: Publish MacOS Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows')) condition: and(succeeded(), eq(variables['osName'], 'Windows'))
@@ -144,7 +144,7 @@ stages:
imageName: 'ubuntu-18.04' imageName: 'ubuntu-18.04'
Mac: Mac:
osName: 'Mac' osName: 'Mac'
imageName: 'macos-10.14' imageName: 'macos-10.15'
Windows: Windows:
osName: 'Windows' osName: 'Windows'
imageName: 'windows-2019' imageName: 'windows-2019'
@@ -163,7 +163,6 @@ stages:
key: 'yarn | "$(osName)" | yarn.lock' key: 'yarn | "$(osName)" | yarn.lock'
restoreKeys: | restoreKeys: |
yarn | "$(osName)" yarn | "$(osName)"
yarn
path: $(yarnCacheFolder) path: $(yarnCacheFolder)
displayName: Cache Yarn packages displayName: Cache Yarn packages
- bash: ./build.sh --frontend - bash: ./build.sh --frontend
@@ -203,12 +202,12 @@ stages:
- bash: ./build.sh --packages - bash: ./build.sh --packages
displayName: Create Packages displayName: Create Packages
- bash: | - bash: |
distribution/windows/setup/inno/ISCC.exe distribution/windows/setup/prowlarr.iss //DFramework=net5.0 //DRuntime=win-x86 distribution/windows/setup/inno/ISCC.exe distribution/windows/setup/prowlarr.iss //DFramework=net6.0 //DRuntime=win-x86
cp distribution/windows/setup/output/Prowlarr.*windows.net5.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Prowlarr.${BUILDNAME}.windows-core-x86-installer.exe cp distribution/windows/setup/output/Prowlarr.*windows.net6.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Prowlarr.${BUILDNAME}.windows-core-x86-installer.exe
displayName: Create x86 .NET Core Windows installer displayName: Create x86 .NET Core Windows installer
- bash: | - bash: |
distribution/windows/setup/inno/ISCC.exe distribution/windows/setup/prowlarr.iss //DFramework=net5.0 //DRuntime=win-x64 distribution/windows/setup/inno/ISCC.exe distribution/windows/setup/prowlarr.iss //DFramework=net6.0 //DRuntime=win-x64
cp distribution/windows/setup/output/Prowlarr.*windows.net5.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Prowlarr.${BUILDNAME}.windows-core-x64-installer.exe cp distribution/windows/setup/output/Prowlarr.*windows.net6.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Prowlarr.${BUILDNAME}.windows-core-x64-installer.exe
displayName: Create x64 .NET Core Windows installer displayName: Create x64 .NET Core Windows installer
- publish: $(Build.ArtifactStagingDirectory) - publish: $(Build.ArtifactStagingDirectory)
artifact: 'WindowsInstaller' artifact: 'WindowsInstaller'
@@ -250,29 +249,44 @@ stages:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x64/net5.0 rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create Windows x86 Core zip displayName: Create Windows x86 Core zip
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x86/net5.0 rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create MacOS Core app displayName: Create MacOS x64 Core app
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip' archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip'
archiveType: 'zip' archiveType: 'zip'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/macos-app/net5.0 rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create MacOS Core tar displayName: Create MacOS x64 Core tar
inputs: inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-x64.tar.gz' archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-x64.tar.gz'
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/macos/net5.0 rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
- task: ArchiveFiles@2
displayName: Create MacOS arm64 Core app
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-arm64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
- task: ArchiveFiles@2
displayName: Create MacOS arm64 Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-arm64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create Linux Core tar displayName: Create Linux Core tar
inputs: inputs:
@@ -280,7 +294,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/net5.0 rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create Linux Musl Core tar displayName: Create Linux Musl Core tar
inputs: inputs:
@@ -288,7 +302,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net5.0 rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create ARM32 Linux Core tar displayName: Create ARM32 Linux Core tar
inputs: inputs:
@@ -296,7 +310,15 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm/net5.0 rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
- task: ArchiveFiles@2
displayName: Create ARM32 Linux Musl Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-musl-core-arm.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create ARM64 Linux Core tar displayName: Create ARM64 Linux Core tar
inputs: inputs:
@@ -304,7 +326,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net5.0 rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create ARM64 Linux Musl Core tar displayName: Create ARM64 Linux Musl Core tar
inputs: inputs:
@@ -312,7 +334,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net5.0 rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0
- task: ArchiveFiles@2 - task: ArchiveFiles@2
displayName: Create FreeBSD Core Core tar displayName: Create FreeBSD Core Core tar
inputs: inputs:
@@ -320,7 +342,7 @@ stages:
archiveType: 'tar' archiveType: 'tar'
tarCompression: 'gz' tarCompression: 'gz'
includeRootFolder: false includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net5.0 rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net6.0
- publish: $(Build.ArtifactStagingDirectory) - publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages' artifact: 'Packages'
displayName: Publish Packages displayName: Publish Packages
@@ -383,7 +405,7 @@ stages:
osName: 'Mac' osName: 'Mac'
testName: 'MacCore' testName: 'MacCore'
poolName: 'Azure Pipelines' poolName: 'Azure Pipelines'
imageName: 'macos-10.14' imageName: 'macos-10.15'
WindowsCore: WindowsCore:
osName: 'Windows' osName: 'Windows'
testName: 'WindowsCore' testName: 'WindowsCore'
@@ -510,7 +532,7 @@ stages:
MacCore: MacCore:
osName: 'Mac' osName: 'Mac'
testName: 'MacCore' testName: 'MacCore'
imageName: 'macos-10.14' imageName: 'macos-10.15'
pattern: 'Prowlarr.*.osx-core-x64.tar.gz' pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
WindowsCore: WindowsCore:
osName: 'Windows' osName: 'Windows'
@@ -686,7 +708,7 @@ stages:
failBuild: false failBuild: false
Mac: Mac:
osName: 'Mac' osName: 'Mac'
imageName: 'macos-10.14' imageName: 'macos-10.15'
pattern: 'Prowlarr.*.osx-core-x64.tar.gz' pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
failBuild: false failBuild: false
Windows: Windows:
@@ -793,7 +815,6 @@ stages:
key: 'yarn | "$(osName)" | yarn.lock' key: 'yarn | "$(osName)" | yarn.lock'
restoreKeys: | restoreKeys: |
yarn | "$(osName)" yarn | "$(osName)"
yarn
path: $(yarnCacheFolder) path: $(yarnCacheFolder)
displayName: Cache Yarn packages displayName: Cache Yarn packages
- bash: ./build.sh --lint - bash: ./build.sh --lint
@@ -838,8 +859,8 @@ stages:
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
- bash: | - bash: |
./build.sh --backend -f net5.0 -r win-x64 ./build.sh --backend -f net6.0 -r win-x64
TEST_DIR=_tests/net5.0/win-x64/publish/ ./test.sh Windows Unit Coverage TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage
displayName: Coverage Unit Tests displayName: Coverage Unit Tests
- task: SonarCloudAnalyze@1 - task: SonarCloudAnalyze@1
condition: eq(variables['System.PullRequest.IsFork'], 'False') condition: eq(variables['System.PullRequest.IsFork'], 'False')
+29 -25
View File
@@ -130,7 +130,7 @@ PackageLinux()
echo "Adding Prowlarr.Mono to UpdatePackage" echo "Adding Prowlarr.Mono to UpdatePackage"
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update
if [ "$framework" = "net5.0" ]; then if [ "$framework" = "net6.0" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
fi fi
@@ -141,12 +141,13 @@ PackageLinux()
PackageMacOS() PackageMacOS()
{ {
local framework="$1" local framework="$1"
local runtime="$2"
ProgressStart "Creating MacOS Package for $framework" ProgressStart "Creating MacOS Package for $framework $runtime"
local folder=$artifactsFolder/macos/$framework/Prowlarr local folder=$artifactsFolder/$runtime/$framework/Prowlarr
PackageFiles "$folder" "$framework" "osx-x64" PackageFiles "$folder" "$framework" "$runtime"
echo "Removing Service helpers" echo "Removing Service helpers"
rm -f $folder/ServiceUninstall.* rm -f $folder/ServiceUninstall.*
@@ -157,7 +158,7 @@ PackageMacOS()
echo "Adding Prowlarr.Mono to UpdatePackage" echo "Adding Prowlarr.Mono to UpdatePackage"
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update
if [ "$framework" = "net5.0" ]; then if [ "$framework" = "net6.0" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
fi fi
@@ -168,10 +169,11 @@ PackageMacOS()
PackageMacOSApp() PackageMacOSApp()
{ {
local framework="$1" local framework="$1"
local runtime="$2"
ProgressStart "Creating macOS App Package for $framework" ProgressStart "Creating macOS App Package for $framework $runtime"
local folder=$artifactsFolder/macos-app/$framework local folder="$artifactsFolder/$runtime-app/$framework"
rm -rf $folder rm -rf $folder
mkdir -p $folder mkdir -p $folder
@@ -179,7 +181,7 @@ PackageMacOSApp()
mkdir -p $folder/Prowlarr.app/Contents/MacOS mkdir -p $folder/Prowlarr.app/Contents/MacOS
echo "Copying Binaries" echo "Copying Binaries"
cp -r $artifactsFolder/macos/$framework/Prowlarr/* $folder/Prowlarr.app/Contents/MacOS cp -r $artifactsFolder/$runtime/$framework/Prowlarr/* $folder/Prowlarr.app/Contents/MacOS
echo "Removing Update Folder" echo "Removing Update Folder"
rm -r $folder/Prowlarr.app/Contents/MacOS/Prowlarr.Update rm -r $folder/Prowlarr.app/Contents/MacOS/Prowlarr.Update
@@ -226,8 +228,8 @@ Package()
PackageWindows "$framework" "$runtime" PackageWindows "$framework" "$runtime"
;; ;;
osx) osx)
PackageMacOS "$framework" PackageMacOS "$framework" "$runtime"
PackageMacOSApp "$framework" PackageMacOSApp "$framework" "$runtime"
;; ;;
esac esac
} }
@@ -327,14 +329,14 @@ then
Build Build
if [[ -z "$RID" || -z "$FRAMEWORK" ]]; if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then then
PackageTests "net5.0" "win-x64" PackageTests "net6.0" "win-x64"
PackageTests "net5.0" "win-x86" PackageTests "net6.0" "win-x86"
PackageTests "net5.0" "linux-x64" PackageTests "net6.0" "linux-x64"
PackageTests "net5.0" "linux-musl-x64" PackageTests "net6.0" "linux-musl-x64"
PackageTests "net5.0" "osx-x64" PackageTests "net6.0" "osx-x64"
if [ "$ENABLE_BSD" = "YES" ]; if [ "$ENABLE_BSD" = "YES" ];
then then
PackageTests "net5.0" "freebsd-x64" PackageTests "net6.0" "freebsd-x64"
fi fi
else else
PackageTests "$FRAMEWORK" "$RID" PackageTests "$FRAMEWORK" "$RID"
@@ -363,17 +365,19 @@ then
if [[ -z "$RID" || -z "$FRAMEWORK" ]]; if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then then
Package "net5.0" "win-x64" Package "net6.0" "win-x64"
Package "net5.0" "win-x86" Package "net6.0" "win-x86"
Package "net5.0" "linux-x64" Package "net6.0" "linux-x64"
Package "net5.0" "linux-musl-x64" Package "net6.0" "linux-musl-x64"
Package "net5.0" "linux-arm64" Package "net6.0" "linux-arm64"
Package "net5.0" "linux-musl-arm64" Package "net6.0" "linux-musl-arm64"
Package "net5.0" "linux-arm" Package "net6.0" "linux-arm"
Package "net5.0" "osx-x64" Package "net6.0" "linux-musl-arm"
Package "net6.0" "osx-x64"
Package "net6.0" "osx-arm64"
if [ "$ENABLE_BSD" = "YES" ]; if [ "$ENABLE_BSD" = "YES" ];
then then
Package "net5.0" "freebsd-x64" Package "net6.0" "freebsd-x64"
fi fi
else else
Package "$FRAMEWORK" "$RID" Package "$FRAMEWORK" "$RID"
-2
View File
@@ -4,7 +4,5 @@ export const CLEAR_HISTORY = 'ClearHistory';
export const CLEAR_LOGS = 'ClearLog'; export const CLEAR_LOGS = 'ClearLog';
export const DELETE_LOG_FILES = 'DeleteLogFiles'; export const DELETE_LOG_FILES = 'DeleteLogFiles';
export const DELETE_UPDATE_LOG_FILES = 'DeleteUpdateLogFiles'; export const DELETE_UPDATE_LOG_FILES = 'DeleteUpdateLogFiles';
export const INTERACTIVE_IMPORT = 'ManualImport';
export const RESET_API_KEY = 'ResetApiKey'; export const RESET_API_KEY = 'ResetApiKey';
export const RSS_SYNC = 'RssSync';
export const APP_INDEXER_SYNC = 'ApplicationIndexerSync'; export const APP_INDEXER_SYNC = 'ApplicationIndexerSync';
@@ -70,18 +70,18 @@ class FileBrowserModalContent extends Component {
} else { } else {
this._scrollerNode = null; this._scrollerNode = null;
} }
} };
// //
// Listeners // Listeners
onPathInputChange = ({ value }) => { onPathInputChange = ({ value }) => {
this.setState({ currentPath: value }); this.setState({ currentPath: value });
} };
onRowPress = (path) => { onRowPress = (path) => {
this.props.onFetchPaths(path); this.props.onFetchPaths(path);
} };
onOkPress = () => { onOkPress = () => {
this.props.onChange({ this.props.onChange({
@@ -91,7 +91,7 @@ class FileBrowserModalContent extends Component {
this.props.onClearPaths(); this.props.onClearPaths();
this.props.onModalClose(); this.props.onModalClose();
} };
// //
// Render // Render
@@ -78,16 +78,16 @@ class FileBrowserModalContentConnector extends Component {
allowFoldersWithoutTrailingSlashes: true, allowFoldersWithoutTrailingSlashes: true,
includeFiles includeFiles
}); });
} };
onClearPaths = () => { onClearPaths = () => {
// this.props.dispatchClearPaths(); // this.props.dispatchClearPaths();
} };
onModalClose = () => { onModalClose = () => {
this.props.dispatchClearPaths(); this.props.dispatchClearPaths();
this.props.onModalClose(); this.props.onModalClose();
} };
// //
// Render // Render
@@ -28,7 +28,7 @@ class FileBrowserRow extends Component {
onPress = () => { onPress = () => {
this.props.onPress(this.props.path); this.props.onPress(this.props.path);
} };
// //
// Render // Render
@@ -102,7 +102,7 @@ class DateFilterBuilderRowValue extends Component {
name: NAME, name: NAME,
value: newValue value: newValue
}); });
} };
onTimeChange = ({ value }) => { onTimeChange = ({ value }) => {
const { const {
@@ -117,7 +117,7 @@ class DateFilterBuilderRowValue extends Component {
value: filterValue.value value: filterValue.value
} }
}); });
} };
// //
// Render // Render
@@ -63,7 +63,7 @@ class FilterBuilderModalContent extends Component {
onLabelChange = ({ value }) => { onLabelChange = ({ value }) => {
this.setState({ label: value }); this.setState({ label: value });
} };
onFilterChange = (index, filter) => { onFilterChange = (index, filter) => {
const filters = [...this.state.filters]; const filters = [...this.state.filters];
@@ -72,7 +72,7 @@ class FilterBuilderModalContent extends Component {
this.setState({ this.setState({
filters filters
}); });
} };
onAddFilterPress = () => { onAddFilterPress = () => {
const filters = [...this.state.filters]; const filters = [...this.state.filters];
@@ -81,7 +81,7 @@ class FilterBuilderModalContent extends Component {
this.setState({ this.setState({
filters filters
}); });
} };
onRemoveFilterPress = (index) => { onRemoveFilterPress = (index) => {
const filters = [...this.state.filters]; const filters = [...this.state.filters];
@@ -90,7 +90,7 @@ class FilterBuilderModalContent extends Component {
this.setState({ this.setState({
filters filters
}); });
} };
onSaveFilterPress = () => { onSaveFilterPress = () => {
const { const {
@@ -122,7 +122,7 @@ class FilterBuilderModalContent extends Component {
label, label,
filters filters
}); });
} };
// //
// Render // Render
@@ -138,7 +138,7 @@ class FilterBuilderRow extends Component {
this.selectedFilterBuilderProp = selectedFilterBuilderProp; this.selectedFilterBuilderProp = selectedFilterBuilderProp;
onFilterChange(index, filter); onFilterChange(index, filter);
} };
onFilterChange = ({ name, value }) => { onFilterChange = ({ name, value }) => {
const { const {
@@ -158,7 +158,7 @@ class FilterBuilderRow extends Component {
filter[name] = value; filter[name] = value;
onFilterChange(index, filter); onFilterChange(index, filter);
} };
onAddPress = () => { onAddPress = () => {
const { const {
@@ -167,7 +167,7 @@ class FilterBuilderRow extends Component {
} = this.props; } = this.props;
onAddPress(index); onAddPress(index);
} };
onRemovePress = () => { onRemovePress = () => {
const { const {
@@ -176,7 +176,7 @@ class FilterBuilderRow extends Component {
} = this.props; } = this.props;
onRemovePress(index); onRemovePress(index);
} };
// //
// Render // Render
@@ -84,7 +84,7 @@ class FilterBuilderRowValue extends Component {
name: NAME, name: NAME,
value: [...filterValue, value] value: [...filterValue, value]
}); });
} };
onTagDelete = ({ index }) => { onTagDelete = ({ index }) => {
const { const {
@@ -98,7 +98,7 @@ class FilterBuilderRowValue extends Component {
name: NAME, name: NAME,
value value
}); });
} };
// //
// Render // Render
@@ -47,7 +47,7 @@ class IndexerFilterBuilderRowValueConnector extends Component {
if (!this.props.isPopulated) { if (!this.props.isPopulated) {
this.props.dispatchFetchIndexers(); this.props.dispatchFetchIndexers();
} }
} };
// //
// Render // Render
@@ -55,7 +55,7 @@ class CustomFilter extends Component {
} = this.props; } = this.props;
onEditPress(id); onEditPress(id);
} };
onRemovePress = () => { onRemovePress = () => {
const { const {
@@ -67,7 +67,7 @@ class CustomFilter extends Component {
dispatchDeleteCustomFilter({ id }); dispatchDeleteCustomFilter({ id });
}); });
} };
// //
// Render // Render
@@ -25,14 +25,14 @@ class FilterModal extends Component {
this.setState({ this.setState({
filterBuilder: true filterBuilder: true
}); });
} };
onEditCustomFilter = (id) => { onEditCustomFilter = (id) => {
this.setState({ this.setState({
filterBuilder: true, filterBuilder: true,
id id
}); });
} };
onCancelPress = () => { onCancelPress = () => {
if (this.state.filterBuilder) { if (this.state.filterBuilder) {
@@ -43,7 +43,7 @@ class FilterModal extends Component {
} else { } else {
this.onModalClose(); this.onModalClose();
} }
} };
onModalClose = () => { onModalClose = () => {
this.setState({ this.setState({
@@ -52,7 +52,7 @@ class FilterModal extends Component {
}, () => { }, () => {
this.props.onModalClose(); this.props.onModalClose();
}); });
} };
// //
// Render // Render
@@ -69,7 +69,7 @@ class AppProfileSelectInputConnector extends Component {
onChange = ({ name, value }) => { onChange = ({ name, value }) => {
this.props.onChange({ name, value: parseInt(value) }); this.props.onChange({ name, value: parseInt(value) });
} };
// //
// Render // Render
@@ -35,11 +35,11 @@ class AutoCompleteInput extends Component {
name: this.props.name, name: this.props.name,
value: newValue value: newValue
}); });
} };
onInputBlur = () => { onInputBlur = () => {
this.setState({ suggestions: [] }); this.setState({ suggestions: [] });
} };
onSuggestionsFetchRequested = ({ value }) => { onSuggestionsFetchRequested = ({ value }) => {
const { values } = this.props; const { values } = this.props;
@@ -50,11 +50,11 @@ class AutoCompleteInput extends Component {
}); });
this.setState({ suggestions: filteredValues }); this.setState({ suggestions: filteredValues });
} };
onSuggestionsClearRequested = () => { onSuggestionsClearRequested = () => {
this.setState({ suggestions: [] }); this.setState({ suggestions: [] });
} };
// //
// Render // Render
@@ -49,7 +49,7 @@ class AutoSuggestInput extends Component {
}} }}
</Reference> </Reference>
); );
} };
renderSuggestionsContainer = ({ containerProps, children }) => { renderSuggestionsContainer = ({ containerProps, children }) => {
return ( return (
@@ -90,7 +90,7 @@ class AutoSuggestInput extends Component {
</Popper> </Popper>
</Portal> </Portal>
); );
} };
// //
// Listeners // Listeners
@@ -113,14 +113,14 @@ class AutoSuggestInput extends Component {
data.styles.width = width; data.styles.width = width;
return data; return data;
} };
onInputChange = (event, { newValue }) => { onInputChange = (event, { newValue }) => {
this.props.onChange({ this.props.onChange({
name: this.props.name, name: this.props.name,
value: newValue value: newValue
}); });
} };
onInputKeyDown = (event) => { onInputKeyDown = (event) => {
const { const {
@@ -144,7 +144,7 @@ class AutoSuggestInput extends Component {
}); });
} }
} }
} };
// //
// Render // Render
@@ -39,7 +39,7 @@ class CaptchaInputConnector extends Component {
componentWillUnmount = () => { componentWillUnmount = () => {
this.props.resetCaptcha(); this.props.resetCaptcha();
} };
// //
// Listeners // Listeners
@@ -51,7 +51,7 @@ class CaptchaInputConnector extends Component {
} = this.props; } = this.props;
this.props.refreshCaptcha({ provider, providerData }); this.props.refreshCaptcha({ provider, providerData });
} };
onCaptchaChange = (captchaResponse) => { onCaptchaChange = (captchaResponse) => {
// If the captcha has expired `captchaResponse` will be null. // If the captcha has expired `captchaResponse` will be null.
@@ -68,7 +68,7 @@ class CaptchaInputConnector extends Component {
} = this.props; } = this.props;
this.props.getCaptchaCookie({ provider, providerData, captchaResponse }); this.props.getCaptchaCookie({ provider, providerData, captchaResponse });
} };
// //
// Render // Render
@@ -31,7 +31,7 @@ class CardigannCaptchaInputConnector extends Component {
componentWillUnmount = () => { componentWillUnmount = () => {
this.props.resetCaptcha(); this.props.resetCaptcha();
} };
// //
// Listeners // Listeners
@@ -48,7 +48,7 @@ class CardigannCaptchaInputConnector extends Component {
this.props.resetCaptcha(); this.props.resetCaptcha();
this.props.refreshCaptcha({ provider, providerData }); this.props.refreshCaptcha({ provider, providerData });
} };
// //
// Render // Render
+4 -4
View File
@@ -59,14 +59,14 @@ class CheckInput extends Component {
shiftKey shiftKey
}); });
} }
} };
// //
// Listeners // Listeners
setRef = (ref) => { setRef = (ref) => {
this._checkbox = ref; this._checkbox = ref;
} };
onClick = (event) => { onClick = (event) => {
if (this.props.isDisabled) { if (this.props.isDisabled) {
@@ -78,14 +78,14 @@ class CheckInput extends Component {
event.preventDefault(); event.preventDefault();
this.toggleChecked(checked, shiftKey); this.toggleChecked(checked, shiftKey);
} };
onChange = (event) => { onChange = (event) => {
const checked = event.target.checked; const checked = event.target.checked;
const shiftKey = event.nativeEvent.shiftKey; const shiftKey = event.nativeEvent.shiftKey;
this.toggleChecked(checked, shiftKey); this.toggleChecked(checked, shiftKey);
} };
// //
// Render // Render
+2 -2
View File
@@ -23,7 +23,7 @@ class DeviceInput extends Component {
name, name,
value: [...value, deviceId] value: [...value, deviceId]
}); });
} };
onTagDelete = ({ index }) => { onTagDelete = ({ index }) => {
const { const {
@@ -39,7 +39,7 @@ class DeviceInput extends Component {
name, name,
value: newValue value: newValue
}); });
} };
// //
// Render // Render
@@ -48,11 +48,11 @@ class DeviceInputConnector extends Component {
componentDidMount = () => { componentDidMount = () => {
this._populate(); this._populate();
} };
componentWillUnmount = () => { componentWillUnmount = () => {
this.props.dispatchClearOptions({ section: 'devices' }); this.props.dispatchClearOptions({ section: 'devices' });
} };
// //
// Control // Control
@@ -77,7 +77,7 @@ class DeviceInputConnector extends Component {
onRefreshPress = () => { onRefreshPress = () => {
this._populate(); this._populate();
} };
// //
// Render // Render
@@ -149,7 +149,7 @@ class EnhancedSelectInput extends Component {
} }
return data; return data;
} };
onWindowClick = (event) => { onWindowClick = (event) => {
const button = document.getElementById(this._buttonId); const button = document.getElementById(this._buttonId);
@@ -168,14 +168,14 @@ class EnhancedSelectInput extends Component {
this.setState({ isOpen: false }); this.setState({ isOpen: false });
this._removeListener(); this._removeListener();
} }
} };
onFocus = () => { onFocus = () => {
if (this.state.isOpen) { if (this.state.isOpen) {
this._removeListener(); this._removeListener();
this.setState({ isOpen: false }); this.setState({ isOpen: false });
} }
} };
onBlur = () => { onBlur = () => {
if (!this.props.isEditable) { if (!this.props.isEditable) {
@@ -186,7 +186,7 @@ class EnhancedSelectInput extends Component {
this.setState({ selectedIndex: origIndex }); this.setState({ selectedIndex: origIndex });
} }
} }
} };
onKeyDown = (event) => { onKeyDown = (event) => {
const { const {
@@ -253,7 +253,7 @@ class EnhancedSelectInput extends Component {
if (!_.isEmpty(newState)) { if (!_.isEmpty(newState)) {
this.setState(newState); this.setState(newState);
} }
} };
onPress = () => { onPress = () => {
if (this.state.isOpen) { if (this.state.isOpen) {
@@ -267,7 +267,7 @@ class EnhancedSelectInput extends Component {
} }
this.setState({ isOpen: !this.state.isOpen }); this.setState({ isOpen: !this.state.isOpen });
} };
onSelect = (value) => { onSelect = (value) => {
if (Array.isArray(this.props.value)) { if (Array.isArray(this.props.value)) {
@@ -291,15 +291,15 @@ class EnhancedSelectInput extends Component {
value value
}); });
} }
} };
onMeasure = ({ width }) => { onMeasure = ({ width }) => {
this.setState({ width }); this.setState({ width });
} };
onOptionsModalClose = () => { onOptionsModalClose = () => {
this.setState({ isOpen: false }); this.setState({ isOpen: false });
} };
// //
// Render // Render
@@ -73,7 +73,7 @@ class EnhancedSelectInputConnector extends Component {
componentDidMount = () => { componentDidMount = () => {
this._populate(); this._populate();
} };
componentDidUpdate = (prevProps) => { componentDidUpdate = (prevProps) => {
const prevKey = getProviderDataKey(prevProps.providerData); const prevKey = getProviderDataKey(prevProps.providerData);
@@ -82,11 +82,11 @@ class EnhancedSelectInputConnector extends Component {
if (!_.isEqual(prevKey, nextKey)) { if (!_.isEqual(prevKey, nextKey)) {
this.setState({ refetchRequired: true }); this.setState({ refetchRequired: true });
} }
} };
componentWillUnmount = () => { componentWillUnmount = () => {
this._cleanup(); this._cleanup();
} };
// //
// Listeners // Listeners
@@ -95,7 +95,7 @@ class EnhancedSelectInputConnector extends Component {
if (this.state.refetchRequired) { if (this.state.refetchRequired) {
this._populate(); this._populate();
} }
} };
// //
// Control // Control
@@ -21,11 +21,11 @@ class EnhancedSelectInputOption extends Component {
} = this.props; } = this.props;
onSelect(id); onSelect(id);
} };
onCheckPress = () => { onCheckPress = () => {
// CheckInput requires a handler. Swallow the change event because onPress will already handle it via event propagation. // CheckInput requires a handler. Swallow the change event because onPress will already handle it via event propagation.
} };
// //
// Render // Render
@@ -16,7 +16,6 @@ import FormInputHelpText from './FormInputHelpText';
import IndexerFlagsSelectInputConnector from './IndexerFlagsSelectInputConnector'; import IndexerFlagsSelectInputConnector from './IndexerFlagsSelectInputConnector';
import InfoInput from './InfoInput'; import InfoInput from './InfoInput';
import KeyValueListInput from './KeyValueListInput'; import KeyValueListInput from './KeyValueListInput';
import MovieMonitoredSelectInput from './MovieMonitoredSelectInput';
import NumberInput from './NumberInput'; import NumberInput from './NumberInput';
import OAuthInputConnector from './OAuthInputConnector'; import OAuthInputConnector from './OAuthInputConnector';
import PasswordInput from './PasswordInput'; import PasswordInput from './PasswordInput';
@@ -69,9 +68,6 @@ function getComponent(type) {
case inputTypes.PATH: case inputTypes.PATH:
return PathInputConnector; return PathInputConnector;
case inputTypes.MOVIE_MONITORED_SELECT:
return MovieMonitoredSelectInput;
case inputTypes.INDEXER_FLAGS_SELECT: case inputTypes.INDEXER_FLAGS_SELECT:
return IndexerFlagsSelectInputConnector; return IndexerFlagsSelectInputConnector;
@@ -43,7 +43,7 @@ class IndexerFlagsSelectInputConnector extends Component {
}); });
this.props.onChange({ name, value: indexerFlags }); this.props.onChange({ name, value: indexerFlags });
} };
// //
// Render // Render
@@ -43,7 +43,7 @@ class IndexersSelectInputConnector extends Component {
onChange = ({ name, value }) => { onChange = ({ name, value }) => {
this.props.onChange({ name, value }); this.props.onChange({ name, value });
} };
// //
// Render // Render
@@ -39,7 +39,7 @@ class KeyValueListInput extends Component {
name, name,
value: newValue value: newValue
}); });
} };
onRemoveItem = (index) => { onRemoveItem = (index) => {
const { const {
@@ -55,13 +55,13 @@ class KeyValueListInput extends Component {
name, name,
value: newValue value: newValue
}); });
} };
onFocus = () => { onFocus = () => {
this.setState({ this.setState({
isFocused: true isFocused: true
}); });
} };
onBlur = () => { onBlur = () => {
this.setState({ this.setState({
@@ -88,7 +88,7 @@ class KeyValueListInput extends Component {
value: newValue value: newValue
}); });
} }
} };
// //
// Render // Render
@@ -18,7 +18,7 @@ class KeyValueListInputItem extends Component {
} = this.props; } = this.props;
onChange(index, { key: keyValue, value }); onChange(index, { key: keyValue, value });
} };
onValueChange = ({ value }) => { onValueChange = ({ value }) => {
// TODO: Validate here or validate at a lower level component // TODO: Validate here or validate at a lower level component
@@ -30,7 +30,7 @@ class KeyValueListInputItem extends Component {
} = this.props; } = this.props;
onChange(index, { key: keyValue, value }); onChange(index, { key: keyValue, value });
} };
onRemovePress = () => { onRemovePress = () => {
const { const {
@@ -39,15 +39,15 @@ class KeyValueListInputItem extends Component {
} = this.props; } = this.props;
onRemove(index); onRemove(index);
} };
onFocus = () => { onFocus = () => {
this.props.onFocus(); this.props.onFocus();
} };
onBlur = () => { onBlur = () => {
this.props.onBlur(); this.props.onBlur();
} };
// //
// Render // Render
@@ -1,52 +0,0 @@
import PropTypes from 'prop-types';
import React from 'react';
import SelectInput from './SelectInput';
const monitorTypesOptions = [
{ key: 'true', value: 'True' },
{ key: 'false', value: 'False' }
];
function MovieMonitoredSelectInput(props) {
const values = [...monitorTypesOptions];
const {
includeNoChange,
includeMixed
} = props;
if (includeNoChange) {
values.unshift({
key: 'noChange',
value: 'No Change',
disabled: true
});
}
if (includeMixed) {
values.unshift({
key: 'mixed',
value: '(Mixed)',
disabled: true
});
}
return (
<SelectInput
{...props}
values={values}
/>
);
}
MovieMonitoredSelectInput.propTypes = {
includeNoChange: PropTypes.bool.isRequired,
includeMixed: PropTypes.bool.isRequired
};
MovieMonitoredSelectInput.defaultProps = {
includeNoChange: false,
includeMixed: false
};
export default MovieMonitoredSelectInput;
@@ -42,7 +42,7 @@ class IndexersSelectInputConnector extends Component {
onChange = ({ name, value }) => { onChange = ({ name, value }) => {
this.props.onChange({ name, value }); this.props.onChange({ name, value });
} };
// //
// Render // Render
+3 -3
View File
@@ -59,11 +59,11 @@ class NumberInput extends Component {
value: parseValue(this.props, value) value: parseValue(this.props, value)
}); });
} };
onFocus = () => { onFocus = () => {
this.setState({ isFocused: true }); this.setState({ isFocused: true });
} };
onBlur = () => { onBlur = () => {
const { const {
@@ -88,7 +88,7 @@ class NumberInput extends Component {
name, name,
value: parsedValue value: parsedValue
}); });
} };
// //
// Render // Render
@@ -41,7 +41,7 @@ class OAuthInputConnector extends Component {
componentWillUnmount = () => { componentWillUnmount = () => {
this.props.resetOAuth(); this.props.resetOAuth();
} };
// //
// Listeners // Listeners
@@ -60,7 +60,7 @@ class OAuthInputConnector extends Component {
providerData, providerData,
section section
}); });
} };
// //
// Render // Render
+8 -8
View File
@@ -62,7 +62,7 @@ class PathInput extends Component {
onInputChange = ({ value }) => { onInputChange = ({ value }) => {
this.setState({ value }); this.setState({ value });
} };
onInputKeyDown = (event) => { onInputKeyDown = (event) => {
if (event.key === 'Tab') { if (event.key === 'Tab') {
@@ -80,7 +80,7 @@ class PathInput extends Component {
} }
} }
} }
} };
onInputBlur = () => { onInputBlur = () => {
this.props.onChange({ this.props.onChange({
@@ -89,28 +89,28 @@ class PathInput extends Component {
}); });
this.props.onClearPaths(); this.props.onClearPaths();
} };
onSuggestionsFetchRequested = ({ value }) => { onSuggestionsFetchRequested = ({ value }) => {
this.props.onFetchPaths(value); this.props.onFetchPaths(value);
} };
onSuggestionsClearRequested = () => { onSuggestionsClearRequested = () => {
// Required because props aren't always rendered, but no-op // Required because props aren't always rendered, but no-op
// because we don't want to reset the paths after a path is selected. // because we don't want to reset the paths after a path is selected.
} };
onSuggestionSelected = (event, { suggestionValue }) => { onSuggestionSelected = (event, { suggestionValue }) => {
this.props.onFetchPaths(suggestionValue); this.props.onFetchPaths(suggestionValue);
} };
onFileBrowserOpenPress = () => { onFileBrowserOpenPress = () => {
this.setState({ isFileBrowserModalOpen: true }); this.setState({ isFileBrowserModalOpen: true });
} };
onFileBrowserModalClose = () => { onFileBrowserModalClose = () => {
this.setState({ isFileBrowserModalOpen: false }); this.setState({ isFileBrowserModalOpen: false });
} };
// //
// Render // Render
@@ -47,11 +47,11 @@ class PathInputConnector extends Component {
path, path,
includeFiles includeFiles
}); });
} };
onClearPaths = () => { onClearPaths = () => {
this.props.dispatchClearPaths(); this.props.dispatchClearPaths();
} };
// //
// Render // Render
@@ -53,7 +53,8 @@ function getSelectValues(selectOptions) {
result.push({ result.push({
key: option.value, key: option.value,
value: option.name, value: option.name,
hint: option.hint hint: option.hint,
parentKey: option.parentValue
}); });
return result; return result;
+1 -1
View File
@@ -13,7 +13,7 @@ class SelectInput extends Component {
name: this.props.name, name: this.props.name,
value: event.target.value value: event.target.value
}); });
} };
// //
// Render // Render
+12 -12
View File
@@ -49,7 +49,7 @@ class TagInput extends Component {
_setAutosuggestRef = (ref) => { _setAutosuggestRef = (ref) => {
this._autosuggestRef = ref; this._autosuggestRef = ref;
} };
getSuggestionValue({ name }) { getSuggestionValue({ name }) {
return name; return name;
@@ -57,7 +57,7 @@ class TagInput extends Component {
shouldRenderSuggestions = (value) => { shouldRenderSuggestions = (value) => {
return value.length >= this.props.minQueryLength; return value.length >= this.props.minQueryLength;
} };
renderSuggestion({ name }) { renderSuggestion({ name }) {
return name; return name;
@@ -70,14 +70,14 @@ class TagInput extends Component {
value: '', value: '',
suggestions: [] suggestions: []
}); });
}, 250, { leading: true, trailing: false }) }, 250, { leading: true, trailing: false });
// //
// Listeners // Listeners
onInputContainerPress = () => { onInputContainerPress = () => {
this._autosuggestRef.input.focus(); this._autosuggestRef.input.focus();
} };
onInputChange = (event, { newValue, method }) => { onInputChange = (event, { newValue, method }) => {
const value = _.isObject(newValue) ? newValue.name : newValue; const value = _.isObject(newValue) ? newValue.name : newValue;
@@ -85,7 +85,7 @@ class TagInput extends Component {
if (method === 'type') { if (method === 'type') {
this.setState({ value }); this.setState({ value });
} }
} };
onInputKeyDown = (event) => { onInputKeyDown = (event) => {
const { const {
@@ -125,11 +125,11 @@ class TagInput extends Component {
event.preventDefault(); event.preventDefault();
} }
} }
} };
onInputFocus = () => { onInputFocus = () => {
this.setState({ isFocused: true }); this.setState({ isFocused: true });
} };
onInputBlur = () => { onInputBlur = () => {
this.setState({ isFocused: false }); this.setState({ isFocused: false });
@@ -153,7 +153,7 @@ class TagInput extends Component {
if (tag) { if (tag) {
this.addTag(tag); this.addTag(tag);
} }
} };
onSuggestionsFetchRequested = ({ value }) => { onSuggestionsFetchRequested = ({ value }) => {
const lowerCaseValue = value.toLowerCase(); const lowerCaseValue = value.toLowerCase();
@@ -170,16 +170,16 @@ class TagInput extends Component {
}); });
this.setState({ suggestions }); this.setState({ suggestions });
} };
onSuggestionsClearRequested = () => { onSuggestionsClearRequested = () => {
// Required because props aren't always rendered, but no-op // Required because props aren't always rendered, but no-op
// because we don't want to reset the paths after a path is selected. // because we don't want to reset the paths after a path is selected.
} };
onSuggestionSelected = (event, { suggestion }) => { onSuggestionSelected = (event, { suggestion }) => {
this.addTag(suggestion); this.addTag(suggestion);
} };
// //
// Render // Render
@@ -204,7 +204,7 @@ class TagInput extends Component {
onInputContainerPress={this.onInputContainerPress} onInputContainerPress={this.onInputContainerPress}
/> />
); );
} };
render() { render() {
const { const {
@@ -101,7 +101,7 @@ class TagInputConnector extends Component {
newValue.push(tag.id); newValue.push(tag.id);
this.props.onChange({ name, value: newValue }); this.props.onChange({ name, value: newValue });
} };
onTagDelete = ({ index }) => { onTagDelete = ({ index }) => {
const { const {
@@ -116,7 +116,7 @@ class TagInputConnector extends Component {
name, name,
value: newValue value: newValue
}); });
} };
onTagCreated = (tag) => { onTagCreated = (tag) => {
const { const {
@@ -128,7 +128,7 @@ class TagInputConnector extends Component {
newValue.push(tag.id); newValue.push(tag.id);
this.props.onChange({ name, value: newValue }); this.props.onChange({ name, value: newValue });
} };
// //
// Render // Render
@@ -19,7 +19,7 @@ class TagInputInput extends Component {
} }
onInputContainerPress(); onInputContainerPress();
} };
render() { render() {
const { const {
+1 -1
View File
@@ -22,7 +22,7 @@ class TagInputTag extends Component {
index, index,
id: tag.id id: tag.id
}); });
} };
// //
// Render // Render
@@ -60,7 +60,7 @@ class TagSelectInputConnector extends Component {
} }
this.props.onChange({ name, value: newValue }); this.props.onChange({ name, value: newValue });
} };
onTagDelete = ({ index }) => { onTagDelete = ({ index }) => {
const { const {
@@ -75,7 +75,7 @@ class TagSelectInputConnector extends Component {
name, name,
value: newValue value: newValue
}); });
} };
// //
// Render // Render
+7 -7
View File
@@ -35,7 +35,7 @@ class TextArea extends Component {
setInputRef = (ref) => { setInputRef = (ref) => {
this._input = ref; this._input = ref;
} };
selectionChange() { selectionChange() {
if (this._selectionTimeout) { if (this._selectionTimeout) {
@@ -75,7 +75,7 @@ class TextArea extends Component {
}; };
onChange(payload); onChange(payload);
} };
onFocus = (event) => { onFocus = (event) => {
if (this.props.onFocus) { if (this.props.onFocus) {
@@ -83,19 +83,19 @@ class TextArea extends Component {
} }
this.selectionChange(); this.selectionChange();
} };
onKeyUp = () => { onKeyUp = () => {
this.selectionChange(); this.selectionChange();
} };
onMouseDown = () => { onMouseDown = () => {
this._isMouseTarget = true; this._isMouseTarget = true;
} };
onMouseUp = () => { onMouseUp = () => {
this.selectionChange(); this.selectionChange();
} };
onDocumentMouseUp = () => { onDocumentMouseUp = () => {
if (this._isMouseTarget) { if (this._isMouseTarget) {
@@ -103,7 +103,7 @@ class TextArea extends Component {
} }
this._isMouseTarget = false; this._isMouseTarget = false;
} };
// //
// Render // Render
+7 -7
View File
@@ -35,7 +35,7 @@ class TextInput extends Component {
setInputRef = (ref) => { setInputRef = (ref) => {
this._input = ref; this._input = ref;
} };
selectionChange() { selectionChange() {
if (this._selectionTimeout) { if (this._selectionTimeout) {
@@ -82,7 +82,7 @@ class TextInput extends Component {
} }
onChange(payload); onChange(payload);
} };
onFocus = (event) => { onFocus = (event) => {
if (this.props.onFocus) { if (this.props.onFocus) {
@@ -90,19 +90,19 @@ class TextInput extends Component {
} }
this.selectionChange(); this.selectionChange();
} };
onKeyUp = () => { onKeyUp = () => {
this.selectionChange(); this.selectionChange();
} };
onMouseDown = () => { onMouseDown = () => {
this._isMouseTarget = true; this._isMouseTarget = true;
} };
onMouseUp = () => { onMouseUp = () => {
this.selectionChange(); this.selectionChange();
} };
onDocumentMouseUp = () => { onDocumentMouseUp = () => {
if (this._isMouseTarget) { if (this._isMouseTarget) {
@@ -110,7 +110,7 @@ class TextInput extends Component {
} }
this._isMouseTarget = false; this._isMouseTarget = false;
} };
// //
// Render // Render
@@ -53,7 +53,7 @@ class TextTagInputConnector extends Component {
}); });
onChange({ name, value: newValue.join(',') }); onChange({ name, value: newValue.join(',') });
} };
onTagDelete = ({ index }) => { onTagDelete = ({ index }) => {
const { const {
@@ -69,7 +69,7 @@ class TextTagInputConnector extends Component {
name, name,
value: newValue.join(',') value: newValue.join(',')
}); });
} };
// //
// Render // Render
@@ -63,7 +63,7 @@ class ClipboardButton extends Component {
showSuccess: false, showSuccess: false,
showError: false showError: false
}); });
} };
// //
// Listeners // Listeners
@@ -72,13 +72,13 @@ class ClipboardButton extends Component {
this.setState({ this.setState({
showSuccess: true showSuccess: true
}); });
} };
onError = () => { onError = () => {
this.setState({ this.setState({
showError: true showError: true
}); });
} };
// //
// Render // Render
+1 -1
View File
@@ -18,7 +18,7 @@ class Link extends Component {
if (!isDisabled && onPress) { if (!isDisabled && onPress) {
onPress(event); onPress(event);
} }
} };
// //
// Render // Render
@@ -90,7 +90,7 @@ class SpinnerErrorButton extends Component {
hasWarning: false, hasWarning: false,
hasError: false hasError: false
}); });
} };
// //
// Render // Render
+1 -1
View File
@@ -17,7 +17,7 @@ class Measure extends Component {
onMeasure = _.debounce((payload) => { onMeasure = _.debounce((payload) => {
this.props.onMeasure(payload); this.props.onMeasure(payload);
}, 250, { leading: true, trailing: false }) }, 250, { leading: true, trailing: false });
// //
// Render // Render
+2 -2
View File
@@ -25,11 +25,11 @@ class FilterMenu extends Component {
onCustomFiltersPress = () => { onCustomFiltersPress = () => {
this.setState({ isFilterModalOpen: true }); this.setState({ isFilterModalOpen: true });
} };
onFiltersModalClose = () => { onFiltersModalClose = () => {
this.setState({ isFilterModalOpen: false }); this.setState({ isFilterModalOpen: false });
} };
// //
// Render // Render
@@ -14,7 +14,7 @@ class FilterMenuItem extends Component {
} = this.props; } = this.props;
onPress(filterKey); onPress(filterKey);
} };
// //
// Render // Render
+5 -5
View File
@@ -124,7 +124,7 @@ class Menu extends Component {
this.setState({ isMenuOpen: false }); this.setState({ isMenuOpen: false });
this._removeListener(); this._removeListener();
} }
} };
onTouchStart = (event) => { onTouchStart = (event) => {
const menuButton = document.getElementById(this._menuButtonId); const menuButton = document.getElementById(this._menuButtonId);
@@ -148,17 +148,17 @@ class Menu extends Component {
this.setState({ isMenuOpen: false }); this.setState({ isMenuOpen: false });
this._removeListener(); this._removeListener();
} }
} };
onWindowResize = () => { onWindowResize = () => {
this.setMaxHeight(); this.setMaxHeight();
} };
onWindowScroll = (event) => { onWindowScroll = (event) => {
if (this.state.isMenuOpen) { if (this.state.isMenuOpen) {
this.setMaxHeight(); this.setMaxHeight();
} }
} };
onMenuButtonPress = () => { onMenuButtonPress = () => {
const state = { const state = {
@@ -173,7 +173,7 @@ class Menu extends Component {
} }
this.setState(state); this.setState(state);
} };
// //
// Render // Render
@@ -14,7 +14,7 @@ class SearchMenuItem extends Component {
} = this.props; } = this.props;
onPress(name); onPress(name);
} };
// //
// Render // Render
@@ -17,7 +17,7 @@ class SelectedMenuItem extends Component {
} = this.props; } = this.props;
onPress(name); onPress(name);
} };
// //
// Render // Render
+4 -4
View File
@@ -66,7 +66,7 @@ class Modal extends Component {
_setBackgroundRef = (ref) => { _setBackgroundRef = (ref) => {
this._backgroundRef = ref; this._backgroundRef = ref;
} };
_openModal() { _openModal() {
openModals.push(this._modalId); openModals.push(this._modalId);
@@ -131,7 +131,7 @@ class Modal extends Component {
onBackdropBeginPress = (event) => { onBackdropBeginPress = (event) => {
this._isBackdropPressed = this._isBackdropTarget(event); this._isBackdropPressed = this._isBackdropTarget(event);
} };
onBackdropEndPress = (event) => { onBackdropEndPress = (event) => {
const { const {
@@ -148,7 +148,7 @@ class Modal extends Component {
} }
this._isBackdropPressed = false; this._isBackdropPressed = false;
} };
onKeyDown = (event) => { onKeyDown = (event) => {
const keyCode = event.keyCode; const keyCode = event.keyCode;
@@ -161,7 +161,7 @@ class Modal extends Component {
this.props.onModalClose(); this.props.onModalClose();
} }
} }
} };
// //
// Render // Render
@@ -36,12 +36,12 @@ class IndexerSearchInput extends Component {
setAutosuggestRef = (ref) => { setAutosuggestRef = (ref) => {
this._autosuggest = ref; this._autosuggest = ref;
} };
focusInput = (event) => { focusInput = (event) => {
event.preventDefault(); event.preventDefault();
this._autosuggest.input.focus(); this._autosuggest.input.focus();
} };
getSectionSuggestions(section) { getSectionSuggestions(section) {
return section.suggestions; return section.suggestions;
@@ -102,7 +102,7 @@ class IndexerSearchInput extends Component {
} }
this.setState({ value: newValue }); this.setState({ value: newValue });
} };
onKeyDown = (event) => { onKeyDown = (event) => {
if (event.shiftKey || event.altKey || event.ctrlKey) { if (event.shiftKey || event.altKey || event.ctrlKey) {
@@ -137,31 +137,31 @@ class IndexerSearchInput extends Component {
this._autosuggest.input.blur(); this._autosuggest.input.blur();
this.reset(); this.reset();
} };
onBlur = () => { onBlur = () => {
this.reset(); this.reset();
} };
onSuggestionsClearRequested = () => { onSuggestionsClearRequested = () => {
this.setState({ this.setState({
suggestions: [], suggestions: [],
loading: false loading: false
}); });
} };
onSuggestionsFetchRequested = () => { onSuggestionsFetchRequested = () => {
this.setState({ this.setState({
suggestions: [], suggestions: [],
loading: false loading: false
}); });
} };
onSuggestionSelected = (event, { suggestion }) => { onSuggestionSelected = (event, { suggestion }) => {
if (suggestion.type === ADD_NEW_TYPE) { if (suggestion.type === ADD_NEW_TYPE) {
this.props.onGoToAddNewMovie(this.state.value); this.props.onGoToAddNewMovie(this.state.value);
} }
} };
// //
// Render // Render
@@ -60,7 +60,7 @@ function createMapStateToProps() {
function createMapDispatchToProps(dispatch, props) { function createMapDispatchToProps(dispatch, props) {
return { return {
onGoToAddNewMovie(query) { onGoToAddNewMovie(query) {
dispatch(setSearchDefault({ searchQuery: query, searchIndexerIds: [-1, -2] })); dispatch(setSearchDefault({ searchQuery: query }));
dispatch(push(`${window.Prowlarr.urlBase}/search`)); dispatch(push(`${window.Prowlarr.urlBase}/search`));
} }
}; };
@@ -32,14 +32,14 @@ class PageHeader extends Component {
onOpenKeyboardShortcutsModal = () => { onOpenKeyboardShortcutsModal = () => {
this.setState({ isKeyboardShortcutsModalOpen: true }); this.setState({ isKeyboardShortcutsModalOpen: true });
} };
// //
// Listeners // Listeners
onKeyboardShortcutsModalClose = () => { onKeyboardShortcutsModalClose = () => {
this.setState({ isKeyboardShortcutsModalOpen: false }); this.setState({ isKeyboardShortcutsModalOpen: false });
} };
// //
// Render // Render
@@ -28,11 +28,11 @@ class PageHeaderActionsMenuConnector extends Component {
onRestartPress = () => { onRestartPress = () => {
this.props.restart(); this.props.restart();
} };
onShutdownPress = () => { onShutdownPress = () => {
this.props.shutdown(); this.props.shutdown();
} };
// //
// Render // Render
+3 -3
View File
@@ -54,15 +54,15 @@ class Page extends Component {
width: window.innerWidth, width: window.innerWidth,
height: window.innerHeight height: window.innerHeight
}); });
} };
onUpdatedModalClose = () => { onUpdatedModalClose = () => {
this.setState({ isUpdatedModalOpen: false }); this.setState({ isUpdatedModalOpen: false });
} };
onConnectionLostModalClose = () => { onConnectionLostModalClose = () => {
this.setState({ isConnectionLostModalOpen: false }); this.setState({ isConnectionLostModalOpen: false });
} };
// //
// Render // Render
@@ -232,7 +232,7 @@ class PageConnector extends Component {
onSidebarToggle = () => { onSidebarToggle = () => {
this.props.onSidebarVisibleChange(!this.props.isSidebarVisible); this.props.onSidebarVisibleChange(!this.props.isSidebarVisible);
} };
// //
// Render // Render
@@ -27,7 +27,7 @@ class PageContentBody extends Component {
if (this.props.onScroll && !isLocked()) { if (this.props.onScroll && !isLocked()) {
onScroll(props); onScroll(props);
} }
} };
// //
// Render // Render
+1 -1
View File
@@ -101,7 +101,7 @@ class PageJumpBar extends Component {
onMeasure = ({ height }) => { onMeasure = ({ height }) => {
this.setState({ height }); this.setState({ height });
} };
// //
// Render // Render
@@ -15,7 +15,7 @@ class PageJumpBarItem extends Component {
} = this.props; } = this.props;
onItemPress(label); onItemPress(label);
} };
// //
// Render // Render
@@ -13,20 +13,8 @@ function getIconName(name) {
return icons.BACKUP; return icons.BACKUP;
case 'CheckHealth': case 'CheckHealth':
return icons.HEALTH; return icons.HEALTH;
case 'EpisodeSearch':
return icons.SEARCH;
case 'Housekeeping': case 'Housekeeping':
return icons.HOUSEKEEPING; return icons.HOUSEKEEPING;
case 'RefreshMovie':
return icons.REFRESH;
case 'RssSync':
return icons.RSS;
case 'SeasonSearch':
return icons.SEARCH;
case 'MovieSearch':
return icons.SEARCH;
case 'UpdateSceneMapping':
return icons.REFRESH;
default: default:
return icons.SPINNER; return icons.SPINNER;
} }
@@ -35,11 +35,11 @@ class MessageConnector extends Component {
if (hideAfter) { if (hideAfter) {
this._hideTimeoutId = setTimeout(this.hideMessage, hideAfter * 1000); this._hideTimeoutId = setTimeout(this.hideMessage, hideAfter * 1000);
} }
} };
hideMessage = () => { hideMessage = () => {
this.props.hideMessage({ id: this.props.id }); this.props.hideMessage({ id: this.props.id });
} };
// //
// Render // Render
@@ -234,7 +234,7 @@ class PageSidebar extends Component {
_setSidebarRef = (ref) => { _setSidebarRef = (ref) => {
this._sidebarRef = ref; this._sidebarRef = ref;
} };
_setSidebarTransform(isSidebarVisible, transition, callback) { _setSidebarTransform(isSidebarVisible, transition, callback) {
this.setState({ this.setState({
@@ -263,11 +263,11 @@ class PageSidebar extends Component {
event.stopPropagation(); event.stopPropagation();
this.props.onSidebarVisibleChange(false); this.props.onSidebarVisibleChange(false);
} }
} };
onWindowScroll = () => { onWindowScroll = () => {
this.setState(getPositioning()); this.setState(getPositioning());
} };
onTouchStart = (event) => { onTouchStart = (event) => {
const touches = event.touches; const touches = event.touches;
@@ -287,7 +287,7 @@ class PageSidebar extends Component {
this._touchStartX = touchStartX; this._touchStartX = touchStartX;
this._touchStartY = touchStartY; this._touchStartY = touchStartY;
} };
onTouchMove = (event) => { onTouchMove = (event) => {
const touches = event.touches; const touches = event.touches;
@@ -324,7 +324,7 @@ class PageSidebar extends Component {
transition: 'none', transition: 'none',
transform transform
}); });
} };
onTouchEnd = (event) => { onTouchEnd = (event) => {
const touches = event.changedTouches; const touches = event.changedTouches;
@@ -344,16 +344,16 @@ class PageSidebar extends Component {
this._touchStartX = null; this._touchStartX = null;
this._touchStartY = null; this._touchStartY = null;
} };
onTouchCancel = (event) => { onTouchCancel = (event) => {
this._touchStartX = null; this._touchStartX = null;
this._touchStartY = null; this._touchStartY = null;
} };
onItemPress = () => { onItemPress = () => {
this.props.onSidebarVisibleChange(false); this.props.onSidebarVisibleChange(false);
} };
// //
// Render // Render
@@ -21,7 +21,7 @@ class PageSidebarItem extends Component {
if (isChildItem || !isParentItem) { if (isChildItem || !isParentItem) {
onPress(); onPress();
} }
} };
// //
// Render // Render
@@ -108,7 +108,7 @@ class PageToolbarSection extends Component {
isMeasured: true, isMeasured: true,
width width
}); });
} };
// //
// Render // Render
@@ -41,7 +41,7 @@ class OverlayScroller extends Component {
if (ref) { if (ref) {
this.props.registerScroller(ref.view); this.props.registerScroller(ref.view);
} }
} };
_renderThumb = (props) => { _renderThumb = (props) => {
return ( return (
@@ -50,7 +50,7 @@ class OverlayScroller extends Component {
{...props} {...props}
/> />
); );
} };
_renderTrackHorizontal = ({ style, props }) => { _renderTrackHorizontal = ({ style, props }) => {
const finalStyle = { const finalStyle = {
@@ -69,7 +69,7 @@ class OverlayScroller extends Component {
{...props} {...props}
/> />
); );
} };
_renderTrackVertical = ({ style, props }) => { _renderTrackVertical = ({ style, props }) => {
const finalStyle = { const finalStyle = {
@@ -88,7 +88,7 @@ class OverlayScroller extends Component {
{...props} {...props}
/> />
); );
} };
_renderView = (props) => { _renderView = (props) => {
return ( return (
@@ -97,18 +97,18 @@ class OverlayScroller extends Component {
{...props} {...props}
/> />
); );
} };
// //
// Listers // Listers
onScrollStart = () => { onScrollStart = () => {
this._isScrolling = true; this._isScrolling = true;
} };
onScrollStop = () => { onScrollStop = () => {
this._isScrolling = false; this._isScrolling = false;
} };
onScroll = (event) => { onScroll = (event) => {
const { const {
@@ -122,7 +122,7 @@ class OverlayScroller extends Component {
if (onScroll) { if (onScroll) {
onScroll({ scrollTop, scrollLeft }); onScroll({ scrollTop, scrollLeft });
} }
} };
// //
// Render // Render
+1 -1
View File
@@ -38,7 +38,7 @@ class Scroller extends Component {
this._scroller = ref; this._scroller = ref;
this.props.registerScroller(ref); this.props.registerScroller(ref);
} };
// //
// Render // Render
+16 -16
View File
@@ -139,7 +139,7 @@ class SignalRConnector extends Component {
} }
console.error(`signalR: Unable to find handler for ${name}`); console.error(`signalR: Unable to find handler for ${name}`);
} };
handleCommand = (body) => { handleCommand = (body) => {
if (body.action === 'sync') { if (body.action === 'sync') {
@@ -158,36 +158,36 @@ class SignalRConnector extends Component {
} else { } else {
this.props.dispatchUpdateCommand(resource); this.props.dispatchUpdateCommand(resource);
} }
} };
handleHealth = () => { handleHealth = () => {
this.props.dispatchFetchHealth(); this.props.dispatchFetchHealth();
} };
handleIndexerstatus = () => { handleIndexerstatus = () => {
this.props.dispatchFetchIndexerStatus(); this.props.dispatchFetchIndexerStatus();
} };
handleMovie = (body) => { handleIndexer = (body) => {
const action = body.action; const action = body.action;
const section = 'movies'; const section = 'indexers';
if (action === 'updated') { if (action === 'updated') {
this.props.dispatchUpdateItem({ section, ...body.resource }); this.props.dispatchUpdateItem({ section, ...body.resource });
} else if (action === 'deleted') { } else if (action === 'deleted') {
this.props.dispatchRemoveItem({ section, id: body.resource.id }); this.props.dispatchRemoveItem({ section, id: body.resource.id });
} }
} };
handleVersion = (body) => { handleVersion = (body) => {
const version = body.version; const version = body.version;
this.props.dispatchSetVersion({ version }); this.props.dispatchSetVersion({ version });
} };
handleSystemTask = () => { handleSystemTask = () => {
this.props.dispatchFetchCommands(); this.props.dispatchFetchCommands();
} };
handleTag = (body) => { handleTag = (body) => {
if (body.action === 'sync') { if (body.action === 'sync') {
@@ -195,7 +195,7 @@ class SignalRConnector extends Component {
this.props.dispatchFetchTagDetails(); this.props.dispatchFetchTagDetails();
return; return;
} }
} };
// //
// Listeners // Listeners
@@ -210,7 +210,7 @@ class SignalRConnector extends Component {
isDisconnected: false, isDisconnected: false,
isRestarting: false isRestarting: false
}); });
} };
onStart = () => { onStart = () => {
console.debug('[signalR] connected'); console.debug('[signalR] connected');
@@ -221,11 +221,11 @@ class SignalRConnector extends Component {
isDisconnected: false, isDisconnected: false,
isRestarting: false isRestarting: false
}); });
} };
onReconnecting = () => { onReconnecting = () => {
this.props.dispatchSetAppValue({ isReconnecting: true }); this.props.dispatchSetAppValue({ isReconnecting: true });
} };
onReconnected = () => { onReconnected = () => {
@@ -247,17 +247,17 @@ class SignalRConnector extends Component {
dispatchFetchIndexers(); dispatchFetchIndexers();
dispatchFetchCommands(); dispatchFetchCommands();
repopulatePage(); repopulatePage();
} };
onClose = () => { onClose = () => {
console.debug('[signalR] connection closed'); console.debug('[signalR] connection closed');
} };
onReceiveMessage = (message) => { onReceiveMessage = (message) => {
console.debug('[signalR] received', message.name, message.body); console.debug('[signalR] received', message.name, message.body);
this.handleMessage(message); this.handleMessage(message);
} };
// //
// Render // Render
@@ -38,7 +38,7 @@ class TableSelectCell extends Component {
} = this.props; } = this.props;
onSelectedChange({ id, value, shiftKey }); onSelectedChange({ id, value, shiftKey });
} };
// //
// Render // Render
@@ -35,7 +35,7 @@ class VirtualTableSelectCell extends Component {
} = this.props; } = this.props;
onSelectedChange({ id, value, shiftKey }); onSelectedChange({ id, value, shiftKey });
} };
// //
// Render // Render
@@ -21,7 +21,7 @@ class TableHeaderCell extends Component {
} else { } else {
this.props.onSortPress(name); this.props.onSortPress(name);
} }
} };
// //
// Render // Render
@@ -62,7 +62,7 @@ class TableOptionsModal extends Component {
pageSize: value, pageSize: value,
pageSizeError pageSizeError
}); });
} };
onVisibleChange = ({ name, value }) => { onVisibleChange = ({ name, value }) => {
const columns = _.cloneDeep(this.props.columns); const columns = _.cloneDeep(this.props.columns);
@@ -71,7 +71,7 @@ class TableOptionsModal extends Component {
column.isVisible = value; column.isVisible = value;
this.props.onTableOptionChange({ columns }); this.props.onTableOptionChange({ columns });
} };
onColumnDragMove = (dragIndex, dropIndex) => { onColumnDragMove = (dragIndex, dropIndex) => {
if (this.state.dragIndex !== dragIndex || this.state.dropIndex !== dropIndex) { if (this.state.dragIndex !== dragIndex || this.state.dropIndex !== dropIndex) {
@@ -80,7 +80,7 @@ class TableOptionsModal extends Component {
dropIndex dropIndex
}); });
} }
} };
onColumnDragEnd = ({ id }, didDrop) => { onColumnDragEnd = ({ id }, didDrop) => {
const { const {
@@ -100,7 +100,7 @@ class TableOptionsModal extends Component {
dragIndex: null, dragIndex: null,
dropIndex: null dropIndex: null
}); });
} };
// //
// Render // Render
@@ -20,11 +20,11 @@ class TableOptionsModalWrapper extends Component {
onTableOptionsPress = () => { onTableOptionsPress = () => {
this.setState({ isTableOptionsModalOpen: true }); this.setState({ isTableOptionsModalOpen: true });
} };
onTableOptionsModalClose = () => { onTableOptionsModalClose = () => {
this.setState({ isTableOptionsModalOpen: false }); this.setState({ isTableOptionsModalOpen: false });
} };
// //
// Render // Render
+3 -3
View File
@@ -26,16 +26,16 @@ class TablePager extends Component {
onOpenPageSelectClick = () => { onOpenPageSelectClick = () => {
this.setState({ isShowingPageSelect: true }); this.setState({ isShowingPageSelect: true });
} };
onPageSelect = ({ value: page }) => { onPageSelect = ({ value: page }) => {
this.setState({ isShowingPageSelect: false }); this.setState({ isShowingPageSelect: false });
this.props.onPageSelect(parseInt(page)); this.props.onPageSelect(parseInt(page));
} };
onPageSelectBlur = () => { onPageSelectBlur = () => {
this.setState({ isShowingPageSelect: false }); this.setState({ isShowingPageSelect: false });
} };
// //
// Render // Render
@@ -75,7 +75,7 @@ class VirtualTable extends Component {
setGridRef = (ref) => { setGridRef = (ref) => {
this._grid = ref; this._grid = ref;
} };
// //
// Listeners // Listeners
@@ -84,7 +84,7 @@ class VirtualTable extends Component {
this.setState({ this.setState({
width width
}); });
} };
// //
// Render // Render
@@ -38,7 +38,7 @@ class VirtualTableHeaderCell extends Component {
} else { } else {
this.props.onSortPress(name); this.props.onSortPress(name);
} }
} };
// //
// Render // Render
+5 -5
View File
@@ -80,20 +80,20 @@ class Tooltip extends Component {
} }
return data; return data;
} };
// //
// Listeners // Listeners
onMeasure = ({ width }) => { onMeasure = ({ width }) => {
this.setState({ width }); this.setState({ width });
} };
onClick = () => { onClick = () => {
if (isMobileUtil()) { if (isMobileUtil()) {
this.setState({ isOpen: !this.state.isOpen }); this.setState({ isOpen: !this.state.isOpen });
} }
} };
onMouseEnter = () => { onMouseEnter = () => {
if (this._closeTimeout) { if (this._closeTimeout) {
@@ -101,13 +101,13 @@ class Tooltip extends Component {
} }
this.setState({ isOpen: true }); this.setState({ isOpen: true });
} };
onMouseLeave = () => { onMouseLeave = () => {
this._closeTimeout = setTimeout(() => { this._closeTimeout = setTimeout(() => {
this.setState({ isOpen: false }); this.setState({ isOpen: false });
}, 100); }, 100);
} };
// //
// Render // Render
+4 -4
View File
@@ -64,12 +64,12 @@ function keyboardShortcuts(WrappedComponent) {
bindShortcut = (key, callback, options = {}) => { bindShortcut = (key, callback, options = {}) => {
this._mousetrap.bind(key, callback); this._mousetrap.bind(key, callback);
this._mousetrapBindings[key] = options; this._mousetrapBindings[key] = options;
} };
unbindShortcut = (key) => { unbindShortcut = (key) => {
delete this._mousetrapBindings[key]; delete this._mousetrapBindings[key];
this._mousetrap.unbind(key); this._mousetrap.unbind(key);
} };
unbindAllShortcuts = () => { unbindAllShortcuts = () => {
const keys = Object.keys(this._mousetrapBindings); const keys = Object.keys(this._mousetrapBindings);
@@ -83,7 +83,7 @@ function keyboardShortcuts(WrappedComponent) {
}); });
this._mousetrapBindings = {}; this._mousetrapBindings = {};
} };
stopCallback = (event, element, combo) => { stopCallback = (event, element, combo) => {
const binding = this._mousetrapBindings[combo]; const binding = this._mousetrapBindings[combo];
@@ -98,7 +98,7 @@ function keyboardShortcuts(WrappedComponent) {
element.tagName === 'TEXTAREA' || element.tagName === 'TEXTAREA' ||
(element.contentEditable && element.contentEditable === 'true') (element.contentEditable && element.contentEditable === 'true')
); );
} };
// //
// Render // Render
+8
View File
@@ -22,10 +22,12 @@ import {
import { import {
faArrowCircleLeft as fasArrowCircleLeft, faArrowCircleLeft as fasArrowCircleLeft,
faArrowCircleRight as fasArrowCircleRight, faArrowCircleRight as fasArrowCircleRight,
faAsterisk as fasAsterisk,
faBackward as fasBackward, faBackward as fasBackward,
faBan as fasBan, faBan as fasBan,
faBars as fasBars, faBars as fasBars,
faBolt as fasBolt, faBolt as fasBolt,
faBook as fasBook,
faBookmark as fasBookmark, faBookmark as fasBookmark,
faBookReader as fasBookReader, faBookReader as fasBookReader,
faBroadcastTower as fasBroadcastTower, faBroadcastTower as fasBroadcastTower,
@@ -74,6 +76,7 @@ import {
faLock as fasLock, faLock as fasLock,
faMedkit as fasMedkit, faMedkit as fasMedkit,
faMinus as fasMinus, faMinus as fasMinus,
faMusic as fasMusic,
faPause as fasPause, faPause as fasPause,
faPlay as fasPlay, faPlay as fasPlay,
faPlus as fasPlus, faPlus as fasPlus,
@@ -104,6 +107,7 @@ import {
faTimes as fasTimes, faTimes as fasTimes,
faTimesCircle as fasTimesCircle, faTimesCircle as fasTimesCircle,
faTrashAlt as fasTrashAlt, faTrashAlt as fasTrashAlt,
faTv as fasTv,
faUser as fasUser, faUser as fasUser,
faUserPlus as fasUserPlus, faUserPlus as fasUserPlus,
faVial as fasVial, faVial as fasVial,
@@ -121,7 +125,9 @@ export const ADVANCED_SETTINGS = fasCog;
export const ANNOUNCED = fasBullhorn; export const ANNOUNCED = fasBullhorn;
export const ARROW_LEFT = fasArrowCircleLeft; export const ARROW_LEFT = fasArrowCircleLeft;
export const ARROW_RIGHT = fasArrowCircleRight; export const ARROW_RIGHT = fasArrowCircleRight;
export const AUDIO = fasMusic;
export const BACKUP = farFileArchive; export const BACKUP = farFileArchive;
export const BOOK = fasBook;
export const BUG = fasBug; export const BUG = fasBug;
export const CALENDAR = fasCalendarAlt; export const CALENDAR = fasCalendarAlt;
export const CALENDAR_O = farCalendar; export const CALENDAR_O = farCalendar;
@@ -158,6 +164,7 @@ export const FILTER = fasFilter;
export const FLAG = fasFlag; export const FLAG = fasFlag;
export const FOLDER = farFolder; export const FOLDER = farFolder;
export const FOLDER_OPEN = fasFolderOpen; export const FOLDER_OPEN = fasFolderOpen;
export const FOOTNOTE = fasAsterisk;
export const GENRE = fasTheaterMasks; export const GENRE = fasTheaterMasks;
export const GROUP = farObjectGroup; export const GROUP = farObjectGroup;
export const HEALTH = fasMedkit; export const HEALTH = fasMedkit;
@@ -220,6 +227,7 @@ export const TAGS = fasTags;
export const TBA = fasQuestionCircle; export const TBA = fasQuestionCircle;
export const TEST = fasVial; export const TEST = fasVial;
export const TRANSLATE = fasLanguage; export const TRANSLATE = fasLanguage;
export const TV = fasTv;
export const UNGROUP = farObjectUngroup; export const UNGROUP = farObjectUngroup;
export const UNKNOWN = fasQuestion; export const UNKNOWN = fasQuestion;
export const UNMONITORED = farBookmark; export const UNMONITORED = farBookmark;
+21 -2
View File
@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import DescriptionList from 'Components/DescriptionList/DescriptionList'; import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem'; import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import Link from 'Components/Link/Link';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
import styles from './HistoryDetails.css'; import styles from './HistoryDetails.css';
@@ -17,7 +18,8 @@ function HistoryDetails(props) {
query, query,
queryResults, queryResults,
categories, categories,
source source,
url
} = data; } = data;
return ( return (
@@ -59,6 +61,14 @@ function HistoryDetails(props) {
data={source} data={source}
/> />
} }
{
!!data &&
<DescriptionListItem
title={'Url'}
data={url ? <Link to={url}>{translate('Link')}</Link> : '-'}
/>
}
</DescriptionList> </DescriptionList>
); );
} }
@@ -66,7 +76,8 @@ function HistoryDetails(props) {
if (eventType === 'releaseGrabbed') { if (eventType === 'releaseGrabbed') {
const { const {
source, source,
title title,
url
} = data; } = data;
return ( return (
@@ -94,6 +105,14 @@ function HistoryDetails(props) {
data={title ? title : '-'} data={title ? title : '-'}
/> />
} }
{
!!data &&
<DescriptionListItem
title={'Url'}
data={url ? <Link to={url}>{translate('Link')}</Link> : '-'}
/>
}
</DescriptionList> </DescriptionList>
); );
} }
+3 -3
View File
@@ -35,16 +35,16 @@ class History extends Component {
onClearHistoryPress = () => { onClearHistoryPress = () => {
this.setState({ isClearHistoryModalOpen: true }); this.setState({ isClearHistoryModalOpen: true });
} };
onClearHistoryModalClose = () => { onClearHistoryModalClose = () => {
this.setState({ isClearHistoryModalOpen: false }); this.setState({ isClearHistoryModalOpen: false });
} };
onConfirmClearHistory = () => { onConfirmClearHistory = () => {
this.setState({ isClearHistoryModalOpen: false }); this.setState({ isClearHistoryModalOpen: false });
this.props.onClearHistoryPress(); this.props.onClearHistoryPress();
} };
// //
// Render // Render
+10 -10
View File
@@ -69,42 +69,42 @@ class HistoryConnector extends Component {
repopulate = () => { repopulate = () => {
this.props.fetchHistory(); this.props.fetchHistory();
} };
// //
// Listeners // Listeners
onFirstPagePress = () => { onFirstPagePress = () => {
this.props.gotoHistoryFirstPage(); this.props.gotoHistoryFirstPage();
} };
onPreviousPagePress = () => { onPreviousPagePress = () => {
this.props.gotoHistoryPreviousPage(); this.props.gotoHistoryPreviousPage();
} };
onNextPagePress = () => { onNextPagePress = () => {
this.props.gotoHistoryNextPage(); this.props.gotoHistoryNextPage();
} };
onLastPagePress = () => { onLastPagePress = () => {
this.props.gotoHistoryLastPage(); this.props.gotoHistoryLastPage();
} };
onPageSelect = (page) => { onPageSelect = (page) => {
this.props.gotoHistoryPage({ page }); this.props.gotoHistoryPage({ page });
} };
onSortPress = (sortKey) => { onSortPress = (sortKey) => {
this.props.setHistorySort({ sortKey }); this.props.setHistorySort({ sortKey });
} };
onFilterSelect = (selectedFilterKey) => { onFilterSelect = (selectedFilterKey) => {
this.props.setHistoryFilter({ selectedFilterKey }); this.props.setHistoryFilter({ selectedFilterKey });
} };
onClearHistoryPress = () => { onClearHistoryPress = () => {
this.props.executeCommand({ name: commandNames.CLEAR_HISTORY }); this.props.executeCommand({ name: commandNames.CLEAR_HISTORY });
} };
onTableOptionChange = (payload) => { onTableOptionChange = (payload) => {
this.props.setHistoryTableOption(payload); this.props.setHistoryTableOption(payload);
@@ -112,7 +112,7 @@ class HistoryConnector extends Component {
if (payload.pageSize) { if (payload.pageSize) {
this.props.gotoHistoryFirstPage(); this.props.gotoHistoryFirstPage();
} }
} };
// //
// Render // Render
+1 -1
View File
@@ -43,7 +43,7 @@ class HistoryOptions extends Component {
this.setState(setting, () => { this.setState(setting, () => {
dispatchSaveGeneralSettings(setting); dispatchSaveGeneralSettings(setting);
}); });
} };
// //
// Render // Render
+18 -3
View File
@@ -52,15 +52,15 @@ class HistoryRow extends Component {
} }
this.props.onSearchPress(data.query, indexer.id, categories); this.props.onSearchPress(data.query, indexer.id, categories);
} };
onDetailsPress = () => { onDetailsPress = () => {
this.setState({ isDetailsModalOpen: true }); this.setState({ isDetailsModalOpen: true });
} };
onDetailsModalClose = () => { onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false }); this.setState({ isDetailsModalOpen: false });
} };
// //
// Render // Render
@@ -247,6 +247,21 @@ class HistoryRow extends Component {
); );
} }
if (name === 'grabTitle') {
return (
<TableRowCell
key={name}
className={styles.indexer}
>
{
data.title ?
data.title :
null
}
</TableRowCell>
);
}
if (name === 'categories') { if (name === 'categories') {
return ( return (
<TableRowCell <TableRowCell
+2 -2
View File
@@ -51,11 +51,11 @@ class HistoryRowConnector extends Component {
onSearchPress = (term, indexerId, categories) => { onSearchPress = (term, indexerId, categories) => {
this.props.setSearchDefault({ searchQuery: term, searchIndexerIds: [indexerId], searchCategories: categories }); this.props.setSearchDefault({ searchQuery: term, searchIndexerIds: [indexerId], searchCategories: categories });
this.props.push(`${window.Prowlarr.urlBase}/search`); this.props.push(`${window.Prowlarr.urlBase}/search`);
} };
onMarkAsFailedPress = () => { onMarkAsFailedPress = () => {
this.props.markAsFailed({ id: this.props.id }); this.props.markAsFailed({ id: this.props.id });
} };
// //
// Render // Render
@@ -16,7 +16,7 @@
composes: input from '~Components/Form/TextInput.css'; composes: input from '~Components/Form/TextInput.css';
flex: 0 0 auto; flex: 0 0 auto;
margin-bottom: 20px; margin-bottom: 16px;
} }
.alert { .alert {
@@ -28,3 +28,46 @@
.scroller { .scroller {
flex: 1 1 auto; flex: 1 1 auto;
} }
.filterRow {
display: flex;
margin-bottom: 20px;
}
.filterContainer {
display: flex;
align-items: stretch;
flex: 1;
flex-direction: column;
margin-right: 12px;
}
.filterContainer:last-child {
margin-right: 0;
}
.filterLabel {
margin-bottom: 3px;
font-weight: bold;
}
@media only screen and (max-width: $breakpointSmall) {
.alert {
display: none;
}
.filterRow {
flex-direction: column;
}
.filterContainer {
margin-right: 0;
margin-bottom: 12px;
}
.scroller {
margin-right: -30px;
margin-bottom: -30px;
margin-left: -30px;
}
}
@@ -1,6 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import Alert from 'Components/Alert'; import Alert from 'Components/Alert';
import EnhancedSelectInput from 'Components/Form/EnhancedSelectInput';
import TextInput from 'Components/Form/TextInput'; import TextInput from 'Components/Form/TextInput';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import LoadingIndicator from 'Components/Loading/LoadingIndicator';
@@ -44,6 +45,17 @@ const columns = [
} }
]; ];
const protocols = [
{
key: 'torrent',
value: 'torrent'
},
{
key: 'usenet',
value: 'nzb'
}
];
class AddIndexerModalContent extends Component { class AddIndexerModalContent extends Component {
// //
@@ -53,7 +65,10 @@ class AddIndexerModalContent extends Component {
super(props, context); super(props, context);
this.state = { this.state = {
filter: '' filter: '',
filterProtocols: [],
filterLanguages: [],
filterPrivacyLevels: []
}; };
} }
@@ -62,7 +77,7 @@ class AddIndexerModalContent extends Component {
onFilterChange = ({ value }) => { onFilterChange = ({ value }) => {
this.setState({ filter: value }); this.setState({ filter: value });
} };
// //
// Render // Render
@@ -80,8 +95,35 @@ class AddIndexerModalContent extends Component {
onModalClose onModalClose
} = this.props; } = this.props;
const filter = this.state.filter; const languages = Array.from(new Set(indexers.map(({ language }) => language)))
const filterLower = filter.toLowerCase(); .sort((a, b) => a.localeCompare(b))
.map((language) => ({ key: language, value: language }));
const privacyLevels = Array.from(new Set(indexers.map(({ privacy }) => privacy)))
.sort((a, b) => a.localeCompare(b))
.map((privacy) => ({ key: privacy, value: privacy }));
const filteredIndexers = indexers.filter((indexer) => {
const { filter, filterProtocols, filterLanguages, filterPrivacyLevels } = this.state;
if (!indexer.name.toLowerCase().includes(filter.toLocaleLowerCase())) {
return false;
}
if (filterProtocols.length && !filterProtocols.includes(indexer.protocol)) {
return false;
}
if (filterLanguages.length && !filterLanguages.includes(indexer.language)) {
return false;
}
if (filterPrivacyLevels.length && !filterPrivacyLevels.includes(indexer.privacy)) {
return false;
}
return true;
});
const errorMessage = getErrorMessage(error, 'Unable to load indexers'); const errorMessage = getErrorMessage(error, 'Unable to load indexers');
@@ -99,11 +141,43 @@ class AddIndexerModalContent extends Component {
className={styles.filterInput} className={styles.filterInput}
placeholder={translate('FilterPlaceHolder')} placeholder={translate('FilterPlaceHolder')}
name="filter" name="filter"
value={filter} value={this.state.filter}
autoFocus={true} autoFocus={true}
onChange={this.onFilterChange} onChange={this.onFilterChange}
/> />
<div className={styles.filterRow}>
<div className={styles.filterContainer}>
<label className={styles.filterLabel}>Protocol</label>
<EnhancedSelectInput
name="indexerProtocols"
value={this.state.filterProtocols}
values={protocols}
onChange={({ value }) => this.setState({ filterProtocols: value })}
/>
</div>
<div className={styles.filterContainer}>
<label className={styles.filterLabel}>Language</label>
<EnhancedSelectInput
name="indexerLanguages"
value={this.state.filterLanguages}
values={languages}
onChange={({ value }) => this.setState({ filterLanguages: value })}
/>
</div>
<div className={styles.filterContainer}>
<label className={styles.filterLabel}>Privacy</label>
<EnhancedSelectInput
name="indexerPrivacyLevels"
value={this.state.filterPrivacyLevels}
values={privacyLevels}
onChange={({ value }) => this.setState({ filterPrivacyLevels: value })}
/>
</div>
</div>
<Alert <Alert
kind={kinds.INFO} kind={kinds.INFO}
className={styles.alert} className={styles.alert}
@@ -133,18 +207,14 @@ class AddIndexerModalContent extends Component {
> >
<TableBody> <TableBody>
{ {
indexers.map((indexer) => { filteredIndexers.map((indexer) => (
return indexer.name.toLowerCase().includes(filterLower) ? <SelectIndexerRow
( key={indexer.name}
<SelectIndexerRow implementation={indexer.implementation}
key={indexer.name} {...indexer}
implementation={indexer.implementation} onIndexerSelect={onIndexerSelect}
{...indexer} />
onIndexerSelect={onIndexerSelect} ))
/>
) :
null;
})
} }
</TableBody> </TableBody>
</Table> : </Table> :
@@ -52,11 +52,11 @@ class AddIndexerModalContentConnector extends Component {
onIndexerSelect = ({ implementation, name }) => { onIndexerSelect = ({ implementation, name }) => {
this.props.selectIndexerSchema({ implementation, name }); this.props.selectIndexerSchema({ implementation, name });
this.props.onModalClose({ indexerSelected: true }); this.props.onModalClose({ indexerSelected: true });
} };
onSortPress = (sortKey, sortDirection) => { onSortPress = (sortKey, sortDirection) => {
this.props.setIndexerSchemaSort({ sortKey, sortDirection }); this.props.setIndexerSchemaSort({ sortKey, sortDirection });
} };
// //
// Render // Render
@@ -17,7 +17,7 @@ class AddIndexerPresetMenuItem extends Component {
name, name,
implementation implementation
}); });
} };
// //
// Render // Render
+1 -1
View File
@@ -17,7 +17,7 @@ class SelectIndexerRow extends Component {
} = this.props; } = this.props;
this.props.onIndexerSelect({ implementation, name }); this.props.onIndexerSelect({ implementation, name });
} };
// //
// Render // Render
@@ -27,11 +27,11 @@ class DeleteIndexerModalContent extends Component {
onDeleteFilesChange = ({ value }) => { onDeleteFilesChange = ({ value }) => {
this.setState({ deleteFiles: value }); this.setState({ deleteFiles: value });
} };
onAddImportExclusionChange = ({ value }) => { onAddImportExclusionChange = ({ value }) => {
this.setState({ addImportExclusion: value }); this.setState({ addImportExclusion: value });
} };
onDeleteMovieConfirmed = () => { onDeleteMovieConfirmed = () => {
const deleteFiles = this.state.deleteFiles; const deleteFiles = this.state.deleteFiles;
@@ -39,7 +39,7 @@ class DeleteIndexerModalContent extends Component {
this.setState({ deleteFiles: false, addImportExclusion: false }); this.setState({ deleteFiles: false, addImportExclusion: false });
this.props.onDeletePress(deleteFiles, addImportExclusion); this.props.onDeletePress(deleteFiles, addImportExclusion);
} };
// //
// Render // Render
@@ -32,7 +32,7 @@ class DeleteIndexerModalContentConnector extends Component {
}); });
this.props.onModalClose(true); this.props.onModalClose(true);
} };
// //
// Render // Render

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