Compare commits

..

1838 Commits

Author SHA1 Message Date
Robin Dadswell
d0952d4a0c fixed small test issue 2021-01-19 19:06:48 -05:00
Robin Dadswell
579f1eae2d fixed health check selector 2021-01-19 19:06:48 -05:00
Robin Dadswell
091ebb5cee more linting fixes 2021-01-19 19:06:48 -05:00
Robin Dadswell
d3a96fac12 added missing css file 2021-01-19 19:06:47 -05:00
Robin Dadswell
da0b60dd96 Updated URL to readarr not lidarr 2021-01-19 19:06:47 -05:00
ta264
3bfdd4aafa New: Warn if UI won't update due to SignalR errors
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:47 -05:00
Robin Dadswell
da2bc75eab Most linting fixes completed 2021-01-19 19:06:47 -05:00
Robin Dadswell
1d922f3ce6 final backend fix 2021-01-19 19:06:47 -05:00
Robin Dadswell
b3bdaeeffa fixed RootFolderChecks 2021-01-19 19:06:47 -05:00
Qstick
604c354284 New: Event Driven HealthCheck Support
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:47 -05:00
Qstick
ec0fc6f3e1 Fixed: Edge case where import fails due to DB relationship mismatch
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:47 -05:00
Robin Dadswell
2d28359627 more backend build fixes 2021-01-19 19:06:47 -05:00
Robin Dadswell
45d0f4bdb7 fixes to build errors 2021-01-19 19:06:47 -05:00
Robin Dadswell
ba1f2a5a7b more build fixes 2021-01-19 19:06:47 -05:00
Robin Dadswell
0ef8f2b2f7 finished fixing IsUpgradable 2021-01-19 19:06:47 -05:00
Robin Dadswell
91d6fe90cd minor fixes to build - half finished 2021-01-19 19:06:47 -05:00
Robin Dadswell
baa728f2c1 removed additional whitespace 2021-01-19 19:06:47 -05:00
Robin Dadswell
d20f9ea269 fixed seriesActions 2021-01-19 19:06:47 -05:00
Robin Dadswell
db809f579c removed get columns as no longer user 2021-01-19 19:06:47 -05:00
Robin Dadswell
4970ed5323 fixed authoreditor 2021-01-19 19:06:47 -05:00
Robin Dadswell
fa653bf546 health check selector fix 2021-01-19 19:06:47 -05:00
Robin Dadswell
f496d96907 removed striphtml (as per lidarr) 2021-01-19 19:06:47 -05:00
Robin Dadswell
cfc52d12ea move to PageContentBody from PageContentBodyConnector 2021-01-19 19:06:47 -05:00
Robin Dadswell
40f156c16e regenerated lock file 2021-01-19 19:06:47 -05:00
bakerboy448
a322d9ed6d lint fixes 2021-01-19 19:06:46 -05:00
ta264
604666f961 Add SortKey validation
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
851ff948af Fixed: False Positives for RemotePath check with Deluge
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Mark McDowall
b6f052f39c Fixed: Show TLS errors in UI when testing download clients
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
e6236823cf Resource missing from Gotify call
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
32c759d32b Gotify token as query parameter
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
993d5818a4 Convert Notifications from RestSharp to HttpClient
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
2b93aaa9b2 Fixed: Manual Import Fails on failed Import Items
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Taloth Saldono
4ec873bf7a Fixed binary execute permissions for osx and Radarr
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Taloth Saldono
b574048733 Fixed disk permission tests
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Taloth Saldono
5c4dfc5e7b New: Displaying folder-based permissions in UI rather than file-based permissions and with selectable sane presets
Fixed: Preserve setgid when applying unix permissions
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Taloth Saldono
5545ae94ac Readded 0 cat to the end of the Newznab list
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
15e0b8dd4d Improve use of All() for Path related queries
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
ac4a82abf4 Mass Editor size and options
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
cb07186970 Fixed: Size on disk sorting and display
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Mark McDowall
e5409dbff6 New: Differentiate between short term and long term (more than 6 hours) indexer failures
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
59d6a77b74 Fixed: (Windows) clean up extraneous files in build folder during installation
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Mark McDowall
db0151c39b New: Bulk remove from Blacklist
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
4ac646685c New: Show .net version in UI
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Mark McDowall
d01d112bfe Fixed: Cleanse account and passwd from Download Station URLs
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Mark McDowall
77ef282916 Fixed: Webhooks using lower case event types (in the future this could change)
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Mark McDowall
e5f483eadc New: Health events for Webhooks
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Qstick
8e78bf71a1 Fixed: Failing file copy when running in docker on synology with btrfs
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Taloth Saldono
0c581c6146 Fixed: Regression causing updater to fail (manual update required if on 3.0.3.971, see forums)
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:46 -05:00
Taloth Saldono
cabec3c625 Fixed: Dataloss when moving series folder to root folder with only different casing
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Taloth
a0ef1ebaad New: Newznab/Torznab categories dropdown with indexer provided category names
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Taloth Saldono
5abfee1bf8 Handle ratelimit api response for newznab caps endpoint on certain newznab indexers that have caps behind the apikey
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Qstick
f46d5534f4 Fixed: Preview rename tip wording
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Qstick
35225c799b Fixed: Artist/Album navigation buttons hidden with some titles
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Qstick
89584666ff Fixed: Links and already added icons overflowing on add artist/album search results
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Taloth Saldono
a776336b8c Fixed: Exception when parsing Quality in release title with colon
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Qstick
39a0cb3f43 Fixed: Long paths overflowing in artist history
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Mark McDowall
2abee1970f Don't process queue item without details
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Mark McDowall
cdf648670d Fixed: Show more information in UI when testing SAB fails in some cases
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Ryan
810a02090b Fixed: Typo/unclear text in backup retention
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Taloth Saldono
4282b84fb6 Remove stacktrace if hardlink resulted in EXDEV.
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Taloth Saldono
42acea55fd Fixed: Performance of symbolic link detection and infinite recursion
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Taloth Saldono
c7e7d48ca3 New: Fast copy using reflink on btrfs volumes
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Taloth Saldono
b1fbdebba9 Fixed: Removed hardlink-based transactional file transfer logic (instead relying on explicit copy+delete for cifs)
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Qstick
b4bfd7d07f Fixed: Sorting of queue by artist title when unknown items are included
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Qstick
470ba66d4a Moved Windows-only Permission function to Lidarr.Windows
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:45 -05:00
Qstick
400fa4a960 fix modifiers for various classes
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Mark McDowall
e9de0420dd Fixed: Indexer being disabled due to download client rejecting it
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Taloth Saldono
56a623bad9 Added PrivacyLevel option to FieldDefinition for later usage
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Taloth Saldono
26bf0c0542 Added MultiSelect input control for provider settings
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Taloth Saldono
33de5d2049 New: Added FileList.io indexer support
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Arthur Bols
1e3b775837 New: Removed chown and simplified chmod options for linux/osx
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Taloth Saldono
efa77c1823 Allow inline markdown in the changelog for linking to wiki
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Qstick
3428ee3ca2 Fixed: Not removing seeded download if it was manual imported in some cases
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Mark McDowall
27c9337071 Fixed: Rejections custom filter for Interactive Search (now Rejections Count)
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Qstick
1fbaefc054 Improve root folder health check
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Skyler Mäntysaari
b1cfa90a9f New: SendGrid Notifications
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:44 -05:00
Qstick
3e01c3089c Fixed: Added .org to website url filtering in parser
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
2e80c86e23 Fixed recursion issue when emptying recycle bin
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
31837958c1 Fixed: Tag details list series in alphabetical order
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
a22297c197 Added UserAgent to api request trace log
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
6e595bfad3 New: Add DownloadClient and DownloadId to Webhook notifications
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
8ffcc8a711 Clarify that Post-Import Category torrents are not monitored by Sonarr.
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
4b3db6f596 Fixed: Windows installer won't create shortcut if unchecked
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Taloth Saldono
778085544c Improved error message when nzb download contains an newznab error instead
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
81a20ab0e5 Fixed: Ended overlay on artist posters
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
770176e127 Rename FilterFiles to FilterPaths
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
2f56814f58 Fixed: Queue not always clearing checked items when updated
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
4247605dc9 Fixed: Remove website post fix before parsing
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Taloth Saldono
3d4c8df6f7 Linting error
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
a5e69528a9 Fix Release Push log statement
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Jacob
074bcb4ebf New: Added option to filter Release Profile to a specific indexer
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Mark McDowall
2bd4965763 New: Clone indexer button
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:43 -05:00
Qstick
fdef79a9dc Fixed: Manual Import sorting by quality
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Mark McDowall
1423ebdb07 Fixed: Prompt to restart after resetting API key
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
06d3e47232 Fixed: Sorting by track count
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Taloth Saldono
255c19bb83 Added Norwegian Bokmal alias
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Taloth Saldono
4104efa9a0 Fixed: Representation of episode start time when not starting at the full hour in am/pm notation
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
5f1b928cd9 Fixed: RestClient does not use global proxy settings
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Mark McDowall
49b085bac6 New: Limit recent folders in Manual import to 10 and descending order
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Mark McDowall
5a4034ec6a Fix proptype warning for id of EnhancedSelectInputOption
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Mark McDowall
ed1175ed86 Remove website prefixes with dashes in URL
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Mark McDowall
31287eb0d7 Fixed: Details for episode history flashing on mobile devices
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Fossil
664905b4f2 Remove PFMonkey.com from Presets
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
a4223e8dbf Fixed: Test All not clearing health error
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
3af8c2f504 Improved some log messages
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
67086060b1 Fixed: Delete files from Artist Mass Editor not actually deleting files
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Taloth Saldono
099fd3166c Tiny fix in test, left-over from my on-windows test.
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Taloth Saldono
43363cbd08 Fixed: File imports on cloud drives slow due to transaction logic
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
7d0eeca9a9 Fixed: Use Proxy for MediaCovers and Metadata
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Mark McDowall
aa7d289a48 Fixed: Set permissions on extra and subtitle files
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Mark McDowall
c0f8d92c6e Fixed: Include releases that failed to parse in search results
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
2732ea43ad New: Event Driven HealthCheck Support
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
bc059c3f32 Fixed: Disregard Real when user disabled proper preference
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
172f8e4b31 Simplify ManualImportModule null check
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
2e9087d4c3 Fixed: Edge case where import fails due to DB relationship mismatch
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
d004f95297 Fixed: Improved failed series search messaging
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
566d84e22d Fixed: Manage Tracks not showing whether language/quality meets cutoff
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
8dd3c14132 Fixed: Delay profile being ignored for non-revision upgrades
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
acb3470988 Remove unnecessary usings
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:42 -05:00
Qstick
953d8a92c2 Remove Dotnet Framework Version Checks
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:41 -05:00
nitsua
129245cc5b New: Add label to disk usage progress bar
(cherry picked from commit 7c8ac300777583cb93d9deeed1328bcffaef555c)
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:41 -05:00
Qstick
4ecd7eaf08 Update README and CONTRIBUTING
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:41 -05:00
Qstick
698eedb51a Cache Yarn Packages on build
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:41 -05:00
Qstick
a94623d95b Catchup Linting
Signed-off-by: Robin Dadswell <robin@dadswell.email>
2021-01-19 19:06:41 -05:00
ta264
86773d8af8 Use ghcr.io for test images 2021-01-19 21:32:46 +00:00
ta264
d21e446b0e Fixed: Temporary fix for broken upgrades 2021-01-19 21:32:46 +00:00
ta264
82bb65ecb6 Fixed: Calibre add/remove format API 2021-01-19 21:32:46 +00:00
ta264
400bc5f8bb Fixed: Abort if calibre detects duplicate 2021-01-19 21:32:46 +00:00
ta264
b3aeeeef09 Fixed: Frontend error in confirm import dialog 2021-01-19 21:32:46 +00:00
ta264
cab92745da Fixed: better root folder validation 2021-01-19 21:32:46 +00:00
ta264
6a79c2f3a1 Fixed: Adding alternative edition of a book via goodreads id 2021-01-19 21:32:46 +00:00
ta264
3575ca50da Fixed: Search with edition title 2021-01-19 21:32:46 +00:00
ta264
16e04041a9 New: Calibre library support 2021-01-19 21:32:46 +00:00
ta264
a579a93aab Fixed: Support large calibre libraries 2021-01-19 21:32:46 +00:00
ta264
e52035564d New: Make sure existing items on import list are monitored 2021-01-19 21:32:46 +00:00
ta264
134e13190d Fixed: Exception syncing goodreads list 2021-01-19 21:32:46 +00:00
ta264
9beafd5265 Fixed: Show number in series on Series page 2021-01-19 21:32:46 +00:00
ta264
3d905e45ce Log out SQL on insert/update fail also 2021-01-19 21:32:46 +00:00
ta264
fc4c42eeb7 Fixed: Refresh fail if series title null 2021-01-19 21:32:46 +00:00
Robin Dadswell
8fc3aef872 Fixed: Error handling when cannot create folder in Recycling Bin
(cherry picked from commit c05fccb90d64d92836603b55d4bd30d5cbdb96a5)
2021-01-17 14:07:18 -05:00
Qstick
5ff1e337e5 New: Removing update folder from temp folder during housekeeping
Fixes #697
Fixes #696
2021-01-17 00:52:33 -05:00
Qstick
f96424f4bd Better task interval fetching
Fixes #706
Fixes #716
Fixes #705
2021-01-17 00:48:29 -05:00
bakerboy448
1756438fb0 it's 2021 now [skip ci] 2021-01-17 00:38:01 -05:00
Taloth Saldono
454e00613a Fixed: Unnecessary certificate validation errors on localhost/loopback
(cherry picked from commit c28cafba0a1b92f065541ebdae9db06ab1e5ac82)
2021-01-17 00:37:43 -05:00
Taloth Saldono
7df4ca64e6 Fixed Agenda Time wrapping
(cherry picked from commit 63607ad5415e9a900696a32933551c27e336784c)
2021-01-17 00:37:22 -05:00
Mark McDowall
94075a9bf6 New: Treat Manual Bad in history as failed
(cherry picked from commit ab478fd64bdf2b710fb865006858a1a7dbdbad21)
2021-01-17 00:37:05 -05:00
nitsua
039ce39cc8 Fix GRID for import trigger 2021-01-09 06:31:17 +00:00
Mark McDowall
8f1f5b0d08 Fixed: Restored robots.txt
(cherry picked from commit 37501094d7256e4dbe13de33b392933f6d475553)
2020-12-31 17:05:01 -05:00
Qstick
f23f1afa2c Fixed: Timespan over 1 month shown incorrectly
(cherry picked from commit cfbb4a32351fca2e6d3154c6d26c39b5205e0fe3)
2020-12-31 16:45:33 -05:00
Mark McDowall
50f9f6e884 Fixed: Backup interval is updated on change
(cherry picked from commit e5e86680c8f99687d3b95765be1c414cd1090191)
2020-12-31 16:45:13 -05:00
Taloth Saldono
319089b90f Bumped Sabnzbd default history request size from 30 to 60
(cherry picked from commit 8b2550cef0381a07c466044063c9d8c2be4d89c3)
2020-12-24 15:26:40 -05:00
bakerboy448
21f99efbb3 update contributing to match Lidarr and Radarr [skip ci] 2020-12-24 15:25:13 -05:00
bakerboy448
caaa8bfead Fixed: '/author' URL Base breaking UI navigation 2020-12-24 15:23:09 -05:00
Qstick
9a13790354 Fix BasicRepository Tests when not on UTC
(cherry picked from commit 4f7dc94b94bda49443c28baefc592e7388bcf540)
2020-12-24 11:34:30 +00:00
ta264
220f917be2 Fixed: Restoring large database backups
Remove Kestrel's default 28.6MB upload limit

(cherry picked from commit 286b083da429a49638c9121b1dda058b5425c476)
2020-12-21 18:04:47 +00:00
ta264
3e4ebe8aca Pull DownloadClientItemClientInfo part of 824d315a 2020-12-13 07:21:03 +00:00
ta264
cedc026710 Fixed: Use QBittorrent category savepath for healthcheck
[common]
2020-12-13 07:21:03 +00:00
ta264
a5635c3396 Fixed: Import single file torrents with a folder from QBittorrent 2020-12-13 07:21:03 +00:00
Taloth Saldono
058ab4b4a8 Protect against Qbittorrent edgecase if users add torrents manually with Keep top-level folder disabled
(cherry picked from commit 05820ac272ee976fcc0a7b17f3e9cc987cb0d230)
2020-12-13 07:21:03 +00:00
ta264
eb50b4f09f Fixed: Get actual file names from QBittorrent API (#5226)
* Fixed: Get actual file names from QBittorrent API

Previously we were assuming that the output filename was the category
output dir + the torrent name.  This isn't true if the torrent has
been renamed or sanitized.
2020-12-13 07:21:03 +00:00
Qstick
6791787655 Ignore ResizeObserver loop limit errors
(cherry picked from commit ffcb34f9f0bef6206bf334fa47083a3e25439a3a)
2020-12-12 14:38:07 -05:00
Taloth Saldono
3af3c9ff4b Removed unnecessary importlists warning.
(cherry picked from commit a9384e26d86cfe8ae1d29569a708e3db9306abe6)
2020-12-12 12:45:25 -05:00
Taloth Saldono
cc9886379e Give systemd a bit more time to restart sonarr after update
(cherry picked from commit 5fced70948c1e8d3d5e3c4747516507f87506697)
2020-12-12 12:43:56 -05:00
nitsua
c9b43e1a05 Fix notification GRIDs again 2020-12-04 02:56:49 +00:00
Qstick
ad1ef12238 Use Arch and Runtime when getting list of update changes 2020-11-27 17:09:36 +00:00
Qstick
71b9026908 Fix the Fixes on Readme :P [skip ci] 2020-11-24 23:04:05 -05:00
bakerboy448
2f780c2064 update more info links 2020-11-24 22:41:10 -05:00
Qstick
25c585ead3 Remove brackets from config.yml url [skip ci] 2020-11-24 22:34:45 -05:00
bakerboy448
b011164f6e update GH Issue Templates [skip ci]
also update readme
2020-11-24 22:31:16 -05:00
Qstick
bd9d972749 Win x86 builds 2020-11-18 12:05:01 -05:00
Qstick
38fafb87aa Add NeutralLanguage for build in VS 16.8 2020-11-18 12:01:33 -05:00
nitsua
8633f0301e Update MB to GR for custom script and discord notifier
Added GRIds to custom script and discord notifier
2020-10-29 20:59:33 -04:00
Qstick
c4167bdc78 Skip Screenshot upload on second job run (#550) 2020-10-15 21:11:32 -04:00
Qstick
7670e7a547 Fixed: Don't fail on screenshot upload 2nd run 2020-10-13 12:32:58 -04:00
Mark McDowall
96461b8aa3 Fixed: Copying passwords
(cherry picked from commit c871b3f9487b9bfeb3726d763a632a772b420a0a)
2020-10-12 20:52:05 +01:00
nitsua
2a3243f37c Add support for discord notifier 2020-10-12 20:51:19 +01:00
nitsua
d096536be3 Add the list of book ids to the custom script grab event 2020-10-12 20:49:56 +01:00
Mark McDowall
ce24902dc0 Fixed: Parsing of URLs with double slashes in the path
(cherry picked from commit 0c7743e786749b333333d282412ff76fc10aba65)
2020-10-10 17:16:02 -04:00
nitsua
0672fc7b85 Custom Notification cleanup
- Renamed event "BookDownload" to "Download" to match sonarr/radarr
- Renamed "TrackRetag" to "BookRetag" (Lidarr leftovers)
2020-10-10 16:16:43 -04:00
Mark McDowall
533e239d72 Fixed: Removing torrents from Vuze
(cherry picked from commit d0c0720578abcc02d9abca24f60d73d32491cd2f)
2020-10-10 15:16:52 -04:00
nitsua
f2502ff913 Add GetIntegerQueryParameter for use later 2020-10-10 14:44:20 -04:00
Taloth Saldono
b6cc303e1c Fixed: Executing powershell and python scripts directly in Connect->Custom Scripts 2020-10-10 14:43:15 -04:00
Qstick
086e3b3240 Fixed: Don't Crash on Manual Grabs 2020-10-10 01:00:31 -04:00
Qstick
00dcc5de86 Take Screenshot on Automation tests for build status notifications 2020-10-09 22:28:13 -04:00
Qstick
e8d62566d8 Update Frontend Packages
Fixes #482
Fixes #483
Fixes #484
Fixes #485
Fixes #486
Fixes #487
Fixes #488
Fixes #489
Fixes #490
Fixes #491
Fixes #492
Fixes #493
Fixes #494
Fixes #495
Fixes #496
Fixes #497
Fixes #498
Fixes #499
Fixes #500
Fixes #501
Fixes #505
Fixes #506
2020-10-04 22:09:32 -04:00
Qstick
ef94c77dd6 Update CONTRIBUTING.md 2020-09-27 10:38:30 -04:00
Qstick
4e22a2cf60 Cache Yarn Packages on build 2020-09-27 10:38:30 -04:00
Qstick
c17f3a90a7 Catchup Linting 2020-09-27 10:38:30 -04:00
Qstick
6b22b9bb57 jsconfig for a bit of autocompletion and intellisense
Fixes #1460

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-09-27 10:38:30 -04:00
ta264
44fa6e4cc1 Fix test 2020-09-27 14:40:21 +01:00
Mark McDowall
cb2c502857 Indexer Priority ESLint fixes 2020-09-27 14:40:21 +01:00
Dtaggart
916acdb81a New: Index priority 2020-09-27 14:40:21 +01:00
ta264
2f8ac793ff New: Refresh button on book page that bypasses cache 2020-09-03 21:36:28 +01:00
ta264
b93bc1e5e5 Fixed: Correctly save the 'create empty author folders' option
Fixes #412
2020-09-02 21:51:49 +01:00
ta264
9100191ad0 New: Ensure covers up to date with Goodreads 2020-09-02 21:51:49 +01:00
ta264
709a945531 Fixed: Error fetching paged records from API without a sort key
(cherry picked from commit 53f1857e6349fc4c674dbaec50b0dda681f073ae)
2020-09-02 16:39:18 +01:00
ta264
6e398b3a57 Fixed: Error fetching results in Add New 2020-08-31 21:48:29 +01:00
ta264
7a5297b2a6 Remove unused expandedState from BookDetails 2020-08-31 21:38:30 +01:00
ta264
72f1c8b9a8 Fix modules derived from BookModuleWithSignalR 2020-08-30 21:20:35 +01:00
ta264
3a12ae6956 New: Show series info in author books table and book details 2020-08-30 14:42:10 +01:00
ta264
9139113d14 New: Send publisher and language to calibre 2020-08-30 13:25:49 +01:00
ta264
ba92586b8b Fixed: Author not found error when deleting book
Fixes #403
2020-08-29 16:08:30 +01:00
ta264
7fe8702584 New: Add page count to author books page
Fixes #408
2020-08-29 16:08:30 +01:00
ta264
4adffff5ba Remove old lidarr UI settings
Fixes #401
2020-08-29 16:08:30 +01:00
Qstick
e4ad1c5e16 Switch Automation to Chrome for Test Speed 2020-08-25 22:01:44 +01:00
ta264
737bde0c5c Fix test 2020-08-25 22:20:04 +01:00
ta264
38ce17fc53 Fixed: Trigger search when new book added via import list 2020-08-25 22:35:14 +01:00
Mark McDowall
0d8e36ca33 Fixed: Imported downloads not being removed when seeding goals are met
Closes #1400
2020-08-25 21:39:53 +01:00
Mark McDowall
162cbf01ed Fixed: Remove seeded downloads if they've finished seeding after import
Closes #1389

(cherry picked from commit 9d766cfed588ee49525f68815b7e5eb980ddc11f)
2020-08-25 21:39:52 +01:00
Mark McDowall
83ebb972be Small change to creating an itemMap during item update
Closes #1381

(cherry picked from commit 7f28ab895a73fe0677c62388b82e4d5f73e5c023)
2020-08-25 21:39:52 +01:00
Mark McDowall
47f6e821ad Fixed: Import series failing to add items to process
Closes #1380

(cherry picked from commit 97ec1847541ba2a73d25eedbd3c97aa6f2f7e4e0)
2020-08-25 21:39:51 +01:00
Mark McDowall
1ca42eb711 Add class to allow for overriding scrollbar width
Closes #1379

(cherry picked from commit 42343d528372c494b297e5c84125f7bdb6ab4eec)
2020-08-25 21:39:51 +01:00
Mark McDowall
9674f79f40 Fixed: Removed items in queue still showing until refresh
Closes #1378

(cherry picked from commit 479baf06a72b46429a80e19208fdc753ce0ed8ba)
2020-08-25 21:39:50 +01:00
Mark McDowall
0868626450 Fixed: Don't process downloads removed from the client
Closes #1377
2020-08-25 21:39:50 +01:00
Mark McDowall
e24bd83395 Don't re-trigger completed event
Closes #1376
2020-08-25 21:39:49 +01:00
ta264
6d88db08f0 Use createItemMap like Sonarr
(cherry picked from commit 43d04cd54efcf5569cb316a5856878d4291f96be)
2020-08-25 21:39:48 +01:00
ta264
f58cffef51 Log out SQL trace on error
Closes #394
2020-08-21 20:28:54 +01:00
ta264
9fc0a8d4d1 New: Option to disable automatic search on import lists 2020-08-19 22:44:06 +01:00
ta264
ede8b9aa4a Fixed: Goodreads owned books import 2020-08-19 22:44:06 +01:00
ta264
220808a7c4 Fixed: Import list import error 2020-08-19 22:44:06 +01:00
ta264
515751b1e1 New: Send series info to calibre when importing 2020-08-19 22:16:43 +01:00
ta264
6ea1a56b50 New: Import shelves from any goodreads user
Fixes #369
2020-08-19 22:16:43 +01:00
ta264
412a2dcb6f Fixed: Error adding some authors
Fixes the case where the author wasn't the main contributor to their
most popular book

Fixes #42
Fixes #360
2020-08-19 22:10:22 +01:00
ta264
be83bff893 Quieten calibre 2020-08-19 22:01:44 +01:00
Qstick
8c6ecd3b7a Fixed: Don't lock command queue if updating is disabled 2020-08-19 21:57:11 +01:00
Taloth Saldono
f94a286479 Lock CommandQueueManager.PushMany too 2020-08-19 21:50:52 +01:00
Taloth Saldono
e39fee9209 Skip unknown/removed commands still queued in the database 2020-08-19 21:50:42 +01:00
Taloth Saldono
edd278a131 Fixed timing issue allowing multiple instances of the same command to be queued 2020-08-19 21:45:00 +01:00
Mark McDowall
4f131428b8 Fixed: Broken tasks getting stuck in queue 2020-08-19 21:44:56 +01:00
BrOlleJonsson
26a8e0cb8d Update README.md
correction of link for backers to opencollective.com
2020-08-19 20:44:06 +01:00
Qstick
38636e6a2b Try to fix windows automation tests 2020-08-19 20:43:31 +01:00
ta264
058ceea16e Only disable sonar tasks for fork PR 2020-08-19 20:43:31 +01:00
ta264
01290965c5 Fix test 2020-08-19 19:16:54 +01:00
ta264
bb409b9929 Fixed: Error refreshing page on Activity/Wanted 2020-08-18 23:31:00 +01:00
ta264
cc0fea2aab Fixed: Don't show NoAuthor on calendar if authors are loading 2020-08-18 23:20:55 +01:00
Mark McDowall
f9af5e2502 Fixed: Error occurred while executing task ProcessMonitoredDownloads 2020-08-18 22:57:29 +01:00
Mark McDowall
bc395860bb Fixed: Inaccessible path leading to import process being aborted before processing all items 2020-08-18 22:57:26 +01:00
ta264
b9ba7228b5 Fixed: Re-processing imported download causing task to fail 2020-08-18 22:57:13 +01:00
Mark McDowall
cc6db7a9e5 Fixed: Force grabbing selected delayed items in queue 2020-08-18 22:49:31 +01:00
Taloth Saldono
84faeca0d3 Fixed missing interface for the CheckForFinishedDownloadCommand backward compat handling 2020-08-18 22:49:23 +01:00
gl3nni3
921bfdb20d Fixed: Replace duplicate slashes from file names when importing
Fixes #3470
2020-08-18 22:48:31 +01:00
ta264
0d3798b8b1 Fixed: Bad SQL queries getting files for book 2020-08-19 17:47:36 +01:00
ta264
190c4059cc Fix default quality revision version to 1 not 0 2020-08-19 17:47:27 +01:00
ta264
dfccb8b6dd Fix fpcalc tests 2020-08-17 21:44:48 +01:00
ta264
2ce12e1a7e Move runtime copy into a separate target 2020-08-17 21:29:26 +01:00
ta264
9973dd8195 Move msbuild target files into folder 2020-08-17 21:29:26 +01:00
ta264
6921be3c44 Actually fix musl integration tests
[common]
2020-08-17 10:34:53 +01:00
ta264
9d2cf3dfc5 Revert "Ignore alpine integration failure"
This reverts commit 536c0c19dc.
2020-08-17 10:34:53 +01:00
ta264
b2d1617e44 Disable single instance check for integration tests
Causes a SIGABRT on mono 6.10 and 6.12 - double free or corruption
2020-08-17 10:34:53 +01:00
Matthew Kleiman
44f7400f83 Fixed: Typo in Lost Connection modal
(cherry picked from commit f6af29fc3b7c3beae91877fb921db7c0bb5390a9)
2020-08-16 20:47:34 -04:00
Dtaggart
e563f7f75e New: Added silent notification option to telegram
(cherry picked from commit 9e392977b9f66be37c1fd6938c0b051c362ddb42)
2020-08-16 21:21:03 +01:00
ta264
0387f8e33e New: Calibre root folder health check 2020-08-16 11:21:53 +01:00
ta264
8781b78be9 Fixed: Validate calibre connection before saving root folder 2020-08-16 11:21:53 +01:00
ta264
d2fa75dee5 New: Support digest authentication with Calibre 2020-08-16 11:21:53 +01:00
ta264
1e2d931f9a Support for digest auth with HttpRequests
[common]
2020-08-16 11:21:53 +01:00
ta264
655017e1ed Simplify calibre settings
The IProviderConfig stuff wasn't used
2020-08-16 11:21:53 +01:00
ta264
d2dcc45492 Fixed: Shared serializer in ProviderRepository
[common]

Some caching happens in the serializer settings so best not to
recreate each time
2020-08-16 11:21:53 +01:00
ta264
536c0c19dc Ignore alpine integration failure 2020-08-16 06:29:33 +01:00
ta264
1ace52784b Print log file on fail 2020-08-16 06:29:33 +01:00
ta264
2b994fdc0c Run integration tests in parallel
Revert "Try to fix alpine integration tests"

This reverts commit d8cb86c5dd.

[common]
2020-08-16 06:29:33 +01:00
ta264
ea909c6d99 Bump net core to 3.1.7 2020-08-14 06:35:58 +01:00
ta264
4cc09a7cc0 Fix test 2020-08-13 20:44:49 +01:00
ta264
d8cb86c5dd Try to fix alpine integration tests 2020-08-13 19:12:16 +01:00
Taloth Saldono
a67dda87a8 Additional logging in case of integration test startup failures
Closes #292
2020-08-13 19:12:16 +01:00
ta264
b105f97941 Swap from dotnet vstest to dotnet test
(cherry picked from commit c40f87ce2f3fc03acb9a3d73498e7861f5750b4b)
2020-08-13 19:12:12 +01:00
ta264
745fba3bf8 Disable stylecop for backend build on azure
Linting issues are picked up by the analyze task
2020-08-06 21:42:03 +01:00
ta264
07295cd7b2 Fix integration test packages 2020-08-06 21:41:42 +01:00
ta264
6bcc9de7af Fixed: Allow books with missing language by default 2020-08-06 20:24:34 +01:00
ta264
b8d73811d2 Fail on docker integration tests also 2020-08-06 18:46:51 +01:00
ta264
20b997473a Fixed: Error adding indexers 2020-08-05 22:35:26 +01:00
ta264
4e861e0ae5 Fixed: Bug preventing override of book in manual import 2020-08-05 22:35:26 +01:00
ta264
f5c6070f23 Fixed: Correct query for lazy-loading files 2020-08-05 22:35:26 +01:00
ta264
e1862653f9 Fixed: Don't strip apostrophes 2020-08-05 22:35:26 +01:00
ta264
31cad994ba Fixed: Remove disambiguation from search 2020-08-05 22:40:27 +01:00
ta264
dbba39c487 Fixed: Book title should not include the series 2020-08-05 22:38:35 +01:00
ta264
46c0e3c481 Ignore book-search test 2020-08-05 21:47:04 +01:00
ta264
6a24bf7a78 Disable newznab book-search, enable for Torznab 2020-08-05 21:16:01 +01:00
Qstick
93105cfff7 Fix build due to apiPath setting in Newznab presets 2020-08-05 13:26:58 -04:00
Mark McDowall
859dae07db New: Add Tabula Rasa Newznab Preset
(cherry picked from commit 31be74e6d33e0066c1dca6115c7272a49dc8d277)
2020-08-05 12:49:05 -04:00
ta264
c022533aba Try to fix service test 2020-08-04 15:18:38 +01:00
ta264
919a807c72 Fix fingerprinting tests 2020-08-04 14:53:32 +01:00
ta264
eee72460e3 Add libMonoPosixHelper for musl-arm64 2020-08-04 14:53:32 +01:00
ta264
58f71232ab New: Musl (alpine linux) compatibility 2020-08-04 14:53:32 +01:00
Mark McDowall
4c8ff1c6bb New: Not in Last/Next for date custom filters
(cherry picked from commit 9a3669d80191e1f8e17fa22e5d1d9ae56fe13210)
2020-08-04 08:17:09 -04:00
Taloth Saldono
289113b204 Fixed: Added glusterfs to known network drive filesystems so it shows up in System 2020-07-31 15:28:09 +01:00
ta264
821aa90b14 New: Goodreads Shelves + Owned Books notifications 2020-07-14 06:11:51 +01:00
Qstick
3504cbe9cd Bump Yarn timeout to 2 min 2020-07-04 00:02:43 -04:00
ta264
5f2d57f33b Fixed: Goodreads import lists 2020-07-03 22:26:06 +01:00
ta264
723beb9ca3 Fixed: Multiple editions ending up monitored 2020-07-02 22:24:53 +01:00
ta264
542f3b23b2 Fixed: Add book model should close after adding book 2020-07-02 21:24:57 +01:00
ta264
bdebb1593c Fixed: Editing authors from bookshelf
Fixes #39
2020-07-02 22:04:39 +01:00
ta264
be03e1258a Regenerate yarn.lock 2020-07-02 20:52:38 +01:00
Qstick
222157150c Use new fluentmigrator prerelease feed, update to alpha 289 2020-07-02 19:40:28 +01:00
Qstick
6dbce8d12e Sync Packages with Radarr 2020-07-02 19:40:28 +01:00
ta264
c1b9590df2 Bump to net core 3.1.5, update packages 2020-07-02 19:40:28 +01:00
ta264
ac73b9711a Fixed: Parsing books written before year 1 2020-07-02 19:40:28 +01:00
ta264
9e5966365c Fixed: Send correct covers to Goodreads
Also use original release date and set goodreads id
2020-07-01 22:25:21 +01:00
ta264
15f9ae3c13 Log progress while fetching books 2020-07-01 22:01:52 +01:00
Taloth Saldono
5ef55d2180 Fixed DownloadFile when file already exists 2020-07-01 21:16:07 +01:00
Taloth Saldono
3c335d498e Fixed tests 2020-07-01 21:16:07 +01:00
Taloth Saldono
138a188cc9 Fixed: Download mediacover using configured proxy. 2020-07-01 21:16:07 +01:00
ta264
3fa605177c New: Cache goodreads responses 2020-07-01 21:16:07 +01:00
Qstick
50e9225574 Use HTTPS for httpbin tests 2020-07-01 21:16:07 +01:00
Qstick
d1565b44e4 Update HttpClientFixture.cs 2020-07-01 21:16:07 +01:00
ta264
46b1c933a3 Fix UtcConverter - already UTC back from DB 2020-07-01 21:16:07 +01:00
ta264
45d49117ca New: Use Goodreads directly, allow multiple editions of a book (new DB required) 2020-07-01 21:16:07 +01:00
Thomas Mathews
d83d2548e5 Fixed: author manual import (#32)
* Fix: apply fix from Lidarr to the Readarr manual import modal

* Rename Album to Book in the identification override

* Rename "audio" to "book" in the interactive import modal empty message
2020-05-26 20:55:40 +01:00
Thomas Mathews
3f8733830a New: Add a monitor toggle to each series (#31)
* New: Add a monitor toggle to each series

* Resolve linting errors

* Spin when any of the books are currently saving

* Resolve CSS linting errors
2020-05-25 18:17:05 +01:00
Thomas Mathews
324db4959d Fixed: bookshelf count and colour (#30)
* Add total book count to the result set from the statistics query

* Rename TotalTrackCount and map it

* Fix the colouring of the book count/percentage
2020-05-25 15:12:23 +01:00
ta264
22679d6187 Fixed: Missed list monitor type rename 2020-05-20 22:05:01 +01:00
ta264
2cb54cdc83 Fix housekeepers 2020-05-19 21:50:37 +01:00
Qstick
307989aab7 More Fun in Core with Naming 2020-05-19 21:50:37 +01:00
Qstick
b0e966418e Fixed: Command Inherited Properties not Saved to DB 2020-05-19 21:50:37 +01:00
Qstick
3ae3c9dfc1 New: Improve Newznab Searching (Book-Search Caps, ISBN Search) 2020-05-19 21:50:37 +01:00
Qstick
ee43ccf620 Renames in Frontend 2020-05-19 21:50:37 +01:00
Qstick
ee4e44b81a Method, Variable, Class Renames in Readarr.Api 2020-05-19 21:50:37 +01:00
hotio
8080d375d0 Update README.md (#12) [skip ci]
add docker link
2020-05-16 19:31:31 -04:00
ta264
bc0e0faa90 Fixed: Error searching for book 2020-05-15 17:41:53 +01:00
ta264
6c7e4ca210 Fixed: MediaManagement Settings (fresh db required) 2020-05-14 21:53:50 +01:00
Qstick
8547af9fae Method, Variable, Class Renames in Readarr.Core
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2020-05-13 20:42:22 -04:00
Qstick
56aedcc467 Bump .net core to 3.1.4 2020-05-13 10:40:43 -04:00
Qstick
e26840b649 Fixed: Fetch Settings in UpdateConnector 2020-05-10 23:09:10 -04:00
Qstick
6a747ae110 Fix Radarr reference in Updates.js 2020-05-10 20:24:54 -04:00
Taloth Saldono
54444c27ea Replaced matchAll usage since it's not available on all browsers 2020-05-10 22:54:40 +01:00
Taloth Saldono
bc88a26c80 Added UpdateMechanismMessage to allow package maintainers provide custom message 2020-05-10 22:54:40 +01:00
Taloth Saldono
e9c1506e46 Inline markdown-style link for PackageAuthor 2020-05-10 22:54:40 +01:00
Qstick
d0e2cf9571 New: Set Branch, Update Mech from PackageInfo 2020-05-10 22:54:40 +01:00
Thomas Mathews
663aa462b0 New: Option to attach files to email notifications (#18) 2020-05-10 15:09:43 +01:00
Qstick
8c2750e96c Add OC, Azure Badging to Readme 2020-05-10 09:21:50 -04:00
ta264
a3168a3717 Disable discord notification for external pr 2020-05-10 11:36:41 +01:00
ta264
49d3c27647 Fix mono version checks and mono test checks 2020-05-10 11:36:23 +01:00
ta264
08496c82af New: Readarr 0.1 2020-05-09 22:24:45 +01:00
Qstick
476f2d6047 Warning and OC reference fix in readme 2020-03-14 22:01:45 -04:00
ta264
dd5b69b10e Fix azure executable bit warnings 2020-03-04 22:17:34 +00:00
ta264
7b3637ea77 Try to fix build 2020-03-04 22:17:09 +00:00
ta264
09d9ccddeb Fix CSS 2020-03-04 20:22:14 +00:00
ta264
aa5d8aab9d Disable sentry upload for now 2020-03-04 20:22:14 +00:00
Qstick
a60b746a05 Simplify Readme for Now
#3
2020-03-03 21:09:50 -05:00
Qstick
3b7eb01918 New: Lidarr to Readarr 2020-02-29 16:58:13 -05:00
ta264
7359c2a9fa Fixed: Albums from lists allow any version 2020-02-29 19:44:07 +00:00
ta264
cd6a86bba8 Fixed: Monitor specific album option for lists 2020-02-29 19:44:07 +00:00
ta264
fa33bd857e Fixed: Allow None metadata profile for lists 2020-02-29 19:44:07 +00:00
ta264
9e4d6c80cd Fixed: Speed up AlbumStudio 2020-02-29 19:44:07 +00:00
ta264
a8be028f29 Fixed: Speed up UI during refresh
Don't update state if we know items are equal to avoid reselections.
Don't pass LastInfoUpdate to frontend to prevent useless updates (the
field isn't used)
2020-02-29 19:44:07 +00:00
ta264
309b8f82e1 Speed up all albums endpoint 2020-02-29 19:44:07 +00:00
ta264
0a33fd98cc Lazyload logging 2020-02-29 19:44:07 +00:00
ta264
b50b0a1411 Swap to dapper with lazyload 2020-02-29 19:44:07 +00:00
ta264
251f69fdfc Delete Marr.Data 2020-02-27 21:52:39 +00:00
Mark McDowall
d459a36591 Option to ignore items when removing from queue instead of removing from client 2020-02-27 21:52:31 +00:00
Mark McDowall
94ac75c6b7 Monitor and Process downloads separately
New: Queue remains up to date while importing file from remote file system
Fixed: Failed downloads still in queue won't result in failed search
2020-02-27 21:52:31 +00:00
ta264
a70e7e4778 New: Split out metadata refresh from disk rescan 2020-02-27 21:27:06 +00:00
ta264
cf15359b89 New: Watch filesystem for changes to library 2020-02-27 21:27:03 +00:00
ta264
8e4e62c17a New: Only refresh items that have updated on metadata server 2020-02-25 20:00:51 +00:00
Qstick
b319c44bbd New: Store Task StartTime, Show Duration in UI 2020-02-25 20:00:51 +00:00
ta264
04378c8ecc Fixed: Not showing past first few pages of history 2020-02-24 21:59:32 +00:00
ta264
66023f0e51 New: Bump .NET core to 3.1.102 2020-02-19 21:35:28 -05:00
ta264
fd0c673b49 Fixed: Don't check update folder writable in docker 2020-02-15 19:19:16 +00:00
ta264
39be927b40 Fixed: Rename TrackFiles in DB on artist move
Fixes #1012
2020-02-11 21:22:45 +00:00
ta264
a506125841 New: Don't require artist mapping 2020-02-11 21:22:45 +00:00
ta264
34b1d429be New: Pass DownloadClientItem to Import Specs 2020-02-11 21:22:45 +00:00
ta264
b54d556e63 Fixed: Editing provider/profile settings appearing to affect wrong item 2020-02-08 09:42:53 +00:00
ta264
2e6094beb6 New: Update MonoTorrent from nuget 2020-02-07 17:38:53 +00:00
ta264
705c7c9b0e Upgrade build agents 2020-01-24 18:53:52 -05:00
ta264
a9dd496553 Bump net core to 3.1.101 2020-01-21 19:34:37 +00:00
ta264
4afd7934fe Update sentry DSN to self hosted 2020-01-21 19:34:37 +00:00
Qstick
7e244611f0 Dedupe JS events to prevent 1000s repeated hitting Sentry 2020-01-21 19:34:37 +00:00
ta264
cdc6adddc0 Test mono 6.10, drop mono 6.6 2020-01-21 19:34:37 +00:00
ta264
4ed8507ce1 Fix build for bad azure update 2020-01-21 19:34:37 +00:00
ta264
1af5e024d9 Fixed: Use portable PDBs on net core
Enables stack trace line numbers on linux
2020-01-21 19:34:37 +00:00
Qstick
f77a2feeef StyleCop (#1058)
* Stylecop Rules and Fixes
2020-01-03 07:49:24 -05:00
Qstick
63d669178d Fixed: Handle qBittorrent "moving" & "forcedDL" state 2020-01-02 19:04:58 -05:00
Qstick
c8da56749c New: Added version number to backup filename
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2020-01-02 19:01:39 -05:00
Qstick
ee627eb0a3 Fixed: Default id for MenuContent
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-01-02 18:48:53 -05:00
Qstick
1a0d276c72 Fixed: React error when displaying a search result for an existing item
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-01-02 18:46:26 -05:00
Qstick
3cfdb2ccfd Combine solutions back to one file 2020-01-02 18:37:29 -05:00
ta264
e2c1d57d8c Fixed: Error in epic fail handler if console input redirected
Fixes Sentry LIDARR-1YS
2020-01-01 08:54:12 -05:00
ta264
8a20c0fa83 New: Add/remove individual albums 2019-12-16 21:21:32 +00:00
ta264
6af29da4c9 New: Bump to .NET Core 3.1 2019-12-15 22:04:56 -05:00
ta264
70e9818949 Fixed: Rework Artist Index and VirtualTable 2019-12-15 22:00:40 -05:00
ta264
e0d1e3b03f Fixed: Don't repeatedly re-render cells 2019-12-15 22:00:40 -05:00
ta264
9b6b406a53 Better selection of jump bar items
Show first, last and most common items
2019-12-15 22:00:40 -05:00
ta264
b4abc63269 Fixed: Strip UrlBase from UI events before sending to sentry
Should mean that source maps are picked up correctly.
2019-12-15 22:00:40 -05:00
ta264
624ee1daa4 Fixed: Use a worker for UI fuzzy search 2019-12-15 22:00:40 -05:00
ta264
963c832241 Fixed: Faster movie selector 2019-12-15 22:00:40 -05:00
ta264
e45f788ca5 Fixed: Faster hasDifferentItems and specialized OrOrder version 2019-12-15 22:00:40 -05:00
ta264
22a9f83c24 New: Option for production build with profiling 2019-12-15 22:00:40 -05:00
Taloth Saldono
11525c6167 Revised webpack bundling 2019-12-15 22:00:40 -05:00
ta264
5b2df4d9ca Disable some flaky tests on MacOS 2019-11-02 14:48:54 +00:00
ta264
ea56775fa6 Filter OOM from sentry 2019-11-02 11:00:38 +00:00
Qstick
490e42015b Fixed: Album search indicator spins forever if any task exists 2019-11-01 13:38:28 -04:00
ta264
220df4da75 Fixed: Broadcast album updated if track file deleted
Ensures that album stats update in the Artist details page if track files
are deleted.
2019-10-29 21:27:27 +00:00
ta264
12d8075184 Distribute fpcalc for netcore builds 2019-10-29 20:38:57 +00:00
ta264
4346c76d4f New: Multi target net framework 4.6.2 and net core 3.0 2019-10-29 20:38:57 +00:00
ta264
9f5dac3789 Fixed: Convert MonoOnly to PosixOnly 2019-10-29 20:38:57 +00:00
ta264
8aa3383e65 New: Switch to ASPNetCore Kestrel and SignalR 2019-10-29 20:38:57 +00:00
ta264
ebf4859167 Update FluentMigrator to v4 2019-10-29 20:38:57 +00:00
ta264
d8d7a2c28a New: Use sqlite package 2019-10-29 20:38:57 +00:00
ta264
49d6da6b88 Fixed: Remove bad binding redirects in csproj 2019-10-29 20:38:57 +00:00
ta264
9a3e8fa3c7 Fixed: Ensure mono compatible facades are present at build 2019-10-29 20:38:57 +00:00
ta264
4a0468e1ab New: Use dotnet tooling, produce 64bit build on windows 2019-10-29 20:38:57 +00:00
Qstick
171f15742d Fixed: Set Default Sort Key for Blacklist Endpoint 2019-10-28 21:31:07 -04:00
ta264
6a9887f7e2 New: Cache spotify -> musicbrainz mapping 2019-10-28 19:12:21 +00:00
ta264
b050c73d87 Fixed: Duplicate Retry attribute breaking build 2019-10-16 21:38:05 +01:00
ta264
7771657135 Fixed: Don't publish self contained tests 2019-10-16 21:24:36 +01:00
ta264
2049034883 Fixed: Make ProcessProvider tests more reliable 2019-10-16 21:24:36 +01:00
ta264
add0d22e56 Fixed: Correct .gitattributes line endings setting
Correctly force checkin LF, checkout OS native
2019-10-15 17:13:16 +01:00
ta264
7d2bce14c0 Bump command timeout 2019-10-14 07:18:42 +01:00
ta264
c919f768d9 Fixed: Handle ratelimit response from acoustid 2019-10-14 07:18:42 +01:00
ta264
c69733a0c9 Fixed: Mock AcoustId responses so tests don't fail when API down 2019-10-14 07:18:42 +01:00
ta264
9f082c849a Fixed: Consistent migration numbering 2019-10-05 22:36:33 +01:00
ta264
b0adb2035e New: Treat compile warnings as errors 2019-10-05 22:36:33 +01:00
ta264
cdf8b1cb5d Fixed: Removed unused files 2019-10-05 22:36:33 +01:00
ta264
2e127d721c Fixed: Remove obsolete HttpProvider 2019-10-05 22:36:33 +01:00
ta264
32ced861a7 Fixed: Remove obsolete Plex HomeTheater/Client notifcations 2019-10-05 22:36:33 +01:00
ta264
9dc87762b7 Fixed: Remove obsolete XBMC HTTP notification API 2019-10-05 22:36:33 +01:00
ta264
3f8b227d76 Fixed: Prevent GetFilesByBasePath matching partial paths
When searching for /test/path it was returning files in /test/path2.
Fix by making sure to search for /test/path/
2019-10-02 21:22:46 +01:00
ta264
ea8d19a513 Fixed: Correctly page through Spotify followed artists 2019-09-25 21:48:42 +01:00
Qstick
f4e4bae465 Fixed: Artist FindById Should Find OldIds 2019-09-25 14:51:00 -04:00
ta264
55e141c44b Fixed: app.config no longer required 2019-09-23 20:04:50 +01:00
ta264
b51b0ef68a New: Make Twitter NetStandard compatible 2019-09-23 20:04:50 +01:00
ta264
3ced1843bf Changed: Remove growl and prowl 2019-09-23 20:04:50 +01:00
ta264
8ae66c17f8 New: Upgrade to ImageSharp beta 7 2019-09-23 20:04:50 +01:00
ta264
f83ceadefc New: Upgrade to netstandard xml library 2019-09-23 20:04:50 +01:00
ta264
c0a0d31fa7 New: Upgrade Ical.Net to 4.1.11 2019-09-23 20:04:50 +01:00
Qstick
5b42c699ea Fixed: Pseudo Release Incorrect Naming
Fixes #987
2019-09-22 17:55:30 -04:00
Qstick
9d60b049fb Fixed: Clean Spotify Refresh Token from Logs 2019-09-22 15:42:33 -04:00
dependabot-preview[bot]
6338d6d2d0 Bump eslint from 6.1.0 to 6.4.0
Bumps [eslint](https://github.com/eslint/eslint) from 6.1.0 to 6.4.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v6.1.0...v6.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-18 20:50:08 -04:00
Qstick
10f2f66ba0 New: FluentAssertions to 5.9.0 2019-09-16 18:14:28 -05:00
Qstick
18e9d3302b New: Update SignalR to 2.4.1, match UI 2019-09-16 18:14:28 -05:00
Rhys Braunschweig
65f098027d Add digits to Deluge's category validator 2019-09-16 18:14:28 -05:00
Taloth Saldono
bd71e71386 Fixed: Copy linux permission mask when moving folder to recycle bin folder
fixes #3161
2019-09-16 18:14:28 -05:00
Qstick
38a590798b New: Add MB Link to add new artist search result
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
965db35db3 Fixed: RARBG links in Interactive Search
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
cce4b97928 New: Add Logging to Windows Setup
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
7717b73fdd Fixed: Recycle bin will clean up files older than 7 days and remove empty folders left behind
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
0ba1bf3eb2 Fixed: noreferrer on frontend images 2019-09-16 18:14:28 -05:00
Taloth Saldono
3743b023f2 Fixed: Root Folder display when free diskspace cannot be determined (FreeBSD)
closes #3275
2019-09-16 18:14:28 -05:00
Taloth Saldono
5333a469b6 Added active detection for updatecheck so we know which os/runtime versions don't need to be supported anymore. 2019-09-16 18:14:28 -05:00
Qstick
006ce9befa New: Update xmlrpcnet to 3.0.0.266 2019-09-16 18:14:28 -05:00
Qstick
9b58611707 Fixed: Cleanup ReleaseProfileModule Compiler Warnings 2019-09-16 18:14:28 -05:00
Qstick
8c9bd6b0d9 New: Update SocksProxy to 1.4.0.1 2019-09-16 18:14:28 -05:00
Qstick
d85cbf5767 New: Update Moq to 4.13.0 2019-09-16 18:14:28 -05:00
Qstick
400705e700 New: Update NUnit to 3.12.0 2019-09-16 18:14:28 -05:00
Qstick
99df2526b4 New: Update NBuilder to 6.0.1 2019-09-16 18:14:28 -05:00
Qstick
36ec118a30 New: Updated NLog to 4.6.6
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
ee0220dfa8 New: Updated FluentValidation to 8.4.0
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
7bd1dea492 New: Updated SharpZipLib to 1.2.0
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Mark McDowall
771ff502fe New: URL Base support for NZBVortex, Hadouken, qBittorrent and uTorrent
Closes #1651
2019-09-16 18:14:28 -05:00
Qstick
70623c320f New: User configurable minimum free disk space
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Mark McDowall
cf4d52a996 Fix NZBGet Delete Status Copy test 2019-09-16 18:14:28 -05:00
Mark McDowall
5111e44984 Fixed: Don't ignore Delete:Copy items in NZBGet 2019-09-16 18:14:28 -05:00
Qstick
3e10c994df Fixed: Minor Cleanup
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Taloth Saldono
ce1da8665f Fixed: Heavy qbit api load when CDH Remove is disabled and Seeding time has been reached
ref #3108
2019-09-16 18:14:28 -05:00
Qstick
747ed0af84 New: Improve logging when checking if release is an upgrade
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Taloth Saldono
a99ee41f38 Fixed: Tag deletion via api if tag is still in use 2019-09-16 18:14:28 -05:00
Taloth Saldono
d41ae7b172 Fixed: Transmission seeding idle time handling 2019-09-16 18:14:28 -05:00
Mark McDowall
82f66685b5 Fixed: Remote path mapping host comparison ignores case
Closes #3169
2019-09-16 18:14:28 -05:00
Qstick
855a8dbf85 Fixed: Errors logged during import when existing episode file is partial removed in the DB
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
jtpavlock
fc2c5b7521 New: Ability to set a post-import label in Deluge, rTorrent, qBittorrent, and uTorrent 2019-09-16 18:14:28 -05:00
Taloth Saldono
a85c6c0a91 Support for primary and fallback download client 2019-09-16 18:14:28 -05:00
Taloth Saldono
1ec5973520 New: Round-robin over available Download Client instead of the first enabled one 2019-09-16 18:14:28 -05:00
Qstick
47f2da9b3d New: Added downloadId filter to history api
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
07fca1b6fc Fixed: Don't double log exception setting file permissions
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Mark McDowall
28b7323d4d Fixed NZBGet tests 2019-09-16 18:14:28 -05:00
Qstick
9f4a74e371 New: Additional information when Lidarr is unable to access a path during import
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Mark McDowall
3872d08534 Fixed: Ignore deleted duplicates from Nzbget
Fixes #1721
2019-09-16 18:14:28 -05:00
Qstick
24e72d3d0f Fixed: Don't import duplicate NFO extra files
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Mark McDowall
0f50a45714 Re-order PMS settings and rename Kodi connection 2019-09-16 18:14:28 -05:00
Qstick
fd563b5fbf New: Register a null target for sentry logs
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
c4fd06949b Fixed: Cleaning percent signs from release names
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
9af59bddfe Fixed: Cleanup InteractiveSearch.js logic
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Mark McDowall
b69a00c6fd Fixed: SSL Certificate validation when port is used
Closes #3039
2019-09-16 18:14:28 -05:00
Mark McDowall
f7addece49 Improve certificate validation registration
Fixed: Certificate validation during startup
Fixed: Errors removing Windows service

Closes #3037
Closes #3038
2019-09-16 18:14:28 -05:00
Mark McDowall
0ef35492bc Fixed: Certificate validation for local IP addresses instead of hostnames 2019-09-16 18:14:28 -05:00
Qstick
94f51cf124 Fixed: Return better error message if username or password is null
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Mark McDowall
dd014b1f52 HTTPS certificate validation options
New: Enable HTTPS certificate validation by default
New: Option to disable certificate validation for all or only local addresses
2019-09-16 18:14:28 -05:00
Taloth Saldono
5d066ed5d4 Continue Test in case of validation warnings. 2019-09-16 18:14:28 -05:00
Qstick
5a1ca9a42f Fixed: Clean more release group names
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
Qstick
c4a4b7abab Changed: Simplified more RegexReplace instances
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-09-16 18:14:28 -05:00
ta264
47f4441c43 Revert 7ffecf6 for ProcessProviderFixture
We already had some Lidarr specific changes that seemed more reliable
2019-09-16 17:48:32 +01:00
ta264
200473408a Fixed: Tidy up mac test setup 2019-09-16 17:48:32 +01:00
ta264
4461ca3080 New: Test more mono versions; do all linux tests in docker 2019-09-16 17:48:32 +01:00
ta264
7050a20df5 Fixed: Integration tests on Mono 5.12 and 5.14
Mono 5.12 and 5.14 has a bug that means RestSharp can't handle non-200
responses.  Fix status api call so tests start and disable the tests
that use non-200 responses on these mono versions
2019-09-16 17:48:32 +01:00
Taloth Saldono
cc008fb21d Fixed: Third-party clients calling api without Accept header 2019-09-14 15:12:15 +01:00
ta264
17c9fc419c New: Update Nancy to 2.0 2019-09-14 15:12:15 +01:00
ta264
425bd8964f New: Update Unity 2019-09-14 15:12:15 +01:00
Qstick
cbff5e1c5a New: RestSharp to 106.6.10
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-09-14 15:12:15 +01:00
Qstick
a5d4d1c6a1 Fixed: All Builds Marked as Production in Sentry 2019-09-14 00:44:17 -04:00
Qstick
459556b344 New: Bump Version to 0.7.1 2019-09-14 00:12:16 -04:00
Qstick
a86e872b76 Merge remote-tracking branch 'origin/master' into develop 2019-09-14 00:11:40 -04:00
Qstick
8612548af9 Changed: Test on Mono 5.0 and 5.4 2019-09-14 00:10:02 -04:00
Taloth Saldono
4136b9ee77 use TestContext.Progress rather than Console.WriteLine for NzbDroneRunner output 2019-09-14 00:10:02 -04:00
Qstick
3c423871d3 Fixed: ImageResizer Tweaks
Co-Authored-By: taloth <taloth@users.noreply.github.com>
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2019-09-14 00:10:02 -04:00
Taloth Saldono
ae6db26a77 Fixed regression in container registration. Additional logging in case of integration test startup failures 2019-09-14 00:10:02 -04:00
Taloth Saldono
4bb6f5d0bc Moved Platform version determination to static 2019-09-14 00:10:02 -04:00
Qstick
7ffecf6c50 Fixed: several failing/flaky mono unit tests
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-09-14 00:10:02 -04:00
Qstick
9711a0cc9c Update README.md with BrowserStack Badge 2019-09-13 22:10:41 -04:00
ta264
805a0859a6 Fixed: ImageSharp crash on old mono 2019-09-13 21:27:58 +01:00
ta264
a75754a8ee New: Run linting in parallel 2019-09-13 21:27:58 +01:00
ta264
4a2276225c New: Run integration tests for various mono versions 2019-09-13 21:27:58 +01:00
ta264
254a8ce64c Fixed: Directory not empty exception deleting nested empty subdirs (#974) 2019-09-13 17:55:12 +01:00
Qstick
dbf81319a1 Merge pull request #967 from lidarr/develop
0.7
2019-09-09 10:16:26 -04:00
Qstick
31cb5fe523 Changed: Version Bump 0.7.0 (#952) 2019-09-09 08:06:49 -04:00
ta264
1b72d9b60f Fixed: NRE importing Spotify saved albums / followed artists (#962) 2019-09-08 21:44:25 +01:00
Qstick
e52013e85a Merge remote-tracking branch 'origin/master' into develop 2019-09-07 20:51:33 -04:00
ta264
a627c2c9ab Changed: Centralize version numbers (#961)
* Centralize version numbers

* Fixed: Run UpdateVersionNumber on Package (For Separate Jobs)
2019-09-07 20:40:23 -04:00
Qstick
075683bbd8 Fixed: Eslint not running due to package.json change 2019-09-07 10:10:06 -04:00
ta264
c4b7e04a96 Fixed: NRE when tagging an album with omitted media 2019-09-05 19:23:01 -04:00
ta264
223d493d05 Fixed: Relax flaky test 2019-09-04 21:29:48 +01:00
Qstick
86f4dcd198 Fixed: Remove Duplicate Function in BlacklistConnector.js 2019-09-03 23:32:46 -04:00
Qstick
33d5f1fe2c Fixed: series reference in PlexServerService 2019-09-02 12:48:38 -04:00
Qstick
3288c21c36 Fixed: Null Ref on Album Cache Update in TrackedDownloadService.cs 2019-09-01 13:57:03 -04:00
Taloth Saldono
91764ec115 Fixed: Removed .Net update notice on Windows LTSB 2015 2019-09-01 13:55:58 -04:00
Taloth Saldono
b880309356 New: Added Auth-* log entries for fail2ban purposes
closes #2760
2019-08-31 17:18:18 +01:00
Taloth Saldono
332466a945 Updated way Sentry gets configured and enabled. 2019-08-31 17:18:18 +01:00
Taloth Saldono
ec4237d51a Added BuildInfo.AppName to centralize 'Lidarr' 2019-08-31 17:18:18 +01:00
Taloth Saldono
26c8768931 New: Removed libcurl http fallback since mono 5.16+ doesn't need it. Also bumped minimum mono version check to 5.16 (5.20 is the best choice atm) 2019-08-31 17:18:18 +01:00
Qstick
1425bc8bd9 New: Seperate Naming for Multi-Disc Albums 2019-08-31 11:01:44 -04:00
ta264
4edad5f563 Fixed: Actually fix skipping analyze on fork 2019-08-30 06:52:47 +01:00
Qstick
fba841572e New: Last UI Patch Package bump for 0.7 2019-08-29 22:04:50 -04:00
Qstick
8242315e59 Fixed: Regenerate Yarn.lock for secondary package updates 2019-08-29 21:55:24 -04:00
ta264
91ddabe5dd Fixed: Catch exceptions looking up fingerprints
It's not crucial so if it fails don't take out the whole import process.
2019-08-29 19:35:21 +01:00
ta264
2097bfff94 Fixed: Null reference exceptions on update
Simplify entity equality code and enfore db/metadata split

Use a nuget package to remove boilerplate code that needs careful
update when adding/removing fields.  Add tests to enforce that all
fields are allocated to 'UseMetadataFrom' or 'UseDbFieldsFrom' to make
metadata refresh more foolproof.

Fix NRE when tracks are merged because artist wasn't set.
Fix NRE when tracks are merged and the merge target wasn't yet in the database.
2019-08-28 19:03:26 +01:00
ta264
c4578c0b0f Fixed: Don't run analyze on forks
It fails due to requring secrets not available on forked PRs
2019-08-27 21:36:05 +01:00
Qstick
232273c4dc Fixed: Manual Import Tracks Sorted Wrong
Fixes #848
2019-08-25 18:09:51 -04:00
ta264
ad4d7e4cfd New: Use ImageSharp for resizing (#934)
* New: Swap to ImageSharp for image resizing to avoid leaks

Stop resizing album images also

* Fixed: MediaCoverModule falls back to fullsize for png and gif too

* Fixed: Look for all image extensions in DeleteBadMediaCovers.cs
2019-08-25 15:46:19 -04:00
Qstick
070e50d39e Fixed: Fix a few compiler warnings 2019-08-25 14:37:08 -04:00
ta264
4413c7e46c New: Unmapped files view (#888)
* New: Unmapped files view

Displays all trackfiles that haven't been matched to a track.
Generalised the file details component and adds it to the album
details screen.

* Add sorting by quality

* New: MediaServiceTests & MediaRepoTests
2019-08-25 11:49:30 -04:00
Mark McDowall
74cb2a6f52 Fixed: Waiting a long time for unavailable root folders
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 01:24:56 -04:00
Qstick
05b25429dc New: Show Hardlink/Copy in manual import
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 01:20:41 -04:00
Mark McDowall
4399724e97 New: Sort preferred words in profile on save
Closes #3241
2019-08-25 01:19:01 -04:00
Mark McDowall
b7458f6d9c Menu fixes
Fixed: Menus in modals on iOS
Fixed: Menu not closing on outside touch on mobile
2019-08-25 01:17:43 -04:00
Mark McDowall
e555d790e6 Fixed: Scrolling of modals with tabular content in iOS
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 01:17:11 -04:00
Qstick
87cb97407a Fixed: Prop type warning on MenuItem
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 01:11:22 -04:00
Qstick
60df3d78b4 Fixed: Track Progress custom filtering on artist index page 2019-08-25 01:09:57 -04:00
Qstick
936b2502cc Fixed: Multiple Heath Check UI Fixes
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 01:07:11 -04:00
Qstick
89d912bb2b Fixed: Prevent moving to recycling bin causing a failed import
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 01:01:11 -04:00
Mark McDowall
699f19b352 New: Cleanup Recycling Bin folders older than X days (0 to disable)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 00:58:59 -04:00
Qstick
0496e6afc2 Fixed: Repack don't being grabbed when cutoff already met
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 00:48:02 -04:00
Qstick
a7e94a0b2a New: Add warning that recycle bin will be cleaned up automatically after 1 week
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-25 00:39:50 -04:00
Qstick
c20db82b77 Bump sentry-js from 5.5.0 to 5.6.2 2019-08-25 00:35:25 -04:00
Qstick
32063fe9c6 Bump del from 5.0.0 to 5.1.0 2019-08-25 00:31:03 -04:00
Qstick
01f6d247c1 Bump react-popper from 1.3.3 to 1.3.4 2019-08-25 00:26:57 -04:00
Qstick
16dce1d77d Bump react-dnd from 9.3.2 to 9.3.4 2019-08-25 00:25:38 -04:00
dependabot-preview[bot]
e9160a5956 Bump css-loader from 3.1.0 to 3.2.0
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/webpack-contrib/css-loader/releases)
- [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/css-loader/compare/v3.1.0...v3.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-24 19:09:05 -04:00
Qstick
bcc6fae9cc Fixed: Retry flaky tests 3 times before failure 2019-08-24 18:54:54 -04:00
dependabot-preview[bot]
fbe6143c6f Bump file-loader from 4.1.0 to 4.2.0
Bumps [file-loader](https://github.com/webpack-contrib/file-loader) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/webpack-contrib/file-loader/releases)
- [Changelog](https://github.com/webpack-contrib/file-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/file-loader/compare/v4.1.0...v4.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-24 17:52:21 -04:00
Qstick
2982bba451 Fixed: Remove other unneeded gitattributes
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-08-24 17:31:58 -04:00
Qstick
edba53181f Fixed: Don't fail on frameworks 4.7 and up
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-08-24 17:31:58 -04:00
ta264
f1fc45fa99 New: Migrate to new csproj format 2019-08-24 17:31:58 -04:00
ta264
e095fe00af Fixed: Delete unreferenced files 2019-08-24 17:31:58 -04:00
Qstick
ca6ff0d067 Fixed: Move migration dispose after try 2019-08-24 15:45:55 -04:00
Qstick
db321a5d1e Changed: Rename Process and Service Provider Fixtures 2019-08-24 15:45:55 -04:00
ta264
1a0b95de03 Fixed: Make ProcessProviderTests less flaky 2019-08-24 15:45:55 -04:00
ta264
ee7d47d044 Fixed: All the tests 2019-08-24 15:45:55 -04:00
ta264
9392c13364 Fixed: ReleasePush module returns single item not a list 2019-08-24 15:45:55 -04:00
ta264
e2e321b9be Fixed: Removed unused ManualImport Field 2019-08-24 15:45:55 -04:00
ta264
1fdfa3fac5 Fixed: Mac Packaging 2019-08-23 07:45:08 +01:00
ta264
36f51c7e72 Update SQLite to 3.28.0 and System.Data.SQLite to 1.0.111.0
Also replace 32bit dylib with 64bit version so it's actually used.
2019-08-23 07:44:31 +01:00
ta264
83c8d85d75 Fixed: Refreshing artist/album details shows 404 until store loads 2019-08-18 20:28:38 +01:00
RandomNinjaAtk
d929572beb Fixed: Change UI Genre Tag Separator from ", " to " / " (#918)
For MP3's, the official separator is " / " and this also works for FLAC. Some applications like Kodi, do not recognize ", " as a separator, but changing it to " / " resolves that...
2019-08-17 08:35:53 +01:00
ta264
0352f8d3ff Fixed: Faster artist endpoint (#874)
* Fixed: Speed up AllArtist API endpoint

* New: Display UI before artists have loaded

* Add test of new repository methods
2019-08-17 08:04:59 +01:00
Qstick
698d5e1cf5 Fixed: SonarCloud Backend Version being set to 1.0 2019-08-17 02:04:07 -04:00
Qstick
09bc1138b9 Fixed: Exclude API from coverage calculation 2019-08-17 00:55:18 -04:00
Qstick
c4a067751a Fixed: Artist Type can be null/blank 2019-08-15 22:27:55 -04:00
Taloth Saldono
aa794a7155 Fixed: Workaround for mono 5.16+ bug preventing the closure of sockets on timeouts (Jackett connections)
ref #2802
2019-08-15 22:18:39 -04:00
dependabot-preview[bot]
cacb31d0d6 Bump core-js from 3.1.4 to 3.2.1
Bumps [core-js](https://github.com/zloirock/core-js) from 3.1.4 to 3.2.1.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/compare/3.1.4...v3.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-14 22:22:04 -04:00
Qstick
6f884fb59d Fixed: Seperate Analysis Front/Back, Combine with coverage 2019-08-14 15:42:54 -04:00
Qstick
da99cf5a1c Map sentry org variable into correct format 2019-08-13 18:55:38 -04:00
ta264
f2cc5adc0b Fixed: Sentry source map upload 2019-08-13 19:52:42 +01:00
Qstick
6932046c5f New: Set up CI with Azure Pipelines (#897)
* Set up CI with Azure Pipelines

[skip ci]

* Remove Travis, Build Multiple Environments

* Change Task Type to Bash

* Checkout submodules

* Remove Appveyor Tests, Add Azure Tests

* Oops Forget Steps

* bad name

* test script fixes

* add tests to build job

* fixup tests

* name test runs

* fpcalc and artifacts

* Try to fix installer

* Publish separately

* Try publish

* Another go at artifacts

* Tidy up

* Add sentry, assembly info patching and bump version

* Only patch one AssemblyInfo; set node version 10

* Try pipeline artifacts again

* Tidy up - pipeline artifact seems to be way forward

* Fix installer publish

* first go at test job seperation

* job names and depends/consitions for tests

* pusblish single file test artifact

* pipeline artifact for test

* blitz the pattern filter

* windows test jobs

* mac tests, checkout on test jobs

* try to download build artifact to test job

* download and extract artifact

* Set LD_LIBRARY_PATH and print some sqlite debug info on mac tests

* fixup! tests

* integration test fixes

* fixup! integration test fixes

* fixup! integration test fixes

* more fixup

* use bash cp

* test fixups

* mkdir before copy

* linux works! add osx integration tests

* im tooo tired

* coverage attempt

* coverage seperate stage

* windows paths for integration test

* switch coverage to windows where opencover actually works

* fix test script

* one last go

* Simplify installer, try to fix name

* Try to parallelize backend and frontend build

* Try adding a matrix

* Try matrix jobs not stages

* Try to fix package step

* Remove opencover install

* Try to fix tests

* coverage fixes

* revert build.sh changes

* triggers so we don't double build

* Publish coverage package so we can debug

* try coverage no build, output artifact

* use the full pipeline workspace from build job

* fix automation tests for new ui

* Assorted fix attempts

* Another go

* MacOS debug

* Tidy up, try to fix mac

* Fix mac fpcalc, add mac integration tests

* Add cross platform automation tests

* Fix packages

* Try to fix Automation tests

* Don't wait on the installer to create standard packages

* Fixes

* delete logentries reference

* run automation tests in headless mode

* try install firefox mac

* Revert "try install firefox mac"

This reverts commit 4684bb19018747cb00407e1d8df64391f44f5183.

* test sonarcloud prepare outputs

* basic analyze and upload

* don't limit fetch depth on analyze

* manual scanner do front and backend?

* full analyize with tests, coverage

* should depend on tests, coverage

* no need for condition on coverage

* Fix up build numbering

* Try to fix sonar

* Separate coverage calculation and publication

* Try to fix coverage upload
2019-08-13 13:15:59 -04:00
Qstick
72947029f4 Fixed: Other Misc Improvements
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
2366ce0931 New: Add root folder from Media Management settings
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
d41a10df21 Fixed: Actions on mobile not indicating when they are disabled
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
a09611a580 Fixed: Modal scrolling causing app to scroll on iOS
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
2273be5afd Fixed: Edit path on artist index resetting cursor to end on change
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
d6b210a4c9 Fixed: column widths in Interactive Search
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
c8184c362a Fixed: Sorting of Quality column in Interactive Search
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
8440675ad9 Fixed: Canceling editing a custom filter won't close the Custom filter modal
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
07ecd824ea Fixed: Tags in settings getting cutoff
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
b8377739b4 Fixed: Add tooltip to tag delete button when in use
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
efdf2fb41a Fixed: tag input alignment and height
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
0491358b72 Fixed: Set min-width for Actions Column in Index 2019-08-09 23:19:58 -04:00
Qstick
b6276600ce New: Add warning to remove from queue dialog
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
3d0adf8a60 Fixed: Darker border for calendar
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
593259b1c0 New: Wider and taller scroll bar for the click to scrollers out there
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
dc6621ee06 New: Improve help text for extra file importing
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
52ec4c4a66 New: HintedSelectInput Component
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
9ca81eb320 Fixed: Issue searching for artist in the UI when tag is removed 2019-08-09 23:19:58 -04:00
Qstick
68e11a5e56 Cleanup: Remove old twitter keys 2019-08-09 23:19:58 -04:00
Qstick
fd2fb7da20 New: Extra warning for Windows Service issues when prompted to restart 2019-08-09 23:19:58 -04:00
Qstick
ba5e80077c Fixed: Update base .editorConfig 2019-08-09 23:19:58 -04:00
Qstick
413819ae28 Fixed: Finetuned color-impaired mode styling in Calendar
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
5e3a0e2cd7 Fixed: Conditional Rendering on Page Jump Bar
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
cf1210a7f9 New: Bulk Select Quality Interactive Import
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-08-09 23:19:58 -04:00
Qstick
c673058a10 New: Update Frontend Packages 2019-08-09 23:19:58 -04:00
Qstick
03aceb3568 Fixed: Repack logging string format 2019-08-08 19:27:47 -04:00
ta264
1ab8c5a7bb Fixed: Embedding album art on import
On import the album release is adjusted, which triggers an
AlbumEditedEvent which in turn coverts media cover urls to local
urls.  The addition of ?lastWrite=xxx broke the calculation of
extenions from the URL.  To fix, only set the extension and don't
update the extension if url is changed.
2019-08-08 22:04:33 +01:00
ta264
c898a18d31 Fixed: Set remote album ID so we don't always think album updated 2019-08-03 15:04:19 +01:00
ta264
1dcccf2683 Fixed: Frontend updates when selected album release changed 2019-08-03 15:04:19 +01:00
ta264
dcca2b5a1a Fixed: Don't re-read file tags if possible 2019-08-03 15:04:19 +01:00
ta264
e9ced07b28 Fixed: Old foreign id query too permissive 2019-08-03 15:04:19 +01:00
ta264
5f679c5f58 Fixed: Speed up track grouping
Don't repeatedly calculate base directories and use simpler path
equality since we know paths come from the same source.
2019-08-03 15:04:19 +01:00
ta264
3c1b3434c7 Fixed: Build on mono 6
Removed LogEntries which is unused
2019-08-03 14:40:34 +01:00
ta264
54e19d5552 Use previous ubuntu appveyor image (#880) 2019-08-02 18:11:29 -04:00
ta264
a35f965d31 New: Write genres and album art to track file tags 2019-08-02 19:25:14 +01:00
ta264
a0a96911f8 Fixed: Use correct ID to search for Albums 2019-08-02 19:22:21 +01:00
ta264
8d780f4057 Fixed: Don't force images to JPG and fix Kodi album art filenames 2019-08-02 13:03:00 +01:00
Qstick
8b860bcb82 Changed: Remove Language Profiles (#870)
* Changed: Remove Language Profiles

* fixup! Changed: Remove Language Profiles

* fixup! Changed: Remove Language Profiles

* Remove unused method in FileNameBuilder

* Fixed: Cleanup Int Converter Copy/Paste Issues and Grammar
2019-08-02 07:50:09 -04:00
Qstick
8f791abbf6 Fixed: Really Don't treat NZBs rejected by SABnzbd as successful 2019-08-01 23:08:25 -04:00
ta264
ba310fe66b New: Sort import list groups 2019-07-29 18:37:38 +01:00
Qstick
af26ac849a New: Group Import Lists by Type 2019-07-29 18:37:38 +01:00
ta264
fb26ff286d New: Bump Newtonsoft.Json to 12.0.2 2019-07-29 18:37:38 +01:00
ta264
d075ea3625 New: Spotify integration
Import playlists, followed artists and saved albums
2019-07-29 18:37:38 +01:00
Qstick
2f1290d488 Fixed: Correctly handle Repack Releases 2019-07-27 13:14:51 -04:00
ta264
23316329ed New: Allow monitoring all albums for import list artist 2019-07-27 18:01:48 +01:00
ta264
8e777025cb Proposal: Length is definitive, fallback to modified if no length 2019-07-27 10:57:13 -04:00
Qstick
2be52c22d6 Fixed: Backup Mediacover Existing Check to Length if No Modified Date 2019-07-27 10:57:13 -04:00
Qstick
802f7f96c0 Fixed: Follow Temp Redirects 2019-07-27 10:57:13 -04:00
Mark McDowall
361908d431 Fixed: Loading of fonts.css with a URL Base
Fixes #854
2019-07-27 15:15:33 +01:00
ta264
814e44b7e4 Fixed: Actually refresh media covers 2019-07-27 07:31:47 +01:00
ta264
61b6572f61 Fixed: Failure re-adding a deleted artist 2019-07-27 07:31:47 +01:00
ta264
5b4ab75220 Fixed: Add timeout to fingerprinting API request 2019-07-27 07:31:47 +01:00
Qstick
5defb69eb6 Fixed: Tracked Download Cache Keeps Deleted Albums (#811)
* Fixed: Tracked Download Cache Deleted Albums

* Add a test
2019-07-26 17:21:03 -04:00
Taloth Saldono
2147c52695 Added test for turkish FirstCharToUpper 2019-07-25 13:39:35 +01:00
Taloth Saldono
43f70d5464 Added test for turkish FirstCharToLower 2019-07-25 13:39:35 +01:00
Mark McDowall
2ce0fadb65 Clean up FirstCharacterToLower extension + tests 2019-07-25 13:39:35 +01:00
Mark McDowall
91082b2903 New: Testing Custom Script executes the script and verifies the exit code 2019-07-25 13:39:35 +01:00
Mark McDowall
b9d240924f New: Command line arguments for Custom Scripts are no longer supported 2019-07-25 13:39:35 +01:00
Mark McDowall
b8b8f064c7 FirstCharToLower 2019-07-25 13:39:35 +01:00
ta264
77d02a03a0 Add artist refresh completed event
Always fires unlike update, which only fires on actual update.  Use
this to make sure media covers are up to date on refresh
2019-07-24 19:34:27 +01:00
ta264
8160f3d84a Fixed: Simplify ArtistMetadataRepository 2019-07-24 19:34:27 +01:00
ta264
0b7a42ee3b New: Refactor metadata update 2019-07-24 19:34:27 +01:00
ta264
f5c1858d4c Fixed: UpdateAlbums was a duplicate of UpdateMany 2019-07-24 19:34:27 +01:00
ta264
76db27e8c2 New: Add old ids, artist aliases and genres 2019-07-24 19:34:27 +01:00
ta264
5ac46270ed New: Set KeepAlive for metadata requests 2019-07-24 19:34:27 +01:00
ta264
343b27b886 Fixed: Update modified times as well as sizes 2019-07-21 07:35:56 +02:00
ta264
dc44bbd210 Fixed: ManualImport sets file size and last modified
So that manually imported files get filterd out by the unchanged files filter
2019-07-21 07:35:56 +02:00
Qstick
9143bb4a7c Fixed: Queue tooltips appearing offscreen on mobile devices
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-07-20 23:48:58 -04:00
Qstick
5dddae5d02 Fixed: Mass Editor not showing delete button on narrow screens 2019-07-20 23:48:58 -04:00
Qstick
568c864d2f Fixed: tag input height not growing in height 2019-07-20 23:48:58 -04:00
Qstick
5a8b303f80 Fixed: Fetch Artists on SignalR Reconnect to prevent Store issues 2019-07-20 23:48:58 -04:00
Qstick
a436692d06 Fixed: Remove faulty fetch command (never worked) 2019-07-20 23:48:58 -04:00
Qstick
4762c73149 Fixed: oAuth actions in UI
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-07-20 23:48:58 -04:00
ta264
da2b36514a Fixed: Prevent two TypeExclusive commands running at once
The check was bypassed if a disk access command was running at the
same time.
2019-07-20 13:38:07 +02:00
ta264
368363de96 Fixed: Prevent two Artists pointing to same ArtistMetadata 2019-07-20 13:38:07 +02:00
ta264
531447a21f Fixed: Relax flakey cache test 2019-07-17 06:28:30 +01:00
ta264
b62e27634a Disable failing parser test 2019-07-17 06:28:30 +01:00
ta264
a9bf2910dc Fix WebClient test on Mono 2019-07-17 06:28:30 +01:00
ta264
93f7acfd32 Fixed: Update service test 2019-07-17 06:28:30 +01:00
ta264
736fddd0d8 Fixed: Failing skyhook search test
New search server with dismax parser will match EF
2019-07-17 06:28:30 +01:00
Taloth Saldono
84f707c51b Removed Nyaa Integration tests and increased logging detail during integration tests. 2019-07-17 06:28:30 +01:00
ta264
59b40bd032 Fixed: one_to_one test if system timezone isn't UTC 2019-07-17 06:28:30 +01:00
ta264
a98d45d3de Fixed: Failing ServiceProvider test 2019-07-17 06:28:30 +01:00
ta264
2768fce0a4 Fixed: Failing Process provider test 2019-07-17 06:28:30 +01:00
ta264
2284313d4d Fixed: Failing update test on Linux 2019-07-17 06:28:30 +01:00
ta264
ea2e8e499d Fixed: Failing history test 2019-07-17 06:28:30 +01:00
ta264
2c0d272c54 Fixed: Removed failing test no longer in Sonarr
As far as I can tell you wouldn't expect this to pass.  Setting the
path is handled by AddArtistService, not ArtistService.  This file is
present in the Sonarr tree but not included in the project.
2019-07-17 06:28:30 +01:00
Qstick
abe4c803b9 New: Update lodash, rebuild yarn.lock 2019-07-16 21:05:55 -04:00
Qstick
659844eeba New: Don't Execute Certain Command Types In Parallel (#855) 2019-07-14 17:17:00 -04:00
ta264
b4fc4e88a5 Fixed: UseRealHttp following addition of MetadataRequestBuilder 2019-07-10 06:21:00 +01:00
ta264
12b73830d3 New: Moq to 4.12 2019-07-10 06:21:00 +01:00
Qstick
6dd8df43ca Fixed: Incorrect parsing of APE and OPUS in some cases
Fixes #847
2019-07-06 18:22:12 -04:00
Qstick
9a240727ed Fixed: Error when deleting artist from poster list
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-07-06 17:48:07 -04:00
Qstick
a006ce88f6 Fixed: Manual import showing error when a different artist is selected
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-07-06 17:48:07 -04:00
Qstick
9aa049fc04 Fixed: URL base of /artist linking to the wrong path in some cases
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-07-06 17:48:07 -04:00
ta264
447bf63a4d Fixed: Correctly delete trackfiles on AlbumDeletedEvent
GetFilesByAlbum performs a join on the album releases under the hood,
which won't be populated once the album is deleted.  Fix by providing
a special delete method which omits the join and just looks at albumId.
2019-06-27 12:39:56 +01:00
Qstick
3ebbf6ff83 Fixed: Multiple SignalR Improvements
Support for serverSentEvents, connection optimizations

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-06-19 23:03:08 -04:00
Qstick
184ab745ae Fixed: Only fix cleanName when fix is needed
Avoid hitting DB for every artist on clean name housekeeper

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-06-19 22:52:20 -04:00
ta264
ace83498cd Fixed: Don't show cmd.exe window when fpcalc runs 2019-06-19 08:26:51 +01:00
Devin Campbell
b52538c54f Update ConfirmImportModalContent.js (#836)
Slight grammar issue
2019-06-19 07:37:37 +01:00
Qstick
d7f63abe01 New: Option to use HTTPS with Emby 2019-06-11 22:44:49 -04:00
Qstick
6f588d23fd New: Detect mergerfs mounts 2019-06-11 22:40:35 -04:00
Qstick
12cc2ef95a Fixed: Manual import of unknown aritst items in Activity: Queue 2019-06-11 22:38:33 -04:00
Qstick
d7e465d2d7 Fixed: Improve exception logging when unable to connect to Plex 2019-06-11 22:35:39 -04:00
Qstick
5d13ae5ae6 Fixed: Use Download Client name for grabbed history events 2019-06-11 22:33:06 -04:00
Qstick
8a8799176f New: Setting monitor None when adding arist will unmonitor artist 2019-06-11 22:28:57 -04:00
ta264
8cd9ab4a9f Add: option to skip automatic redownload when removing from queue (#734)
* Add: option to skip automatic redownload when removing from queue

* Add tests for RedownloadFailedDownloadService

* Fix formatting

* Make re-download dialog conditional
2019-06-10 19:56:44 +01:00
ta264
0f6a3bca0c New: Sentry to 1.2.0 2019-06-10 11:38:34 -04:00
Qstick
5efbcaa967 Fixed: Test Due to 4.6.2 Error Change 2019-06-10 11:38:34 -04:00
Qstick
cead8c9ddb Changed: Update CONTRIBUTING.md for 4.6.2 2019-06-10 11:38:34 -04:00
Qstick
673412c446 Fixed: Remove Unused Variables to Clear Compiler Warnings 2019-06-10 11:38:34 -04:00
Qstick
4eb815aa0e New: Migrate to PackageReference Format 2019-06-10 11:38:34 -04:00
Qstick
43a18de846 New: ImageResizer to 4.2.5 2019-06-10 11:38:34 -04:00
Qstick
5ae1ab14f7 New: AutoMoq to 2.0.0 2019-06-10 11:38:34 -04:00
Qstick
32307ac5e7 New: Update Unity to 4.0.1 2019-06-10 11:38:34 -04:00
Qstick
b5d502bd5d Fixed: Long Path Support on Mono and .Net 2019-06-10 11:38:34 -04:00
Qstick
70155cae18 New: Target .net 4.6.2 2019-06-10 11:38:34 -04:00
Qstick
c40cda3101 New: Bump SignalR to 2.4.1 2019-06-10 11:38:34 -04:00
Qstick
c1e1741957 Fixed: MediaFileTableCleanup Test Failing 2019-06-09 18:11:50 -04:00
ta264
166fc90454 New: Only scan files that are new or updated (#760)
* New: Only scan files that are new or updated

Pass through filter correctly

Add more tests

Add tests for migration 30

* Fix windows disk provider

* Don't publish deleted event for unmapped file

* Fix test on windows
2019-06-08 15:13:58 -04:00
Qstick
8fe8aec97c Fixed: Its not It’s in DeleteArtistModal 2019-06-02 10:30:52 -04:00
Qstick
b3a20e9e0b New: Change PastDays and FutureDays for ICal Feed in UI
Makes #817 easy
2019-06-01 16:48:44 -04:00
Qstick
5c81f12136 Create FUNDING.yml 2019-06-01 15:35:16 -04:00
Qstick
00a0bf6cb6 Fixed: Typo in ArtistDetails creates TypeError
Fixes LIDARR-UI-1FY
2019-05-11 00:16:18 -04:00
Qstick
cf40df7606 New: Replace react-tether with react-popper (#789) 2019-05-10 21:56:04 -04:00
Qstick
6ea7f97b16 Changed: Version Bump 0.6.2 2019-05-10 21:26:54 -04:00
Qstick
59bb164bb5 Fixed: Trailing Space in ArtistSearchResult killing build 2019-05-09 20:18:47 -04:00
Qstick
4a8d01f33e Fixed: Don't use "Ended" for people
Fixes #798
2019-05-09 19:46:38 -04:00
Qstick
b2d87cccb2 Fixed: _coverMapper is null for other album entities 2019-05-09 18:51:56 -04:00
ta264
adfaec3864 Fixed: Fingerprinting service swallows UnexpectedHtmlContentException (#808) 2019-05-08 16:37:38 +01:00
ta264
d381bab9d9 New: Fetch all albums from metadata and filter client-side (#803)
* Retrieve all albums from metadata and filter client-side

Should significantly increase the proportion of artist requests hitting
cloudflare cache

* Add tests for album filtering
2019-05-08 15:06:29 +01:00
ta264
801ece337c Fixed: Map dsm shared folder to full path in status (#797)
* Fixed: Map dsm shared folder to full path in status

* Add tests
2019-05-08 06:06:05 +01:00
Qstick
add32ff9f3 Fixed: Lidarr Lists use correct metadata server (#800) 2019-05-07 19:11:34 -04:00
Qstick
35c19dac5f Fixed: Cache Album covers local (#780)
* Fixed: Cache Album covers local

* Fixed: Maxsize is handled by the backend mapping

* Fixed: Store Album covers seperate from ArtistId
2019-05-07 19:10:09 -04:00
stephanrenggli
bcdef2723f New: Added support for Gotify notifications (#730)
* Added support for Gotify notifications

* Removed non-supported features and adjusted priorities

* Use string interpolation to build url

* Rename a few variables and improve Url validation

* Improve building of the Url, move validation to Gotify.cs (adapting changes by markus101 over at Sonarr)

* Move validation from GotifyProxy.cs to here (adapting changes by markus101 over at Sonarr)
2019-05-05 00:08:32 -04:00
Qstick
e9dfdab907 New: Use NZBget's FinalDir if set by post-processing script 2019-05-04 23:10:13 -04:00
Qstick
970d46512e Fixed: Don't treat NZBs rejected by SABnzbd as successful 2019-05-04 23:09:24 -04:00
Qstick
499ec06664 Fixed: Throw Startup Exception on Same Port for SSL 2019-05-04 20:28:48 -04:00
ta264
4093a4f846 Swap to lidarr taglib fork (#786) 2019-05-04 03:50:23 +01:00
ta264
541841d7b7 Don't try to match a null codec name (#784)
* Don't try to match a null codec name

* Add test
2019-05-01 06:42:01 +01:00
Qstick
1955cd9f73 Fixed: Improve performance of search input selector 2019-04-28 14:00:25 -04:00
Qstick
a3e955443d New: Output Path column in Queue 2019-04-28 00:32:38 -04:00
Qstick
e4f1e5d376 Fixed: Backup path URL incorrect in some cases 2019-04-28 00:25:23 -04:00
Qstick
4aeaf04b62 Fixed: Don't allow HTTPS to be set to same port via API/UI 2019-04-28 00:19:38 -04:00
Qstick
6508920449 New: Make Backup folder a Path input
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-04-28 00:11:00 -04:00
Qstick
c5d980d7b2 New: Sort preferred words by score when displaying in the UI
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-04-28 00:10:31 -04:00
Qstick
7cf39e6a30 Fixed: UI Selector, Rendering Improvements 2019-04-27 23:45:59 -04:00
Qstick
38723d0753 New: Bump jQuery to 3.4.0 2019-04-27 22:59:28 -04:00
Qstick
edeb3e44ff New: Use Fuse.js for UI header search 2019-04-27 22:54:13 -04:00
ta264
5d1a5ee946 Remove rogue . from transmission output directory 2019-04-27 16:53:48 +01:00
Qstick
2b342bdd95 Fixed: Add Placeholder to tracks table for correct rendering 2019-04-25 21:39:17 -04:00
Qstick
6da224bfc4 Changed: RIP Nzbs.org 2019-04-25 21:30:33 -04:00
Qstick
872d65ad1a Fixed: Roxsbox ArtistImages using AlbumImages Setting, Returing null
Fixes LIDARR-1S3
2019-04-22 21:06:16 -04:00
Qstick
ea3534b204 Fixed: Queue fails when sorting by Album columns with null Albums
Fixes #771
2019-04-22 20:08:09 -04:00
Qstick
a4a3bc5127 New: Don't overwrite Images/Overviews if new is blank 2019-04-22 16:29:15 -04:00
Qstick
e998f9c029 New: Send Bits and SampleRate to UI for TrackFiles 2019-04-22 16:28:25 -04:00
Qstick
6057127ec0 Fixed: Return empty intead of 0bits if AudioBits is 0 2019-04-22 16:28:25 -04:00
Qstick
d71f7e5d35 Fixed: SampleRate Format doesn't include decimal 2019-04-22 16:28:25 -04:00
Qstick
b0faaef777 New: Unit Tests for MediaInfo Tokens 2019-04-22 16:28:25 -04:00
Qstick
0c6cc4acdb New: AudioBitRate Naming Token 2019-04-22 16:28:25 -04:00
Qstick
8f29536187 Changed: Version Bump 0.6.1 2019-04-15 21:03:21 -04:00
ta264
045a3ce404 Fixed: Skip albums and releases with no valid tracks (#754)
* Fixed: Artist only marked as refreshed if Albums/Tracks refreshed also

* Fixed: Skip album releases with no valid tracks

* Fixed: Don't add albums with no valid releases

* Fixed: Remove Albums with no valid releases
2019-04-15 20:52:43 -04:00
ta264
af88b3f807 Fixed: Ensure Tracks is always present in ManualImportItem
Fixes error in manual import page when Tracks is missing.

Fixes Sentry LIDARR-UI-1GC
2019-04-15 21:12:32 +01:00
Qstick
1212578c45 Fixed: Migration 23 doesn't set Track.ArtistMetadataId (#756) 2019-04-15 12:31:19 -04:00
ta264
59cc5584c6 Fixed: Slower startup loop on DB initialization failure
Wrap any exception thrown in a LidarrStartupException to trigger the
existing bootloop code.

We have to catch the generic Exception class since FluentMigrator
rethrows all exceptions as a generic Exception.
2019-04-14 16:28:04 +01:00
Qstick
d7e406dccb Fixed: Artist history modal showing incorrect event title 2019-04-14 00:14:31 -04:00
Qstick
3739c90dd3 Fixed: Update Contributing.md Instructions 2019-04-13 23:19:37 -04:00
Qstick
43f297099e Fixed: Change RelativeDateCell to PureComponent 2019-04-13 23:05:04 -04:00
Qstick
9002dd67e1 Fixed: Don't render table options modal content when it's closed 2019-04-13 23:02:05 -04:00
Qstick
909140988f New: Release title column in queue table 2019-04-13 22:58:11 -04:00
Qstick
77293cf8ae Fixed: Don't worry about qBit parameters if category is blank 2019-04-13 22:55:30 -04:00
Qstick
cfcc5b13e4 Fixed: Include all items if no category is specified in rtorrent 2019-04-13 22:54:25 -04:00
Qstick
f3573d4deb Changed: More descriptive message if indexer test yielded no results 2019-04-13 22:41:35 -04:00
Qstick
016ec00fcd Fixed: History details for unknown event type 2019-04-13 22:15:43 -04:00
Qstick
63253bf9e3 Fixed: Collapse calendar view buttons on smaller screens 2019-04-13 22:13:30 -04:00
Qstick
b258fc2e1d Fixed: Refresh on artistIndex spins forever 2019-04-13 22:08:35 -04:00
Qstick
8f7df83f58 New: Bump Version to 0.6 (#726) 2019-04-11 22:06:30 -04:00
Qstick
600a5b194f Fixed: API Exception Error format 2019-04-11 21:58:02 -04:00
Qstick
117a3970e8 Fixed: Ensure loading message doesn't change on re-render 2019-04-11 21:52:05 -04:00
Qstick
3e3c644cbb Fixed: ReleasePush Validation should use Protocol 2019-04-11 21:48:08 -04:00
Qstick
d17e7cb13b Fixed: Nullref due to InfoHash on AlreadyImportedSpec 2019-04-11 21:15:43 -04:00
ta264
7b288bfcd3 Fixed: Album API query by foreignId only returns requested album
Setting the new 'includeAllArtistAlbums' will give the existing
behaviour of returning all albums for that artist
2019-04-11 16:37:40 +01:00
ta264
11c0f1dad2 Fixed: Reinstate foreignArtistId for album lookup API 2019-04-11 16:37:40 +01:00
ta264
6a414cff14 Fixed: Artist/Album lookup endpoints display error on failure 2019-04-11 16:37:40 +01:00
ta264
f2a1100d95 Keep mono PDBs, don't try to copy missing dll.config (#736) 2019-04-08 19:23:46 +01:00
ta264
b1aff8fe58 Fixed: RemotePathMappingCheck ignores all download client exceptions (#735) 2019-04-08 18:24:13 +01:00
Qstick
11eaa58c1c Fixed: Highlight currently install version of Lidarr in Updates 2019-04-06 22:50:53 -04:00
Qstick
5643923299 Fixed: Reverted in-memory signalr keypair in favor of a .config directory (#722) 2019-04-06 22:22:19 -04:00
Qstick
c390fff361 New: Associate same AnonToken with Sentry UI instance (#724) 2019-04-06 22:22:05 -04:00
Qstick
9d27fff825 Fixed: Don't Error to New Page on Failed Login 2019-04-06 22:18:45 -04:00
Qstick
d81b063388 Fixed: Don't throw error on Docker Update Attempt (#725) 2019-04-06 17:06:23 -04:00
Qstick
ec780c310c Fixed: ArtistIndex selector improvements 2019-04-06 00:36:26 -04:00
Qstick
0db28d4ea2 Fixed: Store columns for History table between refreshes
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-04-06 00:36:26 -04:00
Qstick
7bd96ae75c Fixed: Re-Clean Release Endpoints, we have ReadResourceFromRequest! 2019-04-06 00:36:26 -04:00
Qstick
f0365eaaa7 Fixed: Error displayed occasionally after removing artist
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-04-06 00:36:26 -04:00
Qstick
63f9338d2f Fixed: Improve Selection of Executing Commands in Artist list 2019-04-06 00:36:26 -04:00
Qstick
789ce8a58f Fixed: IncludeFiles if File Selection Modal 2019-04-06 00:36:26 -04:00
Qstick
3cd58d5866 Fixed: Toolbar buttons enabled when no tracks exist for Album 2019-04-06 00:36:26 -04:00
Qstick
98b610b12e Fixed: Re-tag Modal Enabled when no TrackFiles for Artist 2019-04-06 00:36:26 -04:00
ta264
4be01a5a95 Disable update for docker containers (#715)
Also add docker info to about page and sentry context
2019-04-05 16:47:26 +01:00
ta264
6afece237c Fixed: Don't process tracked download if RemoteAlbum is null (#716)
Fixes LIDARR-1V4
2019-04-04 20:37:48 -04:00
Qstick
57df287547 Fixed: ReleasePush Validation and Error on Parse (#711)
* Fixed: ReleasePush Validation and Error on Parse

* Fixed: Validation on Release module, Catch Errors in format
2019-04-04 20:08:47 -04:00
ta264
d8a361dd91 Fix health check errors (#717)
* Fixed: RemotePathMappingCheck deals with case where path invalid

The `Ensure` built into `FileExists` and `FolderExists` was throwing
an exception previously.

* Fixed: RemotePathMappingCheck doesn't fail if client unavailable
2019-04-04 21:26:08 +01:00
ta264
e27369686b A remote path mapping health check (#617) 2019-04-04 16:15:43 +01:00
ta264
0762805572 Fixed: Lidarr failing to start on linux if which missing (#714)
Fix startup failure when `which` missing
2019-04-04 15:32:58 +01:00
ta264
188e0e1040 New: Manual import improvements (#683)
* New: Manual import improvements

 - Detect and merge import with files already in library.
 - Allow selection of album release from Manual Import modal.
 - Loading indicator while fetching updated decisions

* Disable release switching if user manually overrode release
2019-04-04 09:20:47 +01:00
Qstick
61cea37f05 Fixed: Test for get_file_by_album Failing 2019-04-03 20:55:26 -04:00
ta264
390c79793e Fixed: Unparsable original year in tag 2019-04-01 08:30:43 +01:00
ta264
b23e7ec513 Fixed: If MusicBrainz release date is missing, also remove from tags 2019-04-01 08:30:43 +01:00
ta264
ef3005f2bb Fixed: GetFilesByAlbum should only return files for monitored releases
Since switching releases doesn't clear out trackfiles for unmonitored
releases, we need to ensure we only return files for monitored
releases otherwise we will return duplicates
2019-04-01 08:30:43 +01:00
ta264
225af556d9 Fixed: Don't set missing release dates to 0001-01-01 2019-04-01 08:30:43 +01:00
Qstick
77e4c99713 Fixed: 0.6 Analytics Bump 2019-03-31 11:57:44 -04:00
ta264
c314a94241 Fixed: Slack AlbumImportFailed notification (#710)
message.Album is null at the moment
2019-03-30 10:42:44 -04:00
Qstick
6b40a8d87f Fixed: qBittorrent Fixes for Seed Limits and Magnet links (#702)
* Fixed: Qbittorrent Fixes for Seed Limits and Magnet links

* Fixed: We do Music, not TV
2019-03-28 19:52:09 -04:00
ta264
d5c69d0375 Set sentry environment to be develop/nightly based on config file (#703)
* Set sentry environment to be develop/nightly based on config file

Also add details on sqlite version and database migration.  The
separate ReconfigureSentry class is required because
ReconfigureLogging happens before the database has been resolved, so
you can't access IMainDatabase there

* Set environment to develop/nightly in frontend too
2019-03-28 09:26:39 +00:00
ta264
054d1600a2 Fix container and free space tests on mono (#704)
* Fix disk provider tests

* Fix container test on linux
2019-03-27 19:51:56 +00:00
ta264
038deb0e8d Fixed: Tag writing when release country is missing (#700) 2019-03-27 07:49:32 +00:00
Qstick
7fd0089884 Fixed: Can't login with a username and a blank password
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-03-26 22:12:44 -04:00
Qstick
4545e679af Fixed: Sorting by age when releases are less than a day old
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-03-26 22:07:07 -04:00
Qstick
180763da69 Fixed: Consistent icon position for toolbar buttons
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-03-26 21:58:16 -04:00
Qstick
a4d2ed6f31 Fixed: Queue count badge showing warning/error incorrectly 2019-03-26 21:52:13 -04:00
Qstick
0c8cdd2257 Fixed: The real final secure token... 2019-03-26 21:34:40 -04:00
ta264
082d329849 Fix sentry auth token (#701)
* Fix sentry auth token

* Add missing --finalize and a 'deploys' to mark as released
2019-03-26 18:53:36 +00:00
ta264
cd7219f861 Publish js source and maps to sentry (#698)
* Publish js source and maps to sentry

* Add encrypted token

* Create release for lidarr-update too
2019-03-26 15:06:35 +00:00
ta264
dbb08c15d2 Fixed: Album lookup API endpoint updated for new DB schema (#693) 2019-03-23 19:01:34 +00:00
ta264
6e4b1ba1fe Fixed: MediaFileRepository was ignoring AlbumRelease monitored flag (#689) 2019-03-23 08:37:34 +00:00
ta264
b557f620d9 Fixed: Ensure Quality is always initialised in AudioTag.Read (#694)
* Fixed: Ensure Quality is always initialised in AudioTag.Read

* Fixed: Log quality message on fallback quality detection
2019-03-23 08:36:49 +00:00
Qstick
f50b60103c Fixed: Style incorrect on some history detail properties 2019-03-22 22:14:06 -04:00
Qstick
1bcee3ba97 Fixed: ArtistRepo Cleanup 2019-03-22 21:31:27 -04:00
Qstick
772bd88efa Fixed: OnImportFailure using OnDownloadFailure enabled notifications 2019-03-22 20:46:09 -04:00
ta264
c229d73ddc Fixed: NullReferenceException in NotificationService (#695) 2019-03-22 20:43:09 -04:00
ta264
580641a600 Fixed: Don't attempt to insert duplicate ids or monitor multiple releases (#684) 2019-03-22 09:33:48 +00:00
Qstick
161cb1a4e6 Update README.md 2019-03-21 23:14:01 -04:00
Qstick
d4d9146599 New: Health Check Failure Notifications (#609)
* New: Health Check Failure Notifications

Fixes #295

* New: OnDownloadFailure and OnImportFailure Notification

* New: On Retag notifications

* Fixed: XBMC notification test

* New: Discord Notifications

Closes #1511

* On Download to On Import on card

* Remove OnDownload, Rename OnAlbumDownload -> OnReleaseImported

* Fixed: Webhook OnReleaseImport notification

* Respect OnUpgrade and fix missing schema items for frontend

* New: Simplify Notification Modal UI

* Fixed: PlexHomeTheater OnReleaseImport notification
2019-03-21 20:47:54 -04:00
Qstick
4d8bcd12e3 Fixed: Cutoff Specification not Respecting Profile Order (#660)
* Fixed: Cutoff Specification not Repsecting Profile Order

* Fixed: Incorrect wording in UpgradeAllowed logging

* Fixed: Change Logic to update if upgrade for any, downgrade for none.

* Fixed: Removed Double Preferred Word Logic

* New: Add Test Cases to Disk Upgrade Spec

* Fixed: Cleanup UpgradableSpecification

* Add ConcatToString extension and fix logging

* Fixed: Enum Naming, Commas
2019-03-21 18:02:16 -04:00
ta264
0ebaa90f54 Fixed: Actually filter TinyIoC errors from sentry and add tests (#685) 2019-03-21 16:45:37 +00:00
Qstick
2992ea60d8 New: Add Medium FileNameBuilder Unit Tests 2019-03-20 23:21:51 -04:00
Qstick
61cf1ccb7c New: Already Imported Decision Specification (#661) 2019-03-20 22:14:27 -04:00
ta264
d552770da9 Fixed: Some bugs in new metadata writing (#677)
* Fixed: Don't fail reading m4a files when no 'day' tag set

* Fixed: Make sure Quality and MediaInfo are set if tag reading failed

* Add more tests for AudioTagService
2019-03-19 13:38:42 +00:00
Qstick
24737baee6 New: Travis yarn cache, yarn version spec, node 10 (#674) 2019-03-16 00:03:00 -04:00
ta264
08c0e03fab Fixed: container tests (#676) 2019-03-15 21:50:33 +00:00
ta264
bf32512fa2 Fixed: Make artist stats update when album (un)monitored (#673) 2019-03-15 21:48:50 +00:00
ta264
072f772dc8 New: Write metadata to tags, with UI for previewing changes (#633) 2019-03-15 12:10:45 +00:00
ta264
6548f4b1b7 Fixed: Filter TinyIoC.TinyIoCResolutionException from Sentry 2019-03-15 09:38:14 +00:00
Qstick
7a18ac51c2 New: UI Package Patch Updates 2019-03-14 22:26:12 -04:00
Qstick
c58c64c9e3 Fixed: Frontend OAuth Actions (Plex Auth) 2019-03-14 22:16:18 -04:00
Tom Andrews
36f34a4113 Fixed: Don't find album when multiple albums have the same name 2019-03-14 13:14:06 +00:00
Tom Andrews
c500f7b943 Fixed: InvalidOperationException when two artists have same name 2019-03-14 13:14:06 +00:00
Tom Andrews
15425a45a3 Fixed: Null reference exception in CompletedDownloadService
Fixes Sentry LIDARR-1GW
2019-03-14 13:14:06 +00:00
ta264
1c7ded859b Fixed: More improvements to sentry logging (#669)
* Only add the exception message for some types

* Cleanse exception messages also

* Don't put exception message into log

It breaks the sentry grouping

* Combine the two calculations of fingerprint
2019-03-13 19:10:58 -04:00
ta264
d6b4c4a9ed Partially recover databases for users for bad 023 migration (#670) 2019-03-13 12:15:55 +00:00
Qstick
bc0313337d Merge pull request #668 from lidarr/fix-snap-apps
Fixed: DriveInfo sees snap apps, handle at higher level
2019-03-11 21:59:49 -04:00
Qstick
60284f9ed8 Fixed: DriveInfo sees snap apps, handle at higher level 2019-03-11 21:41:44 -04:00
Qstick
13a2485972 Fixed: Microsoft.AspNet.SignalR.Client to same version as SignalR 2019-03-11 21:11:55 -04:00
Qstick
1bbcf8f9b2 Merge pull request #667 from lidarr/various-fixes
Various small fixes
2019-03-11 20:48:55 -04:00
ta264
555ae89741 Appveyor linux builds (#665)
* Fix copy

* Update appveyor.yml

* additional logging on gulp

* Fix permissions on appveyor-package.sh

* Clean debug and nuget cache on windows too
2019-03-11 20:38:14 -04:00
ta264
902f0c115b Fixed: Sentry version mismatch (#666)
* Downgrade to 1.0.3

* Fix ShortenPath when cross-compiled
2019-03-11 16:19:12 +00:00
ta264
c7a772363f Pre-filter some events before sending to sentry (#654)
* Filter some errors from Sentry and add exception message to fingerprint

* Move to new Sentry SDK
2019-03-11 12:21:27 +00:00
Tom Andrews
26d1d78204 Fixed: Group sentry NRE events across platforms 2019-03-10 22:55:13 +00:00
Tom Andrews
1c63b04eb3 Fixed: Make fpcalc version check strict again now lsio updated 2019-03-10 22:55:13 +00:00
Tom Andrews
68b8ccc826 Fixed: NullReferenceException in GetAlbums 2019-03-10 22:20:24 +00:00
Tom Andrews
8109dfb0b7 Fixed: Remove unused GetAlbum following importer rewrite 2019-03-10 22:20:24 +00:00
Qstick
7d4d923903 Fixed: Some TV scrubbing 2019-03-09 21:34:25 -05:00
Qstick
0926862609 Fixed: Parse endpoint not correctly parsing releases 2019-03-09 21:19:10 -05:00
Qstick
8befd77f0f Fixed: Queue Details endpoint using wrong parameters 2019-03-09 21:00:06 -05:00
Qstick
acfe2ceef4 Fixed: Change HttpClientFixture links to HTTPS 2019-03-08 22:15:18 -05:00
Qstick
774bc50440 New: React and React-dom to 16.8.4 2019-03-08 22:08:03 -05:00
Qstick
6568eb5e99 Fixed: All preferred words being added to filename 2019-03-08 22:05:56 -05:00
Qstick
0a6f552d5b New: Cleanup UI tooling, Update to Webpack 4, Gulp 4 (#655)
* New: Webpack 4

* New: Gulp 4

* New: Transpile UI for old browsers

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-03-08 21:10:23 -05:00
ta264
fe3761fc2e Cache fingerprints and relax health check (#658) 2019-03-08 21:08:05 -05:00
Qstick
3292fba66c New: Artist Disambiguation Naming Token (#652) 2019-03-06 21:07:21 -05:00
Qstick
21f1fd17bb Fixed: Eslint warnings after update react plugin 2019-03-04 20:53:04 -05:00
ta264
1f483c3a3c Add options to expand album types by default (#644)
* Add options to expand album types by default

* Remove isAfter and simplify slightly

* Fix display of settings on large screens
2019-03-04 20:16:56 -05:00
Qstick
1e48ea58b0 New: Add qBittorrent API V2 support, Indexer seed limit Support (#653)
* Fixed: qBittorrent api v2 support (qbit v4.1+)

Co-Authored-By: taloth <taloth@users.noreply.github.com>
Co-Authored-By: Mark Bebbington <mark@thebebs.uk>

* Fixed: Magnet Link progress visualisation and adding magnet links if dht is disabled in qBittorrent

* New: Indexer Seed Limit settings applied to new downloads for qBit

Co-Authored-By: taloth <taloth@users.noreply.github.com>

* Handle Deluge v2 beta breaking change in their api.

closes #2412

* Fixed: Codacy Format Issues
2019-03-03 21:53:46 -05:00
Qstick
61b0b2681a New: Bump stylelint-order to 2.1.0 2019-03-03 21:49:38 -05:00
Qstick
b5f40e420b New: Bump eslint to 5.15.0, eslint-plugin-react to 7.12.4 2019-03-03 21:45:25 -05:00
Qstick
0db5259e84 Fixed: Don't allow Release Change if AnyRelease and Files Present 2019-03-03 20:26:49 -05:00
Qstick
6312704611 Fixed: Invalid icon definition in Health.js 2019-03-01 23:44:16 -05:00
Qstick
872080cf9e New: AlbumStudio Disambiguation and AlbumType 2019-03-01 23:15:33 -05:00
Qstick
f43c1e749f New: Replace 'react-router-redux' with 'connected-react-router' 2019-03-01 22:27:55 -05:00
Qstick
df65b5b290 New: Bump react-text-truncate to 0.14.0 2019-03-01 22:14:03 -05:00
Qstick
4b32032d85 New: Bump clipboard to 2.0.4 2019-03-01 22:12:02 -05:00
Qstick
2ad2d3f731 New: Bump filesize to 4.1.2 2019-03-01 22:10:40 -05:00
Qstick
019a812f10 New: Remove react-tabs, unused 2019-03-01 22:06:51 -05:00
Qstick
5bdc579108 New: Bump react-dnd to 7.0.2 2019-03-01 22:03:04 -05:00
Qstick
ee7addd624 Fixed: Queue returning nullref when RemoteAlbum null 2019-03-01 21:52:05 -05:00
Qstick
42c16c227e New: Import List Exclusions (#608)
* New: Import List Exclusions

* Fixed: ImportExclusion ForeignId Checks, Unique. RefreshArtist Duplicate

* Fixed: Copy/Paste typos
2019-03-01 17:26:36 -05:00
ta264
b9cc94aa46 Fix: Don't use scene name for tracks when track naming disabled (#646) 2019-03-01 09:33:54 -05:00
Qstick
c8ef68283b Fixed: More UI tweaks 2019-02-27 23:33:26 -05:00
Qstick
3336ebd075 Fixed: Rebuild Yarn.lock for Node 10, UI Updates 2019-02-27 22:45:20 -05:00
Qstick
795a445b52 Fixed: Rendering Tweaks to UI 2019-02-27 22:15:24 -05:00
Qstick
2c8b137349 Fixed: Sonarr references in Quality/Language Profiles 2019-02-27 22:10:04 -05:00
Qstick
02218841d2 fixup! Fixed: SignalR requiring a home directory to function properly. 2019-02-27 22:09:34 -05:00
Qstick
1cc12446b6 Fixed: Include matching value of preferred word regex, not actual regex
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2019-02-27 22:09:08 -05:00
Qstick
27ebe36454 Fixed: Select all in TrackFile editor 2019-02-27 21:53:08 -05:00
Taloth Saldono
7a66214c6e Fixed: SignalR requiring a home directory to function properly. 2019-02-27 21:49:59 -05:00
Qstick
3f064c94b9 New: Release Profiles, Frontend updates (#580)
* New: Release Profiles - UI Updates

* New: Release Profiles - API Changes

* New: Release Profiles - Test Updates

* New: Release Profiles - Backend Updates

* New: Interactive Artist Search

* New: Change Montiored on Album Details Page

* New: Show Duration on Album Details Page

* Fixed: Manual Import not working if no albums are Missing

* Fixed: Sort search input by sortTitle

* Fixed: Queue columnLabel throwing JS error
2019-02-23 17:39:11 -05:00
Qstick
f126eafd26 Merge branch 'develop' of personal:lidarr/lidarr into develop 2019-02-21 22:31:13 -05:00
Qstick
f80661d4d0 Changed: Remove Bitcoin Donation Address 2019-02-21 22:30:32 -05:00
ta264
9856d30960 Fixed: Add licence to packaged files (#636) 2019-02-21 21:10:39 -05:00
Qstick
46cb325406 Fixed: Groups must contain multiple qualities 2019-02-20 21:39:12 -05:00
Qstick
923fcd8b95 Fixed: Remove Series/Episode Reverse Title Checks 2019-02-20 21:11:27 -05:00
ta264
6cfc591364 Fixed: Extra tests and fixes for new track parser (#632)
* Extra tests and fixes for new track parser

* Address review comments, add extra test, fix logging
2019-02-19 20:16:09 -05:00
Taloth Saldono
af65e251d8 Fixed error in unicode cleanup code removing most non-latin characters instead of just invalid ones. 2019-02-17 00:25:34 -05:00
ta264
bb02d73c42 Whole album matching and fingerprinting (#592)
* Cache result of GetAllArtists

* Fixed: Manual import not respecting album import notifications

* Fixed: partial album imports stay in queue, prompting manual import

* Fixed: Allow release if tracks are missing

* Fixed: Be tolerant of missing/extra "The" at start of artist name

* Improve manual import UI

* Omit video tracks from DB entirely

* Revert "faster test packaging in build.sh"

This reverts commit 2723e2a7b8.

-u and -T are not supported on macOS

* Fix tests on linux and macOS

* Actually lint on linux

On linux yarn runs scripts with sh not bash so ** doesn't recursively glob

* Match whole albums

* Option to disable fingerprinting

* Rip out MediaInfo

* Don't split up things that have the same album selected in manual import

* Try to speed up IndentificationService

* More speedups

* Some fixes and increase power of recording id

* Fix NRE when no tags

* Fix NRE when some (but not all) files in a directory have missing tags

* Bump taglib, tidy up tag parsing

* Add a health check

* Remove media info setting

* Tags -> audioTags

* Add some tests where tags are null

* Rename history events

* Add missing method to interface

* Reinstate MediaInfo tags and update info with artist scan

Also adds migration to remove old format media info

* This file no longer exists

* Don't penalise year if missing from tags

* Formatting improvements

* Use correct system newline

* Switch to the netstandard2.0 library to support net 461

* TagLib.File is IDisposable so should be in a using

* Improve filename matching and add tests

* Neater logging of parsed tags

* Fix disk scan tests for new media info update

* Fix quality detection source

* Fix Inexact Artist/Album match

* Add button to clear track mapping

* Fix warning

* Pacify eslint

* Use \ not /

* Fix UI updates

* Fix media covers

Prevent localizing URL propaging back to the metadata object

* Reduce database overhead broadcasting UI updates

* Relax timings a bit to make test pass

* Remove irrelevant tests

* Test framework for identification service

* Fix PreferMissingToBadMatch test case

* Make fingerprinting more robust

* More logging

* Penalize unknown media format and country

* Prefer USA to UK

* Allow Data CD

* Fix exception if fingerprinting fails for all files

* Fix tests

* Fix NRE

* Allow apostrophes and remove accents in filename aggregation

* Address codacy issues

* Cope with old versions of fpcalc and suggest upgrade

* fpcalc health check passes if fingerprinting disabled

* Get the Artist meta with the artist

* Fix the mapper so that lazy loaded lists will be populated on Join

And therefore we can join TrackFiles on Tracks by default and avoid an
extra query

* Rename subtitle -> lyric

* Tidy up MediaInfoFormatter
2019-02-16 09:49:24 -05:00
Qstick
8bf364945f Fixed: Artist posters on Add New Results
Fixes #613
2019-02-02 21:56:19 -05:00
Qstick
01de7dd599 Fixed: Discarded settings changes don't get cleaned
Fixes #606
2019-01-27 00:56:21 -05:00
Qstick
529ab29489 Fixed: Show Loading Indicator for Manage TrackFiles Modal 2019-01-27 00:22:24 -05:00
Qstick
9b9ca54e65 New: Toggle Monitored from Artist Details Page 2019-01-27 00:21:44 -05:00
Qstick
bc008ab1dc Fixed: Disable Artist/Album buttons if no items Selected 2019-01-26 21:20:13 -05:00
Qstick
37166f5399 Fixed: Re-evaluate Client/Indexer Checks on Provider Add (#605) 2019-01-26 20:58:46 -05:00
Qstick
f827ba418c Fixed: MoveArtist logging a failure and a success message 2019-01-23 21:00:59 -05:00
Qstick
42e9027216 New: Use package.json version webpack, clean, bundle (#587) 2019-01-21 20:54:45 -05:00
Jayden
e763e3fff6 Fix typo in AddIndexerModalContent.js (#598)
clink > click
2019-01-19 20:34:09 -05:00
Jayden
99faae973f Fix typo in AddIndexerModalContent.js (#597)
clink > click
2019-01-19 20:29:56 -05:00
Jayden
76b88107de Fix typo in AddImportListModalContent.js (#596)
clink > click
2019-01-19 20:29:27 -05:00
Qstick
0e124af6ce Fixed: Missing album types, typos in type/status (#593)
* Fixed: Missing album types, typos in type/status

* Update SecondaryAlbumType.cs
2019-01-18 23:35:49 -05:00
Qstick
e4e677eea2 New: Limit provider backoff during the first 15 min of startup
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-01-12 16:00:22 -05:00
Taloth Saldono
232cfcb42f Fixed: Mono bug causing memory leakage when http connections use gzip
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2019-01-12 15:17:46 -05:00
Qstick
d9034981c0 Updated: Sentry secret no longer needed 2019-01-12 15:08:30 -05:00
ta264
9185223f53 Fix more issues with migration 23 (#577)
* Tests for migration 23

* Make the migration more robust

For duplicate foreign Ids, create dummy id so correlated subquery
doesn't fail.

If we can't parse the release from the database, put in a dummy release.

* Be more careful with metadata refreshes

Make sure we deal with items that are not linked to the correct parent
2019-01-12 11:56:13 -05:00
ta264
1eea545c0a Remove typographic apostrophe (#586)
This is the preferred apostrophe on musicbrainz
https://beta.musicbrainz.org/doc/Style/Miscellaneous
2019-01-12 11:55:33 -05:00
gismo2004
42252bf9c2 Fixed: Search Monitored to work with accent (#583)
* Fixed: Search Monitored to work with accent

Replace accent in Album/Artist when parsing results from indexer
Fix regex to match for multiple albums

* add test cases
2019-01-09 21:04:40 -05:00
Taloth Saldono
cb19fd3ea6 DataMapper LazyLoaded needlessly keeping the parent mapper alive. 2018-12-31 18:35:20 -05:00
Taloth Saldono
38507e6eb0 Fixed: Excessive memory usage due to sqlite cache configuration.
ref #2296
2018-12-31 18:34:40 -05:00
ta264
7a38f2853c Add release Id to custom script (#574) 2018-12-26 21:48:03 -05:00
ta264
c749405a45 Fixed: show disambiguation in interactive import modal (#576) 2018-12-26 21:39:23 -05:00
Qstick
ef9072fc3b Fixed: Support new feed url format IPTorrents (#573) 2018-12-16 21:46:09 -05:00
ta264
6723f32abb WIP: Fix migration to DB version 23 (#571)
* Watch out for malformed AlbumReleases in Albums

Don't try to insert if Title is empty and catch and SQLite exceptions.

* Better fix for migration

Filter out null titles and duplicate release ids

Revert "Watch out for malformed AlbumReleases in Albums"

This reverts commit b9f707dc2f4dec79a7415d7941d81da2664e5803.

* Purge tracks linked to bad albumrelease

* fixup! migration missing titles, releases not in remote, artist cleaning
2018-12-16 01:00:17 -05:00
ta264
c392569a63 New: Update DB to store all releases for an album (#517)
* New: Store all releases for an album and track artists

* Add Overview, links and release date by release

* Tidy up

* Fix metadata refresh errors following musicbrainz edits
2018-12-14 19:02:43 -05:00
Qstick
24bdb5a891 Fixed: Update build.sh to fix macOS startup script issues (#565) 2018-12-07 22:04:36 -05:00
Qstick
5c0643d76d Changed: Try previous Appveyor Image 2018-12-07 20:45:27 -05:00
Qstick
91aaf8abe6 Update NzbDroneLogger.cs 2018-12-07 00:05:01 -05:00
Qstick
8465c2d227 Fixed: Replace one stupid hack with another. 2018-12-06 22:20:13 -05:00
Qstick
9f9441788c New: Bump version to 0.5.0 2018-12-01 15:26:37 -05:00
Qstick
0596215358 New: Prevent Boot Loop if Config file Unauthorized access. (#554)
* New: Prevent Boot Loop if Config file Unauthorized access.

* Update NzbDroneLogger.cs
2018-11-30 21:30:28 -05:00
Qstick
e914ca86dc New: Update SignalR to 2.4.0 2018-11-29 22:17:26 -05:00
Qstick
d63bb77edc New: Small UI tweaks and package updates 2018-11-29 22:11:48 -05:00
Qstick
c7d17598e2 Fixed: Change Unreleased Color, Add Partial Status
Fixes #527
2018-11-18 22:57:29 -05:00
Qstick
3cc1e7bb0f New: Added warning for Download Station that 2FA is not supported 2018-11-18 22:30:32 -05:00
Qstick
2f6b0c77ea Fixed: Updated error message if services respond with html
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-11-18 22:27:16 -05:00
Qstick
6da9868716 New: Added priority levels to Join Notifications 2018-11-18 22:21:12 -05:00
ta264
32c75cfcbc New: Manual import refreshes decisions when artist/album updated (#540) 2018-11-18 22:16:55 -05:00
ta264
d62b4e49f9 Fixed: Better release parsing (#541) 2018-11-18 21:59:54 -05:00
ta264
e260a29b57 Improve the fuzzy matching (#522)
* Fixed: improve track matching

* Deal with tracks sequentially numbered across discs
2018-11-16 12:46:46 -05:00
Qstick
8320508688 Fixed: TrackedDownloadFixture Un-parsable title 2018-11-11 02:19:50 -05:00
Qstick
caac321ef9 Fixed: Add HistoryService Mock to Queue Fixture 2018-11-11 01:52:21 -05:00
Qstick
0099d9f430 Updated: NUnit and TestAdapter to 3.11.0 (#538) 2018-11-11 01:26:45 -05:00
ta264
c98b86b413 Fixed: Allow downloading any search result (#525)
* Allow downloading any search result

Ones that couldn't be parsed get a red icon

* Not required - initialized to false

* Add a warning the the queue page for manual downloads
2018-11-11 00:38:38 -05:00
Qstick
eedaa2a7b8 Fixed: OS specific paths for import artist tip 2018-11-11 00:14:39 -05:00
Qstick
4712f7f947 New: Tooltips for remove actions
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-11 00:09:22 -05:00
Qstick
14867cff7e Fixed: Center icons in tables
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-11 00:04:04 -05:00
Qstick
342122cbb4 Fixed: Don't prompt to move artist to the same folder (case sensitive)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-11 00:01:20 -05:00
Qstick
510439570e Fixed: Select all selecting hidden items
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-10 23:52:44 -05:00
Qstick
78a0b5f8b7 New: Setting to disable disk scan after artist refresh
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-10 23:50:21 -05:00
Qstick
74bd72a836 Fixed: Don't try to fix CSS errors in JS files
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-10 23:20:39 -05:00
Qstick
62e63b9cb7 Fixed: TableOptionsModal requires optionsComponent 2018-11-10 23:19:53 -05:00
Qstick
9007f9319a Fixed: Toolbar collapsing on device rotation
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-10 23:19:10 -05:00
Qstick
a7a2709517 Fixed: Missing bracket in PlexTv Service query
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-10 23:10:12 -05:00
Qstick
0c1f9e6c8d New: Optional Search Button on Artist Index views 2018-11-10 23:08:31 -05:00
Qstick
88c58e2529 Fixed: Artist and Album navigation buttons wrapping 2018-11-10 22:30:21 -05:00
Qstick
ddf9e8bb01 Fixed: Calendar defaultProps for statistics
Fixes #534
2018-11-10 22:08:03 -05:00
Qstick
002234f71b Fixed: Custom metadata source doesn't get saved from UI
Fixes #537
2018-11-10 22:01:36 -05:00
ta264
6855a7848e Ignore .partial~ files (#535) 2018-11-10 09:50:37 -05:00
Max Harley
deff1e31cb Update Apollo with Orpheus (#530) 2018-11-10 07:29:29 -05:00
geogolem
875e1aedcb Wanted Monitor/Unmonitor Selected button fixed (#528)
* the button was not changing based on the filter selection

nor was it properly carrying out its function.

It should now work.

this code was ported from Sonarr:

979fc436ab

* indents/spaces/formtting
2018-11-06 20:59:02 -05:00
Qstick
f8ce2334c6 Fixed: Downloaded Albums not reflected on Calendar
Turns albums green if 100% of tracks are in library

Fixes #520
2018-11-05 21:57:26 -05:00
Qstick
1eeb1bbf63 Fixed: Handling of poorly formed items when parsing results from indexer
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-11-05 20:41:29 -05:00
Qstick
b7fe4193f3 Changed: Added "Remastered" to album cleaning regex 2018-10-24 20:34:21 -04:00
ta264
eadd6996ef Fuzzy matching (#508)
* Fixed: correctly match albums whose title is all special characters

* New: fuzzy matching on album and track names
2018-10-20 18:09:12 -04:00
Qstick
3ae079a541 Fixed: Interactive import SelectArtist ordering 2018-10-19 23:11:42 -04:00
Qstick
029a0e4e20 New: Ability to test all Indexers, Lists, Clients
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-19 23:03:56 -04:00
Qstick
6103afcc09 Fixed: Exclude /snap/* locations from disk space
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-19 21:39:41 -04:00
Qstick
4347e92bef New: Add Test all functionality to API (Clients/Indexers/Lists)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-16 22:05:40 -04:00
Qstick
1d1aca8fb7 Fixed: Naming of remoteAccessAdapter in OwinHostController
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-16 21:50:31 -04:00
Qstick
6ec8e522de Fixed: Previous airing in ArtistOverview not working 2018-10-16 21:46:35 -04:00
Qstick
fe865fc4c3 Fxed: Slight UI label color adjustment
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-16 21:16:32 -04:00
Qstick
097429c545 Fixed: TextTagInputConnector.isArray
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-16 21:09:24 -04:00
Qstick
3e538f935a Fixed: OAuth validation errors
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-16 21:07:20 -04:00
Qstick
69b6b67bf4 New: Sort by Status in Artist Index/Editor
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-16 20:59:16 -04:00
Nick Sweeting
07a1388758 Make the docker badge link to the Docker wiki page (#514) 2018-10-13 10:14:56 -04:00
Qstick
27736649c2 New: Import List Tags (#505)
* New: Import List Tags

* New: Show ImportLists where Tag is Used in Tag manager

* Fixed: SignalR Errors due to handleTag missing

* Fixed: Clarify Lidarr Tags, not to be confused with LastFmTags
2018-10-08 20:56:05 -04:00
Qstick
b17cccd736 Fixed: Removed duplicate test cases 2018-10-07 18:25:46 -04:00
Qstick
c95d3e0ecb Fixed: Language Parser Cases 2018-10-07 17:12:53 -04:00
Qstick
a7108c079d Fixed: Backup API tweaks
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-02 22:15:53 -04:00
Qstick
5a57c0cf17 Fixed: Parsing for Artist-Album-Year release 2018-10-02 22:15:21 -04:00
Qstick
dc1eb63099 Fixed: Album percentOfTracks named incorrectly 2018-10-02 21:03:52 -04:00
Qstick
de224bcce5 Fixed: Avoid NullRef from ArtistStats when linking albumStats 2018-10-01 21:33:45 -04:00
Qstick
029e057c06 Fixed: Added Formatter cases for Wavpack and APE 2018-10-01 21:17:51 -04:00
Qstick
e7bd67fcfa New: Frontend package updates 2018-10-01 21:05:33 -04:00
Qstick
8256314ba8 Fixed: Minor UI fixes
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-10-01 20:41:38 -04:00
Qstick
d3ee856403 Fixed: Signout icon definition 2018-09-23 23:39:22 -04:00
Qstick
ad69c18a3f Removed unused webpack.config.js from root. 2018-09-23 22:37:48 -04:00
Qstick
871fb089d3 Fixed: Correctly sort by track number in ManageTracks modal
Fixes #494
2018-09-23 20:56:51 -04:00
Qstick
64a8d02f77 New: Server Side UI Filtering, Error Boundaries (#501)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-22 23:10:50 -04:00
gismo2004
a95191dc3b Fixes: Headphones album search (#502) 2018-09-22 03:14:26 -04:00
Qstick
e08f39ebe0 New: Setting to prevent download of early releases (#485)
* New: Setting to prevent download of early releases

* Fixup! Test and Wording
2018-09-20 22:21:26 -04:00
gismo2004
9b0a7c60ed Fixed: Improve TrackMatching when title is slightly longer/shorter than DB (#491)
* improve TrackMatching

* Add unit test for TrackMatching

* rename NormalizeEpisodeTitle to NormalizeTrackTitle

* correct typo
2018-09-18 21:29:45 -04:00
Qstick
2af4a5004f New: Bump Version 0.4.0 2018-09-18 20:49:25 -04:00
Qstick
56e1f53834 Fixed: Allow text in front of cleaned Album/Track tag (#498)
* Fixed: Allow text in front of cleaned tag

* fixup! Add another test case that shouldnt be matched.
2018-09-16 22:10:25 -04:00
Qstick
d45d0ab1f6 New: Enable OSX builds with Travis (#497) 2018-09-16 21:24:44 -04:00
Qstick
66c524140d Fixed: Update Travis Builds to Use Node 8 LTS (#496)
* New: Bump node version in travis

* fixup! Only require major
2018-09-16 17:58:42 -04:00
Qstick
7093bde226 New: Compatibility with Hombrew-installed mono
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-16 17:57:46 -04:00
gismo2004
29c52e47bb Use Album Disambiguation/Type when searching and picking releases (#490)
* Use Album Disambiguation/Type when searching and picking releases

* Add Disambiguations to AlbumQuery

* use string interpolation for AlbumQuery

* cosmetic change in log text
2018-09-16 11:32:42 -04:00
Qstick
b8511f039a New: Various UI Package Updates 2018-09-15 22:32:34 -04:00
Qstick
9611df7e9e Changed: Export Calendar options in UISettings 2018-09-15 21:49:08 -04:00
Qstick
18fd7d452b Fixed: Add payload to createSaveHandler 2018-09-14 23:14:02 -04:00
Qstick
713f643b1d Changed: Convert password input to standard using pass font 2018-09-14 23:13:35 -04:00
Qstick
e0108352c8 New: Filter .DS_Store files from parsing
Fixes #489
2018-09-14 23:12:32 -04:00
Qstick
328795cb1f Fixed: Don't read response stream if it equals Stream.Null
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-14 22:44:56 -04:00
Qstick
b5ecc4d209 Fixed: Episode reference in Parser.cs 2018-09-14 22:40:34 -04:00
Qstick
dd6b93e243 Fixed: Add tag default property to ArtistDetails
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-14 22:01:34 -04:00
Qstick
68f9df695b Fixed: Remove debugger from OverlayScroller
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-14 22:01:07 -04:00
Qstick
4a17e43c82 New: React and ReactDom to 16.5.1
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 23:14:26 -04:00
Qstick
c6579cf115 Fixed: Create default value for filterValue in FilterBuilderRowValue
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 22:47:44 -04:00
Qstick
d728b0c4b2 Fixed: UI doesn't detect ArtistRenamingCommand is running
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 22:46:39 -04:00
Qstick
2c492fdb72 Fixed: Poor scrolling performance on some browsers
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 22:45:45 -04:00
Qstick
ca244b0da5 Fixed: Remove value length restriction from ArtistSearch
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 22:43:57 -04:00
Qstick
1fb0b867a9 Fixed: Remove period in ArtistMonitoringOptions for consistency
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 22:43:11 -04:00
Qstick
9e183fd0fd Changed: Remove lodash reference from Selector files
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 22:33:21 -04:00
Qstick
9c9fec70d8 Fixed: Validation for IndexerId on Release API Endpoint
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 22:29:28 -04:00
Qstick
d61ba76574 New: Choose extension for magnet links in Torrent Blackhole
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-13 22:28:17 -04:00
Qstick
622e2de07d Fix: Last.Fm UserId message 2018-09-13 21:43:51 -04:00
Qstick
a069ce40ad Fix: NMA Migration issue
For those that have not migrated yet.
2018-09-13 21:42:00 -04:00
Qstick
c0c9d4363c New: Last.fm User and Tag Import Lists (#478)
* New: Last.fm User and Tag Import Lists

* fixup! defaults and variable name
2018-09-11 23:00:45 -04:00
gismo2004
e155217165 Fixed: Newznab Artist search (#482)
* Fixed: Newznab Artist search

space is still not allowed
make code more readable

* add back the curly braces
2018-09-09 13:11:56 -04:00
gismo2004
65a1581057 Fixed: Unclear UI on quality definitions (#483) 2018-09-09 12:49:07 -04:00
gismo2004
91767c1462 Fixed: Newznab "400.BadRequest" (#481)
"space" is not allowed in request url
2018-09-08 13:15:53 -04:00
Qstick
d5b60957d9 Fixed: Trailing space in keyboardShortcuts killing build 2018-09-06 23:07:43 -04:00
Qstick
034ef2ad99 Fixed: Various UI fixes
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-06 20:59:49 -04:00
Qstick
2667d3ac21 Fixed: Table option helptext from "isVisible" to "visible"
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-06 20:58:59 -04:00
Qstick
812af82fae Fixed: Search fails for many artist and albums with specials (#466)
* Fixed: Search fails for many artist/albums with specials

* fixup! Replace & with space

* fixup! Add two more test cases

* fixup! Add last test case

* fixup: Newznab test case
2018-09-04 22:55:08 -04:00
Qstick
23bc5b11cf Added: Device load support for Pushbullet
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-04 22:41:22 -04:00
Qstick
e41f884153 Fixed: Updates to commandExecutingSelector 2018-09-04 22:40:26 -04:00
Qstick
68aaa49e9f Fixed: Filter mapped drives when running from service 2018-09-04 22:38:48 -04:00
Qstick
70dc4d86dc Fixed: Reorg default properties in ArtistIndexRow 2018-09-04 22:36:51 -04:00
Qstick
7ece4731fc Fixed: Rework color naming 2018-09-04 22:36:25 -04:00
Daniel Underwood
27470432f9 Changed: Make entire row clickable in manual import album selection (#469) 2018-09-02 11:07:26 -04:00
Qstick
0b4e4a90bc Fixed: Prevent Albums page from making double API calls 2018-09-02 02:44:58 -04:00
Qstick
72dfae1cc9 Fixed: Container tests failing due to Lidarr.Api dep. 2018-09-02 01:08:04 -04:00
Qstick
6b45758fde New: Improved Plex Media Server authentication (Manually update settings)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-09-02 00:42:03 -04:00
Qstick
aab70b512d Fixed: Fix some api integration tests 2018-09-02 00:39:21 -04:00
Qstick
2a992f6c2b Fixed: Remove MediaBrowser metadata and pushalot 2018-09-01 23:37:55 -04:00
Qstick
813f81b3c9 Fixed: Case for HandleTrackfile function in SignalR 2018-09-01 23:12:02 -04:00
Qstick
9d2fbddc7d New: Cancel tasks in command queue 2018-09-01 23:11:19 -04:00
Qstick
61387b3d44 New: Album Release Date on queue screen 2018-09-01 23:10:23 -04:00
Qstick
df34fb7be7 Fixed: Add default artist props to prevent blank screen 2018-09-01 23:09:38 -04:00
Qstick
60bb0ac063 New: Queued Task/Command List View
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-08-30 23:07:50 -04:00
Qstick
9a1660da51 New: Add stopped option for rTorrent
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-08-30 23:04:40 -04:00
Qstick
ba96dad8c7 Fixed: UI and Command manager updates
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-08-28 23:01:02 -04:00
Qstick
d9a51a1d02 Changed: Refactor ReleaseGroup Parser cases 2018-08-26 22:25:19 -04:00
Qstick
c3d2769d3f Added: Parser case for Artist - Album - Year [Other] 2018-08-26 21:48:49 -04:00
Qstick
499af45566 Added: Monkey Audio and WavPack support (#455)
* Added: Monkey Audio and WavPack support

* fixup! Add test case, fix typo
2018-08-26 21:11:07 -04:00
Qstick
894385747e Fixed: Mbid lookup doesnt return existing properties if in db.
Fixes #459
2018-08-26 21:03:46 -04:00
Qstick
b506fd3ab7 Fixed: UI fixes from Sonarr
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-08-26 00:39:04 -04:00
Qstick
6eafffeb2c Fixed: Return artist properties for existing albums during album search
Fixes #457
2018-08-25 23:01:39 -04:00
Qstick
a56e2edb74 Fixed: Concurrent manual imports silently failing
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-08-18 21:48:32 -04:00
Qstick
0c7417ee91 Fixed: Filter menu disabled when no items shown 2018-08-18 15:42:30 -04:00
Qstick
b5ae7eed87 Added: Show name in Indexer-Client-Notification modal headers 2018-08-18 15:02:19 -04:00
Qstick
b9f625a0a7 Fixed: Move Artist modal shows incorrect path for multiple artist move 2018-08-18 15:01:33 -04:00
Qstick
15672298c6 Fixed: Artist Statistics throwing errors when null 2018-08-18 15:00:50 -04:00
Qstick
93a0f18f82 Fixed: Unable to edit metadata profiles 2018-08-18 14:58:55 -04:00
Qstick
ef7d54a412 Fixed: Handle Gazelle NullRef (#447) 2018-08-13 19:48:26 -04:00
Qstick
a9e59b7798 Fixed: Prevent JS errors when statistics is null 2018-08-10 20:47:28 -04:00
Qstick
36b2942cef Added: Allow folders without trailing slashes in file browser
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-08-10 20:46:34 -04:00
Qstick
ef107fc63d Updated: Multiple UI package updates (#443)
* Updated: Multiple UI package updates

Co-Authored-By: taloth <taloth@users.noreply.github.com>

* Updated: inno version to 5.6.1

* Updated: react-tether to 1.0.1

* Updated: React to 16.4.2
2018-08-08 21:53:58 -04:00
Qstick
ed94d47cdd Fixed: Too big eta in qbit api still occurring on official builds
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-08-07 21:24:26 -04:00
Qstick
59a058dd82 Updated: lodash to 4.17.10 2018-08-07 21:21:54 -04:00
Qstick
6581b3a2c5 New: UI Updates, Tag manager, More custom filters (#437)
* New: UI Updates, Tag manager, More custom filters

* fixup! Fix ScanFixture Unit Tests

* Fixed: Sentry Errors from UI don't have release, branch, environment

* Changed: Bump Mobile Detect for New Device Detection

* Fixed: Build on changes to package.json

* fixup! Add MetadataProfile filter option

* fixup! Tag Note, Blacklist, Manual Import

* fixup: Remove connectSection

* fixup: root folder comment
2018-08-07 20:57:15 -04:00
Qstick
afa78b1d20 New: Bump version 0.3.1 2018-07-20 22:07:31 -04:00
Qstick
e6a43b2dc0 New: Added album disambiguation to UI and Naming [ex. Weezer (Blue Album)] (#431) 2018-07-20 18:33:56 -04:00
Qstick
54d1d90e16 Added: Show medium on manual import
Fixes #381
2018-07-18 22:07:19 -04:00
Qstick
539d7b3e66 Fixed: Blank Screen after Import
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-07-18 22:06:26 -04:00
Qstick
0b4495e92d Fixed: Calendar Links to Artist/Album
#382
2018-07-18 21:05:41 -04:00
Qstick
9aa40f546f New: Added optional UrlBase to Nzbget, Sabnzbd, and Subsonic settings (#428)
* New: Added optional UrlBase to Nzbget, Sabnzbd, and Subsonic settings

Fixes #386

* fixup! Remove commented code
2018-07-18 19:05:01 -04:00
Qstick
3ac378695c Fixed: Remove rouge space from metadata message 2018-07-17 22:57:58 -04:00
Qstick
b1bcbe365d Added: Message to enlighten users on metadata profiles
#427
2018-07-17 22:46:33 -04:00
Qstick
219f7c0f31 Fixed: Ignore /etc in System disk overview
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-07-17 22:36:45 -04:00
Qstick
674e1196b3 Added: Try Tag Parse with and without "Promo"
Fixes: #408
2018-07-17 22:14:05 -04:00
Qstick
c795951857 Fixed: Sort Next and Last Album by Release Date
Fixes #401
2018-07-17 22:05:52 -04:00
Qstick
a9d66133a6 Fixed: Dowload client category validation messages not showing 2018-07-17 21:16:39 -04:00
Qstick
274df2f1ed Fixed: Skip torrents in Deluge api that don't have hashes 2018-07-17 21:04:10 -04:00
Qstick
d2d6f22c5f Fixed: Default poster view to show artist names 2018-07-15 15:56:07 -04:00
Qstick
5ce214aa8a New: Update SignalR to 2.3.0 2018-07-14 03:28:59 -04:00
Qstick
ff479ad170 Fixed: RootFolderSelect never uses provided initial value.
Fixes #412
2018-07-07 22:58:06 -04:00
Qstick
cee1b33c60 Fixed: Forced seeding in QBittorrent status treated as complete
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-07-07 21:55:07 -04:00
Qstick
6cc05fcca3 Added: Log indexer response to Trace if an exception occurs
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-06-19 21:44:11 -04:00
Qstick
7db8226099 Fixed: Initially pausing torrents in QBittorrent
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-06-19 21:36:52 -04:00
Qstick
e669e2262f New: Build with Msbuild 15 (#399)
* New: Build with Msbuild 15

* fixup! Msbuild 15

* fixup! appveyor build when changes
2018-06-07 21:13:58 -04:00
Qstick
f9f3cfb1f5 Update bug_report.md 2018-06-07 20:23:50 -04:00
Qstick
14fcef8ec0 New: Updated NewtonsoftJson to 11.0.2 (#387) 2018-06-01 22:56:15 -04:00
Qstick
089d213816 New: Nested Settings and Seed Ratio Setting (#379)
* New: Nested Settings and Seed Ratio Setting

* Fixed: Sonarr related variable naming
2018-06-01 21:59:54 -04:00
Qstick
dabb9bc18a Fixed: StarRating alignment 2018-05-30 21:14:25 -04:00
Qstick
54349f95f1 Fixed: Search Bar returns 404
Fixes #377
2018-05-30 21:11:36 -04:00
Daniel Underwood
d7d4f62737 Changed: Force album refresh when artist refresh manually triggered (#374)
* Force album refresh when artist refresh manually triggered

* Refresh albums on single artist refresh
2018-05-28 03:49:34 -04:00
Qstick
d15d5ae6ba Fixed: Sonarr references in RemoteAccessAdapter.cs 2018-05-27 23:22:37 -04:00
Qstick
030deaf6ef New: Expand OnAlbumDownload, Add Synology handling (#372)
* New: Expand OnAlbumDownload, Add Synology handling

Fixes #324

* fixup: small naming correction

* fixup: Tests for Synology
2018-05-27 00:55:43 -04:00
Qstick
26d9c4ca3e New: Allow 'mbid:' in search
Fixes #369
2018-05-26 23:41:17 -04:00
Qstick
ff77eab156 Chagned: Remove NMA Notifications (#371) 2018-05-26 23:31:58 -04:00
Qstick
3344810653 New: Add Subsonic library update and notify (#368)
* New: Add Subsonic library update and notify

* New: Subsonic setting for to allow connection via SSL
2018-05-26 19:40:18 -04:00
Qstick
598e3eb23b New: Added iTunes new albums, AppleMusic Top and New Lists 2018-05-25 21:54:38 -04:00
Qstick
18b29f8208 New: Add Star Rating to Album table (#365) 2018-05-24 23:55:14 -04:00
Qstick
73157534e0 Fixed: Don't download artist images if match existing (#362)
* Fixed: Don't download artist images if existing exists

* fixup: Wrap FileSetWriteTime in try

* fixup! Tests and Rework
2018-05-24 21:08:35 -04:00
Qstick
2969decf95 Fixed: Tests for refresh intervals 2018-05-22 23:03:31 -04:00
Qstick
d79139976c New: Search by Tag 2018-05-20 02:13:52 -04:00
Qstick
ef93ae3792 Fixed: Misc UI Fixes 2018-05-20 01:49:41 -04:00
Qstick
457955c306 New: Simplify naming separator in UI
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-05-20 01:18:24 -04:00
Qstick
74c2da5088 Fixed: Update Indexer Store Select Schema 2018-05-20 01:06:28 -04:00
Qstick
ef6c93c784 Fixed: Stylelint Issues 2018-05-20 01:02:46 -04:00
Qstick
f7076c6c5b Changed: Modify Artist Update Intervals (#360) 2018-05-20 00:51:21 -04:00
Qstick
7bc2d62ba6 Update Nlog to 4.5.4 (#359)
* Update Nlog to 4.5.4

* fixup: Remove Unused References

* fixup: more references
2018-05-20 00:32:40 -04:00
Qstick
bfe1109c5c Fixed: Mono debug check not working correctly
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-05-19 22:54:22 -04:00
Qstick
67fbc3c8b1 Fixed: Removed warning that TorrentBlackhole doesn't support magnet
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-05-19 22:50:45 -04:00
Qstick
2f7e68ed06 New: Remove additional URL prefixes from release names
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-05-19 22:47:59 -04:00
Qstick
4dfe7cede4 Fixed: Qbittorrent ETA and Initial State
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-05-19 22:38:58 -04:00
Qstick
570a23e143 Fixed: Custom script execution when release processed via /push API
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-05-19 22:20:08 -04:00
Qstick
ae6f8190a4 Update issue templates 2018-05-18 19:42:16 -04:00
Qstick
5a8e79eec2 New: Sync Lists on Add and Update (#342) 2018-05-10 19:06:02 -04:00
Qstick
ad6e651090 New: Show Release Title on Release Selection (#343)
Fixes #329
2018-05-04 18:34:03 -04:00
Qstick
a794ed8860 Fixed: Null Error on Gazelle Auth Fail 2018-05-03 21:52:05 -04:00
Qstick
6cee554760 Fixed: Fix caching spec for Initialize.js 2018-05-03 21:50:27 -04:00
Qstick
026a2cace5 Fixed: Checkbox can be checked when disabled 2018-04-29 21:49:18 -04:00
Qstick
8624ff5c6a Fixed: Correctly set default profiles on import
Fixes: #333
2018-04-28 22:31:03 -04:00
Qstick
0d7cd8009f Added: Make Lidarr CSP compatible
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-04-27 23:29:25 -04:00
Qstick
44ad754c86 Fixed: Login page content, UrlBasePipeline include
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-04-26 21:15:48 -04:00
Qstick
a3e08c9160 Fixed: Setup remote access for service during install
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2018-04-26 20:56:19 -04:00
Qstick
6c19569210 Fixed: Expand first medium in Album by default
Fixes #328
2018-04-26 20:37:14 -04:00
Qstick
a5369df197 Fixed: Album reference causing nullRef on custom scripts (#325) 2018-04-24 23:19:00 -04:00
Qstick
8f0897f70c New: Use Artist backdrop for Album detail page 2018-04-24 22:43:49 -04:00
Qstick
d9422b4edc Fixed: Artist AlbumType ExpandbyDefault if has release in 30 days
also Fixes #313
2018-04-24 22:36:18 -04:00
Qstick
307c989409 Revise cookie handling (#315)
* Fixed: Revised handling of cookies in case of redirects.

* Revised deletion of cookies.
2018-04-22 19:49:08 -04:00
Qstick
98653fafbf Merge branch 'develop' of https://github.com/lidarr/Lidarr into develop 2018-04-22 17:14:15 -04:00
Qstick
ac45098ab8 Updated: SignalR to 2.2.3 2018-04-22 17:14:07 -04:00
Qstick
25c0423ef6 Fixed :Compile warning cleanup (#314)
Fixed :Compile warning cleanup
2018-04-22 17:12:57 -04:00
Joseph Milazzo
8d113864aa Added percentages to the HDD usage readout. (#308)
* New: Added percentages to the HDD usage readout.
2018-04-22 10:08:30 -05:00
Qstick
e06858e4bf Sonarr pulls (#310)
* New: Speed up sqlite3 initialization by disabling unused features

Co-Authored-By: taloth <taloth@users.noreply.github.com>

* New: Debounce Command Notifications

Co-Authored-By: taloth <taloth@users.noreply.github.com>

* Changed: Refactored PendingRelease logic for performance

Co-Authored-By: taloth <taloth@users.noreply.github.com>

* Added: Indexes to speed up DecisionMaker performance.

Co-Authored-By: taloth <taloth@users.noreply.github.com>

* New: Cache EventAggregator Subscribers

Co-Authored-By: taloth <taloth@users.noreply.github.com>

* Fixed: Hide fallback pending releases if temporarily delayed

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-04-22 08:35:37 -05:00
Qstick
e3f5ce771c Update README.md 2018-04-21 19:38:34 -04:00
Qstick
feb6f4b205 Bump Version and Change Installer Name 2018-04-21 17:18:13 -04:00
Qstick
e73936184b Fixed: Change Host GUID, other Sonarr references (#307)
* Fixed: Change Host GUID, other Sonarr references

* fixup! Random GUID and Copyright Year
2018-04-21 14:34:31 -04:00
Qstick
f745b7bdbe Update README.md 2018-04-21 13:43:49 -04:00
Daniel Underwood
116d3d22bb Fixed: Escape regex in ParseAlbumWithSearchCriteria (#244)
* Add regex escape to fix #231

* Add escape to artist name

* Fix test case

* Use single album parameter and add test cases

* Add artist test cases

* Add qualities to release titles

* Create albums in ParserFixture

* Added missing case in QualityParser. Handle escaping regex better for artists/albums that are just symbols.

* Removed custom code to escape slashes. Enhanced regex to support more test cases.

* Fixed Regex for other test cases.

* Small enhancements to code. Removed log statement.

* Tweaked one of my regex to account for not stripping ? from SimpleTitleRegex.
2018-04-21 09:40:23 -04:00
Qstick
f6a1f5142a Changed: Cleanup indexer files, Remove fanzub (#305) 2018-04-21 00:58:15 -04:00
Qstick
57fc26916a Update AnalyticSettings.js
Fixes #301
2018-04-20 18:57:02 -04:00
Qstick
5c566cf139 Fixed: update port in multiple instance error 2018-04-15 19:39:07 -04:00
Qstick
c3800c66ad Fixed: Update Growl Notifications 2018-04-15 15:31:49 -04:00
Joseph Milazzo
2b2c242c6f Fixed: Artist and Album Posters show placeholder instead of image (#292)
* Fixed issue where after AlbumPoster had error state, non-errored images would be stuck with placeholder.

* Fixed the poster loading issue for artists as well.

* Updated ArtistBanner as well.

* fixup: banner issues from previous missed update

* fixup! remove lazy variable, fix variable
2018-04-15 01:11:53 -04:00
Qstick
9bd020a130 Fixed: Wanted cutoff page shows incorrect count 2018-04-15 00:49:16 -04:00
Joseph Milazzo
b661344ba8 Parser Enhancements (#291)
* When matching tracks with metadata, ensure we also check their track number as some albums have two tracks with same title.
2018-04-13 06:30:56 -05:00
Qstick
e67af5e747 Changed: Temp remove album folder release year requirement.
Fixes #290 until we can get rework done, forces user to ensure they are naming correctly.
2018-04-12 22:39:00 -04:00
Qstick
ca1ef7e151 Fixed: Hide password field text for PlexClient notifications 2018-04-11 23:00:39 -04:00
Qstick
19aacd4fff Added: Plex OnAlbumDownloaded handlers. 2018-04-11 22:59:51 -04:00
Joseph Milazzo
734b1f6101 Added cases to strip feat. from track titles. (#288)
* Added cases to strip feat. from track titles.
2018-04-09 20:37:56 -05:00
Qstick
453bbeee20 Fixed: Contributors link in README 2018-04-08 23:34:37 -04:00
Qstick
43ef2fa6e5 Fixed: RootFolder HealthCheck Test 2018-04-08 23:18:58 -04:00
Qstick
4dd857ea30 Added: Additional Logging and Messaging for Albums 2018-04-08 23:14:26 -04:00
Qstick
3e0d0f17f2 Fixed: Add Validation for Import lists, Correct Language/Metadata profiles 2018-04-08 22:57:09 -04:00
Qstick
bdf677479a Changed: Update Donation Links 2018-04-08 21:44:05 -04:00
Qstick
c833a6dc84 New: Enable Ratings for Albums 2018-04-08 02:48:34 -04:00
Qstick
8bd9119954 Merge branch 'develop' of https://github.com/lidarr/Lidarr into develop 2018-04-08 02:27:59 -04:00
Qstick
f9fb33eb08 Added: Additional Album Monitoring Options 2018-04-08 02:25:34 -04:00
Qstick
1937a8e27c Fixed: Update Emby Notification (#284) 2018-04-08 00:38:12 -04:00
Qstick
af090c7a3a Fixed: Profile delete Unit Tests 2018-04-08 00:29:23 -04:00
Qstick
03360ca43f Fixed: Throw LidarrStartupException if can't access AppFolder Location 2018-04-08 00:02:55 -04:00
Qstick
8ad38fe3af Fixed: Validation for Track File Naming, Add Album Type Token
#241
2018-04-07 23:53:11 -04:00
Qstick
c7ef370060 Added: Add Limited Edition to Album Tag Cleaning
Fixes #282
2018-04-07 22:47:04 -04:00
Qstick
321d99a597 Added: Validate Set Profiles Exist when Adding Artist
Fixes #281
2018-04-07 22:43:10 -04:00
Qstick
fde276f000 Fixed: Don't allow profile delete if in use by import list
Fixes #280
2018-04-07 22:28:16 -04:00
Qstick
e5c5a3f91c Fixed: Some Tests, Ignore failing Unit Tests that are not implemented. 2018-04-07 01:22:14 -04:00
Qstick
993355e55a Fixed: ArtistRepositoryFixture Test 2018-04-07 01:09:15 -04:00
Qstick
28aa2eeeed Added: Readme OpenCollective Info 2018-04-07 01:06:22 -04:00
Joseph Milazzo
e9097b8dc6 Check for MusicBrainz Release Id during Scan (#227) (#277)
* Implemented functionality to find album from DB if a track has album in the MusicBrainz Release Id tag. If tag doesn't exist or album is not found, handle via normal routes.

* Added a test case

* Fixed a bad merge.

* Fixed a bug where a track with an empty Album IDv3 tag always was ignored, even if it had MusicBrainz Release Id hardcoded.

* fixup: Quick fixes to get this merged tonight due to bug in develop
2018-04-07 00:52:28 -04:00
Joseph Milazzo
aaa3b5495f Feature/common tag parsing (#273)
* Added refresh title on the refresh button.

* Added a quick fix for common parsing issues when albums or tracks contain (special edition), (deluxe edition), [bonus], (version), (single), etc.
2018-04-05 19:31:58 -05:00
Joseph Milazzo
798e85e4db Implemented parsing case for Artist - Year - Album (#264) (#274)
* Implemented parsing case for Artist - Year - Album

* Enhanced test case to ensure year and artist also parse correctly.
Closes #264
2018-04-04 19:02:06 -04:00
Qstick
226f884233 New: Grouped Album Import Notification (#265)
* New: Grouped Album Import Notification

* fixup: Add Emby and Kodi Notify for Album Download
2018-04-03 23:45:59 -04:00
Qstick
fa63b962ea Fixed: Update Ratings on Artist Refresh 2018-04-03 23:43:07 -04:00
Qstick
b6f9ea9397 Fixed: Change default naming so that track number is just before title.
Fixes #270
2018-04-01 21:07:33 -04:00
Qstick
449a1e826d Fixed: Remove Tests for WDTV Artist and Album Image, Same as XBMC
Fixes #267
2018-04-01 21:04:52 -04:00
Qstick
6fbbabfbff Update CONTRIBUTING.md 2018-04-01 13:35:55 -04:00
Qstick
dd215be63d Update README.md 2018-04-01 13:33:28 -04:00
Qstick
19011b7cbb Update README.md 2018-04-01 13:29:10 -04:00
Qstick
f49dce8375 Update ISSUE_TEMPLATE.md 2018-04-01 13:24:56 -04:00
Qstick
bdcdc13485 Fixed: Artist Images for Kodi being saved as poster.jpg instead of folder.jpg
Fixes #257
2018-04-01 01:05:03 -04:00
Qstick
289647b6b1 Added: Sort Album Table on Artist Details Page
Fixes #171
2018-04-01 00:24:31 -04:00
Qstick
b0fb369290 Added: Check if mono is running with --debug arg
13a259b473
2018-03-31 21:51:41 -04:00
Qstick
80fd27b7e4 Fixed: MacOS Appveyor builds don't inlcude startup script (#261) 2018-03-30 16:09:02 -04:00
Qstick
2bca86d0e2 Fixed: Use original extension when saving metadata
This should fix logos for #257
2018-03-26 21:43:18 -04:00
Qstick
9a50b69e8c Fixed: Unable to Add/Edit Metadata Profile after Release Status Addition
Fixes #260
2018-03-26 20:55:49 -04:00
Qstick
121eb6db16 Fixed: Quality Parsing for VBR Fails in many cases
Fixes #258

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-03-25 23:08:05 -04:00
Qstick
22eb5cfc66 Fixed: Add form param before submitting request
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-03-25 21:37:34 -04:00
Qstick
8423b6d488 Fixed: Clean Artist Index Sort Menu, Fix Next/Last Album Sorting
Fixes #256
2018-03-24 22:21:17 -04:00
Qstick
a96df79572 Fixed: Wanted Page Count in UI and Paging, Sort by Album Title 2018-03-24 22:20:13 -04:00
Qstick
df4e1e9b26 Added: Add Release Status to Metadata Profile, Default to Official Only (#250)
* Added: Add Release Status to Metadata Profile, Default to Official Only

* Fixed: Unit Test and Comparison
2018-03-21 20:43:10 -04:00
Qstick
9d7c6bc961 Fixed: Temp fix for errors during import. Catch and report error.
Fixes #204

Co-Authored-By: Josh Jones <vertigo235@users.noreply.github.com>
2018-03-19 22:09:56 -04:00
Qstick
221c670bf9 New: Search for newly added past albums after artist is refreshed
Fixes #195
2018-03-19 21:56:05 -04:00
Qstick
b03b3d8243 Fixed: Detect Kodi nfo vs. Scene nfo. Other extras fixes
Fixes #240

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-03-19 21:38:02 -04:00
Qstick
9d056006cc Fixed: Log event modal doesn't close
Fixes #239
2018-03-19 21:03:02 -04:00
Qstick
ef0590728f Fixed: Calendar Filter Selection and Persist State 2018-03-19 21:00:17 -04:00
Qstick
4940e5014d Fixed: Update File Date Options for Music
Fixes #230
2018-03-19 19:05:09 -04:00
Qstick
580c9e2da8 Fixed: Unable to download release from interactive search
Fixes #242 and Fixes #243
2018-03-18 22:45:20 -04:00
Qstick
8a73b9df8a Fixed: Files with no tags cause qualityWeight error/ui freeze
Fixes #199
2018-03-17 12:50:31 -04:00
Qstick
c08c2eb2f8 Fixed: Jumpbar uses incorrect property 2018-03-17 10:55:16 -04:00
Qstick
87e492fe51 Fixed: Footer doesn't show track or file count. 2018-03-17 10:43:57 -04:00
Qstick
902036fbdb Fixed: Failing test and some flaky tests.
Co-Authored-By: taloth <taloth@users.noreply.github.com>
2018-03-16 23:36:23 -04:00
Qstick
4c74f97153 Fixed: Artist Index Page Blank 2018-03-16 22:44:20 -04:00
Qstick
94cca69e92 Fixed: UI Fixes 2018-03-15 22:26:49 -04:00
Qstick
718e8d7a9e Updated: Raven-js to 3.23.2 2018-03-14 23:26:40 -04:00
Qstick
32c5f48514 Updated: FontAwesome to 5.0.8 2018-03-14 22:57:58 -04:00
Qstick
0f3934454b Cleanup: Cleanup Import/Parsing Files 2018-03-14 22:27:05 -04:00
Qstick
254b3fcfbe Fixed: Musicbrainz track id tag read incorrectly 2018-03-14 22:01:51 -04:00
Qstick
a27b6eb63e New: Required/Ignored restrictions now support /pattern/ regex 2018-03-14 21:45:58 -04:00
Qstick
97d4063cf3 Added: Missing error check when adding a magnet link to deluge 2018-03-14 21:39:37 -04:00
Qstick
4bb0735565 New: Add MLP format to MediaInfoFormatter.cs
Fixes #232
2018-03-14 21:37:48 -04:00
Qstick
7c2a230f87 Fixed: Don't add category when removing torrent from qBittorrent 2018-03-14 21:33:05 -04:00
Qstick
929ad78db3 Fixed: Added errorcode 160 - Permission denied on FileStation 2018-03-14 21:31:27 -04:00
Qstick
7354e02bff New: Custom Filtering for UI (#234) 2018-03-14 21:28:46 -04:00
David Bates
c6873014c7 WIP: Checks the props for missing poster and deals with it accordingly (#221)
* Checks the props for missing poster and deals with it accordingly

* Qucik fixes while trying to fix the Artist Poster index bug..
2018-03-13 22:44:04 -04:00
Qstick
574e8ad36b Fixed: AddArtistService log message 2018-03-06 15:18:21 -05:00
Daniel Underwood
71a0c62fdb Fixed: Add queue size check to sort to fix #219 (#223) 2018-03-06 15:04:06 -05:00
Daniel Underwood
df15dbe462 Fixed: Mono 5.10 compatibility (#220)
* Update NLog to 4.5rc6 to fix compatibility with mono 5.10

* Added console logging in case NLog fails to initialize.

* Revert added references in "Update NLog to 4.5rc6 to fix compatibility with mono 5.10"

This partially reverts commit 13dd224281817ca11af6662ed04f1131dce51fc5.

* Change dictionary cast to conversion from Sonarr/Sonarr@99ee59e
2018-03-01 23:02:08 -05:00
Qstick
346647523b Log response content from Kodi when checking for errors 2018-02-22 21:02:21 -05:00
Qstick
97a0daa1aa Fixed: Gazelle Issues, Plus add feed parse test
Fixes #217
2018-02-19 22:34:44 -05:00
Qstick
88298fbac8 Fixed: Incorrect naming of ArtistFolderImported event 2018-02-18 01:29:38 -05:00
Qstick
a728517eaf Fixed: Incorrect logo for Emby notifications. 2018-02-18 01:18:44 -05:00
Qstick
c9488351e4 Misc Cleanup 2018-02-18 00:40:32 -05:00
Qstick
8e626269d1 Misc Fixes and Better Logging/Rejection Messages for Track Import 2018-02-15 23:03:44 -05:00
Qstick
425a9045b8 Improve error message when deleting a profile that is in use 2018-02-15 22:03:24 -05:00
Qstick
e8771c9c78 Rename TvCategory to MusicCategory for Clients 2018-02-15 21:52:15 -05:00
Qstick
8ef80ba135 Fixed: Send category to qBittorrent when adding torrent/magnet 2018-02-15 21:46:03 -05:00
Qstick
8395999696 New: Selectively refresh albums (#215)
* New: Selectively refresh albums

Closes #211
2018-02-13 02:32:18 +01:00
David Bates
54ca73f474 Fixes two ui issues (#206)
* Fixes two ui issues

References #205
- Fixes issue when in Table mode for the artist index when you click on a letter and error was thrown
- The VirtualTable reference was not set prior to trying to access functions on the object

Also fixes another ui issue I saw, when you were in the search box, the up and down arrows would not work in the Autocomplete componenet, this fixes that.

Gitignore changes to ignore my Idea projects

Adds .editorconfig for editors that respect that to maintain spacing and other config

* Changers per @QStick and the code review.

- Moved Ref out to funtion rather than inline as that can cause a performance hit
- Changed line in gitignore to ignore any .idea folder
- Cleaned up the editorconfig file
- Used proper background color in the CSS for the search suggestions
-
2018-02-11 16:57:00 +01:00
Daniel Underwood
24ff756eeb Fix episode reference and add case for track import failure due to permissions. Fixes #212. (#213) 2018-02-11 04:33:18 +01:00
Qstick
2f6a13092f Update FirewallAdapter.cs 2018-02-10 16:10:31 -05:00
Qstick
3488ba3d84 Fixed: Update Album State on AlbumStudio 2018-02-09 23:52:45 -05:00
Qstick
fe56c62a2b New: Include total space with root folders 2018-02-09 23:25:28 -05:00
Qstick
28a508bed7 Fixed: Remove xpost suffix from release groups 2018-02-09 23:23:27 -05:00
Qstick
6c20832c7f Fixed: Import List Tests 2018-02-09 23:14:15 -05:00
Qstick
37d1ed4a48 Fixed: Grab discography during artist search (#208)
Closes #184
2018-02-10 05:03:12 +01:00
Qstick
c105c9a65e New: Import Lists Base (#196)
* New: Import Lists Base
2018-02-06 18:08:36 -05:00
Qstick
c712d932a0 Fixed: Queue sort keys
Closes #194
2018-02-04 00:53:03 -05:00
Qstick
ec2dc34098 New: Interactive Search from Album Detail Page 2018-02-04 00:27:52 -05:00
Qstick
ff3f52eb3f Fixed: Don't reject paths under /srv 2018-02-03 22:45:30 -05:00
Qstick
ef6a84c136 Fixed: Medium track status on AlbumDetails page. 2018-02-03 22:44:16 -05:00
Qstick
750ecacb9b Fixed: Remove Pre and postbot suffixes from release groups 2018-02-03 21:59:29 -05:00
Qstick
4f6ab8ec76 Fixed: Typo in GlobalExceptionHandlers.cs 2018-02-03 21:58:50 -05:00
Qstick
3e476f2637 New: Add basic ruTracker parser cases 2018-02-03 21:25:17 -05:00
Qstick
2011ff720a Delete Lidarr.icns 2018-01-31 23:21:44 -05:00
Qstick
354055a785 Fixed: Capitalization of lidarr.icns 2018-01-31 23:20:11 -05:00
Qstick
dd875a0c49 Fixed: CutoffUnmet Search Function not working
Closes #193
2018-01-31 22:10:43 -05:00
Qstick
e0993fb52e Fixed: Added ALAC to MediaInfo renamer audio codecs
Closes #198
2018-01-31 21:42:30 -05:00
Qstick
d53b983c91 Fixed: Completed Download HealthCheck not working
closes #200
2018-01-31 21:32:10 -05:00
Qstick
499b222514 Fixed: Plex TV Library updates instead of Music
closes #148
2018-01-31 21:31:37 -05:00
Qstick
19fcc13a39 Update appveyor.yml 2018-01-28 03:08:31 -05:00
Qstick
5551b2166a Rework how albums are refreshed/added, add album search route (#190)
Rework how albums are refreshed/added, add album search route
2018-01-28 01:27:33 -05:00
Qstick
6ff5e6337b Fixed: Virtual tables/grids on Mobile 2018-01-27 01:22:13 -05:00
Qstick
b5339b75ff Fixed: Additional UI number input fixes 2018-01-26 22:00:32 -05:00
Qstick
8cb8059b2f Add Skyhook for Searching by Album
#179
2018-01-25 23:07:15 -05:00
Qstick
54e9f88648 Various UI Fixes and Updates
Closes #188
Closes #185
Closes #187
2018-01-25 22:01:53 -05:00
Qstick
3beac03c00 Update appveyor.yml 2018-01-23 23:45:40 -05:00
Qstick
0f5e67bb75 Fixed: Set Node Version for Build, Reset cache on package.json change 2018-01-23 23:40:07 -05:00
Qstick
9077d0c77e Purge Appveyor build cache 2018-01-23 23:29:08 -05:00
Qstick
8c1e47e9fa Update build.sh 2018-01-23 23:22:01 -05:00
Qstick
663452b2c5 Remove unused package-lock.json 2018-01-23 23:18:05 -05:00
Qstick
b2ce3d5bda Fixed: Lidarr deletes download folder with audio files left over
Closes #182
2018-01-23 23:08:05 -05:00
Qstick
e00c7af8b7 Update build.sh 2018-01-22 11:58:03 -05:00
Qstick
b0070e0229 Fixed: Last UI reference to nameSlug, remove from model 2018-01-21 23:22:12 -05:00
Qstick
afc4aeb25f Update to FontAwesome5 2018-01-21 22:56:41 -05:00
Qstick
b0238c1af4 Fixed: Albums not saving to DB due to release constraint 2018-01-19 23:03:08 -05:00
Matthew Despain
de22991856 Updated donation links 2018-01-18 21:33:00 -07:00
Qstick
9374461d97 Fixed: Page header search box uses incorrect artist link 2018-01-18 21:09:34 -05:00
Qstick
960330a004 Fixed: Albums not loading after 0.2.0.233 2018-01-18 00:08:52 -05:00
Qstick
054578fa2d Fixed: Handle null on album refresh 2018-01-17 23:48:59 -05:00
Qstick
26ef43f302 New: Manually Edit/Override Album Release (#181)
* New: Manually Edit/Override Album Release

* !fixup for comments, loading all albums instead of only artist albums
* fixup! UI Cleanup lint issues
* fixup! Remove AddAlbum service for now, fix refresh override selected release
* fixup! Last one... to fix updating albums with custom release set

Closes #109 
Closes #129 
Closes #128
2018-01-17 21:28:47 -05:00
Qstick
74f433d4f0 New: Added tests for DB Converters 2018-01-14 20:41:52 -05:00
Qstick
b5cd240cc7 Fixed: ESLint and Stylint Issues after UI updates 2018-01-14 17:22:20 -05:00
Qstick
744742b5ff New: UI Updates (Backup Restore in App, Profile Cloning)
UI Pulls from Sonarr
2018-01-14 17:11:37 -05:00
Qstick
80a5701b99 New: Log indexer when processing results 2018-01-14 15:04:05 -05:00
Qstick
9dfa8c5b10 New: Add paused options for Deluge and Transmission 2018-01-14 15:01:31 -05:00
Qstick
cd099c2255 New: Device names for Join notifications 2018-01-14 14:51:12 -05:00
Qstick
d9a8a92b8e New: Indexer Setting for absolute maximum size for a release 2018-01-14 14:47:36 -05:00
Qstick
96c59e2b2b Fixed: Handling of unknown status types in DownloadStation 2018-01-14 14:34:08 -05:00
Qstick
443e536005 Fixed: Only look for monitored albums on artist search 2018-01-07 20:55:03 -05:00
Qstick
bef04af5cd Fixed: Saving proxy settings doesnt take.
Closes #174
2018-01-01 22:21:36 -05:00
Qstick
b1a016289c Refactor Episode section naming to Album in UI 2018-01-01 01:05:24 -05:00
Qstick
0e7a22dc95 New: Run missing root folder health check when an import is successful 2017-12-31 15:24:41 -05:00
Qstick
8ce1d4bcab Fixed: Set release date to 1970-01-01 if track released before (mono) 2017-12-31 15:09:57 -05:00
Qstick
f814b5a6e1 Fixed: Improve logging for invalid NZB messages 2017-12-31 15:05:34 -05:00
Qstick
586eed0c9d Fixed: Ignore macOS DS_Store files 2017-12-31 15:02:43 -05:00
Qstick
99d0421ba7 Fixed: Don't fail build on test failure (#173)
* Fixed: Don't fail build on test failure

This sets Appveyor up to use the original build.sh and test.sh scripts.
Enables tests for Travis
Add frontend linting checks to Appveyor builds
Add Failed Tests message to Appveyor builds
Fix windows installer naming
Fix a few UI issues causing eslint and stylelint to fail

* fixup! forgot one ui fix.

* fixup! Inno doesn't like appveyor appending string to pr version

* fixup! It's too late, my brain is mush
2017-12-31 13:53:16 -05:00
Qstick
422b82da3c Fixed: Manual import quality selection 2017-12-30 15:22:22 -05:00
Qstick
ec12bede9d Fixed: Cleanup 11 more tests 2017-12-30 01:09:10 -05:00
Qstick
d8c89f5bbd UI Updates (Cancel Import, Move Artist, Manual Import from Artist)
Ability to cancel an import lookup/search at any point.
Ability to move artist path from Artist Edit or bulk move from Mass Editor.
Trigger manual import for Artist path from Artist Detail page.
Pulled from Sonarr
2017-12-29 22:23:04 -05:00
Josh Jones
5fae202760 Update text to say album instead of episode. (#170) 2017-12-29 12:22:54 -05:00
Qstick
e98f7398b0 Fix syntax SkyHookProxy GUID check 2017-12-28 23:08:13 -05:00
Qstick
9cd60bc986 Fixed: Skyhook Tests, Validate GUID before sending to metadata api 2017-12-28 22:47:19 -05:00
Qstick
bc8bd9995a Fixed: Don't import based on track number alone. 2017-12-28 22:03:41 -05:00
Tynan CR
1368dd6a53 Fix: Quality range definitions in kbps (#157)
* Quality range uses kbits per second. Quality ranges updated for each format

* Changed vorbis q10 weight

* Fixed element name

* Added migration to keep existing MB/min quality constraints valid

* Fixed migration SQL

* Slider step now 1

* Fix: using kbps for min size as well

* Added tooltip for quality-size

* Updated AcceptableSizeSpecification test

* Small magic number fix
2017-12-27 21:41:11 -05:00
Qstick
aa734bdc25 Fixed: Remove BulkImportFixture, Obsolete.
#166
2017-12-24 23:58:41 -05:00
Qstick
fdb7c96ffa Fixed: DownloadedTrackImport Fixture Tests and ParserFixture Tests
#166
2017-12-24 21:45:28 -05:00
Qstick
aab78a62e6 Fixed: Console logging hard coded to trace level 2017-12-24 14:30:13 -05:00
Qstick
a4dacf2812 Fixed: Language Upgrade Tests 2017-12-24 01:22:48 -05:00
Qstick
8b7b2e6a83 Fixed: QueueSpecificationFixture Tests and Misc Others 2017-12-24 00:34:21 -05:00
Qstick
bfbdba14f6 Fixed: ImportApprovedTracksFixture Tests 2017-12-24 00:03:38 -05:00
Qstick
c4c3c4f620 Fixed: Quality hierarchy not being honored during track import 2017-12-23 23:18:29 -05:00
Qstick
91afcc36c0 New: Validate before deleting artist folders 2017-12-22 21:14:15 -05:00
Qstick
66d3fd17e9 Fixed: Search Criteria parsing returns bad results (Abba/Black Sabbath) 2017-12-21 23:16:36 -05:00
Qstick
882e8a575e Re-enable unit tests in appveyor (#159)
* Re-enable unit tests in appveyor

* Delete SingleEpisodeParserFixture.cs

* fixup! Oops

* Fix multiple tests

* Fixed Language Tests

* Couple More Simple Test Fixes

* Last Round of Test Fixes

* More test Cleanup

* Fix 3 Newznab Tests
2017-12-21 23:00:16 -05:00
Qstick
7820f43b2b Fixed: MediaInfo not parsing for some MP3 files. 2017-12-21 22:05:26 -05:00
Qstick
94d4215a40 Change ‘episode’ to ‘release’ in remove queue modal 2017-12-21 20:35:57 -05:00
Qstick
a4e632d95a Fixed: Mono internals does not properly copy/move symlinks, but instead copies the contents. 2017-12-20 22:30:28 -05:00
Qstick
c83353e7ee Fixed: Possible DivideByZeroException when getting queue
Closes #161
2017-12-20 22:04:24 -05:00
Qstick
9a0587bc17 Fixed: Removed Incorrect assembly, Lidarr.Common is called in base 2017-12-20 22:02:07 -05:00
Qstick
e780555d28 Fixed: Kodi(XBMC) notifications don't update correct Library (#158)
* Fixed: Kodi(XBMC) notifications don't update correct Library

* fixup! MbId and Artist Names in Test
2017-12-19 21:06:55 -05:00
Daniel Underwood
d08d89929a Update services url to https to allow updates to work (#154) 2017-12-17 19:10:48 -05:00
Qstick
ded7574227 Fix Headphones Download Auth, Add Special Parsing (#152)
* Add Secondary Backup Parsing Method if Regex Fails

* Add BasicAuth info to release for nzb download handling
2017-12-17 18:34:58 -05:00
Qstick
ba3d6362af Update ISSUE_TEMPLATE.md 2017-12-17 12:22:22 -05:00
Tynan CR
9d00a17ade Fixed eslint errors and re-enabled build.sh check (#150)
* Fixed eslint errors and re-enabled build.sh check

* Corrected typo

* Corrected typo

* Disabled max-params on files with warnings

* Fixes for PR comments

* Fixes for PR comments

* Fixes for PR comments

* Fixes for PR comments

* Fixes for PR comments

* Fixes for PR comments
2017-12-17 00:49:47 -05:00
Qstick
8116e66d52 Cleanup: Remove Unused Variables from ArtistResource.cs 2017-12-16 22:20:05 -05:00
Qstick
ede3a55c68 New: Add Headphones VIP Indexer (#147)
* New: Add Headphones VIP Indexer

* fixup! String Format Invalid

* fixup! Remove hyphen from search string

* Add Tests for Headphones Indexer
2017-12-15 23:08:16 -05:00
Qstick
532e14040b Fix: DatabaseCorruptException should slow startup loop 2017-12-14 23:49:07 -05:00
Qstick
5f75c6046b Fix: Not Loading/Showing Track on History Page 2017-12-13 23:05:28 -05:00
Qstick
7e4a8c8ff7 New: Artist History Modal in Artist Details Page 2017-12-13 22:38:27 -05:00
Qstick
0981260887 Fixed: MediaCover endpoint 2017-12-13 21:51:19 -05:00
Qstick
8f98fb6c4e Fix: Don't handle content requests in IndexHtmlMapper 2017-12-13 21:49:37 -05:00
Qstick
2ccc5af8d0 Fixed: Security Vulnerabilities allowing authentication to be bypass 2017-12-13 21:46:44 -05:00
Qstick
4525f99370 Fix: Rare timing issue on first-use causing duplicate naming config 2017-12-13 21:32:38 -05:00
Qstick
b63d9d0146 Fixes Misc Issues with Album Metadata Extrafiles (#145)
* Fixes Misc Issues with Album Metadata Extrafiles
* Fixed: Move Empty Subfolders to after ArtistRenamedEvent and Metadata mover
* Remove Path from Album Table, Fix Wdtv, MediaBrowser, Roksbox
* Remove Album Path from UI
* Remove Comments and add Jpeg extension to XMBC image regex
2017-12-12 21:25:30 -05:00
Qstick
71cc80aef9 Fix: Decode Gazelle Response before parsing releases 2017-12-11 23:52:58 -05:00
Qstick
0f17569908 Fix Discography Recognition and Add Parser Test 2017-12-11 21:00:45 -05:00
Qstick
8e57765c28 Fixed: Musicbrainz UI note on Add Artist page 2017-12-10 22:23:06 -05:00
Qstick
d6dbd79199 Update MediaInfo and tests to 17.10 2017-12-09 23:01:12 -05:00
Qstick
f8a0a1b656 Fixed: Can't Monitor Artists in Artist Editor
Closes #142
2017-12-03 18:33:16 -05:00
Qstick
d884914c81 New: Include APFS disks in disk space 2017-12-03 16:00:07 -05:00
Qstick
7be4a376ef New: Channel setting for Slack notifications to override default channel 2017-12-03 15:58:29 -05:00
Qstick
27d65937c0 UI Updates, Separate Auto and Manual Searches per Indexer 2017-12-02 00:03:12 -05:00
Qstick
e181876dfc Fix Sonarr Reference in RemotePathMappingsModal 2017-11-30 19:15:29 -05:00
Qstick
56f6b923e1 Fixed: Add metadata profile exists validator 2017-11-26 21:43:17 -05:00
Qstick
db03f43e30 Log warnings when deleting a track file and the root folder is missing/empty 2017-11-26 20:52:45 -05:00
Qstick
45586a5f20 Fixed: Regression with advanced settings toggle not persist current session 2017-11-26 20:48:39 -05:00
Qstick
cd5b658196 UI Action Handler Changes, Misc Fixes 2017-11-26 15:09:45 -05:00
Fish2
7825319d89 lossless compression of images (#117)
* Lossless Compression of images saves 96 KB

* lossless compression of images

* Add 96-Outline-White For Lidarr and remove Sonarr.svg

* Fix SVG honeycomb
2017-11-26 14:31:48 -05:00
Qstick
a613dad540 Fix Misc Naming in UI and API 2017-11-25 23:55:07 -05:00
Qstick
a6882e7bdd DB Migration Check for Users not on current DB 2017-11-25 23:31:41 -05:00
Qstick
20dc8adac0 New: Validate NZBs before sending to download client 2017-11-25 22:55:50 -05:00
Qstick
5b7339cd73 Add Metadata Profiles (#132)
* Add Metadata Profiles

* fixup! Codacy
2017-11-25 22:51:37 -05:00
Qstick
dd11f74073 New: Add authentication options to Webhook 2017-11-25 22:24:46 -05:00
Qstick
17eac6dac7 Fixed: Incorrect Namespace for TorrentSeedingSpecification.cs 2017-11-25 22:18:05 -05:00
Qstick
b90f58763a Trim quotes from dsm version parts 2017-11-25 22:15:42 -05:00
Qstick
eed81144f6 Fixed: Regression preventing new downloads from bypassing the Download Client Back-off logic 2017-11-25 22:14:51 -05:00
Qstick
2afa6c02de Fixed: Album Metadata Images don't always save in correct folder 2017-11-25 22:01:50 -05:00
Qstick
8219a8014b Fixed: Use Update branch specified in settings instead of always develop 2017-11-25 15:40:12 -05:00
Qstick
9dcf90d241 Fixed: Search on Artist Add, Monitor None Option on Artist Add 2017-11-25 01:08:54 -05:00
Qstick
f7f6ad159c Temp Fix for Calendar Feed until Data Mapper can be fixed. 2017-11-25 00:16:46 -05:00
Qstick
8c68ddfeb2 Don't Build Twice on Branches with Pull Requests 2017-11-25 00:01:51 -05:00
Qstick
d031b823f2 Correct iCal link 2017-11-24 18:41:50 -05:00
Daniel Underwood
30eb8c9c05 Change AlbumResource label to labels due to the change in lidarr/lidarrapi.metadata#13 (#131) 2017-11-20 22:34:27 -05:00
Qstick
10b8174726 Extend Qualities and Setup Default Groups (#127)
* Extend Qualities and Setup Default Groups

* fixup! Extend Qualities

* fixup! Codacy

* fixup! One more
2017-11-20 19:20:21 -05:00
Qstick
ead0b7a2f4 Fix: Show Album Type on Manual Import Album Select Modal 2017-11-18 21:34:22 -05:00
Qstick
9a11b0fd7b Fixed: Telegram notification with underscore and other special characters. 2017-11-16 13:37:08 -05:00
Qstick
26935bd82f Fixed: Flaky Housekeeper Tests 2017-11-16 13:35:11 -05:00
Qstick
4f6415b0e5 Cache BestForTags briefly for better performance when processing releases 2017-11-16 13:33:10 -05:00
Qstick
b3fbd81594 Fixed: Progressively degrading performance issue in Pending/Delayed releases system 2017-11-16 13:24:36 -05:00
Qstick
fa051257e3 Fixed: Releases no longer available on the indexer should be removed from the pending queue 2017-11-16 12:32:31 -05:00
Qstick
acd05ce6cd Fixed: Error in MediaInfo SchemaRevision causing it to be fetched again 2017-11-16 12:09:04 -05:00
Qstick
4faefebe7e Fixed: Raise ApplicationStartupEvent after Owin is running 2017-11-16 12:00:49 -05:00
Qstick
b25c772d52 Improved test timing for CommandExecutor. 2017-11-16 11:58:34 -05:00
Qstick
c2c43666f6 Shutdown logging before Environment.Exit. 2017-11-16 11:53:36 -05:00
Qstick
5d4eb3c6d8 Fix DiskTransferServiceFixture Failing Test 2017-11-16 11:52:08 -05:00
Qstick
0ea3b71bae Cleanup FileNameBuilder 2017-11-16 11:46:35 -05:00
Qstick
08b95e905e Add ArtistService Tests 2017-11-16 11:15:19 -05:00
Qstick
e8d44d1cc2 Add DB Version to About Page (#124) 2017-11-16 11:07:42 -05:00
Qstick
b3f92ccaef Fixed: Project File References 2017-11-15 22:56:16 -05:00
Daniel Underwood
1fa141d6c6 Fix capitalization error of LidarrRestModuleWithSignalR.cs. Resolves #122 (#123) 2017-11-15 22:06:03 -05:00
Qstick
34ca4bf150 Fix: Capitalization in CustomScript.cs 2017-11-15 21:27:41 -05:00
Qstick
21428cba6f Medium Support (Multi-disc Albums), Quality Grouping (#121)
* Multi Disc Stage 1 - Backend Work

* Quality Group Functionality

* Fixed: Only show wanted album types on ArtistDetail page

* Add Media Count Column to ArtistDetail Page

* Parser updates for multidisc cases, other usenet release title formats

* Search for Tracks by Medium Number in Addition to Title and TrackNumber

* Medium Renaming Token for Track Naming

* fixup Codacy and Comment Cleanup

* fixup remove comments
2017-11-15 21:24:33 -05:00
ta264
e1e7cad951 Fix Linux build and set up travis (#119)
* Add missing progress functions

* eslint fails so disable

* Correct case

* Fix copy commands

* Set up travis
2017-11-12 09:18:00 -05:00
Qstick
c3d5419028 Update README.md 2017-11-02 21:03:14 -04:00
David Bates
ffa1eee367 Adds exception to allow metadataSource to be blank (#115)
* Adds exception to allow metadataSource to be blank

* Updates the exception to check for null or whitlespace to be more inclusive
2017-11-02 00:13:10 -04:00
Qstick
f32e8974af Fixed: Import failure when unable to parse folder name 2017-11-01 21:57:09 -04:00
Qstick
b5a8c342e5 Cleanup Sonarr Regexes from Parser.cs 2017-11-01 21:23:29 -04:00
Mark McDowall
ef3234b5de New: Ability to rename using long paths when available 2017-10-31 23:48:41 -04:00
Qstick
8c31d39b3d Add Album Type to Wanted and Cutoff Tab Table 2017-10-31 23:43:40 -04:00
Qstick
1451a63c06 Rename Sonarr References in Backend 2017-10-30 22:25:19 -04:00
Qstick
c333ca4161 Change Backup Names To Not Conflict with Sonarr 2017-10-30 22:03:47 -04:00
Qstick
3f0b315051 Merge pull request #111 from lidarr/fix/change-api-version-v1
Change API Version from V3 to V1
2017-10-30 21:59:37 -04:00
Qstick
aae9f3cfc3 Change API Version from V3 to V1 2017-10-30 21:28:29 -04:00
Qstick
db10057f2c Fixed: Artist Type, MBId OnRename in CustomScript.cs 2017-10-30 20:51:46 -04:00
Qstick
c2ee23b6d9 Fixed: Naming of 002 Migration 2017-10-30 20:24:36 -04:00
Qstick
74d05a2804 Create LICENSE 2017-10-29 22:32:43 -04:00
Qstick
5c240cd653 Merge pull request #110 from lidarr/react
React UI Base and Many Updates
2017-10-29 22:31:11 -04:00
Qstick
bbb983deb2 Fixed: Default ports for uTorrent and qBittorrent 2017-10-29 21:56:25 -04:00
Qstick
2abeec06fc Fixed: Better import error messages 2017-10-29 21:55:15 -04:00
Qstick
78fcf86294 Fixed: Execute On Grab script if release group is unknown 2017-10-29 21:44:03 -04:00
Qstick
3cada6d069 Fixed: Long Deluge ETAs from breaking getting queue items 2017-10-29 21:43:23 -04:00
Qstick
899f12fd0c Set test log output via environment variable 2017-10-29 21:40:10 -04:00
Qstick
2dddf8cb33 Fixed: Don't ignore filenames that start with periods 2017-10-29 21:30:18 -04:00
Qstick
a1bf1b99f5 Fixed: Case insensitive paths for static resources under Windows 2017-10-29 21:26:22 -04:00
Qstick
d3aa032cf5 Fixed: Don't attempt to fetch a release if the download client is disabled 2017-10-29 21:22:58 -04:00
Qstick
bff3a55ff3 New: Initial state for torrents added to qBittorrent 2017-10-29 17:51:46 -04:00
Qstick
b7fab7db0c Log when running tray app 2017-10-29 17:46:54 -04:00
Qstick
30a3348ba8 Move DB migration to start 2017-10-29 17:42:53 -04:00
Mark McDowall
9adc168b90 Don't get registered URLs until they need to be configured 2017-10-29 17:37:12 -04:00
Qstick
37fc1f4dcc Update help output for NzbDrone.Console 2017-10-29 17:35:35 -04:00
Qstick
bd1da4b10a Fixed: Force priority items in paused SAB queue won't show as paused 2017-10-29 17:34:21 -04:00
Qstick
0e1dfed8d7 Fixed: Provider Status housekeeping 2017-10-29 17:32:57 -04:00
Qstick
492cf1b1bb New: FormatAudioChannelsFixture.cs 2017-10-29 17:26:04 -04:00
Qstick
7d64bb403f New: Initial state for torrents added to UTorrent 2017-10-29 17:22:14 -04:00
Qstick
91d8fd4ed5 Fixed: Backup API improvements 2017-10-29 17:17:25 -04:00
Qstick
967839154c New: Start torrents added to uTorrent by default, add option 2017-10-29 17:14:01 -04:00
Qstick
be6f89cd76 Fixed: Size parsing of empty description from torrent RSS feeds 2017-10-29 17:07:55 -04:00
Taloth Saldono
c222b7acf1 Added jackett apikey to log cleanser. 2017-10-29 00:51:11 -04:00
James White
d6374388a1 Fix inconsistent naming of qBittorrent in various places 2017-10-29 00:50:14 -04:00
Qstick
c91f4b4442 Fixed: Logging error when accessing mount point 2017-10-29 00:49:47 -04:00
Qstick
028e7d1c7d Added Test Case for DiskSpaceService 2017-10-29 00:47:01 -04:00
Qstick
3f420ff6bd Fixed: Test case for unavailable download client 2017-10-29 00:45:27 -04:00
Taloth Saldono
2fc58115a0 Fixed: Changes in http redirect logic causing failed grabs and >25% cpu usage. 2017-10-29 00:42:50 -04:00
Qstick
25f08bd846 Fixed: Add Unittest for DiskSpaceService irrelevant mounts 2017-10-29 00:42:03 -04:00
Qstick
fe4499ee97 Fixed: Use pending download if no download client is configured 2017-10-29 00:37:15 -04:00
Taloth Saldono
1db04eaa1a Fixed: TLS issue for OSX. 2017-10-29 00:34:59 -04:00
Taloth Saldono
846b9f72e0 Lets not take any risks here. 2017-10-29 00:34:03 -04:00
Taloth Saldono
bd62a20ddb Fixed: Recent changes to log messages prevented curl fallback from being triggered for tls1.2.
fixes #2089
2017-10-29 00:33:07 -04:00
Taloth Saldono
cc0a6dc8da Disable test on mono managed http. 2017-10-29 00:30:17 -04:00
Taloth Saldono
96d97f873a Fixed: http->https redirects do not use the tls1.2 curl fallback.
fixes #2082
2017-10-29 00:29:22 -04:00
Qstick
12d89b9ab5 Fixed: DownloadedTrackScan API should delete source folder if ImportMode is Move 2017-10-29 00:27:46 -04:00
Qstick
f219e883ec New: Add Extra Audio Format Unit Test 2017-10-29 00:16:47 -04:00
Qstick
b34c1e5332 Fixed: Unit tests after MediaInfo change 2017-10-29 00:10:45 -04:00
Qstick
64d58a2248 Fixed: Backup fails on certain platforms 2017-10-29 00:10:27 -04:00
Qstick
272adfcef7 Fixed: Better error message for DNS exceptions on mono. 2017-10-28 23:58:16 -04:00
Qstick
f09ef025c5 Fixed: Improved database backup journal handling 2017-10-28 23:54:26 -04:00
Qstick
99ab61fac6 Fixed: Slower daemon startup loop if Lidarr runs into non-recoverable errors 2017-10-28 23:49:54 -04:00
Qstick
38a6dbbc42 Fixed: Null Check on Sabnzbd Version Parse 2017-10-28 23:40:27 -04:00
Qstick
311df71acf Fixed HttpUri parsing of domain names with underscores 2017-10-28 23:38:21 -04:00
Qstick
1c1549820b Fixed: Ignore '.unwanted' directory when importing. 2017-10-28 23:36:09 -04:00
Qstick
099f24afea Fixed: Abort Newznab indexer Test if connection failed. 2017-10-28 23:14:40 -04:00
Taloth Saldono
4968cb9973 Fixed: Changed qbitTorrent 3.3.14 api.
fixes #1956
2017-10-28 23:10:44 -04:00
Qstick
57aaf62a46 New: Store track renames in History 2017-10-28 23:09:20 -04:00
Qstick
257af8b914 Fixed: Try to set last write time on files moved to recycle bin 2017-10-28 23:00:09 -04:00
Qstick
4725f4b2bd Fixed: Lidarr stuck if Deluge didn't return an infohash. 2017-10-28 22:57:03 -04:00
Qstick
641f8a88fa Fixed: Calculates wrong age for releases pushed via ReleasePush api 2017-10-28 22:52:36 -04:00
Qstick
c5661cba04 Fixed: Roksbox metadata images being generated when settings are off 2017-10-28 22:39:17 -04:00
Qstick
2aa8a57925 Slack Improvements 2017-10-28 22:35:50 -04:00
Qstick
9f079fb8ba Fixed: Batch Monitor/Unmonitor on Wanted Pages 2017-10-28 21:44:06 -04:00
Qstick
b99b23b4bb Remove non-working Nyaa Baseurl 2017-10-28 17:47:01 -04:00
Qstick
b3b90602a2 Fix Mono SecurityProtocolPolicy 2017-10-28 17:43:46 -04:00
Qstick
6af1ffba50 New: Webhook improvements 2017-10-28 17:38:57 -04:00
Qstick
7e863d61ff Reorder HttpMethods to match RestSharp 2017-10-28 17:13:34 -04:00
Qstick
9a2cb67980 Fixed: Subtitle extensions should be case-insensitive. 2017-10-28 17:11:41 -04:00
Qstick
331bf5914a Fixed: Check if NzbGet KeepHistory value is set too high 2017-10-28 17:04:35 -04:00
Qstick
b88d4aad0e Fixed: Show rounded age in minimum age rejection message 2017-10-28 16:52:48 -04:00
Qstick
d8adc3f480 Fixed: Ignore case when importing extra files 2017-10-28 16:37:24 -04:00
Qstick
ba27554bd3 Tweaked SingleInstancePolicy not to cancel startup if AppData is overridden is set 2017-10-28 16:35:02 -04:00
Qstick
d6bb4c29d0 New: Download client and ID for custom scripts 2017-10-28 16:30:38 -04:00
Qstick
cb9af37c39 Misc UI Updates 2017-10-28 16:13:32 -04:00
Qstick
1b64171b30 Fix Poster Render on Add Artist, Add EPs by Default 2017-10-28 15:51:10 -04:00
Qstick
90018cf487 Check Exist before Rendering Posters/Banners 2017-10-26 23:28:36 -04:00
Qstick
13bfb73ee9 Upstream Changes to DownloadClients and Indexers 2017-10-26 23:21:06 -04:00
Qstick
f6d1b77b45 Misc Newznab/Torznab Updates 2017-10-25 23:08:37 -04:00
Qstick
5bee842b26 New: Ability to set minimum seeders on a per indexer basis 2017-10-25 22:30:31 -04:00
Qstick
28d5fbe409 Fixed: Don't import the same file again 2017-10-25 22:14:06 -04:00
Qstick
541edc9749 Fix: Change IndexerId to ProviderId in OrphanedIndexer Housekeeper 2017-10-25 22:02:51 -04:00
Qstick
a69ceb35fb Update Integration Unit Tests 2017-10-25 22:02:14 -04:00
Qstick
fd048bc92e Update build-appveyor.cake 2017-10-24 22:41:44 -04:00
Qstick
10c29a65db Assembly Naming, Default Windows Service Account 2017-10-24 22:31:37 -04:00
Qstick
f1b1904e07 Update DB Schema, Change Artist Slugs, Rework SubtitleFiles to LyricFiles 2017-10-24 21:25:29 -04:00
Qstick
6718d82432 Small UI Tweaks, Fix Banner Images When Artist Deleted 2017-10-22 16:15:04 -04:00
Qstick
75aa8af9d2 Check for valid URL in MetadataSource, Handle trailing slash 2017-10-22 02:51:09 -04:00
Qstick
1396be4833 Fix Blank Notifications Modal 2017-10-22 02:30:18 -04:00
Qstick
70cc2ed8a5 AlbumStudio and ArtistEditor Fixes 2017-10-22 01:25:59 -04:00
Qstick
49309125b6 UI Cleanup, Artist Overview Truncate 2017-10-21 23:49:05 -04:00
Qstick
9b39fea706 Fix Default Quality Profiles 2017-10-18 22:57:11 -04:00
Qstick
4b278c80aa Rename UI Component Episode to Album 2017-10-18 21:56:15 -04:00
Qstick
a80360f6fd Remove Remaining TV Code 2017-10-18 21:42:57 -04:00
Qstick
81716762d8 Update README.md 2017-10-18 08:10:20 -04:00
Qstick
42e25055a9 Rework Tests for Music, Start TV Code Cleanup 2017-10-17 22:55:02 -04:00
Qstick
1688c0a8df Update Codacy Badge 2017-10-17 21:57:57 -04:00
Qstick
35eeef3af6 Fix Search Fail When Cannot Parse a Release 2017-10-17 21:07:10 -04:00
Qstick
eaba78ad4a Add AlbumCutoffService and Refactor UI 2017-10-17 00:05:03 -04:00
Qstick
8683c92de6 Opps Left out of Previous Commit 2017-10-16 22:09:26 -04:00
Qstick
debad793ee Add ArtistEditedService to handle AlbumType Changes 2017-10-16 22:08:49 -04:00
Qstick
bba52cdbc8 Update RootFolderCheckFixture and RootFolderServceFixture 2017-10-16 21:56:42 -04:00
Qstick
c5325f3630 Update Remainder of Logos in UI 2017-10-16 21:50:12 -04:00
Qstick
38cbb2114f Refactor ExtraFile/MetadataFile Services (#104)
* Preliminary Work for Extras for Music

* DB Migration for ExtraFiles, Other Cleanup

* More Extras Work, Add Album Metadata Type

* Update Housekeeps for Music Extras

* Fix HouseKeeper and add new Tests

* Final round of Cleanup
2017-10-16 21:40:31 -04:00
Qstick
4016d359ac Guard Against Null AlbumTitle on Import 2017-10-15 15:30:36 -04:00
Qstick
2f74ad6540 Fix String Format Error in NotificationService 2017-10-15 14:16:11 -04:00
Qstick
7776862359 Fix Manual Album Grab, Clean ReleaseResource 2017-10-15 13:10:45 -04:00
Qstick
566ac1a9d3 [UI Work] Add Overview Artist Index View 2017-10-15 02:17:53 -04:00
Qstick
f6fc78d927 Misc Build Script Updates 2017-10-15 00:07:56 -04:00
Qstick
3a4c6fe364 Remove Core.TV references in preperation for Cleanup 2017-10-08 16:25:29 -04:00
Qstick
6685644c5c Refactor Various HouseKeepers 2017-10-08 16:07:54 -04:00
Qstick
a956e22ce1 Remove SeriesStats Reference and other Series Mapping 2017-10-08 15:33:59 -04:00
Qstick
f4e831dd74 Add AlbumType Defaults on Imported Artists 2017-10-08 15:26:04 -04:00
Qstick
7d045d5c54 Cleanup RootFolderService and Validation 2017-10-08 15:09:46 -04:00
Qstick
1d120be466 Remove SeriesStats 2017-10-08 14:55:52 -04:00
Qstick
dd56abffba Fix Interactive Import Allowing Import without Deselect/Select of Row 2017-10-08 14:49:42 -04:00
Qstick
0d8bec272e Update RootFolder Health Check 2017-10-08 02:11:36 -04:00
Taloth Saldono
18971f9ea2 Check for whitespace in IsValidUrl.
closes #2020
2017-10-08 01:32:25 -04:00
Qstick
cf11906118 Don't log error on the shutdown the command execution pipeline. 2017-10-08 01:20:51 -04:00
Qstick
4cb3d8bac7 Log responses from qbit 2017-10-08 01:18:13 -04:00
Qstick
0148f48913 Fixed: Logging full error message to database 2017-10-08 01:14:26 -04:00
Qstick
ad50be9daf Fixed: Error message when adding a Plex server without a TV library 2017-10-08 01:03:37 -04:00
Qstick
52fbdeaa53 Fixed: Error when processing manual import decisions 2017-10-08 01:00:54 -04:00
Qstick
44e4e46b15 Additional logging when on import decision 2017-10-08 00:55:14 -04:00
Taloth Saldono
828d70b0bd Removed ugly UUID= VolumeLabel from mounts. 2017-10-08 00:51:00 -04:00
Qstick
54bd3c0b49 Fixed up some errors and do the guid cache fix on the module instead of backend coz that would cause other issues. 2017-10-08 00:43:07 -04:00
Qstick
3383cc1744 Fixed: Deleting an trackfile from the UI that was already deleted from disk 2017-10-08 00:28:57 -04:00
Qstick
d7ef6cc88b Fixed: Improved message when a conflicting slug is added 2017-10-07 23:58:32 -04:00
Qstick
f8f988a083 Misc Sonarr Pulls 2017-10-07 23:54:13 -04:00
Qstick
4c916f9186 Fix HealthCheck Warning for Artist Folders with 'ro' 2017-10-07 23:26:45 -04:00
Kyse
889b963429 New: Health Check warning if series folder is mounted with 'ro' option on linux
Closes #1867
2017-10-07 23:09:29 -04:00
Qstick
a37be66f34 Improve Load Time of Artist Detail Page, and Wanted Page 2017-10-07 23:01:49 -04:00
Qstick
1700c471b7 More UI Cleanup 2017-10-07 18:38:31 -04:00
Qstick
9c88c2006d Disable Caching of Album Images For Now 2017-10-07 17:40:17 -04:00
Qstick
f812302aa5 More Work on Album Filtering per Artist 2017-10-07 17:37:18 -04:00
Qstick
6a4fb9adf3 Seperate Sentry Project for Production/Develop 2017-10-07 16:29:38 -04:00
Qstick
1fd3a43a4f Update AssemblyInfo for Versioning 2017-10-07 15:57:46 -04:00
Qstick
023452e1c3 Add Page Populator from Sonarr 2017-10-07 02:47:28 -04:00
Qstick
52e3d96f4a UI Formatting Cleanup 2017-10-07 02:21:06 -04:00
Qstick
b963f2aa82 Add prelim work for Album Filtering 2017-10-07 00:13:00 -04:00
Qstick
74f91d63f6 Fixed: metadata modal not closing 2017-10-07 00:06:21 -04:00
Qstick
90a4838958 Tweak Release Parsing, Add Less strict Regex Cases for Title 2017-10-06 22:52:32 -04:00
Qstick
02925245c2 Rename Episode Instances to Album to fix AlbumModal 2017-10-06 22:28:30 -04:00
Qstick
bd3bd9a378 Fix for History Not Showing 2017-10-05 23:27:12 -04:00
Qstick
cbcccf0d9d Fix Bug with TrackDownloaded Notifications 2017-10-05 22:55:32 -04:00
Qstick
4ccb625f18 Update References and Links in General Settings 2017-10-05 22:37:17 -04:00
Qstick
f3e55a236c Misc UI Fixes 2017-10-05 22:32:26 -04:00
Qstick
52f4f1de03 Remove duplicate ArtistDeleteEvent Handle 2017-10-01 23:41:13 -04:00
Qstick
e6bf157302 Update yarn.lock 2017-10-01 23:26:45 -04:00
Qstick
c8ed46850a Updates to UI, Update NLog to 4.4.12 2017-10-01 23:05:28 -04:00
Qstick
31db4e2026 Guard Against QualityParser NullReferenceException 2017-09-28 23:43:47 -04:00
Qstick
78f1066535 Add Additional Logging to Track Parsing 2017-09-28 23:32:42 -04:00
Qstick
04766bb786 Remove Series MediaFile Commands 2017-09-28 23:19:27 -04:00
Qstick
ed3b47d76a Support for Artist Disambiguation and Type 2017-09-28 23:03:13 -04:00
Qstick
6e4638f7b1 Update Music Tests, Added Cases for Should Refresh Artist, Cleanup Skyhook Resources 2017-09-28 22:02:08 -04:00
Qstick
d10fb92a09 Fix regression in EditMetadataModal 2017-09-28 00:06:27 -04:00
Taloth Saldono
fcd6feafa9 Updated Transmission tests. 2017-09-27 22:23:27 -04:00
Taloth Saldono
7f882ee425 Fixed: Sonarr not importing torrents in Vuze if the torrent already finished seeding and was stopped. 2017-09-27 22:22:47 -04:00
Taloth Saldono
f67d748da1 Fixed: Incorrect imports with Vuze when torrent contains a single file.
fixes #1805
2017-09-27 22:21:50 -04:00
Qstick
82ee8e6c42 Fixed: Smarter application update completed message
Sonarr e97e13e89
2017-09-27 22:20:37 -04:00
Qstick
4aa5a35cb4 Added -Scrambled to the ReleaseGroup cleanup list
Sonarr f8d5f1fc9
2017-09-27 22:07:35 -04:00
Qstick
c3407657c6 Fixed: Moving and Removing of downloads in usenet clients
Sonarr f36d5dc88
2017-09-27 21:56:39 -04:00
Qstick
4c6313c9e2 Fixed: Handling of priority setting when queueing is disabled in qBittorrent
Sonarr f8b8fcfb8
2017-09-27 21:48:25 -04:00
Qstick
d99fd151e3 Fix regression in Indexer Edit Modal 2017-09-27 21:35:09 -04:00
Qstick
203a7980cf Fixed: Regression causing nzbToMedia imports to be copied instead of moved.
Sonarr de7f68570
2017-09-26 23:40:08 -04:00
Qstick
911b1ed91c Fix AppVeyor Build Script 2017-09-26 23:33:42 -04:00
Qstick
64d9457322 New: Check whether an existing trackfile was deleted before grabbing an upgrade, to avoid timing issues in combination with Ignore Deleted Tracks.
Sonarr fa006d85f
2017-09-26 23:30:24 -04:00
Qstick
77aa34c340 Fixed: Double periods in extra file names after rename
Sonarr 413ce1d9a
2017-09-26 22:25:20 -04:00
Qstick
e8fb678fb8 Fix issue adding a artist when NameSlug for another artist null
Sonarr '413ce1d9a
2017-09-26 22:23:50 -04:00
Qstick
5003cd8a14 Rename More Sonarr References 2017-09-26 22:06:05 -04:00
Qstick
f69559e4da Misc Frontend Updates 2017-09-26 21:33:39 -04:00
Qstick
729d1142b0 Log TrackImport and TrackFileDeleted to History 2017-09-25 23:44:53 -04:00
Qstick
ab9a9232cf Sonarr Pulls
'e4c341898
'5613ab05e
'372442af2
'28c45f941
'ea1616586
2017-09-25 22:31:52 -04:00
Qstick
482f8c1a61 Map Album from parsed LocalTrack to ManualImportItem 2017-09-25 21:27:18 -04:00
Qstick
4358184b78 Change Recycle Bin to Handle ArtistDeleteEvent
Ensures track files are deleted when requested on an artist delete event
2017-09-25 21:15:10 -04:00
Qstick
9be4ec4c15 [UI] Refactor TrackFile Modal 2017-09-24 22:58:13 -04:00
Qstick
e3c6bc3263 Updates to MediaInfo Formatter 2017-09-24 21:03:36 -04:00
Qstick
d243a8c8c4 Add Tracklist to Album Modal 2017-09-24 15:44:25 -04:00
Qstick
90d9741056 Fix Interactive Import, Add Track Actions and Reducers 2017-09-24 01:10:24 -04:00
Qstick
8f45fe0afe Rework Tags for Music 2017-09-23 00:30:52 -04:00
Qstick
d6efae537f Rework DiscSpaceService, Misc Cleanup 2017-09-23 00:19:55 -04:00
Qstick
9b62c0cb75 Add Back Packages to Support Native VS UnitTests 2017-09-23 00:01:35 -04:00
Qstick
4e7a2a3ed4 Add support for searches in newznab if indexer doesnt support audio params (Jackett) 2017-09-22 23:35:49 -04:00
Qstick
1322633d0d Add Support for Gazelle based indexers 2017-09-22 22:48:15 -04:00
Qstick
7c3446baab Remove Newznab & Torznab Anime Categories Setting 2017-09-22 22:27:26 -04:00
Qstick
2938bfee2c Fix for Torznab/Jackett 2017-09-22 22:19:07 -04:00
Qstick
864549b1f3 Initial Notification Support, XBMC and PLEX still need work. 2017-09-22 21:59:24 -04:00
Qstick
56e8f5c730 Update README.md 2017-09-21 19:12:08 -04:00
Qstick
8d64a987e0 Remove Previous API 2017-09-21 00:18:47 -04:00
Qstick
0201aa812e Add Advanced Option for Alternate Metadata Provider Source 2017-09-20 22:13:14 -04:00
Qstick
f460f630c3 Target to .NET 4.6.1, Update SignalR, Owin, Nancy (#84)
* Target .net 4.6.1

* Update to SignalR 2.2.2

* Fix Socks Reference in NZBDrone.Common

* UI Fixes, Build Fixes

* Update Nancy to 1.4.4

* Upgrade Microsoft Owin to 3.1.0

* Delete npm-shrinkwrap.json

* Fix SignalR Messages
2017-09-20 22:05:00 -04:00
Qstick
fbe6bfc78e Add Album Label Support from Metadata 2017-09-17 23:20:36 -04:00
Qstick
405e7f981d Download Handling, Clean Up Drone Folder Leftovers 2017-09-17 23:00:37 -04:00
Qstick
9f689c0233 [UI] Fix Album History Showing for Every Album 2017-09-17 21:26:38 -04:00
Qstick
6e7299cdf2 Fix Build Issue due to localEpisode reference 2017-09-17 16:47:51 -04:00
Qstick
48d31523a5 [UI] Add Language to Manual Import, Fix Posters,Banners 2017-09-17 16:39:13 -04:00
Qstick
25eef250a4 [UI] Add Banner View to Artist Index 2017-09-17 02:24:15 -04:00
Qstick
07b37c1575 Update MediaCover Module to Work with Artist and Album Images 2017-09-16 23:26:56 -04:00
Qstick
f1aec8f15c Add Logo Mediacover Type 2017-09-16 16:27:38 -04:00
Qstick
44cc642ad4 [UI Work] Misc UI Fixes and Tweaks 2017-09-16 16:22:06 -04:00
Qstick
2a6decdc4c Logging for UI 2017-09-16 11:09:23 -04:00
Qstick
871a3773b2 [UI Work] History, Queue, Calendar Fixes 2017-09-16 00:16:26 -04:00
Qstick
d2bafd4605 Add Support for Artist Links from Metadata 2017-09-15 22:49:38 -04:00
Qstick
06a2f65fd9 Update README.md 2017-09-15 18:53:05 -04:00
Qstick
0a7f18e843 [UI Work] Artist Detail, Album Dialog, Album Search, Album Missing Search 2017-09-14 23:35:12 -04:00
Qstick
5fec72395c Null Checks for Track Parsing, Parse by Title if TrackNumber is missing 2017-09-14 23:33:13 -04:00
Daniel Underwood
02716c26f6 Update metadata api URL 2017-09-14 17:51:26 -04:00
Qstick
f05332cf6e [UI Work] Interactive Import, More Artist Detail 2017-09-12 23:28:45 -04:00
Qstick
0054226307 [UI Work] Artist Detail Page, Album Studio, Wanted, NavSearch, Rename 2017-09-11 23:11:32 -04:00
Qstick
456ead09da [UI Work] Settings Naming Page, Other Settings 2017-09-10 23:03:48 -04:00
Qstick
22d9c5e666 Fix GitIgnore, Update from Sonarr 2017-09-10 21:20:36 -04:00
Qstick
77f1d2e64c [UI Work] Add Artist, Import Artist, Calendar 2017-09-07 23:09:52 -04:00
Qstick
a747c5f135 Fix some Build Issues, Renaming 2017-09-05 23:38:05 -04:00
Qstick
95051cbd63 Initial Commit Rework 2017-09-05 23:00:26 -04:00
Qstick
74a4cc048c Fixed: UI Artist lookup autocomplete with diacritics. 2017-09-03 22:26:15 -04:00
Qstick
0807fcc616 Cleanse Log Exception Data (#83) 2017-09-02 06:39:21 -04:00
Qstick
0b22d7fce3 Create Orphaned Albums Housekeeper (#82) 2017-09-02 06:39:02 -04:00
Qstick
43677e8481 Create OrphanedTracks Housekeeper (#81) 2017-08-31 22:28:18 -04:00
Qstick
c0e922e4a2 Fixed RssParser test. (#80) 2017-08-31 22:05:51 -04:00
Qstick
d4b4324dab Should not empty install folder, MirrorFolder will take care of it. (#79) 2017-08-31 21:53:44 -04:00
Qstick
a292f77aa8 Sonarr DiskTransferService Updates (#78)
* Added a few more files to ignore during file copy.

* Tweaked error message when TransferFile destination already exists.
2017-08-31 21:46:30 -04:00
Qstick
b0cde61dd0 Fixed: UnsupportedFeedException should log error for each item (#77) 2017-08-31 21:28:32 -04:00
Qstick
52a4227bc4 New: Additional variables for custom script on grab events (#76) 2017-08-31 21:10:50 -04:00
Qstick
bcd72367d9 Organize TrackImport Directory and Fix Tests (#72)
* Organize TrackImport Folder and Fix Tests

* Remove Commented Out Line

* Remove Old Code
2017-08-30 22:42:40 -04:00
Daniel Underwood
ffc2fb5f60 Change AlbumSearchCommand to public to resolve error when searching (#74) 2017-08-28 22:37:59 -04:00
Qstick
e405cc9cf0 Rename DownloadedEpisodesScan to DownloadedAlbumsScan (#71)
* Rename DownloadedEpisodesScan to DownloadedAlbumsScan

* Rename Command Service
2017-08-27 21:21:51 -04:00
Qstick
2c42fc19e5 Rename Drone Factory Config Keys (#70)
* Rename Drone Factory Config Keys
2017-08-27 20:32:26 -04:00
Qstick
19414912ad Cleanup Disk Scan Service (#69)
* Cleanup Disk Scan Service

* Fix Encoding, Change mp4 to flac
2017-08-27 16:32:41 -04:00
Qstick
9fba2458d8 Remove TV search commands (#68)
* Remove TV search commands

Remove TV search commands

* Cleanup Newznab, Fix variable name in IntegrationTests
2017-08-27 16:24:44 -04:00
Qstick
92f06cf70f Add TrackFiles Housekeeper (#66)
Add TrackFiles Housekeeper
2017-08-26 21:07:37 -04:00
Qstick
ec856d8ffe Update README.md 2017-08-26 10:31:55 -04:00
Qstick
8569084255 Refactor and Enable Renaming for Album and Artist Files (#61)
Refactor and Enable Renaming for Album and Artist Files
2017-08-25 22:00:14 -04:00
Qstick
1c3cfad23f Fix Misc UI issues (#62) 2017-08-24 22:51:36 -04:00
Qstick
de5e0871cf Bulk Import (#55)
Bulk Import
2017-08-23 21:39:27 -04:00
Qstick
0da6f6e3c7 Fix Navbar Search after new DB Schema (#60)
Fix Navbar Search after new DB Schema
2017-08-19 22:46:11 -04:00
Qstick
2575403c6b Artist overview in SearchResult and ManualImport (#58)
Artist overview in SearchResult and ManualImport
2017-08-19 22:06:42 -04:00
Qstick
1a1721b4ee Fixes misc issues on Artist Detail Page (#57)
Get MB link working, bring in album-type from db instead of hard code, sort albums by release date, fix quirk with track number sorting, rename tool-tips
2017-08-19 21:03:09 -04:00
Cédric L
0c2880c2fe Fix macOS icon (#56)
* fix iconfile name
* add correct icon
2017-08-19 12:07:59 -04:00
Qstick
3da6274211 API Key for signalR connections (#54) 2017-08-17 21:29:20 -04:00
Qstick
c02857963d Update OSX Info.plist (#53)
Update OSX Info.plist
2017-08-17 21:28:55 -04:00
Qstick
fcffd5461e Refactor ReDownload Failed Service (#52)
Refactor ReDownload Failed Service
2017-08-17 21:28:35 -04:00
Qstick
025534cf71 Fix Setup of Newznab Test (#51)
Fix Setup of Newznab Test
2017-08-17 21:28:07 -04:00
Qstick
4f61354dc5 Add Paging to Waffles Requests (#39)
* Add Paging to Waffles Requests
* Make pages dynamic variable to match others
2017-08-17 20:30:44 -04:00
Qstick
337f74a184 Refactor Blacklist for Album Releases (#48)
* Refactor Blacklist for Album Releases
* Fix Test
2017-08-16 17:55:59 -04:00
Qstick
87f13e5e9c Fix Track and Album Format Issues on Artist Page (#49)
Fix Track and Album Format Issues on Artist Page
2017-08-16 00:02:49 -04:00
Qstick
a5ac4ed37a Remove Non-Music Indexers (#42)
Remove Non-Music Indexers
2017-08-15 12:28:41 -04:00
Qstick
934bde7858 Add Image Map and Clean SkyHookProxy (#38)
Add Image Map and Clean SkyHookProxy
2017-08-14 13:26:35 -04:00
Qstick
1e4d9480e9 Implement Release Parsing, Decision Engine, and Downloading (#35)
* Implement Parsing, Decision Engine, and Downloading
2017-08-13 22:58:42 -04:00
Qstick
5556989324 Implement Waffles Indexer (#34)
* Implement Waffles Indexer

Implement Waffles Indexer

* Remove Exception Class

Remove Exception Class

* Fix csproj file

Fix csproj file

* Add Test Fixture

Add Test Fixture

* Split line due to length for readability

Split line due to length for readability
2017-08-05 22:17:44 -04:00
Qstick
ae8c766b57 Merge pull request #18 from lidarr/feature/indexers
Added: Indexer search and release processing
2017-08-04 19:22:05 -04:00
Daniel Underwood
30b263d49d Additional code cleanup 2017-08-04 00:15:58 -04:00
Daniel Underwood
322e9f3c51 Clean up remaining codacy issues 2017-08-04 00:02:50 -04:00
Daniel Underwood
31b13b3336 Merge branch 'feature/indexers' of github.com:lidarr/lidarr into feature/indexers 2017-08-03 23:44:04 -04:00
Daniel Underwood
11095f7c83 Clean up codacy issues 2017-08-03 23:42:24 -04:00
Daniel Underwood
ad911edfb1 Implement artist search for newznab and omgwtfnzbs 2017-08-03 23:34:07 -04:00
Daniel Underwood
f7bf03499b Add artist to rarbg album query 2017-08-03 23:33:02 -04:00
Qstick
7691265e66 Fix Newznab if statement, Clean Test Fixture
Fix Newznab if statement, Clean Test Fixture
2017-08-03 23:21:10 -04:00
Daniel Underwood
ea6b4b1389 Change visibility of ArtistSearchCommand and ArtistSearchService due to test build error 2017-08-03 23:08:24 -04:00
Daniel Underwood
8bde4b660c Change AlbumSearchCommand to take a list of ids instead of a single id 2017-08-03 22:48:18 -04:00
Daniel Underwood
163a2f7495 Add missing file for 1d46e71 2017-08-03 22:45:47 -04:00
Daniel Underwood
1d46e718bb Add equivalent of SeriesSearchServiceFixture for artists 2017-08-02 21:04:21 -04:00
Qstick
5b22e5a9ae Newznab Indexer Tests
Newznab Indexer Tests
2017-07-31 22:11:50 -04:00
Qstick
f72afba764 Album Search for Omgwtfnzbs
Album Search for Omgwtfnzbs
2017-07-30 21:22:17 -04:00
Qstick
3888fec0d1 Hookup Auto and Manual Search in Album Dialog
Hookup Auto and Manual Search in Album Dialog
2017-07-28 22:35:33 -04:00
Qstick
f0b68afccd Adds Newznab Album Search Support
Adds Newznab Album Search Support
2017-07-28 22:03:28 -04:00
Qstick
b63b2d70df Fixed: Refactor misc text and variables in settings (#31)
Fixed: Refactor misc text and variables in settings
2017-07-24 20:56:40 -05:00
Daniel Underwood
f40918ddb8 Add artist search framework code 2017-07-19 22:34:16 -04:00
Daniel Underwood
6ecaa4b97f Rebase on develop 2017-07-10 11:29:07 -04:00
Daniel Underwood
4e353382a5 Get album by the id instead of hardcoded value due to #20 fixing albumId 2017-07-10 11:28:42 -04:00
Daniel Underwood
8c4d99eeff Add artist and year to album spec string when available 2017-07-10 11:28:40 -04:00
Daniel Underwood
e617563b63 Add System.Obsolete attributes to tv-specific things seen in adding search code 2017-07-10 11:28:37 -04:00
Daniel Underwood
c4994c0a59 Update rarbg categories for music 2017-07-10 11:28:34 -04:00
Daniel Underwood
c55e3f2c34 Set up framework for artist indexer searching 2017-07-10 11:28:30 -04:00
Qstick
d32cf1120e Fixed: Artist Delete, Track Delete when Artist Delete (#30)
Fixed: Artist Delete, Track Delete when Artist Delete
2017-07-08 07:14:53 -05:00
Qstick
d4b79b9c41 Fixed: Artist Editor View and API Backend (#29)
Fixed: Artist Editor View and API Backend
2017-07-08 07:13:16 -05:00
Qstick
a0e0a6e587 Fixed: Album Folder Toggle/Artist Name in Edit Artist Popup (#27)
Fixed: Album Folder Toggle/Artist Name in Edit Artist Popup
2017-07-08 07:12:06 -05:00
Qstick
5808bfdd40 Fixed: Redirect calls missing URL Base (#24)
Fixed: Redirect calls missing URL Base
2017-07-08 07:11:14 -05:00
Qstick
7e6ec654ce Fixed: Follow 301 redirects when fetching torrents (#21)
Fixed: Follow 301 redirects when fetching torrents
2017-07-08 07:08:47 -05:00
Qstick
572586063e Fixed: Various Unit Tests Issues/Additions (#28)
Fixed: Various Unit Tests Issues/Additions
2017-07-08 07:08:24 -05:00
Qstick
f4006515a5 Fixed: Twitter oAuth callback URL (#25)
Fixed: Twitter oAuth callback URL
2017-07-08 07:06:17 -05:00
Qstick
f1eb8a7d8d Include CSS files in minification (#23)
Include CSS files in minification
2017-07-08 07:05:49 -05:00
Qstick
8a68e87128 Remove redundant IE meta tag as we use http header instead (#26)
Remove redundant IE meta tag as we use http header instead
2017-07-08 07:05:00 -05:00
Qstick
48181c6666 Fixed: Ensure an API Key is set when starting Lidarr (#22)
Fixed: Ensure an API Key is set when starting Lidarr
2017-07-08 07:04:27 -05:00
Daniel Underwood
1c6443d825 Get album by the id instead of hardcoded value due to #20 fixing albumId 2017-07-07 23:28:47 -04:00
Daniel Underwood
f5ce56567e Add artist and year to album spec string when available 2017-07-07 23:27:18 -04:00
Qstick
a0847950c2 Fix Double Quote and AlbumID variable for Search (#20)
Fix Double Quote and AlbumID variable for Search
2017-07-07 21:24:18 -05:00
Qstick
289279af8e Becuase we do Music! (#19)
Becuase we do Music!
2017-07-07 21:06:56 -05:00
Qstick
dcde579a43 First Pass At AlbumStudio Page, Also Fixes Monitoring (#16)
* First Pass At AlbumPass Page, Also Fixes Monitoring

First Pass At AlbumPass Page, Also Fixes Monitoring

* Catchy New Name, Fix Crash when visit Wanted Page

Catchy New Name, Fix Crash when visit Wanted Page

* Rename API to match

Rename API to match

* Get Bulk Monitoring Working on Album Studio Page

Get Bulk Monitoring Working on Album Studio Page

* Fix Wanted Query

Fix Wanted Query

* Codacy

Codacy

* Fix Cutoff Link To AlbumStudio

Fix Cutoff Link To AlbumStudio

* Add Header, Move Artist Monitor, Change Artist Column Heading

Add Header, Move Artist Monitor, Change Artist Column Heading
2017-07-07 21:06:21 -05:00
Daniel Underwood
e08184767e Add System.Obsolete attributes to tv-specific things seen in adding search code 2017-07-07 17:25:11 -04:00
Daniel Underwood
1cd0ef174c Update rarbg categories for music 2017-07-07 17:24:29 -04:00
Daniel Underwood
6ba2821828 Set up framework for artist indexer searching 2017-07-07 17:23:58 -04:00
turtlehead
bb196e19e1 Updated build.sh to work on linux (#17)
Updated the build.sh script to refer to Lidarr.exe instead of NzbDrone.exe, to prevent linking in SysTrayApp.cs on linux, which makes Lidarr.exe require an active X11 display to run.
2017-07-07 15:37:36 -05:00
Qstick
66ad301892 Tweak Wanted Page, Missing Query (#15)
Fix wanted page query so it only pulls albums with missing tracks, Correct Album header on wanted page, Implement albumtitle cell to allow click on album.
2017-07-04 05:49:07 -05:00
Qstick
f12e27a702 Add Album Cover Placeholder, Update Readme with Node Note (#14)
* Add Album Cover Placeholder
* Updated Readme
2017-07-03 16:00:13 -05:00
Joseph Milazzo
ef4da4ac9f Track Parsing Code (#10)
* We now have the ability to import local tracks into Lidarr. Switching to IDv3 tag reading over custom parsing for local tracks.

* Stable code for track refresh.

* RefreshArtist and RescanArtist events are working correctly. Need to add potential rejection decisions in future.

* Implemented code comments

* PR comments and fixing some odd db bugs.

* Fix some conflicts after Unit Test PR Merge

Fix some conflicts after Unit Test PR Merge

* Track/Album Add and Update Fixes

Track/Album Add and Update Fixes

* Fixed an issue with trackimport looking up trackId instead of artistId

* Add Handle to TrackService for TrackAddedEvent

Add Handle to TrackService for TrackAddedEvent

* Update Quality Regex, Store BitRateMode in TrackFile

Update Quality Regex, Store BitRateMode in TrackFile
2017-07-03 13:39:06 -05:00
Qstick
4cfd39f7fe Fix Unit Tests Build (#13)
* Fix Unit Tests Build
* Updated Manage Artists view

Fix Unit Tests Build

* Small UI fixes

Small UI fixes
2017-07-01 19:21:39 -05:00
Qstick
8b98cd8825 Implement Calendar View (#9)
Implement Calendar View
2017-06-27 21:25:51 -05:00
Joseph Milazzo
965508910e Final Badge update 2017-06-27 14:16:19 -05:00
Joseph Milazzo
3c903efd9e Updated Readme to change badges 2017-06-27 14:15:05 -05:00
Joseph Milazzo
35672dfbf2 Updated README.md (#12)
AppVeyor build tag and Codacy build tag updated.
2017-06-27 13:57:11 -05:00
Qstick
d8ea0a3243 Many UI and API Improvements (#8)
This fixes and implements many items on the ArtistIndex Page and ArtistDetailPage

* Create ArtistStatistics Core Module and tie into API.
* Create Members Class and tie into ArtistModel and Artist API resource.
* Finish Out Album API resources and pass to ArtistDetailPage.
* Finish Out Track and TrackFile API resources and pass to ArtistDetailPage.
* Lots of UI work on Artist Detail Page to get Albums and Track list working.
* Add Cover and Disc Image Types to MediaCover Class
* Remove AddSeries UI Flow, since we have replaced with AddArtist (Cleanup)
2017-06-25 08:17:49 -05:00
Joseph Milazzo
2c7398ac66 Merge pull request #7 from lidarr/feature/trackParse
New Album Database design and restabilizing add artist flow with LidarrAPI.Metadata.
2017-06-21 20:47:15 -05:00
Qstick
c6ac0878a7 Fix Crash due to ForeignArtistId not being in DB for TrackFile Table
Fix Crash due to ForeignArtistId not being in DB for TrackFile Table
2017-06-21 21:45:07 -04:00
Joseph Milazzo
ee90d8021a Merge conflicts 2017-06-21 20:32:50 -05:00
Joseph Milazzo
bf7f890c48 Restabilized add artist flow with NodeJS API 2017-06-21 20:30:45 -05:00
Joseph Milazzo
dc0db08ca8 Merge conflicts 2017-06-21 06:16:22 -05:00
Qstick
916db8d356 Add Track and TrackFile API Resources
Add Track and TrackFile API Resources, Add Rename Track Resource, Add GetFilesByAlbum function to Media File Service, Add Links to Artist Detail Page, Misc other UI work
2017-06-20 23:06:28 -04:00
Joseph Milazzo
e96cf08409 Back to a stable build. Fixedtrackrepo.findtracks 2017-06-20 08:03:13 -05:00
Qstick
fafe4e93f3 Clean up and back to build state
Clean up and back to build state
2017-06-19 20:57:07 -04:00
Joseph Milazzo
b4279a455e Fixed all issues from merging 2017-06-19 08:06:37 -05:00
Joseph Milazzo
e7f72a9d08 Merging feature/db into feature/trackParse 2017-06-19 07:56:42 -05:00
Qstick
fe58f54ad4 NamingConfig Refactor
Adds track NamingConfig, Gets naming section in settings working. Adds Release Year token and track number token
2017-06-18 22:16:39 -04:00
Qstick
a8ac1f3adc Album Repo Work
Adds Album Repo (Need to Update Album API), Gets Tracks working with new Schema, Fixes Albums Saving to DB
2017-06-17 22:27:01 -04:00
Joseph Milazzo
4df9c745de Merge pull request #5 from lidarr/fix/Tests
Fixes a few PathExtensionFixture Tests
2017-06-16 22:01:08 -05:00
Qstick
15b70ede7c Track Mapping Fixes
Fix Some Issues with Track Mapping
2017-06-12 23:03:36 -04:00
Qstick
0f3c355381 New DB Schema
Rearrange DB Schema for Album Centric Plan
2017-06-12 22:02:17 -04:00
Qstick
22f19b5cb5 Fix some Path Related Tests 2017-06-09 22:45:04 -04:00
Qstick
2a4141f658 Should be Capitalized 2017-06-09 22:07:22 -04:00
Joseph Milazzo
db62c15c17 Merge pull request #4 from lidarr/fix/AddArtistExisting
Fixes Existing Detection In Search Results when adding artist
2017-06-05 07:04:54 -05:00
Qstick
280229d528 Fixes Existing Detection on In Search Results
Fixes Existing Detection on In Search Results when adding a new artist
2017-06-04 21:19:46 -04:00
Joseph Milazzo
49b616b69d Merge pull request #3 from Qstick/fix/ArtistDelete
Fixes Artist Delete after Previous UI Work
2017-06-04 19:47:13 -05:00
Joseph Milazzo
490e9feb93 Merge pull request #2 from lidarr/feature/LidarrAPI
Reimplemented the Metadata Search/Add Artist Flow with LidarrAPI.Metadata
2017-06-04 19:46:36 -05:00
Joseph Milazzo
3540a127a3 Merge pull request #1 from mattman86/develop
Migrate matman/Lidarr to Lidarr organization
2017-06-04 18:41:06 -05:00
Qstick
24f36a2a51 Fixes Artist Delete after Previous UI Work 2017-06-04 15:33:52 -04:00
Joseph Milazzo
3d7059c944 Merge branch 'develop' of https://github.com/mattman86/Lidarr into feature/LidarrAPI 2017-06-04 11:40:08 -05:00
Joseph Milazzo
704983f652 Fixed small issue in ProfileService. Reimplemented the metadata with LidarrAPI.Metadata 2017-06-02 20:25:34 -05:00
Joseph Milazzo
36f27058fa Merge pull request #17 from Qstick/fix/UIfix
Fix two small UI bugs
2017-05-30 20:35:33 -05:00
Qstick
b87c6ef7c7 Fix two small UI bugs 2017-05-30 21:12:00 -04:00
Joseph Milazzo
da898cfd84 Merge pull request #15 from Qstick/feature/UIWork
Rename AddArtist, Artist UI folders. Other UI Work
2017-05-30 19:34:12 -05:00
Qstick
2baa1da4b6 Seperate AddArtist, Artist. Refactor NavSearch, Artist Editor. Other
Misc UI Fixes
2017-05-30 20:27:28 -04:00
Joseph Milazzo
f7cbe66676 Merge pull request #14 from Qstick/feature/downloadclients
Update Download Clients
2017-05-30 07:24:05 -05:00
harris
fc5ab94d4f Update Download Clients 2017-05-29 21:43:40 -04:00
Joseph Milazzo
7dcacffec7 Added some extra code around erroneous Qualities in ProfileService 2017-05-29 13:05:18 -05:00
Joseph Milazzo
1024555f75 At a point where we can build. Many TODOs and existing Series-based APIs need to be removed. No track code actually works. 2017-05-29 12:09:18 -05:00
Joseph Milazzo
235e753b93 Merge branch 'develop' of https://github.com/mattman86/Lidarr into feature/trackParse 2017-05-28 20:16:11 -05:00
mattman86
775f96c865 Merge pull request #12 from Qstick/feature/newznabsettings
Change Default NewzNab categories from tv to audio
2017-05-24 15:20:48 -06:00
mattman86
6093616af7 Merge pull request #13 from Qstick/feature/imagework
Image/Logo Updates
2017-05-24 15:19:19 -06:00
harris
8696c3f76e Image/Logo Updates 2017-05-20 22:01:03 -04:00
harris
97fefa12c9 Change Default NewzNab categories from tv to music 2017-05-20 20:01:11 -04:00
Matthew Despain
6486025c2b Merge branch 'develop' of https://github.com/mattman86/Lidarr into develop 2017-05-13 13:55:25 -06:00
Matthew Despain
004e71cf63 AppVeyor build badge 2017-05-13 13:55:06 -06:00
Joseph Milazzo
7acad802fb Merge pull request #8 from mattman86/feature/trackRepository
Implemented Tracks
2017-05-11 13:43:30 -05:00
Joseph Milazzo
76db95947c Refactored most code for track parsing. 2017-05-11 13:43:05 -05:00
mdespain
3f55cc4ec3 Turning tests off for the time being 2017-05-08 09:01:52 -06:00
mattman86
42a992d470 Merge pull request #10 from mattman86/runraid
Runraid
2017-05-08 08:42:25 -06:00
Matthew Despain
adf45e8061 Yet more AppVeyor... 2017-05-08 08:21:18 -06:00
Matthew Despain
2315e92fc5 AppVeyor... 2017-05-08 08:12:56 -06:00
Joseph Milazzo
d1eb9ff16c Changed AristId to a long 2017-05-08 07:43:23 -05:00
67714561ea Merge branch 'develop' of https://github.com/mattman86/Lidarr into runraid 2017-05-07 19:07:44 -07:00
d7ad9b8218 Support music qualities. This is a work in progress, lots of code still references tv series 2017-05-07 19:07:19 -07:00
Joseph Milazzo
fbb6691ea1 Implemented Tracks and ability to save to the DB. Updated SkyHook to support ArtistSlug. 2017-05-07 17:50:07 -05:00
Matthew Despain
268477e1ba Fixing FeatHub link for now 2017-05-07 16:36:38 -06:00
Matthew Despain
bc0c1d1ec1 AppVeyor: Attempt giving up after this 2017-05-07 16:33:48 -06:00
Matthew Despain
075ee6976d AppVeyor: Attempt over 9000 2017-05-07 16:15:51 -06:00
Matthew Despain
c51fe35fb4 Merge branch 'develop' of https://github.com/mattman86/Lidarr into develop 2017-05-07 16:11:44 -06:00
Matthew Despain
26b05096d8 AppVeyor: Attempt something 2017-05-07 16:11:30 -06:00
mattman86
38ae5d3962 Merge pull request #7 from AeonLucid/develop
Fix gulp task.
2017-05-07 16:04:38 -06:00
Mike
d8472a2a81 Fix gulp task. 2017-05-08 00:02:46 +02:00
Matthew Despain
5b9c669af4 AppVeyor: Attempt 5 2017-05-07 15:48:51 -06:00
Matthew Despain
c40fdb3910 AppVeyor: Attempt 4 2017-05-07 15:44:12 -06:00
Matthew Despain
a3031a9aee AppVeyor: Attempt 3 2017-05-07 15:29:10 -06:00
Matthew Despain
ffebcc3a78 AppVeyor: Attempt 2 2017-05-07 15:21:27 -06:00
Matthew Despain
f50ce4abf9 Merge branch 'develop' of https://github.com/mattman86/Lidarr into develop 2017-05-07 15:17:42 -06:00
Matthew Despain
2a38db10e0 Attempting AppVeyor builds 2017-05-07 15:17:34 -06:00
Joseph Milazzo
66445930eb Merge branch 'develop' of https://github.com/mattman86/Lidarr into develop 2017-05-07 14:57:35 -05:00
Joseph Milazzo
acb7d33d09 Implemented track lookup into skyhook. 2017-05-07 14:55:49 -05:00
Joseph Milazzo
a09d5d0b69 Switched over to using Spotify API for meta data. This will require deleting DB to start using. 2017-05-07 14:32:13 -05:00
Joseph Milazzo
b481bc6e45 Partially implemented ArtistRefreshCommand. In order to move forward, API may need to be switched to Spotify. 2017-05-07 11:58:24 -05:00
runraid
89fa71fe96 Merge pull request #6 from mattman86/runraid
Update readme, replace sonarr->lidarr
2017-05-06 08:42:24 -07:00
runraid
d04cd2ae95 Revert girl url 2017-05-06 08:03:41 -07:00
runraid
a8b40ce1f6 Update readme, replace sonarr->lidarr 2017-05-06 07:44:46 -07:00
Joseph Milazzo
fa80bca2c9 Merge pull request #5 from mattman86/feature/artist-overview
Implemented artist overview
2017-05-05 14:35:40 -05:00
Joseph Milazzo
6aff6de378 Added Artist Overview. 2017-05-05 14:33:46 -05:00
Joseph Milazzo
3662bb933b Fixed up API to instead call multiple APIs and mash results together 2017-05-05 13:35:28 -05:00
Joseph Milazzo
f97ed62fae Partially implemented artist overview. Needs review 2017-05-05 12:57:58 -05:00
Joseph Milazzo
5302c0915e Fixed wording 2017-05-05 08:22:12 -05:00
Joseph Milazzo
3f2c00410d Merge branch 'develop' of https://github.com/mattman86/Lidarr into develop 2017-05-05 08:19:59 -05:00
Joseph Milazzo
0ec8830def Fixed issue with Artist page not rendering the artists in DB 2017-05-05 08:19:49 -05:00
mdespain
bebb82ec9f Fixing my epic fail of not setting the columns to allow null. 2017-05-04 10:41:59 -06:00
Matthew Despain
ea01ee335b Updating service provider with Lidarr name 2017-05-04 10:17:43 -06:00
Matthew Despain
d14111f914 Updating links and adding credits 2017-05-04 10:16:58 -06:00
Matthew Despain
e03af77375 Adding music related columns to NamingConfig table. 2017-05-04 10:16:09 -06:00
Joseph Milazzo
50d5693399 Fixed returning empty artist list from db. 2017-05-04 08:00:19 -05:00
Matthew Despain
78639d1787 More refactoring 2017-05-03 09:03:43 -06:00
Matthew Despain
5cedc93286 Updating logos and icons 2017-05-03 00:13:47 -06:00
Joseph Milazzo
d47909b1f4 Merge pull request #4 from mattman86/feature/database
Implemented ability to search iTunes for a series and add to database
2017-05-02 21:43:59 -05:00
Joseph Milazzo
d23492177a Merge branch 'feature/database' of https://github.com/mattman86/Lidarr into feature/database 2017-05-02 21:42:07 -05:00
Joseph Milazzo
5ee1077e1e DB now stores Artists. DB schema may need small tweaks. 2017-05-02 21:40:29 -05:00
Joseph Milazzo
9a79b590cc Merge branch 'develop' into feature/database 2017-05-02 07:03:13 -05:00
Joseph Milazzo
f2a8336b31 Search to add DB flow is error free but the artist doesn't add. 2017-05-01 21:07:11 -05:00
Joseph Milazzo
fa52eabb79 Almost finished linking frontend to backend. A few issues with DB mapping to work out. 2017-04-30 16:54:01 -05:00
Joseph Milazzo
5b0f11b19a Albums can now be seen per artist from search. 2017-04-30 11:34:53 -05:00
Joseph Milazzo
de21685896 Multiple artists return to UI 2017-04-30 09:26:50 -05:00
Joseph Milazzo
a08ebcc0c2 Now returns one artist back with albums. 2017-04-30 08:54:37 -05:00
TCBWZA
7e97f8c423 Break XEM URL as per a request to remove it. 2017-04-29 05:34:32 +02:00
Joseph Milazzo
2813fccc78 Updated the code to allow a search to be made from UI to iTunes and return a mock result. 2017-04-28 17:05:35 -05:00
TCBWZA
b7a46a9e51 Update internal URL's to point to lidarr.audio 2017-04-28 16:55:18 +02:00
Joseph Milazzo
684e4f4c80 Merge branch 'feature/database' of https://github.com/mattman86/Lidarr into feature/database 2017-04-27 19:10:30 -05:00
Joseph Milazzo
ce62cff57d Changed the db to represent compilations. By default a track will have a single albumId and a list of artistIds. If the album is a compilation, we will use Various Artists to align with Plex, iTunes, and Amazon. 2017-04-27 19:09:57 -05:00
Joseph Milazzo
9ce71ff698 Added Music models and basic database 2017-04-27 19:09:37 -05:00
Joseph Milazzo
39b58ebda3 Changed the db to represent compilations. By default a track will have a single albumId and a list of artistIds. If the album is a compilation, we will use Various Artists to align with Plex, iTunes, and Amazon. 2017-04-27 18:28:36 -05:00
Joseph Milazzo
118e2dfe93 Updated to support Album and Track level Compilations 2017-04-25 07:47:14 -05:00
Joseph Milazzo
ad23e8ce9f Added Music models and basic database 2017-04-20 18:57:03 -05:00
mattman86
80e8ef4c7a Merge pull request #3 from nbonfire/patch-1
Update and rename Sonarr to Lidarr
2017-04-19 23:20:49 -06:00
nbonfire
34683bfb3e Update and rename Sonarr to Lidarr 2017-04-19 20:50:57 +02:00
TCBWZA
e73158d5fa Update _fileExtensions to include .mp3 (quality unknown), .m4a quality DVD and .flac quality RAWHD 2017-04-13 20:31:52 +02:00
TCBWZA
1a11a932e3 Remove ISceneMappingService to get rid of service.sonarr.tv access errors 2017-04-13 20:14:13 +02:00
TCBWZA
c6f696a090 Merge branch 'develop' of https://github.com/mattman86/Lidarr.git 2017-04-13 18:58:53 +02:00
mattman86
fbe3fad52f Delete appveyor.yml 2017-04-12 16:11:56 -06:00
mattman86
4e5136f307 Update appveyor.yml 2017-04-12 16:10:34 -06:00
mattman86
6e80a8f83c Create appveyor.yml 2017-04-12 16:07:49 -06:00
mattman86
0bfdbb768b Update README.md 2017-04-12 15:43:49 -06:00
mattman86
2d7573a6bd Update README.md 2017-04-12 15:43:22 -06:00
mattman86
cf0f52e0c7 Update README.md 2017-04-12 15:42:52 -06:00
TCBWZA
b6cf96b737 Changes to remove sentry submissions and refrences to sonarr.tv 2017-04-08 23:47:59 +02:00
TCBWZA
1e8adf0926 Remove references to sonarr sentry
update ics entry to nzbdrone_album
2017-04-08 23:47:21 +02:00
TCBWZA
31ca0002d7 Change process name and rename assembly 2017-04-08 18:46:28 +02:00
TCBWZA
402f7435ee Change SSL port and set default branch to develop 2017-04-08 18:29:50 +02:00
TCBWZA
67119d97aa Changes from Sonarr app name to Lidarr 2017-04-08 17:51:45 +02:00
TCBWZA
0d4e049225 Removed reference to Sonarr and replaced them with Lidarr 2017-04-08 17:48:31 +02:00
Matthew Despain
a4d41078da Merge branch 'develop' of https://github.com/mattman86/Lidarr into develop 2017-04-08 09:39:33 -06:00
Matthew Despain
824c66a141 Updating the ProgramData folder 2017-04-08 09:39:23 -06:00
Joseph Milazzo
3ebbaf4eb7 Use different folder to store sqlite database. 2017-04-08 08:37:15 -05:00
Matthew Despain
a61cdeed0d Removing the MusicBrainz API in favor of iTunes 2017-04-07 15:11:08 -06:00
Matthew Despain
d0728bbe22 Changed the default port to 8686 2017-03-31 12:55:07 -06:00
Matthew Despain
0fbb8c25cc Merge branch 'develop' of https://github.com/mattman86/Lidarr into develop 2017-03-31 12:54:40 -06:00
Matthew Despain
270a6659a5 Changing the output directory 2017-03-31 12:54:26 -06:00
mattman86
806d6e3a2c Update README.md 2017-03-30 22:12:51 -06:00
mattman86
728d55800f Update README.md 2017-03-30 21:35:08 -06:00
mattman86
217662541f Update README.md 2017-03-30 21:34:40 -06:00
mattman86
f875b3d012 Update README.md 2017-03-30 21:30:16 -06:00
Matthew Despain
94fb1f3e73 Merge branch 'develop' of https://github.com/mattman86/Lidarr into develop 2017-03-30 20:37:34 -06:00
Matthew Despain
a37add2f7a Added MusicBrainz API project 2017-03-30 20:37:24 -06:00
Matthew Despain
7208d4c887 New icon 2017-03-30 20:24:48 -06:00
mattman86
b08474288c Update README.md 2017-03-30 10:56:45 -06:00
Matthew Despain
20c8dec50a First round of refactoring. 2017-03-29 21:49:38 -06:00
mattman86
c98c679504 Merge pull request #1 from Sonarr/develop
New: Episode files sent to Recycling Bin are put into subfolders
2017-03-29 13:38:58 -06:00
Mark McDowall
83370ddbbb New: Episode files sent to Recycling Bin are put into subfolders
Closes #401
2017-03-29 06:44:50 -07:00
Mark McDowall
c20b152c28 Fixed spelling in message 2017-03-26 13:21:29 -07:00
Mark McDowall
bf5067466d Guard against a null file showing an exception in release rejections
Fixes #1755
2017-03-26 13:01:59 -07:00
Taloth Saldono
ec7f749541 Tweaked default config for extra files import. 2017-03-26 21:22:58 +02:00
Taloth Saldono
56ecbf4a31 Fixed: Sabnzbd error when tv sorting enabled for all categories. 2017-03-26 17:09:22 +02:00
Mark McDowall
1b39911135 True/False for config settings value 2017-03-25 22:18:57 -07:00
Mark McDowall
6aaefae2d5 New: Explicit toggle for importing extra files 2017-03-25 09:13:28 -07:00
margaale
db9d601115 Revert Session name 2017-03-23 13:46:01 -03:00
Taloth Saldono
e7331539f0 Fixed: Newznab default capabilities erroneously cached if indexer is unavailable. 2017-03-23 17:12:10 +01:00
Taloth Saldono
58bd57bed6 New: Updated MediaInfo to 0.7.93. 2017-03-22 19:17:55 +01:00
Mark McDowall
7a58082cd7 smallicon for Join notifications
New: White icon with transparent background for Join notifications notification bar icon
Closes #1458
2017-03-19 23:31:50 -07:00
Taloth Saldono
2e08f195e4 Fixed: Zero length file causes MediaInfo hanging in 100% cpu load. 2017-03-19 22:02:52 +01:00
Taloth Saldono
a1a5e29c3e fixed sab tests. 2017-03-19 19:00:05 +01:00
margaale
5033886b90 Fixed: DownloadStation api client for DSM 5.x. 2017-03-19 18:50:56 +01:00
Mark McDowall
29419d6575 Update README.md 2017-03-18 23:34:37 -07:00
Mark McDowall
3c22f68f5a Fixed: Parsing releases with year added to the end of the series title
Fixes #1768
2017-03-18 22:45:47 -07:00
Mark McDowall
a0d98951aa Use MaterialisingResponse for static resource responses 2017-03-18 12:22:44 -07:00
Taloth Saldono
70f7404499 Fixed: Sabnzbd 2.0 api compatibility.
closes #1775
2017-03-18 16:32:13 +01:00
Mark McDowall
abd70f5381 New: UHD category for RARBG 2017-03-17 07:16:24 -07:00
Mark McDowall
878e973081 Fixed: Join grab messages
Fixes #1751
2017-03-13 19:43:07 -07:00
Taloth Saldono
2bf3b9e7dd fixed typo setting custom directory for rtorrent. 2017-03-12 11:18:51 +01:00
Taloth Saldono
2326db0dea Fixed: Refactored rtorrent interface to fix reliability issues with adding magnets & torrents.
fixes #1745
2017-03-11 12:15:42 +01:00
Taloth Saldono
3590fedeaf Fixed: Timing issue in rtorrent handling of magnet links.
ref #1745
2017-03-10 21:07:08 +01:00
Taloth Saldono
f4866cae69 fixed broken project file. 2017-03-10 20:43:16 +01:00
Mark McDowall
149d191f62 Remove NCrunch.Framework 2017-03-09 20:30:39 -08:00
Jamie Magee
bb9bd63382 Upgrade CommonServiceLocator
From 1.0 to 1.3
2017-03-09 20:30:39 -08:00
Jamie Magee
34fda24124 Upgrade Microsoft.AspNet.SignalR.Client
From 1.2.1 to 1.2.2
2017-03-09 20:30:39 -08:00
Jamie Magee
c8d10829a0 Upgrade Selenium.*
From 3.0.1 to 3.2.0
2017-03-09 19:49:05 -08:00
Jamie Magee
ae2bdb757a Upgrade NUnit
From 3.5.0 to 3.6.0
2017-03-09 19:49:02 -08:00
Jamie Magee
714ad075fc Upgrade FluentAssertions
From 4.18.0 to 4.19.0
2017-03-09 19:48:11 -08:00
Jamie Magee
87a05df2fd Upgrade TinyTwitter
From 1.1.1 to 1.1.2

NOTE: Sonarr was already using a modified version of TinyTwitter 1.1.2.
This change just modifies the packages.config file to reflect that
2017-03-09 19:48:11 -08:00
Jamie Magee
f3263efa52 Upgrade SharpRaven
From 2.1.0 to 2.2.0
2017-03-09 19:48:11 -08:00
Jamie Magee
1cad11d207 Upgrade Ical.Net
From 2.2.25 to 2.2.32
2017-03-09 19:48:10 -08:00
Jamie Magee
781df8b20a Upgrade NLog
From 4.4.1 to 4.4.3
2017-03-09 19:48:10 -08:00
Mark McDowall
ebcce05588 Fixed: Parsing headers that have a trailing semi-colon
Fixes #1749
2017-03-09 15:40:13 -08:00
Taloth Saldono
bbf2134fe1 Fixed: Deluge 1.3.14 API support due to changed json-rpc checks.
fixes #1738
2017-03-06 20:14:34 +01:00
Mark McDowall
081c5fc332 Broken ExtraFiles migration due to extentionless files
Fixed: Prevent extensionless files from being imported
Fixed: Broken migration due to extensionless extra files
2017-03-06 11:00:38 -08:00
Mark McDowall
47915d5e05 Fixed: Bad extension when importing extra files 2017-03-05 17:45:35 -08:00
Mark McDowall
47e221d9a0 Fixed: Delay profiles are no longer hidden under advanced settings 2017-03-03 21:16:29 -08:00
Mark McDowall
bf485f6f2c Log number of files found when getting video/non-video files 2017-03-03 20:57:05 -08:00
Mark McDowall
b365d8a537 Include language in suffix when importing 2017-03-03 19:44:31 -08:00
Taloth Saldono
fee8da88a6 Accept full language name as suffix. 2017-03-03 19:44:31 -08:00
Mark McDowall
cc0dbf1af4 New: Rename subtitles and extra files when renaming files
Towards #459
2017-03-03 19:44:31 -08:00
Mark McDowall
836131ebb1 New: Import subtitles and extra files when importing media files 2017-03-03 19:44:31 -08:00
Marcelo Castagna
9a870a3709 Fixed: DownloadStation interface stuck in infinite loop in some cases.
* removed empty spaces. changed dcaex => ex

* Changed error message

* changed error message

* Wrong message, ups

* Another message
2017-03-01 18:46:16 +01:00
Taloth Saldono
afe05189da Fixed series scan tests. 2017-02-28 21:06:41 +01:00
Taloth Saldono
2abaef16f1 Fixed Indexer Health Checks and tests. 2017-02-28 20:59:22 +01:00
Daniel Smith
37d5a3f2ad Fixed: Clear EpisodeFile records from database if Series folder is missing, but root folder appears to be mounted. 2017-02-28 17:01:12 +01:00
Mark McDowall
be4d70e3a9 Fixed: Health check failing and preventing others from running 2017-02-28 00:12:34 -08:00
Mark McDowall
79043f2c64 Improve indexer health check messages
Fixed: Improve health check message when all enabled indexers are disabled due to failures
Closes #1551
2017-02-28 00:12:34 -08:00
Mark McDowall
1dab0aee6a Fixed: Reduce parameters required to add a new series
Fixes #1403
2017-02-27 21:37:33 -08:00
Mark McDowall
9b162f2d5e Fixed: Clean RSS feed before detecting type
Fixes #1518
2017-02-27 21:37:00 -08:00
Mark McDowall
5518cf5362 Added Download decision comparator test to confirm quality is preferred over seeders 2017-02-25 16:18:00 -08:00
5134 changed files with 202261 additions and 217911 deletions

View File

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

9
.esprintrc Normal file
View File

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

25
.gitattributes vendored
View File

@@ -1,22 +1,11 @@
# Auto detect text files and perform LF normalization
*text eol=lf
* text=auto
# Explicitly set bash scripts to have unix endings
*.sh text eol=lf
distribution/debian/* text eol=lf
macOS/Readarr text eol=lf
# Custom for Visual Studio
*.cs diff=csharp
*.sln merge=union
*.csproj merge=union
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
*.sln merge=union

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

@@ -0,0 +1,9 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: readarr
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
custom: # Replace with a single custom sponsorship URL

View File

@@ -1,5 +0,0 @@
Provide a description of the feature request or bug, the more details the better.
Please use https://forums.sonarr.tv/ for support or other questions. (When in doubt, use the forums)

35
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,35 @@
---
name: Bug Report
about: Support Requests will be closed immediately, if you are unsure go to our Reddit or Discord first. Exceptions do not mean you found a bug!
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Platform Information (please complete the following information):**
- OS: [e.g. Windows 10 2004 / Ubuntu 20.10]
- Docker: [Yes/No]
- Mono or.NET Core Version: [e.g. Mono 5.8 or .Net Core 3.1.10] (found under System -> Status)
- Browser and Version [e.g. chrome 86.0.4240.198] (Only needed for UI issues)
- Readarr Version [e.g. 0.3.0.430]
- Readarr Branch [e.g. master]
**Trace Logs**
Turn on Trace logs under Settings -> General and wait for the bug to occur again. **Upload the full log file here (or another site (e.g. pastebin) and link it). Issues will be closed, if they do not include this!**

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Support via Discord
url: https://discord.gg/rkEXY2Rbgn
about: Chat with users and devs on support and setup related topics.
- name: Support via Reddit
url: https://reddit.com/r/Readarr
about: Discuss and search thru support topics.

View File

@@ -0,0 +1,17 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -6,7 +6,7 @@ A few sentences describing the overall goals of the pull request's commits.
#### Todos
- [ ] Tests
- [ ] Documentation
- [ ] Wiki Updates
#### Issues Fixed or Closed by this PR

21
.gitignore vendored
View File

@@ -45,6 +45,10 @@ _dotCover*
# DevExpress CodeRush
src/.cr/
# Emacs
*~
\#*\#
# NCrunch
*.ncrunch*
.*crunch*.local.xml
@@ -80,7 +84,6 @@ TestResults
[Tt]est[Rr]esult*
*.Cache
ClientBin
[Ss]tyle[Cc]op.*
~$*
*.dbmdl
Generated_Code #added for RIA/Silverlight projects
@@ -101,7 +104,7 @@ App_Data/*.ldf
_NCrunch_*
_TeamCity*
# Sonarr
# Readarr
config.xml
nzbdrone.log*txt
UpdateLogs/
@@ -113,14 +116,21 @@ src/UI/.idea/*
*log.txt
node_modules/
_output*
_artifacts
_rawPackage/
_dotTrace*
_tests/
*.Result.xml
coverage*.xml
coverage*.json
setup/Output/
*.~is
UI.Phantom/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
#VS outout folders
bin
@@ -130,8 +140,11 @@ output/*
#OS X metadata files
._*
.DS_Store
_start
_temp_*/**/*
src/.idea/
## Merge any idea folder
*/**/.idea
*.iml

4
.gitmodules vendored
View File

@@ -1,4 +0,0 @@
[submodule "src/ExternalModules/CurlSharp"]
path = src/ExternalModules/CurlSharp
url = https://github.com/Sonarr/CurlSharp.git
branch = master

1
.idea/.name generated
View File

@@ -1 +0,0 @@
Sonarr

25
.idea/Sonarr.iml generated
View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.idea" />
<excludeFolder url="file://$MODULE_DIR$/Logo" />
<excludeFolder url="file://$MODULE_DIR$/_output" />
<excludeFolder url="file://$MODULE_DIR$/_output_mono" />
<excludeFolder url="file://$MODULE_DIR$/_output_osx" />
<excludeFolder url="file://$MODULE_DIR$/_output_osx_app" />
<excludeFolder url="file://$MODULE_DIR$/_start" />
<excludeFolder url="file://$MODULE_DIR$/_tests" />
<excludeFolder url="file://$MODULE_DIR$/debian" />
<excludeFolder url="file://$MODULE_DIR$/node_modules" />
<excludeFolder url="file://$MODULE_DIR$/osx" />
<excludeFolder url="file://$MODULE_DIR$/schemas" />
<excludeFolder url="file://$MODULE_DIR$/setup" />
<excludeFolder url="file://$MODULE_DIR$/src" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Sonarr node_modules" level="project" />
</component>
</module>

View File

@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
<option name="LINE_SEPARATOR" value="&#13;&#10;" />
<option name="RIGHT_MARGIN" value="190" />
<option name="HTML_ATTRIBUTE_WRAP" value="0" />
<option name="HTML_KEEP_LINE_BREAKS" value="false" />
<option name="HTML_KEEP_BLANK_LINES" value="1" />
<option name="HTML_ALIGN_ATTRIBUTES" value="false" />
<option name="HTML_INLINE_ELEMENTS" value="" />
<option name="HTML_DONT_ADD_BREAKS_IF_INLINE_CONTENT" value="" />
<CssCodeStyleSettings>
<option name="HEX_COLOR_LOWER_CASE" value="true" />
<option name="HEX_COLOR_LONG_FORMAT" value="true" />
<option name="VALUE_ALIGNMENT" value="1" />
</CssCodeStyleSettings>
<JSCodeStyleSettings>
<option name="SPACE_BEFORE_PROPERTY_COLON" value="true" />
<option name="ALIGN_OBJECT_PROPERTIES" value="2" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="OBJECT_LITERAL_WRAP" value="2" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
</JSCodeStyleSettings>
<XML>
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
<codeStyleSettings language="CSS">
<indentOptions>
<option name="SMART_TABS" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="LINE_COMMENT_AT_FIRST_COLUMN" value="true" />
<option name="KEEP_LINE_BREAKS" value="false" />
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="CATCH_ON_NEW_LINE" value="true" />
<option name="FINALLY_ON_NEW_LINE" value="true" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
<option name="SPACE_BEFORE_METHOD_PARENTHESES" value="true" />
<option name="CALL_PARAMETERS_WRAP" value="1" />
<option name="BINARY_OPERATION_WRAP" value="1" />
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" />
<option name="ARRAY_INITIALIZER_WRAP" value="2" />
<option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="true" />
<option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="true" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
</codeStyleSettings>
</value>
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
</project>

6
.idea/encodings.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<includedPredefinedLibrary name="ECMAScript 6" />
</component>
</project>

View File

@@ -1,14 +0,0 @@
<component name="libraryTable">
<library name="Sonarr node_modules" type="javaScript">
<properties>
<option name="frameworkName" value="node_modules" />
<sourceFilesUrls>
<item url="file://$PROJECT_DIR$/node_modules" />
</sourceFilesUrls>
</properties>
<CLASSES>
<root url="file://$PROJECT_DIR$/node_modules" />
</CLASSES>
<SOURCES />
</library>
</component>

14
.idea/misc.xml generated
View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" />
</project>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Sonarr.iml" filepath="$PROJECT_DIR$/.idea/Sonarr.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

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

@@ -0,0 +1,5 @@
{
"files.associations": {
"*.yaml": "home-assistant"
}
}

1
.yarnrc Normal file
View File

@@ -0,0 +1 @@
save-prefix ""

4
CLA.md
View File

@@ -1,6 +1,6 @@
# Sonarr Individual Contributor License Agreement #
# Readarr Individual Contributor License Agreement #
Thank you for your interest in contributing to Sonarr ("We" or "Us").
Thank you for your interest in contributing to Readarr ("We" or "Us").
This contributor agreement ("Agreement") documents the rights granted by contributors to Us. To make this document effective, please complete the form below. This is a legally binding document, so please read it carefully before agreeing to it. The Agreement may cover more than one software project managed by Us.
## 1. Definitions ##

View File

@@ -1,38 +1,41 @@
# How to Contribute #
We're always looking for people to help make Sonarr even better, there are a number of ways to contribute.
We're always looking for people to help make Readarr even better, there are a number of ways to contribute.
## Documentation ##
Setup guides, FAQ, the more information we have on the wiki the better.
Setup guides, FAQ, the more information we have on the [wiki](https://wiki.servarr.com/Readarr) the better.
## Development ##
### Tools required ###
- Visual Studio 2015
- HTML/Javascript editor of choice (Sublime Text/Webstorm/Atom/etc)
- npm (node package manager)
- git
- Visual Studio 2019 or higher (https://www.visualstudio.com/vs/). The community version is free and works (https://www.visualstudio.com/downloads/).
- HTML/Javascript editor of choice (VS Code/Sublime Text/Webstorm/Atom/etc)
- [Git](https://git-scm.com/downloads)
- [NodeJS](https://nodejs.org/en/download/) (Node 10.X.X or higher)
- [Yarn](https://yarnpkg.com/)
- .NET Core 3.1.
### Getting started ###
1. Fork Sonarr
2. Clone (develop branch) *you may need pull in submodules separately if you client doesn't clone them automatically (CurlSharp)*
3. Run `npm install`
4. Run `npm start` - Used to compile the UI components and copy them.
Leave this window open.
If you have gulp globally installed you can use `gulp watch` instead
5. Compile in Visual Studio
1. Fork Readarr
2. Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories)
3. Grab the submodules `git submodule init && git submodule update`
4. Install the required Node Packages `yarn install`
5. Start gulp to monitor your dev environment for any changes that need post processing using `yarn start` command.
6. Build the project in Visual Studio, Setting startup project to `Readarr.Console` and framework to `netcoreapp31`
7. Debug the project in Visual Studio
8. Open http://localhost:8787
### Contributing Code ###
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Sonarr/Sonarr/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 Sonarr's develop branch, don't merge
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Readarr/Readarr/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 Readarr's develop branch, don't merge
- Make meaningful commits, or squash them
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
- Reach out to us on the forums or on IRC if you have any questions
- Reach out to us on the discord if you have any questions
- Add tests (unit/integration)
- Commit with *nix line endings for consistency (We checkout Windows and commit *nix)
- One feature/bug fix per pull request to keep things clean and easy to understand
- Use 4 spaces instead of tabs, this is the default for VS 2012 and WebStorm (to my knowledge)
- Use 4 spaces instead of tabs, this is the default for VS 2019 and WebStorm (to my knowledge)
### Pull Requesting ###
- Only make pull requests to develop, never master, if you make a PR to master we'll comment on it and close it
@@ -44,4 +47,4 @@ Setup guides, FAQ, the more information we have on the wiki the better.
- patch (Bad)
- develop (Bad)
If you have any questions about any of this, please let us know.
If you have any questions about any of this, please let us know.

674
LICENSE.md Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{one line to give the program's name and a brief idea of what it does.}
Copyright (C) {year} {name of author}
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 38 KiB

BIN
Logo/96-Outline-White.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

23
Logo/Readarr.svg Normal file
View File

@@ -0,0 +1,23 @@
<svg width="1024" height="1024" xmlns="http://www.w3.org/2000/svg">
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
<g>
<title>background</title>
<rect x="-1" y="-1" width="1026" height="1026" id="canvas_background" fill="none"/>
<g id="canvasGrid" display="none">
<rect id="svg_1" width="100%" height="100%" x="0" y="0" stroke-width="0" fill="url(#gridpattern)"/>
</g>
</g>
<g>
<title>Layer 1</title>
<ellipse fill="#eeeeee" stroke="#443c3c" stroke-width="1.5" cx="512" cy="512" id="svg_2" rx="510" ry="510"/>
<ellipse fill="#443c3c" stroke-width="1.5" cx="512" cy="512" id="svg_11" rx="440" ry="440" stroke="#443c3c"/>
<ellipse fill="#8e2222" stroke-width="1.5" cx="512" cy="512" id="svg_12" rx="387" ry="387" stroke="#443c3c"/>
<ellipse fill="#eeeeee" stroke="#8e2222" stroke-width="1.5" cx="512" cy="512" id="svg_13" rx="378" ry="378"/>
<ellipse fill="#443c3c" stroke="#443c3c" stroke-width="1.5" cx="510.666667" cy="513.333333" id="svg_14" rx="265" ry="265"/>
<path stroke="#8e2222" fill="#eeeeee" stroke-width="10" d="m175.710053,681.237221c0,0 -5.075603,-356.007066 -5.710046,-356.665506c0.634444,-53.1059 17.499829,-47.829396 30.453616,-49.40506c198.582985,10.830065 270.910328,71.251644 275.351487,73.499378c13.323459,5.017718 20.936854,31.781547 20.302411,31.123108c0.634444,0.658439 4.441159,420.60147 3.806697,419.943031c3.172272,22.454778 -13.323459,21.001691 -13.957903,20.343251c-124.986737,-98.151681 -297.557264,-122.854211 -298.191708,-123.512651c-12.054554,-0.794647 -12.054554,-15.325552 -12.054554,-15.325552z" id="svg_3"/>
<path stroke="#8e2222" fill="#eeeeee" stroke-width="10" d="m845.789157,682.063637c0,0 5.076028,-356.877704 5.710555,-357.537759c-0.634508,-53.235774 -17.501351,-47.946362 -30.456244,-49.525877c-198.600031,10.856551 -270.933583,71.425895 -275.375122,73.679122c-13.324597,5.029987 -20.938649,31.85927 -20.30415,31.199225c-0.634499,0.660045 -4.441539,421.630074 -3.807021,420.970029c-3.172522,22.509688 13.324597,21.053047 13.959106,20.393002c124.997443,-98.391719 297.582778,-123.154662 298.217286,-123.814708c12.05559,-0.796596 12.05559,-15.363034 12.05559,-15.363034z" id="svg_4"/>
<path stroke="#8e2222" fill="#8e2222" stroke-width="5" d="m173.13558,738.570552c0,0 -5.15755,-356.007074 -5.80224,-356.665508c0.64469,-53.1059 17.78238,-47.8294 30.94532,-49.405065c201.78931,10.830064 275.28445,71.25165 279.79732,73.499376c13.53858,5.017723 21.2749,31.781547 20.63021,31.123113c0.64469,0.658434 4.51287,420.601482 3.86816,419.943038c3.22349,22.454782 -13.53858,21.001693 -14.18327,20.343258c-127.00477,-98.151686 -302.36163,-122.854214 -303.00631,-123.512658c-12.24919,-0.794646 -12.24919,-15.325554 -12.24919,-15.325554z" id="svg_5"/>
<path stroke="#8e2222" fill="#8e2222" stroke-width="5" d="m848.36364,739.063651c0,0 5.15798,-356.877693 5.80276,-357.537747c-0.64476,-53.235766 -17.78391,-47.946356 -30.94796,-49.525871c-201.80636,10.856552 -275.30771,71.425894 -279.82096,73.67912c-13.53972,5.029983 -21.2767,31.859265 -20.63195,31.199221c-0.64475,0.660044 -4.51325,421.630055 -3.86849,420.970011c-3.22374,22.509691 13.53972,21.053041 14.18447,20.392997c127.01549,-98.391708 302.38716,-123.154653 303.03191,-123.814697c12.25022,-0.796596 12.25022,-15.363033 12.25022,-15.363033z" id="svg_6"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -1,240 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="218px"
height="218px" viewBox="0 0 218 218" enable-background="new 0 0 218 218" xml:space="preserve">
<symbol id="hex_grid" viewBox="-114.25 -98.617 228.55 197.233">
<path fill-rule="evenodd" clip-rule="evenodd" fill="none" stroke="#989898" stroke-width="0.5" stroke-linecap="square" stroke-miterlimit="1" d="
M72.15,90.3l4.7-2.7l4.65,2.7v5.4l-4.65,2.7l-4.7-2.7V90.3z M62.85,95.7l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7V95.7l4.65,2.7
l4.65-2.7 M62.85,90.3l4.65-2.7l4.65,2.7 M62.85,79.55v-5.4l4.65-2.7l4.65,2.7v5.4L67.5,82.2L62.85,79.55L58.2,82.2l-4.65-2.65
M72.15,74.15l4.7-2.7l4.65,2.7v5.4l-4.65,2.65l-4.7-2.65 M76.85,87.6v-5.4 M67.5,87.6v-5.4 M81.5,95.7l4.65,2.7l4.65-2.7l4.65,2.7
l4.65-2.7l4.65,2.7l4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7v-5.4l-4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4
l4.65-2.7v-5.4L109.4,31v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7v-5.4l-4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7
V-31l-4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7v-5.4l-4.65-2.7v-5.4l4.65-2.7v-5.4l-4.65-2.65v-5.4l4.65-2.7v-5.4
l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.7-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7
l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.7-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7L7-98.4l-4.65,2.7l-4.65-2.7
l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.7-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7
l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.7-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7l-4.65-2.7l-4.65,2.7v5.4l-4.65,2.7
v5.4l4.65,2.65v5.4l-4.65,2.7v5.4l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65v5.4l-4.65,2.7v5.4l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65
v5.4l-4.65,2.7v5.4l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65v5.4l-4.65,2.7V31l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65v5.4l-4.65,2.7
v5.4l4.65,2.7v5.4l-4.65,2.7v5.4l4.65,2.65v5.4l-4.65,2.7v5.4l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.7,2.7
l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.7,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7
l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7L7,95.7l4.65,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.7,2.7l4.65-2.7l4.65,2.7l4.65-2.7l4.65,2.7
l4.65-2.7 M44.25,95.7v-5.4l4.65-2.7l4.65,2.7 M44.25,79.55v-5.4l4.65-2.7l4.65,2.7v5.4L48.9,82.2L44.25,79.55L39.6,82.2
l-4.65-2.65 M58.2,87.6v-5.4 M48.9,87.6v-5.4 M53.55,63.35v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7L53.55,63.35l-4.65,2.7l-4.65-2.7
v-5.4l4.65-2.7l4.65,2.7 M62.85,74.15l-4.65-2.7v-5.4 M53.55,74.15l4.65-2.7 M48.9,71.45v-5.4 M48.9,55.25v-5.4l4.65-2.65
l4.65,2.65v5.4 M67.5,71.45v-5.4l4.65-2.7l4.7,2.7v5.4 M67.5,66.05l-4.65-2.7 M58.2,49.85l4.65-2.65l4.65,2.65v5.4l-4.65,2.7
M72.15,63.35v-5.4l4.7-2.7l4.65,2.7v5.4l-4.65,2.7 M76.85,55.25v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M67.5,55.25l4.65,2.7
M34.95,95.7v-5.4l4.65-2.7l4.65,2.7 M16.3,95.7v-5.4l4.65-2.7l4.65,2.7v5.4 M25.6,90.3l4.7-2.7l4.65,2.7 M25.6,79.55v-5.4l4.7-2.7
l4.65,2.7v5.4L30.3,82.2L25.6,79.55l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M20.95,87.6v-5.4 M39.6,87.6v-5.4 M30.3,87.6
v-5.4 M7,95.7v-5.4l4.65-2.7l4.65,2.7 M-2.3,95.7v-5.4l4.65-2.7L7,90.3 M2.35,82.2l-4.65-2.65v-5.4l4.65-2.7L7,74.15v5.4L2.35,82.2
z M16.3,79.55l-4.65,2.65L7,79.55 M2.35,87.6v-5.4 M11.65,87.6v-5.4 M16.3,74.15l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M2.35,71.45
v-5.4L7,63.35l4.65,2.7 M2.35,49.85L7,47.2l4.65,2.65v5.4L7,57.95l-4.65-2.7V49.85L-2.3,47.2v-5.4l4.65-2.7L7,41.8v5.4
M11.65,55.25l4.65,2.7v5.4 M7,74.15l4.65-2.7 M7,57.95v5.4 M30.3,71.45v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M16.3,57.95
l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M30.3,66.05l-4.7-2.7 M30.3,49.85l4.65-2.65l4.65,2.65v5.4l-4.65,2.7l-4.65-2.7V49.85l-4.7-2.65
v-5.4l-4.65-2.7v-5.4L25.6,31l4.7,2.7v5.4l-4.7,2.7 M11.65,49.85l4.65-2.65l4.65,2.65v5.4 M25.6,57.95l4.7-2.7 M34.95,57.95v5.4
M34.95,47.2v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M25.6,31v-5.4l4.7-2.7l4.65,2.7V31l-4.65,2.7 M34.95,25.6l4.65-2.7l4.65,2.7
V31l-4.65,2.7L34.95,31 M30.3,39.1l4.65,2.7 M39.6,39.1v-5.4 M20.95,39.1l-4.65,2.7l-4.65-2.7v-5.4L16.3,31l4.65,2.7 M16.3,41.8
v5.4 M2.35,33.7L-2.3,31v-5.4l4.65-2.7L7,25.6V31L2.35,33.7z M7,25.6l4.65-2.7l4.65,2.7V31 M2.35,39.1v-5.4 M11.65,33.7L7,31
M7,41.8l4.65-2.7 M11.65,17.5L7,14.85v-5.4l4.65-2.7l4.65,2.7v5.4L11.65,17.5z M11.65,22.9v-5.4 M2.35,22.9v-5.4L7,14.85 M7,9.45
l-4.65-2.7v-5.4L7-1.35l4.65,2.7v5.4 M34.95,14.85v-5.4l4.65-2.7l4.65,2.7v5.4L39.6,17.5L34.95,14.85z M39.6,22.9v-5.4 M25.6,25.6
l-4.65-2.7v-5.4l4.65-2.65l4.7,2.65v5.4 M16.3,9.45l4.65-2.7l4.65,2.7v5.4 M34.95,9.45l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4
M11.65,1.35l4.65-2.7l4.65,2.7v5.4 M25.6,9.45l4.7-2.7 M30.3,17.5l4.65-2.65 M16.3,25.6l4.65-2.7 M20.95,17.5l-4.65-2.65
M76.85,49.85l-4.7-2.65v-5.4l4.7-2.7l4.65,2.7v5.4 M62.85,47.2v-5.4l4.65-2.7l4.65,2.7 M62.85,25.6l4.65-2.7l4.65,2.7V31
l-4.65,2.7L62.85,31V25.6l-4.65-2.7v-5.4 M72.15,25.6l4.7-2.7l4.65,2.7V31l-4.65,2.7l-4.7-2.7 M76.85,39.1v-5.4 M67.5,39.1v-5.4
M53.55,47.2v-5.4l4.65-2.7l4.65,2.7 M44.25,41.8l4.65-2.7l4.65,2.7 M44.25,25.6l4.65-2.7l4.65,2.7V31l-4.65,2.7L44.25,31
M62.85,31l-4.65,2.7L53.55,31 M58.2,39.1v-5.4 M48.9,39.1v-5.4 M53.55,14.85v-5.4l4.65-2.7l4.65,2.7v5.4L58.2,17.5L53.55,14.85
L48.9,17.5l-4.65-2.65 M48.9,22.9v-5.4 M53.55,9.45l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M44.25,9.45l4.65-2.7 M76.85,22.9v-5.4
l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M76.85,17.5l-4.7-2.65v-5.4l4.7-2.7l4.65,2.7v5.4 M67.5,22.9v-5.4l4.65-2.65 M67.5,17.5
l-4.65-2.65 M72.15,9.45l-4.65-2.7v-5.4l4.65-2.7l4.7,2.7v5.4 M62.85,9.45l4.65-2.7 M53.55,25.6l4.65-2.7 M44.25,63.35l-4.65,2.7
M39.6,55.25l4.65,2.7 M39.6,71.45l4.65,2.7 M67.5,49.85l4.65-2.65 M48.9,49.85l-4.65-2.65 M25.6,47.2l-4.65,2.65 M104.75,87.6
l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65V87.6l4.65,2.7 M109.4,79.55l-4.65,2.65 M100.1,95.7v-5.4 M81.5,90.3l4.65-2.7
l4.65,2.7v5.4 M81.5,74.15l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65 M90.8,79.55l4.65,2.65 M86.15,87.6v-5.4 M90.8,90.3
l4.65-2.7 M95.45,71.45v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7L95.45,71.45l-4.65,2.7 M86.15,55.25l4.65,2.7v5.4l-4.65,2.7
l-4.65-2.7 M86.15,71.45v-5.4 M95.45,55.25v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7L95.45,55.25l-4.65,2.7 M100.1,63.35v-5.4
M90.8,63.35l4.65,2.7 M109.4,63.35l-4.65,2.7 M104.75,71.45l4.65,2.7 M104.75,55.25l4.65,2.7 M100.1,79.55v-5.4 M100.1,47.2v-5.4
l4.65-2.7l4.65,2.7 M100.1,41.8l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M109.4,31l-4.65,2.7 M81.5,41.8l4.65-2.7l4.65,2.7v5.4
l-4.65,2.65 M86.15,22.9l4.65,2.7V31l-4.65,2.7L81.5,31 M100.1,31v-5.4l4.65-2.7l4.65,2.7 M90.8,31l4.65,2.7 M86.15,39.1v-5.4
M90.8,41.8l4.65-2.7 M86.15,17.5l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M90.8,14.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65
M81.5,9.45l4.65-2.7l4.65,2.7 M86.15,6.75v-5.4l4.65-2.7l4.65,2.7v5.4 M100.1,14.85l4.65,2.65v5.4 M109.4,14.85l-4.65,2.65
M100.1,9.45l4.65-2.7l4.65,2.7 M95.45,1.35l4.65-2.7l4.65,2.7v5.4 M95.45,22.9l4.65,2.7 M109.4,47.2l-4.65,2.65 M90.8,47.2
l4.65,2.65 M104.75-9.45l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65V-9.45l4.65,2.7 M109.4-17.5l-4.65,2.65 M100.1-1.35v-5.4
M90.8-1.35v-5.4l4.65-2.7 M81.5-6.75l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4L81.5-6.75v5.4l-4.65,2.7 M90.8-6.75l-4.65-2.7
M95.45-14.85L90.8-17.5v-5.4l4.65-2.7l4.65,2.7v5.4 M76.85-14.85l-4.7-2.65v-5.4l4.7-2.7l4.65,2.7v5.4 M86.15-14.85l4.65-2.65
M95.45-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L95.45-31z M95.45-25.6V-31 M90.8-22.9l-4.65-2.7V-31l4.65-2.7 M86.15-31
l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M86.15-41.8v-5.4l4.65-2.65l4.65,2.65v5.4 M100.1-33.7l4.65,2.7v5.4l-4.65,2.7 M109.4-33.7
l-4.65,2.7 M95.45-47.2l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M104.75-41.8l4.65,2.7 M81.5-22.9l4.65-2.7 M104.75-25.6l4.65,2.7
M100.1-49.85v-5.4l4.65-2.7l4.65,2.7 M109.4-66.05l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M104.75-63.35v5.4 M100.1-55.25
l-4.65-2.7v-5.4l4.65-2.7 M86.15-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M86.15-74.15l4.65,2.7v5.4l-4.65,2.7l-4.65-2.7v-5.4
L86.15-74.15v-5.4l4.65-2.65l4.65,2.65 M90.8-71.45l4.65-2.7l4.65,2.7 M95.45-63.35l-4.65-2.7 M90.8-55.25l4.65-2.7 M86.15-57.95
v-5.4 M95.45-74.15v-5.4l4.65-2.65l4.65,2.65v5.4 M81.5-71.45l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65 M81.5-82.2v-5.4l4.65-2.7
l4.65,2.7v5.4 M86.15-90.3v-5.4 M104.75-95.7v5.4l-4.65,2.7l-4.65-2.7v-5.4 M100.1-82.2v-5.4 M95.45-90.3l-4.65,2.7 M109.4-82.2
l-4.65,2.65 M104.75-90.3l4.65,2.7 M109.4-49.85l-4.65,2.65 M72.15-1.35v-5.4l4.7-2.7 M67.5,1.35l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7
M72.15-17.5l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M67.5-14.85v5.4 M53.55-1.35v-5.4l4.65-2.7l4.65,2.7 M48.9,1.35
l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M44.25-22.9l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65V-22.9l-4.65-2.7V-31 M53.55-17.5
l4.65,2.65v5.4 M48.9-9.45v-5.4 M53.55-33.7v-5.4l4.65-2.7l4.65,2.7v5.4L58.2-31L53.55-33.7z M62.85-22.9l-4.65-2.7V-31 M48.9-25.6
V-31l4.65-2.7 M48.9-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M48.9-41.8v-5.4l4.65-2.65l4.65,2.65v5.4 M76.85-25.6V-31l4.65-2.7
M76.85-31l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7 M62.85-33.7L67.5-31v5.4 M72.15-39.1l-4.65-2.7v-5.4l4.65-2.65l4.7,2.65v5.4
M62.85-39.1l4.65-2.7 M72.15-33.7L67.5-31 M53.55-22.9l4.65-2.7 M58.2-14.85l4.65-2.65 M30.3,1.35l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7
v5.4 M30.3-9.45v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M16.3-1.35v-5.4l4.65-2.7l4.65,2.7 M30.3-14.85l-4.7-2.65v-5.4l4.7-2.7
l4.65,2.7v5.4 M25.6-17.5l-4.65,2.65L16.3-17.5v-5.4l4.65-2.7l4.65,2.7 M20.95-14.85v5.4 M16.3-6.75l-4.65-2.7v-5.4l4.65-2.65
M2.35,1.35l-4.65-2.7v-5.4l4.65-2.7L7-6.75v5.4 M7-17.5l-4.65,2.65L-2.3-17.5v-5.4l4.65-2.7L7-22.9V-17.5l4.65,2.65 M11.65-9.45
L7-6.75 M2.35-9.45v-5.4 M11.65-31L7-33.7v-5.4l4.65-2.7l4.65,2.7v5.4L11.65-31z M16.3-22.9l-4.65-2.7V-31 M2.35-25.6V-31L7-33.7
M7-39.1l-4.65-2.7v-5.4L7-49.85l4.65,2.65v5.4 M44.25-33.7L39.6-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M20.95-25.6V-31l4.65-2.7
l4.7,2.7v5.4 M20.95-47.2l4.65-2.65l4.7,2.65v5.4l-4.7,2.7l-4.65-2.7V-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M30.3-47.2
l4.65-2.65l4.65,2.65v5.4 M30.3-41.8l4.65,2.7 M25.6-33.7v-5.4 M34.95-33.7L30.3-31 M34.95-22.9l4.65-2.7 M20.95-31l-4.65-2.7
M16.3-39.1l4.65-2.7 M7-22.9l4.65-2.7 M34.95-55.25l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L34.95-55.25v5.4 M25.6-49.85v-5.4
l4.7-2.7 M30.3-63.35l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7v5.4 M25.6-66.05l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M30.3-74.15
v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M20.95-63.35v5.4 M7-49.85v-5.4l4.65-2.7l4.65,2.7 M2.35-47.2l-4.65-2.65v-5.4l4.65-2.7
L7-55.25 M2.35-63.35l-4.65-2.7v-5.4l4.65-2.7L7-71.45v5.4L2.35-63.35z M16.3-71.45l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4
M11.65-57.95v-5.4l4.65-2.7 M2.35-57.95v-5.4 M7-66.05l4.65,2.7 M11.65-74.15L7-71.45 M2.35-74.15v-5.4L7-82.2l4.65,2.65
M11.65-95.7v5.4L7-87.6l-4.65-2.7v-5.4 M20.95-95.7v5.4l-4.65,2.7l-4.65-2.7 M7-87.6v5.4 M16.3-87.6v5.4 M20.95-90.3l4.65,2.7v5.4
l-4.65,2.65 M30.3-79.55l-4.7-2.65 M30.3-95.7v5.4l-4.7,2.7 M48.9-95.7v5.4l-4.65,2.7l-4.65-2.7v-5.4 M34.95-82.2v-5.4l4.65-2.7
M30.3-90.3l4.65,2.7 M72.15-49.85v-5.4l4.7-2.7l4.65,2.7 M67.5-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M67.5-74.15l4.65,2.7v5.4
l-4.65,2.7l-4.65-2.7v-5.4L67.5-74.15v-5.4l4.65-2.65l4.7,2.65 M81.5-66.05l-4.65,2.7l-4.7-2.7 M72.15-71.45l4.7-2.7 M76.85-63.35
v5.4 M67.5-57.95v-5.4 M53.55-49.85v-5.4l4.65-2.7l4.65,2.7 M48.9-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M44.25-66.05v-5.4
l4.65-2.7l4.65,2.7v5.4l-4.65,2.7L44.25-66.05l-4.65,2.7 M62.85-66.05l-4.65,2.7l-4.65-2.7 M53.55-71.45l4.65-2.7l4.65,2.7
M58.2-57.95v-5.4 M48.9-57.95v-5.4 M48.9-74.15v-5.4l4.65-2.65l4.65,2.65v5.4 M48.9-79.55l-4.65-2.65v-5.4 M58.2-95.7v5.4
l-4.65,2.7l-4.65-2.7 M53.55-87.6v5.4 M58.2-79.55l4.65-2.65l4.65,2.65 M62.85-82.2v-5.4l4.65-2.7l4.65,2.7v5.4 M67.5-90.3v-5.4
M76.85-95.7v5.4l-4.7,2.7 M58.2-90.3l4.65,2.7 M44.25-17.5l-4.65,2.65 M39.6-9.45l4.65,2.7 M39.6-74.15l4.65,2.7 M39.6-57.95
l4.65,2.7 M44.25-49.85L39.6-47.2 M62.85-49.85L58.2-47.2 M16.3-49.85l-4.65,2.65 M44.25-82.2l-4.65,2.65 M76.85-90.3l4.65,2.7
M81.5-49.85l-4.65,2.65 M86.15,1.35l-4.65-2.7 M44.25-1.35l-4.65,2.7 M62.85-1.35l-4.65,2.7 M109.4-1.35l-4.65,2.7 M25.6-1.35
l-4.65,2.7 M-95.4,95.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-86.1,90.3l4.7-2.7l4.65,2.7v5.4 M-104.7,95.7v-5.4l4.65-2.7l4.65,2.7
M-100.05,82.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4L-100.05,82.2z M-95.4,74.15l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65
M-86.1,74.15l4.7-2.7l4.65,2.7v5.4l-4.65,2.65l-4.7-2.65 M-100.05,87.6v-5.4 M-90.75,87.6v-5.4 M-81.4,87.6v-5.4 M-109.35,87.6
l4.65,2.7 M-104.7,79.55l-4.65,2.65 M-109.35,55.25l4.65,2.7v5.4l-4.65,2.7 M-109.35,71.45l4.65,2.7 M-90.75,66.05l-4.65-2.7v-5.4
l4.65-2.7l4.65,2.7v5.4L-90.75,66.05v5.4 M-86.1,57.95l4.7-2.7l4.65,2.7v5.4l-4.65,2.7l-4.7-2.7 M-81.4,71.45v-5.4 M-100.05,71.45
v-5.4l4.65-2.7 M-95.4,57.95l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-81.4,55.25v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7
M-100.05,66.05l-4.65-2.7 M-104.7,57.95l4.65-2.7 M-86.1,41.8l-4.65-2.7v-5.4l4.65-2.7l4.7,2.7v5.4L-86.1,41.8z M-81.4,49.85
l-4.7-2.65v-5.4 M-100.05,49.85l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M-95.4,31l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7V31
l4.65,2.7 M-86.1,31v-5.4l4.7-2.7l4.65,2.7V31l-4.65,2.7 M-100.05,39.1v-5.4 M-90.75,39.1l-4.65,2.7 M-109.35,39.1l4.65,2.7
M-104.7,31l-4.65,2.7 M-109.35,6.75l4.65,2.7v5.4l-4.65,2.65 M-86.1,14.85v-5.4l4.7-2.7l4.65,2.7v5.4l-4.65,2.65L-86.1,14.85z
M-81.4,22.9v-5.4 M-86.1,25.6l-4.65-2.7v-5.4l4.65-2.65 M-100.05,22.9v-5.4l4.65-2.65l4.65,2.65 M-100.05,6.75v-5.4l4.65-2.7
l4.65,2.7v5.4l-4.65,2.7L-100.05,6.75z M-81.4,6.75v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M-90.75,6.75l4.65,2.7 M-95.4,14.85v-5.4
M-95.4,25.6l4.65-2.7 M-100.05,17.5l-4.65-2.65 M-104.7,9.45l4.65-2.7 M-109.35,22.9l4.65,2.7 M-86.1,47.2l-4.65,2.65
M-104.7,47.2l-4.65,2.65 M-11.6,95.7v-5.4l4.65-2.7l4.65,2.7 M-20.9,95.7v-5.4l4.65-2.7l4.65,2.7 M-16.25,82.2l-4.65-2.65v-5.4
l4.65-2.7l4.65,2.7v5.4L-16.25,82.2v5.4 M-2.3,79.55l-4.65,2.65l-4.65-2.65 M-6.95,82.2v5.4 M-30.2,95.7v-5.4l4.65-2.7l4.65,2.7
M-39.55,95.7v-5.4l4.7-2.7l4.65,2.7 M-39.55,79.55v-5.4l4.7-2.7l4.65,2.7v5.4l-4.65,2.65L-39.55,79.55l-4.65,2.65l-4.65-2.65
M-20.9,79.55l-4.65,2.65l-4.65-2.65 M-34.85,87.6v-5.4 M-25.55,87.6v-5.4 M-20.9,74.15l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4
M-30.2,74.15l4.65-2.7 M-25.55,66.05l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-39.55,74.15l-4.65-2.7v-5.4l4.65-2.7l4.7,2.7v5.4
M-30.2,57.95l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-39.55,63.35v-5.4l4.7-2.7 M-30.2,63.35l-4.65,2.7 M-11.6,74.15l4.65-2.7
l4.65,2.7 M-6.95,66.05l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L-6.95,66.05v5.4 M-16.25,66.05l4.65-2.7 M-11.6,57.95l-4.65-2.7v-5.4
l4.65-2.65l4.65,2.65v5.4 M-16.25,55.25l-4.65,2.7 M-48.85,95.7v-5.4l4.65-2.7l4.65,2.7 M-58.15,95.7v-5.4l4.65-2.7l4.65,2.7
M-58.15,79.55v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65L-58.15,79.55l-4.65,2.65l-4.65-2.65 M-44.2,87.6v-5.4 M-53.5,87.6v-5.4
M-67.45,95.7v-5.4l4.65-2.7l4.65,2.7 M-76.75,90.3l4.65-2.7l4.65,2.7 M-76.75,74.15l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65
M-62.8,87.6v-5.4 M-72.1,87.6v-5.4 M-67.45,74.15l4.65-2.7l4.65,2.7 M-62.8,71.45v-5.4l4.65-2.7l4.65,2.7v5.4 M-62.8,66.05
l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-76.75,63.35l4.65,2.7v5.4 M-62.8,55.25v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7
M-67.45,63.35l-4.65,2.7 M-72.1,55.25l4.65,2.7 M-48.85,74.15l4.65-2.7 M-44.2,66.05l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7
M-53.5,49.85l4.65-2.65l4.65,2.65v5.4 M-53.5,66.05l4.65-2.7 M-53.5,55.25l4.65,2.7 M-48.85,47.2v-5.4l4.65-2.7l4.65,2.7v5.4
l-4.65,2.65 M-58.15,47.2v-5.4l4.65-2.7l4.65,2.7 M-58.15,25.6l4.65-2.7l4.65,2.7V31l-4.65,2.7l-4.65-2.7V25.6l-4.65-2.7v-5.4
M-48.85,25.6l4.65-2.7l4.65,2.7V31l-4.65,2.7l-4.65-2.7 M-44.2,39.1v-5.4 M-53.5,39.1v-5.4 M-62.8,49.85l-4.65-2.65v-5.4l4.65-2.7
l4.65,2.7 M-76.75,47.2v-5.4l4.65-2.7l4.65,2.7 M-76.75,25.6l4.65-2.7l4.65,2.7V31l-4.65,2.7l-4.65-2.7 M-58.15,31l-4.65,2.7
l-4.65-2.7 M-72.1,39.1v-5.4 M-62.8,39.1v-5.4 M-67.45,14.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65L-67.45,14.85l-4.65,2.65
l-4.65-2.65 M-72.1,22.9v-5.4 M-62.8,6.75v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M-72.1,6.75l4.65,2.7 M-44.2,22.9v-5.4l4.65-2.65
l4.7,2.65v5.4l-4.7,2.7 M-44.2,17.5l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M-48.85,14.85l-4.65,2.65l-4.65-2.65 M-53.5,22.9v-5.4
M-44.2,6.75v-5.4l4.65-2.7l4.7,2.7v5.4l-4.7,2.7 M-53.5,6.75l4.65,2.7 M-67.45,25.6l4.65-2.7 M-11.6,47.2v-5.4l4.65-2.7l4.65,2.7
M-11.6,41.8l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-16.25,33.7L-20.9,31v-5.4l4.65-2.7l4.65,2.7V31 M-2.3,31l-4.65,2.7
M-30.2,47.2v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M-39.55,41.8l4.7-2.7l4.65,2.7 M-34.85,22.9l4.65,2.7V31l-4.65,2.7l-4.7-2.7
M-20.9,31l-4.65,2.7L-30.2,31 M-34.85,39.1v-5.4 M-25.55,39.1v-5.4 M-20.9,25.6l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4
M-25.55,17.5l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M-25.55,6.75v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M-30.2,14.85l-4.65,2.65
M-34.85,6.75l4.65,2.7 M-6.95,17.5l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4L-6.95,17.5v5.4l-4.65,2.7 M-11.6,14.85l-4.65,2.65
M-16.25,6.75l4.65,2.7 M-16.25,1.35l4.65-2.7l4.65,2.7v5.4 M-6.95,22.9l4.65,2.7 M-30.2,25.6l4.65-2.7 M-16.25,39.1l-4.65,2.7
M-67.45,47.2l-4.65,2.65 M-2.3,47.2l-4.65,2.65 M-34.85,49.85l-4.7-2.65 M-16.25,49.85l-4.65-2.65 M-81.4,39.1l4.65,2.7
M-11.6-1.35v-5.4l4.65-2.7l4.65,2.7 M-11.6-6.75l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-16.25-14.85l-4.65-2.65v-5.4l4.65-2.7
l4.65,2.7v5.4 M-2.3-17.5l-4.65,2.65 M-20.9-1.35v-5.4l4.65-2.7 M-20.9-6.75l-4.65-2.7v-5.4l4.65-2.65 M-25.55-9.45l-4.65,2.7
l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65 M-30.2-6.75v5.4l-4.65,2.7 M-39.55-1.35v-5.4l4.7-2.7 M-34.85-14.85l-4.7-2.65v-5.4l4.7-2.7
l4.65,2.7v5.4 M-30.2-33.7v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7L-30.2-33.7l-4.65,2.7l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7 M-20.9-22.9
l-4.65-2.7V-31 M-34.85-25.6V-31 M-39.55-39.1l-4.65-2.7v-5.4l4.65-2.65l4.7,2.65v5.4 M-25.55-41.8v-5.4l4.65-2.65l4.65,2.65v5.4
l-4.65,2.7 M-6.95-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L-6.95-31v5.4l-4.65,2.7 M-16.25-25.6V-31l4.65-2.7 M-16.25-41.8
l4.65,2.7 M-16.25-47.2l4.65-2.65l4.65,2.65v5.4 M-30.2-22.9l4.65-2.7 M-16.25-31l-4.65-2.7 M-6.95-25.6l4.65,2.7 M-44.2,1.35
l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M-58.15-1.35v-5.4l4.65-2.7l4.65,2.7 M-58.15-6.75l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4
M-62.8-14.85l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4 M-39.55-17.5l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M-44.2-9.45v-5.4
M-53.5-14.85l4.65-2.65 M-62.8,1.35l-4.65-2.7v-5.4l4.65-2.7 M-76.75-6.75l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4L-76.75-6.75
v5.4 M-76.75-17.5v-5.4l4.65-2.7l4.65,2.7 M-67.45-17.5l-4.65,2.65 M-72.1-9.45l4.65,2.7 M-67.45-33.7v-5.4l4.65-2.7l4.65,2.7v5.4
L-62.8-31L-67.45-33.7z M-62.8-25.6V-31 M-72.1-25.6V-31l4.65-2.7 M-72.1-31l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M-76.75-39.1
l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-62.8-41.8v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7 M-44.2-25.6V-31l4.65-2.7 M-44.2-31
l-4.65-2.7v-5.4l4.65-2.7 M-48.85-33.7L-53.5-31l-4.65-2.7 M-48.85-22.9l-4.65-2.7V-31 M-53.5-41.8l4.65,2.7 M-58.15-22.9l4.65-2.7
M-58.15-49.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M-48.85-55.25l4.65-2.7l4.65,2.7v5.4 M-58.15-71.45l4.65-2.7l4.65,2.7v5.4
l-4.65,2.7l-4.65-2.7V-71.45z M-48.85-71.45l4.65-2.7l4.65,2.7v5.4l-4.65,2.7l-4.65-2.7 M-44.2-57.95v-5.4 M-53.5-57.95v-5.4
M-76.75-49.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M-67.45-55.25l4.65-2.7l4.65,2.7 M-76.75-55.25l-4.65-2.7v-5.4l4.65-2.7
l4.65,2.7v5.4 M-81.4-63.35l-4.7-2.7v-5.4l4.7-2.7l4.65,2.7v5.4 M-81.4-74.15v-5.4l4.65-2.65l4.65,2.65v5.4l-4.65,2.7
M-58.15-66.05l-4.65,2.7l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M-62.8-57.95v-5.4 M-72.1-74.15l4.65,2.7 M-67.45-66.05l-4.65,2.7
M-67.45-82.2v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65L-67.45-82.2l-4.65,2.65 M-76.75-82.2v-5.4l4.65-2.7l4.65,2.7 M-72.1-90.3
v-5.4 M-62.8-90.3v-5.4 M-53.5-74.15v-5.4l4.65-2.65l4.65,2.65v5.4 M-58.15-82.2l4.65,2.65 M-58.15-87.6l4.65-2.7l4.65,2.7v5.4
M-53.5-90.3v-5.4 M-44.2-95.7v5.4l-4.65,2.7 M-62.8-74.15v-5.4 M-11.6-49.85v-5.4l4.65-2.7l4.65,2.7 M-20.9-49.85v-5.4l4.65-2.7
l4.65,2.7 M-16.25-63.35l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4L-16.25-63.35v5.4 M-2.3-66.05l-4.65,2.7l-4.65-2.7 M-11.6-71.45
l4.65-2.7l4.65,2.7 M-6.95-63.35v5.4 M-25.55-47.2l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M-39.55-55.25l4.7-2.7l4.65,2.7
M-39.55-71.45l4.7-2.7l4.65,2.7v5.4l-4.65,2.7l-4.7-2.7 M-20.9-71.45l-4.65-2.7v-5.4l4.65-2.65l4.65,2.65v5.4 M-20.9-66.05
l-4.65,2.7l-4.65-2.7 M-25.55-74.15l-4.65,2.7 M-34.85-63.35v5.4 M-25.55-57.95v-5.4 M-34.85-74.15v-5.4l4.65-2.65l4.65,2.65
M-44.2-79.55l4.65-2.65l4.7,2.65 M-39.55-82.2v-5.4l4.7-2.7l4.65,2.7v5.4 M-34.85-90.3v-5.4 M-16.25-95.7v5.4l-4.65,2.7l-4.65-2.7
v-5.4 M-25.55-90.3l-4.65,2.7 M-20.9-82.2v-5.4 M-6.95-79.55l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7v5.4L-6.95-79.55v5.4 M-16.25-79.55
l4.65-2.65 M-11.6-87.6l-4.65-2.7 M-6.95-95.7v5.4 M-44.2-90.3l4.65,2.7 M-62.8-47.2l-4.65-2.65 M-44.2-47.2l-4.65-2.65
M-30.2-49.85l-4.65,2.65 M-2.3-49.85l-4.65,2.65 M-95.4-1.35v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.7 M-86.1-6.75l4.7-2.7
M-100.05,1.35l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7 M-95.4-17.5l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7V-17.5z M-95.4-22.9
l4.65-2.7l4.65,2.7v5.4l-4.65,2.65l-4.65-2.65 M-81.4-14.85l-4.7-2.65 M-100.05-9.45v-5.4 M-90.75-14.85v5.4 M-109.35-9.45
l4.65,2.7 M-104.7-17.5l-4.65,2.65 M-109.35-41.8l4.65,2.7v5.4l-4.65,2.7 M-90.75-25.6V-31l4.65-2.7l4.7,2.7v5.4l-4.7,2.7
M-100.05-25.6V-31l4.65-2.7l4.65,2.7 M-100.05-47.2l4.65-2.65l4.65,2.65v5.4l-4.65,2.7l-4.65-2.7V-47.2l-4.65-2.65 M-90.75-41.8
l4.65,2.7v5.4 M-86.1-39.1l4.7-2.7 M-95.4-33.7v-5.4 M-109.35-25.6l4.65,2.7 M-100.05-31l-4.65-2.7 M-104.7-39.1l4.65-2.7
M-95.4-49.85v-5.4l4.65-2.7l4.65,2.7v5.4l-4.65,2.65 M-86.1-55.25l4.7-2.7 M-95.4-55.25l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4
M-100.05-63.35l-4.65-2.7v-5.4l4.65-2.7l4.65,2.7v5.4 M-95.4-71.45l4.65-2.7l4.65,2.7 M-86.1-66.05l-4.65,2.7 M-109.35-57.95
l4.65,2.7v5.4l-4.65,2.65 M-109.35-74.15l4.65,2.7 M-104.7-66.05l-4.65,2.7 M-109.35-90.3l4.65,2.7v5.4l-4.65,2.65 M-81.4-79.55
l-4.7-2.65v-5.4l4.7-2.7l4.65,2.7 M-86.1-82.2l-4.65,2.65l-4.65-2.65v-5.4l4.65-2.7l4.65,2.7 M-100.05-74.15v-5.4l4.65-2.65
M-95.4-87.6l-4.65-2.7v-5.4 M-81.4-95.7v5.4 M-90.75-95.7v5.4 M-90.75-79.55v5.4 M-104.7-55.25l4.65-2.7 M-100.05-79.55
l-4.65-2.65 M-104.7-87.6l4.65-2.7 M-81.4-47.2l-4.7-2.65 M-76.75-33.7L-81.4-31 M-81.4-25.6l4.65,2.7 M-67.45-1.35l-4.65,2.7
M-104.7-1.35l-4.65,2.7 M-81.4,1.35l-4.7-2.7 M-25.55,1.35l-4.65-2.7 M-53.5,1.35l4.65-2.7 M-2.3-1.35l-4.65,2.7 M-2.3,57.95
l4.65-2.7 M2.35,66.05l-4.65-2.7 M-2.3-39.1l4.65-2.7 M2.35-31l-4.65-2.7 M2.35-79.55L-2.3-82.2 M-2.3-87.6l4.65-2.7 M-2.3,9.45
l4.65-2.7 M2.35,17.5l-4.65-2.65"/>
</symbol>
<g id="Layer_1">
</g>
<g id="Layer_6">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#EFEEEE" d="M217.5,108.95c0,29.833-10.533,55.399-31.6,76.7
c-0.7,0.833-1.484,1.6-2.351,2.3c-3.466,3.399-7.134,6.483-11,9.25c-18.267,13.467-39.366,20.2-63.3,20.2
c-23.967,0-45.033-6.733-63.2-20.2c-4.8-3.4-9.3-7.25-13.5-11.55c-16.367-16.267-26.417-35.167-30.15-56.7
c-0.733-4.2-1.217-8.467-1.45-12.8c-0.1-2.4-0.15-4.801-0.15-7.2c0-2.534,0.05-4.95,0.15-7.25c0-0.233,0.066-0.467,0.2-0.7
c1.567-26.6,12.033-49.583,31.4-68.95C53.85,11.017,79.417,0.5,109.25,0.5c29.934,0,55.483,10.517,76.65,31.55
C206.967,53.483,217.5,79.117,217.5,108.95z"/>
</g>
<g id="Layer_5">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#010101" d="M195.45,43l-22.4,22.4c-8.833,13-13.25,27.867-13.25,44.6
c0,17.934,5.067,33.833,15.2,47.7l19,18.95c-2.5,3.066-5.2,6.066-8.1,9c-0.7,0.833-1.484,1.6-2.351,2.3
c-2.533,2.5-5.167,4.816-7.899,6.95L158.1,177.35c-13.934-10.733-30.133-16.1-48.6-16.1c-17.933,0-33.833,5.1-47.7,15.3
L43.25,195.15c-3.767-2.867-7.333-6.034-10.7-9.5c-2.8-2.801-5.417-5.667-7.85-8.601l19.15-19.2
c10.066-13.966,15.1-29.916,15.1-47.85c0-17.5-4.867-33.017-14.6-46.55l-21.05-21c2.833-3.6,5.917-7.067,9.25-10.4
c2.934-2.867,5.934-5.55,9-8.05L61.9,44.35C75.7,54.583,91.567,59.7,109.5,59.7c18.467,0,34.666-5.367,48.6-16.1L177.4,24.35
c2.899,2.367,5.732,4.933,8.5,7.7C189.367,35.583,192.55,39.233,195.45,43z"/>
</g>
<g id="Layer_4">
<defs>
<path id="SVGID_1_" d="M159.8,110c0-16.733,4.417-31.6,13.25-44.6l22.4-22.4c-2.9-3.767-6.083-7.417-9.55-10.95
c-2.768-2.767-5.601-5.333-8.5-7.7L158.1,43.6c-13.934,10.733-30.133,16.1-48.6,16.1c-17.933,0-33.8-5.117-47.6-15.35L41.55,24
c-3.066,2.5-6.066,5.183-9,8.05c-3.333,3.333-6.417,6.8-9.25,10.4l21.05,21c9.733,13.533,14.6,29.05,14.6,46.55
c0,17.934-5.034,33.884-15.1,47.85l-19.15,19.2c2.433,2.934,5.05,5.8,7.85,8.601c3.367,3.466,6.934,6.633,10.7,9.5L61.8,176.55
c13.867-10.2,29.767-15.3,47.7-15.3c18.467,0,34.666,5.366,48.6,16.1L175.65,194.9c2.732-2.134,5.366-4.45,7.899-6.95
c0.866-0.7,1.65-1.467,2.351-2.3c2.899-2.934,5.6-5.934,8.1-9l-19-18.95C164.867,143.833,159.8,127.934,159.8,110z"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" overflow="visible"/>
</clipPath>
<g clip-path="url(#SVGID_2_)">
<use xlink:href="#hex_grid" width="228.55" height="197.233" x="-114.25" y="-98.617" transform="matrix(1.1415 0 0 -1.1415 105.5 107.75)" overflow="visible"/>
</g>
</g>
<g id="Layer_2">
<g>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#35C6F4" d="M79.1,110.95c-0.033-0.667-0.05-1.333-0.05-2
c0-0.7,0.017-1.366,0.05-2c0-0.067,0.017-0.134,0.05-0.2c0.434-7.367,3.333-13.733,8.7-19.1c5.9-5.833,12.983-8.75,21.25-8.75
c8.301,0,15.384,2.917,21.25,8.75c5.834,5.934,8.75,13.033,8.75,21.3c0,8.267-2.916,15.35-8.75,21.25
c-0.199,0.233-0.416,0.45-0.649,0.649c-0.967,0.934-1.983,1.784-3.05,2.551c-5.066,3.733-10.917,5.6-17.551,5.6
c-6.633,0-12.466-1.866-17.5-5.6c-1.333-0.934-2.583-2-3.75-3.2c-4.533-4.5-7.317-9.733-8.35-15.7
C79.3,113.334,79.167,112.15,79.1,110.95z M126.1,127.25l3.601,3.6L126.1,127.25z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="none" stroke="#35C6F4" stroke-width="2" stroke-miterlimit="1" d="
M158.6,60.25l-15,14.65 M31.7,33.1l40.75,40.65 M126.1,127.25l3.601,3.6 M157.05,158l27.65,28.6 M153.05,153.95l-10.75-11.2
M186.6,33l-28,27.25 M33.15,186.25l27.35-27.4"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="none" stroke="#35C6F4" stroke-width="7" stroke-miterlimit="1" d="
M158.6,60.25l-16.949,17.2 M59.4,61.35L76.6,78.5 M60.5,158.85l16.75-17.399 M153.05,153.95l4,4.05 M139.45,140.4l13.6,13.55"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1,52 +1,53 @@
# Sonarr
# Readarr
Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.
[![Build Status](https://dev.azure.com/Readarr/Readarr/_apis/build/status/Readarr.Readarr?branchName=develop)](https://dev.azure.com/Readarr/Readarr/_build/latest?definitionId=1&branchName=develop)
[![Docker Pulls](https://img.shields.io/docker/pulls/hotio/readarr)](https://hub.docker.com/r/hotio/readarr)
![Github Downloads](https://img.shields.io/github/downloads/readarr/readarr/total.svg)
[![Backers on Open Collective](https://opencollective.com/readarr/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/readarr/sponsors/badge.svg)](#sponsors)
### Readarr is in early stages of development, alpha/beta binary builds are not yet available. Use of any test builds isn't recommend, and may have detrimental effects on your library.
Readarr is a ebook (and maybe eventually magazine/audiobook) collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new books from your favorite authors and will grab, sort and rename them.
## Major Features Include:
* Support for major platforms: Windows, Linux, macOS, Raspberry Pi, etc.
* Automatically detects new episodes
* Can scan your existing library and download any missing episodes
* Can watch for better quality of the episodes you already have and do an automatic upgrade. *eg. from DVD to Blu-Ray*
* Automatically detects new books.
* Can scan your existing library and download any missing books.
* Automatic failed download handling will try another release if one fails
* Manual search so you can pick any release or to see why a release was not downloaded automatically
* Fully configurable episode renaming
* Fully configurable book renaming
* Full integration with SABnzbd and NZBGet
* Full integration with Kodi, Plex (notification, library update, metadata)
* Full support for specials and multi-episode releases
* Full integration with Calibre (add to library, conversion)
* And a beautiful UI
## Configuring Development Environment:
## Support
### Requirements
[![Discord](https://img.shields.io/badge/discord-chat-7289DA.svg?maxAge=60)](https://discord.gg/rkEXY2Rbgn)
[![GitHub](https://img.shields.io/badge/github-issues-red.svg?maxAge=60)](https://github.com/Readarr/Readarr/issues)
[![Wiki](https://img.shields.io/badge/servarr-wiki-181717.svg?maxAge=60)](https://wiki.servarr.com/Readarr)
* Visual Studio 2015 (https://www.visualstudio.com/vs/)
* [Git](https://git-scm.com/downloads)
* [NodeJS](https://nodejs.org/download/)
## Contributors
### Setup
This project exists thanks to all the people who contribute. [Contribute](CONTRIBUTING.md).
<a href="https://github.com/Readarr/Readarr/graphs/contributors"><img src="https://opencollective.com/Readarr/contributors.svg?width=890&button=false" /></a>
* Make sure all the required software mentioned above are installed.
* Clone the repository into your development machine. [*info*](https://help.github.com/articles/working-with-repositories)
* Grab the submodules `git submodule init && git submodule update`
* Install the required Node Packages `npm install`
* Start gulp to monitor your dev environment for any changes that need post processing using `npm start` command.
## Backers
*Please note gulp must be running at all times while you are working with Sonarr client source files.*
Thank you to all our backers! 🙏 [Become a backer](https://opencollective.com/readarr#backer)
### Development
<img src="https://opencollective.com/readarr/backers.svg?width=890"></a>
* Open `NzbDrone.sln` in Visual Studio
* Make sure `NzbDrone.Console` is set as the startup project
## Sponsors
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor](https://opencollective.com/readarr#sponsor)
<img src="https://opencollective.com/readarr/sponsors.svg?width=890"></a>
## Mega Sponsors
<img src="https://opencollective.com/readarr/tiers/mega-sponsor.svg?width=890"></a>
### License
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
* Copyright 2010-2017
### Sponsors
* [JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools
* [ReSharper](http://www.jetbrains.com/resharper/)
* [WebStorm](http://www.jetbrains.com/webstorm/)
* [TeamCity](http://www.jetbrains.com/teamcity/)
* Copyright 2010-2021

861
azure-pipelines.yml Normal file
View File

@@ -0,0 +1,861 @@
# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
variables:
outputFolder: './_output'
artifactsFolder: './_artifacts'
testsFolder: './_tests'
majorVersion: '0.1.0'
minorVersion: $[counter('minorVersion', 1)]
readarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(readarrVersion)'
sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '3.1.401'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
trigger:
branches:
include:
- develop
- master
pr:
- develop
stages:
- stage: Setup
displayName: Setup
jobs:
- job:
displayName: Build Variables
pool:
vmImage: 'ubuntu-18.04'
steps:
# Set the build name properly. The 'name' property won't recursively expand so hack here:
- bash: echo "##vso[build.updatebuildnumber]$READARRVERSION"
displayName: Set Build Name
- bash: |
if [[ $BUILD_REASON == "PullRequest" ]]; then
git diff origin/develop...HEAD --name-only | grep -E "^(src/|azure-pipelines.yml)"
echo $? > not_backend_update
else
echo 0 > not_backend_update
fi
cat not_backend_update
displayName: Check for Backend File Changes
- publish: not_backend_update
artifact: not_backend_update
displayName: Publish update type
- stage: Build_Backend
displayName: Build Backend
dependsOn: Setup
jobs:
- job: Backend
strategy:
matrix:
Linux:
osName: 'Linux'
imageName: 'ubuntu-18.04'
Mac:
osName: 'Mac'
imageName: 'macos-10.14'
Windows:
osName: 'Windows'
imageName: 'windows-2019'
pool:
vmImage: $(imageName)
variables:
# Disable stylecop here - linting errors get caught by the analyze task
EnableAnalyzers: 'false'
steps:
- checkout: self
submodules: true
fetchDepth: 1
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
version: $(dotnetVersion)
- bash: ./build.sh --backend
displayName: Build Readarr Backend
- bash: |
find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
find ${OUTPUTFOLDER} -depth -empty -type d -exec rm -r "{}" \;
find ${TESTSFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
find ${TESTSFOLDER} -depth -empty -type d -exec rm -r "{}" \;
displayName: Clean up intermediate output
condition: and(succeeded(), ne(variables['osName'], 'Windows'))
- publish: $(outputFolder)
artifact: '$(osName)Backend'
displayName: Publish Backend
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/netcoreapp3.1/win-x64/publish'
artifact: WindowsCoreTests
displayName: Publish Windows Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/net462/linux-x64/publish'
artifact: LinuxTests
displayName: Publish Linux Mono Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/netcoreapp3.1/linux-x64/publish'
artifact: LinuxCoreTests
displayName: Publish Linux Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/netcoreapp3.1/linux-musl-x64/publish'
artifact: LinuxMuslCoreTests
displayName: Publish Linux Musl Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- publish: '$(testsFolder)/netcoreapp3.1/osx-x64/publish'
artifact: MacCoreTests
displayName: Publish MacOS Test Package
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Build_Frontend
displayName: Frontend
dependsOn: Setup
jobs:
- job: Build
strategy:
matrix:
Linux:
osName: 'Linux'
imageName: 'ubuntu-18.04'
Mac:
osName: 'Mac'
imageName: 'macos-10.14'
Windows:
osName: 'Windows'
imageName: 'windows-2019'
pool:
vmImage: $(imageName)
steps:
- task: NodeTool@0
displayName: Set Node.js version
inputs:
versionSpec: '10.x'
- checkout: self
submodules: true
fetchDepth: 1
- task: Cache@2
inputs:
key: 'yarn | "$(osName)" | yarn.lock'
restoreKeys: |
yarn | "$(osName)"
yarn
path: $(yarnCacheFolder)
displayName: Cache Yarn packages
- bash: ./build.sh --frontend
displayName: Build Readarr Frontend
env:
FORCE_COLOR: 0
YARN_CACHE_FOLDER: $(yarnCacheFolder)
- publish: $(outputFolder)
artifact: '$(osName)Frontend'
displayName: Publish Frontend
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- stage: Installer
dependsOn:
- Build_Backend
- Build_Frontend
jobs:
- job: Windows_Installer
displayName: Create Installer
pool:
vmImage: 'windows-2019'
steps:
- checkout: self
fetchDepth: 1
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: WindowsBackend
targetPath: _output
displayName: Fetch Backend
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: WindowsFrontend
targetPath: _output
displayName: Fetch Frontend
- bash: ./build.sh --packages
displayName: Create Packages
- bash: |
setup/inno/ISCC.exe setup/readarr.iss //DFramework=netcoreapp3.1 //DRuntime=win-x86
cp setup/output/Readarr.*windows.netcoreapp3.1.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Readarr.${BUILDNAME}.windows-core-x86-installer.exe
displayName: Create .NET Core Windows installer
- bash: |
setup/inno/ISCC.exe setup/readarr.iss //DFramework=netcoreapp3.1 //DRuntime=win-x64
cp setup/output/Readarr.*windows.netcoreapp3.1.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Readarr.${BUILDNAME}.windows-core-x64-installer.exe
displayName: Create .NET Core Windows installer
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'WindowsInstaller'
displayName: Publish Installer
- stage: Packages
dependsOn:
- Build_Backend
- Build_Frontend
jobs:
- job: Other_Packages
displayName: Create Standard Packages
pool:
vmImage: 'ubuntu-18.04'
steps:
- checkout: self
fetchDepth: 1
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: WindowsBackend
targetPath: _output
displayName: Fetch Backend
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: WindowsFrontend
targetPath: _output
displayName: Fetch Frontend
- bash: ./build.sh --packages
displayName: Create Packages
- bash: |
find . -name "fpcalc" -exec chmod a+x {} \;
find . -name "Readarr" -exec chmod a+x {} \;
find . -name "Readarr.Update" -exec chmod a+x {} \;
displayName: Set executable bits
- task: ArchiveFiles@2
displayName: Create Windows Core zip
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).windows-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x64/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create Windows x86 Core zip
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).windows-core-x86.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/win-x86/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create MacOS Core app
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).osx-app-core-x64.zip'
archiveType: 'zip'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/macos-app/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create MacOS Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).osx-core-x64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/macos/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create Linux Mono tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/net462
- task: ArchiveFiles@2
displayName: Create Linux Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-x64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-x64/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create Linux Musl Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-musl-core-x64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create ARM32 Linux Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-arm.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create Linux Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-core-arm64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-arm64/netcoreapp3.1
- task: ArchiveFiles@2
displayName: Create ARM64 Linux Musl Core tar
inputs:
archiveFile: '$(Build.ArtifactStagingDirectory)/Readarr.$(buildName).linux-musl-core-arm64.tar.gz'
archiveType: 'tar'
tarCompression: 'gz'
includeRootFolder: false
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/netcoreapp3.1
- publish: $(Build.ArtifactStagingDirectory)
artifact: 'Packages'
displayName: Publish Packages
- bash: |
echo "Uploading source maps to sentry"
curl -sL https://sentry.io/get-cli/ | bash
RELEASENAME="${READARRVERSION}-${BUILD_SOURCEBRANCHNAME}"
sentry-cli releases new --finalize -p readarr -p readarr-ui -p readarr-update "${RELEASENAME}"
sentry-cli releases -p readarr-ui files "${RELEASENAME}" upload-sourcemaps _output/UI/ --rewrite
sentry-cli releases set-commits --auto "${RELEASENAME}"
if [[ ${BUILD_SOURCEBRANCH} == "refs/heads/develop" ]]; then
sentry-cli releases deploys "${RELEASENAME}" new -e nightly
else
sentry-cli releases deploys "${RELEASENAME}" new -e production
fi
displayName: Publish Sentry Source Maps
condition: |
or
(
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop')),
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
)
env:
SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr)
SENTRY_ORG: $(sentryOrg)
SENTRY_URL: $(sentryUrl)
- stage: Unit_Test
displayName: Unit Tests
dependsOn: Build_Backend
condition: succeeded()
jobs:
- job: Prepare
pool:
vmImage: 'ubuntu-18.04'
steps:
- checkout: none
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: 'not_backend_update'
targetPath: '.'
- bash: echo "##vso[task.setvariable variable=backendNotUpdated;isOutput=true]$(cat not_backend_update)"
name: setVar
- job: Unit
displayName: Unit Native
dependsOn: Prepare
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
strategy:
matrix:
MacCore:
osName: 'Mac'
testName: 'MacCore'
imageName: 'macos-10.14'
WindowsCore:
osName: 'Windows'
testName: 'WindowsCore'
imageName: 'windows-2019'
LinuxCore:
osName: 'Linux'
testName: 'LinuxCore'
imageName: 'ubuntu-18.04'
pattern: 'Readarr.**.linux-core-x64.tar.gz'
pool:
vmImage: $(imageName)
steps:
- checkout: none
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
version: $(dotnetVersion)
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: '$(testName)Tests'
targetPath: $(testsFolder)
- powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
- bash: |
wget https://github.com/acoustid/chromaprint/releases/download/v1.4.3/chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz
sudo tar xf chromaprint-fpcalc-1.4.3-linux-x86_64.tar.gz --strip-components=1 --directory /usr/bin
chmod a+x _tests/fpcalc
displayName: Install fpcalc
condition: and(succeeded(), eq(variables['osName'], 'Linux'))
- bash: |
SYMLINK=6_6_0
MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK
echo "##vso[task.setvariable variable=MONOPREFIX;]$MONOPREFIX"
echo "##vso[task.setvariable variable=PKG_CONFIG_PATH;]$MONOPREFIX/lib/pkgconfig:$MONOPREFIX/share/pkgconfig:$PKG_CONFIG_PATH"
echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH"
chmod a+x _tests/fpcalc
displayName: Set Mono Version and make fpcalc Executable
condition: and(succeeded(), eq(variables['osName'], 'Mac'))
- bash: find ${TESTSFOLDER} -name "Readarr.Test.Dummy" -exec chmod a+x {} \;
displayName: Make Test Dummy Executable
condition: and(succeeded(), ne(variables['osName'], 'Windows'))
- bash: |
chmod a+x ${TESTSFOLDER}/test.sh
${TESTSFOLDER}/test.sh ${OSNAME} Unit Test
displayName: Run Tests
env:
TEST_DIR: $(Build.SourcesDirectory)/_tests
- task: PublishTestResults@2
displayName: Publish Test Results
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Unit Tests'
failTaskOnFailedTests: true
- job: Unit_Docker
displayName: Unit Docker
dependsOn: Prepare
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
strategy:
matrix:
mono520:
testName: 'Mono 5.20'
artifactName: LinuxTests
containerImage: ghcr.io/servarr/testimages:mono-5.20
mono610:
testName: 'Mono 6.10'
artifactName: LinuxTests
containerImage: ghcr.io/servarr/testimages:mono-6.10
mono612:
testName: 'Mono 6.12'
artifactName: LinuxTests
containerImage: ghcr.io/servarr/testimages:mono-6.12
alpine:
testName: 'Musl Net Core'
artifactName: LinuxMuslCoreTests
containerImage: ghcr.io/servarr/testimages:alpine
pool:
vmImage: 'ubuntu-18.04'
container: $[ variables['containerImage'] ]
timeoutInMinutes: 10
steps:
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
version: $(dotnetVersion)
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: $(artifactName)
targetPath: $(testsFolder)
- bash: find ${TESTSFOLDER} -name "Readarr.Test.Dummy" -exec chmod a+x {} \;
displayName: Make Test Dummy Executable
condition: and(succeeded(), ne(variables['osName'], 'Windows'))
- bash: |
chmod a+x ${TESTSFOLDER}/test.sh
ls -lR ${TESTSFOLDER}
${TESTSFOLDER}/test.sh Linux Unit Test
displayName: Run Tests
- task: PublishTestResults@2
displayName: Publish Test Results
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Unit Tests'
failTaskOnFailedTests: true
- stage: Integration
displayName: Integration
dependsOn: Packages
jobs:
- job: Prepare
pool:
vmImage: 'ubuntu-18.04'
steps:
- checkout: none
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: 'not_backend_update'
targetPath: '.'
- bash: echo "##vso[task.setvariable variable=backendNotUpdated;isOutput=true]$(cat not_backend_update)"
name: setVar
- job: Integration_Native
displayName: Integration Native
dependsOn: Prepare
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
strategy:
matrix:
MacCore:
osName: 'Mac'
testName: 'MacCore'
imageName: 'macos-10.14'
pattern: 'Readarr.**.osx-core-x64.tar.gz'
WindowsCore:
osName: 'Windows'
testName: 'WindowsCore'
imageName: 'windows-2019'
pattern: 'Readarr.**.windows-core-x64.zip'
LinuxCore:
osName: 'Linux'
testName: 'LinuxCore'
imageName: 'ubuntu-18.04'
pattern: 'Readarr.**.linux-core-x64.tar.gz'
pool:
vmImage: $(imageName)
steps:
- bash: |
SYMLINK=6_6_0
MONOPREFIX=/Library/Frameworks/Mono.framework/Versions/$SYMLINK
echo "##vso[task.setvariable variable=MONOPREFIX;]$MONOPREFIX"
echo "##vso[task.setvariable variable=PKG_CONFIG_PATH;]$MONOPREFIX/lib/pkgconfig:$MONOPREFIX/share/pkgconfig:$PKG_CONFIG_PATH"
echo "##vso[task.setvariable variable=PATH;]$MONOPREFIX/bin:$PATH"
displayName: Set Mono Version
condition: and(succeeded(), eq(variables['osName'], 'Mac'))
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
version: $(dotnetVersion)
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: '$(testName)Tests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
inputs:
buildType: 'current'
artifactName: Packages
itemPattern: '**/$(pattern)'
targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package
- bash: |
mkdir -p ./bin/
cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Readarr/. ./bin/
displayName: Move Package Contents
- bash: |
chmod a+x ${TESTSFOLDER}/test.sh
${TESTSFOLDER}/test.sh ${OSNAME} Integration Test
displayName: Run Integration Tests
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Integration Tests'
failTaskOnFailedTests: true
displayName: Publish Test Results
- job: Integration_Docker
displayName: Integration Docker
dependsOn: Prepare
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
strategy:
matrix:
mono520:
testName: 'Mono 5.20'
artifactName: LinuxTests
containerImage: ghcr.io/servarr/testimages:mono-5.20
pattern: 'Readarr.**.linux.tar.gz'
mono610:
testName: 'Mono 6.10'
artifactName: LinuxTests
containerImage: ghcr.io/servarr/testimages:mono-6.10
pattern: 'Readarr.**.linux.tar.gz'
mono612:
testName: 'Mono 6.12'
artifactName: LinuxTests
containerImage: ghcr.io/servarr/testimages:mono-6.12
pattern: 'Readarr.**.linux.tar.gz'
alpine:
testName: 'Musl Net Core'
artifactName: LinuxMuslCoreTests
containerImage: ghcr.io/servarr/testimages:alpine
pattern: 'Readarr.**.linux-musl-core-x64.tar.gz'
pool:
vmImage: 'ubuntu-18.04'
container: $[ variables['containerImage'] ]
timeoutInMinutes: 15
steps:
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
version: $(dotnetVersion)
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: $(artifactName)
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
inputs:
buildType: 'current'
artifactName: Packages
itemPattern: '**/$(pattern)'
targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package
- bash: |
mkdir -p ./bin/
cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Readarr/. ./bin/
displayName: Move Package Contents
- bash: |
chmod a+x ${TESTSFOLDER}/test.sh
${TESTSFOLDER}/test.sh Linux Integration Test
displayName: Run Integration Tests
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(testName) Integration Tests'
failTaskOnFailedTests: true
displayName: Publish Test Results
- stage: Automation
displayName: Automation
dependsOn: Packages
jobs:
- job: Automation
strategy:
matrix:
Linux:
osName: 'Linux'
imageName: 'ubuntu-18.04'
pattern: 'Readarr.**.linux-core-x64.tar.gz'
Mac:
osName: 'Mac'
imageName: 'macos-10.14'
pattern: 'Readarr.**.osx-core-x64.tar.gz'
Windows:
osName: 'Windows'
imageName: 'windows-2019'
pattern: 'Readarr.**.windows-core-x64.zip'
pool:
vmImage: $(imageName)
steps:
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
version: $(dotnetVersion)
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download Test Artifact
inputs:
buildType: 'current'
artifactName: '$(osName)CoreTests'
targetPath: $(testsFolder)
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
inputs:
buildType: 'current'
artifactName: Packages
itemPattern: '**/$(pattern)'
targetPath: $(Build.ArtifactStagingDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
displayName: Extract Package
- bash: |
mkdir -p ./bin/
cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Readarr/. ./bin/
displayName: Move Package Contents
- bash: |
chmod a+x ${TESTSFOLDER}/test.sh
${TESTSFOLDER}/test.sh ${OSNAME} Automation Test
displayName: Run Automation Tests
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TestResult.xml'
testRunTitle: '$(osName) Automation Tests'
failTaskOnFailedTests: true
displayName: Publish Test Results
- stage: Analyze
dependsOn:
- Setup
displayName: Analyze
jobs:
- job: Prepare
pool:
vmImage: 'ubuntu-18.04'
steps:
- checkout: none
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'current'
artifactName: 'not_backend_update'
targetPath: '.'
- bash: echo "##vso[task.setvariable variable=backendNotUpdated;isOutput=true]$(cat not_backend_update)"
name: setVar
- job: Lint_Frontend
displayName: Lint Frontend
strategy:
matrix:
Linux:
osName: 'Linux'
imageName: 'ubuntu-18.04'
Windows:
osName: 'Windows'
imageName: 'windows-2019'
pool:
vmImage: $(imageName)
steps:
- task: NodeTool@0
displayName: Set Node.js version
inputs:
versionSpec: '10.x'
- checkout: self
submodules: true
fetchDepth: 1
- task: Cache@2
inputs:
key: 'yarn | "$(osName)" | yarn.lock'
restoreKeys: |
yarn | "$(osName)"
yarn
path: $(yarnCacheFolder)
displayName: Cache Yarn packages
- bash: ./build.sh --lint
displayName: Lint Readarr Frontend
env:
FORCE_COLOR: 0
YARN_CACHE_FOLDER: $(yarnCacheFolder)
- job: Analyze_Frontend
displayName: Frontend
condition: eq(variables['System.PullRequest.IsFork'], 'False')
pool:
vmImage: windows-2019
steps:
- checkout: self # Need history for Sonar analysis
- task: SonarCloudPrepare@1
env:
SONAR_SCANNER_OPTS: ''
inputs:
SonarCloud: 'SonarCloud'
organization: 'readarr'
scannerMode: 'CLI'
configMode: 'manual'
cliProjectKey: 'readarrui'
cliProjectName: 'ReadarrUI'
cliProjectVersion: '$(readarrVersion)'
cliSources: './frontend'
- task: SonarCloudAnalyze@1
- job: Analyze_Backend
displayName: Backend
dependsOn: Prepare
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
variables:
disable.coverage.autogenerate: 'true'
pool:
vmImage: windows-2019
steps:
- task: UseDotNet@2
displayName: 'Install .net core'
inputs:
version: $(dotnetVersion)
- checkout: self # Need history for Sonar analysis
submodules: true
- powershell: Set-Service SCardSvr -StartupType Manual
displayName: Enable Windows Test Service
- task: SonarCloudPrepare@1
condition: eq(variables['System.PullRequest.IsFork'], 'False')
inputs:
SonarCloud: 'SonarCloud'
organization: 'readarr'
scannerMode: 'MSBuild'
projectKey: 'Readarr_Readarr'
projectName: 'Readarr'
projectVersion: '$(readarrVersion)'
extraProperties: |
sonar.exclusions=**/obj/**,**/*.dll,**/NzbDrone.Core.Test/Files/**/*,./frontend/**,**/ExternalModules/**,./src/Libraries/**
sonar.coverage.exclusions=**/Readarr.Api.V1/**/*,**/MonoTorrent/**/*,**/Marr.Data/**/*
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
- bash: |
./build.sh --backend -f netcoreapp3.1 -r win-x64
TEST_DIR=_tests/netcoreapp3.1/win-x64/publish/ ./test.sh Windows Unit Coverage
displayName: Coverage Unit Tests
- task: SonarCloudAnalyze@1
condition: eq(variables['System.PullRequest.IsFork'], 'False')
displayName: Publish SonarCloud Results
- task: reportgenerator@4
displayName: Generate Coverage Report
inputs:
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
targetdir: '$(Build.SourcesDirectory)/CoverageResults/combined'
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
- task: PublishCodeCoverageResults@1
displayName: Publish Coverage Report
inputs:
codeCoverageTool: 'cobertura'
summaryFileLocation: './CoverageResults/combined/Cobertura.xml'
reportDirectory: './CoverageResults/combined/'
- stage: Report_Out
dependsOn:
- Analyze
- Unit_Test
- Integration
- Automation
condition: eq(variables['system.pullrequest.isfork'], false)
displayName: Build Status Report
jobs:
- job:
displayName: Discord Notification
pool:
vmImage: 'windows-2019'
steps:
- task: DownloadPipelineArtifact@2
continueOnError: true
displayName: Download Screenshot Artifact
inputs:
buildType: 'current'
artifactName: 'WindowsAutomationScreenshots'
targetPath: $(Build.SourcesDirectory)
- checkout: none
- powershell: |
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/Servarr/AzureDiscordNotify/master/DiscordNotify.ps1'))
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
DISCORDCHANNELID: $(discordChannelId)
DISCORDWEBHOOKKEY: $(discordWebhookKey)

View File

@@ -1 +0,0 @@
Write-Warning "DEPRECATED -- Please use build.sh instead."

485
build.sh
View File

@@ -1,265 +1,360 @@
#! /bin/bash
msBuild='/c/Program Files (x86)/MSBuild/14.0/Bin'
outputFolder='./_output'
outputFolderMono='./_output_mono'
outputFolderOsx='./_output_osx'
outputFolderOsxApp='./_output_osx_app'
testPackageFolder='./_tests/'
testSearchPattern='*.Test/bin/x86/Release'
sourceFolder='./src'
slnFile=$sourceFolder/NzbDrone.sln
updateFolder=$outputFolder/NzbDrone.Update
updateFolderMono=$outputFolderMono/NzbDrone.Update
set -e
nuget='tools/nuget/nuget.exe';
CheckExitCode()
outputFolder='_output'
testPackageFolder='_tests'
#Artifact variables
artifactsFolder="_artifacts";
ProgressStart()
{
"$@"
local status=$?
if [ $status -ne 0 ]; then
echo "error with $1" >&2
exit 1
echo "Start '$1'"
}
ProgressEnd()
{
echo "Finish '$1'"
}
UpdateVersionNumber()
{
if [ "$READARRVERSION" != "" ]; then
echo "Updating Version Info"
sed -i'' -e "s/<AssemblyVersion>[0-9.*]\+<\/AssemblyVersion>/<AssemblyVersion>$READARRVERSION<\/AssemblyVersion>/g" src/Directory.Build.props
sed -i'' -e "s/<AssemblyConfiguration>[\$()A-Za-z-]\+<\/AssemblyConfiguration>/<AssemblyConfiguration>${BUILD_SOURCEBRANCHNAME}<\/AssemblyConfiguration>/g" src/Directory.Build.props
sed -i'' -e "s/<string>10.0.0.0<\/string>/<string>$READARRVERSION<\/string>/g" macOS/Readarr.app/Contents/Info.plist
fi
return $status
}
CleanFolder()
LintUI()
{
local path=$1
local keepConfigFiles=$2
ProgressStart 'ESLint'
yarn lint
ProgressEnd 'ESLint'
find $path -name "*.transform" -exec rm "{}" \;
if [ $keepConfigFiles != true ] ; then
find $path -name "*.dll.config" -exec rm "{}" \;
ProgressStart 'Stylelint'
if [ "$os" = "windows" ]; then
yarn stylelint-windows
else
yarn stylelint-linux
fi
echo "Removing FluentValidation.Resources files"
find $path -name "FluentValidation.resources.dll" -exec rm "{}" \;
find $path -name "App.config" -exec rm "{}" \;
echo "Removing .less files"
find $path -name "*.less" -exec rm "{}" \;
echo "Removing vshost files"
find $path -name "*.vshost.exe" -exec rm "{}" \;
echo "Removing dylib files"
find $path -name "*.dylib" -exec rm "{}" \;
echo "Removing Empty folders"
find $path -depth -empty -type d -exec rm -r "{}" \;
}
AddJsonNet()
{
rm $outputFolder/Newtonsoft.Json.*
cp $sourceFolder/packages/Newtonsoft.Json.*/lib/net35/*.dll $outputFolder
cp $sourceFolder/packages/Newtonsoft.Json.*/lib/net35/*.dll $outputFolder/NzbDrone.Update
}
BuildWithMSBuild()
{
export PATH=$msBuild:$PATH
CheckExitCode MSBuild.exe $slnFile //t:Clean //m
$nuget restore $slnFile
CheckExitCode MSBuild.exe $slnFile //p:Configuration=Release //p:Platform=x86 //t:Build //m //p:AllowedReferenceRelatedFileExtensions=.pdb
}
BuildWithXbuild()
{
export MONO_IOMAP=case
CheckExitCode xbuild /t:Clean $slnFile
mono $nuget restore $slnFile
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
ProgressEnd 'Stylelint'
}
Build()
{
echo "##teamcity[progressStart 'Build']"
ProgressStart 'Build'
rm -rf $outputFolder
rm -rf $testPackageFolder
if [ $runtime = "dotnet" ] ; then
BuildWithMSBuild
slnFile=src/Readarr.sln
if [ $os = "windows" ]; then
platform=Windows
else
BuildWithXbuild
platform=Posix
fi
CleanFolder $outputFolder false
dotnet clean $slnFile -c Debug
dotnet clean $slnFile -c Release
AddJsonNet
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -t:PublishAllRids
else
dotnet msbuild -restore $slnFile -p:Configuration=Release -p:Platform=$platform -p:RuntimeIdentifiers=$RID -t:PublishAllRids
fi
echo "Removing Mono.Posix.dll"
rm $outputFolder/Mono.Posix.dll
ProgressEnd 'Build'
}
echo "##teamcity[progressFinish 'Build']"
YarnInstall()
{
ProgressStart 'yarn install'
yarn install --frozen-lockfile --network-timeout 120000
ProgressEnd 'yarn install'
}
RunGulp()
{
echo "##teamcity[progressStart 'npm install']"
npm-cache install npm || CheckExitCode npm install
echo "##teamcity[progressFinish 'npm install']"
echo "##teamcity[progressStart 'Running gulp']"
CheckExitCode npm run build
echo "##teamcity[progressFinish 'Running gulp']"
ProgressStart 'Running gulp'
yarn run build --production
ProgressEnd 'Running gulp'
}
CreateMdbs()
PackageFiles()
{
local path=$1
if [ $runtime = "dotnet" ] ; then
local pdbFiles=( $(find $path -name "*.pdb") )
for filename in "${pdbFiles[@]}"
do
if [ -e ${filename%.pdb}.dll ] ; then
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.dll
fi
if [ -e ${filename%.pdb}.exe ] ; then
tools/pdb2mdb/pdb2mdb.exe ${filename%.pdb}.exe
fi
done
fi
local folder="$1"
local framework="$2"
local runtime="$3"
rm -rf $folder
mkdir -p $folder
cp -r $outputFolder/$framework/$runtime/publish/* $folder
cp -r $outputFolder/Readarr.Update/$framework/$runtime/publish $folder/Readarr.Update
cp -r $outputFolder/UI $folder
echo "Adding LICENSE"
cp LICENSE.md $folder
}
PackageMono()
PackageLinux()
{
echo "##teamcity[progressStart 'Creating Mono Package']"
rm -rf $outputFolderMono
cp -r $outputFolder $outputFolderMono
local framework="$1"
local runtime="$2"
echo "Creating MDBs"
CreateMdbs $outputFolderMono
ProgressStart "Creating $runtime Package for $framework"
echo "Removing PDBs"
find $outputFolderMono -name "*.pdb" -exec rm "{}" \;
local folder=$artifactsFolder/$runtime/$framework/Readarr
PackageFiles "$folder" "$framework" "$runtime"
echo "Removing Service helpers"
rm -f $outputFolderMono/ServiceUninstall.*
rm -f $outputFolderMono/ServiceInstall.*
rm -f $folder/ServiceUninstall.*
rm -f $folder/ServiceInstall.*
echo "Removing native windows binaries Sqlite, MediaInfo"
rm -f $outputFolderMono/sqlite3.*
rm -f $outputFolderMono/MediaInfo.*
echo "Removing Readarr.Windows"
rm $folder/Readarr.Windows.*
echo "Adding NzbDrone.Core.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Core/NzbDrone.Core.dll.config $outputFolderMono
echo "Adding Readarr.Mono to UpdatePackage"
cp $folder/Readarr.Mono.* $folder/Readarr.Update
if [ "$framework" = "netcoreapp3.1" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Readarr.Update
cp $folder/libMonoPosixHelper.* $folder/Readarr.Update
fi
echo "Adding CurlSharp.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Common/CurlSharp.dll.config $outputFolderMono
echo "Renaming NzbDrone.Console.exe to NzbDrone.exe"
rm $outputFolderMono/NzbDrone.exe*
for file in $outputFolderMono/NzbDrone.Console.exe*; do
mv "$file" "${file//.Console/}"
done
echo "Removing NzbDrone.Windows"
rm $outputFolderMono/NzbDrone.Windows.*
echo "Adding NzbDrone.Mono to UpdatePackage"
cp $outputFolderMono/NzbDrone.Mono.* $updateFolderMono
echo "##teamcity[progressFinish 'Creating Mono Package']"
ProgressEnd "Creating $runtime Package for $framework"
}
PackageOsx()
PackageMacOS()
{
echo "##teamcity[progressStart 'Creating OS X Package']"
rm -rf $outputFolderOsx
cp -r $outputFolderMono $outputFolderOsx
local framework="$1"
ProgressStart "Creating MacOS Package for $framework"
echo "Adding sqlite dylibs"
cp $sourceFolder/Libraries/Sqlite/*.dylib $outputFolderOsx
local folder=$artifactsFolder/macos/$framework/Readarr
echo "Adding MediaInfo dylib"
cp $sourceFolder/Libraries/MediaInfo/*.dylib $outputFolderOsx
PackageFiles "$folder" "$framework" "osx-x64"
echo "Adding Startup script"
cp ./osx/Sonarr $outputFolderOsx
if [ "$framework" = "net462" ]; then
echo "Adding Startup script"
cp macOS/Readarr $folder
fi
echo "##teamcity[progressFinish 'Creating OS X Package']"
echo "Removing Service helpers"
rm -f $folder/ServiceUninstall.*
rm -f $folder/ServiceInstall.*
echo "Removing Readarr.Windows"
rm $folder/Readarr.Windows.*
echo "Adding Readarr.Mono to UpdatePackage"
cp $folder/Readarr.Mono.* $folder/Readarr.Update
if [ "$framework" = "netcoreapp3.1" ]; then
cp $folder/Mono.Posix.NETStandard.* $folder/Readarr.Update
cp $folder/libMonoPosixHelper.* $folder/Readarr.Update
fi
ProgressEnd 'Creating MacOS Package'
}
PackageOsxApp()
PackageMacOSApp()
{
echo "##teamcity[progressStart 'Creating OS X App Package']"
rm -rf $outputFolderOsxApp
mkdir $outputFolderOsxApp
local framework="$1"
ProgressStart "Creating macOS App Package for $framework"
cp -r ./osx/Sonarr.app $outputFolderOsxApp
cp -r $outputFolderOsx $outputFolderOsxApp/Sonarr.app/Contents/MacOS
local folder=$artifactsFolder/macos-app/$framework
echo "##teamcity[progressFinish 'Creating OS X App Package']"
rm -rf $folder
mkdir -p $folder
cp -r macOS/Readarr.app $folder
mkdir -p $folder/Readarr.app/Contents/MacOS
echo "Copying Binaries"
cp -r $artifactsFolder/macos/$framework/Readarr/* $folder/Readarr.app/Contents/MacOS
echo "Removing Update Folder"
rm -r $folder/Readarr.app/Contents/MacOS/Readarr.Update
ProgressEnd 'Creating macOS App Package'
}
PackageWindows()
{
local framework="$1"
local runtime="$2"
ProgressStart "Creating Windows Package for $framework"
local folder=$artifactsFolder/$runtime/$framework/Readarr
PackageFiles "$folder" "$framework" "$runtime"
echo "Removing Readarr.Mono"
rm -f $folder/Readarr.Mono.*
rm -f $folder/Mono.Posix.NETStandard.*
rm -f $folder/libMonoPosixHelper.*
echo "Adding Readarr.Windows to UpdatePackage"
cp $folder/Readarr.Windows.* $folder/Readarr.Update
ProgressEnd 'Creating Windows Package'
}
Package()
{
local framework="$1"
local runtime="$2"
local SPLIT
IFS='-' read -ra SPLIT <<< "$runtime"
case "${SPLIT[0]}" in
linux)
PackageLinux "$framework" "$runtime"
;;
win)
PackageWindows "$framework" "$runtime"
;;
osx)
PackageMacOS "$framework"
PackageMacOSApp "$framework"
;;
esac
}
PackageTests()
{
echo "Packaging Tests"
echo "##teamcity[progressStart 'Creating Test Package']"
rm -rf $testPackageFolder
mkdir $testPackageFolder
local framework="$1"
local runtime="$2"
find $sourceFolder -path $testSearchPattern -exec cp -r -u -T "{}" $testPackageFolder \;
cp test.sh "$testPackageFolder/$framework/$runtime/publish"
if [ $runtime = "dotnet" ] ; then
$nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
else
mono $nuget install NUnit.ConsoleRunner -Version 3.2.0 -Output $testPackageFolder
fi
rm -f $testPackageFolder/$framework/$runtime/*.log.config
cp $outputFolder/*.dll $testPackageFolder
cp ./*.sh $testPackageFolder
echo "Creating MDBs for tests"
CreateMdbs $testPackageFolder
rm -f $testPackageFolder/*.log.config
CleanFolder $testPackageFolder true
echo "Adding NzbDrone.Core.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Core/NzbDrone.Core.dll.config $testPackageFolder
echo "Adding CurlSharp.dll.config (for dllmap)"
cp $sourceFolder/NzbDrone.Common/CurlSharp.dll.config $testPackageFolder
echo "Copying CurlSharp libraries"
cp $sourceFolder/ExternalModules/CurlSharp/libs/i386/* $testPackageFolder
echo "##teamcity[progressFinish 'Creating Test Package']"
}
CleanupWindowsPackage()
{
echo "Removing NzbDrone.Mono"
rm -f $outputFolder/NzbDrone.Mono.*
echo "Adding NzbDrone.Windows to UpdatePackage"
cp $outputFolder/NzbDrone.Windows.* $updateFolder
ProgressEnd 'Creating Test Package'
}
# Use mono or .net depending on OS
case "$(uname -s)" in
CYGWIN*|MINGW32*|MINGW64*|MSYS*)
# on windows, use dotnet
runtime="dotnet"
os="windows"
;;
*)
# otherwise use mono
runtime="mono"
os="posix"
;;
esac
Build
RunGulp
PackageMono
PackageOsx
PackageOsxApp
PackageTests
CleanupWindowsPackage
POSITIONAL=()
if [ $# -eq 0 ]; then
echo "No arguments provided, building everything"
BACKEND=YES
FRONTEND=YES
PACKAGES=YES
LINT=YES
fi
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--backend)
BACKEND=YES
shift # past argument
;;
-r|--runtime)
RID="$2"
shift # past argument
shift # past value
;;
-f|--framework)
FRAMEWORK="$2"
shift # past argument
shift # past value
;;
--frontend)
FRONTEND=YES
shift # past argument
;;
--packages)
PACKAGES=YES
shift # past argument
;;
--lint)
LINT=YES
shift # past argument
;;
--all)
BACKEND=YES
FRONTEND=YES
PACKAGES=YES
LINT=YES
shift # past argument
;;
*) # unknown option
POSITIONAL+=("$1") # save it in an array for later
shift # past argument
;;
esac
done
set -- "${POSITIONAL[@]}" # restore positional parameters
if [ "$BACKEND" = "YES" ];
then
UpdateVersionNumber
Build
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
PackageTests "netcoreapp3.1" "win-x64"
PackageTests "netcoreapp3.1" "win-x86"
PackageTests "netcoreapp3.1" "linux-x64"
PackageTests "netcoreapp3.1" "linux-musl-x64"
PackageTests "netcoreapp3.1" "osx-x64"
PackageTests "net462" "linux-x64"
else
PackageTests "$FRAMEWORK" "$RID"
fi
fi
if [ "$FRONTEND" = "YES" ];
then
YarnInstall
RunGulp
fi
if [ "$LINT" = "YES" ];
then
if [ -z "$FRONTEND" ];
then
YarnInstall
fi
LintUI
fi
if [ "$PACKAGES" = "YES" ];
then
UpdateVersionNumber
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
then
Package "netcoreapp3.1" "win-x64"
Package "netcoreapp3.1" "win-x86"
Package "netcoreapp3.1" "linux-x64"
Package "netcoreapp3.1" "linux-musl-x64"
Package "netcoreapp3.1" "linux-arm64"
Package "netcoreapp3.1" "linux-musl-arm64"
Package "netcoreapp3.1" "linux-arm"
Package "netcoreapp3.1" "osx-x64"
Package "net462" "linux-x64"
else
Package "$FRAMEWORK" "$RID"
fi
fi

8
debian/control vendored
View File

@@ -2,11 +2,11 @@ Section: web
Priority: optional
Maintainer: Sonarr <contact@nzbdrone.com>
Source: nzbdrone
Homepage: https://sonarr.tv
Vcs-Git: git@github.com:Sonarr/Sonarr.git
Vcs-Browser: https://github.com/Sonarr/Sonarr
Homepage: https://readarr.com
Vcs-Git: git@github.com:readarr/Readarr.git
Vcs-Browser: https://github.com/readarr/Readarr
Package: nzbdrone
Architecture: all
Depends: libmono-cil-dev (>= 3.2), sqlite3 (>= 3.7), mediainfo (>= 0.7.52)
Description: Sonarr is an internet PVR
Description: Readarr is a music collection manager

48
debian/copyright vendored
View File

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

2
debian/install vendored
View File

@@ -1 +1 @@
nzbdrone_bin/* opt/NzbDrone
nzbdrone_bin/* opt/NzbDrone

25
frontend/.csscomb.json Normal file
View File

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

335
frontend/.esformatter Normal file
View File

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

1
frontend/.eslintignore Normal file
View File

@@ -0,0 +1 @@
**/JsLibraries/**

327
frontend/.eslintrc.js Normal file
View File

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

12
frontend/.jsbeautifyrc Normal file
View File

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

396
frontend/.stylelintrc Normal file
View File

@@ -0,0 +1,396 @@
{
"plugins": [
"stylelint-order"
],
"ignoreFiles": [
"frontend/src/Styles/scaffolding.css",
"**/*.js"
],
"rules": {
"at-rule-empty-line-before": [
"always",
{
"except": [
"inside-block"
]
}
],
"at-rule-name-case": "lower",
"at-rule-name-newline-after": "always-multi-line",
"at-rule-name-space-after": "always",
"at-rule-no-unknown": [
true,
{
"ignoreAtRules": [
"/^add\\-mixin$/",
"/^define\\-mixin$/"
]
}
],
"at-rule-no-vendor-prefix": true,
"at-rule-semicolon-newline-after": "always",
"at-rule-semicolon-space-before": "never",
"block-closing-brace-empty-line-before": "never",
"block-closing-brace-newline-after": "always",
"block-closing-brace-newline-before": "always",
"block-closing-brace-space-after": "always-single-line",
"block-closing-brace-space-before": "always-single-line",
"block-no-empty": true,
"block-opening-brace-newline-after": "always",
"block-opening-brace-newline-before": "never-single-line",
"block-opening-brace-space-after": "always-single-line",
"block-opening-brace-space-before": "always",
"color-hex-case": "lower",
"color-hex-length": "short",
"color-named": "never",
"color-no-invalid-hex": true,
"comment-whitespace-inside": "always",
"declaration-bang-space-after": "never",
"declaration-bang-space-before": "always",
"declaration-block-no-duplicate-properties": [
true,
{
"ignoreProperties": [
"composes"
]
}
],
"declaration-block-no-redundant-longhand-properties": true,
"declaration-block-no-shorthand-property-overrides": true,
"declaration-block-semicolon-newline-after": "always",
"declaration-block-semicolon-newline-before": "never-multi-line",
"declaration-block-semicolon-space-before": "never",
"declaration-block-single-line-max-declarations": 1,
"declaration-block-trailing-semicolon": "always",
"declaration-colon-space-after": "always",
"declaration-colon-space-before": "never",
"font-family-name-quotes": "always-unless-keyword",
"function-calc-no-unspaced-operator": true,
"function-comma-newline-after": "never-multi-line",
"function-comma-newline-before": "never-multi-line",
"function-comma-space-after": "always",
"function-comma-space-before": "never",
"function-linear-gradient-no-nonstandard-direction": true,
"function-name-case": "lower",
"function-parentheses-newline-inside": "never-multi-line",
"function-parentheses-space-inside": "never",
"function-url-quotes": "always",
"function-url-scheme-disallowed-list": [
"data"
],
"function-whitespace-after": "always",
"indentation": 2,
"keyframe-declaration-no-important": true,
"length-zero-no-unit": true,
"max-empty-lines": 1,
"max-line-length": [
100,
{
"ignore": [
"non-comments"
]
}
],
"max-nesting-depth": 2,
"media-feature-colon-space-after": "always",
"media-feature-colon-space-before": "never",
"media-feature-name-case": "lower",
"media-feature-name-no-vendor-prefix": true,
"media-feature-range-operator-space-after": "always",
"media-feature-range-operator-space-before": "always",
"no-empty-source": true,
"no-eol-whitespace": true,
"no-extra-semicolons": true,
"no-invalid-double-slash-comments": true,
"no-missing-end-of-source-newline": true,
"number-leading-zero": "always",
"number-no-trailing-zeros": true,
"order/order": [
"custom-properties",
"dollar-variables",
{
"hasBlock": false,
"name": "add-mixin",
"type": "at-rule"
},
"declarations",
"rules",
"at-rules"
],
"order/properties-order": [
{
"emptyLineBefore": "always",
"properties": [
"composes"
]
},
{
"emptyLineBefore": "always",
"properties": [
"position",
"top",
"right",
"bottom",
"left",
"z-index",
"display",
"visibility",
"align-content",
"align-items",
"align-self",
"justify-content",
"flex",
"flex-direction",
"flex-order",
"flex-pack",
"flex-align",
"flex-grow",
"flex-shrink",
"flex-basis",
"flex-wrap",
"flex-flow",
"float",
"clear",
"overflow",
"overflow-x",
"overflow-y",
"-webkit-overflow-scrolling",
"clip",
"box-sizing",
"margin",
"margin-top",
"margin-right",
"margin-bottom",
"margin-left",
"padding",
"padding-top",
"padding-right",
"padding-bottom",
"padding-left",
"min-width",
"min-height",
"max-width",
"max-height",
"width",
"height",
"outline",
"outline-width",
"outline-style",
"outline-color",
"outline-offset",
"border",
"border-spacing",
"border-collapse",
"border-width",
"border-style",
"border-color",
"border-top",
"border-top-width",
"border-top-style",
"border-top-color",
"border-right",
"border-right-width",
"border-right-style",
"border-right-color",
"border-bottom",
"border-bottom-width",
"border-bottom-style",
"border-bottom-color",
"border-left",
"border-left-width",
"border-left-style",
"border-left-color",
"border-radius",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-right-radius",
"border-bottom-left-radius",
"border-image",
"border-image-source",
"border-image-slice",
"border-image-width",
"border-image-outset",
"border-image-repeat",
"border-top-image",
"border-right-image",
"border-bottom-image",
"border-left-image",
"border-corner-image",
"border-top-left-image",
"border-top-right-image",
"border-bottom-right-image",
"border-bottom-left-image",
"background",
"background-color",
"background-image",
"background-attachment",
"background-position",
"background-position-x",
"background-position-y",
"background-clip",
"background-origin",
"background-size",
"background-repeat",
"box-decoration-break",
"box-shadow",
"color",
"table-layout",
"caption-side",
"empty-cells",
"list-style",
"list-style-position",
"list-style-type",
"list-style-image",
"quotes",
"content",
"counter-increment",
"counter-reset",
"-ms-writing-mode",
"vertical-align",
"text-align",
"text-align-last",
"text-decoration",
"text-emphasis",
"text-emphasis-position",
"text-emphasis-style",
"text-emphasis-color",
"text-indent",
"text-justify",
"text-outline",
"text-transform",
"text-wrap",
"text-overflow",
"text-overflow-ellipsis",
"text-overflow-mode",
"text-shadow",
"white-space",
"word-spacing",
"word-wrap",
"word-break",
"tab-size",
"hyphens",
"letter-spacing",
"font",
"font-weight",
"font-style",
"font-variant",
"font-size-adjust",
"font-stretch",
"font-size",
"font-family",
"font-smoothing",
"-moz-osx-font-smoothing",
"-webkit-font-smoothing",
"src",
"line-height",
"opacity",
"filter",
"resize",
"cursor",
"appearance",
"nav-index",
"nav-up",
"nav-right",
"nav-down",
"nav-left",
"transition",
"transition-delay",
"transition-timing-function",
"transition-duration",
"transition-property",
"transform",
"transform-origin",
"transform-style",
"backface-visibility",
"animation",
"animation-name",
"animation-duration",
"animation-play-state",
"animation-timing-function",
"animation-delay",
"animation-iteration-count",
"animation-direction",
"animation-fill-mode",
"pointer-events",
"user-select",
"touch-action",
"-webkit-tap-highlight-color",
"unicode-bidi",
"direction",
"columns",
"column-span",
"column-width",
"column-count",
"column-fill",
"column-gap",
"column-rule",
"column-rule-width",
"column-rule-style",
"column-rule-color",
"break-before",
"break-inside",
"break-after",
"page-break-before",
"page-break-inside",
"page-break-after",
"orphans",
"widows",
"zoom",
"max-zoom",
"min-zoom",
"user-zoom",
"orientation"
]
}
],
"property-case": "lower",
"property-no-vendor-prefix": true,
"rule-empty-line-before": [
"always",
{
"except": [
"first-nested"
],
"ignore": [
"after-comment"
]
}
],
"selector-attribute-brackets-space-inside": "never",
"selector-attribute-operator-space-after": "never",
"selector-attribute-operator-space-before": "never",
"selector-attribute-quotes": "never",
"selector-class-pattern": "^[A-Za-z0-9]+$",
"selector-combinator-space-after": "always",
"selector-combinator-space-before": "always",
"selector-descendant-combinator-no-non-space": true,
"selector-list-comma-newline-after": "always",
"selector-list-comma-newline-before": "never-multi-line",
"selector-list-comma-space-before": "never",
"selector-max-attribute": 0,
"selector-max-class": 3,
"selector-max-compound-selectors": 3,
"selector-max-empty-lines": 0,
"selector-max-id": 0,
"selector-max-universal": 0,
"selector-pseudo-class-case": "lower",
"selector-pseudo-class-parentheses-space-inside": "never",
"selector-pseudo-element-case": "lower",
"selector-pseudo-element-colon-notation": "double",
"selector-pseudo-element-no-unknown": true,
"selector-type-case": "lower",
"selector-type-no-unknown": true,
"shorthand-property-no-redundant-values": true,
"string-no-newline": true,
"string-quotes": "single",
"time-min-milliseconds": 100,
"unit-case": "lower",
"unit-no-unknown": true,
"value-list-comma-newline-after": "never-multi-line",
"value-list-comma-newline-before": "never-multi-line",
"value-list-comma-space-after": "always",
"value-list-comma-space-before": "never",
"value-list-max-empty-lines": 0,
"value-no-vendor-prefix": true
}
}

7
frontend/.tern-project Normal file
View File

@@ -0,0 +1,7 @@
{
"ecmaVersion": 6,
"libs": [
"browser",
"jquery"
]
}

35
frontend/babel.config.js Normal file
View File

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

18
frontend/gulp/build.js Normal file
View File

@@ -0,0 +1,18 @@
const gulp = require('gulp');
require('./clean');
require('./copy');
require('./webpack');
gulp.task('build',
gulp.series('clean',
gulp.parallel(
'webpack',
'copyHtml',
'copyFonts',
'copyImages',
'copyRobots'
)
)
);

8
frontend/gulp/clean.js Normal file
View File

@@ -0,0 +1,8 @@
const gulp = require('gulp');
const del = require('del');
const paths = require('./helpers/paths');
gulp.task('clean', () => {
return del([paths.dest.root]);
});

42
frontend/gulp/copy.js Normal file
View File

@@ -0,0 +1,42 @@
const path = require('path');
const gulp = require('gulp');
const print = require('gulp-print').default;
const cache = require('gulp-cached');
const livereload = require('gulp-livereload');
const paths = require('./helpers/paths.js');
gulp.task('copyHtml', () => {
return gulp.src(paths.src.html, { base: paths.src.root })
.pipe(cache('copyHtml'))
.pipe(print())
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload());
});
gulp.task('copyFonts', () => {
return gulp.src(
path.join(paths.src.fonts, '**', '*.*'), { base: paths.src.root }
)
.pipe(cache('copyFonts'))
.pipe(print())
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload());
});
gulp.task('copyImages', () => {
return gulp.src(
path.join(paths.src.images, '**', '*.*'), { base: paths.src.root }
)
.pipe(cache('copyImages'))
.pipe(print())
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload());
});
gulp.task('copyRobots', () => {
return gulp.src(paths.src.robots, { base: paths.src.root })
.pipe(cache('copyRobots'))
.pipe(print())
.pipe(gulp.dest(paths.dest.root))
.pipe(livereload());
});

View File

@@ -0,0 +1,5 @@
require('./build.js');
require('./clean.js');
require('./copy.js');
require('./watch.js');
require('./webpack.js');

View File

@@ -0,0 +1,6 @@
const colors = require('ansi-colors');
module.exports = function errorHandler(error) {
console.log(colors.red(`Error (${error.plugin}): ${error.message}`));
this.emit('end');
};

View File

@@ -0,0 +1,24 @@
const root = './frontend/src';
const paths = {
src: {
root,
html: `${root}/*.html`,
scripts: `${root}/**/*.js`,
content: `${root}/Content/`,
fonts: `${root}/Content/Fonts/`,
images: `${root}/Content/Images/`,
robots: `${root}/Content/robots.txt`,
exclude: {
libs: `!${root}/JsLibraries/**`
}
},
dest: {
root: './_output/UI/',
content: './_output/UI/Content/',
fonts: './_output/UI/Content/Fonts/',
images: './_output/UI/Content/Images/'
}
};
module.exports = paths;

19
frontend/gulp/watch.js Normal file
View File

@@ -0,0 +1,19 @@
const gulp = require('gulp');
const livereload = require('gulp-livereload');
const gulpWatch = require('gulp-watch');
const paths = require('./helpers/paths.js');
require('./copy.js');
require('./webpack.js');
function watch() {
livereload.listen({ start: true });
gulp.task('webpackWatch')();
gulpWatch(paths.src.html, gulp.series('copyHtml'));
gulpWatch(`${paths.src.fonts}**/*.*`, gulp.series('copyFonts'));
gulpWatch(`${paths.src.images}**/*.*`, gulp.series('copyImages'));
gulpWatch(paths.src.robots, gulp.series('copyRobots'));
}
gulp.task('watch', gulp.series('build', watch));

271
frontend/gulp/webpack.js Normal file
View File

@@ -0,0 +1,271 @@
const gulp = require('gulp');
const webpackStream = require('webpack-stream');
const livereload = require('gulp-livereload');
const path = require('path');
const webpack = require('webpack');
const errorHandler = require('./helpers/errorHandler');
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const HtmlWebpackPluginHtmlTags = require('html-webpack-plugin/lib/html-tags');
const TerserPlugin = require('terser-webpack-plugin');
const uiFolder = 'UI';
const frontendFolder = path.join(__dirname, '..');
const srcFolder = path.join(frontendFolder, 'src');
const isProduction = process.argv.indexOf('--production') > -1;
const isProfiling = isProduction && process.argv.indexOf('--profile') > -1;
const inlineWebWorkers = 'no-fallback';
const distFolder = path.resolve(frontendFolder, '..', '_output', uiFolder);
console.log('Source Folder:', srcFolder);
console.log('Output Folder:', distFolder);
console.log('isProduction:', isProduction);
console.log('isProfiling:', isProfiling);
const cssVarsFiles = [
'../src/Styles/Variables/colors',
'../src/Styles/Variables/dimensions',
'../src/Styles/Variables/fonts',
'../src/Styles/Variables/animations',
'../src/Styles/Variables/zIndexes'
].map(require.resolve);
// Override the way HtmlWebpackPlugin injects the scripts
// TODO: Find a better way to get these paths without
HtmlWebpackPlugin.prototype.injectAssetsIntoHtml = function(html, assets, assetTags) {
const head = assetTags.headTags.map((v) => {
const href = v.attributes.href
.replace('\\', '/')
.replace('%5C', '/');
v.attributes = { rel: 'stylesheet', type: 'text/css', href: `/${href}` };
return HtmlWebpackPluginHtmlTags.htmlTagObjectToString(v, this.options.xhtml);
});
const body = assetTags.bodyTags.map((v) => {
v.attributes = { src: `/${v.attributes.src}` };
return HtmlWebpackPluginHtmlTags.htmlTagObjectToString(v, this.options.xhtml);
});
return html
.replace('<!-- webpack bundles head -->', head.join('\r\n '))
.replace('<!-- webpack bundles body -->', body.join('\r\n '));
};
const plugins = [
new OptimizeCssAssetsPlugin({}),
new webpack.DefinePlugin({
__DEV__: !isProduction,
'process.env.NODE_ENV': isProduction ? JSON.stringify('production') : JSON.stringify('development')
}),
new MiniCssExtractPlugin({
filename: path.join('Content', 'styles.css')
}),
new HtmlWebpackPlugin({
template: 'frontend/src/index.html',
filename: 'index.html'
})
];
const config = {
mode: isProduction ? 'production' : 'development',
devtool: '#source-map',
stats: {
children: false
},
watchOptions: {
ignored: /node_modules/
},
entry: {
index: 'index.js'
},
resolve: {
modules: [
srcFolder,
path.join(srcFolder, 'Shims'),
'node_modules'
],
alias: {
jquery: 'jquery/src/jquery'
}
},
output: {
path: distFolder,
filename: '[name].js',
sourceMapFilename: '[file].map'
},
optimization: {
chunkIds: 'named',
splitChunks: {
chunks: 'initial'
}
},
performance: {
hints: false
},
plugins,
resolveLoader: {
modules: [
'node_modules',
'frontend/gulp/webpack/'
]
},
module: {
rules: [
{
test: /\.worker\.js$/,
use: {
loader: 'worker-loader',
options: {
filename: '[name].js',
inline: inlineWebWorkers
}
}
},
{
test: /\.js?$/,
exclude: /(node_modules|JsLibraries)/,
use: [
{
loader: 'babel-loader',
options: {
configFile: `${frontendFolder}/babel.config.js`,
envName: isProduction ? 'production' : 'development',
presets: [
[
'@babel/preset-env',
{
modules: false,
loose: true,
debug: false,
useBuiltIns: 'entry',
corejs: 3
}
]
]
}
}
]
},
// CSS Modules
{
test: /\.css$/,
exclude: /(node_modules|globals.css)/,
use: [
{ loader: MiniCssExtractPlugin.loader },
{
loader: 'css-loader',
options: {
importLoaders: 1,
modules: {
localIdentName: '[name]/[local]/[hash:base64:5]'
}
}
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
config: {
ctx: {
cssVarsFiles
},
path: 'frontend/postcss.config.js'
}
}
}
]
},
// Global styles
{
test: /\.css$/,
include: /(node_modules|globals.css)/,
use: [
'style-loader',
{
loader: 'css-loader'
}
]
},
// Fonts
{
test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
use: [
{
loader: 'url-loader',
options: {
limit: 10240,
mimetype: 'application/font-woff',
emitFile: false,
name: 'Content/Fonts/[name].[ext]'
}
}
]
},
{
test: /\.(ttf|eot|eot?#iefix|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
use: [
{
loader: 'file-loader',
options: {
emitFile: false,
name: 'Content/Fonts/[name].[ext]'
}
}
]
}
]
}
};
if (isProfiling) {
config.resolve.alias['react-dom$'] = 'react-dom/profiling';
config.resolve.alias['scheduler/tracing'] = 'scheduler/tracing-profiling';
config.optimization.minimizer = [
new TerserPlugin({
cache: true,
parallel: true,
sourceMap: true, // Must be set to true if using source-maps in production
terserOptions: {
mangle: false,
keep_classnames: true,
keep_fnames: true
}
})
];
}
gulp.task('webpack', () => {
return webpackStream(config)
.pipe(gulp.dest('_output/UI'));
});
gulp.task('webpackWatch', () => {
config.watch = true;
return webpackStream(config, webpack)
.on('error', errorHandler)
.pipe(gulp.dest('_output/UI'))
.on('error', errorHandler)
.pipe(livereload())
.on('error', errorHandler);
});

View File

@@ -0,0 +1,11 @@
const loaderUtils = require('loader-utils');
module.exports = function cssVariablesLoader(source) {
const options = loaderUtils.getOptions(this);
options.cssVarsFiles.forEach((cssVarsFile) => {
this.addDependency(cssVarsFile);
});
return source;
};

20
frontend/jsconfig.json Normal file
View File

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

View File

@@ -0,0 +1,23 @@
const reload = require('require-nocache')(module);
module.exports = (ctx, configPath, options) => {
const config = {
plugins: {
'postcss-mixins': {
mixinsDir: [
'frontend/src/Styles/Mixins'
]
},
'postcss-simple-vars': {
variables: () =>
ctx.options.cssVarsFiles.reduce((acc, vars) => {
return Object.assign(acc, reload(vars));
}, {})
},
'postcss-color-function': {},
'postcss-nested': {}
}
};
return config;
};

4
frontend/src/.vscode/settings.json vendored Normal file
View File

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

View File

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

View File

@@ -0,0 +1,155 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import * as commandNames from 'Commands/commandNames';
import withCurrentPage from 'Components/withCurrentPage';
import * as blacklistActions from 'Store/Actions/blacklistActions';
import { executeCommand } from 'Store/Actions/commandActions';
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
import Blacklist from './Blacklist';
function createMapStateToProps() {
return createSelector(
(state) => state.blacklist,
(state) => state.authors,
createCommandExecutingSelector(commandNames.CLEAR_BLACKLIST),
(blacklist, authors, isClearingBlacklistExecuting) => {
return {
isAuthorFetching: authors.isFetching,
isAuthorPopulated: authors.isPopulated,
isClearingBlacklistExecuting,
...blacklist
};
}
);
}
const mapDispatchToProps = {
...blacklistActions,
executeCommand
};
class BlacklistConnector extends Component {
//
// Lifecycle
componentDidMount() {
const {
useCurrentPage,
fetchBlacklist,
gotoBlacklistFirstPage
} = this.props;
registerPagePopulator(this.repopulate);
if (useCurrentPage) {
fetchBlacklist();
} else {
gotoBlacklistFirstPage();
}
}
componentDidUpdate(prevProps) {
if (prevProps.isClearingBlacklistExecuting && !this.props.isClearingBlacklistExecuting) {
this.props.gotoBlacklistFirstPage();
}
}
componentWillUnmount() {
this.props.clearBlacklist();
unregisterPagePopulator(this.repopulate);
}
//
// Control
repopulate = () => {
this.props.fetchBlacklist();
}
//
// Listeners
onFirstPagePress = () => {
this.props.gotoBlacklistFirstPage();
}
onPreviousPagePress = () => {
this.props.gotoBlacklistPreviousPage();
}
onNextPagePress = () => {
this.props.gotoBlacklistNextPage();
}
onLastPagePress = () => {
this.props.gotoBlacklistLastPage();
}
onPageSelect = (page) => {
this.props.gotoBlacklistPage({ page });
}
onRemoveSelected = (ids) => {
this.props.removeBlacklistItems({ ids });
}
onSortPress = (sortKey) => {
this.props.setBlacklistSort({ sortKey });
}
onTableOptionChange = (payload) => {
this.props.setBlacklistTableOption(payload);
if (payload.pageSize) {
this.props.gotoBlacklistFirstPage();
}
}
onClearBlacklistPress = () => {
this.props.executeCommand({ name: commandNames.CLEAR_BLACKLIST });
}
//
// Render
render() {
return (
<Blacklist
onFirstPagePress={this.onFirstPagePress}
onPreviousPagePress={this.onPreviousPagePress}
onNextPagePress={this.onNextPagePress}
onLastPagePress={this.onLastPagePress}
onPageSelect={this.onPageSelect}
onRemoveSelected={this.onRemoveSelected}
onSortPress={this.onSortPress}
onTableOptionChange={this.onTableOptionChange}
onClearBlacklistPress={this.onClearBlacklistPress}
{...this.props}
/>
);
}
}
BlacklistConnector.propTypes = {
useCurrentPage: PropTypes.bool.isRequired,
isClearingBlacklistExecuting: PropTypes.bool.isRequired,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
fetchBlacklist: PropTypes.func.isRequired,
gotoBlacklistFirstPage: PropTypes.func.isRequired,
gotoBlacklistPreviousPage: PropTypes.func.isRequired,
gotoBlacklistNextPage: PropTypes.func.isRequired,
gotoBlacklistLastPage: PropTypes.func.isRequired,
gotoBlacklistPage: PropTypes.func.isRequired,
removeBlacklistItems: PropTypes.func.isRequired,
setBlacklistSort: PropTypes.func.isRequired,
setBlacklistTableOption: PropTypes.func.isRequired,
clearBlacklist: PropTypes.func.isRequired,
executeCommand: PropTypes.func.isRequired
};
export default withCurrentPage(
connect(createMapStateToProps, mapDispatchToProps)(BlacklistConnector)
);

View File

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

View File

@@ -0,0 +1,17 @@
.quality {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 100px;
}
.indexer {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 80px;
}
.actions {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 70px;
}

View File

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

View File

@@ -0,0 +1,26 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { removeBlacklistItem } from 'Store/Actions/blacklistActions';
import createAuthorSelector from 'Store/Selectors/createAuthorSelector';
import BlacklistRow from './BlacklistRow';
function createMapStateToProps() {
return createSelector(
createAuthorSelector(),
(author) => {
return {
author
};
}
);
}
function createMapDispatchToProps(dispatch, props) {
return {
onRemovePress() {
dispatch(removeBlacklistItem({ id: props.id }));
}
};
}
export default connect(createMapStateToProps, createMapDispatchToProps)(BlacklistRow);

View File

@@ -0,0 +1,5 @@
.description {
composes: description from '~Components/DescriptionList/DescriptionListItemDescription.css';
overflow-wrap: break-word;
}

View File

@@ -0,0 +1,446 @@
import PropTypes from 'prop-types';
import React from 'react';
import DescriptionList from 'Components/DescriptionList/DescriptionList';
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
import DescriptionListItemDescription from 'Components/DescriptionList/DescriptionListItemDescription';
import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionListItemTitle';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import { icons } from 'Helpers/Props';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge';
import styles from './HistoryDetails.css';
function getDetailedList(statusMessages) {
return (
<div>
{
statusMessages.map(({ title, messages }) => {
return (
<div key={title}>
{title}
<ul>
{
messages.map((message) => {
return (
<li key={message}>
{message}
</li>
);
})
}
</ul>
</div>
);
})
}
</div>
);
}
function formatMissing(value) {
if (value === undefined || value === 0 || value === '0') {
return (<Icon name={icons.BAN} size={12} />);
}
return value;
}
function formatChange(oldValue, newValue) {
return (
<div> {formatMissing(oldValue)} <Icon name={icons.ARROW_RIGHT_NO_CIRCLE} size={12} /> {formatMissing(newValue)} </div>
);
}
function HistoryDetails(props) {
const {
eventType,
sourceTitle,
data,
shortDateFormat,
timeFormat
} = props;
if (eventType === 'grabbed') {
const {
indexer,
releaseGroup,
nzbInfoUrl,
downloadClient,
downloadId,
age,
ageHours,
ageMinutes,
publishedDate
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
{
!!indexer &&
<DescriptionListItem
title="Indexer"
data={indexer}
/>
}
{
!!releaseGroup &&
<DescriptionListItem
descriptionClassName={styles.description}
title="Release Group"
data={releaseGroup}
/>
}
{
!!nzbInfoUrl &&
<span>
<DescriptionListItemTitle>
Info URL
</DescriptionListItemTitle>
<DescriptionListItemDescription>
<Link to={nzbInfoUrl}>{nzbInfoUrl}</Link>
</DescriptionListItemDescription>
</span>
}
{
!!downloadClient &&
<DescriptionListItem
title="Download Client"
data={downloadClient}
/>
}
{
!!downloadId &&
<DescriptionListItem
title="Grab ID"
data={downloadId}
/>
}
{
!!indexer &&
<DescriptionListItem
title="Age (when grabbed)"
data={formatAge(age, ageHours, ageMinutes)}
/>
}
{
!!publishedDate &&
<DescriptionListItem
title="Published Date"
data={formatDateTime(publishedDate, shortDateFormat, timeFormat, { includeSeconds: true })}
/>
}
</DescriptionList>
);
}
if (eventType === 'downloadFailed') {
const {
message
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
{
!!message &&
<DescriptionListItem
title="Message"
data={message}
/>
}
</DescriptionList>
);
}
if (eventType === 'bookFileImported') {
const {
droppedPath,
importedPath
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
{
!!droppedPath &&
<DescriptionListItem
descriptionClassName={styles.description}
title="Source"
data={droppedPath}
/>
}
{
!!importedPath &&
<DescriptionListItem
descriptionClassName={styles.description}
title="Imported To"
data={importedPath}
/>
}
</DescriptionList>
);
}
if (eventType === 'bookFileDeleted') {
const {
reason
} = data;
let reasonMessage = '';
switch (reason) {
case 'Manual':
reasonMessage = 'File was deleted by via UI';
break;
case 'MissingFromDisk':
reasonMessage = 'Readarr was unable to find the file on disk so it was removed';
break;
case 'Upgrade':
reasonMessage = 'File was deleted to import an upgrade';
break;
default:
reasonMessage = '';
}
return (
<DescriptionList>
<DescriptionListItem
title="Name"
data={sourceTitle}
/>
<DescriptionListItem
title="Reason"
data={reasonMessage}
/>
</DescriptionList>
);
}
if (eventType === 'bookFileRenamed') {
const {
sourcePath,
path
} = data;
return (
<DescriptionList>
<DescriptionListItem
title="Source Path"
data={sourcePath}
/>
<DescriptionListItem
title="Destination Path"
data={path}
/>
</DescriptionList>
);
}
if (eventType === 'bookFileRetagged') {
const {
diff,
tagsScrubbed
} = data;
return (
<DescriptionList>
<DescriptionListItem
title="Path"
data={sourceTitle}
/>
{
JSON.parse(diff).map(({ field, oldValue, newValue }) => {
return (
<DescriptionListItem
key={field}
title={field}
data={formatChange(oldValue, newValue)}
/>
);
})
}
<DescriptionListItem
title="Existing tags scrubbed"
data={tagsScrubbed === 'True' ? <Icon name={icons.CHECK} /> : <Icon name={icons.REMOVE} />}
/>
</DescriptionList>
);
}
if (eventType === 'bookImportIncomplete') {
const {
statusMessages
} = data;
return (
<DescriptionList>
<DescriptionListItem
title="Name"
data={sourceTitle}
/>
{
!!statusMessages &&
<DescriptionListItem
title="Import failures"
data={getDetailedList(JSON.parse(statusMessages))}
/>
}
</DescriptionList>
);
}
if (eventType === 'downloadImported') {
const {
indexer,
releaseGroup,
nzbInfoUrl,
downloadClient,
downloadId,
age,
ageHours,
ageMinutes,
publishedDate
} = data;
return (
<DescriptionList>
<DescriptionListItem
title="Name"
data={sourceTitle}
/>
{
!!indexer &&
<DescriptionListItem
title="Indexer"
data={indexer}
/>
}
{
!!releaseGroup &&
<DescriptionListItem
title="Release Group"
data={releaseGroup}
/>
}
{
!!nzbInfoUrl &&
<span>
<DescriptionListItemTitle>
Info URL
</DescriptionListItemTitle>
<DescriptionListItemDescription>
<Link to={nzbInfoUrl}>{nzbInfoUrl}</Link>
</DescriptionListItemDescription>
</span>
}
{
!!downloadClient &&
<DescriptionListItem
title="Download Client"
data={downloadClient}
/>
}
{
!!downloadId &&
<DescriptionListItem
title="Grab ID"
data={downloadId}
/>
}
{
!!indexer &&
<DescriptionListItem
title="Age (when grabbed)"
data={formatAge(age, ageHours, ageMinutes)}
/>
}
{
!!publishedDate &&
<DescriptionListItem
title="Published Date"
data={formatDateTime(publishedDate, shortDateFormat, timeFormat, { includeSeconds: true })}
/>
}
</DescriptionList>
);
}
if (eventType === 'downloadIgnored') {
const {
message
} = data;
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
{
!!message &&
<DescriptionListItem
title="Message"
data={message}
/>
}
</DescriptionList>
);
}
return (
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
data={sourceTitle}
/>
</DescriptionList>
);
}
HistoryDetails.propTypes = {
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
shortDateFormat: PropTypes.string.isRequired,
timeFormat: PropTypes.string.isRequired
};
export default HistoryDetails;

View File

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

View File

@@ -0,0 +1,5 @@
.markAsFailedButton {
composes: button from '~Components/Link/Button.css';
margin-right: auto;
}

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,6 @@
.cell {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 35px;
text-align: center;
}

View File

@@ -0,0 +1,100 @@
import PropTypes from 'prop-types';
import React from 'react';
import Icon from 'Components/Icon';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import { icons, kinds } from 'Helpers/Props';
import styles from './HistoryEventTypeCell.css';
function getIconName(eventType) {
switch (eventType) {
case 'grabbed':
return icons.DOWNLOADING;
case 'authorFolderImported':
return icons.DRIVE;
case 'bookFileImported':
return icons.DOWNLOADED;
case 'downloadFailed':
return icons.DOWNLOADING;
case 'bookFileDeleted':
return icons.DELETE;
case 'bookFileRenamed':
return icons.ORGANIZE;
case 'bookFileRetagged':
return icons.RETAG;
case 'bookImportIncomplete':
return icons.DOWNLOADED;
case 'downloadImported':
return icons.DOWNLOADED;
case 'downloadIgnored':
return icons.IGNORE;
default:
return icons.UNKNOWN;
}
}
function getIconKind(eventType) {
switch (eventType) {
case 'downloadFailed':
return kinds.DANGER;
case 'bookImportIncomplete':
return kinds.WARNING;
default:
return kinds.DEFAULT;
}
}
function getTooltip(eventType, data) {
switch (eventType) {
case 'grabbed':
return `Book grabbed from ${data.indexer} and sent to ${data.downloadClient}`;
case 'authorFolderImported':
return 'Book imported from author folder';
case 'bookFileImported':
return 'Book downloaded successfully and picked up from download client';
case 'downloadFailed':
return 'Book download failed';
case 'bookFileDeleted':
return 'Book file deleted';
case 'bookFileRenamed':
return 'Book file renamed';
case 'bookFileRetagged':
return 'Book file tags updated';
case 'bookImportIncomplete':
return 'Files downloaded but not all could be imported';
case 'downloadImported':
return 'Download completed and successfully imported';
case 'downloadIgnored':
return 'Book Download Ignored';
default:
return 'Unknown event';
}
}
function HistoryEventTypeCell({ eventType, data }) {
const iconName = getIconName(eventType);
const iconKind = getIconKind(eventType);
const tooltip = getTooltip(eventType, data);
return (
<TableRowCell
className={styles.cell}
title={tooltip}
>
<Icon
name={iconName}
kind={iconKind}
/>
</TableRowCell>
);
}
HistoryEventTypeCell.propTypes = {
eventType: PropTypes.string.isRequired,
data: PropTypes.object
};
HistoryEventTypeCell.defaultProps = {
data: {}
};
export default HistoryEventTypeCell;

View File

@@ -0,0 +1,23 @@
.downloadClient {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 120px;
}
.indexer {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 80px;
}
.releaseGroup {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 110px;
}
.details {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 30px;
}

View File

@@ -0,0 +1,225 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import AuthorNameLink from 'Author/AuthorNameLink';
import BookQuality from 'Book/BookQuality';
import BookTitleLink from 'Book/BookTitleLink';
import IconButton from 'Components/Link/IconButton';
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import { icons } from 'Helpers/Props';
import HistoryDetailsModal from './Details/HistoryDetailsModal';
import HistoryEventTypeCell from './HistoryEventTypeCell';
import styles from './HistoryRow.css';
class HistoryRow extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isDetailsModalOpen: false
};
}
componentDidUpdate(prevProps) {
if (
prevProps.isMarkingAsFailed &&
!this.props.isMarkingAsFailed &&
!this.props.markAsFailedError
) {
this.setState({ isDetailsModalOpen: false });
}
}
//
// Listeners
onDetailsPress = () => {
this.setState({ isDetailsModalOpen: true });
}
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
//
// Render
render() {
const {
author,
book,
quality,
qualityCutoffNotMet,
eventType,
sourceTitle,
date,
data,
isMarkingAsFailed,
columns,
shortDateFormat,
timeFormat,
onMarkAsFailedPress
} = this.props;
if (!author || !book) {
return null;
}
return (
<TableRow>
{
columns.map((column) => {
const {
name,
isVisible
} = column;
if (!isVisible) {
return null;
}
if (name === 'eventType') {
return (
<HistoryEventTypeCell
key={name}
eventType={eventType}
data={data}
/>
);
}
if (name === 'authors.sortName') {
return (
<TableRowCell key={name}>
<AuthorNameLink
titleSlug={author.titleSlug}
authorName={author.authorName}
/>
</TableRowCell>
);
}
if (name === 'books.title') {
return (
<TableRowCell key={name}>
<BookTitleLink
titleSlug={book.titleSlug}
title={book.title}
disambiguation={book.disambiguation}
/>
</TableRowCell>
);
}
if (name === 'quality') {
return (
<TableRowCell key={name}>
<BookQuality
quality={quality}
isCutoffMet={qualityCutoffNotMet}
/>
</TableRowCell>
);
}
if (name === 'date') {
return (
<RelativeDateCellConnector
key={name}
date={date}
/>
);
}
if (name === 'downloadClient') {
return (
<TableRowCell
key={name}
className={styles.downloadClient}
>
{data.downloadClient}
</TableRowCell>
);
}
if (name === 'indexer') {
return (
<TableRowCell
key={name}
className={styles.indexer}
>
{data.indexer}
</TableRowCell>
);
}
if (name === 'releaseGroup') {
return (
<TableRowCell
key={name}
className={styles.releaseGroup}
>
{data.releaseGroup}
</TableRowCell>
);
}
if (name === 'details') {
return (
<TableRowCell
key={name}
className={styles.details}
>
<IconButton
name={icons.INFO}
onPress={this.onDetailsPress}
/>
</TableRowCell>
);
}
return null;
})
}
<HistoryDetailsModal
isOpen={this.state.isDetailsModalOpen}
eventType={eventType}
sourceTitle={sourceTitle}
data={data}
isMarkingAsFailed={isMarkingAsFailed}
shortDateFormat={shortDateFormat}
timeFormat={timeFormat}
onMarkAsFailedPress={onMarkAsFailedPress}
onModalClose={this.onDetailsModalClose}
/>
</TableRow>
);
}
}
HistoryRow.propTypes = {
bookId: PropTypes.number,
author: PropTypes.object.isRequired,
book: PropTypes.object,
quality: PropTypes.object.isRequired,
qualityCutoffNotMet: PropTypes.bool.isRequired,
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,
date: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
isMarkingAsFailed: PropTypes.bool,
markAsFailedError: PropTypes.object,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
shortDateFormat: PropTypes.string.isRequired,
timeFormat: PropTypes.string.isRequired,
onMarkAsFailedPress: PropTypes.func.isRequired
};
export default HistoryRow;

View File

@@ -0,0 +1,75 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { fetchHistory, markAsFailed } from 'Store/Actions/historyActions';
import createAuthorSelector from 'Store/Selectors/createAuthorSelector';
import createBookSelector from 'Store/Selectors/createBookSelector';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
import HistoryRow from './HistoryRow';
function createMapStateToProps() {
return createSelector(
createAuthorSelector(),
createBookSelector(),
createUISettingsSelector(),
(author, book, uiSettings) => {
return {
author,
book,
shortDateFormat: uiSettings.shortDateFormat,
timeFormat: uiSettings.timeFormat
};
}
);
}
const mapDispatchToProps = {
fetchHistory,
markAsFailed
};
class HistoryRowConnector extends Component {
//
// Lifecycle
componentDidUpdate(prevProps) {
if (
prevProps.isMarkingAsFailed &&
!this.props.isMarkingAsFailed &&
!this.props.markAsFailedError
) {
this.props.fetchHistory();
}
}
//
// Listeners
onMarkAsFailedPress = () => {
this.props.markAsFailed({ id: this.props.id });
}
//
// Render
render() {
return (
<HistoryRow
{...this.props}
onMarkAsFailedPress={this.onMarkAsFailedPress}
/>
);
}
}
HistoryRowConnector.propTypes = {
id: PropTypes.number.isRequired,
isMarkingAsFailed: PropTypes.bool,
markAsFailedError: PropTypes.object,
fetchHistory: PropTypes.func.isRequired,
markAsFailed: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(HistoryRowConnector);

View File

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

View File

@@ -0,0 +1,20 @@
import PropTypes from 'prop-types';
import React from 'react';
import Label from 'Components/Label';
import styles from './ProtocolLabel.css';
function ProtocolLabel({ protocol }) {
const protocolName = protocol === 'usenet' ? 'nzb' : protocol;
return (
<Label className={styles[protocol]}>
{protocolName}
</Label>
);
}
ProtocolLabel.propTypes = {
protocol: PropTypes.string.isRequired
};
export default ProtocolLabel;

View File

@@ -0,0 +1,295 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import PageToolbar from 'Components/Page/Toolbar/PageToolbar';
import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton';
import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection';
import PageToolbarSeparator from 'Components/Page/Toolbar/PageToolbarSeparator';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper';
import TablePager from 'Components/Table/TablePager';
import { align, icons } from 'Helpers/Props';
import getRemovedItems from 'Utilities/Object/getRemovedItems';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import getSelectedIds from 'Utilities/Table/getSelectedIds';
import removeOldSelectedState from 'Utilities/Table/removeOldSelectedState';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
import QueueOptionsConnector from './QueueOptionsConnector';
import QueueRowConnector from './QueueRowConnector';
import RemoveQueueItemsModal from './RemoveQueueItemsModal';
class Queue extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
allSelected: false,
allUnselected: false,
lastToggled: null,
selectedState: {},
isPendingSelected: false,
isConfirmRemoveModalOpen: false,
items: props.items
};
}
componentDidUpdate(prevProps) {
const {
items,
isFetching,
isBooksFetching
} = this.props;
if (
(!isBooksFetching && prevProps.isBooksFetching) ||
(!isFetching && prevProps.isFetching) ||
(hasDifferentItems(prevProps.items, items) && !items.some((e) => e.bookId))
) {
this.setState((state) => {
return {
...removeOldSelectedState(state, getRemovedItems(prevProps.items, items)),
items
};
});
return;
}
const selectedIds = this.getSelectedIds();
const isPendingSelected = _.some(this.props.items, (item) => {
return selectedIds.indexOf(item.id) > -1 && item.status === 'delay';
});
if (isPendingSelected !== this.state.isPendingSelected) {
this.setState({ isPendingSelected });
}
}
//
// Control
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState);
}
//
// Listeners
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
onGrabSelectedPress = () => {
this.props.onGrabSelectedPress(this.getSelectedIds());
}
onRemoveSelectedPress = () => {
this.setState({ isConfirmRemoveModalOpen: true });
}
onRemoveSelectedConfirmed = (payload) => {
this.props.onRemoveSelectedPress({ ids: this.getSelectedIds(), ...payload });
this.setState({ isConfirmRemoveModalOpen: false });
}
onConfirmRemoveModalClose = () => {
this.setState({ isConfirmRemoveModalOpen: false });
}
//
// Render
render() {
const {
isFetching,
isPopulated,
error,
items,
isAuthorFetching,
isAuthorPopulated,
isBooksFetching,
isBooksPopulated,
booksError,
columns,
totalRecords,
isGrabbing,
isRemoving,
isRefreshMonitoredDownloadsExecuting,
onRefreshPress,
...otherProps
} = this.props;
const {
allSelected,
allUnselected,
selectedState,
isConfirmRemoveModalOpen,
isPendingSelected
} = this.state;
const isRefreshing = isFetching || isAuthorFetching || isBooksFetching || isRefreshMonitoredDownloadsExecuting;
const isAllPopulated = isPopulated && ((isAuthorPopulated && isBooksPopulated) || !items.length || items.every((e) => !e.bookId));
const hasError = error || booksError;
const selectedIds = this.getSelectedIds();
const selectedCount = selectedIds.length;
const disableSelectedActions = selectedCount === 0;
return (
<PageContent title="Queue">
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label="Refresh"
iconName={icons.REFRESH}
isSpinning={isRefreshing}
onPress={onRefreshPress}
/>
<PageToolbarSeparator />
<PageToolbarButton
label="Grab Selected"
iconName={icons.DOWNLOAD}
isDisabled={disableSelectedActions || !isPendingSelected}
isSpinning={isGrabbing}
onPress={this.onGrabSelectedPress}
/>
<PageToolbarButton
label="Remove Selected"
iconName={icons.REMOVE}
isDisabled={disableSelectedActions}
isSpinning={isRemoving}
onPress={this.onRemoveSelectedPress}
/>
</PageToolbarSection>
<PageToolbarSection
alignContent={align.RIGHT}
>
<TableOptionsModalWrapper
columns={columns}
{...otherProps}
optionsComponent={QueueOptionsConnector}
>
<PageToolbarButton
label="Options"
iconName={icons.TABLE}
/>
</TableOptionsModalWrapper>
</PageToolbarSection>
</PageToolbar>
<PageContentBody>
{
isRefreshing && !isAllPopulated &&
<LoadingIndicator />
}
{
!isRefreshing && hasError &&
<div>
Failed to load Queue
</div>
}
{
isPopulated && !hasError && !items.length &&
<div>
Queue is empty
</div>
}
{
isAllPopulated && !hasError && !!items.length &&
<div>
<Table
columns={columns}
selectAll={true}
allSelected={allSelected}
allUnselected={allUnselected}
{...otherProps}
optionsComponent={QueueOptionsConnector}
onSelectAllChange={this.onSelectAllChange}
>
<TableBody>
{
items.map((item) => {
return (
<QueueRowConnector
key={item.id}
bookId={item.bookId}
isSelected={selectedState[item.id]}
columns={columns}
{...item}
onSelectedChange={this.onSelectedChange}
/>
);
})
}
</TableBody>
</Table>
<TablePager
totalRecords={totalRecords}
isFetching={isRefreshing}
{...otherProps}
/>
</div>
}
</PageContentBody>
<RemoveQueueItemsModal
isOpen={isConfirmRemoveModalOpen}
selectedCount={selectedCount}
canIgnore={isConfirmRemoveModalOpen && (
selectedIds.every((id) => {
const item = items.find((i) => i.id === id);
return !!(item && item.authorId && item.bookId);
})
)}
onRemovePress={this.onRemoveSelectedConfirmed}
onModalClose={this.onConfirmRemoveModalClose}
/>
</PageContent>
);
}
}
Queue.propTypes = {
isFetching: PropTypes.bool.isRequired,
isPopulated: PropTypes.bool.isRequired,
error: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
isAuthorFetching: PropTypes.bool.isRequired,
isAuthorPopulated: PropTypes.bool.isRequired,
isBooksFetching: PropTypes.bool.isRequired,
isBooksPopulated: PropTypes.bool.isRequired,
booksError: PropTypes.object,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
totalRecords: PropTypes.number,
isGrabbing: PropTypes.bool.isRequired,
isRemoving: PropTypes.bool.isRequired,
isRefreshMonitoredDownloadsExecuting: PropTypes.bool.isRequired,
onRefreshPress: PropTypes.func.isRequired,
onGrabSelectedPress: PropTypes.func.isRequired,
onRemoveSelectedPress: PropTypes.func.isRequired
};
export default Queue;

View File

@@ -0,0 +1,191 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import * as commandNames from 'Commands/commandNames';
import withCurrentPage from 'Components/withCurrentPage';
import { clearBooks, fetchBooks } from 'Store/Actions/bookActions';
import { executeCommand } from 'Store/Actions/commandActions';
import * as queueActions from 'Store/Actions/queueActions';
import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import selectUniqueIds from 'Utilities/Object/selectUniqueIds';
import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator';
import Queue from './Queue';
function createMapStateToProps() {
return createSelector(
(state) => state.authors,
(state) => state.books,
(state) => state.queue.options,
(state) => state.queue.paged,
createCommandExecutingSelector(commandNames.REFRESH_MONITORED_DOWNLOADS),
(authors, books, options, queue, isRefreshMonitoredDownloadsExecuting) => {
return {
isAuthorFetching: authors.isFetching,
isAuthorPopulated: authors.isPopulated,
isBooksFetching: books.isFetching,
isBooksPopulated: books.isPopulated,
booksError: books.error,
isRefreshMonitoredDownloadsExecuting,
...options,
...queue
};
}
);
}
const mapDispatchToProps = {
...queueActions,
fetchBooks,
clearBooks,
executeCommand
};
class QueueConnector extends Component {
//
// Lifecycle
componentDidMount() {
const {
useCurrentPage,
fetchQueue,
gotoQueueFirstPage
} = this.props;
registerPagePopulator(this.repopulate);
if (useCurrentPage) {
fetchQueue();
} else {
gotoQueueFirstPage();
}
}
componentDidUpdate(prevProps) {
if (hasDifferentItems(prevProps.items, this.props.items)) {
const bookIds = selectUniqueIds(this.props.items, 'bookId');
if (bookIds.length) {
this.props.fetchBooks({ bookIds });
} else {
this.props.clearBooks();
}
}
if (
this.props.includeUnknownAuthorItems !==
prevProps.includeUnknownAuthorItems
) {
this.repopulate();
}
}
componentWillUnmount() {
unregisterPagePopulator(this.repopulate);
this.props.clearQueue();
this.props.clearBooks();
}
//
// Control
repopulate = () => {
this.props.fetchQueue();
}
//
// Listeners
onFirstPagePress = () => {
this.props.gotoQueueFirstPage();
}
onPreviousPagePress = () => {
this.props.gotoQueuePreviousPage();
}
onNextPagePress = () => {
this.props.gotoQueueNextPage();
}
onLastPagePress = () => {
this.props.gotoQueueLastPage();
}
onPageSelect = (page) => {
this.props.gotoQueuePage({ page });
}
onSortPress = (sortKey) => {
this.props.setQueueSort({ sortKey });
}
onTableOptionChange = (payload) => {
this.props.setQueueTableOption(payload);
if (payload.pageSize) {
this.props.gotoQueueFirstPage();
}
}
onRefreshPress = () => {
this.props.executeCommand({
name: commandNames.REFRESH_MONITORED_DOWNLOADS
});
}
onGrabSelectedPress = (ids) => {
this.props.grabQueueItems({ ids });
}
onRemoveSelectedPress = (payload) => {
this.props.removeQueueItems(payload);
}
//
// Render
render() {
return (
<Queue
onFirstPagePress={this.onFirstPagePress}
onPreviousPagePress={this.onPreviousPagePress}
onNextPagePress={this.onNextPagePress}
onLastPagePress={this.onLastPagePress}
onPageSelect={this.onPageSelect}
onSortPress={this.onSortPress}
onTableOptionChange={this.onTableOptionChange}
onRefreshPress={this.onRefreshPress}
onGrabSelectedPress={this.onGrabSelectedPress}
onRemoveSelectedPress={this.onRemoveSelectedPress}
{...this.props}
/>
);
}
}
QueueConnector.propTypes = {
useCurrentPage: PropTypes.bool.isRequired,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
includeUnknownAuthorItems: PropTypes.bool.isRequired,
fetchQueue: PropTypes.func.isRequired,
gotoQueueFirstPage: PropTypes.func.isRequired,
gotoQueuePreviousPage: PropTypes.func.isRequired,
gotoQueueNextPage: PropTypes.func.isRequired,
gotoQueueLastPage: PropTypes.func.isRequired,
gotoQueuePage: PropTypes.func.isRequired,
setQueueSort: PropTypes.func.isRequired,
setQueueTableOption: PropTypes.func.isRequired,
clearQueue: PropTypes.func.isRequired,
grabQueueItems: PropTypes.func.isRequired,
removeQueueItems: PropTypes.func.isRequired,
fetchBooks: PropTypes.func.isRequired,
clearBooks: PropTypes.func.isRequired,
executeCommand: PropTypes.func.isRequired
};
export default withCurrentPage(
connect(createMapStateToProps, mapDispatchToProps)(QueueConnector)
);

View File

@@ -0,0 +1,97 @@
import moment from 'moment';
import PropTypes from 'prop-types';
import React from 'react';
import Icon from 'Components/Icon';
import { icons, kinds } from 'Helpers/Props';
function QueueDetails(props) {
const {
title,
size,
sizeleft,
estimatedCompletionTime,
status: queueStatus,
errorMessage,
progressBar
} = props;
const status = queueStatus.toLowerCase();
const progress = (100 - sizeleft / size * 100);
if (status === 'pending') {
return (
<Icon
name={icons.PENDING}
title={`Release will be processed ${moment(estimatedCompletionTime).fromNow()}`}
/>
);
}
if (status === 'completed') {
if (errorMessage) {
return (
<Icon
name={icons.DOWNLOAD}
kind={kinds.DANGER}
title={`Import failed: ${errorMessage}`}
/>
);
}
// TODO: show an icon when download is complete, but not imported yet?
}
if (errorMessage) {
return (
<Icon
name={icons.DOWNLOADING}
kind={kinds.DANGER}
title={`Download failed: ${errorMessage}`}
/>
);
}
if (status === 'failed') {
return (
<Icon
name={icons.DOWNLOADING}
kind={kinds.DANGER}
title="Download failed: check download client for more details"
/>
);
}
if (status === 'warning') {
return (
<Icon
name={icons.DOWNLOADING}
kind={kinds.WARNING}
title="Download warning: check download client for more details"
/>
);
}
if (progress < 5) {
return (
<Icon
name={icons.DOWNLOADING}
title={`Book is downloading - ${progress.toFixed(1)}% ${title}`}
/>
);
}
return progressBar;
}
QueueDetails.propTypes = {
title: PropTypes.string.isRequired,
size: PropTypes.number.isRequired,
sizeleft: PropTypes.number.isRequired,
estimatedCompletionTime: PropTypes.string,
status: PropTypes.string.isRequired,
errorMessage: PropTypes.string,
progressBar: PropTypes.node.isRequired
};
export default QueueDetails;

View File

@@ -0,0 +1,77 @@
import PropTypes from 'prop-types';
import React, { Component, Fragment } from 'react';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props';
class QueueOptions extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
includeUnknownAuthorItems: props.includeUnknownAuthorItems
};
}
componentDidUpdate(prevProps) {
const {
includeUnknownAuthorItems
} = this.props;
if (includeUnknownAuthorItems !== prevProps.includeUnknownAuthorItems) {
this.setState({
includeUnknownAuthorItems
});
}
}
//
// Listeners
onOptionChange = ({ name, value }) => {
this.setState({
[name]: value
}, () => {
this.props.onOptionChange({
[name]: value
});
});
}
//
// Render
render() {
const {
includeUnknownAuthorItems
} = this.state;
return (
<Fragment>
<FormGroup>
<FormLabel>Show Unknown Author Items</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="includeUnknownAuthorItems"
value={includeUnknownAuthorItems}
helpText="Show items without a author in the queue, this could include removed authors, movies or anything else in Readarr's category"
onChange={this.onOptionChange}
/>
</FormGroup>
</Fragment>
);
}
}
QueueOptions.propTypes = {
includeUnknownAuthorItems: PropTypes.bool.isRequired,
onOptionChange: PropTypes.func.isRequired
};
export default QueueOptions;

View File

@@ -0,0 +1,19 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { setQueueOption } from 'Store/Actions/queueActions';
import QueueOptions from './QueueOptions';
function createMapStateToProps() {
return createSelector(
(state) => state.queue.options,
(options) => {
return options;
}
);
}
const mapDispatchToProps = {
onOptionChange: setQueueOption
};
export default connect(createMapStateToProps, mapDispatchToProps)(QueueOptions);

View File

@@ -0,0 +1,23 @@
.quality {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 150px;
}
.protocol {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 100px;
}
.progress {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 150px;
}
.actions {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 90px;
}

View File

@@ -0,0 +1,387 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import ProtocolLabel from 'Activity/Queue/ProtocolLabel';
import AuthorNameLink from 'Author/AuthorNameLink';
import BookQuality from 'Book/BookQuality';
import BookTitleLink from 'Book/BookTitleLink';
import Icon from 'Components/Icon';
import IconButton from 'Components/Link/IconButton';
import SpinnerIconButton from 'Components/Link/SpinnerIconButton';
import ProgressBar from 'Components/ProgressBar';
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableSelectCell from 'Components/Table/Cells/TableSelectCell';
import TableRow from 'Components/Table/TableRow';
import Popover from 'Components/Tooltip/Popover';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import InteractiveImportModal from 'InteractiveImport/InteractiveImportModal';
import QueueStatusCell from './QueueStatusCell';
import RemoveQueueItemModal from './RemoveQueueItemModal';
import TimeleftCell from './TimeleftCell';
import styles from './QueueRow.css';
class QueueRow extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isRemoveQueueItemModalOpen: false,
isInteractiveImportModalOpen: false
};
}
//
// Listeners
onRemoveQueueItemPress = () => {
this.setState({ isRemoveQueueItemModalOpen: true });
}
onRemoveQueueItemModalConfirmed = (blacklist, skipredownload) => {
this.props.onRemoveQueueItemPress(blacklist, skipredownload);
this.setState({ isRemoveQueueItemModalOpen: false });
}
onRemoveQueueItemModalClose = () => {
this.setState({ isRemoveQueueItemModalOpen: false });
}
onInteractiveImportPress = () => {
this.setState({ isInteractiveImportModalOpen: true });
}
onInteractiveImportModalClose = () => {
this.setState({ isInteractiveImportModalOpen: false });
}
//
// Render
render() {
const {
id,
downloadId,
title,
status,
trackedDownloadStatus,
trackedDownloadState,
statusMessages,
errorMessage,
author,
book,
quality,
protocol,
indexer,
outputPath,
downloadClient,
downloadForced,
estimatedCompletionTime,
timeleft,
size,
sizeleft,
showRelativeDates,
shortDateFormat,
timeFormat,
isGrabbing,
grabError,
isRemoving,
isSelected,
columns,
onSelectedChange,
onGrabPress
} = this.props;
const {
isRemoveQueueItemModalOpen,
isInteractiveImportModalOpen
} = this.state;
const progress = 100 - (sizeleft / size * 100);
const showInteractiveImport = status === 'completed' && trackedDownloadStatus === 'warning';
const isPending = status === 'delay' || status === 'downloadClientUnavailable';
return (
<TableRow>
<TableSelectCell
id={id}
isSelected={isSelected}
onSelectedChange={onSelectedChange}
/>
{
columns.map((column) => {
const {
name,
isVisible
} = column;
if (!isVisible) {
return null;
}
if (name === 'status') {
return (
<QueueStatusCell
key={name}
sourceTitle={title}
status={status}
trackedDownloadStatus={trackedDownloadStatus}
trackedDownloadState={trackedDownloadState}
statusMessages={statusMessages}
errorMessage={errorMessage}
/>
);
}
if (name === 'authors.sortName') {
return (
<TableRowCell key={name}>
{
author ?
<AuthorNameLink
titleSlug={author.titleSlug}
authorName={author.authorName}
/> :
title
}
</TableRowCell>
);
}
if (name === 'books.title') {
return (
<TableRowCell key={name}>
{
book ?
<BookTitleLink
titleSlug={book.titleSlug}
title={book.title}
disambiguation={book.disambiguation}
/> :
'-'
}
</TableRowCell>
);
}
if (name === 'books.releaseDate') {
if (book) {
return (
<RelativeDateCellConnector
key={name}
date={book.releaseDate}
/>
);
}
return (
<TableRowCell key={name}>
-
</TableRowCell>
);
}
if (name === 'quality') {
return (
<TableRowCell key={name}>
<BookQuality
quality={quality}
/>
</TableRowCell>
);
}
if (name === 'protocol') {
return (
<TableRowCell key={name}>
<ProtocolLabel
protocol={protocol}
/>
</TableRowCell>
);
}
if (name === 'indexer') {
return (
<TableRowCell key={name}>
{indexer}
</TableRowCell>
);
}
if (name === 'downloadClient') {
return (
<TableRowCell key={name}>
{downloadClient}
</TableRowCell>
);
}
if (name === 'title') {
return (
<TableRowCell key={name}>
{title}
</TableRowCell>
);
}
if (name === 'outputPath') {
return (
<TableRowCell key={name}>
{outputPath}
</TableRowCell>
);
}
if (name === 'estimatedCompletionTime') {
return (
<TimeleftCell
key={name}
status={status}
estimatedCompletionTime={estimatedCompletionTime}
timeleft={timeleft}
size={size}
sizeleft={sizeleft}
showRelativeDates={showRelativeDates}
shortDateFormat={shortDateFormat}
timeFormat={timeFormat}
/>
);
}
if (name === 'progress') {
return (
<TableRowCell
key={name}
className={styles.progress}
>
{
!!progress &&
<ProgressBar
progress={progress}
title={`${progress.toFixed(1)}%`}
/>
}
</TableRowCell>
);
}
if (name === 'actions') {
return (
<TableRowCell
key={name}
className={styles.actions}
>
{
downloadForced &&
<Popover
anchor={
<Icon
name={icons.DANGER}
kind={kinds.DANGER}
/>
}
title="Manual Download"
body="This release failed parsing checks and was manually downloaded from an interactive search. Import is likely to fail."
position={tooltipPositions.LEFT}
/>
}
{
showInteractiveImport &&
<IconButton
name={icons.INTERACTIVE}
onPress={this.onInteractiveImportPress}
/>
}
{
isPending &&
<SpinnerIconButton
name={icons.DOWNLOAD}
kind={grabError ? kinds.DANGER : kinds.DEFAULT}
isSpinning={isGrabbing}
onPress={onGrabPress}
/>
}
<SpinnerIconButton
title="Remove from queue"
name={icons.REMOVE}
isSpinning={isRemoving}
onPress={this.onRemoveQueueItemPress}
/>
</TableRowCell>
);
}
return null;
})
}
<InteractiveImportModal
isOpen={isInteractiveImportModalOpen}
downloadId={downloadId}
title={title}
onModalClose={this.onInteractiveImportModalClose}
showReplaceExistingFiles={true}
replaceExistingFiles={true}
/>
<RemoveQueueItemModal
isOpen={isRemoveQueueItemModalOpen}
sourceTitle={title}
canIgnore={!!(author && book)}
onRemovePress={this.onRemoveQueueItemModalConfirmed}
onModalClose={this.onRemoveQueueItemModalClose}
/>
</TableRow>
);
}
}
QueueRow.propTypes = {
id: PropTypes.number.isRequired,
downloadId: PropTypes.string,
title: PropTypes.string.isRequired,
status: PropTypes.string.isRequired,
trackedDownloadStatus: PropTypes.string,
trackedDownloadState: PropTypes.string,
statusMessages: PropTypes.arrayOf(PropTypes.object),
errorMessage: PropTypes.string,
author: PropTypes.object,
book: PropTypes.object,
quality: PropTypes.object.isRequired,
protocol: PropTypes.string.isRequired,
indexer: PropTypes.string,
outputPath: PropTypes.string,
downloadClient: PropTypes.string,
downloadForced: PropTypes.bool.isRequired,
estimatedCompletionTime: PropTypes.string,
timeleft: PropTypes.string,
size: PropTypes.number,
sizeleft: PropTypes.number,
showRelativeDates: PropTypes.bool.isRequired,
shortDateFormat: PropTypes.string.isRequired,
timeFormat: PropTypes.string.isRequired,
isGrabbing: PropTypes.bool.isRequired,
grabError: PropTypes.object,
isRemoving: PropTypes.bool.isRequired,
isSelected: PropTypes.bool,
columns: PropTypes.arrayOf(PropTypes.object).isRequired,
onSelectedChange: PropTypes.func.isRequired,
onGrabPress: PropTypes.func.isRequired,
onRemoveQueueItemPress: PropTypes.func.isRequired
};
QueueRow.defaultProps = {
isGrabbing: false,
isRemoving: false
};
export default QueueRow;

View File

@@ -0,0 +1,71 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { grabQueueItem, removeQueueItem } from 'Store/Actions/queueActions';
import createAuthorSelector from 'Store/Selectors/createAuthorSelector';
import createBookSelector from 'Store/Selectors/createBookSelector';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
import QueueRow from './QueueRow';
function createMapStateToProps() {
return createSelector(
createAuthorSelector(),
createBookSelector(),
createUISettingsSelector(),
(author, book, uiSettings) => {
const result = _.pick(uiSettings, [
'showRelativeDates',
'shortDateFormat',
'timeFormat'
]);
result.author = author;
result.book = book;
return result;
}
);
}
const mapDispatchToProps = {
grabQueueItem,
removeQueueItem
};
class QueueRowConnector extends Component {
//
// Listeners
onGrabPress = () => {
this.props.grabQueueItem({ id: this.props.id });
}
onRemoveQueueItemPress = (payload) => {
this.props.removeQueueItem({ id: this.props.id, ...payload });
}
//
// Render
render() {
return (
<QueueRow
{...this.props}
onGrabPress={this.onGrabPress}
onRemoveQueueItemPress={this.onRemoveQueueItemPress}
/>
);
}
}
QueueRowConnector.propTypes = {
id: PropTypes.number.isRequired,
book: PropTypes.object,
grabQueueItem: PropTypes.func.isRequired,
removeQueueItem: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(QueueRowConnector);

View File

@@ -0,0 +1,5 @@
.status {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 30px;
}

View File

@@ -0,0 +1,152 @@
import PropTypes from 'prop-types';
import React from 'react';
import Icon from 'Components/Icon';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import Popover from 'Components/Tooltip/Popover';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import styles from './QueueStatusCell.css';
function getDetailedPopoverBody(statusMessages) {
return (
<div>
{
statusMessages.map(({ title, messages }) => {
return (
<div key={title}>
{title}
<ul>
{
messages.map((message) => {
return (
<li key={message}>
{message}
</li>
);
})
}
</ul>
</div>
);
})
}
</div>
);
}
function QueueStatusCell(props) {
const {
sourceTitle,
status,
trackedDownloadStatus,
trackedDownloadState,
statusMessages,
errorMessage
} = props;
const hasWarning = trackedDownloadStatus === 'warning';
const hasError = trackedDownloadStatus === 'error';
// status === 'downloading'
let iconName = icons.DOWNLOADING;
let iconKind = kinds.DEFAULT;
let title = 'Downloading';
if (hasWarning) {
iconKind = kinds.WARNING;
}
if (status === 'paused') {
iconName = icons.PAUSED;
title = 'Paused';
}
if (status === 'queued') {
iconName = icons.QUEUED;
title = 'Queued';
}
if (status === 'completed') {
iconName = icons.DOWNLOADED;
title = 'Downloaded';
if (trackedDownloadState === 'importPending') {
title += ' - Waiting to Import';
}
if (trackedDownloadState === 'importing') {
title += ' - Importing';
}
if (trackedDownloadState === 'failedPending') {
title += ' - Waiting to Process';
}
}
if (status === 'delay') {
iconName = icons.PENDING;
title = 'Pending';
}
if (status === 'downloadClientUnavailable') {
iconName = icons.PENDING;
iconKind = kinds.WARNING;
title = 'Pending - Download client is unavailable';
}
if (status === 'failed') {
iconName = icons.DOWNLOADING;
iconKind = kinds.DANGER;
title = 'Download failed';
}
if (status === 'warning') {
iconName = icons.DOWNLOADING;
iconKind = kinds.WARNING;
title = `Download warning: ${errorMessage || 'check download client for more details'}`;
}
if (hasError) {
if (status === 'completed') {
iconName = icons.DOWNLOAD;
iconKind = kinds.DANGER;
title = `Import failed: ${sourceTitle}`;
} else {
iconName = icons.DOWNLOADING;
iconKind = kinds.DANGER;
title = 'Download failed';
}
}
return (
<TableRowCell className={styles.status}>
<Popover
anchor={
<Icon
name={iconName}
kind={iconKind}
/>
}
title={title}
body={hasWarning || hasError ? getDetailedPopoverBody(statusMessages) : sourceTitle}
position={tooltipPositions.RIGHT}
canFlip={false}
/>
</TableRowCell>
);
}
QueueStatusCell.propTypes = {
sourceTitle: PropTypes.string.isRequired,
status: PropTypes.string.isRequired,
trackedDownloadStatus: PropTypes.string.isRequired,
trackedDownloadState: PropTypes.string.isRequired,
statusMessages: PropTypes.arrayOf(PropTypes.object),
errorMessage: PropTypes.string
};
QueueStatusCell.defaultProps = {
trackedDownloadStatus: 'Ok',
trackedDownloadState: 'Downloading'
};
export default QueueStatusCell;

View File

@@ -0,0 +1,164 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import Button from 'Components/Link/Button';
import Modal from 'Components/Modal/Modal';
import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
class RemoveQueueItemModal extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
remove: true,
blacklist: false,
skipredownload: false
};
}
//
// Control
resetState = function() {
this.setState({
remove: true,
blacklist: false,
skipredownload: false
});
}
//
// Listeners
onRemoveChange = ({ value }) => {
this.setState({ remove: value });
}
onBlacklistChange = ({ value }) => {
this.setState({ blacklist: value });
}
onSkipReDownloadChange = ({ value }) => {
this.setState({ skipredownload: value });
}
onRemoveConfirmed = () => {
const state = this.state;
this.resetState();
this.props.onRemovePress(state);
}
onModalClose = () => {
this.resetState();
this.props.onModalClose();
}
//
// Render
render() {
const {
isOpen,
sourceTitle,
canIgnore
} = this.props;
const { remove, blacklist, skipredownload } = this.state;
return (
<Modal
isOpen={isOpen}
size={sizes.MEDIUM}
onModalClose={this.onModalClose}
>
<ModalContent
onModalClose={this.onModalClose}
>
<ModalHeader>
Remove - {sourceTitle}
</ModalHeader>
<ModalBody>
<div>
Are you sure you want to remove '{sourceTitle}' from the queue?
</div>
<FormGroup>
<FormLabel>Remove From Download Client</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="remove"
value={remove}
helpTextWarning="Removing will remove the download and the file(s) from the download client."
isDisabled={!canIgnore}
onChange={this.onRemoveChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Blacklist Release</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="blacklist"
value={blacklist}
helpText="Prevents Readarr from automatically grabbing this release again"
onChange={this.onBlacklistChange}
/>
</FormGroup>
{
blacklist &&
<FormGroup>
<FormLabel>Skip Redownload</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="skipredownload"
value={skipredownload}
helpText="Prevents Readarr from trying download an alternative release for this item"
onChange={this.onSkipReDownloadChange}
/>
</FormGroup>
}
</ModalBody>
<ModalFooter>
<Button onPress={this.onModalClose}>
Close
</Button>
<Button
kind={kinds.DANGER}
onPress={this.onRemoveConfirmed}
>
Remove
</Button>
</ModalFooter>
</ModalContent>
</Modal>
);
}
}
RemoveQueueItemModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
sourceTitle: PropTypes.string.isRequired,
canIgnore: PropTypes.bool.isRequired,
onRemovePress: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};
export default RemoveQueueItemModal;

View File

@@ -0,0 +1,3 @@
.message {
margin-bottom: 30px;
}

View File

@@ -0,0 +1,167 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import Button from 'Components/Link/Button';
import Modal from 'Components/Modal/Modal';
import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
import styles from './RemoveQueueItemsModal.css';
class RemoveQueueItemsModal extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
remove: true,
blacklist: false,
skipredownload: false
};
}
//
// Control
resetState = function() {
this.setState({
remove: true,
blacklist: false,
skipredownload: false
});
}
//
// Listeners
onRemoveChange = ({ value }) => {
this.setState({ remove: value });
}
onBlacklistChange = ({ value }) => {
this.setState({ blacklist: value });
}
onSkipReDownloadChange = ({ value }) => {
this.setState({ skipredownload: value });
}
onRemoveConfirmed = () => {
const state = this.state;
this.resetState();
this.props.onRemovePress(state);
}
onModalClose = () => {
this.resetState();
this.props.onModalClose();
}
//
// Render
render() {
const {
isOpen,
selectedCount,
canIgnore
} = this.props;
const { remove, blacklist, skipredownload } = this.state;
return (
<Modal
isOpen={isOpen}
size={sizes.MEDIUM}
onModalClose={this.onModalClose}
>
<ModalContent
onModalClose={this.onModalClose}
>
<ModalHeader>
Remove Selected Item{selectedCount > 1 ? 's' : ''}
</ModalHeader>
<ModalBody>
<div className={styles.message}>
Are you sure you want to remove {selectedCount} item{selectedCount > 1 ? 's' : ''} from the queue?
</div>
<FormGroup>
<FormLabel>Remove From Download Client</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="remove"
value={remove}
helpTextWarning="Removing will remove the download and the file(s) from the download client."
isDisabled={!canIgnore}
onChange={this.onRemoveChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>
Blacklist Release{selectedCount > 1 ? 's' : ''}
</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="blacklist"
value={blacklist}
helpText="Prevents Readarr from automatically grabbing these files again"
onChange={this.onBlacklistChange}
/>
</FormGroup>
{
blacklist &&
<FormGroup>
<FormLabel>Skip Redownload</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="skipredownload"
value={skipredownload}
helpText="Prevents Readarr from trying download alternative releases for the removed items"
onChange={this.onSkipReDownloadChange}
/>
</FormGroup>
}
</ModalBody>
<ModalFooter>
<Button onPress={this.onModalClose}>
Close
</Button>
<Button
kind={kinds.DANGER}
onPress={this.onRemoveConfirmed}
>
Remove
</Button>
</ModalFooter>
</ModalContent>
</Modal>
);
}
}
RemoveQueueItemsModal.propTypes = {
isOpen: PropTypes.bool.isRequired,
selectedCount: PropTypes.number.isRequired,
canIgnore: PropTypes.bool.isRequired,
onRemovePress: PropTypes.func.isRequired,
onModalClose: PropTypes.func.isRequired
};
export default RemoveQueueItemsModal;

View File

@@ -0,0 +1,76 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import PageSidebarStatus from 'Components/Page/Sidebar/PageSidebarStatus';
import { fetchQueueStatus } from 'Store/Actions/queueActions';
function createMapStateToProps() {
return createSelector(
(state) => state.app,
(state) => state.queue.status,
(state) => state.queue.options.includeUnknownAuthorItems,
(app, status, includeUnknownAuthorItems) => {
const {
errors,
warnings,
unknownErrors,
unknownWarnings,
count,
totalCount
} = status.item;
return {
isConnected: app.isConnected,
isReconnecting: app.isReconnecting,
isPopulated: status.isPopulated,
...status.item,
count: includeUnknownAuthorItems ? totalCount : count,
errors: includeUnknownAuthorItems ? errors || unknownErrors : errors,
warnings: includeUnknownAuthorItems ? warnings || unknownWarnings : warnings
};
}
);
}
const mapDispatchToProps = {
fetchQueueStatus
};
class QueueStatusConnector extends Component {
//
// Lifecycle
componentDidMount() {
if (!this.props.isPopulated) {
this.props.fetchQueueStatus();
}
}
componentDidUpdate(prevProps) {
if (this.props.isConnected && prevProps.isReconnecting) {
this.props.fetchQueueStatus();
}
}
//
// Render
render() {
return (
<PageSidebarStatus
{...this.props}
/>
);
}
}
QueueStatusConnector.propTypes = {
isConnected: PropTypes.bool.isRequired,
isReconnecting: PropTypes.bool.isRequired,
isPopulated: PropTypes.bool.isRequired,
fetchQueueStatus: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(QueueStatusConnector);

View File

@@ -0,0 +1,5 @@
.timeleft {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 100px;
}

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